0006-Add-non-mainline-source-for-rtl8192cu-wireless-drive.patch 5.2 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131
  1. From 558d835f43a26bf05042caa7b22d3acab17f5373 Mon Sep 17 00:00:00 2001
  2. From: popcornmix <popcornmix@gmail.com>
  3. Date: Mon, 3 Sep 2012 17:10:23 +0100
  4. Subject: [PATCH 006/114] Add non-mainline source for rtl8192cu wireless driver
  5. version v4.0.2_9000 as this is widely used. Disabled older rtlwifi driver
  6. ---
  7. drivers/net/wireless/Kconfig | 3 +-
  8. drivers/net/wireless/Makefile | 3 +-
  9. drivers/net/wireless/rtl8192cu/Kconfig | 5 +
  10. drivers/net/wireless/rtl8192cu/Makefile | 615 +
  11. drivers/net/wireless/rtl8192cu/clean | 5 +
  12. .../net/wireless/rtl8192cu/core/efuse/rtw_efuse.c | 1145 ++
  13. drivers/net/wireless/rtl8192cu/core/rtw_ap.c | 2939 ++++
  14. drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c | 1699 +++
  15. drivers/net/wireless/rtl8192cu/core/rtw_cmd.c | 3034 +++++
  16. drivers/net/wireless/rtl8192cu/core/rtw_debug.c | 1336 ++
  17. drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c | 422 +
  18. .../net/wireless/rtl8192cu/core/rtw_ieee80211.c | 1914 +++
  19. drivers/net/wireless/rtl8192cu/core/rtw_io.c | 462 +
  20. .../net/wireless/rtl8192cu/core/rtw_ioctl_query.c | 195 +
  21. .../net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c | 1031 ++
  22. .../net/wireless/rtl8192cu/core/rtw_ioctl_set.c | 1493 ++
  23. drivers/net/wireless/rtl8192cu/core/rtw_iol.c | 262 +
  24. drivers/net/wireless/rtl8192cu/core/rtw_mlme.c | 3966 ++++++
  25. drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c | 13599 +++++++++++++++++++
  26. drivers/net/wireless/rtl8192cu/core/rtw_mp.c | 1323 ++
  27. drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c | 2953 ++++
  28. drivers/net/wireless/rtl8192cu/core/rtw_p2p.c | 5293 ++++++++
  29. drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c | 1538 +++
  30. drivers/net/wireless/rtl8192cu/core/rtw_recv.c | 4286 ++++++
  31. drivers/net/wireless/rtl8192cu/core/rtw_rf.c | 94 +
  32. drivers/net/wireless/rtl8192cu/core/rtw_security.c | 3114 +++++
  33. drivers/net/wireless/rtl8192cu/core/rtw_sreset.c | 351 +
  34. drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c | 847 ++
  35. drivers/net/wireless/rtl8192cu/core/rtw_tdls.c | 2940 ++++
  36. .../net/wireless/rtl8192cu/core/rtw_wlan_util.c | 2304 ++++
  37. drivers/net/wireless/rtl8192cu/core/rtw_xmit.c | 4155 ++++++
  38. drivers/net/wireless/rtl8192cu/hal/HalPwrSeqCmd.c | 175 +
  39. drivers/net/wireless/rtl8192cu/hal/dm.c | 313 +
  40. drivers/net/wireless/rtl8192cu/hal/dm.h | 30 +
  41. drivers/net/wireless/rtl8192cu/hal/hal_com.c | 370 +
  42. drivers/net/wireless/rtl8192cu/hal/hal_intf.c | 545 +
  43. .../wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c | 1154 ++
  44. .../wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c | 5055 +++++++
  45. .../rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c | 3627 +++++
  46. .../wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c | 1207 ++
  47. .../rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c | 4840 +++++++
  48. .../rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c | 1030 ++
  49. .../rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c | 874 ++
  50. .../rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c | 93 +
  51. .../rtl8192cu/hal/rtl8192c/rtl8192c_xmit.c | 62 +
  52. .../rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c | 8757 ++++++++++++
  53. .../hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c | 2557 ++++
  54. .../rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c | 2674 ++++
  55. .../rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c | 227 +
  56. .../rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c | 1149 ++
  57. .../rtl8192cu/hal/rtl8192c/usb/usb_halinit.c | 6260 +++++++++
  58. .../rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c | 1205 ++
  59. .../rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c | 1535 +++
  60. .../rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c | 1264 ++
  61. drivers/net/wireless/rtl8192cu/ifcfg-wlan0 | 4 +
  62. .../wireless/rtl8192cu/include/Hal8192CEHWImg.h | 85 +
  63. .../wireless/rtl8192cu/include/Hal8192CPhyCfg.h | 427 +
  64. .../wireless/rtl8192cu/include/Hal8192CPhyReg.h | 1122 ++
  65. .../wireless/rtl8192cu/include/Hal8192CUHWImg.h | 105 +
  66. .../rtl8192cu/include/Hal8192CUHWImg_wowlan.h | 33 +
  67. .../wireless/rtl8192cu/include/Hal8192DEHWImg.h | 66 +
  68. .../wireless/rtl8192cu/include/Hal8192DPhyCfg.h | 527 +
  69. .../wireless/rtl8192cu/include/Hal8192DPhyReg.h | 1170 ++
  70. .../wireless/rtl8192cu/include/Hal8192DUHWImg.h | 66 +
  71. .../rtl8192cu/include/Hal8192DUHWImg_wowlan.h | 29 +
  72. .../net/wireless/rtl8192cu/include/HalPwrSeqCmd.h | 137 +
  73. drivers/net/wireless/rtl8192cu/include/autoconf.h | 336 +
  74. .../net/wireless/rtl8192cu/include/basic_types.h | 320 +
  75. .../rtl8192cu/include/byteorder/big_endian.h | 87 +
  76. .../wireless/rtl8192cu/include/byteorder/generic.h | 212 +
  77. .../rtl8192cu/include/byteorder/little_endian.h | 89 +
  78. .../wireless/rtl8192cu/include/byteorder/swab.h | 140 +
  79. .../wireless/rtl8192cu/include/byteorder/swabb.h | 156 +
  80. drivers/net/wireless/rtl8192cu/include/circ_buf.h | 27 +
  81. drivers/net/wireless/rtl8192cu/include/cmd_osdep.h | 35 +
  82. drivers/net/wireless/rtl8192cu/include/drv_conf.h | 77 +
  83. drivers/net/wireless/rtl8192cu/include/drv_types.h | 661 +
  84. .../net/wireless/rtl8192cu/include/drv_types_ce.h | 92 +
  85. .../wireless/rtl8192cu/include/drv_types_linux.h | 24 +
  86. .../wireless/rtl8192cu/include/drv_types_sdio.h | 69 +
  87. .../net/wireless/rtl8192cu/include/drv_types_xp.h | 94 +
  88. drivers/net/wireless/rtl8192cu/include/ethernet.h | 41 +
  89. drivers/net/wireless/rtl8192cu/include/h2clbk.h | 35 +
  90. drivers/net/wireless/rtl8192cu/include/hal_com.h | 145 +
  91. drivers/net/wireless/rtl8192cu/include/hal_intf.h | 431 +
  92. drivers/net/wireless/rtl8192cu/include/ieee80211.h | 1579 +++
  93. .../net/wireless/rtl8192cu/include/ieee80211_ext.h | 476 +
  94. drivers/net/wireless/rtl8192cu/include/if_ether.h | 112 +
  95. .../wireless/rtl8192cu/include/ioctl_cfg80211.h | 179 +
  96. drivers/net/wireless/rtl8192cu/include/ip.h | 141 +
  97. .../wireless/rtl8192cu/include/linux/wireless.h | 90 +
  98. .../net/wireless/rtl8192cu/include/mlme_osdep.h | 39 +
  99. .../net/wireless/rtl8192cu/include/mp_custom_oid.h | 353 +
  100. drivers/net/wireless/rtl8192cu/include/nic_spec.h | 46 +
  101. .../wireless/rtl8192cu/include/osdep_ce_service.h | 170 +
  102. .../net/wireless/rtl8192cu/include/osdep_intf.h | 154 +
  103. .../net/wireless/rtl8192cu/include/osdep_service.h | 1813 +++
  104. drivers/net/wireless/rtl8192cu/include/pci_hal.h | 167 +
  105. drivers/net/wireless/rtl8192cu/include/pci_ops.h | 60 +
  106. .../net/wireless/rtl8192cu/include/pci_osintf.h | 32 +
  107. .../net/wireless/rtl8192cu/include/recv_osdep.h | 57 +
  108. .../net/wireless/rtl8192cu/include/rtl8192c_cmd.h | 152 +
  109. .../net/wireless/rtl8192cu/include/rtl8192c_dm.h | 515 +
  110. .../wireless/rtl8192cu/include/rtl8192c_event.h | 26 +
  111. .../net/wireless/rtl8192cu/include/rtl8192c_hal.h | 934 ++
  112. .../net/wireless/rtl8192cu/include/rtl8192c_led.h | 41 +
  113. .../net/wireless/rtl8192cu/include/rtl8192c_recv.h | 183 +
  114. .../net/wireless/rtl8192cu/include/rtl8192c_rf.h | 91 +
  115. .../net/wireless/rtl8192cu/include/rtl8192c_spec.h | 1864 +++
  116. .../wireless/rtl8192cu/include/rtl8192c_sreset.h | 32 +
  117. .../net/wireless/rtl8192cu/include/rtl8192c_xmit.h | 128 +
  118. .../net/wireless/rtl8192cu/include/rtl8192d_cmd.h | 140 +
  119. .../net/wireless/rtl8192cu/include/rtl8192d_dm.h | 420 +
  120. .../net/wireless/rtl8192cu/include/rtl8192d_hal.h | 1125 ++
  121. .../net/wireless/rtl8192cu/include/rtl8192d_led.h | 42 +
  122. .../net/wireless/rtl8192cu/include/rtl8192d_recv.h | 186 +
  123. .../net/wireless/rtl8192cu/include/rtl8192d_rf.h | 96 +
  124. .../net/wireless/rtl8192cu/include/rtl8192d_spec.h | 1840 +++
  125. .../net/wireless/rtl8192cu/include/rtl8192d_xmit.h | 144 +
  126. .../net/wireless/rtl8192cu/include/rtw_android.h | 89 +
  127. drivers/net/wireless/rtl8192cu/include/rtw_ap.h | 63 +
  128. .../net/wireless/rtl8192cu/include/rtw_br_ext.h | 75 +
  129. .../net/wireless/rtl8192cu/include/rtw_byteorder.h | 39 +
  130. drivers/net/wireless/rtl8192cu/include/rtw_cmd.h | 1166 ++
  131. drivers/net/wireless/rtl8192cu/include/rtw_debug.h | 537 +
  132. .../net/wireless/rtl8192cu/include/rtw_eeprom.h | 152 +
  133. drivers/net/wireless/rtl8192cu/include/rtw_efuse.h | 123 +
  134. drivers/net/wireless/rtl8192cu/include/rtw_event.h | 153 +
  135. drivers/net/wireless/rtl8192cu/include/rtw_ht.h | 49 +
  136. drivers/net/wireless/rtl8192cu/include/rtw_io.h | 504 +
  137. drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h | 268 +
  138. .../wireless/rtl8192cu/include/rtw_ioctl_query.h | 35 +
  139. .../net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h | 83 +
  140. .../net/wireless/rtl8192cu/include/rtw_ioctl_set.h | 78 +
  141. drivers/net/wireless/rtl8192cu/include/rtw_iol.h | 89 +
  142. drivers/net/wireless/rtl8192cu/include/rtw_led.h | 216 +
  143. drivers/net/wireless/rtl8192cu/include/rtw_mlme.h | 843 ++
  144. .../net/wireless/rtl8192cu/include/rtw_mlme_ext.h | 962 ++
  145. drivers/net/wireless/rtl8192cu/include/rtw_mp.h | 711 +
  146. .../net/wireless/rtl8192cu/include/rtw_mp_ioctl.h | 595 +
  147. .../wireless/rtl8192cu/include/rtw_mp_phy_regdef.h | 1096 ++
  148. drivers/net/wireless/rtl8192cu/include/rtw_p2p.h | 160 +
  149. .../net/wireless/rtl8192cu/include/rtw_pwrctrl.h | 362 +
  150. drivers/net/wireless/rtl8192cu/include/rtw_qos.h | 39 +
  151. drivers/net/wireless/rtl8192cu/include/rtw_recv.h | 730 +
  152. drivers/net/wireless/rtl8192cu/include/rtw_rf.h | 151 +
  153. .../net/wireless/rtl8192cu/include/rtw_security.h | 446 +
  154. .../net/wireless/rtl8192cu/include/rtw_sreset.h | 73 +
  155. drivers/net/wireless/rtl8192cu/include/rtw_tdls.h | 142 +
  156. .../net/wireless/rtl8192cu/include/rtw_version.h | 1 +
  157. drivers/net/wireless/rtl8192cu/include/rtw_xmit.h | 753 +
  158. drivers/net/wireless/rtl8192cu/include/sta_info.h | 431 +
  159. drivers/net/wireless/rtl8192cu/include/usb_hal.h | 36 +
  160. drivers/net/wireless/rtl8192cu/include/usb_ops.h | 109 +
  161. .../net/wireless/rtl8192cu/include/usb_ops_linux.h | 62 +
  162. .../net/wireless/rtl8192cu/include/usb_osintf.h | 37 +
  163. .../wireless/rtl8192cu/include/usb_vendor_req.h | 59 +
  164. drivers/net/wireless/rtl8192cu/include/wifi.h | 1245 ++
  165. .../net/wireless/rtl8192cu/include/wlan_bssdef.h | 702 +
  166. .../net/wireless/rtl8192cu/include/xmit_osdep.h | 94 +
  167. .../rtl8192cu/os_dep/linux/ioctl_cfg80211.c | 5488 ++++++++
  168. .../wireless/rtl8192cu/os_dep/linux/ioctl_linux.c | 11908 ++++++++++++++++
  169. .../wireless/rtl8192cu/os_dep/linux/mlme_linux.c | 585 +
  170. .../net/wireless/rtl8192cu/os_dep/linux/os_intfs.c | 2748 ++++
  171. .../net/wireless/rtl8192cu/os_dep/linux/pci_intf.c | 1996 +++
  172. .../rtl8192cu/os_dep/linux/pci_ops_linux.c | 21 +
  173. .../wireless/rtl8192cu/os_dep/linux/recv_linux.c | 447 +
  174. .../wireless/rtl8192cu/os_dep/linux/rtw_android.c | 838 ++
  175. .../net/wireless/rtl8192cu/os_dep/linux/usb_intf.c | 1654 +++
  176. .../rtl8192cu/os_dep/linux/usb_ops_linux.c | 648 +
  177. .../wireless/rtl8192cu/os_dep/linux/xmit_linux.c | 420 +
  178. .../net/wireless/rtl8192cu/os_dep/osdep_service.c | 2299 ++++
  179. drivers/net/wireless/rtl8192cu/runwpa | 18 +
  180. drivers/net/wireless/rtl8192cu/wlan0dhcp | 15 +
  181. 174 files changed, 171239 insertions(+), 2 deletions(-)
  182. create mode 100644 drivers/net/wireless/rtl8192cu/Kconfig
  183. create mode 100644 drivers/net/wireless/rtl8192cu/Makefile
  184. create mode 100755 drivers/net/wireless/rtl8192cu/clean
  185. create mode 100644 drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c
  186. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_ap.c
  187. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c
  188. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_cmd.c
  189. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_debug.c
  190. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c
  191. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c
  192. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_io.c
  193. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c
  194. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c
  195. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c
  196. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_iol.c
  197. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_mlme.c
  198. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c
  199. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_mp.c
  200. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c
  201. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_p2p.c
  202. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c
  203. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_recv.c
  204. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_rf.c
  205. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_security.c
  206. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_sreset.c
  207. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c
  208. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_tdls.c
  209. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c
  210. create mode 100644 drivers/net/wireless/rtl8192cu/core/rtw_xmit.c
  211. create mode 100644 drivers/net/wireless/rtl8192cu/hal/HalPwrSeqCmd.c
  212. create mode 100644 drivers/net/wireless/rtl8192cu/hal/dm.c
  213. create mode 100644 drivers/net/wireless/rtl8192cu/hal/dm.h
  214. create mode 100644 drivers/net/wireless/rtl8192cu/hal/hal_com.c
  215. create mode 100644 drivers/net/wireless/rtl8192cu/hal/hal_intf.c
  216. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c
  217. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c
  218. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c
  219. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c
  220. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c
  221. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c
  222. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c
  223. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c
  224. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_xmit.c
  225. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c
  226. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c
  227. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c
  228. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c
  229. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c
  230. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c
  231. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c
  232. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c
  233. create mode 100644 drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c
  234. create mode 100755 drivers/net/wireless/rtl8192cu/ifcfg-wlan0
  235. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h
  236. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h
  237. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h
  238. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h
  239. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h
  240. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h
  241. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h
  242. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h
  243. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h
  244. create mode 100644 drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h
  245. create mode 100644 drivers/net/wireless/rtl8192cu/include/HalPwrSeqCmd.h
  246. create mode 100644 drivers/net/wireless/rtl8192cu/include/autoconf.h
  247. create mode 100644 drivers/net/wireless/rtl8192cu/include/basic_types.h
  248. create mode 100644 drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h
  249. create mode 100644 drivers/net/wireless/rtl8192cu/include/byteorder/generic.h
  250. create mode 100644 drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h
  251. create mode 100644 drivers/net/wireless/rtl8192cu/include/byteorder/swab.h
  252. create mode 100644 drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h
  253. create mode 100644 drivers/net/wireless/rtl8192cu/include/circ_buf.h
  254. create mode 100644 drivers/net/wireless/rtl8192cu/include/cmd_osdep.h
  255. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_conf.h
  256. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_types.h
  257. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_types_ce.h
  258. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_types_linux.h
  259. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_types_sdio.h
  260. create mode 100644 drivers/net/wireless/rtl8192cu/include/drv_types_xp.h
  261. create mode 100644 drivers/net/wireless/rtl8192cu/include/ethernet.h
  262. create mode 100644 drivers/net/wireless/rtl8192cu/include/h2clbk.h
  263. create mode 100644 drivers/net/wireless/rtl8192cu/include/hal_com.h
  264. create mode 100644 drivers/net/wireless/rtl8192cu/include/hal_intf.h
  265. create mode 100644 drivers/net/wireless/rtl8192cu/include/ieee80211.h
  266. create mode 100644 drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h
  267. create mode 100644 drivers/net/wireless/rtl8192cu/include/if_ether.h
  268. create mode 100644 drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h
  269. create mode 100644 drivers/net/wireless/rtl8192cu/include/ip.h
  270. create mode 100644 drivers/net/wireless/rtl8192cu/include/linux/wireless.h
  271. create mode 100644 drivers/net/wireless/rtl8192cu/include/mlme_osdep.h
  272. create mode 100644 drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h
  273. create mode 100644 drivers/net/wireless/rtl8192cu/include/nic_spec.h
  274. create mode 100644 drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h
  275. create mode 100644 drivers/net/wireless/rtl8192cu/include/osdep_intf.h
  276. create mode 100644 drivers/net/wireless/rtl8192cu/include/osdep_service.h
  277. create mode 100644 drivers/net/wireless/rtl8192cu/include/pci_hal.h
  278. create mode 100644 drivers/net/wireless/rtl8192cu/include/pci_ops.h
  279. create mode 100644 drivers/net/wireless/rtl8192cu/include/pci_osintf.h
  280. create mode 100644 drivers/net/wireless/rtl8192cu/include/recv_osdep.h
  281. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h
  282. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h
  283. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h
  284. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h
  285. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h
  286. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h
  287. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h
  288. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h
  289. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h
  290. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h
  291. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h
  292. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h
  293. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h
  294. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h
  295. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h
  296. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h
  297. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h
  298. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h
  299. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_android.h
  300. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ap.h
  301. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h
  302. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h
  303. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_cmd.h
  304. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_debug.h
  305. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h
  306. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_efuse.h
  307. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_event.h
  308. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ht.h
  309. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_io.h
  310. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h
  311. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h
  312. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h
  313. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h
  314. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_iol.h
  315. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_led.h
  316. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_mlme.h
  317. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h
  318. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_mp.h
  319. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h
  320. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h
  321. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_p2p.h
  322. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h
  323. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_qos.h
  324. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_recv.h
  325. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_rf.h
  326. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_security.h
  327. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_sreset.h
  328. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_tdls.h
  329. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_version.h
  330. create mode 100644 drivers/net/wireless/rtl8192cu/include/rtw_xmit.h
  331. create mode 100644 drivers/net/wireless/rtl8192cu/include/sta_info.h
  332. create mode 100644 drivers/net/wireless/rtl8192cu/include/usb_hal.h
  333. create mode 100644 drivers/net/wireless/rtl8192cu/include/usb_ops.h
  334. create mode 100644 drivers/net/wireless/rtl8192cu/include/usb_ops_linux.h
  335. create mode 100644 drivers/net/wireless/rtl8192cu/include/usb_osintf.h
  336. create mode 100644 drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h
  337. create mode 100644 drivers/net/wireless/rtl8192cu/include/wifi.h
  338. create mode 100644 drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h
  339. create mode 100644 drivers/net/wireless/rtl8192cu/include/xmit_osdep.h
  340. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c
  341. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c
  342. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c
  343. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c
  344. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c
  345. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/pci_ops_linux.c
  346. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c
  347. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c
  348. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c
  349. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/usb_ops_linux.c
  350. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c
  351. create mode 100644 drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c
  352. create mode 100755 drivers/net/wireless/rtl8192cu/runwpa
  353. create mode 100755 drivers/net/wireless/rtl8192cu/wlan0dhcp
  354. --- a/drivers/net/wireless/Kconfig
  355. +++ b/drivers/net/wireless/Kconfig
  356. @@ -277,7 +277,8 @@ source "drivers/net/wireless/libertas/Kc
  357. source "drivers/net/wireless/orinoco/Kconfig"
  358. source "drivers/net/wireless/p54/Kconfig"
  359. source "drivers/net/wireless/rt2x00/Kconfig"
  360. -source "drivers/net/wireless/rtlwifi/Kconfig"
  361. +#source "drivers/net/wireless/rtlwifi/Kconfig"
  362. +source "drivers/net/wireless/rtl8192cu/Kconfig"
  363. source "drivers/net/wireless/ti/Kconfig"
  364. source "drivers/net/wireless/zd1211rw/Kconfig"
  365. source "drivers/net/wireless/mwifiex/Kconfig"
  366. --- a/drivers/net/wireless/Makefile
  367. +++ b/drivers/net/wireless/Makefile
  368. @@ -24,7 +24,8 @@ obj-$(CONFIG_B43LEGACY) += b43legacy/
  369. obj-$(CONFIG_ZD1211RW) += zd1211rw/
  370. obj-$(CONFIG_RTL8180) += rtl818x/
  371. obj-$(CONFIG_RTL8187) += rtl818x/
  372. -obj-$(CONFIG_RTLWIFI) += rtlwifi/
  373. +#obj-$(CONFIG_RTLWIFI) += rtlwifi/
  374. +obj-$(CONFIG_RTL8192CU) += rtl8192cu/
  375. # 16-bit wireless PCMCIA client drivers
  376. obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
  377. --- /dev/null
  378. +++ b/drivers/net/wireless/rtl8192cu/Kconfig
  379. @@ -0,0 +1,5 @@
  380. +config RTL8192CU
  381. + tristate "Realtek 8192C USB WiFi"
  382. + depends on USB
  383. + ---help---
  384. + Help message of RTL8192CU
  385. --- /dev/null
  386. +++ b/drivers/net/wireless/rtl8192cu/Makefile
  387. @@ -0,0 +1,615 @@
  388. +EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS)
  389. +EXTRA_CFLAGS += -O1
  390. +#EXTRA_CFLAGS += -O3
  391. +#EXTRA_CFLAGS += -Wall
  392. +#EXTRA_CFLAGS += -Wextra
  393. +#EXTRA_CFLAGS += -Werror
  394. +#EXTRA_CFLAGS += -pedantic
  395. +#EXTRA_CFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes
  396. +
  397. +EXTRA_CFLAGS += -Wno-unused-variable
  398. +EXTRA_CFLAGS += -Wno-unused-value
  399. +EXTRA_CFLAGS += -Wno-unused-label
  400. +EXTRA_CFLAGS += -Wno-unused-parameter
  401. +EXTRA_CFLAGS += -Wno-unused-function
  402. +EXTRA_CFLAGS += -Wno-unused
  403. +
  404. +EXTRA_CFLAGS += -Wno-uninitialized
  405. +
  406. +EXTRA_CFLAGS += -I$(src)/include
  407. +
  408. +CONFIG_AUTOCFG_CP = n
  409. +
  410. +CONFIG_RTL8192C = y
  411. +CONFIG_RTL8192D = n
  412. +CONFIG_RTL8723A = n
  413. +
  414. +CONFIG_USB_HCI = y
  415. +CONFIG_PCI_HCI = n
  416. +CONFIG_SDIO_HCI = n
  417. +
  418. +CONFIG_MP_INCLUDED = n
  419. +CONFIG_POWER_SAVING = y
  420. +CONFIG_USB_AUTOSUSPEND = n
  421. +CONFIG_HW_PWRP_DETECTION = n
  422. +CONFIG_WIFI_TEST = n
  423. +CONFIG_BT_COEXISTENCE = n
  424. +CONFIG_RTL8192CU_REDEFINE_1X1 = n
  425. +CONFIG_INTEL_WIDI = n
  426. +CONFIG_WAKE_ON_WLAN = n
  427. +
  428. +CONFIG_PLATFORM_I386_PC = y
  429. +CONFIG_PLATFORM_TI_AM3517 = n
  430. +CONFIG_PLATFORM_ANDROID_X86 = n
  431. +CONFIG_PLATFORM_JB_X86 = n
  432. +CONFIG_PLATFORM_ARM_S3C2K4 = n
  433. +CONFIG_PLATFORM_ARM_PXA2XX = n
  434. +CONFIG_PLATFORM_ARM_S3C6K4 = n
  435. +CONFIG_PLATFORM_MIPS_RMI = n
  436. +CONFIG_PLATFORM_RTD2880B = n
  437. +CONFIG_PLATFORM_MIPS_AR9132 = n
  438. +CONFIG_PLATFORM_RTK_DMP = n
  439. +CONFIG_PLATFORM_MIPS_PLM = n
  440. +CONFIG_PLATFORM_MSTAR389 = n
  441. +CONFIG_PLATFORM_MT53XX = n
  442. +CONFIG_PLATFORM_ARM_MX51_241H = n
  443. +CONFIG_PLATFORM_FS_MX61 = n
  444. +CONFIG_PLATFORM_ACTIONS_ATJ227X = n
  445. +CONFIG_PLATFORM_TEGRA3_CARDHU = n
  446. +CONFIG_PLATFORM_TEGRA4_DALMORE = n
  447. +CONFIG_PLATFORM_ARM_TCC8900 = n
  448. +CONFIG_PLATFORM_ARM_TCC8920 = n
  449. +CONFIG_PLATFORM_ARM_TCC8920_JB42 = n
  450. +CONFIG_PLATFORM_ARM_RK2818 = n
  451. +CONFIG_PLATFORM_ARM_TI_PANDA = n
  452. +CONFIG_PLATFORM_MIPS_JZ4760 = n
  453. +CONFIG_PLATFORM_DMP_PHILIPS = n
  454. +CONFIG_PLATFORM_TI_DM365 = n
  455. +CONFIG_PLATFORM_MN10300 = n
  456. +CONFIG_PLATFORM_MSTAR_TITANIA12 = n
  457. +CONFIG_PLATFORM_MSTAR_A3 = n
  458. +CONFIG_PLATFORM_ARM_SUNxI = n
  459. +CONFIG_PLATFORM_ARM_SUN6I = n
  460. +
  461. +CONFIG_DRVEXT_MODULE = n
  462. +
  463. +export TopDIR ?= $(shell pwd)
  464. +
  465. +
  466. +ifeq ($(CONFIG_RTL8192C), y)
  467. +
  468. +RTL871X = rtl8192c
  469. +
  470. +ifeq ($(CONFIG_USB_HCI), y)
  471. +MODULE_NAME = 8192cu
  472. +FW_FILES := hal/$(RTL871X)/usb/Hal8192CUHWImg.o
  473. +ifneq ($(CONFIG_WAKE_ON_WLAN), n)
  474. +FW_FILES += hal/$(RTL871X)/usb/Hal8192CUHWImg_wowlan.o
  475. +endif
  476. +endif
  477. +ifeq ($(CONFIG_PCI_HCI), y)
  478. +MODULE_NAME = 8192ce
  479. +FW_FILES := hal/$(RTL871X)/pci/Hal8192CEHWImg.o
  480. +endif
  481. +
  482. +CHIP_FILES := \
  483. + hal/$(RTL871X)/$(RTL871X)_sreset.o \
  484. + hal/$(RTL871X)/$(RTL871X)_xmit.o
  485. +CHIP_FILES += $(FW_FILES)
  486. +endif
  487. +
  488. +ifeq ($(CONFIG_RTL8192D), y)
  489. +
  490. +RTL871X = rtl8192d
  491. +
  492. +ifeq ($(CONFIG_USB_HCI), y)
  493. +MODULE_NAME = 8192du
  494. +FW_FILES := hal/$(RTL871X)/usb/Hal8192DUHWImg.o
  495. +ifneq ($(CONFIG_WAKE_ON_WLAN), n)
  496. +FW_FILES += hal/$(RTL871X)/usb/Hal8192DUHWImg_wowlan.o
  497. +endif
  498. +endif
  499. +ifeq ($(CONFIG_PCI_HCI), y)
  500. +MODULE_NAME = 8192de
  501. +FW_FILES := hal/$(RTL871X)/pci/Hal8192DEHWImg.o
  502. +endif
  503. +
  504. +CHIP_FILES := \
  505. + hal/$(RTL871X)/$(RTL871X)_xmit.o
  506. +CHIP_FILES += $(FW_FILES)
  507. +endif
  508. +
  509. +ifeq ($(CONFIG_RTL8723A), y)
  510. +
  511. +RTL871X = rtl8723a
  512. +
  513. +ifeq ($(CONFIG_SDIO_HCI), y)
  514. +MODULE_NAME = 8723as
  515. +FW_FILES := hal/$(RTL871X)/sdio/Hal8723SHWImg.o
  516. +endif
  517. +
  518. +ifeq ($(CONFIG_USB_HCI), y)
  519. +MODULE_NAME = 8723au
  520. +FW_FILES := hal/$(RTL871X)/usb/Hal8723UHWImg.o
  521. +endif
  522. +
  523. +ifeq ($(CONFIG_PCI_HCI), y)
  524. +MODULE_NAME = 8723ae
  525. +FW_FILES := hal/$(RTL871X)/pci/Hal8723EHWImg.o
  526. +endif
  527. +
  528. +PWRSEQ_FILES := hal/HalPwrSeqCmd.o \
  529. + hal/$(RTL871X)/Hal8723PwrSeq.o
  530. +
  531. +CHIP_FILES += $(FW_FILES) $(PWRSEQ_FILES)
  532. +
  533. +endif
  534. +
  535. +ifeq ($(CONFIG_SDIO_HCI), y)
  536. +HCI_NAME = sdio
  537. +endif
  538. +
  539. +ifeq ($(CONFIG_USB_HCI), y)
  540. +HCI_NAME = usb
  541. +endif
  542. +
  543. +ifeq ($(CONFIG_PCI_HCI), y)
  544. +HCI_NAME = pci
  545. +endif
  546. +
  547. +
  548. +_OS_INTFS_FILES := os_dep/osdep_service.o \
  549. + os_dep/linux/os_intfs.o \
  550. + os_dep/linux/$(HCI_NAME)_intf.o \
  551. + os_dep/linux/$(HCI_NAME)_ops_linux.o \
  552. + os_dep/linux/ioctl_linux.o \
  553. + os_dep/linux/xmit_linux.o \
  554. + os_dep/linux/mlme_linux.o \
  555. + os_dep/linux/recv_linux.o \
  556. + os_dep/linux/ioctl_cfg80211.o \
  557. + os_dep/linux/rtw_android.o
  558. +
  559. +
  560. +_HAL_INTFS_FILES := hal/hal_intf.o \
  561. + hal/hal_com.o \
  562. + hal/dm.o \
  563. + hal/$(RTL871X)/$(RTL871X)_hal_init.o \
  564. + hal/$(RTL871X)/$(RTL871X)_phycfg.o \
  565. + hal/$(RTL871X)/$(RTL871X)_rf6052.o \
  566. + hal/$(RTL871X)/$(RTL871X)_dm.o \
  567. + hal/$(RTL871X)/$(RTL871X)_rxdesc.o \
  568. + hal/$(RTL871X)/$(RTL871X)_cmd.o \
  569. + hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
  570. + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \
  571. + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \
  572. + hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o
  573. +
  574. +ifeq ($(CONFIG_SDIO_HCI), y)
  575. +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o
  576. +else
  577. +_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o
  578. +endif
  579. +
  580. +ifeq ($(CONFIG_MP_INCLUDED), y)
  581. +_HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o
  582. +endif
  583. +
  584. +_HAL_INTFS_FILES += $(CHIP_FILES)
  585. +
  586. +
  587. +ifeq ($(CONFIG_AUTOCFG_CP), y)
  588. +$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)
  589. +endif
  590. +
  591. +
  592. +ifeq ($(CONFIG_USB_HCI), y)
  593. +ifeq ($(CONFIG_USB_AUTOSUSPEND), y)
  594. +EXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND
  595. +endif
  596. +endif
  597. +
  598. +ifeq ($(CONFIG_POWER_SAVING), y)
  599. +EXTRA_CFLAGS += -DCONFIG_POWER_SAVING
  600. +endif
  601. +
  602. +ifeq ($(CONFIG_HW_PWRP_DETECTION), y)
  603. +EXTRA_CFLAGS += -DCONFIG_HW_PWRP_DETECTION
  604. +endif
  605. +
  606. +ifeq ($(CONFIG_WIFI_TEST), y)
  607. +EXTRA_CFLAGS += -DCONFIG_WIFI_TEST
  608. +endif
  609. +
  610. +ifeq ($(CONFIG_BT_COEXISTENCE), y)
  611. +EXTRA_CFLAGS += -DCONFIG_BT_COEXISTENCE
  612. +endif
  613. +
  614. +ifeq ($(CONFIG_RTL8192CU_REDEFINE_1X1), y)
  615. +EXTRA_CFLAGS += -DRTL8192C_RECONFIG_TO_1T1R
  616. +endif
  617. +
  618. +ifeq ($(CONFIG_WAKE_ON_WLAN), y)
  619. +EXTRA_CFLAGS += -DCONFIG_WAKE_ON_WLAN
  620. +endif
  621. +
  622. +ifeq ($(CONFIG_INTEL_WIDI), y)
  623. +EXTRA_CFLAGS += -DCONFIG_INTEL_WIDI
  624. +endif
  625. +
  626. +ifeq ($(CONFIG_PLATFORM_I386_PC), y)
  627. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  628. +SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
  629. +ARCH ?= $(SUBARCH)
  630. +CROSS_COMPILE ?=
  631. +KVER := $(shell uname -r)
  632. +KSRC := /lib/modules/$(KVER)/build
  633. +MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
  634. +INSTALL_PREFIX :=
  635. +endif
  636. +
  637. +ifeq ($(CONFIG_PLATFORM_TI_AM3517), y)
  638. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE
  639. +CROSS_COMPILE := arm-eabi-
  640. +KSRC := $(shell pwd)/../../../Android/kernel
  641. +ARCH := arm
  642. +endif
  643. +
  644. +ifeq ($(CONFIG_PLATFORM_MSTAR_TITANIA12), y)
  645. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_PLATFORM_MSTAR_TITANIA12
  646. +ARCH:=mips
  647. +CROSS_COMPILE:= /usr/src/Mstar_kernel/mips-4.3/bin/mips-linux-gnu-
  648. +KVER:= 2.6.28.9
  649. +KSRC:= /usr/src/Mstar_kernel/2.6.28.9/
  650. +endif
  651. +
  652. +ifeq ($(CONFIG_PLATFORM_MSTAR_A3), y)
  653. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_PLATFORM_MSTAR_A3
  654. +ARCH:=arm
  655. +CROSS_COMPILE:= arm-none-linux-gnueabi-
  656. +KVER:= 2.6.35.11
  657. +KSRC:= /home/gary/PERFORCE/THEALE/RedLion/2.6.35.11/
  658. +MODULE_NAME = wlan
  659. +endif
  660. +
  661. +ifeq ($(CONFIG_PLATFORM_ANDROID_X86), y)
  662. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  663. +SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
  664. +ARCH := $(SUBARCH)
  665. +CROSS_COMPILE := /media/DATA-2/android-x86/ics-x86_20120130/prebuilt/linux-x86/toolchain/i686-unknown-linux-gnu-4.2.1/bin/i686-unknown-linux-gnu-
  666. +KSRC := /media/DATA-2/android-x86/ics-x86_20120130/out/target/product/generic_x86/obj/kernel
  667. +MODULE_NAME :=wlan
  668. +endif
  669. +
  670. +ifeq ($(CONFIG_PLATFORM_JB_X86), y)
  671. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  672. +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
  673. +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
  674. +EXTRA_CFLAGS += -DCONFIG_P2P_IPS
  675. +SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
  676. +ARCH := $(SUBARCH)
  677. +CROSS_COMPILE := /home/android_sdk/android-x86_JB/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7/bin/i686-linux-android-
  678. +KSRC := /home/android_sdk/android-x86_JB/out/target/product/x86/obj/kernel/
  679. +MODULE_NAME :=wlan
  680. +endif
  681. +
  682. +ifeq ($(CONFIG_PLATFORM_ARM_PXA2XX), y)
  683. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  684. +ARCH := arm
  685. +CROSS_COMPILE := arm-none-linux-gnueabi-
  686. +KVER := 2.6.34.1
  687. +KSRC ?= /usr/src/linux-2.6.34.1
  688. +endif
  689. +
  690. +ifeq ($(CONFIG_PLATFORM_ARM_S3C2K4), y)
  691. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  692. +ARCH := arm
  693. +CROSS_COMPILE := arm-linux-
  694. +KVER := 2.6.24.7_$(ARCH)
  695. +KSRC := /usr/src/kernels/linux-$(KVER)
  696. +endif
  697. +
  698. +ifeq ($(CONFIG_PLATFORM_ARM_S3C6K4), y)
  699. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  700. +ARCH := arm
  701. +CROSS_COMPILE := arm-none-linux-gnueabi-
  702. +KVER := 2.6.34.1
  703. +KSRC ?= /usr/src/linux-2.6.34.1
  704. +endif
  705. +
  706. +ifeq ($(CONFIG_PLATFORM_RTD2880B), y)
  707. +EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN -DCONFIG_PLATFORM_RTD2880B
  708. +ARCH:=
  709. +CROSS_COMPILE:=
  710. +KVER:=
  711. +KSRC:=
  712. +endif
  713. +
  714. +ifeq ($(CONFIG_PLATFORM_MIPS_RMI), y)
  715. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  716. +ARCH:=mips
  717. +CROSS_COMPILE:=mipsisa32r2-uclibc-
  718. +KVER:=
  719. +KSRC:= /root/work/kernel_realtek
  720. +endif
  721. +
  722. +ifeq ($(CONFIG_PLATFORM_MIPS_PLM), y)
  723. +EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN
  724. +ARCH:=mips
  725. +CROSS_COMPILE:=mipsisa32r2-uclibc-
  726. +KVER:=
  727. +KSRC:= /root/work/kernel_realtek
  728. +endif
  729. +
  730. +ifeq ($(CONFIG_PLATFORM_MSTAR389), y)
  731. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR389
  732. +ARCH:=mips
  733. +CROSS_COMPILE:= mips-linux-gnu-
  734. +KVER:= 2.6.28.10
  735. +KSRC:= /home/mstar/mstar_linux/2.6.28.9/
  736. +endif
  737. +
  738. +ifeq ($(CONFIG_PLATFORM_MIPS_AR9132), y)
  739. +EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN
  740. +ARCH := mips
  741. +CROSS_COMPILE := mips-openwrt-linux-
  742. +KSRC := /home/alex/test_openwrt/tmp/linux-2.6.30.9
  743. +endif
  744. +
  745. +ifeq ($(CONFIG_PLATFORM_DMP_PHILIPS), y)
  746. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM
  747. +ARCH := mips
  748. +#CROSS_COMPILE:=/usr/local/msdk-4.3.6-mips-EL-2.6.12.6-0.9.30.3/bin/mipsel-linux-
  749. +CROSS_COMPILE:=/usr/local/toolchain_mipsel/bin/mipsel-linux-
  750. +KSRC ?=/usr/local/Jupiter/linux-2.6.12
  751. +endif
  752. +
  753. +ifeq ($(CONFIG_PLATFORM_RTK_DMP), y)
  754. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM
  755. +ARCH:=mips
  756. +CROSS_COMPILE:=mipsel-linux-
  757. +KVER:=
  758. +KSRC ?= /usr/src/DMP_Kernel/jupiter/linux-2.6.12
  759. +endif
  760. +
  761. +ifeq ($(CONFIG_PLATFORM_MT53XX), y)
  762. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MT53XX
  763. +ARCH:= arm
  764. +CROSS_COMPILE:= arm11_mtk_le-
  765. +KVER:= 2.6.27
  766. +KSRC?= /proj/mtk00802/BD_Compare/BDP/Dev/BDP_V301/BDP_Linux/linux-2.6.27
  767. +endif
  768. +
  769. +ifeq ($(CONFIG_PLATFORM_ARM_MX51_241H), y)
  770. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_WISTRON_PLATFORM
  771. +ARCH := arm
  772. +CROSS_COMPILE := /opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-
  773. +KVER := 2.6.31
  774. +KSRC ?= /lib/modules/2.6.31-770-g0e46b52/source
  775. +endif
  776. +
  777. +ifeq ($(CONFIG_PLATFORM_FS_MX61), y)
  778. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  779. +ARCH := arm
  780. +CROSS_COMPILE := /home/share/CusEnv/FreeScale/arm-eabi-4.4.3/bin/arm-eabi-
  781. +KSRC ?= /home/share/CusEnv/FreeScale/FS_kernel_env
  782. +endif
  783. +
  784. +
  785. +
  786. +ifeq ($(CONFIG_PLATFORM_ACTIONS_ATJ227X), y)
  787. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ACTIONS_ATJ227X
  788. +ARCH := mips
  789. +CROSS_COMPILE := /home/cnsd4/project/actions/tools-2.6.27/bin/mipsel-linux-gnu-
  790. +KVER := 2.6.27
  791. +KSRC := /home/cnsd4/project/actions/linux-2.6.27.28
  792. +endif
  793. +
  794. +ifeq ($(CONFIG_PLATFORM_TI_DM365), y)
  795. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_TI_DM365
  796. +ARCH := arm
  797. +CROSS_COMPILE := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
  798. +KVER := 2.6.18
  799. +KSRC := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-dm365
  800. +endif
  801. +
  802. +ifeq ($(CONFIG_PLATFORM_TEGRA3_CARDHU), y)
  803. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  804. +# default setting for Android 4.1, 4.2
  805. +EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
  806. +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
  807. +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
  808. +EXTRA_CFLAGS += -DCONFIG_P2P_IPS
  809. +ARCH := arm
  810. +CROSS_COMPILE := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
  811. +KSRC := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/out/target/product/cardhu/obj/KERNEL
  812. +MODULE_NAME := wlan
  813. +endif
  814. +
  815. +ifeq ($(CONFIG_PLATFORM_TEGRA4_DALMORE), y)
  816. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  817. +# default setting for Android 4.1, 4.2
  818. +EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
  819. +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
  820. +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
  821. +EXTRA_CFLAGS += -DCONFIG_P2P_IPS
  822. +ARCH := arm
  823. +CROSS_COMPILE := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
  824. +KSRC := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/out/target/product/dalmore/obj/KERNEL
  825. +MODULE_NAME := wlan
  826. +endif
  827. +
  828. +ifeq ($(CONFIG_PLATFORM_ARM_TCC8900), y)
  829. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  830. +ARCH := arm
  831. +CROSS_COMPILE := /home/android_sdk/Telechips/SDK_2304_20110613/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
  832. +KSRC := /home/android_sdk/Telechips/SDK_2304_20110613/kernel
  833. +MODULE_NAME := wlan
  834. +endif
  835. +
  836. +ifeq ($(CONFIG_PLATFORM_ARM_TCC8920), y)
  837. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  838. +ARCH := arm
  839. +CROSS_COMPILE := /home/android_sdk/Telechips/v12.06_r1-tcc-android-4.0.4/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
  840. +KSRC := /home/android_sdk/Telechips/v12.06_r1-tcc-android-4.0.4/kernel
  841. +MODULE_NAME := wlan
  842. +endif
  843. +
  844. +ifeq ($(CONFIG_PLATFORM_ARM_TCC8920_JB42), y)
  845. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  846. +# default setting for Android 4.1, 4.2
  847. +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
  848. +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
  849. +EXTRA_CFLAGS += -DCONFIG_P2P_IPS
  850. +ARCH := arm
  851. +CROSS_COMPILE := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
  852. +KSRC := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/kernel
  853. +MODULE_NAME := wlan
  854. +endif
  855. +
  856. +ifeq ($(CONFIG_PLATFORM_ARM_RK2818), y)
  857. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
  858. +ARCH := arm
  859. +CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
  860. +KSRC := /usr/src/release_fae_version/kernel25_A7_281x
  861. +MODULE_NAME := wlan
  862. +endif
  863. +
  864. +ifeq ($(CONFIG_PLATFORM_ARM_TI_PANDA), y)
  865. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN #-DCONFIG_MINIMAL_MEMORY_USAGE
  866. +ARCH := arm
  867. +#CROSS_COMPILE := /media/DATA-1/aosp/ics-aosp_20111227/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
  868. +#KSRC := /media/DATA-1/aosp/android-omap-panda-3.0_20120104
  869. +CROSS_COMPILE := /media/DATA-1/android-4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
  870. +KSRC := /media/DATA-1/android-4.0/panda_kernel/omap
  871. +MODULE_NAME := wlan
  872. +endif
  873. +
  874. +ifeq ($(CONFIG_PLATFORM_MIPS_JZ4760), y)
  875. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_MINIMAL_MEMORY_USAGE
  876. +ARCH ?= mips
  877. +CROSS_COMPILE ?= /mnt/sdb5/Ingenic/Umido/mips-4.3/bin/mips-linux-gnu-
  878. +KSRC ?= /mnt/sdb5/Ingenic/Umido/kernel
  879. +endif
  880. +
  881. +#Add setting for MN10300
  882. +ifeq ($(CONFIG_PLATFORM_MN10300), y)
  883. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MN10300
  884. +ARCH := mn10300
  885. +CROSS_COMPILE := mn10300-linux-
  886. +KVER := 2.6.32.2
  887. +KSRC := /home/winuser/work/Plat_sLD2T_V3010/usr/src/linux-2.6.32.2
  888. +INSTALL_PREFIX :=
  889. +endif
  890. +
  891. +ifeq ($(CONFIG_PLATFORM_ARM_SUNxI), y)
  892. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ARM_SUNxI
  893. +ARCH := arm
  894. +CROSS_COMPILE := arm-none-linux-gnueabi-
  895. +KVER := 3.0.8
  896. +#KSRC:= ../lichee/linux-3.0/
  897. +endif
  898. +
  899. +ifeq ($(CONFIG_PLATFORM_ARM_SUN6I), y)
  900. +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
  901. +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN6I
  902. +EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX
  903. +EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT
  904. +# default setting for Android 4.1, 4.2
  905. +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
  906. +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
  907. +EXTRA_CFLAGS += -DCONFIG_P2P_IPS
  908. +ARCH := arm
  909. +CROSS_COMPILE := arm-none-linux-gnueabi-
  910. +KVER := 3.3.0
  911. +#KSRC:= ../lichee/linux-3.3/
  912. +endif
  913. +
  914. +ifneq ($(USER_MODULE_NAME),)
  915. +MODULE_NAME := $(USER_MODULE_NAME)
  916. +endif
  917. +
  918. +ifeq ($(CONFIG_MP_INCLUDED), y)
  919. +MODULE_NAME := $(MODULE_NAME)_mp
  920. +EXTRA_CFLAGS += -DCONFIG_MP_INCLUDED
  921. +endif
  922. +
  923. +
  924. +ifneq ($(KERNELRELEASE),)
  925. +
  926. +
  927. +rtk_core := core/rtw_cmd.o \
  928. + core/rtw_security.o \
  929. + core/rtw_debug.o \
  930. + core/rtw_io.o \
  931. + core/rtw_ioctl_query.o \
  932. + core/rtw_ioctl_set.o \
  933. + core/rtw_ieee80211.o \
  934. + core/rtw_mlme.o \
  935. + core/rtw_mlme_ext.o \
  936. + core/rtw_wlan_util.o \
  937. + core/rtw_pwrctrl.o \
  938. + core/rtw_rf.o \
  939. + core/rtw_recv.o \
  940. + core/rtw_sta_mgt.o \
  941. + core/rtw_ap.o \
  942. + core/rtw_xmit.o \
  943. + core/rtw_p2p.o \
  944. + core/rtw_tdls.o \
  945. + core/rtw_br_ext.o \
  946. + core/rtw_iol.o \
  947. + core/rtw_sreset.o
  948. +
  949. +$(MODULE_NAME)-y += $(rtk_core)
  950. +
  951. +$(MODULE_NAME)-$(CONFIG_INTEL_WIDI) += core/rtw_intel_widi.o
  952. +
  953. +$(MODULE_NAME)-y += core/efuse/rtw_efuse.o
  954. +
  955. +$(MODULE_NAME)-y += $(_HAL_INTFS_FILES)
  956. +
  957. +$(MODULE_NAME)-y += $(_OS_INTFS_FILES)
  958. +
  959. +$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \
  960. + core/rtw_mp_ioctl.o
  961. +
  962. +obj-$(CONFIG_RTL8192CU) := $(MODULE_NAME).o
  963. +
  964. +else
  965. +
  966. +export CONFIG_RTL8192CU = m
  967. +
  968. +all: modules
  969. +
  970. +modules:
  971. + $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules
  972. +
  973. +strip:
  974. + $(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded
  975. +
  976. +install:
  977. + install -p -m 644 $(MODULE_NAME).ko $(MODDESTDIR)
  978. + /sbin/depmod -a ${KVER}
  979. +
  980. +uninstall:
  981. + rm -f $(MODDESTDIR)/$(MODULE_NAME).ko
  982. + /sbin/depmod -a ${KVER}
  983. +
  984. +
  985. +config_r:
  986. + @echo "make config"
  987. + /bin/bash script/Configure script/config.in
  988. +
  989. +.PHONY: modules clean
  990. +
  991. +clean:
  992. + rm -fr *.mod.c *.mod *.o .*.cmd *.ko *~
  993. + rm .tmp_versions -fr ; rm Module.symvers -fr
  994. + rm -fr Module.markers ; rm -fr modules.order
  995. + cd core/efuse ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  996. + cd core ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  997. + cd hal/$(RTL871X)/$(HCI_NAME) ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  998. + cd hal/$(RTL871X) ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  999. + cd hal ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  1000. + cd os_dep/linux ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  1001. + cd os_dep ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
  1002. +endif
  1003. --- /dev/null
  1004. +++ b/drivers/net/wireless/rtl8192cu/clean
  1005. @@ -0,0 +1,5 @@
  1006. +#!/bin/bash
  1007. +rmmod 8192cu
  1008. +rmmod 8192ce
  1009. +rmmod 8192du
  1010. +rmmod 8192de
  1011. --- /dev/null
  1012. +++ b/drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c
  1013. @@ -0,0 +1,1145 @@
  1014. +/******************************************************************************
  1015. + *
  1016. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  1017. + *
  1018. + * This program is free software; you can redistribute it and/or modify it
  1019. + * under the terms of version 2 of the GNU General Public License as
  1020. + * published by the Free Software Foundation.
  1021. + *
  1022. + * This program is distributed in the hope that it will be useful, but WITHOUT
  1023. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  1024. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  1025. + * more details.
  1026. + *
  1027. + * You should have received a copy of the GNU General Public License along with
  1028. + * this program; if not, write to the Free Software Foundation, Inc.,
  1029. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  1030. + *
  1031. + *
  1032. + ******************************************************************************/
  1033. +#define _RTW_EFUSE_C_
  1034. +
  1035. +#include <drv_conf.h>
  1036. +#include <osdep_service.h>
  1037. +#include <drv_types.h>
  1038. +
  1039. +#include <rtw_efuse.h>
  1040. +
  1041. +
  1042. +
  1043. +/*------------------------Define local variable------------------------------*/
  1044. +u8 fakeEfuseBank=0;
  1045. +u32 fakeEfuseUsedBytes=0;
  1046. +u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0};
  1047. +u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0};
  1048. +u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0};
  1049. +
  1050. +u32 BTEfuseUsedBytes=0;
  1051. +u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
  1052. +u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};
  1053. +u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};
  1054. +
  1055. +u32 fakeBTEfuseUsedBytes=0;
  1056. +u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
  1057. +u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};
  1058. +u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};
  1059. +/*------------------------Define local variable------------------------------*/
  1060. +
  1061. +//------------------------------------------------------------------------------
  1062. +#define REG_EFUSE_CTRL 0x0030
  1063. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control.
  1064. +//------------------------------------------------------------------------------
  1065. +
  1066. +BOOLEAN
  1067. +Efuse_Read1ByteFromFakeContent(
  1068. + IN PADAPTER pAdapter,
  1069. + IN u16 Offset,
  1070. + IN OUT u8 *Value );
  1071. +BOOLEAN
  1072. +Efuse_Read1ByteFromFakeContent(
  1073. + IN PADAPTER pAdapter,
  1074. + IN u16 Offset,
  1075. + IN OUT u8 *Value )
  1076. +{
  1077. + if(Offset >= EFUSE_MAX_HW_SIZE)
  1078. + {
  1079. + return _FALSE;
  1080. + }
  1081. + //DbgPrint("Read fake content, offset = %d\n", Offset);
  1082. + if(fakeEfuseBank == 0)
  1083. + *Value = fakeEfuseContent[Offset];
  1084. + else
  1085. + *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset];
  1086. + return _TRUE;
  1087. +}
  1088. +
  1089. +BOOLEAN
  1090. +Efuse_Write1ByteToFakeContent(
  1091. + IN PADAPTER pAdapter,
  1092. + IN u16 Offset,
  1093. + IN u8 Value );
  1094. +BOOLEAN
  1095. +Efuse_Write1ByteToFakeContent(
  1096. + IN PADAPTER pAdapter,
  1097. + IN u16 Offset,
  1098. + IN u8 Value )
  1099. +{
  1100. + if(Offset >= EFUSE_MAX_HW_SIZE)
  1101. + {
  1102. + return _FALSE;
  1103. + }
  1104. + if(fakeEfuseBank == 0)
  1105. + fakeEfuseContent[Offset] = Value;
  1106. + else
  1107. + {
  1108. + fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;
  1109. + }
  1110. + return _TRUE;
  1111. +}
  1112. +
  1113. +/*-----------------------------------------------------------------------------
  1114. + * Function: Efuse_PowerSwitch
  1115. + *
  1116. + * Overview: When we want to enable write operation, we should change to
  1117. + * pwr on state. When we stop write, we should switch to 500k mode
  1118. + * and disable LDO 2.5V.
  1119. + *
  1120. + * Input: NONE
  1121. + *
  1122. + * Output: NONE
  1123. + *
  1124. + * Return: NONE
  1125. + *
  1126. + * Revised History:
  1127. + * When Who Remark
  1128. + * 11/17/2008 MHC Create Version 0.
  1129. + *
  1130. + *---------------------------------------------------------------------------*/
  1131. +VOID
  1132. +Efuse_PowerSwitch(
  1133. + IN PADAPTER pAdapter,
  1134. + IN u8 bWrite,
  1135. + IN u8 PwrState)
  1136. +{
  1137. + pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState);
  1138. +}
  1139. +
  1140. +/*-----------------------------------------------------------------------------
  1141. + * Function: efuse_GetCurrentSize
  1142. + *
  1143. + * Overview: Get current efuse size!!!
  1144. + *
  1145. + * Input: NONE
  1146. + *
  1147. + * Output: NONE
  1148. + *
  1149. + * Return: NONE
  1150. + *
  1151. + * Revised History:
  1152. + * When Who Remark
  1153. + * 11/16/2008 MHC Create Version 0.
  1154. + *
  1155. + *---------------------------------------------------------------------------*/
  1156. +u16
  1157. +Efuse_GetCurrentSize(
  1158. + IN PADAPTER pAdapter,
  1159. + IN u8 efuseType,
  1160. + IN BOOLEAN bPseudoTest)
  1161. +{
  1162. + u16 ret=0;
  1163. +
  1164. + ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest);
  1165. +
  1166. + return ret;
  1167. +}
  1168. +
  1169. +/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
  1170. +u8
  1171. +Efuse_CalculateWordCnts(IN u8 word_en)
  1172. +{
  1173. + u8 word_cnts = 0;
  1174. + if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable
  1175. + if(!(word_en & BIT(1))) word_cnts++;
  1176. + if(!(word_en & BIT(2))) word_cnts++;
  1177. + if(!(word_en & BIT(3))) word_cnts++;
  1178. + return word_cnts;
  1179. +}
  1180. +
  1181. +//
  1182. +// Description:
  1183. +// Execute E-Fuse read byte operation.
  1184. +// Refered from SD1 Richard.
  1185. +//
  1186. +// Assumption:
  1187. +// 1. Boot from E-Fuse and successfully auto-load.
  1188. +// 2. PASSIVE_LEVEL (USB interface)
  1189. +//
  1190. +// Created by Roger, 2008.10.21.
  1191. +//
  1192. +VOID
  1193. +ReadEFuseByte(
  1194. + PADAPTER Adapter,
  1195. + u16 _offset,
  1196. + u8 *pbuf,
  1197. + IN BOOLEAN bPseudoTest)
  1198. +{
  1199. + u32 value32;
  1200. + u8 readbyte;
  1201. + u16 retry;
  1202. + //u32 start=rtw_get_current_time();
  1203. +
  1204. + if(bPseudoTest)
  1205. + {
  1206. + Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf);
  1207. + return;
  1208. + }
  1209. +
  1210. + //Write Address
  1211. + rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff));
  1212. + readbyte = rtw_read8(Adapter, EFUSE_CTRL+2);
  1213. + rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
  1214. +
  1215. + //Write bit 32 0
  1216. + readbyte = rtw_read8(Adapter, EFUSE_CTRL+3);
  1217. + rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f));
  1218. +
  1219. + //Check bit 32 read-ready
  1220. + retry = 0;
  1221. + value32 = rtw_read32(Adapter, EFUSE_CTRL);
  1222. + //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10))
  1223. + while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000))
  1224. + {
  1225. + value32 = rtw_read32(Adapter, EFUSE_CTRL);
  1226. + retry++;
  1227. + }
  1228. +
  1229. + // 20100205 Joseph: Add delay suggested by SD1 Victor.
  1230. + // This fix the problem that Efuse read error in high temperature condition.
  1231. + // Designer says that there shall be some delay after ready bit is set, or the
  1232. + // result will always stay on last data we read.
  1233. + rtw_udelay_os(50);
  1234. + value32 = rtw_read32(Adapter, EFUSE_CTRL);
  1235. +
  1236. + *pbuf = (u8)(value32 & 0xff);
  1237. + //DBG_871X("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start));
  1238. +
  1239. +}
  1240. +
  1241. +
  1242. +//
  1243. +// Description:
  1244. +// 1. Execute E-Fuse read byte operation according as map offset and
  1245. +// save to E-Fuse table.
  1246. +// 2. Refered from SD1 Richard.
  1247. +//
  1248. +// Assumption:
  1249. +// 1. Boot from E-Fuse and successfully auto-load.
  1250. +// 2. PASSIVE_LEVEL (USB interface)
  1251. +//
  1252. +// Created by Roger, 2008.10.21.
  1253. +//
  1254. +// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description.
  1255. +// 2. Add efuse utilization collect.
  1256. +// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1
  1257. +// write addr must be after sec5.
  1258. +//
  1259. +
  1260. +VOID
  1261. +efuse_ReadEFuse(
  1262. + PADAPTER Adapter,
  1263. + u8 efuseType,
  1264. + u16 _offset,
  1265. + u16 _size_byte,
  1266. + u8 *pbuf,
  1267. + IN BOOLEAN bPseudoTest
  1268. + );
  1269. +VOID
  1270. +efuse_ReadEFuse(
  1271. + PADAPTER Adapter,
  1272. + u8 efuseType,
  1273. + u16 _offset,
  1274. + u16 _size_byte,
  1275. + u8 *pbuf,
  1276. + IN BOOLEAN bPseudoTest
  1277. + )
  1278. +{
  1279. + Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
  1280. +}
  1281. +
  1282. +VOID
  1283. +EFUSE_GetEfuseDefinition(
  1284. + IN PADAPTER pAdapter,
  1285. + IN u8 efuseType,
  1286. + IN u8 type,
  1287. + OUT void *pOut,
  1288. + IN BOOLEAN bPseudoTest
  1289. + )
  1290. +{
  1291. + pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest);
  1292. +}
  1293. +
  1294. +/*-----------------------------------------------------------------------------
  1295. + * Function: EFUSE_Read1Byte
  1296. + *
  1297. + * Overview: Copy from WMAC fot EFUSE read 1 byte.
  1298. + *
  1299. + * Input: NONE
  1300. + *
  1301. + * Output: NONE
  1302. + *
  1303. + * Return: NONE
  1304. + *
  1305. + * Revised History:
  1306. + * When Who Remark
  1307. + * 09/23/2008 MHC Copy from WMAC.
  1308. + *
  1309. + *---------------------------------------------------------------------------*/
  1310. +u8
  1311. +EFUSE_Read1Byte(
  1312. + IN PADAPTER Adapter,
  1313. + IN u16 Address)
  1314. +{
  1315. + u8 data;
  1316. + u8 Bytetemp = {0x00};
  1317. + u8 temp = {0x00};
  1318. + u32 k=0;
  1319. + u16 contentLen=0;
  1320. +
  1321. + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
  1322. +
  1323. + if (Address < contentLen) //E-fuse 512Byte
  1324. + {
  1325. + //Write E-fuse Register address bit0~7
  1326. + temp = Address & 0xFF;
  1327. + rtw_write8(Adapter, EFUSE_CTRL+1, temp);
  1328. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
  1329. + //Write E-fuse Register address bit8~9
  1330. + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
  1331. + rtw_write8(Adapter, EFUSE_CTRL+2, temp);
  1332. +
  1333. + //Write 0x30[31]=0
  1334. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1335. + temp = Bytetemp & 0x7F;
  1336. + rtw_write8(Adapter, EFUSE_CTRL+3, temp);
  1337. +
  1338. + //Wait Write-ready (0x30[31]=1)
  1339. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1340. + while(!(Bytetemp & 0x80))
  1341. + {
  1342. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1343. + k++;
  1344. + if(k==1000)
  1345. + {
  1346. + k=0;
  1347. + break;
  1348. + }
  1349. + }
  1350. + data=rtw_read8(Adapter, EFUSE_CTRL);
  1351. + return data;
  1352. + }
  1353. + else
  1354. + return 0xFF;
  1355. +
  1356. +}/* EFUSE_Read1Byte */
  1357. +
  1358. +/*-----------------------------------------------------------------------------
  1359. + * Function: EFUSE_Write1Byte
  1360. + *
  1361. + * Overview: Copy from WMAC fot EFUSE write 1 byte.
  1362. + *
  1363. + * Input: NONE
  1364. + *
  1365. + * Output: NONE
  1366. + *
  1367. + * Return: NONE
  1368. + *
  1369. + * Revised History:
  1370. + * When Who Remark
  1371. + * 09/23/2008 MHC Copy from WMAC.
  1372. + *
  1373. + *---------------------------------------------------------------------------*/
  1374. +
  1375. +void
  1376. +EFUSE_Write1Byte(
  1377. + IN PADAPTER Adapter,
  1378. + IN u16 Address,
  1379. + IN u8 Value);
  1380. +void
  1381. +EFUSE_Write1Byte(
  1382. + IN PADAPTER Adapter,
  1383. + IN u16 Address,
  1384. + IN u8 Value)
  1385. +{
  1386. + u8 Bytetemp = {0x00};
  1387. + u8 temp = {0x00};
  1388. + u32 k=0;
  1389. + u16 contentLen=0;
  1390. +
  1391. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value));
  1392. + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);
  1393. +
  1394. + if( Address < contentLen) //E-fuse 512Byte
  1395. + {
  1396. + rtw_write8(Adapter, EFUSE_CTRL, Value);
  1397. +
  1398. + //Write E-fuse Register address bit0~7
  1399. + temp = Address & 0xFF;
  1400. + rtw_write8(Adapter, EFUSE_CTRL+1, temp);
  1401. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);
  1402. +
  1403. + //Write E-fuse Register address bit8~9
  1404. + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);
  1405. + rtw_write8(Adapter, EFUSE_CTRL+2, temp);
  1406. +
  1407. + //Write 0x30[31]=1
  1408. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1409. + temp = Bytetemp | 0x80;
  1410. + rtw_write8(Adapter, EFUSE_CTRL+3, temp);
  1411. +
  1412. + //Wait Write-ready (0x30[31]=0)
  1413. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1414. + while(Bytetemp & 0x80)
  1415. + {
  1416. + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);
  1417. + k++;
  1418. + if(k==100)
  1419. + {
  1420. + k=0;
  1421. + break;
  1422. + }
  1423. + }
  1424. + }
  1425. +}/* EFUSE_Write1Byte */
  1426. +
  1427. +/* 11/16/2008 MH Read one byte from real Efuse. */
  1428. +u8
  1429. +efuse_OneByteRead(
  1430. + IN PADAPTER pAdapter,
  1431. + IN u16 addr,
  1432. + IN u8 *data,
  1433. + IN BOOLEAN bPseudoTest)
  1434. +{
  1435. + u8 tmpidx = 0;
  1436. + u8 bResult;
  1437. +
  1438. + if(bPseudoTest)
  1439. + {
  1440. + bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data);
  1441. + return bResult;
  1442. + }
  1443. + // -----------------e-fuse reg ctrl ---------------------------------
  1444. + //address
  1445. + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
  1446. + rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |
  1447. + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC ));
  1448. +
  1449. + rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd
  1450. +
  1451. + while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<100))
  1452. + {
  1453. + tmpidx++;
  1454. + }
  1455. + if(tmpidx<100)
  1456. + {
  1457. + *data=rtw_read8(pAdapter, EFUSE_CTRL);
  1458. + bResult = _TRUE;
  1459. + }
  1460. + else
  1461. + {
  1462. + *data = 0xff;
  1463. + bResult = _FALSE;
  1464. + }
  1465. + return bResult;
  1466. +}
  1467. +
  1468. +/* 11/16/2008 MH Write one byte to reald Efuse. */
  1469. +u8
  1470. +efuse_OneByteWrite(
  1471. + IN PADAPTER pAdapter,
  1472. + IN u16 addr,
  1473. + IN u8 data,
  1474. + IN BOOLEAN bPseudoTest)
  1475. +{
  1476. + u8 tmpidx = 0;
  1477. + u8 bResult;
  1478. +
  1479. + if(bPseudoTest)
  1480. + {
  1481. + bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data);
  1482. + return bResult;
  1483. + }
  1484. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr = %x Data=%x\n", addr, data));
  1485. +
  1486. + //return 0;
  1487. +
  1488. + // -----------------e-fuse reg ctrl ---------------------------------
  1489. + //address
  1490. + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));
  1491. + rtw_write8(pAdapter, EFUSE_CTRL+2,
  1492. + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )|(u8)((addr>>8)&0x03) );
  1493. + rtw_write8(pAdapter, EFUSE_CTRL, data);//data
  1494. +
  1495. + rtw_write8(pAdapter, EFUSE_CTRL+3, 0xF2);//write cmd
  1496. +
  1497. + while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){
  1498. + tmpidx++;
  1499. + }
  1500. +
  1501. + if(tmpidx<100)
  1502. + {
  1503. + bResult = _TRUE;
  1504. + }
  1505. + else
  1506. + {
  1507. + bResult = _FALSE;
  1508. + }
  1509. +
  1510. + return bResult;
  1511. +}
  1512. +
  1513. +int
  1514. +Efuse_PgPacketRead( IN PADAPTER pAdapter,
  1515. + IN u8 offset,
  1516. + IN u8 *data,
  1517. + IN BOOLEAN bPseudoTest)
  1518. +{
  1519. + int ret=0;
  1520. +
  1521. + ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest);
  1522. +
  1523. + return ret;
  1524. +}
  1525. +
  1526. +int
  1527. +Efuse_PgPacketWrite(IN PADAPTER pAdapter,
  1528. + IN u8 offset,
  1529. + IN u8 word_en,
  1530. + IN u8 *data,
  1531. + IN BOOLEAN bPseudoTest)
  1532. +{
  1533. + int ret;
  1534. +
  1535. + ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);
  1536. +
  1537. + return ret;
  1538. +}
  1539. +
  1540. +/*-----------------------------------------------------------------------------
  1541. + * Function: efuse_WordEnableDataRead
  1542. + *
  1543. + * Overview: Read allowed word in current efuse section data.
  1544. + *
  1545. + * Input: NONE
  1546. + *
  1547. + * Output: NONE
  1548. + *
  1549. + * Return: NONE
  1550. + *
  1551. + * Revised History:
  1552. + * When Who Remark
  1553. + * 11/16/2008 MHC Create Version 0.
  1554. + * 11/21/2008 MHC Fix Write bug when we only enable late word.
  1555. + *
  1556. + *---------------------------------------------------------------------------*/
  1557. +void
  1558. +efuse_WordEnableDataRead(IN u8 word_en,
  1559. + IN u8 *sourdata,
  1560. + IN u8 *targetdata)
  1561. +{
  1562. + if (!(word_en&BIT(0)))
  1563. + {
  1564. + targetdata[0] = sourdata[0];
  1565. + targetdata[1] = sourdata[1];
  1566. + }
  1567. + if (!(word_en&BIT(1)))
  1568. + {
  1569. + targetdata[2] = sourdata[2];
  1570. + targetdata[3] = sourdata[3];
  1571. + }
  1572. + if (!(word_en&BIT(2)))
  1573. + {
  1574. + targetdata[4] = sourdata[4];
  1575. + targetdata[5] = sourdata[5];
  1576. + }
  1577. + if (!(word_en&BIT(3)))
  1578. + {
  1579. + targetdata[6] = sourdata[6];
  1580. + targetdata[7] = sourdata[7];
  1581. + }
  1582. +}
  1583. +
  1584. +
  1585. +u8
  1586. +Efuse_WordEnableDataWrite( IN PADAPTER pAdapter,
  1587. + IN u16 efuse_addr,
  1588. + IN u8 word_en,
  1589. + IN u8 *data,
  1590. + IN BOOLEAN bPseudoTest)
  1591. +{
  1592. + u8 ret=0;
  1593. +
  1594. + ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
  1595. +
  1596. + return ret;
  1597. +}
  1598. +
  1599. +static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value)
  1600. +{
  1601. + return efuse_OneByteRead(padapter,address, value, _FALSE);
  1602. +}
  1603. +
  1604. +static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value)
  1605. +{
  1606. + return efuse_OneByteWrite(padapter,address, *value, _FALSE);
  1607. +}
  1608. +
  1609. +/*
  1610. + * read/wirte raw efuse data
  1611. + */
  1612. +u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data)
  1613. +{
  1614. + int i = 0;
  1615. + u16 real_content_len = 0, max_available_size = 0;
  1616. + u8 res = _FAIL ;
  1617. + u8 (*rw8)(PADAPTER, u16, u8*);
  1618. +
  1619. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE);
  1620. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  1621. +
  1622. + if (start_addr > real_content_len)
  1623. + return _FAIL;
  1624. +
  1625. + if (_TRUE == bWrite) {
  1626. + if ((start_addr + cnts) > max_available_size)
  1627. + return _FAIL;
  1628. + rw8 = &efuse_write8;
  1629. + } else
  1630. + rw8 = &efuse_read8;
  1631. +
  1632. + Efuse_PowerSwitch(padapter, bWrite, _TRUE);
  1633. +
  1634. + // e-fuse one byte read / write
  1635. + for (i = 0; i < cnts; i++) {
  1636. + if (start_addr >= real_content_len) {
  1637. + res = _FAIL;
  1638. + break;
  1639. + }
  1640. +
  1641. + res = rw8(padapter, start_addr++, data++);
  1642. + if (_FAIL == res) break;
  1643. + }
  1644. +
  1645. + Efuse_PowerSwitch(padapter, bWrite, _FALSE);
  1646. +
  1647. + return res;
  1648. +}
  1649. +//------------------------------------------------------------------------------
  1650. +u16 efuse_GetMaxSize(PADAPTER padapter)
  1651. +{
  1652. + u16 max_size;
  1653. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE);
  1654. + return max_size;
  1655. +}
  1656. +//------------------------------------------------------------------------------
  1657. +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size)
  1658. +{
  1659. + Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
  1660. + *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);
  1661. + Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
  1662. +
  1663. + return _SUCCESS;
  1664. +}
  1665. +//------------------------------------------------------------------------------
  1666. +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
  1667. +{
  1668. + u16 mapLen=0;
  1669. +
  1670. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
  1671. +
  1672. + if ((addr + cnts) > mapLen)
  1673. + return _FAIL;
  1674. +
  1675. + Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
  1676. +
  1677. + efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE);
  1678. +
  1679. + Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
  1680. +
  1681. + return _SUCCESS;
  1682. +}
  1683. +//------------------------------------------------------------------------------
  1684. +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
  1685. +{
  1686. + u8 offset, word_en;
  1687. + u8 *map;
  1688. + u8 newdata[PGPKT_DATA_SIZE];
  1689. + s32 i, j, idx;
  1690. + u8 ret = _SUCCESS;
  1691. + u16 mapLen=0;
  1692. +
  1693. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
  1694. +
  1695. + if ((addr + cnts) > mapLen)
  1696. + return _FAIL;
  1697. +
  1698. + map = rtw_zmalloc(mapLen);
  1699. + if(map == NULL){
  1700. + return _FAIL;
  1701. + }
  1702. +
  1703. + ret = rtw_efuse_map_read(padapter, 0, mapLen, map);
  1704. + if (ret == _FAIL) goto exit;
  1705. +
  1706. + Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
  1707. +
  1708. + offset = (addr >> 3);
  1709. + word_en = 0xF;
  1710. + _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
  1711. + i = addr & 0x7; // index of one package
  1712. + j = 0; // index of new package
  1713. + idx = 0; // data index
  1714. +
  1715. + if (i & 0x1) {
  1716. + // odd start
  1717. + if (data[idx] != map[addr+idx]) {
  1718. + word_en &= ~BIT(i >> 1);
  1719. + newdata[i-1] = map[addr+idx-1];
  1720. + newdata[i] = data[idx];
  1721. + }
  1722. + i++;
  1723. + idx++;
  1724. + }
  1725. + do {
  1726. + for (; i < PGPKT_DATA_SIZE; i += 2)
  1727. + {
  1728. + if (cnts == idx) break;
  1729. + if ((cnts - idx) == 1) {
  1730. + if (data[idx] != map[addr+idx]) {
  1731. + word_en &= ~BIT(i >> 1);
  1732. + newdata[i] = data[idx];
  1733. + newdata[i+1] = map[addr+idx+1];
  1734. + }
  1735. + idx++;
  1736. + break;
  1737. + } else {
  1738. + if ((data[idx] != map[addr+idx]) ||
  1739. + (data[idx+1] != map[addr+idx+1]))
  1740. + {
  1741. + word_en &= ~BIT(i >> 1);
  1742. + newdata[i] = data[idx];
  1743. + newdata[i+1] = data[idx + 1];
  1744. + }
  1745. + idx += 2;
  1746. + }
  1747. + if (idx == cnts) break;
  1748. + }
  1749. +
  1750. + if (word_en != 0xF) {
  1751. + ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE);
  1752. + DBG_871X("offset=%x \n",offset);
  1753. + DBG_871X("word_en=%x \n",word_en);
  1754. +
  1755. + for(i=0;i<PGPKT_DATA_SIZE;i++)
  1756. + {
  1757. + DBG_871X("data=%x \t",newdata[i]);
  1758. + }
  1759. + if (ret == _FAIL) break;
  1760. + }
  1761. +
  1762. + if (idx == cnts) break;
  1763. +
  1764. + offset++;
  1765. + i = 0;
  1766. + j = 0;
  1767. + word_en = 0xF;
  1768. + _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE);
  1769. + } while (1);
  1770. +
  1771. + Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
  1772. +
  1773. +exit:
  1774. +
  1775. + rtw_mfree(map, mapLen);
  1776. +
  1777. + return ret;
  1778. +}
  1779. +
  1780. +
  1781. +/*-----------------------------------------------------------------------------
  1782. + * Function: Efuse_ReadAllMap
  1783. + *
  1784. + * Overview: Read All Efuse content
  1785. + *
  1786. + * Input: NONE
  1787. + *
  1788. + * Output: NONE
  1789. + *
  1790. + * Return: NONE
  1791. + *
  1792. + * Revised History:
  1793. + * When Who Remark
  1794. + * 11/11/2008 MHC Create Version 0.
  1795. + *
  1796. + *---------------------------------------------------------------------------*/
  1797. +VOID
  1798. +Efuse_ReadAllMap(
  1799. + IN PADAPTER pAdapter,
  1800. + IN u8 efuseType,
  1801. + IN OUT u8 *Efuse,
  1802. + IN BOOLEAN bPseudoTest);
  1803. +VOID
  1804. +Efuse_ReadAllMap(
  1805. + IN PADAPTER pAdapter,
  1806. + IN u8 efuseType,
  1807. + IN OUT u8 *Efuse,
  1808. + IN BOOLEAN bPseudoTest)
  1809. +{
  1810. + u16 mapLen=0;
  1811. +
  1812. + Efuse_PowerSwitch(pAdapter,_FALSE, _TRUE);
  1813. +
  1814. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
  1815. +
  1816. + efuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
  1817. +
  1818. + Efuse_PowerSwitch(pAdapter,_FALSE, _FALSE);
  1819. +}
  1820. +
  1821. +/*-----------------------------------------------------------------------------
  1822. + * Function: efuse_ShadowRead1Byte
  1823. + * efuse_ShadowRead2Byte
  1824. + * efuse_ShadowRead4Byte
  1825. + *
  1826. + * Overview: Read from efuse init map by one/two/four bytes !!!!!
  1827. + *
  1828. + * Input: NONE
  1829. + *
  1830. + * Output: NONE
  1831. + *
  1832. + * Return: NONE
  1833. + *
  1834. + * Revised History:
  1835. + * When Who Remark
  1836. + * 11/12/2008 MHC Create Version 0.
  1837. + *
  1838. + *---------------------------------------------------------------------------*/
  1839. +static VOID
  1840. +efuse_ShadowRead1Byte(
  1841. + IN PADAPTER pAdapter,
  1842. + IN u16 Offset,
  1843. + IN OUT u8 *Value)
  1844. +{
  1845. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1846. +
  1847. + *Value = pEEPROM->efuse_eeprom_data[Offset];
  1848. +
  1849. +} // EFUSE_ShadowRead1Byte
  1850. +
  1851. +//---------------Read Two Bytes
  1852. +static VOID
  1853. +efuse_ShadowRead2Byte(
  1854. + IN PADAPTER pAdapter,
  1855. + IN u16 Offset,
  1856. + IN OUT u16 *Value)
  1857. +{
  1858. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1859. +
  1860. + *Value = pEEPROM->efuse_eeprom_data[Offset];
  1861. + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
  1862. +
  1863. +} // EFUSE_ShadowRead2Byte
  1864. +
  1865. +//---------------Read Four Bytes
  1866. +static VOID
  1867. +efuse_ShadowRead4Byte(
  1868. + IN PADAPTER pAdapter,
  1869. + IN u16 Offset,
  1870. + IN OUT u32 *Value)
  1871. +{
  1872. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1873. +
  1874. + *Value = pEEPROM->efuse_eeprom_data[Offset];
  1875. + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8;
  1876. + *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16;
  1877. + *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24;
  1878. +
  1879. +} // efuse_ShadowRead4Byte
  1880. +
  1881. +
  1882. +/*-----------------------------------------------------------------------------
  1883. + * Function: efuse_ShadowWrite1Byte
  1884. + * efuse_ShadowWrite2Byte
  1885. + * efuse_ShadowWrite4Byte
  1886. + *
  1887. + * Overview: Write efuse modify map by one/two/four byte.
  1888. + *
  1889. + * Input: NONE
  1890. + *
  1891. + * Output: NONE
  1892. + *
  1893. + * Return: NONE
  1894. + *
  1895. + * Revised History:
  1896. + * When Who Remark
  1897. + * 11/12/2008 MHC Create Version 0.
  1898. + *
  1899. + *---------------------------------------------------------------------------*/
  1900. +#ifdef PLATFORM
  1901. +static VOID
  1902. +efuse_ShadowWrite1Byte(
  1903. + IN PADAPTER pAdapter,
  1904. + IN u16 Offset,
  1905. + IN u8 Value);
  1906. +#endif //PLATFORM
  1907. +static VOID
  1908. +efuse_ShadowWrite1Byte(
  1909. + IN PADAPTER pAdapter,
  1910. + IN u16 Offset,
  1911. + IN u8 Value)
  1912. +{
  1913. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1914. +
  1915. + pEEPROM->efuse_eeprom_data[Offset] = Value;
  1916. +
  1917. +} // efuse_ShadowWrite1Byte
  1918. +
  1919. +//---------------Write Two Bytes
  1920. +static VOID
  1921. +efuse_ShadowWrite2Byte(
  1922. + IN PADAPTER pAdapter,
  1923. + IN u16 Offset,
  1924. + IN u16 Value)
  1925. +{
  1926. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1927. +
  1928. + pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF;
  1929. + pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8;
  1930. +
  1931. +} // efuse_ShadowWrite1Byte
  1932. +
  1933. +//---------------Write Four Bytes
  1934. +static VOID
  1935. +efuse_ShadowWrite4Byte(
  1936. + IN PADAPTER pAdapter,
  1937. + IN u16 Offset,
  1938. + IN u32 Value)
  1939. +{
  1940. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1941. +
  1942. + pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF);
  1943. + pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF);
  1944. + pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF);
  1945. + pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF);
  1946. +
  1947. +} // efuse_ShadowWrite1Byte
  1948. +
  1949. +/*-----------------------------------------------------------------------------
  1950. + * Function: EFUSE_ShadowMapUpdate
  1951. + *
  1952. + * Overview: Transfer current EFUSE content to shadow init and modify map.
  1953. + *
  1954. + * Input: NONE
  1955. + *
  1956. + * Output: NONE
  1957. + *
  1958. + * Return: NONE
  1959. + *
  1960. + * Revised History:
  1961. + * When Who Remark
  1962. + * 11/13/2008 MHC Create Version 0.
  1963. + *
  1964. + *---------------------------------------------------------------------------*/
  1965. +void EFUSE_ShadowMapUpdate(
  1966. + IN PADAPTER pAdapter,
  1967. + IN u8 efuseType,
  1968. + IN BOOLEAN bPseudoTest)
  1969. +{
  1970. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  1971. + u16 mapLen=0;
  1972. +
  1973. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);
  1974. +
  1975. + if (pEEPROM->bautoload_fail_flag == _TRUE)
  1976. + {
  1977. + _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen);
  1978. + }
  1979. + else
  1980. + {
  1981. + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  1982. + if(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM)) {
  1983. + #endif
  1984. +
  1985. + Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest);
  1986. +
  1987. + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  1988. + storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pEEPROM);
  1989. + }
  1990. + #endif
  1991. + }
  1992. +
  1993. + //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0],
  1994. + //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen);
  1995. +}// EFUSE_ShadowMapUpdate
  1996. +
  1997. +
  1998. +/*-----------------------------------------------------------------------------
  1999. + * Function: EFUSE_ShadowRead
  2000. + *
  2001. + * Overview: Read from efuse init map !!!!!
  2002. + *
  2003. + * Input: NONE
  2004. + *
  2005. + * Output: NONE
  2006. + *
  2007. + * Return: NONE
  2008. + *
  2009. + * Revised History:
  2010. + * When Who Remark
  2011. + * 11/12/2008 MHC Create Version 0.
  2012. + *
  2013. + *---------------------------------------------------------------------------*/
  2014. +void
  2015. +EFUSE_ShadowRead(
  2016. + IN PADAPTER pAdapter,
  2017. + IN u8 Type,
  2018. + IN u16 Offset,
  2019. + IN OUT u32 *Value )
  2020. +{
  2021. + if (Type == 1)
  2022. + efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);
  2023. + else if (Type == 2)
  2024. + efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);
  2025. + else if (Type == 4)
  2026. + efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);
  2027. +
  2028. +} // EFUSE_ShadowRead
  2029. +
  2030. +/*-----------------------------------------------------------------------------
  2031. + * Function: EFUSE_ShadowWrite
  2032. + *
  2033. + * Overview: Write efuse modify map for later update operation to use!!!!!
  2034. + *
  2035. + * Input: NONE
  2036. + *
  2037. + * Output: NONE
  2038. + *
  2039. + * Return: NONE
  2040. + *
  2041. + * Revised History:
  2042. + * When Who Remark
  2043. + * 11/12/2008 MHC Create Version 0.
  2044. + *
  2045. + *---------------------------------------------------------------------------*/
  2046. +VOID
  2047. +EFUSE_ShadowWrite(
  2048. + IN PADAPTER pAdapter,
  2049. + IN u8 Type,
  2050. + IN u16 Offset,
  2051. + IN OUT u32 Value);
  2052. +VOID
  2053. +EFUSE_ShadowWrite(
  2054. + IN PADAPTER pAdapter,
  2055. + IN u8 Type,
  2056. + IN u16 Offset,
  2057. + IN OUT u32 Value)
  2058. +{
  2059. +#if (MP_DRIVER == 0)
  2060. + return;
  2061. +#endif
  2062. +
  2063. + if (Type == 1)
  2064. + efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value);
  2065. + else if (Type == 2)
  2066. + efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value);
  2067. + else if (Type == 4)
  2068. + efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value);
  2069. +
  2070. +} // EFUSE_ShadowWrite
  2071. +
  2072. +VOID
  2073. +Efuse_InitSomeVar(
  2074. + IN PADAPTER pAdapter
  2075. + );
  2076. +VOID
  2077. +Efuse_InitSomeVar(
  2078. + IN PADAPTER pAdapter
  2079. + )
  2080. +{
  2081. + u8 i;
  2082. +
  2083. + _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE);
  2084. + _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN);
  2085. + _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN);
  2086. +
  2087. + for(i=0; i<EFUSE_MAX_BT_BANK; i++)
  2088. + {
  2089. + _rtw_memset((PVOID)&BTEfuseContent[i][0], EFUSE_MAX_HW_SIZE, 0xff);
  2090. + }
  2091. + _rtw_memset((PVOID)&BTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
  2092. + _rtw_memset((PVOID)&BTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
  2093. +
  2094. + for(i=0; i<EFUSE_MAX_BT_BANK; i++)
  2095. + {
  2096. + _rtw_memset((PVOID)&fakeBTEfuseContent[i][0], 0xff, EFUSE_MAX_HW_SIZE);
  2097. + }
  2098. + _rtw_memset((PVOID)&fakeBTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
  2099. + _rtw_memset((PVOID)&fakeBTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);
  2100. +}
  2101. +
  2102. +#ifdef PLATFORM_LINUX
  2103. +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  2104. +//#include <rtw_eeprom.h>
  2105. +
  2106. + int isAdaptorInfoFileValid(void)
  2107. +{
  2108. + return _TRUE;
  2109. +}
  2110. +
  2111. +int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv)
  2112. +{
  2113. + int ret =_SUCCESS;
  2114. +
  2115. + if(path && eeprom_priv) {
  2116. + ret = rtw_store_to_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE);
  2117. + if(ret == EEPROM_MAX_SIZE)
  2118. + ret = _SUCCESS;
  2119. + else
  2120. + ret = _FAIL;
  2121. + } else {
  2122. + DBG_871X("%s NULL pointer\n",__FUNCTION__);
  2123. + ret = _FAIL;
  2124. + }
  2125. + return ret;
  2126. +}
  2127. +
  2128. +int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv)
  2129. +{
  2130. + int ret = _SUCCESS;
  2131. + mm_segment_t oldfs;
  2132. + struct file *fp;
  2133. +
  2134. + if(path && eeprom_priv) {
  2135. +
  2136. + ret = rtw_retrive_from_file(path, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE);
  2137. +
  2138. + if(ret == EEPROM_MAX_SIZE)
  2139. + ret = _SUCCESS;
  2140. + else
  2141. + ret = _FAIL;
  2142. +
  2143. + #if 0
  2144. + if(isAdaptorInfoFileValid()) {
  2145. + return 0;
  2146. + } else {
  2147. + return _FAIL;
  2148. + }
  2149. + #endif
  2150. +
  2151. + } else {
  2152. + DBG_871X("%s NULL pointer\n",__FUNCTION__);
  2153. + ret = _FAIL;
  2154. + }
  2155. + return ret;
  2156. +}
  2157. +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
  2158. +#endif //PLATFORM_LINUX
  2159. --- /dev/null
  2160. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_ap.c
  2161. @@ -0,0 +1,2939 @@
  2162. +/******************************************************************************
  2163. + *
  2164. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  2165. + *
  2166. + * This program is free software; you can redistribute it and/or modify it
  2167. + * under the terms of version 2 of the GNU General Public License as
  2168. + * published by the Free Software Foundation.
  2169. + *
  2170. + * This program is distributed in the hope that it will be useful, but WITHOUT
  2171. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  2172. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  2173. + * more details.
  2174. + *
  2175. + * You should have received a copy of the GNU General Public License along with
  2176. + * this program; if not, write to the Free Software Foundation, Inc.,
  2177. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  2178. + *
  2179. + *
  2180. + ******************************************************************************/
  2181. +#define _RTW_AP_C_
  2182. +
  2183. +#include <drv_conf.h>
  2184. +#include <osdep_service.h>
  2185. +#include <drv_types.h>
  2186. +#include <wifi.h>
  2187. +
  2188. +
  2189. +#ifdef CONFIG_AP_MODE
  2190. +
  2191. +extern unsigned char RTW_WPA_OUI[];
  2192. +extern unsigned char WMM_OUI[];
  2193. +extern unsigned char WPS_OUI[];
  2194. +extern unsigned char P2P_OUI[];
  2195. +extern unsigned char WFD_OUI[];
  2196. +
  2197. +void init_mlme_ap_info(_adapter *padapter)
  2198. +{
  2199. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2200. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  2201. + struct sta_priv *pstapriv = &padapter->stapriv;
  2202. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  2203. +
  2204. +
  2205. + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock);
  2206. +
  2207. + //for ACL
  2208. + _rtw_init_queue(&pacl_list->acl_node_q);
  2209. +
  2210. + //pmlmeext->bstart_bss = _FALSE;
  2211. +
  2212. + start_ap_mode(padapter);
  2213. +}
  2214. +
  2215. +void free_mlme_ap_info(_adapter *padapter)
  2216. +{
  2217. + _irqL irqL;
  2218. + struct sta_info *psta=NULL;
  2219. + struct sta_priv *pstapriv = &padapter->stapriv;
  2220. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  2221. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2222. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2223. +
  2224. + //stop_ap_mode(padapter);
  2225. +
  2226. + pmlmepriv->update_bcn = _FALSE;
  2227. + pmlmeext->bstart_bss = _FALSE;
  2228. +
  2229. + rtw_sta_flush(padapter);
  2230. +
  2231. + pmlmeinfo->state = _HW_STATE_NOLINK_;
  2232. +
  2233. + //free_assoc_sta_resources
  2234. + rtw_free_all_stainfo(padapter);
  2235. +
  2236. + //free bc/mc sta_info
  2237. + psta = rtw_get_bcmc_stainfo(padapter);
  2238. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2239. + rtw_free_stainfo(padapter, psta);
  2240. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2241. +
  2242. +
  2243. + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock);
  2244. +
  2245. +}
  2246. +
  2247. +static void update_BCNTIM(_adapter *padapter)
  2248. +{
  2249. + struct sta_priv *pstapriv = &padapter->stapriv;
  2250. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  2251. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2252. + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network);
  2253. + unsigned char *pie = pnetwork_mlmeext->IEs;
  2254. +
  2255. + //DBG_871X("%s\n", __FUNCTION__);
  2256. +
  2257. + //update TIM IE
  2258. + //if(pstapriv->tim_bitmap)
  2259. + if(_TRUE)
  2260. + {
  2261. + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;
  2262. + u16 tim_bitmap_le;
  2263. + uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;
  2264. +
  2265. + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);
  2266. +
  2267. + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);
  2268. + if (p != NULL && tim_ielen>0)
  2269. + {
  2270. + tim_ielen += 2;
  2271. +
  2272. + premainder_ie = p+tim_ielen;
  2273. +
  2274. + tim_ie_offset = (sint)(p -pie);
  2275. +
  2276. + remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen;
  2277. +
  2278. + //append TIM IE from dst_ie offset
  2279. + dst_ie = p;
  2280. + }
  2281. + else
  2282. + {
  2283. + tim_ielen = 0;
  2284. +
  2285. + //calucate head_len
  2286. + offset = _FIXED_IE_LENGTH_;
  2287. +
  2288. + /* get ssid_ie len */
  2289. + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));
  2290. + if (p != NULL)
  2291. + offset += tmp_len+2;
  2292. +
  2293. + // get supported rates len
  2294. + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));
  2295. + if (p != NULL)
  2296. + {
  2297. + offset += tmp_len+2;
  2298. + }
  2299. +
  2300. + //DS Parameter Set IE, len=3
  2301. + offset += 3;
  2302. +
  2303. + premainder_ie = pie + offset;
  2304. +
  2305. + remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen;
  2306. +
  2307. + //append TIM IE from offset
  2308. + dst_ie = pie + offset;
  2309. +
  2310. + }
  2311. +
  2312. +
  2313. + if(remainder_ielen>0)
  2314. + {
  2315. + pbackup_remainder_ie = rtw_malloc(remainder_ielen);
  2316. + if(pbackup_remainder_ie && premainder_ie)
  2317. + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);
  2318. + }
  2319. +
  2320. + *dst_ie++=_TIM_IE_;
  2321. +
  2322. + if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc))
  2323. + tim_ielen = 5;
  2324. + else
  2325. + tim_ielen = 4;
  2326. +
  2327. + *dst_ie++= tim_ielen;
  2328. +
  2329. + *dst_ie++=0;//DTIM count
  2330. + *dst_ie++=1;//DTIM peroid
  2331. +
  2332. + if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames
  2333. + *dst_ie++ = BIT(0);//bitmap ctrl
  2334. + else
  2335. + *dst_ie++ = 0;
  2336. +
  2337. + if(tim_ielen==4)
  2338. + {
  2339. + *dst_ie++ = *(u8*)&tim_bitmap_le;
  2340. + }
  2341. + else if(tim_ielen==5)
  2342. + {
  2343. + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2);
  2344. + dst_ie+=2;
  2345. + }
  2346. +
  2347. + //copy remainder IE
  2348. + if(pbackup_remainder_ie)
  2349. + {
  2350. + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);
  2351. +
  2352. + rtw_mfree(pbackup_remainder_ie, remainder_ielen);
  2353. + }
  2354. +
  2355. + offset = (uint)(dst_ie - pie);
  2356. + pnetwork_mlmeext->IELength = offset + remainder_ielen;
  2357. +
  2358. + }
  2359. +
  2360. +#ifndef CONFIG_INTERRUPT_BASED_TXBCN
  2361. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2362. + set_tx_beacon_cmd(padapter);
  2363. +#endif
  2364. +#endif //!CONFIG_INTERRUPT_BASED_TXBCN
  2365. +
  2366. +
  2367. +}
  2368. +
  2369. +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len)
  2370. +{
  2371. + PNDIS_802_11_VARIABLE_IEs pIE;
  2372. + u8 bmatch = _FALSE;
  2373. + u8 *pie = pnetwork->IEs;
  2374. + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;
  2375. + u32 i, offset, ielen, ie_offset, remainder_ielen = 0;
  2376. +
  2377. + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;)
  2378. + {
  2379. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);
  2380. +
  2381. + if (pIE->ElementID > index)
  2382. + {
  2383. + break;
  2384. + }
  2385. + else if(pIE->ElementID == index) // already exist the same IE
  2386. + {
  2387. + p = (u8 *)pIE;
  2388. + ielen = pIE->Length;
  2389. + bmatch = _TRUE;
  2390. + break;
  2391. + }
  2392. +
  2393. + p = (u8 *)pIE;
  2394. + ielen = pIE->Length;
  2395. + i += (pIE->Length + 2);
  2396. + }
  2397. +
  2398. + if (p != NULL && ielen>0)
  2399. + {
  2400. + ielen += 2;
  2401. +
  2402. + premainder_ie = p+ielen;
  2403. +
  2404. + ie_offset = (sint)(p -pie);
  2405. +
  2406. + remainder_ielen = pnetwork->IELength - ie_offset - ielen;
  2407. +
  2408. + if(bmatch)
  2409. + dst_ie = p;
  2410. + else
  2411. + dst_ie = (p+ielen);
  2412. + }
  2413. +
  2414. + if(remainder_ielen>0)
  2415. + {
  2416. + pbackup_remainder_ie = rtw_malloc(remainder_ielen);
  2417. + if(pbackup_remainder_ie && premainder_ie)
  2418. + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);
  2419. + }
  2420. +
  2421. + *dst_ie++=index;
  2422. + *dst_ie++=len;
  2423. +
  2424. + _rtw_memcpy(dst_ie, data, len);
  2425. + dst_ie+=len;
  2426. +
  2427. + //copy remainder IE
  2428. + if(pbackup_remainder_ie)
  2429. + {
  2430. + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);
  2431. +
  2432. + rtw_mfree(pbackup_remainder_ie, remainder_ielen);
  2433. + }
  2434. +
  2435. + offset = (uint)(dst_ie - pie);
  2436. + pnetwork->IELength = offset + remainder_ielen;
  2437. +}
  2438. +
  2439. +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index)
  2440. +{
  2441. + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;
  2442. + uint offset, ielen, ie_offset, remainder_ielen = 0;
  2443. + u8 *pie = pnetwork->IEs;
  2444. +
  2445. + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_);
  2446. + if (p != NULL && ielen>0)
  2447. + {
  2448. + ielen += 2;
  2449. +
  2450. + premainder_ie = p+ielen;
  2451. +
  2452. + ie_offset = (sint)(p -pie);
  2453. +
  2454. + remainder_ielen = pnetwork->IELength - ie_offset - ielen;
  2455. +
  2456. + dst_ie = p;
  2457. + }
  2458. + else {
  2459. + return;
  2460. + }
  2461. +
  2462. + if(remainder_ielen>0)
  2463. + {
  2464. + pbackup_remainder_ie = rtw_malloc(remainder_ielen);
  2465. + if(pbackup_remainder_ie && premainder_ie)
  2466. + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);
  2467. + }
  2468. +
  2469. + //copy remainder IE
  2470. + if(pbackup_remainder_ie)
  2471. + {
  2472. + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);
  2473. +
  2474. + rtw_mfree(pbackup_remainder_ie, remainder_ielen);
  2475. + }
  2476. +
  2477. + offset = (uint)(dst_ie - pie);
  2478. + pnetwork->IELength = offset + remainder_ielen;
  2479. +}
  2480. +
  2481. +
  2482. +u8 chk_sta_is_alive(struct sta_info *psta);
  2483. +u8 chk_sta_is_alive(struct sta_info *psta)
  2484. +{
  2485. + u8 ret = _FALSE;
  2486. + #ifdef DBG_EXPIRATION_CHK
  2487. + DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n"
  2488. + , MAC_ARG(psta->hwaddr)
  2489. + , psta->rssi_stat.UndecoratedSmoothedPWDB
  2490. + //, STA_RX_PKTS_ARG(psta)
  2491. + , STA_RX_PKTS_DIFF_ARG(psta)
  2492. + , psta->expire_to
  2493. + , psta->state&WIFI_SLEEP_STATE?"PS, ":""
  2494. + , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":""
  2495. + , psta->sleepq_len
  2496. + );
  2497. + #endif
  2498. +
  2499. + //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta))
  2500. + if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts))
  2501. + {
  2502. + #if 0
  2503. + if(psta->state&WIFI_SLEEP_STATE)
  2504. + ret = _TRUE;
  2505. + #endif
  2506. + }
  2507. + else
  2508. + {
  2509. + ret = _TRUE;
  2510. + }
  2511. +
  2512. + sta_update_last_rx_pkts(psta);
  2513. +
  2514. + return ret;
  2515. +}
  2516. +
  2517. +void expire_timeout_chk(_adapter *padapter)
  2518. +{
  2519. + _irqL irqL;
  2520. + _list *phead, *plist;
  2521. + u8 updated;
  2522. + struct sta_info *psta=NULL;
  2523. + struct sta_priv *pstapriv = &padapter->stapriv;
  2524. + u8 chk_alive_num = 0;
  2525. + char chk_alive_list[NUM_STA];
  2526. + int i;
  2527. +
  2528. + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);
  2529. +
  2530. + phead = &pstapriv->auth_list;
  2531. + plist = get_next(phead);
  2532. +
  2533. + //check auth_queue
  2534. + #ifdef DBG_EXPIRATION_CHK
  2535. + if (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  2536. + DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n"
  2537. + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt);
  2538. + }
  2539. + #endif
  2540. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  2541. + {
  2542. + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list);
  2543. + plist = get_next(plist);
  2544. +
  2545. + if(psta->expire_to>0)
  2546. + {
  2547. + psta->expire_to--;
  2548. + if (psta->expire_to == 0)
  2549. + {
  2550. + rtw_list_delete(&psta->auth_list);
  2551. + pstapriv->auth_list_cnt--;
  2552. +
  2553. + DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n",
  2554. + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]);
  2555. +
  2556. + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);
  2557. +
  2558. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2559. + rtw_free_stainfo(padapter, psta);
  2560. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2561. +
  2562. + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);
  2563. + }
  2564. + }
  2565. +
  2566. + }
  2567. +
  2568. + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);
  2569. +
  2570. + psta = NULL;
  2571. +
  2572. +
  2573. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  2574. +
  2575. + phead = &pstapriv->asoc_list;
  2576. + plist = get_next(phead);
  2577. +
  2578. + //check asoc_queue
  2579. + #ifdef DBG_EXPIRATION_CHK
  2580. + if (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  2581. + DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n"
  2582. + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt);
  2583. + }
  2584. + #endif
  2585. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  2586. + {
  2587. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  2588. + plist = get_next(plist);
  2589. +
  2590. + if (chk_sta_is_alive(psta) || !psta->expire_to) {
  2591. + psta->expire_to = pstapriv->expire_to;
  2592. + psta->keep_alive_trycnt = 0;
  2593. + #ifdef CONFIG_TX_MCAST2UNI
  2594. + psta->under_exist_checking = 0;
  2595. + #endif // CONFIG_TX_MCAST2UNI
  2596. + } else {
  2597. + psta->expire_to--;
  2598. + }
  2599. +
  2600. +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  2601. +#ifdef CONFIG_TX_MCAST2UNI
  2602. + if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) {
  2603. + // check sta by delba(addba) for 11n STA
  2604. + // ToDo: use CCX report to check for all STAs
  2605. + //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking);
  2606. +
  2607. + if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) {
  2608. + DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2);
  2609. + psta->under_exist_checking = 0;
  2610. + psta->expire_to = 0;
  2611. + } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) {
  2612. + DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2);
  2613. + psta->under_exist_checking = 1;
  2614. + //tear down TX AMPDU
  2615. + send_delba(padapter, 1, psta->hwaddr);// // originator
  2616. + psta->htpriv.agg_enable_bitmap = 0x0;//reset
  2617. + psta->htpriv.candidate_tid_bitmap = 0x0;//reset
  2618. + }
  2619. + }
  2620. +#endif // CONFIG_TX_MCAST2UNI
  2621. +#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  2622. +
  2623. + if (psta->expire_to <= 0)
  2624. + {
  2625. + #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  2626. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2627. +
  2628. + if (padapter->registrypriv.wifi_spec == 1)
  2629. + {
  2630. + psta->expire_to = pstapriv->expire_to;
  2631. + continue;
  2632. + }
  2633. +
  2634. + if (psta->state & WIFI_SLEEP_STATE) {
  2635. + if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) {
  2636. + //to check if alive by another methods if staion is at ps mode.
  2637. + psta->expire_to = pstapriv->expire_to;
  2638. + psta->state |= WIFI_STA_ALIVE_CHK_STATE;
  2639. +
  2640. + //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr));
  2641. +
  2642. + //to update bcn with tim_bitmap for this station
  2643. + pstapriv->tim_bitmap |= BIT(psta->aid);
  2644. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  2645. +
  2646. + if(!pmlmeext->active_keep_alive_check)
  2647. + continue;
  2648. + }
  2649. + }
  2650. +
  2651. + if (pmlmeext->active_keep_alive_check) {
  2652. + int stainfo_offset;
  2653. +
  2654. + stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
  2655. + if (stainfo_offset_valid(stainfo_offset)) {
  2656. + chk_alive_list[chk_alive_num++] = stainfo_offset;
  2657. + }
  2658. +
  2659. + continue;
  2660. + }
  2661. + #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */
  2662. +
  2663. + rtw_list_delete(&psta->asoc_list);
  2664. + pstapriv->asoc_list_cnt--;
  2665. +
  2666. + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state);
  2667. + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING);
  2668. + }
  2669. + else
  2670. + {
  2671. + /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */
  2672. + if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt)
  2673. + && padapter->xmitpriv.free_xmitframe_cnt < (NR_XMITFRAME/pstapriv->asoc_list_cnt/2)
  2674. + ){
  2675. + DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__
  2676. + , MAC_ARG(psta->hwaddr)
  2677. + , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt);
  2678. + wakeup_sta_to_xmit(padapter, psta);
  2679. + }
  2680. + }
  2681. + }
  2682. +
  2683. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  2684. +
  2685. +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  2686. +if (chk_alive_num) {
  2687. +
  2688. + u8 backup_oper_channel=0;
  2689. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2690. + /* switch to correct channel of current network before issue keep-alive frames */
  2691. + if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) {
  2692. + backup_oper_channel = rtw_get_oper_ch(padapter);
  2693. + SelectChannel(padapter, pmlmeext->cur_channel);
  2694. + }
  2695. +
  2696. + /* issue null data to check sta alive*/
  2697. + for (i = 0; i < chk_alive_num; i++) {
  2698. +
  2699. + int ret = _FAIL;
  2700. +
  2701. + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
  2702. + if(!(psta->state &_FW_LINKED))
  2703. + continue;
  2704. +
  2705. + if (psta->state & WIFI_SLEEP_STATE)
  2706. + ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50);
  2707. + else
  2708. + ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50);
  2709. +
  2710. + psta->keep_alive_trycnt++;
  2711. + if (ret == _SUCCESS)
  2712. + {
  2713. + DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr));
  2714. + psta->expire_to = pstapriv->expire_to;
  2715. + psta->keep_alive_trycnt = 0;
  2716. + continue;
  2717. + }
  2718. + else if (psta->keep_alive_trycnt <= 3)
  2719. + {
  2720. + DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt);
  2721. + psta->expire_to = 1;
  2722. + continue;
  2723. + }
  2724. +
  2725. + psta->keep_alive_trycnt = 0;
  2726. +
  2727. + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state);
  2728. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  2729. + if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) {
  2730. + rtw_list_delete(&psta->asoc_list);
  2731. + pstapriv->asoc_list_cnt--;
  2732. + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING);
  2733. + }
  2734. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  2735. +
  2736. + }
  2737. +
  2738. + if (backup_oper_channel>0) /* back to the original operation channel */
  2739. + SelectChannel(padapter, backup_oper_channel);
  2740. +}
  2741. +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */
  2742. +
  2743. + associated_clients_update(padapter, updated);
  2744. +}
  2745. +
  2746. +
  2747. +static void add_RATid(_adapter *padapter, struct sta_info *psta)
  2748. +{
  2749. + int i;
  2750. + u8 rf_type;
  2751. + u32 init_rate=0;
  2752. + unsigned char sta_band = 0, raid, shortGIrate = _FALSE;
  2753. + unsigned char limit;
  2754. + unsigned int tx_ra_bitmap=0;
  2755. + struct ht_priv *psta_ht = NULL;
  2756. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  2757. + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  2758. +
  2759. +
  2760. + if(psta)
  2761. + psta_ht = &psta->htpriv;
  2762. + else
  2763. + return;
  2764. +
  2765. + //b/g mode ra_bitmap
  2766. + for (i=0; i<sizeof(psta->bssrateset); i++)
  2767. + {
  2768. + if (psta->bssrateset[i])
  2769. + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
  2770. + }
  2771. +
  2772. + //n mode ra_bitmap
  2773. + if(psta_ht->ht_option)
  2774. + {
  2775. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  2776. + if(rf_type == RF_2T2R)
  2777. + limit=16;// 2R
  2778. + else
  2779. + limit=8;// 1R
  2780. +
  2781. + for (i=0; i<limit; i++) {
  2782. + if (psta_ht->ht_cap.supp_mcs_set[i/8] & BIT(i%8))
  2783. + tx_ra_bitmap |= BIT(i+12);
  2784. + }
  2785. +
  2786. + //max short GI rate
  2787. + shortGIrate = psta_ht->sgi;
  2788. + }
  2789. +
  2790. +
  2791. +#if 0//gtest
  2792. + if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)
  2793. + {
  2794. + //is this a 2r STA?
  2795. + if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid)))
  2796. + {
  2797. + priv->pshare->has_2r_sta |= BIT(pstat->aid);
  2798. + if(rtw_read16(padapter, 0x102501f6) != 0xffff)
  2799. + {
  2800. + rtw_write16(padapter, 0x102501f6, 0xffff);
  2801. + reset_1r_sta_RA(priv, 0xffff);
  2802. + Switch_1SS_Antenna(priv, 3);
  2803. + }
  2804. + }
  2805. + else// bg or 1R STA?
  2806. + {
  2807. + if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0)
  2808. + {
  2809. + if(rtw_read16(padapter, 0x102501f6) != 0x7777)
  2810. + { // MCS7 SGI
  2811. + rtw_write16(padapter, 0x102501f6,0x7777);
  2812. + reset_1r_sta_RA(priv, 0x7777);
  2813. + Switch_1SS_Antenna(priv, 2);
  2814. + }
  2815. + }
  2816. + }
  2817. +
  2818. + }
  2819. +
  2820. + if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3))
  2821. + {
  2822. + if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper)
  2823. + pstat->rssi_level = 1;
  2824. + else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) ||
  2825. + ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) &&
  2826. + (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) &&
  2827. + (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_))))
  2828. + pstat->rssi_level = 2;
  2829. + else
  2830. + pstat->rssi_level = 3;
  2831. + }
  2832. +
  2833. + // rate adaptive by rssi
  2834. + if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len)
  2835. + {
  2836. + if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R))
  2837. + {
  2838. + switch (pstat->rssi_level) {
  2839. + case 1:
  2840. + pstat->tx_ra_bitmap &= 0x100f0000;
  2841. + break;
  2842. + case 2:
  2843. + pstat->tx_ra_bitmap &= 0x100ff000;
  2844. + break;
  2845. + case 3:
  2846. + if (priv->pshare->is_40m_bw)
  2847. + pstat->tx_ra_bitmap &= 0x100ff005;
  2848. + else
  2849. + pstat->tx_ra_bitmap &= 0x100ff001;
  2850. +
  2851. + break;
  2852. + }
  2853. + }
  2854. + else
  2855. + {
  2856. + switch (pstat->rssi_level) {
  2857. + case 1:
  2858. + pstat->tx_ra_bitmap &= 0x1f0f0000;
  2859. + break;
  2860. + case 2:
  2861. + pstat->tx_ra_bitmap &= 0x1f0ff000;
  2862. + break;
  2863. + case 3:
  2864. + if (priv->pshare->is_40m_bw)
  2865. + pstat->tx_ra_bitmap &= 0x000ff005;
  2866. + else
  2867. + pstat->tx_ra_bitmap &= 0x000ff001;
  2868. +
  2869. + break;
  2870. + }
  2871. +
  2872. + // Don't need to mask high rates due to new rate adaptive parameters
  2873. + //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta
  2874. + // pstat->tx_ra_bitmap &= 0x81ffffff;
  2875. +
  2876. + // NIC driver will report not supporting MCS15 and MCS14 in asoc req
  2877. + //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta)
  2878. + // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14
  2879. + }
  2880. + }
  2881. + else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat))
  2882. + {
  2883. + switch (pstat->rssi_level) {
  2884. + case 1:
  2885. + pstat->tx_ra_bitmap &= 0x00000f00;
  2886. + break;
  2887. + case 2:
  2888. + pstat->tx_ra_bitmap &= 0x00000ff0;
  2889. + break;
  2890. + case 3:
  2891. + pstat->tx_ra_bitmap &= 0x00000ff5;
  2892. + break;
  2893. + }
  2894. + }
  2895. + else
  2896. + {
  2897. + pstat->tx_ra_bitmap &= 0x0000000d;
  2898. + }
  2899. +
  2900. + // disable tx short GI when station cannot rx MCS15(AP is 2T2R)
  2901. + // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R)
  2902. + // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate
  2903. + if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) ||
  2904. + (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R)))
  2905. + {
  2906. + pstat->tx_ra_bitmap &= ~BIT(28);
  2907. + }
  2908. +#endif
  2909. +
  2910. + if ( pcur_network->Configuration.DSConfig > 14 ) {
  2911. + // 5G band
  2912. + if (tx_ra_bitmap & 0xffff000)
  2913. + sta_band |= WIRELESS_11_5N | WIRELESS_11A;
  2914. + else
  2915. + sta_band |= WIRELESS_11A;
  2916. + } else {
  2917. + if (tx_ra_bitmap & 0xffff000)
  2918. + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B;
  2919. + else if (tx_ra_bitmap & 0xff0)
  2920. + sta_band |= WIRELESS_11G |WIRELESS_11B;
  2921. + else
  2922. + sta_band |= WIRELESS_11B;
  2923. + }
  2924. +
  2925. + raid = networktype_to_raid(sta_band);
  2926. + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f;
  2927. +
  2928. + if (psta->aid < NUM_STA)
  2929. + {
  2930. + u8 arg = 0;
  2931. +
  2932. + arg = psta->mac_id&0x1f;
  2933. +
  2934. + arg |= BIT(7);//support entry 2~31
  2935. +
  2936. + if (shortGIrate==_TRUE)
  2937. + arg |= BIT(5);
  2938. +
  2939. + tx_ra_bitmap |= ((raid<<28)&0xf0000000);
  2940. +
  2941. + DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%x, arg=0x%x\n",
  2942. + __FUNCTION__ , psta->mac_id, raid ,tx_ra_bitmap, arg);
  2943. +
  2944. + //bitmap[0:27] = tx_rate_bitmap
  2945. + //bitmap[28:31]= Rate Adaptive id
  2946. + //arg[0:4] = macid
  2947. + //arg[5] = Short GI
  2948. + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg);
  2949. +
  2950. + if (shortGIrate==_TRUE)
  2951. + init_rate |= BIT(6);
  2952. +
  2953. + //set ra_id, init_rate
  2954. + psta->raid = raid;
  2955. + psta->init_rate = init_rate;
  2956. +
  2957. + }
  2958. + else
  2959. + {
  2960. + DBG_871X("station aid %d exceed the max number\n", psta->aid);
  2961. + }
  2962. +
  2963. +}
  2964. +
  2965. +static void update_bmc_sta(_adapter *padapter)
  2966. +{
  2967. + _irqL irqL;
  2968. + u32 init_rate=0;
  2969. + unsigned char network_type, raid;
  2970. + int i, supportRateNum = 0;
  2971. + unsigned int tx_ra_bitmap=0;
  2972. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  2973. + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  2974. + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter);
  2975. +
  2976. + if(psta)
  2977. + {
  2978. + psta->aid = 0;//default set to 0
  2979. + //psta->mac_id = psta->aid+4;
  2980. + psta->mac_id = psta->aid + 1;
  2981. +
  2982. + psta->qos_option = 0;
  2983. + psta->htpriv.ht_option = _FALSE;
  2984. +
  2985. + psta->ieee8021x_blocked = 0;
  2986. +
  2987. + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));
  2988. +
  2989. + //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this.
  2990. +
  2991. +
  2992. +
  2993. + //prepare for add_RATid
  2994. + supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates);
  2995. + network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1);
  2996. +
  2997. + _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum);
  2998. + psta->bssratelen = supportRateNum;
  2999. +
  3000. + //b/g mode ra_bitmap
  3001. + for (i=0; i<supportRateNum; i++)
  3002. + {
  3003. + if (psta->bssrateset[i])
  3004. + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
  3005. + }
  3006. +
  3007. + if ( pcur_network->Configuration.DSConfig > 14 ) {
  3008. + //force to A mode. 5G doesn't support CCK rates
  3009. + network_type = WIRELESS_11A;
  3010. + tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps
  3011. + } else {
  3012. + //force to b mode
  3013. + network_type = WIRELESS_11B;
  3014. + tx_ra_bitmap = 0xf;
  3015. + }
  3016. +
  3017. + //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum);
  3018. +
  3019. + raid = networktype_to_raid(network_type);
  3020. + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f;
  3021. +
  3022. + //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap);
  3023. +
  3024. + //if(pHalData->fw_ractrl == _TRUE)
  3025. + {
  3026. + u8 arg = 0;
  3027. +
  3028. + arg = psta->mac_id&0x1f;
  3029. +
  3030. + arg |= BIT(7);
  3031. +
  3032. + //if (shortGIrate==_TRUE)
  3033. + // arg |= BIT(5);
  3034. +
  3035. + tx_ra_bitmap |= ((raid<<28)&0xf0000000);
  3036. +
  3037. + DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg);
  3038. +
  3039. + //bitmap[0:27] = tx_rate_bitmap
  3040. + //bitmap[28:31]= Rate Adaptive id
  3041. + //arg[0:4] = macid
  3042. + //arg[5] = Short GI
  3043. + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg);
  3044. +
  3045. + }
  3046. +
  3047. + //set ra_id, init_rate
  3048. + psta->raid = raid;
  3049. + psta->init_rate = init_rate;
  3050. +
  3051. + _enter_critical_bh(&psta->lock, &irqL);
  3052. + psta->state = _FW_LINKED;
  3053. + _exit_critical_bh(&psta->lock, &irqL);
  3054. +
  3055. + }
  3056. + else
  3057. + {
  3058. + DBG_871X("add_RATid_bmc_sta error!\n");
  3059. + }
  3060. +
  3061. +}
  3062. +
  3063. +//notes:
  3064. +//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode
  3065. +//MAC_ID = AID+1 for sta in ap/adhoc mode
  3066. +//MAC_ID = 1 for bc/mc for sta/ap/adhoc
  3067. +//MAC_ID = 0 for bssid for sta/ap/adhoc
  3068. +//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1;
  3069. +
  3070. +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
  3071. +{
  3072. + _irqL irqL;
  3073. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3074. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  3075. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  3076. + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv;
  3077. + struct ht_priv *phtpriv_sta = &psta->htpriv;
  3078. +
  3079. + //set intf_tag to if1
  3080. + //psta->intf_tag = 0;
  3081. +
  3082. + //psta->mac_id = psta->aid+4;
  3083. + psta->mac_id = psta->aid+1;
  3084. +
  3085. + if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)
  3086. + psta->ieee8021x_blocked = _TRUE;
  3087. + else
  3088. + psta->ieee8021x_blocked = _FALSE;
  3089. +
  3090. +
  3091. + //update sta's cap
  3092. +
  3093. + //ERP
  3094. + VCS_update(padapter, psta);
  3095. +
  3096. + //HT related cap
  3097. + if(phtpriv_sta->ht_option)
  3098. + {
  3099. + //check if sta supports rx ampdu
  3100. + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable;
  3101. +
  3102. + //check if sta support s Short GI
  3103. + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40))
  3104. + {
  3105. + phtpriv_sta->sgi = _TRUE;
  3106. + }
  3107. +
  3108. + // bwmode
  3109. + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))
  3110. + {
  3111. + //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40;
  3112. + phtpriv_sta->bwmode = pmlmeext->cur_bwmode;
  3113. + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;
  3114. +
  3115. + }
  3116. +
  3117. + psta->qos_option = _TRUE;
  3118. +
  3119. + }
  3120. + else
  3121. + {
  3122. + phtpriv_sta->ampdu_enable = _FALSE;
  3123. +
  3124. + phtpriv_sta->sgi = _FALSE;
  3125. + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20;
  3126. + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  3127. + }
  3128. +
  3129. + //Rx AMPDU
  3130. + send_delba(padapter, 0, psta->hwaddr);// recipient
  3131. +
  3132. + //TX AMPDU
  3133. + send_delba(padapter, 1, psta->hwaddr);// // originator
  3134. + phtpriv_sta->agg_enable_bitmap = 0x0;//reset
  3135. + phtpriv_sta->candidate_tid_bitmap = 0x0;//reset
  3136. +
  3137. +
  3138. + //todo: init other variables
  3139. +
  3140. + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));
  3141. +
  3142. +
  3143. + //add ratid
  3144. + //add_RATid(padapter, psta);//move to ap_sta_info_defer_update()
  3145. +
  3146. +
  3147. + _enter_critical_bh(&psta->lock, &irqL);
  3148. + psta->state |= _FW_LINKED;
  3149. + _exit_critical_bh(&psta->lock, &irqL);
  3150. +
  3151. +
  3152. +}
  3153. +
  3154. +static void update_hw_ht_param(_adapter *padapter)
  3155. +{
  3156. + unsigned char max_AMPDU_len;
  3157. + unsigned char min_MPDU_spacing;
  3158. + struct registry_priv *pregpriv = &padapter->registrypriv;
  3159. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  3160. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  3161. +
  3162. + DBG_871X("%s\n", __FUNCTION__);
  3163. +
  3164. +
  3165. + //handle A-MPDU parameter field
  3166. + /*
  3167. + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
  3168. + AMPDU_para [4:2]:Min MPDU Start Spacing
  3169. + */
  3170. + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;
  3171. +
  3172. + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
  3173. +
  3174. + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
  3175. +
  3176. + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
  3177. +
  3178. + //
  3179. + // Config SM Power Save setting
  3180. + //
  3181. + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
  3182. + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)
  3183. + {
  3184. + /*u8 i;
  3185. + //update the MCS rates
  3186. + for (i = 0; i < 16; i++)
  3187. + {
  3188. + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  3189. + }*/
  3190. + DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__);
  3191. + }
  3192. +
  3193. + //
  3194. + // Config current HT Protection mode.
  3195. + //
  3196. + //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;
  3197. +
  3198. +}
  3199. +
  3200. +static void start_bss_network(_adapter *padapter, u8 *pbuf)
  3201. +{
  3202. + u8 *p;
  3203. + u8 val8, cur_channel, cur_bwmode, cur_ch_offset;
  3204. + u16 bcn_interval;
  3205. + u32 acparm;
  3206. + int ie_len;
  3207. + struct registry_priv *pregpriv = &padapter->registrypriv;
  3208. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3209. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  3210. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  3211. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  3212. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  3213. + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network);
  3214. + struct HT_info_element *pht_info=NULL;
  3215. +#ifdef CONFIG_P2P
  3216. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  3217. +#endif //CONFIG_P2P
  3218. + u8 cbw40_enable=0;
  3219. + u8 change_band = _FALSE;
  3220. + //DBG_871X("%s\n", __FUNCTION__);
  3221. +
  3222. + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod;
  3223. + cur_channel = pnetwork->Configuration.DSConfig;
  3224. + cur_bwmode = HT_CHANNEL_WIDTH_20;;
  3225. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  3226. +
  3227. +
  3228. + //check if there is wps ie,
  3229. + //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd,
  3230. + //and at first time the security ie ( RSN/WPA IE) will not include in beacon.
  3231. + if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL))
  3232. + {
  3233. + pmlmeext->bstart_bss = _TRUE;
  3234. + }
  3235. +
  3236. + //todo: update wmm, ht cap
  3237. + //pmlmeinfo->WMM_enable;
  3238. + //pmlmeinfo->HT_enable;
  3239. + if(pmlmepriv->qospriv.qos_option)
  3240. + pmlmeinfo->WMM_enable = _TRUE;
  3241. +
  3242. + if(pmlmepriv->htpriv.ht_option)
  3243. + {
  3244. + pmlmeinfo->WMM_enable = _TRUE;
  3245. + pmlmeinfo->HT_enable = _TRUE;
  3246. + //pmlmeinfo->HT_info_enable = _TRUE;
  3247. + //pmlmeinfo->HT_caps_enable = _TRUE;
  3248. +
  3249. + update_hw_ht_param(padapter);
  3250. + }
  3251. +
  3252. +
  3253. + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time
  3254. + {
  3255. + //WEP Key will be set before this function, do not clear CAM.
  3256. + if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_))
  3257. + flush_all_cam_entry(padapter); //clear CAM
  3258. + }
  3259. +
  3260. + //set MSR to AP_Mode
  3261. + Set_MSR(padapter, _HW_STATE_AP_);
  3262. +
  3263. + //Set BSSID REG
  3264. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress);
  3265. +
  3266. + //Set EDCA param reg
  3267. +#ifdef CONFIG_CONCURRENT_MODE
  3268. + acparm = 0x005ea42b;
  3269. +#else
  3270. + acparm = 0x002F3217; // VO
  3271. +#endif
  3272. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));
  3273. + acparm = 0x005E4317; // VI
  3274. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));
  3275. + //acparm = 0x00105320; // BE
  3276. + acparm = 0x005ea42b;
  3277. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));
  3278. + acparm = 0x0000A444; // BK
  3279. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));
  3280. +
  3281. + //Set Security
  3282. + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
  3283. + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  3284. +
  3285. + //Beacon Control related register
  3286. + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval));
  3287. +
  3288. + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time
  3289. + {
  3290. + u32 initialgain;
  3291. +
  3292. + initialgain = 0x1e;
  3293. +
  3294. +
  3295. + //disable dynamic functions, such as high power, DIG
  3296. + //Save_DM_Func_Flag(padapter);
  3297. + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  3298. +
  3299. +#ifdef CONFIG_CONCURRENT_MODE
  3300. + if(padapter->adapter_type > PRIMARY_ADAPTER)
  3301. + {
  3302. + if(rtw_buddy_adapter_up(padapter))
  3303. + {
  3304. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  3305. +
  3306. + //turn on dynamic functions on PRIMARY_ADAPTER, dynamic functions only runs at PRIMARY_ADAPTER
  3307. + Switch_DM_Func(pbuddy_adapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
  3308. +
  3309. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  3310. + }
  3311. + }
  3312. + else
  3313. +#endif
  3314. + {
  3315. + //turn on dynamic functions
  3316. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
  3317. +
  3318. + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  3319. + }
  3320. +
  3321. + }
  3322. +
  3323. + //set channel, bwmode
  3324. + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  3325. + if( p && ie_len)
  3326. + {
  3327. + pht_info = (struct HT_info_element *)(p+2);
  3328. +
  3329. + if( pmlmeext->cur_channel > 14 )
  3330. + {
  3331. + if( pregpriv->cbw40_enable & BIT(1) )
  3332. + cbw40_enable = 1;
  3333. + }
  3334. + else
  3335. + if( pregpriv->cbw40_enable & BIT(0) )
  3336. + cbw40_enable = 1;
  3337. +
  3338. + if ((cbw40_enable) && (pht_info->infos[0] & BIT(2)))
  3339. + {
  3340. + //switch to the 40M Hz mode
  3341. + //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  3342. + cur_bwmode = HT_CHANNEL_WIDTH_40;
  3343. + switch (pht_info->infos[0] & 0x3)
  3344. + {
  3345. + case 1:
  3346. + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  3347. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  3348. + break;
  3349. +
  3350. + case 3:
  3351. + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  3352. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  3353. + break;
  3354. +
  3355. + default:
  3356. + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  3357. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  3358. + break;
  3359. + }
  3360. +
  3361. + }
  3362. +
  3363. + }
  3364. +
  3365. +#ifdef CONFIG_DUALMAC_CONCURRENT
  3366. + dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  3367. +#else
  3368. + //TODO: need to judge the phy parameters on concurrent mode for single phy
  3369. + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  3370. +#ifdef CONFIG_CONCURRENT_MODE
  3371. + if(!check_buddy_fwstate(padapter, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY))
  3372. + {
  3373. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  3374. + }
  3375. + else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode
  3376. + {
  3377. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  3378. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  3379. +
  3380. + //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter
  3381. + DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n");
  3382. + DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  3383. + DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  3384. +
  3385. + if((cur_channel <= 14 && pbuddy_mlmeext->cur_channel >= 36) ||
  3386. + (cur_channel >= 36 && pbuddy_mlmeext->cur_channel <= 14))
  3387. + change_band = _TRUE;
  3388. +
  3389. + cur_channel = pbuddy_mlmeext->cur_channel;
  3390. + if(cur_bwmode == HT_CHANNEL_WIDTH_40)
  3391. + {
  3392. + if(pht_info)
  3393. + pht_info->infos[0] &= ~(BIT(0)|BIT(1));
  3394. +
  3395. + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  3396. + {
  3397. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  3398. +
  3399. + //to update cur_ch_offset value in beacon
  3400. + if(pht_info)
  3401. + {
  3402. + switch(cur_ch_offset)
  3403. + {
  3404. + case HAL_PRIME_CHNL_OFFSET_LOWER:
  3405. + pht_info->infos[0] |= 0x1;
  3406. + break;
  3407. + case HAL_PRIME_CHNL_OFFSET_UPPER:
  3408. + pht_info->infos[0] |= 0x3;
  3409. + break;
  3410. + case HAL_PRIME_CHNL_OFFSET_DONT_CARE:
  3411. + default:
  3412. + break;
  3413. + }
  3414. + }
  3415. +
  3416. + }
  3417. + else if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20)
  3418. + {
  3419. + cur_bwmode = HT_CHANNEL_WIDTH_20;
  3420. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  3421. +
  3422. + if(cur_channel>0 && cur_channel<5)
  3423. + {
  3424. + if(pht_info)
  3425. + pht_info->infos[0] |= 0x1;
  3426. +
  3427. + cur_bwmode = HT_CHANNEL_WIDTH_40;
  3428. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  3429. + }
  3430. +
  3431. + if(cur_channel>7 && cur_channel<(14+1))
  3432. + {
  3433. + if(pht_info)
  3434. + pht_info->infos[0] |= 0x3;
  3435. +
  3436. + cur_bwmode = HT_CHANNEL_WIDTH_40;
  3437. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  3438. + }
  3439. +
  3440. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  3441. + }
  3442. +
  3443. + }
  3444. +
  3445. + // to update channel value in beacon
  3446. + pnetwork->Configuration.DSConfig = cur_channel;
  3447. + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  3448. + if(p && ie_len>0)
  3449. + *(p + 2) = cur_channel;
  3450. +
  3451. + if(pht_info)
  3452. + pht_info->primary_channel = cur_channel;
  3453. +
  3454. + //set buddy adapter channel, bandwidth, offeset to current adapter
  3455. + pmlmeext->cur_channel = cur_channel;
  3456. + pmlmeext->cur_bwmode = cur_bwmode;
  3457. + pmlmeext->cur_ch_offset = cur_ch_offset;
  3458. +
  3459. + //buddy interface band is different from current interface, update ERP, support rate, ext support rate IE
  3460. + if(change_band == _TRUE)
  3461. + change_band_update_ie(padapter, pnetwork);
  3462. + }
  3463. +#else
  3464. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  3465. +#endif //CONFIG_CONCURRENT_MODE
  3466. +
  3467. + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  3468. +
  3469. + //
  3470. + pmlmeext->cur_channel = cur_channel;
  3471. + pmlmeext->cur_bwmode = cur_bwmode;
  3472. + pmlmeext->cur_ch_offset = cur_ch_offset;
  3473. +#endif //CONFIG_DUALMAC_CONCURRENT
  3474. + pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type;
  3475. +
  3476. + //update cur_wireless_mode
  3477. + update_wireless_mode(padapter);
  3478. +
  3479. + //update RRSR after set channel and bandwidth
  3480. + UpdateBrateTbl(padapter, pnetwork->SupportedRates);
  3481. + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates);
  3482. +
  3483. + //udpate capability after cur_wireless_mode updated
  3484. + update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork));
  3485. +
  3486. + //let pnetwork_mlmeext == pnetwork_mlme.
  3487. + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);
  3488. +
  3489. +#ifdef CONFIG_P2P
  3490. + _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength);
  3491. + pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength;
  3492. +#endif //CONFIG_P2P
  3493. +
  3494. + if(_TRUE == pmlmeext->bstart_bss)
  3495. + {
  3496. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  3497. +
  3498. +#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in.
  3499. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  3500. + //issue beacon frame
  3501. + if(send_beacon(padapter)==_FAIL)
  3502. + {
  3503. + DBG_871X("issue_beacon, fail!\n");
  3504. + }
  3505. +#endif
  3506. +#endif //!CONFIG_INTERRUPT_BASED_TXBCN
  3507. +
  3508. + }
  3509. +
  3510. +
  3511. + //update bc/mc sta_info
  3512. + update_bmc_sta(padapter);
  3513. +
  3514. + //pmlmeext->bstart_bss = _TRUE;
  3515. +
  3516. +}
  3517. +
  3518. +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len)
  3519. +{
  3520. + int ret=_SUCCESS;
  3521. + u8 *p;
  3522. + u8 *pHT_caps_ie=NULL;
  3523. + u8 *pHT_info_ie=NULL;
  3524. + struct sta_info *psta = NULL;
  3525. + u16 cap, ht_cap=_FALSE;
  3526. + uint ie_len = 0;
  3527. + int group_cipher, pairwise_cipher;
  3528. + u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX];
  3529. + int supportRateNum = 0;
  3530. + u8 OUI1[] = {0x00, 0x50, 0xf2,0x01};
  3531. + u8 wps_oui[4]={0x0,0x50,0xf2,0x04};
  3532. + u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
  3533. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  3534. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  3535. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3536. + WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  3537. + struct sta_priv *pstapriv = &padapter->stapriv;
  3538. + u8 *ie = pbss_network->IEs;
  3539. +
  3540. +
  3541. + /* SSID */
  3542. + /* Supported rates */
  3543. + /* DS Params */
  3544. + /* WLAN_EID_COUNTRY */
  3545. + /* ERP Information element */
  3546. + /* Extended supported rates */
  3547. + /* WPA/WPA2 */
  3548. + /* Wi-Fi Wireless Multimedia Extensions */
  3549. + /* ht_capab, ht_oper */
  3550. + /* WPS IE */
  3551. +
  3552. + DBG_871X("%s, len=%d\n", __FUNCTION__, len);
  3553. +
  3554. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  3555. + return _FAIL;
  3556. +
  3557. +
  3558. + if(len>MAX_IE_SZ)
  3559. + return _FAIL;
  3560. +
  3561. + pbss_network->IELength = len;
  3562. +
  3563. + _rtw_memset(ie, 0, MAX_IE_SZ);
  3564. +
  3565. + _rtw_memcpy(ie, pbuf, pbss_network->IELength);
  3566. +
  3567. +
  3568. + if(pbss_network->InfrastructureMode!=Ndis802_11APMode)
  3569. + return _FAIL;
  3570. +
  3571. + pbss_network->Rssi = 0;
  3572. +
  3573. + _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN);
  3574. +
  3575. + //beacon interval
  3576. + p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability
  3577. + //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p);
  3578. + pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p);
  3579. +
  3580. + //capability
  3581. + //cap = *(unsigned short *)rtw_get_capability_from_ie(ie);
  3582. + //cap = le16_to_cpu(cap);
  3583. + cap = RTW_GET_LE16(ie);
  3584. +
  3585. + //SSID
  3586. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_));
  3587. + if(p && ie_len>0)
  3588. + {
  3589. + _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID));
  3590. + _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len);
  3591. + pbss_network->Ssid.SsidLength = ie_len;
  3592. + }
  3593. +
  3594. + //chnnel
  3595. + channel = 0;
  3596. + pbss_network->Configuration.Length = 0;
  3597. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3598. + if(p && ie_len>0)
  3599. + channel = *(p + 2);
  3600. +
  3601. + pbss_network->Configuration.DSConfig = channel;
  3602. +
  3603. +
  3604. + _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX);
  3605. + // get supported rates
  3606. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3607. + if (p != NULL)
  3608. + {
  3609. + _rtw_memcpy(supportRate, p+2, ie_len);
  3610. + supportRateNum = ie_len;
  3611. + }
  3612. +
  3613. + //get ext_supported rates
  3614. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_);
  3615. + if (p != NULL)
  3616. + {
  3617. + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len);
  3618. + supportRateNum += ie_len;
  3619. +
  3620. + }
  3621. +
  3622. + network_type = rtw_check_network_type(supportRate, supportRateNum, channel);
  3623. +
  3624. + rtw_set_supported_rate(pbss_network->SupportedRates, network_type);
  3625. +
  3626. +
  3627. + //parsing ERP_IE
  3628. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3629. + if(p && ie_len>0)
  3630. + {
  3631. + ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p);
  3632. + }
  3633. +
  3634. + //update privacy/security
  3635. + if (cap & BIT(4))
  3636. + pbss_network->Privacy = 1;
  3637. + else
  3638. + pbss_network->Privacy = 0;
  3639. +
  3640. + psecuritypriv->wpa_psk = 0;
  3641. +
  3642. + //wpa2
  3643. + group_cipher = 0; pairwise_cipher = 0;
  3644. + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_;
  3645. + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_;
  3646. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3647. + if(p && ie_len>0)
  3648. + {
  3649. + if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  3650. + {
  3651. + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  3652. +
  3653. + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x
  3654. + psecuritypriv->wpa_psk |= BIT(1);
  3655. +
  3656. + psecuritypriv->wpa2_group_cipher = group_cipher;
  3657. + psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher;
  3658. +#if 0
  3659. + switch(group_cipher)
  3660. + {
  3661. + case WPA_CIPHER_NONE:
  3662. + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_;
  3663. + break;
  3664. + case WPA_CIPHER_WEP40:
  3665. + psecuritypriv->wpa2_group_cipher = _WEP40_;
  3666. + break;
  3667. + case WPA_CIPHER_TKIP:
  3668. + psecuritypriv->wpa2_group_cipher = _TKIP_;
  3669. + break;
  3670. + case WPA_CIPHER_CCMP:
  3671. + psecuritypriv->wpa2_group_cipher = _AES_;
  3672. + break;
  3673. + case WPA_CIPHER_WEP104:
  3674. + psecuritypriv->wpa2_group_cipher = _WEP104_;
  3675. + break;
  3676. + }
  3677. +
  3678. + switch(pairwise_cipher)
  3679. + {
  3680. + case WPA_CIPHER_NONE:
  3681. + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_;
  3682. + break;
  3683. + case WPA_CIPHER_WEP40:
  3684. + psecuritypriv->wpa2_pairwise_cipher = _WEP40_;
  3685. + break;
  3686. + case WPA_CIPHER_TKIP:
  3687. + psecuritypriv->wpa2_pairwise_cipher = _TKIP_;
  3688. + break;
  3689. + case WPA_CIPHER_CCMP:
  3690. + psecuritypriv->wpa2_pairwise_cipher = _AES_;
  3691. + break;
  3692. + case WPA_CIPHER_WEP104:
  3693. + psecuritypriv->wpa2_pairwise_cipher = _WEP104_;
  3694. + break;
  3695. + }
  3696. +#endif
  3697. + }
  3698. +
  3699. + }
  3700. +
  3701. + //wpa
  3702. + ie_len = 0;
  3703. + group_cipher = 0; pairwise_cipher = 0;
  3704. + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_;
  3705. + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_;
  3706. + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2))
  3707. + {
  3708. + p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));
  3709. + if ((p) && (_rtw_memcmp(p+2, OUI1, 4)))
  3710. + {
  3711. + if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  3712. + {
  3713. + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  3714. +
  3715. + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x
  3716. +
  3717. + psecuritypriv->wpa_psk |= BIT(0);
  3718. +
  3719. + psecuritypriv->wpa_group_cipher = group_cipher;
  3720. + psecuritypriv->wpa_pairwise_cipher = pairwise_cipher;
  3721. +
  3722. +#if 0
  3723. + switch(group_cipher)
  3724. + {
  3725. + case WPA_CIPHER_NONE:
  3726. + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_;
  3727. + break;
  3728. + case WPA_CIPHER_WEP40:
  3729. + psecuritypriv->wpa_group_cipher = _WEP40_;
  3730. + break;
  3731. + case WPA_CIPHER_TKIP:
  3732. + psecuritypriv->wpa_group_cipher = _TKIP_;
  3733. + break;
  3734. + case WPA_CIPHER_CCMP:
  3735. + psecuritypriv->wpa_group_cipher = _AES_;
  3736. + break;
  3737. + case WPA_CIPHER_WEP104:
  3738. + psecuritypriv->wpa_group_cipher = _WEP104_;
  3739. + break;
  3740. + }
  3741. +
  3742. + switch(pairwise_cipher)
  3743. + {
  3744. + case WPA_CIPHER_NONE:
  3745. + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_;
  3746. + break;
  3747. + case WPA_CIPHER_WEP40:
  3748. + psecuritypriv->wpa_pairwise_cipher = _WEP40_;
  3749. + break;
  3750. + case WPA_CIPHER_TKIP:
  3751. + psecuritypriv->wpa_pairwise_cipher = _TKIP_;
  3752. + break;
  3753. + case WPA_CIPHER_CCMP:
  3754. + psecuritypriv->wpa_pairwise_cipher = _AES_;
  3755. + break;
  3756. + case WPA_CIPHER_WEP104:
  3757. + psecuritypriv->wpa_pairwise_cipher = _WEP104_;
  3758. + break;
  3759. + }
  3760. +#endif
  3761. + }
  3762. +
  3763. + break;
  3764. +
  3765. + }
  3766. +
  3767. + if ((p == NULL) || (ie_len == 0))
  3768. + {
  3769. + break;
  3770. + }
  3771. +
  3772. + }
  3773. +
  3774. + //wmm
  3775. + ie_len = 0;
  3776. + pmlmepriv->qospriv.qos_option = 0;
  3777. + if(pregistrypriv->wmm_enable)
  3778. + {
  3779. + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2))
  3780. + {
  3781. + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));
  3782. + if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6))
  3783. + {
  3784. + pmlmepriv->qospriv.qos_option = 1;
  3785. +
  3786. + *(p+8) |= BIT(7);//QoS Info, support U-APSD
  3787. +
  3788. + /* disable all ACM bits since the WMM admission control is not supported */
  3789. + *(p + 10) &= ~BIT(4); /* BE */
  3790. + *(p + 14) &= ~BIT(4); /* BK */
  3791. + *(p + 18) &= ~BIT(4); /* VI */
  3792. + *(p + 22) &= ~BIT(4); /* VO */
  3793. +
  3794. + break;
  3795. + }
  3796. +
  3797. + if ((p == NULL) || (ie_len == 0))
  3798. + {
  3799. + break;
  3800. + }
  3801. + }
  3802. + }
  3803. +
  3804. + //parsing HT_CAP_IE
  3805. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3806. + if(p && ie_len>0)
  3807. + {
  3808. + u8 rf_type;
  3809. +
  3810. + struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2);
  3811. +
  3812. + pHT_caps_ie=p;
  3813. +
  3814. +
  3815. + ht_cap = _TRUE;
  3816. + network_type |= WIRELESS_11_24N;
  3817. +
  3818. +
  3819. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  3820. +
  3821. + if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) ||
  3822. + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP))
  3823. + {
  3824. + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
  3825. + }
  3826. + else
  3827. + {
  3828. + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
  3829. + }
  3830. +
  3831. + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set Max Rx AMPDU size to 64K
  3832. +
  3833. + if(rf_type == RF_1T1R)
  3834. + {
  3835. + pht_cap->supp_mcs_set[0] = 0xff;
  3836. + pht_cap->supp_mcs_set[1] = 0x0;
  3837. + }
  3838. +
  3839. + _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len);
  3840. +
  3841. + }
  3842. +
  3843. + //parsing HT_INFO_IE
  3844. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));
  3845. + if(p && ie_len>0)
  3846. + {
  3847. + pHT_info_ie=p;
  3848. + }
  3849. +
  3850. + switch(network_type)
  3851. + {
  3852. + case WIRELESS_11B:
  3853. + pbss_network->NetworkTypeInUse = Ndis802_11DS;
  3854. + break;
  3855. + case WIRELESS_11G:
  3856. + case WIRELESS_11BG:
  3857. + case WIRELESS_11G_24N:
  3858. + case WIRELESS_11BG_24N:
  3859. + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24;
  3860. + break;
  3861. + case WIRELESS_11A:
  3862. + pbss_network->NetworkTypeInUse = Ndis802_11OFDM5;
  3863. + break;
  3864. + default :
  3865. + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24;
  3866. + break;
  3867. + }
  3868. +
  3869. + pmlmepriv->cur_network.network_type = network_type;
  3870. +
  3871. +
  3872. + pmlmepriv->htpriv.ht_option = _FALSE;
  3873. +#ifdef CONFIG_80211N_HT
  3874. + if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) ||
  3875. + (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP))
  3876. + {
  3877. + //todo:
  3878. + //ht_cap = _FALSE;
  3879. + }
  3880. +
  3881. + //ht_cap
  3882. + if(pregistrypriv->ht_enable && ht_cap==_TRUE)
  3883. + {
  3884. + pmlmepriv->htpriv.ht_option = _TRUE;
  3885. + pmlmepriv->qospriv.qos_option = 1;
  3886. +
  3887. + if(pregistrypriv->ampdu_enable==1)
  3888. + {
  3889. + pmlmepriv->htpriv.ampdu_enable = _TRUE;
  3890. + }
  3891. +
  3892. + HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie);
  3893. +
  3894. + HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie);
  3895. + }
  3896. +#endif
  3897. +
  3898. +
  3899. + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network);
  3900. +
  3901. + //issue beacon to start bss network
  3902. + start_bss_network(padapter, (u8*)pbss_network);
  3903. +
  3904. +
  3905. + //alloc sta_info for ap itself
  3906. + psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress);
  3907. + if(!psta)
  3908. + {
  3909. + psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress);
  3910. + if (psta == NULL)
  3911. + {
  3912. + return _FAIL;
  3913. + }
  3914. + }
  3915. + psta->state |= WIFI_AP_STATE; //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724
  3916. + rtw_indicate_connect( padapter);
  3917. +
  3918. + pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon
  3919. +
  3920. + //update bc/mc sta_info
  3921. + //update_bmc_sta(padapter);
  3922. +
  3923. + return ret;
  3924. +
  3925. +}
  3926. +
  3927. +void rtw_set_macaddr_acl(_adapter *padapter, int mode)
  3928. +{
  3929. + struct sta_priv *pstapriv = &padapter->stapriv;
  3930. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  3931. +
  3932. + DBG_871X("%s, mode=%d\n", __func__, mode);
  3933. +
  3934. + pacl_list->mode = mode;
  3935. +}
  3936. +
  3937. +int rtw_acl_add_sta(_adapter *padapter, u8 *addr)
  3938. +{
  3939. + _irqL irqL;
  3940. + _list *plist, *phead;
  3941. + u8 added = _FALSE;
  3942. + int i, ret=0;
  3943. + struct rtw_wlan_acl_node *paclnode;
  3944. + struct sta_priv *pstapriv = &padapter->stapriv;
  3945. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  3946. + _queue *pacl_node_q =&pacl_list->acl_node_q;
  3947. +
  3948. + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr));
  3949. +
  3950. + if((NUM_ACL-1) < pacl_list->num)
  3951. + return (-1);
  3952. +
  3953. +
  3954. + _enter_critical_bh(&(pacl_node_q->lock), &irqL);
  3955. +
  3956. + phead = get_list_head(pacl_node_q);
  3957. + plist = get_next(phead);
  3958. +
  3959. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  3960. + {
  3961. + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);
  3962. + plist = get_next(plist);
  3963. +
  3964. + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN))
  3965. + {
  3966. + if(paclnode->valid == _TRUE)
  3967. + {
  3968. + added = _TRUE;
  3969. + DBG_871X("%s, sta has been added\n", __func__);
  3970. + break;
  3971. + }
  3972. + }
  3973. + }
  3974. +
  3975. + _exit_critical_bh(&(pacl_node_q->lock), &irqL);
  3976. +
  3977. +
  3978. + if(added == _TRUE)
  3979. + return ret;
  3980. +
  3981. +
  3982. + _enter_critical_bh(&(pacl_node_q->lock), &irqL);
  3983. +
  3984. + for(i=0; i< NUM_ACL; i++)
  3985. + {
  3986. + paclnode = &pacl_list->aclnode[i];
  3987. +
  3988. + if(paclnode->valid == _FALSE)
  3989. + {
  3990. + _rtw_init_listhead(&paclnode->list);
  3991. +
  3992. + _rtw_memcpy(paclnode->addr, addr, ETH_ALEN);
  3993. +
  3994. + paclnode->valid = _TRUE;
  3995. +
  3996. + rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q));
  3997. +
  3998. + pacl_list->num++;
  3999. +
  4000. + break;
  4001. + }
  4002. + }
  4003. +
  4004. + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num);
  4005. +
  4006. + _exit_critical_bh(&(pacl_node_q->lock), &irqL);
  4007. +
  4008. + return ret;
  4009. +}
  4010. +
  4011. +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr)
  4012. +{
  4013. + _irqL irqL;
  4014. + _list *plist, *phead;
  4015. + int i, ret=0;
  4016. + struct rtw_wlan_acl_node *paclnode;
  4017. + struct sta_priv *pstapriv = &padapter->stapriv;
  4018. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  4019. + _queue *pacl_node_q =&pacl_list->acl_node_q;
  4020. +
  4021. + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr));
  4022. +
  4023. + _enter_critical_bh(&(pacl_node_q->lock), &irqL);
  4024. +
  4025. + phead = get_list_head(pacl_node_q);
  4026. + plist = get_next(phead);
  4027. +
  4028. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  4029. + {
  4030. + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);
  4031. + plist = get_next(plist);
  4032. +
  4033. + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN))
  4034. + {
  4035. + if(paclnode->valid == _TRUE)
  4036. + {
  4037. + paclnode->valid = _FALSE;
  4038. +
  4039. + rtw_list_delete(&paclnode->list);
  4040. +
  4041. + pacl_list->num--;
  4042. + }
  4043. + }
  4044. + }
  4045. +
  4046. + _exit_critical_bh(&(pacl_node_q->lock), &irqL);
  4047. +
  4048. + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num);
  4049. +
  4050. + return ret;
  4051. +
  4052. +}
  4053. +
  4054. +#ifdef CONFIG_NATIVEAP_MLME
  4055. +
  4056. +static void update_bcn_fixed_ie(_adapter *padapter)
  4057. +{
  4058. + DBG_871X("%s\n", __FUNCTION__);
  4059. +
  4060. +}
  4061. +
  4062. +static void update_bcn_erpinfo_ie(_adapter *padapter)
  4063. +{
  4064. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4065. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  4066. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4067. + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);
  4068. + unsigned char *p, *ie = pnetwork->IEs;
  4069. + u32 len = 0;
  4070. +
  4071. + DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable);
  4072. +
  4073. + if(!pmlmeinfo->ERP_enable)
  4074. + return;
  4075. +
  4076. + //parsing ERP_IE
  4077. + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_));
  4078. + if(p && len>0)
  4079. + {
  4080. + PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p;
  4081. +
  4082. + if (pmlmepriv->num_sta_non_erp == 1)
  4083. + pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION;
  4084. + else
  4085. + pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION);
  4086. +
  4087. + if(pmlmepriv->num_sta_no_short_preamble > 0)
  4088. + pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE;
  4089. + else
  4090. + pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE);
  4091. +
  4092. + ERP_IE_handler(padapter, pIE);
  4093. + }
  4094. +
  4095. +}
  4096. +
  4097. +static void update_bcn_htcap_ie(_adapter *padapter)
  4098. +{
  4099. + DBG_871X("%s\n", __FUNCTION__);
  4100. +
  4101. +}
  4102. +
  4103. +static void update_bcn_htinfo_ie(_adapter *padapter)
  4104. +{
  4105. + DBG_871X("%s\n", __FUNCTION__);
  4106. +
  4107. +}
  4108. +
  4109. +static void update_bcn_rsn_ie(_adapter *padapter)
  4110. +{
  4111. + DBG_871X("%s\n", __FUNCTION__);
  4112. +
  4113. +}
  4114. +
  4115. +static void update_bcn_wpa_ie(_adapter *padapter)
  4116. +{
  4117. + DBG_871X("%s\n", __FUNCTION__);
  4118. +
  4119. +}
  4120. +
  4121. +static void update_bcn_wmm_ie(_adapter *padapter)
  4122. +{
  4123. + DBG_871X("%s\n", __FUNCTION__);
  4124. +
  4125. +}
  4126. +
  4127. +static void update_bcn_wps_ie(_adapter *padapter)
  4128. +{
  4129. + u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL;
  4130. + uint wps_ielen=0, wps_offset, remainder_ielen;
  4131. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4132. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  4133. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4134. + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);
  4135. + unsigned char *ie = pnetwork->IEs;
  4136. + u32 ielen = pnetwork->IELength;
  4137. +
  4138. +
  4139. + DBG_871X("%s\n", __FUNCTION__);
  4140. +
  4141. + pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen);
  4142. +
  4143. + if(pwps_ie==NULL || wps_ielen==0)
  4144. + return;
  4145. +
  4146. + wps_offset = (uint)(pwps_ie-ie);
  4147. +
  4148. + premainder_ie = pwps_ie + wps_ielen;
  4149. +
  4150. + remainder_ielen = ielen - wps_offset - wps_ielen;
  4151. +
  4152. + if(remainder_ielen>0)
  4153. + {
  4154. + pbackup_remainder_ie = rtw_malloc(remainder_ielen);
  4155. + if(pbackup_remainder_ie)
  4156. + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);
  4157. + }
  4158. +
  4159. +
  4160. + pwps_ie_src = pmlmepriv->wps_beacon_ie;
  4161. + if(pwps_ie_src == NULL)
  4162. + return;
  4163. +
  4164. +
  4165. + wps_ielen = (uint)pwps_ie_src[1];//to get ie data len
  4166. + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ)
  4167. + {
  4168. + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2);
  4169. + pwps_ie += (wps_ielen+2);
  4170. +
  4171. + if(pbackup_remainder_ie)
  4172. + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen);
  4173. +
  4174. + //update IELength
  4175. + pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen;
  4176. + }
  4177. +
  4178. + if(pbackup_remainder_ie)
  4179. + rtw_mfree(pbackup_remainder_ie, remainder_ielen);
  4180. +
  4181. +}
  4182. +
  4183. +static void update_bcn_p2p_ie(_adapter *padapter)
  4184. +{
  4185. +
  4186. +}
  4187. +
  4188. +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui)
  4189. +{
  4190. + DBG_871X("%s\n", __FUNCTION__);
  4191. +
  4192. + if(_rtw_memcmp(RTW_WPA_OUI, oui, 4))
  4193. + {
  4194. + update_bcn_wpa_ie(padapter);
  4195. + }
  4196. + else if(_rtw_memcmp(WMM_OUI, oui, 4))
  4197. + {
  4198. + update_bcn_wmm_ie(padapter);
  4199. + }
  4200. + else if(_rtw_memcmp(WPS_OUI, oui, 4))
  4201. + {
  4202. + update_bcn_wps_ie(padapter);
  4203. + }
  4204. + else if(_rtw_memcmp(P2P_OUI, oui, 4))
  4205. + {
  4206. + update_bcn_p2p_ie(padapter);
  4207. + }
  4208. + else
  4209. + {
  4210. + DBG_871X("unknown OUI type!\n");
  4211. + }
  4212. +
  4213. +
  4214. +}
  4215. +
  4216. +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)
  4217. +{
  4218. + _irqL irqL;
  4219. + struct mlme_priv *pmlmepriv;
  4220. + struct mlme_ext_priv *pmlmeext;
  4221. + //struct mlme_ext_info *pmlmeinfo;
  4222. +
  4223. + //DBG_871X("%s\n", __FUNCTION__);
  4224. +
  4225. + if(!padapter)
  4226. + return;
  4227. +
  4228. + pmlmepriv = &(padapter->mlmepriv);
  4229. + pmlmeext = &(padapter->mlmeextpriv);
  4230. + //pmlmeinfo = &(pmlmeext->mlmext_info);
  4231. +
  4232. + if(_FALSE == pmlmeext->bstart_bss)
  4233. + return;
  4234. +
  4235. + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
  4236. +
  4237. + switch(ie_id)
  4238. + {
  4239. + case 0xFF:
  4240. +
  4241. + update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability
  4242. +
  4243. + break;
  4244. +
  4245. + case _TIM_IE_:
  4246. +
  4247. + update_BCNTIM(padapter);
  4248. +
  4249. + break;
  4250. +
  4251. + case _ERPINFO_IE_:
  4252. +
  4253. + update_bcn_erpinfo_ie(padapter);
  4254. +
  4255. + break;
  4256. +
  4257. + case _HT_CAPABILITY_IE_:
  4258. +
  4259. + update_bcn_htcap_ie(padapter);
  4260. +
  4261. + break;
  4262. +
  4263. + case _RSN_IE_2_:
  4264. +
  4265. + update_bcn_rsn_ie(padapter);
  4266. +
  4267. + break;
  4268. +
  4269. + case _HT_ADD_INFO_IE_:
  4270. +
  4271. + update_bcn_htinfo_ie(padapter);
  4272. +
  4273. + break;
  4274. +
  4275. + case _VENDOR_SPECIFIC_IE_:
  4276. +
  4277. + update_bcn_vendor_spec_ie(padapter, oui);
  4278. +
  4279. + break;
  4280. +
  4281. + default:
  4282. + break;
  4283. + }
  4284. +
  4285. + pmlmepriv->update_bcn = _TRUE;
  4286. +
  4287. + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
  4288. +
  4289. +#ifndef CONFIG_INTERRUPT_BASED_TXBCN
  4290. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  4291. + if(tx)
  4292. + {
  4293. + //send_beacon(padapter);//send_beacon must execute on TSR level
  4294. + set_tx_beacon_cmd(padapter);
  4295. + }
  4296. +#else
  4297. + {
  4298. + //PCI will issue beacon when BCN interrupt occurs.
  4299. + }
  4300. +#endif
  4301. +#endif //!CONFIG_INTERRUPT_BASED_TXBCN
  4302. +
  4303. +}
  4304. +
  4305. +#ifdef CONFIG_80211N_HT
  4306. +
  4307. +/*
  4308. +op_mode
  4309. +Set to 0 (HT pure) under the followign conditions
  4310. + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or
  4311. + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS
  4312. +Set to 1 (HT non-member protection) if there may be non-HT STAs
  4313. + in both the primary and the secondary channel
  4314. +Set to 2 if only HT STAs are associated in BSS,
  4315. + however and at least one 20 MHz HT STA is associated
  4316. +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated
  4317. + (currently non-GF HT station is considered as non-HT STA also)
  4318. +*/
  4319. +static int rtw_ht_operation_update(_adapter *padapter)
  4320. +{
  4321. + u16 cur_op_mode, new_op_mode;
  4322. + int op_mode_changes = 0;
  4323. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4324. + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv;
  4325. +
  4326. + if(pmlmepriv->htpriv.ht_option == _TRUE)
  4327. + return 0;
  4328. +
  4329. + //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed)
  4330. + // return 0;
  4331. +
  4332. + DBG_871X("%s current operation mode=0x%X\n",
  4333. + __FUNCTION__, pmlmepriv->ht_op_mode);
  4334. +
  4335. + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)
  4336. + && pmlmepriv->num_sta_ht_no_gf) {
  4337. + pmlmepriv->ht_op_mode |=
  4338. + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;
  4339. + op_mode_changes++;
  4340. + } else if ((pmlmepriv->ht_op_mode &
  4341. + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) &&
  4342. + pmlmepriv->num_sta_ht_no_gf == 0) {
  4343. + pmlmepriv->ht_op_mode &=
  4344. + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;
  4345. + op_mode_changes++;
  4346. + }
  4347. +
  4348. + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&
  4349. + (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) {
  4350. + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;
  4351. + op_mode_changes++;
  4352. + } else if ((pmlmepriv->ht_op_mode &
  4353. + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&
  4354. + (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) {
  4355. + pmlmepriv->ht_op_mode &=
  4356. + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;
  4357. + op_mode_changes++;
  4358. + }
  4359. +
  4360. + /* Note: currently we switch to the MIXED op mode if HT non-greenfield
  4361. + * station is associated. Probably it's a theoretical case, since
  4362. + * it looks like all known HT STAs support greenfield.
  4363. + */
  4364. + new_op_mode = 0;
  4365. + if (pmlmepriv->num_sta_no_ht ||
  4366. + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT))
  4367. + new_op_mode = OP_MODE_MIXED;
  4368. + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH)
  4369. + && pmlmepriv->num_sta_ht_20mhz)
  4370. + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED;
  4371. + else if (pmlmepriv->olbc_ht)
  4372. + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS;
  4373. + else
  4374. + new_op_mode = OP_MODE_PURE;
  4375. +
  4376. + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK;
  4377. + if (cur_op_mode != new_op_mode) {
  4378. + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK;
  4379. + pmlmepriv->ht_op_mode |= new_op_mode;
  4380. + op_mode_changes++;
  4381. + }
  4382. +
  4383. + DBG_871X("%s new operation mode=0x%X changes=%d\n",
  4384. + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes);
  4385. +
  4386. + return op_mode_changes;
  4387. +
  4388. +}
  4389. +
  4390. +#endif /* CONFIG_80211N_HT */
  4391. +
  4392. +void associated_clients_update(_adapter *padapter, u8 updated)
  4393. +{
  4394. + //update associcated stations cap.
  4395. + if(updated == _TRUE)
  4396. + {
  4397. + _irqL irqL;
  4398. + _list *phead, *plist;
  4399. + struct sta_info *psta=NULL;
  4400. + struct sta_priv *pstapriv = &padapter->stapriv;
  4401. +
  4402. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4403. +
  4404. + phead = &pstapriv->asoc_list;
  4405. + plist = get_next(phead);
  4406. +
  4407. + //check asoc_queue
  4408. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  4409. + {
  4410. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  4411. +
  4412. + plist = get_next(plist);
  4413. +
  4414. + VCS_update(padapter, psta);
  4415. + }
  4416. +
  4417. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4418. +
  4419. + }
  4420. +
  4421. +}
  4422. +
  4423. +/* called > TSR LEVEL for USB or SDIO Interface*/
  4424. +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta)
  4425. +{
  4426. + u8 beacon_updated = _FALSE;
  4427. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4428. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  4429. +
  4430. +
  4431. +#if 0
  4432. + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) &&
  4433. + !psta->no_short_preamble_set) {
  4434. + psta->no_short_preamble_set = 1;
  4435. + pmlmepriv->num_sta_no_short_preamble++;
  4436. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4437. + (pmlmepriv->num_sta_no_short_preamble == 1))
  4438. + ieee802_11_set_beacons(hapd->iface);
  4439. + }
  4440. +#endif
  4441. +
  4442. +
  4443. + if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE))
  4444. + {
  4445. + if(!psta->no_short_preamble_set)
  4446. + {
  4447. + psta->no_short_preamble_set = 1;
  4448. +
  4449. + pmlmepriv->num_sta_no_short_preamble++;
  4450. +
  4451. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4452. + (pmlmepriv->num_sta_no_short_preamble == 1))
  4453. + {
  4454. + beacon_updated = _TRUE;
  4455. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4456. + }
  4457. +
  4458. + }
  4459. + }
  4460. + else
  4461. + {
  4462. + if(psta->no_short_preamble_set)
  4463. + {
  4464. + psta->no_short_preamble_set = 0;
  4465. +
  4466. + pmlmepriv->num_sta_no_short_preamble--;
  4467. +
  4468. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4469. + (pmlmepriv->num_sta_no_short_preamble == 0))
  4470. + {
  4471. + beacon_updated = _TRUE;
  4472. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4473. + }
  4474. +
  4475. + }
  4476. + }
  4477. +
  4478. +#if 0
  4479. + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) {
  4480. + psta->nonerp_set = 1;
  4481. + pmlmepriv->num_sta_non_erp++;
  4482. + if (pmlmepriv->num_sta_non_erp == 1)
  4483. + ieee802_11_set_beacons(hapd->iface);
  4484. + }
  4485. +#endif
  4486. +
  4487. + if(psta->flags & WLAN_STA_NONERP)
  4488. + {
  4489. + if(!psta->nonerp_set)
  4490. + {
  4491. + psta->nonerp_set = 1;
  4492. +
  4493. + pmlmepriv->num_sta_non_erp++;
  4494. +
  4495. + if (pmlmepriv->num_sta_non_erp == 1)
  4496. + {
  4497. + beacon_updated = _TRUE;
  4498. + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);
  4499. + }
  4500. + }
  4501. +
  4502. + }
  4503. + else
  4504. + {
  4505. + if(psta->nonerp_set)
  4506. + {
  4507. + psta->nonerp_set = 0;
  4508. +
  4509. + pmlmepriv->num_sta_non_erp--;
  4510. +
  4511. + if (pmlmepriv->num_sta_non_erp == 0)
  4512. + {
  4513. + beacon_updated = _TRUE;
  4514. + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);
  4515. + }
  4516. + }
  4517. +
  4518. + }
  4519. +
  4520. +
  4521. +#if 0
  4522. + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) &&
  4523. + !psta->no_short_slot_time_set) {
  4524. + psta->no_short_slot_time_set = 1;
  4525. + pmlmepriv->num_sta_no_short_slot_time++;
  4526. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4527. + (pmlmepriv->num_sta_no_short_slot_time == 1))
  4528. + ieee802_11_set_beacons(hapd->iface);
  4529. + }
  4530. +#endif
  4531. +
  4532. + if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT))
  4533. + {
  4534. + if(!psta->no_short_slot_time_set)
  4535. + {
  4536. + psta->no_short_slot_time_set = 1;
  4537. +
  4538. + pmlmepriv->num_sta_no_short_slot_time++;
  4539. +
  4540. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4541. + (pmlmepriv->num_sta_no_short_slot_time == 1))
  4542. + {
  4543. + beacon_updated = _TRUE;
  4544. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4545. + }
  4546. +
  4547. + }
  4548. + }
  4549. + else
  4550. + {
  4551. + if(psta->no_short_slot_time_set)
  4552. + {
  4553. + psta->no_short_slot_time_set = 0;
  4554. +
  4555. + pmlmepriv->num_sta_no_short_slot_time--;
  4556. +
  4557. + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&
  4558. + (pmlmepriv->num_sta_no_short_slot_time == 0))
  4559. + {
  4560. + beacon_updated = _TRUE;
  4561. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4562. + }
  4563. + }
  4564. + }
  4565. +
  4566. +#ifdef CONFIG_80211N_HT
  4567. +
  4568. + if (psta->flags & WLAN_STA_HT)
  4569. + {
  4570. + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info);
  4571. +
  4572. + DBG_871X("HT: STA " MAC_FMT " HT Capabilities "
  4573. + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab);
  4574. +
  4575. + if (psta->no_ht_set) {
  4576. + psta->no_ht_set = 0;
  4577. + pmlmepriv->num_sta_no_ht--;
  4578. + }
  4579. +
  4580. + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) {
  4581. + if (!psta->no_ht_gf_set) {
  4582. + psta->no_ht_gf_set = 1;
  4583. + pmlmepriv->num_sta_ht_no_gf++;
  4584. + }
  4585. + DBG_871X("%s STA " MAC_FMT " - no "
  4586. + "greenfield, num of non-gf stations %d\n",
  4587. + __FUNCTION__, MAC_ARG(psta->hwaddr),
  4588. + pmlmepriv->num_sta_ht_no_gf);
  4589. + }
  4590. +
  4591. + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) {
  4592. + if (!psta->ht_20mhz_set) {
  4593. + psta->ht_20mhz_set = 1;
  4594. + pmlmepriv->num_sta_ht_20mhz++;
  4595. + }
  4596. + DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, "
  4597. + "num of 20MHz HT STAs %d\n",
  4598. + __FUNCTION__, MAC_ARG(psta->hwaddr),
  4599. + pmlmepriv->num_sta_ht_20mhz);
  4600. + }
  4601. +
  4602. + }
  4603. + else
  4604. + {
  4605. + if (!psta->no_ht_set) {
  4606. + psta->no_ht_set = 1;
  4607. + pmlmepriv->num_sta_no_ht++;
  4608. + }
  4609. + if(pmlmepriv->htpriv.ht_option == _TRUE) {
  4610. + DBG_871X("%s STA " MAC_FMT
  4611. + " - no HT, num of non-HT stations %d\n",
  4612. + __FUNCTION__, MAC_ARG(psta->hwaddr),
  4613. + pmlmepriv->num_sta_no_ht);
  4614. + }
  4615. + }
  4616. +
  4617. + if (rtw_ht_operation_update(padapter) > 0)
  4618. + {
  4619. + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE);
  4620. + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);
  4621. + }
  4622. +
  4623. +#endif /* CONFIG_80211N_HT */
  4624. +
  4625. + //update associcated stations cap.
  4626. + associated_clients_update(padapter, beacon_updated);
  4627. +
  4628. + DBG_871X("%s, updated=%d\n", __func__, beacon_updated);
  4629. +
  4630. +}
  4631. +
  4632. +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta)
  4633. +{
  4634. + u8 beacon_updated = _FALSE;
  4635. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4636. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  4637. +
  4638. + if(!psta)
  4639. + return beacon_updated;
  4640. +
  4641. + if (psta->no_short_preamble_set) {
  4642. + psta->no_short_preamble_set = 0;
  4643. + pmlmepriv->num_sta_no_short_preamble--;
  4644. + if (pmlmeext->cur_wireless_mode > WIRELESS_11B
  4645. + && pmlmepriv->num_sta_no_short_preamble == 0)
  4646. + {
  4647. + beacon_updated = _TRUE;
  4648. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4649. + }
  4650. + }
  4651. +
  4652. + if (psta->nonerp_set) {
  4653. + psta->nonerp_set = 0;
  4654. + pmlmepriv->num_sta_non_erp--;
  4655. + if (pmlmepriv->num_sta_non_erp == 0)
  4656. + {
  4657. + beacon_updated = _TRUE;
  4658. + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);
  4659. + }
  4660. + }
  4661. +
  4662. + if (psta->no_short_slot_time_set) {
  4663. + psta->no_short_slot_time_set = 0;
  4664. + pmlmepriv->num_sta_no_short_slot_time--;
  4665. + if (pmlmeext->cur_wireless_mode > WIRELESS_11B
  4666. + && pmlmepriv->num_sta_no_short_slot_time == 0)
  4667. + {
  4668. + beacon_updated = _TRUE;
  4669. + update_beacon(padapter, 0xFF, NULL, _TRUE);
  4670. + }
  4671. + }
  4672. +
  4673. +#ifdef CONFIG_80211N_HT
  4674. +
  4675. + if (psta->no_ht_gf_set) {
  4676. + psta->no_ht_gf_set = 0;
  4677. + pmlmepriv->num_sta_ht_no_gf--;
  4678. + }
  4679. +
  4680. + if (psta->no_ht_set) {
  4681. + psta->no_ht_set = 0;
  4682. + pmlmepriv->num_sta_no_ht--;
  4683. + }
  4684. +
  4685. + if (psta->ht_20mhz_set) {
  4686. + psta->ht_20mhz_set = 0;
  4687. + pmlmepriv->num_sta_ht_20mhz--;
  4688. + }
  4689. +
  4690. + if (rtw_ht_operation_update(padapter) > 0)
  4691. + {
  4692. + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE);
  4693. + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);
  4694. + }
  4695. +
  4696. +#endif /* CONFIG_80211N_HT */
  4697. +
  4698. + //update associcated stations cap.
  4699. + //associated_clients_update(padapter, beacon_updated); //move it to avoid deadlock
  4700. +
  4701. + DBG_871X("%s, updated=%d\n", __func__, beacon_updated);
  4702. +
  4703. + return beacon_updated;
  4704. +
  4705. +}
  4706. +
  4707. +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason)
  4708. +{
  4709. + _irqL irqL;
  4710. + u8 beacon_updated = _FALSE;
  4711. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4712. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  4713. + struct sta_priv *pstapriv = &padapter->stapriv;
  4714. +
  4715. + if(!psta)
  4716. + return beacon_updated;
  4717. +
  4718. + if (active == _TRUE)
  4719. + {
  4720. +#ifdef CONFIG_80211N_HT
  4721. + //tear down Rx AMPDU
  4722. + send_delba(padapter, 0, psta->hwaddr);// recipient
  4723. +
  4724. + //tear down TX AMPDU
  4725. + send_delba(padapter, 1, psta->hwaddr);// // originator
  4726. +
  4727. +#endif //CONFIG_80211N_HT
  4728. +
  4729. + issue_deauth(padapter, psta->hwaddr, reason);
  4730. + }
  4731. +
  4732. + psta->htpriv.agg_enable_bitmap = 0x0;//reset
  4733. + psta->htpriv.candidate_tid_bitmap = 0x0;//reset
  4734. +
  4735. +
  4736. + //report_del_sta_event(padapter, psta->hwaddr, reason);
  4737. +
  4738. + //clear cam entry / key
  4739. + //clear_cam_entry(padapter, (psta->mac_id + 3));
  4740. + rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)(psta->mac_id + 3), _TRUE);
  4741. +
  4742. +
  4743. + _enter_critical_bh(&psta->lock, &irqL);
  4744. + psta->state &= ~_FW_LINKED;
  4745. + _exit_critical_bh(&psta->lock, &irqL);
  4746. +
  4747. + #ifdef CONFIG_IOCTL_CFG80211
  4748. + if (1) {
  4749. + #ifdef COMPAT_KERNEL_RELEASE
  4750. + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason);
  4751. + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  4752. + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason);
  4753. + #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  4754. + /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */
  4755. + #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  4756. + } else
  4757. + #endif //CONFIG_IOCTL_CFG80211
  4758. + {
  4759. + rtw_indicate_sta_disassoc_event(padapter, psta);
  4760. + }
  4761. +
  4762. + report_del_sta_event(padapter, psta->hwaddr, reason);
  4763. +
  4764. + beacon_updated = bss_cap_update_on_sta_leave(padapter, psta);
  4765. +
  4766. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  4767. + rtw_free_stainfo(padapter, psta);
  4768. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  4769. +
  4770. +
  4771. + return beacon_updated;
  4772. +
  4773. +}
  4774. +
  4775. +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset)
  4776. +{
  4777. + _irqL irqL;
  4778. + _list *phead, *plist;
  4779. + int ret=0;
  4780. + struct sta_info *psta = NULL;
  4781. + struct sta_priv *pstapriv = &padapter->stapriv;
  4782. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4783. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4784. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  4785. +
  4786. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  4787. + return ret;
  4788. +
  4789. + DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n",
  4790. + FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset);
  4791. +
  4792. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4793. + phead = &pstapriv->asoc_list;
  4794. + plist = get_next(phead);
  4795. +
  4796. + /* for each sta in asoc_queue */
  4797. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  4798. + {
  4799. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  4800. + plist = get_next(plist);
  4801. +
  4802. + issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset);
  4803. + psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2);
  4804. + }
  4805. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4806. +
  4807. + issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset);
  4808. +
  4809. + return ret;
  4810. +}
  4811. +
  4812. +int rtw_sta_flush(_adapter *padapter)
  4813. +{
  4814. + _irqL irqL;
  4815. + _list *phead, *plist;
  4816. + int ret=0;
  4817. + struct sta_info *psta = NULL;
  4818. + struct sta_priv *pstapriv = &padapter->stapriv;
  4819. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4820. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4821. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  4822. + u8 chk_alive_num = 0;
  4823. + char chk_alive_list[NUM_STA];
  4824. + int i;
  4825. +
  4826. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev));
  4827. +
  4828. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  4829. + return ret;
  4830. +
  4831. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4832. + phead = &pstapriv->asoc_list;
  4833. + plist = get_next(phead);
  4834. +
  4835. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  4836. + int stainfo_offset;
  4837. +
  4838. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  4839. + plist = get_next(plist);
  4840. +
  4841. + /* Remove sta from asoc_list */
  4842. + rtw_list_delete(&psta->asoc_list);
  4843. + pstapriv->asoc_list_cnt--;
  4844. +
  4845. + /* Keep sta for ap_free_sta() beyond this asoc_list loop */
  4846. + stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
  4847. + if (stainfo_offset_valid(stainfo_offset)) {
  4848. + chk_alive_list[chk_alive_num++] = stainfo_offset;
  4849. + }
  4850. + }
  4851. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4852. +
  4853. +
  4854. + /* For each sta in chk_alive_list, call ap_free_sta */
  4855. + for (i = 0; i < chk_alive_num; i++) {
  4856. + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
  4857. + ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);
  4858. + }
  4859. +
  4860. + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING);
  4861. +
  4862. + associated_clients_update(padapter, _TRUE);
  4863. +
  4864. + return ret;
  4865. +
  4866. +}
  4867. +
  4868. +/* called > TSR LEVEL for USB or SDIO Interface*/
  4869. +void sta_info_update(_adapter *padapter, struct sta_info *psta)
  4870. +{
  4871. + int flags = psta->flags;
  4872. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4873. +
  4874. +
  4875. + //update wmm cap.
  4876. + if(WLAN_STA_WME&flags)
  4877. + psta->qos_option = 1;
  4878. + else
  4879. + psta->qos_option = 0;
  4880. +
  4881. + if(pmlmepriv->qospriv.qos_option == 0)
  4882. + psta->qos_option = 0;
  4883. +
  4884. +
  4885. +#ifdef CONFIG_80211N_HT
  4886. + //update 802.11n ht cap.
  4887. + if(WLAN_STA_HT&flags)
  4888. + {
  4889. + psta->htpriv.ht_option = _TRUE;
  4890. + psta->qos_option = 1;
  4891. + }
  4892. + else
  4893. + {
  4894. + psta->htpriv.ht_option = _FALSE;
  4895. + }
  4896. +
  4897. + if(pmlmepriv->htpriv.ht_option == _FALSE)
  4898. + psta->htpriv.ht_option = _FALSE;
  4899. +#endif
  4900. +
  4901. +
  4902. + update_sta_info_apmode(padapter, psta);
  4903. +
  4904. +
  4905. +}
  4906. +
  4907. +/* called >= TSR LEVEL for USB or SDIO Interface*/
  4908. +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta)
  4909. +{
  4910. + if(psta->state & _FW_LINKED)
  4911. + {
  4912. + //add ratid
  4913. + add_RATid(padapter, psta);
  4914. + }
  4915. +}
  4916. +
  4917. +/* restore hw setting from sw data structures */
  4918. +void rtw_ap_restore_network(_adapter *padapter)
  4919. +{
  4920. + struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  4921. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4922. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4923. + struct sta_priv * pstapriv = &padapter->stapriv;
  4924. + struct sta_info *psta;
  4925. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  4926. + _irqL irqL;
  4927. + _list *phead, *plist;
  4928. + u8 chk_alive_num = 0;
  4929. + char chk_alive_list[NUM_STA];
  4930. + int i;
  4931. +
  4932. + rtw_setopmode_cmd(padapter, Ndis802_11APMode);
  4933. +
  4934. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  4935. +
  4936. + start_bss_network(padapter, (u8*)&mlmepriv->cur_network.network);
  4937. +
  4938. + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
  4939. + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))
  4940. + {
  4941. + /* restore group key, WEP keys is restored in ips_leave() */
  4942. + rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0);
  4943. + }
  4944. +
  4945. + /* per sta pairwise key and settings */
  4946. + if((padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_) &&
  4947. + (padapter->securitypriv.dot11PrivacyAlgrthm != _AES_)) {
  4948. + return;
  4949. + }
  4950. +
  4951. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4952. +
  4953. + phead = &pstapriv->asoc_list;
  4954. + plist = get_next(phead);
  4955. +
  4956. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  4957. + int stainfo_offset;
  4958. +
  4959. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  4960. + plist = get_next(plist);
  4961. +
  4962. + stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
  4963. + if (stainfo_offset_valid(stainfo_offset)) {
  4964. + chk_alive_list[chk_alive_num++] = stainfo_offset;
  4965. + }
  4966. + }
  4967. +
  4968. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4969. +
  4970. + for (i = 0; i < chk_alive_num; i++) {
  4971. + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
  4972. +
  4973. + if (psta == NULL) {
  4974. + DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter));
  4975. + } else if (psta->state &_FW_LINKED) {
  4976. + Update_RA_Entry(padapter, psta->mac_id);
  4977. + //pairwise key
  4978. + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE);
  4979. + }
  4980. + }
  4981. +
  4982. +}
  4983. +
  4984. +void start_ap_mode(_adapter *padapter)
  4985. +{
  4986. + int i;
  4987. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4988. + struct sta_priv *pstapriv = &padapter->stapriv;
  4989. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4990. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  4991. +
  4992. + pmlmepriv->update_bcn = _FALSE;
  4993. +
  4994. + //init_mlme_ap_info(padapter);
  4995. + pmlmeext->bstart_bss = _FALSE;
  4996. +
  4997. + pmlmepriv->num_sta_non_erp = 0;
  4998. +
  4999. + pmlmepriv->num_sta_no_short_slot_time = 0;
  5000. +
  5001. + pmlmepriv->num_sta_no_short_preamble = 0;
  5002. +
  5003. + pmlmepriv->num_sta_ht_no_gf = 0;
  5004. +
  5005. + pmlmepriv->num_sta_no_ht = 0;
  5006. +
  5007. + pmlmepriv->num_sta_ht_20mhz = 0;
  5008. +
  5009. + pmlmepriv->olbc = _FALSE;
  5010. +
  5011. + pmlmepriv->olbc_ht = _FALSE;
  5012. +
  5013. +#ifdef CONFIG_80211N_HT
  5014. + pmlmepriv->ht_op_mode = 0;
  5015. +#endif
  5016. +
  5017. + for(i=0; i<NUM_STA; i++)
  5018. + pstapriv->sta_aid[i] = NULL;
  5019. +
  5020. + pmlmepriv->wps_beacon_ie = NULL;
  5021. + pmlmepriv->wps_probe_resp_ie = NULL;
  5022. + pmlmepriv->wps_assoc_resp_ie = NULL;
  5023. +
  5024. + pmlmepriv->p2p_beacon_ie = NULL;
  5025. + pmlmepriv->p2p_probe_resp_ie = NULL;
  5026. +
  5027. +
  5028. + //for ACL
  5029. + _rtw_init_listhead(&(pacl_list->acl_node_q.queue));
  5030. + pacl_list->num = 0;
  5031. + pacl_list->mode = 0;
  5032. + for(i = 0; i < NUM_ACL; i++)
  5033. + {
  5034. + _rtw_init_listhead(&pacl_list->aclnode[i].list);
  5035. + pacl_list->aclnode[i].valid = _FALSE;
  5036. + }
  5037. +
  5038. +}
  5039. +
  5040. +void stop_ap_mode(_adapter *padapter)
  5041. +{
  5042. + _irqL irqL;
  5043. + _list *phead, *plist;
  5044. + struct rtw_wlan_acl_node *paclnode;
  5045. + struct sta_info *psta=NULL;
  5046. + struct sta_priv *pstapriv = &padapter->stapriv;
  5047. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  5048. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  5049. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  5050. + _queue *pacl_node_q =&pacl_list->acl_node_q;
  5051. +
  5052. + pmlmepriv->update_bcn = _FALSE;
  5053. + pmlmeext->bstart_bss = _FALSE;
  5054. + //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock);
  5055. +
  5056. + //reset and init security priv , this can refine with rtw_reset_securitypriv
  5057. + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv));
  5058. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;
  5059. + padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled;
  5060. +
  5061. + //for ACL
  5062. + _enter_critical_bh(&(pacl_node_q->lock), &irqL);
  5063. + phead = get_list_head(pacl_node_q);
  5064. + plist = get_next(phead);
  5065. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  5066. + {
  5067. + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);
  5068. + plist = get_next(plist);
  5069. +
  5070. + if(paclnode->valid == _TRUE)
  5071. + {
  5072. + paclnode->valid = _FALSE;
  5073. +
  5074. + rtw_list_delete(&paclnode->list);
  5075. +
  5076. + pacl_list->num--;
  5077. + }
  5078. + }
  5079. + _exit_critical_bh(&(pacl_node_q->lock), &irqL);
  5080. +
  5081. + DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num);
  5082. +
  5083. + rtw_sta_flush(padapter);
  5084. +
  5085. + //free_assoc_sta_resources
  5086. + rtw_free_all_stainfo(padapter);
  5087. +
  5088. + psta = rtw_get_bcmc_stainfo(padapter);
  5089. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  5090. + rtw_free_stainfo(padapter, psta);
  5091. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  5092. +
  5093. + rtw_init_bcmc_stainfo(padapter);
  5094. +
  5095. + rtw_free_mlme_priv_ie_data(pmlmepriv);
  5096. +
  5097. +}
  5098. +
  5099. +#endif //CONFIG_NATIVEAP_MLME
  5100. +#endif //CONFIG_AP_MODE
  5101. --- /dev/null
  5102. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c
  5103. @@ -0,0 +1,1699 @@
  5104. +/******************************************************************************
  5105. + *
  5106. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  5107. + *
  5108. + * This program is free software; you can redistribute it and/or modify it
  5109. + * under the terms of version 2 of the GNU General Public License as
  5110. + * published by the Free Software Foundation.
  5111. + *
  5112. + * This program is distributed in the hope that it will be useful, but WITHOUT
  5113. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  5114. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  5115. + * more details.
  5116. + *
  5117. + * You should have received a copy of the GNU General Public License along with
  5118. + * this program; if not, write to the Free Software Foundation, Inc.,
  5119. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  5120. + *
  5121. + *
  5122. + ******************************************************************************/
  5123. +#define _RTW_BR_EXT_C_
  5124. +
  5125. +#ifdef __KERNEL__
  5126. +#include <linux/if_arp.h>
  5127. +#include <net/ip.h>
  5128. +#include <net/ipx.h>
  5129. +#include <linux/atalk.h>
  5130. +#include <linux/udp.h>
  5131. +#include <linux/if_pppox.h>
  5132. +#endif
  5133. +
  5134. +#if 1 // rtw_wifi_driver
  5135. +#include <drv_conf.h>
  5136. +#include <drv_types.h>
  5137. +#include "rtw_br_ext.h"
  5138. +#else // rtw_wifi_driver
  5139. +#include "./8192cd_cfg.h"
  5140. +
  5141. +#ifndef __KERNEL__
  5142. +#include "./sys-support.h"
  5143. +#endif
  5144. +
  5145. +#include "./8192cd.h"
  5146. +#include "./8192cd_headers.h"
  5147. +#include "./8192cd_br_ext.h"
  5148. +#include "./8192cd_debug.h"
  5149. +#endif // rtw_wifi_driver
  5150. +
  5151. +#ifdef CL_IPV6_PASS
  5152. +#ifdef __KERNEL__
  5153. +#include <linux/ipv6.h>
  5154. +#include <linux/icmpv6.h>
  5155. +#include <net/ndisc.h>
  5156. +#include <net/checksum.h>
  5157. +#endif
  5158. +#endif
  5159. +
  5160. +#ifdef CONFIG_BR_EXT
  5161. +
  5162. +//#define BR_EXT_DEBUG
  5163. +
  5164. +#define NAT25_IPV4 01
  5165. +#define NAT25_IPV6 02
  5166. +#define NAT25_IPX 03
  5167. +#define NAT25_APPLE 04
  5168. +#define NAT25_PPPOE 05
  5169. +
  5170. +#define RTL_RELAY_TAG_LEN (ETH_ALEN)
  5171. +#define TAG_HDR_LEN 4
  5172. +
  5173. +#define MAGIC_CODE 0x8186
  5174. +#define MAGIC_CODE_LEN 2
  5175. +#define WAIT_TIME_PPPOE 5 // waiting time for pppoe server in sec
  5176. +
  5177. +/*-----------------------------------------------------------------
  5178. + How database records network address:
  5179. + 0 1 2 3 4 5 6 7 8 9 10
  5180. + |----|----|----|----|----|----|----|----|----|----|----|
  5181. + IPv4 |type| | IP addr |
  5182. + IPX |type| Net addr | Node addr |
  5183. + IPX |type| Net addr |Sckt addr|
  5184. + Apple |type| Network |node|
  5185. + PPPoE |type| SID | AC MAC |
  5186. +-----------------------------------------------------------------*/
  5187. +
  5188. +
  5189. +//Find a tag in pppoe frame and return the pointer
  5190. +static __inline__ unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned short type)
  5191. +{
  5192. + unsigned char *cur_ptr, *start_ptr;
  5193. + unsigned short tagLen, tagType;
  5194. +
  5195. + start_ptr = cur_ptr = (unsigned char *)ph->tag;
  5196. + while((cur_ptr - start_ptr) < ntohs(ph->length)) {
  5197. + // prevent un-alignment access
  5198. + tagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]);
  5199. + tagLen = (unsigned short)((cur_ptr[2] << 8) + cur_ptr[3]);
  5200. + if(tagType == type)
  5201. + return cur_ptr;
  5202. + cur_ptr = cur_ptr + TAG_HDR_LEN + tagLen;
  5203. + }
  5204. + return 0;
  5205. +}
  5206. +
  5207. +
  5208. +static __inline__ int __nat25_add_pppoe_tag(struct sk_buff *skb, struct pppoe_tag *tag)
  5209. +{
  5210. + struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN);
  5211. + int data_len;
  5212. +
  5213. + data_len = tag->tag_len + TAG_HDR_LEN;
  5214. + if (skb_tailroom(skb) < data_len) {
  5215. + _DEBUG_ERR("skb_tailroom() failed in add SID tag!\n");
  5216. + return -1;
  5217. + }
  5218. +
  5219. + skb_put(skb, data_len);
  5220. + // have a room for new tag
  5221. + memmove(((unsigned char *)ph->tag + data_len), (unsigned char *)ph->tag, ntohs(ph->length));
  5222. + ph->length = htons(ntohs(ph->length) + data_len);
  5223. + memcpy((unsigned char *)ph->tag, tag, data_len);
  5224. + return data_len;
  5225. +}
  5226. +
  5227. +static int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len)
  5228. +{
  5229. + int tail_len;
  5230. + unsigned long end, tail;
  5231. +
  5232. + if ((src+len) > skb_tail_pointer(skb) || skb->len < len)
  5233. + return -1;
  5234. +
  5235. + tail = (unsigned long)skb_tail_pointer(skb);
  5236. + end = (unsigned long)src+len;
  5237. + if (tail < end)
  5238. + return -1;
  5239. +
  5240. + tail_len = (int)(tail-end);
  5241. + if (tail_len > 0)
  5242. + memmove(src, src+len, tail_len);
  5243. +
  5244. + skb_trim(skb, skb->len-len);
  5245. + return 0;
  5246. +}
  5247. +
  5248. +static __inline__ unsigned long __nat25_timeout(_adapter *priv)
  5249. +{
  5250. + unsigned long timeout;
  5251. +
  5252. + timeout = jiffies - NAT25_AGEING_TIME*HZ;
  5253. +
  5254. + return timeout;
  5255. +}
  5256. +
  5257. +
  5258. +static __inline__ int __nat25_has_expired(_adapter *priv,
  5259. + struct nat25_network_db_entry *fdb)
  5260. +{
  5261. + if(time_before_eq(fdb->ageing_timer, __nat25_timeout(priv)))
  5262. + return 1;
  5263. +
  5264. + return 0;
  5265. +}
  5266. +
  5267. +
  5268. +static __inline__ void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr,
  5269. + unsigned int *ipAddr)
  5270. +{
  5271. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5272. +
  5273. + networkAddr[0] = NAT25_IPV4;
  5274. + memcpy(networkAddr+7, (unsigned char *)ipAddr, 4);
  5275. +}
  5276. +
  5277. +
  5278. +static __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr,
  5279. + unsigned int *ipxNetAddr, unsigned char *ipxNodeAddr)
  5280. +{
  5281. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5282. +
  5283. + networkAddr[0] = NAT25_IPX;
  5284. + memcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4);
  5285. + memcpy(networkAddr+5, ipxNodeAddr, 6);
  5286. +}
  5287. +
  5288. +
  5289. +static __inline__ void __nat25_generate_ipx_network_addr_with_socket(unsigned char *networkAddr,
  5290. + unsigned int *ipxNetAddr, unsigned short *ipxSocketAddr)
  5291. +{
  5292. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5293. +
  5294. + networkAddr[0] = NAT25_IPX;
  5295. + memcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4);
  5296. + memcpy(networkAddr+5, (unsigned char *)ipxSocketAddr, 2);
  5297. +}
  5298. +
  5299. +
  5300. +static __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr,
  5301. + unsigned short *network, unsigned char *node)
  5302. +{
  5303. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5304. +
  5305. + networkAddr[0] = NAT25_APPLE;
  5306. + memcpy(networkAddr+1, (unsigned char *)network, 2);
  5307. + networkAddr[3] = *node;
  5308. +}
  5309. +
  5310. +
  5311. +static __inline__ void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr,
  5312. + unsigned char *ac_mac, unsigned short *sid)
  5313. +{
  5314. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5315. +
  5316. + networkAddr[0] = NAT25_PPPOE;
  5317. + memcpy(networkAddr+1, (unsigned char *)sid, 2);
  5318. + memcpy(networkAddr+3, (unsigned char *)ac_mac, 6);
  5319. +}
  5320. +
  5321. +
  5322. +#ifdef CL_IPV6_PASS
  5323. +static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr,
  5324. + unsigned int *ipAddr)
  5325. +{
  5326. + memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
  5327. +
  5328. + networkAddr[0] = NAT25_IPV6;
  5329. + memcpy(networkAddr+1, (unsigned char *)ipAddr, 16);
  5330. +}
  5331. +
  5332. +
  5333. +static unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b)
  5334. +{
  5335. + while (len > 0) {
  5336. + if (*data == tag && *(data+1) == len8b && len >= len8b*8)
  5337. + return data+2;
  5338. +
  5339. + len -= (*(data+1))*8;
  5340. + data += (*(data+1))*8;
  5341. + }
  5342. + return NULL;
  5343. +}
  5344. +
  5345. +
  5346. +static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char *replace_mac)
  5347. +{
  5348. + struct icmp6hdr *icmphdr = (struct icmp6hdr *)data;
  5349. + unsigned char *mac;
  5350. +
  5351. + if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) {
  5352. + if (len >= 8) {
  5353. + mac = scan_tlv(&data[8], len-8, 1, 1);
  5354. + if (mac) {
  5355. + _DEBUG_INFO("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
  5356. + mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],
  5357. + replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
  5358. + memcpy(mac, replace_mac, 6);
  5359. + return 1;
  5360. + }
  5361. + }
  5362. + }
  5363. + else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) {
  5364. + if (len >= 16) {
  5365. + mac = scan_tlv(&data[16], len-16, 1, 1);
  5366. + if (mac) {
  5367. + _DEBUG_INFO("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
  5368. + mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],
  5369. + replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
  5370. + memcpy(mac, replace_mac, 6);
  5371. + return 1;
  5372. + }
  5373. + }
  5374. + }
  5375. + else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) {
  5376. + if (len >= 24) {
  5377. + mac = scan_tlv(&data[24], len-24, 1, 1);
  5378. + if (mac) {
  5379. + _DEBUG_INFO("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
  5380. + mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],
  5381. + replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
  5382. + memcpy(mac, replace_mac, 6);
  5383. + return 1;
  5384. + }
  5385. + }
  5386. + }
  5387. + else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) {
  5388. + if (len >= 24) {
  5389. + mac = scan_tlv(&data[24], len-24, 2, 1);
  5390. + if (mac) {
  5391. + _DEBUG_INFO("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
  5392. + mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],
  5393. + replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
  5394. + memcpy(mac, replace_mac, 6);
  5395. + return 1;
  5396. + }
  5397. + }
  5398. + }
  5399. + else if (icmphdr->icmp6_type == NDISC_REDIRECT) {
  5400. + if (len >= 40) {
  5401. + mac = scan_tlv(&data[40], len-40, 2, 1);
  5402. + if (mac) {
  5403. + _DEBUG_INFO("Redirect, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
  5404. + mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],
  5405. + replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
  5406. + memcpy(mac, replace_mac, 6);
  5407. + return 1;
  5408. + }
  5409. + }
  5410. + }
  5411. + return 0;
  5412. +}
  5413. +
  5414. +
  5415. +static void convert_ipv6_mac_to_mc(struct sk_buff *skb)
  5416. +{
  5417. + struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN);
  5418. + unsigned char *dst_mac = skb->data;
  5419. +
  5420. + //dst_mac[0] = 0xff;
  5421. + //dst_mac[1] = 0xff;
  5422. + /*modified by qinjunjie,ipv6 multicast address ix 0x33-33-xx-xx-xx-xx*/
  5423. + dst_mac[0] = 0x33;
  5424. + dst_mac[1] = 0x33;
  5425. + memcpy(&dst_mac[2], &iph->daddr.s6_addr32[3], 4);
  5426. + #if defined(__LINUX_2_6__)
  5427. + /*modified by qinjunjie,warning:should not remove next line*/
  5428. + skb->pkt_type = PACKET_MULTICAST;
  5429. + #endif
  5430. +}
  5431. +#endif /* CL_IPV6_PASS */
  5432. +
  5433. +
  5434. +static __inline__ int __nat25_network_hash(unsigned char *networkAddr)
  5435. +{
  5436. + if(networkAddr[0] == NAT25_IPV4)
  5437. + {
  5438. + unsigned long x;
  5439. +
  5440. + x = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10];
  5441. +
  5442. + return x & (NAT25_HASH_SIZE - 1);
  5443. + }
  5444. + else if(networkAddr[0] == NAT25_IPX)
  5445. + {
  5446. + unsigned long x;
  5447. +
  5448. + x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^
  5449. + networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10];
  5450. +
  5451. + return x & (NAT25_HASH_SIZE - 1);
  5452. + }
  5453. + else if(networkAddr[0] == NAT25_APPLE)
  5454. + {
  5455. + unsigned long x;
  5456. +
  5457. + x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3];
  5458. +
  5459. + return x & (NAT25_HASH_SIZE - 1);
  5460. + }
  5461. + else if(networkAddr[0] == NAT25_PPPOE)
  5462. + {
  5463. + unsigned long x;
  5464. +
  5465. + x = networkAddr[0] ^ networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8];
  5466. +
  5467. + return x & (NAT25_HASH_SIZE - 1);
  5468. + }
  5469. +#ifdef CL_IPV6_PASS
  5470. + else if(networkAddr[0] == NAT25_IPV6)
  5471. + {
  5472. + unsigned long x;
  5473. +
  5474. + x = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^
  5475. + networkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10] ^
  5476. + networkAddr[11] ^ networkAddr[12] ^ networkAddr[13] ^ networkAddr[14] ^ networkAddr[15] ^
  5477. + networkAddr[16];
  5478. +
  5479. + return x & (NAT25_HASH_SIZE - 1);
  5480. + }
  5481. +#endif
  5482. + else
  5483. + {
  5484. + unsigned long x = 0;
  5485. + int i;
  5486. +
  5487. + for (i=0; i<MAX_NETWORK_ADDR_LEN; i++)
  5488. + x ^= networkAddr[i];
  5489. +
  5490. + return x & (NAT25_HASH_SIZE - 1);
  5491. + }
  5492. +}
  5493. +
  5494. +
  5495. +static __inline__ void __network_hash_link(_adapter *priv,
  5496. + struct nat25_network_db_entry *ent, int hash)
  5497. +{
  5498. + // Caller must _enter_critical_bh already!
  5499. + //_irqL irqL;
  5500. + //_enter_critical_bh(&priv->br_ext_lock, &irqL);
  5501. +
  5502. + ent->next_hash = priv->nethash[hash];
  5503. + if(ent->next_hash != NULL)
  5504. + ent->next_hash->pprev_hash = &ent->next_hash;
  5505. + priv->nethash[hash] = ent;
  5506. + ent->pprev_hash = &priv->nethash[hash];
  5507. +
  5508. + //_exit_critical_bh(&priv->br_ext_lock, &irqL);
  5509. +}
  5510. +
  5511. +
  5512. +static __inline__ void __network_hash_unlink(struct nat25_network_db_entry *ent)
  5513. +{
  5514. + // Caller must _enter_critical_bh already!
  5515. + //_irqL irqL;
  5516. + //_enter_critical_bh(&priv->br_ext_lock, &irqL);
  5517. +
  5518. + *(ent->pprev_hash) = ent->next_hash;
  5519. + if(ent->next_hash != NULL)
  5520. + ent->next_hash->pprev_hash = ent->pprev_hash;
  5521. + ent->next_hash = NULL;
  5522. + ent->pprev_hash = NULL;
  5523. +
  5524. + //_exit_critical_bh(&priv->br_ext_lock, &irqL);
  5525. +}
  5526. +
  5527. +
  5528. +static int __nat25_db_network_lookup_and_replace(_adapter *priv,
  5529. + struct sk_buff *skb, unsigned char *networkAddr)
  5530. +{
  5531. + struct nat25_network_db_entry *db;
  5532. + _irqL irqL;
  5533. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  5534. +
  5535. + db = priv->nethash[__nat25_network_hash(networkAddr)];
  5536. + while (db != NULL)
  5537. + {
  5538. + if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN))
  5539. + {
  5540. + if(!__nat25_has_expired(priv, db))
  5541. + {
  5542. + // replace the destination mac address
  5543. + memcpy(skb->data, db->macAddr, ETH_ALEN);
  5544. + atomic_inc(&db->use_count);
  5545. +
  5546. +#ifdef CL_IPV6_PASS
  5547. + DEBUG_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
  5548. + "%02x%02x%02x%02x%02x%02x\n",
  5549. + db->macAddr[0],
  5550. + db->macAddr[1],
  5551. + db->macAddr[2],
  5552. + db->macAddr[3],
  5553. + db->macAddr[4],
  5554. + db->macAddr[5],
  5555. + db->networkAddr[0],
  5556. + db->networkAddr[1],
  5557. + db->networkAddr[2],
  5558. + db->networkAddr[3],
  5559. + db->networkAddr[4],
  5560. + db->networkAddr[5],
  5561. + db->networkAddr[6],
  5562. + db->networkAddr[7],
  5563. + db->networkAddr[8],
  5564. + db->networkAddr[9],
  5565. + db->networkAddr[10],
  5566. + db->networkAddr[11],
  5567. + db->networkAddr[12],
  5568. + db->networkAddr[13],
  5569. + db->networkAddr[14],
  5570. + db->networkAddr[15],
  5571. + db->networkAddr[16]);
  5572. +#else
  5573. + DEBUG_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
  5574. + db->macAddr[0],
  5575. + db->macAddr[1],
  5576. + db->macAddr[2],
  5577. + db->macAddr[3],
  5578. + db->macAddr[4],
  5579. + db->macAddr[5],
  5580. + db->networkAddr[0],
  5581. + db->networkAddr[1],
  5582. + db->networkAddr[2],
  5583. + db->networkAddr[3],
  5584. + db->networkAddr[4],
  5585. + db->networkAddr[5],
  5586. + db->networkAddr[6],
  5587. + db->networkAddr[7],
  5588. + db->networkAddr[8],
  5589. + db->networkAddr[9],
  5590. + db->networkAddr[10]);
  5591. +#endif
  5592. + }
  5593. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5594. + return 1;
  5595. + }
  5596. +
  5597. + db = db->next_hash;
  5598. + }
  5599. +
  5600. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5601. + return 0;
  5602. +}
  5603. +
  5604. +
  5605. +static void __nat25_db_network_insert(_adapter *priv,
  5606. + unsigned char *macAddr, unsigned char *networkAddr)
  5607. +{
  5608. + struct nat25_network_db_entry *db;
  5609. + int hash;
  5610. + _irqL irqL;
  5611. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  5612. +
  5613. + hash = __nat25_network_hash(networkAddr);
  5614. + db = priv->nethash[hash];
  5615. + while (db != NULL)
  5616. + {
  5617. + if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN))
  5618. + {
  5619. + memcpy(db->macAddr, macAddr, ETH_ALEN);
  5620. + db->ageing_timer = jiffies;
  5621. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5622. + return;
  5623. + }
  5624. +
  5625. + db = db->next_hash;
  5626. + }
  5627. +
  5628. + db = (struct nat25_network_db_entry *) rtw_malloc(sizeof(*db));
  5629. + if(db == NULL) {
  5630. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5631. + return;
  5632. + }
  5633. +
  5634. + memcpy(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN);
  5635. + memcpy(db->macAddr, macAddr, ETH_ALEN);
  5636. + atomic_set(&db->use_count, 1);
  5637. + db->ageing_timer = jiffies;
  5638. +
  5639. + __network_hash_link(priv, db, hash);
  5640. +
  5641. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5642. +}
  5643. +
  5644. +
  5645. +static void __nat25_db_print(_adapter *priv)
  5646. +{
  5647. + _irqL irqL;
  5648. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  5649. +
  5650. +#ifdef BR_EXT_DEBUG
  5651. + static int counter = 0;
  5652. + int i, j;
  5653. + struct nat25_network_db_entry *db;
  5654. +
  5655. + counter++;
  5656. + if((counter % 16) != 0)
  5657. + return;
  5658. +
  5659. + for(i=0, j=0; i<NAT25_HASH_SIZE; i++)
  5660. + {
  5661. + db = priv->nethash[i];
  5662. +
  5663. + while (db != NULL)
  5664. + {
  5665. +#ifdef CL_IPV6_PASS
  5666. + panic_printk("NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
  5667. + "%02x%02x%02x%02x%02x%02x\n",
  5668. + j,
  5669. + i,
  5670. + atomic_read(&db->use_count),
  5671. + db->macAddr[0],
  5672. + db->macAddr[1],
  5673. + db->macAddr[2],
  5674. + db->macAddr[3],
  5675. + db->macAddr[4],
  5676. + db->macAddr[5],
  5677. + db->networkAddr[0],
  5678. + db->networkAddr[1],
  5679. + db->networkAddr[2],
  5680. + db->networkAddr[3],
  5681. + db->networkAddr[4],
  5682. + db->networkAddr[5],
  5683. + db->networkAddr[6],
  5684. + db->networkAddr[7],
  5685. + db->networkAddr[8],
  5686. + db->networkAddr[9],
  5687. + db->networkAddr[10],
  5688. + db->networkAddr[11],
  5689. + db->networkAddr[12],
  5690. + db->networkAddr[13],
  5691. + db->networkAddr[14],
  5692. + db->networkAddr[15],
  5693. + db->networkAddr[16]);
  5694. +#else
  5695. + panic_printk("NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
  5696. + j,
  5697. + i,
  5698. + atomic_read(&db->use_count),
  5699. + db->macAddr[0],
  5700. + db->macAddr[1],
  5701. + db->macAddr[2],
  5702. + db->macAddr[3],
  5703. + db->macAddr[4],
  5704. + db->macAddr[5],
  5705. + db->networkAddr[0],
  5706. + db->networkAddr[1],
  5707. + db->networkAddr[2],
  5708. + db->networkAddr[3],
  5709. + db->networkAddr[4],
  5710. + db->networkAddr[5],
  5711. + db->networkAddr[6],
  5712. + db->networkAddr[7],
  5713. + db->networkAddr[8],
  5714. + db->networkAddr[9],
  5715. + db->networkAddr[10]);
  5716. +#endif
  5717. + j++;
  5718. +
  5719. + db = db->next_hash;
  5720. + }
  5721. + }
  5722. +#endif
  5723. +
  5724. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5725. +}
  5726. +
  5727. +
  5728. +
  5729. +
  5730. +/*
  5731. + * NAT2.5 interface
  5732. + */
  5733. +
  5734. +void nat25_db_cleanup(_adapter *priv)
  5735. +{
  5736. + int i;
  5737. + _irqL irqL;
  5738. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  5739. +
  5740. + for(i=0; i<NAT25_HASH_SIZE; i++)
  5741. + {
  5742. + struct nat25_network_db_entry *f;
  5743. + f = priv->nethash[i];
  5744. + while (f != NULL) {
  5745. + struct nat25_network_db_entry *g;
  5746. +
  5747. + g = f->next_hash;
  5748. + if(priv->scdb_entry == f)
  5749. + {
  5750. + memset(priv->scdb_mac, 0, ETH_ALEN);
  5751. + memset(priv->scdb_ip, 0, 4);
  5752. + priv->scdb_entry = NULL;
  5753. + }
  5754. + __network_hash_unlink(f);
  5755. + rtw_mfree((u8 *) f, sizeof(struct nat25_network_db_entry));
  5756. +
  5757. + f = g;
  5758. + }
  5759. + }
  5760. +
  5761. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5762. +}
  5763. +
  5764. +
  5765. +void nat25_db_expire(_adapter *priv)
  5766. +{
  5767. + int i;
  5768. + _irqL irqL;
  5769. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  5770. +
  5771. + //if(!priv->ethBrExtInfo.nat25_disable)
  5772. + {
  5773. + for (i=0; i<NAT25_HASH_SIZE; i++)
  5774. + {
  5775. + struct nat25_network_db_entry *f;
  5776. + f = priv->nethash[i];
  5777. +
  5778. + while (f != NULL)
  5779. + {
  5780. + struct nat25_network_db_entry *g;
  5781. + g = f->next_hash;
  5782. +
  5783. + if(__nat25_has_expired(priv, f))
  5784. + {
  5785. + if(atomic_dec_and_test(&f->use_count))
  5786. + {
  5787. +#ifdef BR_EXT_DEBUG
  5788. +#ifdef CL_IPV6_PASS
  5789. + panic_printk("NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
  5790. + "%02x%02x%02x%02x%02x%02x\n",
  5791. + i,
  5792. + f->macAddr[0],
  5793. + f->macAddr[1],
  5794. + f->macAddr[2],
  5795. + f->macAddr[3],
  5796. + f->macAddr[4],
  5797. + f->macAddr[5],
  5798. + f->networkAddr[0],
  5799. + f->networkAddr[1],
  5800. + f->networkAddr[2],
  5801. + f->networkAddr[3],
  5802. + f->networkAddr[4],
  5803. + f->networkAddr[5],
  5804. + f->networkAddr[6],
  5805. + f->networkAddr[7],
  5806. + f->networkAddr[8],
  5807. + f->networkAddr[9],
  5808. + f->networkAddr[10],
  5809. + f->networkAddr[11],
  5810. + f->networkAddr[12],
  5811. + f->networkAddr[13],
  5812. + f->networkAddr[14],
  5813. + f->networkAddr[15],
  5814. + f->networkAddr[16]);
  5815. +#else
  5816. +
  5817. + panic_printk("NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
  5818. + i,
  5819. + f->macAddr[0],
  5820. + f->macAddr[1],
  5821. + f->macAddr[2],
  5822. + f->macAddr[3],
  5823. + f->macAddr[4],
  5824. + f->macAddr[5],
  5825. + f->networkAddr[0],
  5826. + f->networkAddr[1],
  5827. + f->networkAddr[2],
  5828. + f->networkAddr[3],
  5829. + f->networkAddr[4],
  5830. + f->networkAddr[5],
  5831. + f->networkAddr[6],
  5832. + f->networkAddr[7],
  5833. + f->networkAddr[8],
  5834. + f->networkAddr[9],
  5835. + f->networkAddr[10]);
  5836. +#endif
  5837. +#endif
  5838. + if(priv->scdb_entry == f)
  5839. + {
  5840. + memset(priv->scdb_mac, 0, ETH_ALEN);
  5841. + memset(priv->scdb_ip, 0, 4);
  5842. + priv->scdb_entry = NULL;
  5843. + }
  5844. + __network_hash_unlink(f);
  5845. + rtw_mfree((u8 *) f, sizeof(struct nat25_network_db_entry));
  5846. + }
  5847. + }
  5848. +
  5849. + f = g;
  5850. + }
  5851. + }
  5852. + }
  5853. +
  5854. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  5855. +}
  5856. +
  5857. +
  5858. +#ifdef SUPPORT_TX_MCAST2UNI
  5859. +static int checkIPMcAndReplace(_adapter *priv, struct sk_buff *skb, unsigned int *dst_ip)
  5860. +{
  5861. + struct stat_info *pstat;
  5862. + struct list_head *phead, *plist;
  5863. + int i;
  5864. +
  5865. + phead = &priv->asoc_list;
  5866. + plist = phead->next;
  5867. +
  5868. + while (plist != phead) {
  5869. + pstat = list_entry(plist, struct stat_info, asoc_list);
  5870. + plist = plist->next;
  5871. +
  5872. + if (pstat->ipmc_num == 0)
  5873. + continue;
  5874. +
  5875. + for (i=0; i<MAX_IP_MC_ENTRY; i++) {
  5876. + if (pstat->ipmc[i].used && !memcmp(&pstat->ipmc[i].mcmac[3], ((unsigned char *)dst_ip)+1, 3)) {
  5877. + memcpy(skb->data, pstat->ipmc[i].mcmac, ETH_ALEN);
  5878. + return 1;
  5879. + }
  5880. + }
  5881. + }
  5882. + return 0;
  5883. +}
  5884. +#endif
  5885. +
  5886. +int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
  5887. +{
  5888. + unsigned short protocol;
  5889. + unsigned char networkAddr[MAX_NETWORK_ADDR_LEN];
  5890. +
  5891. + if(skb == NULL)
  5892. + return -1;
  5893. +
  5894. + if((method <= NAT25_MIN) || (method >= NAT25_MAX))
  5895. + return -1;
  5896. +
  5897. + protocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN));
  5898. +
  5899. + /*---------------------------------------------------*/
  5900. + /* Handle IP frame */
  5901. + /*---------------------------------------------------*/
  5902. + if(protocol == __constant_htons(ETH_P_IP))
  5903. + {
  5904. + struct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN);
  5905. +
  5906. + if(((unsigned char*)(iph) + (iph->ihl<<2)) >= (skb->data + ETH_HLEN + skb->len))
  5907. + {
  5908. + DEBUG_WARN("NAT25: malformed IP packet !\n");
  5909. + return -1;
  5910. + }
  5911. +
  5912. + switch(method)
  5913. + {
  5914. + case NAT25_CHECK:
  5915. + return -1;
  5916. +
  5917. + case NAT25_INSERT:
  5918. + {
  5919. + //some muticast with source IP is all zero, maybe other case is illegal
  5920. + //in class A, B, C, host address is all zero or all one is illegal
  5921. + if (iph->saddr == 0)
  5922. + return 0;
  5923. + DEBUG_INFO("NAT25: Insert IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
  5924. + __nat25_generate_ipv4_network_addr(networkAddr, &iph->saddr);
  5925. + //record source IP address and , source mac address into db
  5926. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  5927. +
  5928. + __nat25_db_print(priv);
  5929. + }
  5930. + return 0;
  5931. +
  5932. + case NAT25_LOOKUP:
  5933. + {
  5934. + DEBUG_INFO("NAT25: Lookup IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
  5935. +#ifdef SUPPORT_TX_MCAST2UNI
  5936. + if (priv->pshare->rf_ft_var.mc2u_disable ||
  5937. + ((((OPMODE & (WIFI_STATION_STATE|WIFI_ASOC_STATE))
  5938. + == (WIFI_STATION_STATE|WIFI_ASOC_STATE)) &&
  5939. + !checkIPMcAndReplace(priv, skb, &iph->daddr)) ||
  5940. + (OPMODE & WIFI_ADHOC_STATE)))
  5941. +#endif
  5942. + {
  5943. + __nat25_generate_ipv4_network_addr(networkAddr, &iph->daddr);
  5944. +
  5945. + if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) {
  5946. + if (*((unsigned char *)&iph->daddr + 3) == 0xff) {
  5947. + // L2 is unicast but L3 is broadcast, make L2 bacome broadcast
  5948. + DEBUG_INFO("NAT25: Set DA as boardcast\n");
  5949. + memset(skb->data, 0xff, ETH_ALEN);
  5950. + }
  5951. + else {
  5952. + // forward unknow IP packet to upper TCP/IP
  5953. + DEBUG_INFO("NAT25: Replace DA with BR's MAC\n");
  5954. + if ( (*(u32 *)priv->br_mac) == 0 && (*(u16 *)(priv->br_mac+4)) == 0 ) {
  5955. + void netdev_br_init(struct net_device *netdev);
  5956. + printk("Re-init netdev_br_init() due to br_mac==0!\n");
  5957. + netdev_br_init(priv->pnetdev);
  5958. + }
  5959. + memcpy(skb->data, priv->br_mac, ETH_ALEN);
  5960. + }
  5961. + }
  5962. + }
  5963. + }
  5964. + return 0;
  5965. +
  5966. + default:
  5967. + return -1;
  5968. + }
  5969. + }
  5970. +
  5971. + /*---------------------------------------------------*/
  5972. + /* Handle ARP frame */
  5973. + /*---------------------------------------------------*/
  5974. + else if(protocol == __constant_htons(ETH_P_ARP))
  5975. + {
  5976. + struct arphdr *arp = (struct arphdr *)(skb->data + ETH_HLEN);
  5977. + unsigned char *arp_ptr = (unsigned char *)(arp + 1);
  5978. + unsigned int *sender, *target;
  5979. +
  5980. + if(arp->ar_pro != __constant_htons(ETH_P_IP))
  5981. + {
  5982. + DEBUG_WARN("NAT25: arp protocol unknown (%4x)!\n", htons(arp->ar_pro));
  5983. + return -1;
  5984. + }
  5985. +
  5986. + switch(method)
  5987. + {
  5988. + case NAT25_CHECK:
  5989. + return 0; // skb_copy for all ARP frame
  5990. +
  5991. + case NAT25_INSERT:
  5992. + {
  5993. + DEBUG_INFO("NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\n", arp_ptr[0],
  5994. + arp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]);
  5995. +
  5996. + // change to ARP sender mac address to wlan STA address
  5997. + memcpy(arp_ptr, GET_MY_HWADDR(priv), ETH_ALEN);
  5998. +
  5999. + arp_ptr += arp->ar_hln;
  6000. + sender = (unsigned int *)arp_ptr;
  6001. +
  6002. + __nat25_generate_ipv4_network_addr(networkAddr, sender);
  6003. +
  6004. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6005. +
  6006. + __nat25_db_print(priv);
  6007. + }
  6008. + return 0;
  6009. +
  6010. + case NAT25_LOOKUP:
  6011. + {
  6012. + DEBUG_INFO("NAT25: Lookup ARP\n");
  6013. +
  6014. + arp_ptr += arp->ar_hln;
  6015. + sender = (unsigned int *)arp_ptr;
  6016. + arp_ptr += (arp->ar_hln + arp->ar_pln);
  6017. + target = (unsigned int *)arp_ptr;
  6018. +
  6019. + __nat25_generate_ipv4_network_addr(networkAddr, target);
  6020. +
  6021. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6022. +
  6023. + // change to ARP target mac address to Lookup result
  6024. + arp_ptr = (unsigned char *)(arp + 1);
  6025. + arp_ptr += (arp->ar_hln + arp->ar_pln);
  6026. + memcpy(arp_ptr, skb->data, ETH_ALEN);
  6027. + }
  6028. + return 0;
  6029. +
  6030. + default:
  6031. + return -1;
  6032. + }
  6033. + }
  6034. +
  6035. + /*---------------------------------------------------*/
  6036. + /* Handle IPX and Apple Talk frame */
  6037. + /*---------------------------------------------------*/
  6038. + else if((protocol == __constant_htons(ETH_P_IPX)) ||
  6039. + (protocol <= __constant_htons(ETH_FRAME_LEN)))
  6040. + {
  6041. + unsigned char ipx_header[2] = {0xFF, 0xFF};
  6042. + struct ipxhdr *ipx = NULL;
  6043. + struct elapaarp *ea = NULL;
  6044. + struct ddpehdr *ddp = NULL;
  6045. + unsigned char *framePtr = skb->data + ETH_HLEN;
  6046. +
  6047. + if(protocol == __constant_htons(ETH_P_IPX))
  6048. + {
  6049. + DEBUG_INFO("NAT25: Protocol=IPX (Ethernet II)\n");
  6050. + ipx = (struct ipxhdr *)framePtr;
  6051. + }
  6052. + else if(protocol <= __constant_htons(ETH_FRAME_LEN))
  6053. + {
  6054. + if(!memcmp(ipx_header, framePtr, 2))
  6055. + {
  6056. + DEBUG_INFO("NAT25: Protocol=IPX (Ethernet 802.3)\n");
  6057. + ipx = (struct ipxhdr *)framePtr;
  6058. + }
  6059. + else
  6060. + {
  6061. + unsigned char ipx_8022_type = 0xE0;
  6062. + unsigned char snap_8022_type = 0xAA;
  6063. +
  6064. + if(*framePtr == snap_8022_type)
  6065. + {
  6066. + unsigned char ipx_snap_id[5] = {0x0, 0x0, 0x0, 0x81, 0x37}; // IPX SNAP ID
  6067. + unsigned char aarp_snap_id[5] = {0x00, 0x00, 0x00, 0x80, 0xF3}; // Apple Talk AARP SNAP ID
  6068. + unsigned char ddp_snap_id[5] = {0x08, 0x00, 0x07, 0x80, 0x9B}; // Apple Talk DDP SNAP ID
  6069. +
  6070. + framePtr += 3; // eliminate the 802.2 header
  6071. +
  6072. + if(!memcmp(ipx_snap_id, framePtr, 5))
  6073. + {
  6074. + framePtr += 5; // eliminate the SNAP header
  6075. +
  6076. + DEBUG_INFO("NAT25: Protocol=IPX (Ethernet SNAP)\n");
  6077. + ipx = (struct ipxhdr *)framePtr;
  6078. + }
  6079. + else if(!memcmp(aarp_snap_id, framePtr, 5))
  6080. + {
  6081. + framePtr += 5; // eliminate the SNAP header
  6082. +
  6083. + ea = (struct elapaarp *)framePtr;
  6084. + }
  6085. + else if(!memcmp(ddp_snap_id, framePtr, 5))
  6086. + {
  6087. + framePtr += 5; // eliminate the SNAP header
  6088. +
  6089. + ddp = (struct ddpehdr *)framePtr;
  6090. + }
  6091. + else
  6092. + {
  6093. + DEBUG_WARN("NAT25: Protocol=Ethernet SNAP %02x%02x%02x%02x%02x\n", framePtr[0],
  6094. + framePtr[1], framePtr[2], framePtr[3], framePtr[4]);
  6095. + return -1;
  6096. + }
  6097. + }
  6098. + else if(*framePtr == ipx_8022_type)
  6099. + {
  6100. + framePtr += 3; // eliminate the 802.2 header
  6101. +
  6102. + if(!memcmp(ipx_header, framePtr, 2))
  6103. + {
  6104. + DEBUG_INFO("NAT25: Protocol=IPX (Ethernet 802.2)\n");
  6105. + ipx = (struct ipxhdr *)framePtr;
  6106. + }
  6107. + else
  6108. + return -1;
  6109. + }
  6110. + else
  6111. + return -1;
  6112. + }
  6113. + }
  6114. + else
  6115. + return -1;
  6116. +
  6117. + /* IPX */
  6118. + if(ipx != NULL)
  6119. + {
  6120. + switch(method)
  6121. + {
  6122. + case NAT25_CHECK:
  6123. + if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))
  6124. + {
  6125. + DEBUG_INFO("NAT25: Check IPX skb_copy\n");
  6126. + return 0;
  6127. + }
  6128. + return -1;
  6129. +
  6130. + case NAT25_INSERT:
  6131. + {
  6132. + DEBUG_INFO("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n",
  6133. + ipx->ipx_dest.net,
  6134. + ipx->ipx_dest.node[0],
  6135. + ipx->ipx_dest.node[1],
  6136. + ipx->ipx_dest.node[2],
  6137. + ipx->ipx_dest.node[3],
  6138. + ipx->ipx_dest.node[4],
  6139. + ipx->ipx_dest.node[5],
  6140. + ipx->ipx_dest.sock,
  6141. + ipx->ipx_source.net,
  6142. + ipx->ipx_source.node[0],
  6143. + ipx->ipx_source.node[1],
  6144. + ipx->ipx_source.node[2],
  6145. + ipx->ipx_source.node[3],
  6146. + ipx->ipx_source.node[4],
  6147. + ipx->ipx_source.node[5],
  6148. + ipx->ipx_source.sock);
  6149. +
  6150. + if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))
  6151. + {
  6152. + DEBUG_INFO("NAT25: Use IPX Net, and Socket as network addr\n");
  6153. +
  6154. + __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock);
  6155. +
  6156. + // change IPX source node addr to wlan STA address
  6157. + memcpy(ipx->ipx_source.node, GET_MY_HWADDR(priv), ETH_ALEN);
  6158. + }
  6159. + else
  6160. + {
  6161. + __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_source.net, ipx->ipx_source.node);
  6162. + }
  6163. +
  6164. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6165. +
  6166. + __nat25_db_print(priv);
  6167. + }
  6168. + return 0;
  6169. +
  6170. + case NAT25_LOOKUP:
  6171. + {
  6172. + if(!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN))
  6173. + {
  6174. + DEBUG_INFO("NAT25: Lookup IPX, Modify Destination IPX Node addr\n");
  6175. +
  6176. + __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock);
  6177. +
  6178. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6179. +
  6180. + // replace IPX destination node addr with Lookup destination MAC addr
  6181. + memcpy(ipx->ipx_dest.node, skb->data, ETH_ALEN);
  6182. + }
  6183. + else
  6184. + {
  6185. + __nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_dest.net, ipx->ipx_dest.node);
  6186. +
  6187. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6188. + }
  6189. + }
  6190. + return 0;
  6191. +
  6192. + default:
  6193. + return -1;
  6194. + }
  6195. + }
  6196. +
  6197. + /* AARP */
  6198. + else if(ea != NULL)
  6199. + {
  6200. + /* Sanity check fields. */
  6201. + if(ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN)
  6202. + {
  6203. + DEBUG_WARN("NAT25: Appletalk AARP Sanity check fail!\n");
  6204. + return -1;
  6205. + }
  6206. +
  6207. + switch(method)
  6208. + {
  6209. + case NAT25_CHECK:
  6210. + return 0;
  6211. +
  6212. + case NAT25_INSERT:
  6213. + {
  6214. + // change to AARP source mac address to wlan STA address
  6215. + memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN);
  6216. +
  6217. + DEBUG_INFO("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n",
  6218. + ea->pa_src_net,
  6219. + ea->pa_src_node,
  6220. + ea->pa_dst_net,
  6221. + ea->pa_dst_node);
  6222. +
  6223. + __nat25_generate_apple_network_addr(networkAddr, &ea->pa_src_net, &ea->pa_src_node);
  6224. +
  6225. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6226. +
  6227. + __nat25_db_print(priv);
  6228. + }
  6229. + return 0;
  6230. +
  6231. + case NAT25_LOOKUP:
  6232. + {
  6233. + DEBUG_INFO("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n",
  6234. + ea->pa_src_net,
  6235. + ea->pa_src_node,
  6236. + ea->pa_dst_net,
  6237. + ea->pa_dst_node);
  6238. +
  6239. + __nat25_generate_apple_network_addr(networkAddr, &ea->pa_dst_net, &ea->pa_dst_node);
  6240. +
  6241. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6242. +
  6243. + // change to AARP destination mac address to Lookup result
  6244. + memcpy(ea->hw_dst, skb->data, ETH_ALEN);
  6245. + }
  6246. + return 0;
  6247. +
  6248. + default:
  6249. + return -1;
  6250. + }
  6251. + }
  6252. +
  6253. + /* DDP */
  6254. + else if(ddp != NULL)
  6255. + {
  6256. + switch(method)
  6257. + {
  6258. + case NAT25_CHECK:
  6259. + return -1;
  6260. +
  6261. + case NAT25_INSERT:
  6262. + {
  6263. + DEBUG_INFO("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n",
  6264. + ddp->deh_snet,
  6265. + ddp->deh_snode,
  6266. + ddp->deh_dnet,
  6267. + ddp->deh_dnode);
  6268. +
  6269. + __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_snet, &ddp->deh_snode);
  6270. +
  6271. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6272. +
  6273. + __nat25_db_print(priv);
  6274. + }
  6275. + return 0;
  6276. +
  6277. + case NAT25_LOOKUP:
  6278. + {
  6279. + DEBUG_INFO("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n",
  6280. + ddp->deh_snet,
  6281. + ddp->deh_snode,
  6282. + ddp->deh_dnet,
  6283. + ddp->deh_dnode);
  6284. +
  6285. + __nat25_generate_apple_network_addr(networkAddr, &ddp->deh_dnet, &ddp->deh_dnode);
  6286. +
  6287. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6288. + }
  6289. + return 0;
  6290. +
  6291. + default:
  6292. + return -1;
  6293. + }
  6294. + }
  6295. +
  6296. + return -1;
  6297. + }
  6298. +
  6299. + /*---------------------------------------------------*/
  6300. + /* Handle PPPoE frame */
  6301. + /*---------------------------------------------------*/
  6302. + else if((protocol == __constant_htons(ETH_P_PPP_DISC)) ||
  6303. + (protocol == __constant_htons(ETH_P_PPP_SES)))
  6304. + {
  6305. + struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN);
  6306. + unsigned short *pMagic;
  6307. +
  6308. + switch(method)
  6309. + {
  6310. + case NAT25_CHECK:
  6311. + if (ph->sid == 0)
  6312. + return 0;
  6313. + return 1;
  6314. +
  6315. + case NAT25_INSERT:
  6316. + if(ph->sid == 0) // Discovery phase according to tag
  6317. + {
  6318. + if(ph->code == PADI_CODE || ph->code == PADR_CODE)
  6319. + {
  6320. + if (priv->ethBrExtInfo.addPPPoETag) {
  6321. + struct pppoe_tag *tag, *pOldTag;
  6322. + unsigned char tag_buf[40];
  6323. + int old_tag_len=0;
  6324. +
  6325. + tag = (struct pppoe_tag *)tag_buf;
  6326. + pOldTag = (struct pppoe_tag *)__nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID));
  6327. + if (pOldTag) { // if SID existed, copy old value and delete it
  6328. + old_tag_len = ntohs(pOldTag->tag_len);
  6329. + if (old_tag_len+TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN > sizeof(tag_buf)) {
  6330. + DEBUG_ERR("SID tag length too long!\n");
  6331. + return -1;
  6332. + }
  6333. +
  6334. + memcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN,
  6335. + pOldTag->tag_data, old_tag_len);
  6336. +
  6337. + if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0) {
  6338. + DEBUG_ERR("call skb_pull_and_merge() failed in PADI/R packet!\n");
  6339. + return -1;
  6340. + }
  6341. + ph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len);
  6342. + }
  6343. +
  6344. + tag->tag_type = PTT_RELAY_SID;
  6345. + tag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len);
  6346. +
  6347. + // insert the magic_code+client mac in relay tag
  6348. + pMagic = (unsigned short *)tag->tag_data;
  6349. + *pMagic = htons(MAGIC_CODE);
  6350. + memcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN);
  6351. +
  6352. + //Add relay tag
  6353. + if(__nat25_add_pppoe_tag(skb, tag) < 0)
  6354. + return -1;
  6355. +
  6356. + DEBUG_INFO("NAT25: Insert PPPoE, forward %s packet\n",
  6357. + (ph->code == PADI_CODE ? "PADI" : "PADR"));
  6358. + }
  6359. + else { // not add relay tag
  6360. + if (priv->pppoe_connection_in_progress &&
  6361. + memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) {
  6362. + DEBUG_ERR("Discard PPPoE packet due to another PPPoE connection is in progress!\n");
  6363. + return -2;
  6364. + }
  6365. +
  6366. + if (priv->pppoe_connection_in_progress == 0)
  6367. + memcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN);
  6368. +
  6369. + priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE;
  6370. + }
  6371. + }
  6372. + else
  6373. + return -1;
  6374. + }
  6375. + else // session phase
  6376. + {
  6377. + DEBUG_INFO("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name);
  6378. +
  6379. + __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &(ph->sid));
  6380. +
  6381. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6382. +
  6383. + __nat25_db_print(priv);
  6384. +
  6385. + if (!priv->ethBrExtInfo.addPPPoETag &&
  6386. + priv->pppoe_connection_in_progress &&
  6387. + !memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN))
  6388. + priv->pppoe_connection_in_progress = 0;
  6389. + }
  6390. + return 0;
  6391. +
  6392. + case NAT25_LOOKUP:
  6393. + if(ph->code == PADO_CODE || ph->code == PADS_CODE)
  6394. + {
  6395. + if (priv->ethBrExtInfo.addPPPoETag) {
  6396. + struct pppoe_tag *tag;
  6397. + unsigned char *ptr;
  6398. + unsigned short tagType, tagLen;
  6399. + int offset=0;
  6400. +
  6401. + if((ptr = __nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID))) == 0) {
  6402. + DEBUG_ERR("Fail to find PTT_RELAY_SID in FADO!\n");
  6403. + return -1;
  6404. + }
  6405. +
  6406. + tag = (struct pppoe_tag *)ptr;
  6407. + tagType = (unsigned short)((ptr[0] << 8) + ptr[1]);
  6408. + tagLen = (unsigned short)((ptr[2] << 8) + ptr[3]);
  6409. +
  6410. + if((tagType != ntohs(PTT_RELAY_SID)) || (tagLen < (MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN))) {
  6411. + DEBUG_ERR("Invalid PTT_RELAY_SID tag length [%d]!\n", tagLen);
  6412. + return -1;
  6413. + }
  6414. +
  6415. + pMagic = (unsigned short *)tag->tag_data;
  6416. + if (ntohs(*pMagic) != MAGIC_CODE) {
  6417. + DEBUG_ERR("Can't find MAGIC_CODE in %s packet!\n",
  6418. + (ph->code == PADO_CODE ? "PADO" : "PADS"));
  6419. + return -1;
  6420. + }
  6421. +
  6422. + memcpy(skb->data, tag->tag_data+MAGIC_CODE_LEN, ETH_ALEN);
  6423. +
  6424. + if (tagLen > MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN)
  6425. + offset = TAG_HDR_LEN;
  6426. +
  6427. + if (skb_pull_and_merge(skb, ptr+offset, TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset) < 0) {
  6428. + DEBUG_ERR("call skb_pull_and_merge() failed in PADO packet!\n");
  6429. + return -1;
  6430. + }
  6431. + ph->length = htons(ntohs(ph->length)-(TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset));
  6432. + if (offset > 0)
  6433. + tag->tag_len = htons(tagLen-MAGIC_CODE_LEN-RTL_RELAY_TAG_LEN);
  6434. +
  6435. + DEBUG_INFO("NAT25: Lookup PPPoE, forward %s Packet from %s\n",
  6436. + (ph->code == PADO_CODE ? "PADO" : "PADS"), skb->dev->name);
  6437. + }
  6438. + else { // not add relay tag
  6439. + if (!priv->pppoe_connection_in_progress) {
  6440. + DEBUG_ERR("Discard PPPoE packet due to no connection in progresss!\n");
  6441. + return -1;
  6442. + }
  6443. + memcpy(skb->data, priv->pppoe_addr, ETH_ALEN);
  6444. + priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE;
  6445. + }
  6446. + }
  6447. + else {
  6448. + if(ph->sid != 0)
  6449. + {
  6450. + DEBUG_INFO("NAT25: Lookup PPPoE, lookup session packet from %s\n", skb->dev->name);
  6451. + __nat25_generate_pppoe_network_addr(networkAddr, skb->data+ETH_ALEN, &(ph->sid));
  6452. +
  6453. + __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
  6454. +
  6455. + __nat25_db_print(priv);
  6456. + }
  6457. + else
  6458. + return -1;
  6459. +
  6460. + }
  6461. + return 0;
  6462. +
  6463. + default:
  6464. + return -1;
  6465. + }
  6466. + }
  6467. +
  6468. + /*---------------------------------------------------*/
  6469. + /* Handle EAP frame */
  6470. + /*---------------------------------------------------*/
  6471. + else if(protocol == __constant_htons(0x888e))
  6472. + {
  6473. + switch(method)
  6474. + {
  6475. + case NAT25_CHECK:
  6476. + return -1;
  6477. +
  6478. + case NAT25_INSERT:
  6479. + return 0;
  6480. +
  6481. + case NAT25_LOOKUP:
  6482. + return 0;
  6483. +
  6484. + default:
  6485. + return -1;
  6486. + }
  6487. + }
  6488. +
  6489. + /*---------------------------------------------------*/
  6490. + /* Handle C-Media proprietary frame */
  6491. + /*---------------------------------------------------*/
  6492. + else if((protocol == __constant_htons(0xe2ae)) ||
  6493. + (protocol == __constant_htons(0xe2af)))
  6494. + {
  6495. + switch(method)
  6496. + {
  6497. + case NAT25_CHECK:
  6498. + return -1;
  6499. +
  6500. + case NAT25_INSERT:
  6501. + return 0;
  6502. +
  6503. + case NAT25_LOOKUP:
  6504. + return 0;
  6505. +
  6506. + default:
  6507. + return -1;
  6508. + }
  6509. + }
  6510. +
  6511. + /*---------------------------------------------------*/
  6512. + /* Handle IPV6 frame */
  6513. + /*---------------------------------------------------*/
  6514. +#ifdef CL_IPV6_PASS
  6515. + else if(protocol == __constant_htons(ETH_P_IPV6))
  6516. + {
  6517. + struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN);
  6518. +
  6519. + if (sizeof(*iph) >= (skb->len - ETH_HLEN))
  6520. + {
  6521. + DEBUG_WARN("NAT25: malformed IPv6 packet !\n");
  6522. + return -1;
  6523. + }
  6524. +
  6525. + switch(method)
  6526. + {
  6527. + case NAT25_CHECK:
  6528. + if (skb->data[0] & 1)
  6529. + return 0;
  6530. + return -1;
  6531. +
  6532. + case NAT25_INSERT:
  6533. + {
  6534. + DEBUG_INFO("NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
  6535. + " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n",
  6536. + iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],
  6537. + iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],
  6538. + iph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3],
  6539. + iph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]);
  6540. +
  6541. + if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) {
  6542. + __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr);
  6543. + __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
  6544. + __nat25_db_print(priv);
  6545. +
  6546. + if (iph->nexthdr == IPPROTO_ICMPV6 &&
  6547. + skb->len > (ETH_HLEN + sizeof(*iph) + 4)) {
  6548. + if (update_nd_link_layer_addr(skb->data + ETH_HLEN + sizeof(*iph),
  6549. + skb->len - ETH_HLEN - sizeof(*iph), GET_MY_HWADDR(priv))) {
  6550. + struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph));
  6551. + hdr->icmp6_cksum = 0;
  6552. + hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr,
  6553. + iph->payload_len,
  6554. + IPPROTO_ICMPV6,
  6555. + csum_partial((__u8 *)hdr, iph->payload_len, 0));
  6556. + }
  6557. + }
  6558. + }
  6559. + }
  6560. + return 0;
  6561. +
  6562. + case NAT25_LOOKUP:
  6563. + DEBUG_INFO("NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
  6564. + " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n",
  6565. + iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],
  6566. + iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],
  6567. + iph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3],
  6568. + iph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]);
  6569. +
  6570. +
  6571. + __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->daddr);
  6572. + if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) {
  6573. +#ifdef SUPPORT_RX_UNI2MCAST
  6574. + if (iph->daddr.s6_addr[0] == 0xff)
  6575. + convert_ipv6_mac_to_mc(skb);
  6576. +#endif
  6577. + }
  6578. + return 0;
  6579. +
  6580. + default:
  6581. + return -1;
  6582. + }
  6583. + }
  6584. +#endif // CL_IPV6_PASS
  6585. +
  6586. + return -1;
  6587. +}
  6588. +
  6589. +
  6590. +int nat25_handle_frame(_adapter *priv, struct sk_buff *skb)
  6591. +{
  6592. +#ifdef BR_EXT_DEBUG
  6593. + if((!priv->ethBrExtInfo.nat25_disable) && (!(skb->data[0] & 1)))
  6594. + {
  6595. + panic_printk("NAT25: Input Frame: DA=%02x%02x%02x%02x%02x%02x SA=%02x%02x%02x%02x%02x%02x\n",
  6596. + skb->data[0],
  6597. + skb->data[1],
  6598. + skb->data[2],
  6599. + skb->data[3],
  6600. + skb->data[4],
  6601. + skb->data[5],
  6602. + skb->data[6],
  6603. + skb->data[7],
  6604. + skb->data[8],
  6605. + skb->data[9],
  6606. + skb->data[10],
  6607. + skb->data[11]);
  6608. + }
  6609. +#endif
  6610. +
  6611. + if(!(skb->data[0] & 1))
  6612. + {
  6613. + int is_vlan_tag=0, i, retval=0;
  6614. + unsigned short vlan_hdr=0;
  6615. +
  6616. + if (*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_8021Q)) {
  6617. + is_vlan_tag = 1;
  6618. + vlan_hdr = *((unsigned short *)(skb->data+ETH_ALEN*2+2));
  6619. + for (i=0; i<6; i++)
  6620. + *((unsigned short *)(skb->data+ETH_ALEN*2+2-i*2)) = *((unsigned short *)(skb->data+ETH_ALEN*2-2-i*2));
  6621. + skb_pull(skb, 4);
  6622. + }
  6623. +
  6624. + if (!priv->ethBrExtInfo.nat25_disable)
  6625. + {
  6626. + _irqL irqL;
  6627. + _enter_critical_bh(&priv->br_ext_lock, &irqL);
  6628. + /*
  6629. + * This function look up the destination network address from
  6630. + * the NAT2.5 database. Return value = -1 means that the
  6631. + * corresponding network protocol is NOT support.
  6632. + */
  6633. + if (!priv->ethBrExtInfo.nat25sc_disable &&
  6634. + (*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) &&
  6635. + !memcmp(priv->scdb_ip, skb->data+ETH_HLEN+16, 4)) {
  6636. + memcpy(skb->data, priv->scdb_mac, ETH_ALEN);
  6637. +
  6638. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  6639. + }
  6640. + else {
  6641. + _exit_critical_bh(&priv->br_ext_lock, &irqL);
  6642. +
  6643. + retval = nat25_db_handle(priv, skb, NAT25_LOOKUP);
  6644. + }
  6645. + }
  6646. + else {
  6647. + if (((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) &&
  6648. + !memcmp(priv->br_ip, skb->data+ETH_HLEN+16, 4)) ||
  6649. + ((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_ARP)) &&
  6650. + !memcmp(priv->br_ip, skb->data+ETH_HLEN+24, 4))) {
  6651. + // for traffic to upper TCP/IP
  6652. + retval = nat25_db_handle(priv, skb, NAT25_LOOKUP);
  6653. + }
  6654. + }
  6655. +
  6656. + if (is_vlan_tag) {
  6657. + skb_push(skb, 4);
  6658. + for (i=0; i<6; i++)
  6659. + *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
  6660. + *((unsigned short *)(skb->data+ETH_ALEN*2)) = __constant_htons(ETH_P_8021Q);
  6661. + *((unsigned short *)(skb->data+ETH_ALEN*2+2)) = vlan_hdr;
  6662. + }
  6663. +
  6664. + if(retval == -1) {
  6665. + //DEBUG_ERR("NAT25: Lookup fail!\n");
  6666. + return -1;
  6667. + }
  6668. + }
  6669. +
  6670. + return 0;
  6671. +}
  6672. +
  6673. +#if 0
  6674. +void mac_clone(_adapter *priv, unsigned char *addr)
  6675. +{
  6676. + struct sockaddr sa;
  6677. +
  6678. + memcpy(sa.sa_data, addr, ETH_ALEN);
  6679. + DEBUG_INFO("MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\n",
  6680. + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
  6681. + rtl8192cd_set_hwaddr(priv->dev, &sa);
  6682. +}
  6683. +
  6684. +
  6685. +int mac_clone_handle_frame(_adapter *priv, struct sk_buff *skb)
  6686. +{
  6687. + if(priv->ethBrExtInfo.macclone_enable && !priv->macclone_completed)
  6688. + {
  6689. + if(!(skb->data[ETH_ALEN] & 1)) //// check any other particular MAC add
  6690. + {
  6691. + if(memcmp(skb->data+ETH_ALEN, GET_MY_HWADDR(priv), ETH_ALEN) &&
  6692. + ((priv->dev->br_port) &&
  6693. + memcmp(skb->data+ETH_ALEN, priv->br_mac, ETH_ALEN)))
  6694. + {
  6695. + mac_clone(priv, skb->data+ETH_ALEN);
  6696. + priv->macclone_completed = 1;
  6697. + }
  6698. + }
  6699. + }
  6700. +
  6701. + return 0;
  6702. +}
  6703. +#endif // 0
  6704. +
  6705. +#define SERVER_PORT 67
  6706. +#define CLIENT_PORT 68
  6707. +#define DHCP_MAGIC 0x63825363
  6708. +#define BROADCAST_FLAG 0x8000
  6709. +
  6710. +struct dhcpMessage {
  6711. + u_int8_t op;
  6712. + u_int8_t htype;
  6713. + u_int8_t hlen;
  6714. + u_int8_t hops;
  6715. + u_int32_t xid;
  6716. + u_int16_t secs;
  6717. + u_int16_t flags;
  6718. + u_int32_t ciaddr;
  6719. + u_int32_t yiaddr;
  6720. + u_int32_t siaddr;
  6721. + u_int32_t giaddr;
  6722. + u_int8_t chaddr[16];
  6723. + u_int8_t sname[64];
  6724. + u_int8_t file[128];
  6725. + u_int32_t cookie;
  6726. + u_int8_t options[308]; /* 312 - cookie */
  6727. +};
  6728. +
  6729. +void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb)
  6730. +{
  6731. + if(skb == NULL)
  6732. + return;
  6733. +
  6734. + if(!priv->ethBrExtInfo.dhcp_bcst_disable)
  6735. + {
  6736. + unsigned short protocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN));
  6737. +
  6738. + if(protocol == __constant_htons(ETH_P_IP)) // IP
  6739. + {
  6740. + struct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN);
  6741. +
  6742. + if(iph->protocol == IPPROTO_UDP) // UDP
  6743. + {
  6744. + struct udphdr *udph = (struct udphdr *)((SIZE_PTR)iph + (iph->ihl << 2));
  6745. +
  6746. + if((udph->source == __constant_htons(CLIENT_PORT))
  6747. + && (udph->dest == __constant_htons(SERVER_PORT))) // DHCP request
  6748. + {
  6749. + struct dhcpMessage *dhcph =
  6750. + (struct dhcpMessage *)((SIZE_PTR)udph + sizeof(struct udphdr));
  6751. +
  6752. + if(dhcph->cookie == __constant_htonl(DHCP_MAGIC)) // match magic word
  6753. + {
  6754. + if(!(dhcph->flags & htons(BROADCAST_FLAG))) // if not broadcast
  6755. + {
  6756. + register int sum = 0;
  6757. +
  6758. + DEBUG_INFO("DHCP: change flag of DHCP request to broadcast.\n");
  6759. + // or BROADCAST flag
  6760. + dhcph->flags |= htons(BROADCAST_FLAG);
  6761. + // recalculate checksum
  6762. + sum = ~(udph->check) & 0xffff;
  6763. + sum += dhcph->flags;
  6764. + while(sum >> 16)
  6765. + sum = (sum & 0xffff) + (sum >> 16);
  6766. + udph->check = ~sum;
  6767. + }
  6768. + }
  6769. + }
  6770. + }
  6771. + }
  6772. + }
  6773. +}
  6774. +
  6775. +
  6776. +void *scdb_findEntry(_adapter *priv, unsigned char *macAddr,
  6777. + unsigned char *ipAddr)
  6778. +{
  6779. + unsigned char networkAddr[MAX_NETWORK_ADDR_LEN];
  6780. + struct nat25_network_db_entry *db;
  6781. + int hash;
  6782. + //_irqL irqL;
  6783. + //_enter_critical_bh(&priv->br_ext_lock, &irqL);
  6784. +
  6785. + __nat25_generate_ipv4_network_addr(networkAddr, (unsigned int *)ipAddr);
  6786. + hash = __nat25_network_hash(networkAddr);
  6787. + db = priv->nethash[hash];
  6788. + while (db != NULL)
  6789. + {
  6790. + if(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) {
  6791. + //_exit_critical_bh(&priv->br_ext_lock, &irqL);
  6792. + return (void *)db;
  6793. + }
  6794. +
  6795. + db = db->next_hash;
  6796. + }
  6797. +
  6798. + //_exit_critical_bh(&priv->br_ext_lock, &irqL);
  6799. + return NULL;
  6800. +}
  6801. +
  6802. +#endif // CONFIG_BR_EXT
  6803. --- /dev/null
  6804. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_cmd.c
  6805. @@ -0,0 +1,3034 @@
  6806. +/******************************************************************************
  6807. + *
  6808. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  6809. + *
  6810. + * This program is free software; you can redistribute it and/or modify it
  6811. + * under the terms of version 2 of the GNU General Public License as
  6812. + * published by the Free Software Foundation.
  6813. + *
  6814. + * This program is distributed in the hope that it will be useful, but WITHOUT
  6815. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  6816. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  6817. + * more details.
  6818. + *
  6819. + * You should have received a copy of the GNU General Public License along with
  6820. + * this program; if not, write to the Free Software Foundation, Inc.,
  6821. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  6822. + *
  6823. + *
  6824. + ******************************************************************************/
  6825. +#define _RTW_CMD_C_
  6826. +
  6827. +#include <drv_conf.h>
  6828. +#include <osdep_service.h>
  6829. +#include <drv_types.h>
  6830. +#include <recv_osdep.h>
  6831. +#include <cmd_osdep.h>
  6832. +#include <mlme_osdep.h>
  6833. +#include <rtw_byteorder.h>
  6834. +#ifdef CONFIG_BR_EXT
  6835. +#include <rtw_br_ext.h>
  6836. +#endif //CONFIG_BR_EXT
  6837. +/*
  6838. +Caller and the rtw_cmd_thread can protect cmd_q by spin_lock.
  6839. +No irqsave is necessary.
  6840. +*/
  6841. +
  6842. +sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv)
  6843. +{
  6844. + sint res=_SUCCESS;
  6845. +
  6846. +_func_enter_;
  6847. +
  6848. + _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0);
  6849. + //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0);
  6850. + _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0);
  6851. +
  6852. +
  6853. + _rtw_init_queue(&(pcmdpriv->cmd_queue));
  6854. +
  6855. + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf
  6856. +
  6857. + pcmdpriv->cmd_seq = 1;
  6858. +
  6859. + pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
  6860. +
  6861. + if (pcmdpriv->cmd_allocated_buf == NULL){
  6862. + res= _FAIL;
  6863. + goto exit;
  6864. + }
  6865. +
  6866. + pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1));
  6867. +
  6868. + pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4);
  6869. +
  6870. + if (pcmdpriv->rsp_allocated_buf == NULL){
  6871. + res= _FAIL;
  6872. + goto exit;
  6873. + }
  6874. +
  6875. + pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3);
  6876. +
  6877. + pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0;
  6878. +
  6879. +exit:
  6880. +
  6881. +_func_exit_;
  6882. +
  6883. + return res;
  6884. +
  6885. +}
  6886. +
  6887. +#ifdef CONFIG_C2H_WK
  6888. +static void c2h_wk_callback(_workitem *work);
  6889. +#endif
  6890. +sint _rtw_init_evt_priv(struct evt_priv *pevtpriv)
  6891. +{
  6892. + sint res=_SUCCESS;
  6893. +
  6894. +_func_enter_;
  6895. +
  6896. +#ifdef CONFIG_H2CLBK
  6897. + _rtw_init_sema(&(pevtpriv->lbkevt_done), 0);
  6898. + pevtpriv->lbkevt_limit = 0;
  6899. + pevtpriv->lbkevt_num = 0;
  6900. + pevtpriv->cmdevt_parm = NULL;
  6901. +#endif
  6902. +
  6903. + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf
  6904. + ATOMIC_SET(&pevtpriv->event_seq, 0);
  6905. + pevtpriv->evt_done_cnt = 0;
  6906. +
  6907. +#ifdef CONFIG_EVENT_THREAD_MODE
  6908. +
  6909. + _rtw_init_sema(&(pevtpriv->evt_notify), 0);
  6910. + _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0);
  6911. +
  6912. + pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4);
  6913. + if (pevtpriv->evt_allocated_buf == NULL){
  6914. + res= _FAIL;
  6915. + goto exit;
  6916. + }
  6917. + pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3);
  6918. +
  6919. +
  6920. +#ifdef CONFIG_SDIO_HCI
  6921. + pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4);
  6922. +
  6923. + if (pevtpriv->allocated_c2h_mem == NULL){
  6924. + res= _FAIL;
  6925. + goto exit;
  6926. + }
  6927. +
  6928. + pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4\
  6929. + - ( (u32)(pevtpriv->allocated_c2h_mem) & 3);
  6930. +#ifdef PLATFORM_OS_XP
  6931. + pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL);
  6932. +
  6933. + if(pevtpriv->pc2h_mdl == NULL){
  6934. + res= _FAIL;
  6935. + goto exit;
  6936. + }
  6937. + MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl);
  6938. +#endif
  6939. +#endif //end of CONFIG_SDIO_HCI
  6940. +
  6941. + _rtw_init_queue(&(pevtpriv->evt_queue));
  6942. +
  6943. +exit:
  6944. +
  6945. +#endif //end of CONFIG_EVENT_THREAD_MODE
  6946. +
  6947. +#ifdef CONFIG_C2H_WK
  6948. + _init_workitem(&pevtpriv->c2h_wk, c2h_wk_callback, NULL);
  6949. + pevtpriv->c2h_wk_alive = _FALSE;
  6950. + pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN+1);
  6951. +#endif
  6952. +
  6953. +_func_exit_;
  6954. +
  6955. + return res;
  6956. +}
  6957. +
  6958. +void _rtw_free_evt_priv (struct evt_priv *pevtpriv)
  6959. +{
  6960. +_func_enter_;
  6961. +
  6962. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n"));
  6963. +
  6964. +#ifdef CONFIG_EVENT_THREAD_MODE
  6965. + _rtw_free_sema(&(pevtpriv->evt_notify));
  6966. + _rtw_free_sema(&(pevtpriv->terminate_evtthread_sema));
  6967. +
  6968. +
  6969. + if (pevtpriv->evt_allocated_buf)
  6970. + rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4);
  6971. +#endif
  6972. +
  6973. +#ifdef CONFIG_C2H_WK
  6974. + _cancel_workitem_sync(&pevtpriv->c2h_wk);
  6975. + while(pevtpriv->c2h_wk_alive)
  6976. + rtw_msleep_os(10);
  6977. +
  6978. + while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) {
  6979. + void *c2h;
  6980. + if ((c2h = rtw_cbuf_pop(pevtpriv->c2h_queue)) != NULL
  6981. + && c2h != (void *)pevtpriv) {
  6982. + rtw_mfree(c2h, 16);
  6983. + }
  6984. + }
  6985. + rtw_cbuf_free(pevtpriv->c2h_queue);
  6986. +#endif
  6987. +
  6988. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n"));
  6989. +
  6990. +_func_exit_;
  6991. +
  6992. +}
  6993. +
  6994. +void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv)
  6995. +{
  6996. +_func_enter_;
  6997. +
  6998. + if(pcmdpriv){
  6999. + _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock));
  7000. + _rtw_free_sema(&(pcmdpriv->cmd_queue_sema));
  7001. + //_rtw_free_sema(&(pcmdpriv->cmd_done_sema));
  7002. + _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema));
  7003. +
  7004. + if (pcmdpriv->cmd_allocated_buf)
  7005. + rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
  7006. +
  7007. + if (pcmdpriv->rsp_allocated_buf)
  7008. + rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4);
  7009. + }
  7010. +_func_exit_;
  7011. +}
  7012. +
  7013. +/*
  7014. +Calling Context:
  7015. +
  7016. +rtw_enqueue_cmd can only be called between kernel thread,
  7017. +since only spin_lock is used.
  7018. +
  7019. +ISR/Call-Back functions can't call this sub-function.
  7020. +
  7021. +*/
  7022. +
  7023. +sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj)
  7024. +{
  7025. + _irqL irqL;
  7026. +
  7027. +_func_enter_;
  7028. +
  7029. + if (obj == NULL)
  7030. + goto exit;
  7031. +
  7032. + //_enter_critical_bh(&queue->lock, &irqL);
  7033. + _enter_critical(&queue->lock, &irqL);
  7034. +
  7035. + rtw_list_insert_tail(&obj->list, &queue->queue);
  7036. +
  7037. + //_exit_critical_bh(&queue->lock, &irqL);
  7038. + _exit_critical(&queue->lock, &irqL);
  7039. +
  7040. +exit:
  7041. +
  7042. +_func_exit_;
  7043. +
  7044. + return _SUCCESS;
  7045. +}
  7046. +
  7047. +struct cmd_obj *_rtw_dequeue_cmd(_queue *queue)
  7048. +{
  7049. + _irqL irqL;
  7050. + struct cmd_obj *obj;
  7051. +
  7052. +_func_enter_;
  7053. +
  7054. + //_enter_critical_bh(&(queue->lock), &irqL);
  7055. + _enter_critical(&queue->lock, &irqL);
  7056. + if (rtw_is_list_empty(&(queue->queue)))
  7057. + obj = NULL;
  7058. + else
  7059. + {
  7060. + obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list);
  7061. + rtw_list_delete(&obj->list);
  7062. + }
  7063. +
  7064. + //_exit_critical_bh(&(queue->lock), &irqL);
  7065. + _exit_critical(&queue->lock, &irqL);
  7066. +
  7067. +_func_exit_;
  7068. +
  7069. + return obj;
  7070. +}
  7071. +
  7072. +u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
  7073. +{
  7074. + u32 res;
  7075. +_func_enter_;
  7076. + res = _rtw_init_cmd_priv (pcmdpriv);
  7077. +_func_exit_;
  7078. + return res;
  7079. +}
  7080. +
  7081. +u32 rtw_init_evt_priv (struct evt_priv *pevtpriv)
  7082. +{
  7083. + int res;
  7084. +_func_enter_;
  7085. + res = _rtw_init_evt_priv(pevtpriv);
  7086. +_func_exit_;
  7087. + return res;
  7088. +}
  7089. +
  7090. +void rtw_free_evt_priv (struct evt_priv *pevtpriv)
  7091. +{
  7092. +_func_enter_;
  7093. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n"));
  7094. + _rtw_free_evt_priv(pevtpriv);
  7095. +_func_exit_;
  7096. +}
  7097. +
  7098. +void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv)
  7099. +{
  7100. +_func_enter_;
  7101. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n"));
  7102. + _rtw_free_cmd_priv(pcmdpriv);
  7103. +_func_exit_;
  7104. +}
  7105. +
  7106. +int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj);
  7107. +int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
  7108. +{
  7109. + u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE
  7110. +
  7111. + #ifdef SUPPORT_HW_RFOFF_DETECTED
  7112. + //To decide allow or not
  7113. + if( (pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect)
  7114. + &&(!pcmdpriv->padapter->registrypriv.usbss_enable)
  7115. + )
  7116. + {
  7117. + if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) )
  7118. + {
  7119. + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf;
  7120. + if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID)
  7121. + {
  7122. + //DBG_871X("==>enqueue POWER_SAVING_CTRL_WK_CID\n");
  7123. + bAllow = _TRUE;
  7124. + }
  7125. + }
  7126. + }
  7127. + #endif
  7128. +
  7129. + if(cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan))
  7130. + bAllow = _TRUE;
  7131. +
  7132. + if( (pcmdpriv->padapter->hw_init_completed ==_FALSE && bAllow == _FALSE)
  7133. + || pcmdpriv->cmdthd_running== _FALSE //com_thread not running
  7134. + )
  7135. + {
  7136. + //DBG_871X("%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\n", caller_func, __FUNCTION__,
  7137. + // cmd_obj->cmdcode,
  7138. + // pcmdpriv->padapter->hw_init_completed,
  7139. + // pcmdpriv->cmdthd_running
  7140. + //);
  7141. +
  7142. + return _FAIL;
  7143. + }
  7144. + return _SUCCESS;
  7145. +}
  7146. +
  7147. +
  7148. +
  7149. +u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
  7150. +{
  7151. + int res = _FAIL;
  7152. + PADAPTER padapter = pcmdpriv->padapter;
  7153. +
  7154. +_func_enter_;
  7155. +
  7156. + if (cmd_obj == NULL) {
  7157. + goto exit;
  7158. + }
  7159. +
  7160. + cmd_obj->padapter = padapter;
  7161. +
  7162. +#ifdef CONFIG_CONCURRENT_MODE
  7163. + //change pcmdpriv to primary's pcmdpriv
  7164. + if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)
  7165. + pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);
  7166. +#endif
  7167. +
  7168. + if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) {
  7169. + rtw_free_cmd_obj(cmd_obj);
  7170. + goto exit;
  7171. + }
  7172. +
  7173. + res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj);
  7174. +
  7175. + if(res == _SUCCESS)
  7176. + _rtw_up_sema(&pcmdpriv->cmd_queue_sema);
  7177. +
  7178. +exit:
  7179. +
  7180. +_func_exit_;
  7181. +
  7182. + return res;
  7183. +}
  7184. +
  7185. +struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv)
  7186. +{
  7187. + struct cmd_obj *cmd_obj;
  7188. +
  7189. +_func_enter_;
  7190. +
  7191. + cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue);
  7192. +
  7193. +_func_exit_;
  7194. + return cmd_obj;
  7195. +}
  7196. +
  7197. +void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv)
  7198. +{
  7199. +_func_enter_;
  7200. + pcmdpriv->cmd_done_cnt++;
  7201. + //_rtw_up_sema(&(pcmdpriv->cmd_done_sema));
  7202. +_func_exit_;
  7203. +}
  7204. +
  7205. +void rtw_free_cmd_obj(struct cmd_obj *pcmd)
  7206. +{
  7207. +_func_enter_;
  7208. +
  7209. + if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_))
  7210. + {
  7211. + //free parmbuf in cmd_obj
  7212. + rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz);
  7213. + }
  7214. +
  7215. + if(pcmd->rsp!=NULL)
  7216. + {
  7217. + if(pcmd->rspsz!= 0)
  7218. + {
  7219. + //free rsp in cmd_obj
  7220. + rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz);
  7221. + }
  7222. + }
  7223. +
  7224. + //free cmd_obj
  7225. + rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj));
  7226. +
  7227. +_func_exit_;
  7228. +}
  7229. +
  7230. +void rtw_stop_cmd_thread(_adapter *adapter)
  7231. +{
  7232. + if(adapter->cmdThread && adapter->cmdpriv.cmdthd_running == _TRUE
  7233. + && adapter->cmdpriv.stop_req == 0)
  7234. + {
  7235. + adapter->cmdpriv.stop_req = 1;
  7236. + _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
  7237. + _rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema);
  7238. + }
  7239. +}
  7240. +
  7241. +thread_return rtw_cmd_thread(thread_context context)
  7242. +{
  7243. + u8 ret;
  7244. + struct cmd_obj *pcmd;
  7245. + u8 *pcmdbuf, *prspbuf;
  7246. + u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf);
  7247. + void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd);
  7248. + _adapter *padapter = (_adapter *)context;
  7249. + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
  7250. +
  7251. +_func_enter_;
  7252. +
  7253. + thread_enter("RTW_CMD_THREAD");
  7254. +
  7255. + pcmdbuf = pcmdpriv->cmd_buf;
  7256. + prspbuf = pcmdpriv->rsp_buf;
  7257. +
  7258. + pcmdpriv->stop_req = 0;
  7259. + pcmdpriv->cmdthd_running=_TRUE;
  7260. + _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
  7261. +
  7262. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n"));
  7263. +
  7264. + while(1)
  7265. + {
  7266. + if ((_rtw_down_sema(&(pcmdpriv->cmd_queue_sema))) == _FAIL) {
  7267. + LOG_LEVEL(_drv_err_, FUNC_ADPT_FMT" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\n", FUNC_ADPT_ARG(padapter));
  7268. + break;
  7269. + }
  7270. +
  7271. + if (pcmdpriv->stop_req) {
  7272. + LOG_LEVEL(_drv_err_, FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req);
  7273. + break;
  7274. + }
  7275. +
  7276. +#ifdef CONFIG_LPS_LCLK
  7277. + if (rtw_register_cmd_alive(padapter) != _SUCCESS)
  7278. + {
  7279. + continue;
  7280. + }
  7281. +#endif
  7282. +
  7283. +_next:
  7284. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved == _TRUE))
  7285. + {
  7286. + LOG_LEVEL(_drv_err_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n",
  7287. + __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__);
  7288. + break;
  7289. + }
  7290. +
  7291. + if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) {
  7292. +#ifdef CONFIG_LPS_LCLK
  7293. + rtw_unregister_cmd_alive(padapter);
  7294. +#endif
  7295. + continue;
  7296. + }
  7297. +
  7298. + if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) )
  7299. + {
  7300. + pcmd->res = H2C_DROPPED;
  7301. + goto post_process;
  7302. + }
  7303. +
  7304. + if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) ) {
  7305. + rtw_free_cmd_obj(pcmd);
  7306. + continue;
  7307. + }
  7308. +
  7309. + pcmdpriv->cmd_issued_cnt++;
  7310. +
  7311. + pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4
  7312. +
  7313. + _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);
  7314. +
  7315. + if(pcmd->cmdcode <= (sizeof(wlancmds) /sizeof(struct cmd_hdl)))
  7316. + {
  7317. + cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns;
  7318. +
  7319. + if (cmd_hdl)
  7320. + {
  7321. + ret = cmd_hdl(pcmd->padapter, pcmdbuf);
  7322. + pcmd->res = ret;
  7323. + }
  7324. +
  7325. + pcmdpriv->cmd_seq++;
  7326. + }
  7327. + else
  7328. + {
  7329. + pcmd->res = H2C_PARAMETERS_ERROR;
  7330. + }
  7331. +
  7332. + cmd_hdl = NULL;
  7333. +
  7334. +post_process:
  7335. +
  7336. + //call callback function for post-processed
  7337. + if(pcmd->cmdcode <= (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback)))
  7338. + {
  7339. + pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback;
  7340. + if(pcmd_callback == NULL)
  7341. + {
  7342. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode));
  7343. + rtw_free_cmd_obj(pcmd);
  7344. + }
  7345. + else
  7346. + {
  7347. + //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL)
  7348. + pcmd_callback(pcmd->padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback
  7349. + }
  7350. + }
  7351. +
  7352. + flush_signals_thread();
  7353. +
  7354. + goto _next;
  7355. +
  7356. + }
  7357. + pcmdpriv->cmdthd_running=_FALSE;
  7358. +
  7359. +
  7360. + // free all cmd_obj resources
  7361. + do{
  7362. + pcmd = rtw_dequeue_cmd(pcmdpriv);
  7363. + if(pcmd==NULL)
  7364. + break;
  7365. +
  7366. + //DBG_871X("%s: leaving... drop cmdcode:%u\n", __FUNCTION__, pcmd->cmdcode);
  7367. +
  7368. + rtw_free_cmd_obj(pcmd);
  7369. + }while(1);
  7370. +
  7371. + _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
  7372. +
  7373. +_func_exit_;
  7374. +
  7375. + thread_exit();
  7376. +
  7377. +}
  7378. +
  7379. +
  7380. +#ifdef CONFIG_EVENT_THREAD_MODE
  7381. +u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj)
  7382. +{
  7383. + _irqL irqL;
  7384. + int res;
  7385. + _queue *queue = &pevtpriv->evt_queue;
  7386. +
  7387. +_func_enter_;
  7388. +
  7389. + res = _SUCCESS;
  7390. +
  7391. + if (obj == NULL) {
  7392. + res = _FAIL;
  7393. + goto exit;
  7394. + }
  7395. +
  7396. + _enter_critical_bh(&queue->lock, &irqL);
  7397. +
  7398. + rtw_list_insert_tail(&obj->list, &queue->queue);
  7399. +
  7400. + _exit_critical_bh(&queue->lock, &irqL);
  7401. +
  7402. + //rtw_evt_notify_isr(pevtpriv);
  7403. +
  7404. +exit:
  7405. +
  7406. +_func_exit_;
  7407. +
  7408. + return res;
  7409. +}
  7410. +
  7411. +struct evt_obj *rtw_dequeue_evt(_queue *queue)
  7412. +{
  7413. + _irqL irqL;
  7414. + struct evt_obj *pevtobj;
  7415. +
  7416. +_func_enter_;
  7417. +
  7418. + _enter_critical_bh(&queue->lock, &irqL);
  7419. +
  7420. + if (rtw_is_list_empty(&(queue->queue)))
  7421. + pevtobj = NULL;
  7422. + else
  7423. + {
  7424. + pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list);
  7425. + rtw_list_delete(&pevtobj->list);
  7426. + }
  7427. +
  7428. + _exit_critical_bh(&queue->lock, &irqL);
  7429. +
  7430. +_func_exit_;
  7431. +
  7432. + return pevtobj;
  7433. +}
  7434. +
  7435. +void rtw_free_evt_obj(struct evt_obj *pevtobj)
  7436. +{
  7437. +_func_enter_;
  7438. +
  7439. + if(pevtobj->parmbuf)
  7440. + rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz);
  7441. +
  7442. + rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj));
  7443. +
  7444. +_func_exit_;
  7445. +}
  7446. +
  7447. +void rtw_evt_notify_isr(struct evt_priv *pevtpriv)
  7448. +{
  7449. +_func_enter_;
  7450. + pevtpriv->evt_done_cnt++;
  7451. + _rtw_up_sema(&(pevtpriv->evt_notify));
  7452. +_func_exit_;
  7453. +}
  7454. +#endif
  7455. +
  7456. +
  7457. +/*
  7458. +u8 rtw_setstandby_cmd(unsigned char *adapter)
  7459. +*/
  7460. +u8 rtw_setstandby_cmd(_adapter *padapter, uint action)
  7461. +{
  7462. + struct cmd_obj* ph2c;
  7463. + struct usb_suspend_parm* psetusbsuspend;
  7464. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7465. +
  7466. + u8 ret = _SUCCESS;
  7467. +
  7468. +_func_enter_;
  7469. +
  7470. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7471. + if (ph2c == NULL) {
  7472. + ret = _FAIL;
  7473. + goto exit;
  7474. + }
  7475. +
  7476. + psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm));
  7477. + if (psetusbsuspend == NULL) {
  7478. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7479. + ret = _FAIL;
  7480. + goto exit;
  7481. + }
  7482. +
  7483. + psetusbsuspend->action = action;
  7484. +
  7485. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend));
  7486. +
  7487. + ret = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7488. +
  7489. +exit:
  7490. +
  7491. +_func_exit_;
  7492. +
  7493. + return ret;
  7494. +}
  7495. +
  7496. +/*
  7497. +rtw_sitesurvey_cmd(~)
  7498. + ### NOTE:#### (!!!!)
  7499. + MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
  7500. +*/
  7501. +u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num,
  7502. + struct rtw_ieee80211_channel *ch, int ch_num)
  7503. +{
  7504. + u8 res = _FAIL;
  7505. + struct cmd_obj *ph2c;
  7506. + struct sitesurvey_parm *psurveyPara;
  7507. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  7508. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  7509. +
  7510. +_func_enter_;
  7511. +
  7512. +#ifdef CONFIG_LPS
  7513. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){
  7514. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1);
  7515. + }
  7516. +#endif
  7517. +
  7518. +#ifdef CONFIG_P2P_PS
  7519. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  7520. + p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1);
  7521. + }
  7522. +#endif // CONFIG_P2P_PS
  7523. +
  7524. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7525. + if (ph2c == NULL)
  7526. + return _FAIL;
  7527. +
  7528. + psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm));
  7529. + if (psurveyPara == NULL) {
  7530. + rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj));
  7531. + return _FAIL;
  7532. + }
  7533. +
  7534. + rtw_free_network_queue(padapter, _FALSE);
  7535. +
  7536. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("\nflush network queue\n\n"));
  7537. +
  7538. + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey));
  7539. +
  7540. + /* psurveyPara->bsslimit = 48; */
  7541. + psurveyPara->scan_mode = pmlmepriv->scan_mode;
  7542. +
  7543. + /* prepare ssid list */
  7544. + if (ssid) {
  7545. + int i;
  7546. + for (i=0; i<ssid_num && i< RTW_SSID_SCAN_AMOUNT; i++) {
  7547. + if (ssid[i].SsidLength) {
  7548. + _rtw_memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(NDIS_802_11_SSID));
  7549. + psurveyPara->ssid_num++;
  7550. + if (0)
  7551. + DBG_871X(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter),
  7552. + psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength);
  7553. + }
  7554. + }
  7555. + }
  7556. +
  7557. + /* prepare channel list */
  7558. + if (ch) {
  7559. + int i;
  7560. + for (i=0; i<ch_num && i< RTW_CHANNEL_SCAN_AMOUNT; i++) {
  7561. + if (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) {
  7562. + _rtw_memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel));
  7563. + psurveyPara->ch_num++;
  7564. + if (0)
  7565. + DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter),
  7566. + psurveyPara->ch[i].hw_value);
  7567. + }
  7568. + }
  7569. + }
  7570. +
  7571. + set_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
  7572. +
  7573. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7574. +
  7575. + if(res == _SUCCESS) {
  7576. +
  7577. + pmlmepriv->scan_start_time = rtw_get_current_time();
  7578. +
  7579. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  7580. + if (padapter->pbuddy_adapter == NULL )
  7581. + goto full_scan_timeout;
  7582. + if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)
  7583. + _set_timer(&pmlmepriv->scan_to_timer,
  7584. + SURVEY_TO * ( padapter->mlmeextpriv.max_chan_nums + ( padapter->mlmeextpriv.max_chan_nums / RTW_SCAN_NUM_OF_CH ) * RTW_STAY_AP_CH_MILLISECOND ) + 1000 );
  7585. + else
  7586. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  7587. +full_scan_timeout:
  7588. + _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT);
  7589. +
  7590. + rtw_led_control(padapter, LED_CTL_SITE_SURVEY);
  7591. +
  7592. + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec
  7593. + } else {
  7594. + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
  7595. + }
  7596. +
  7597. +_func_exit_;
  7598. +
  7599. + return res;
  7600. +}
  7601. +
  7602. +u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset)
  7603. +{
  7604. + struct cmd_obj* ph2c;
  7605. + struct setdatarate_parm* pbsetdataratepara;
  7606. + struct cmd_priv* pcmdpriv = &padapter->cmdpriv;
  7607. + u8 res = _SUCCESS;
  7608. +
  7609. +_func_enter_;
  7610. +
  7611. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7612. + if (ph2c == NULL) {
  7613. + res = _FAIL;
  7614. + goto exit;
  7615. + }
  7616. +
  7617. + pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm));
  7618. + if (pbsetdataratepara == NULL) {
  7619. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7620. + res = _FAIL;
  7621. + goto exit;
  7622. + }
  7623. +
  7624. + init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate));
  7625. +#ifdef MP_FIRMWARE_OFFLOAD
  7626. + pbsetdataratepara->curr_rateidx = *(u32*)rateset;
  7627. +// _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32));
  7628. +#else
  7629. + pbsetdataratepara->mac_id = 5;
  7630. + _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates);
  7631. +#endif
  7632. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7633. +exit:
  7634. +
  7635. +_func_exit_;
  7636. +
  7637. + return res;
  7638. +}
  7639. +
  7640. +u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset)
  7641. +{
  7642. + struct cmd_obj* ph2c;
  7643. + struct setbasicrate_parm* pssetbasicratepara;
  7644. + struct cmd_priv* pcmdpriv=&padapter->cmdpriv;
  7645. + u8 res = _SUCCESS;
  7646. +
  7647. +_func_enter_;
  7648. +
  7649. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7650. + if (ph2c == NULL) {
  7651. + res= _FAIL;
  7652. + goto exit;
  7653. + }
  7654. + pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm));
  7655. +
  7656. + if (pssetbasicratepara == NULL) {
  7657. + rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj));
  7658. + res = _FAIL;
  7659. + goto exit;
  7660. + }
  7661. +
  7662. + init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_);
  7663. +
  7664. + _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates);
  7665. +
  7666. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7667. +exit:
  7668. +
  7669. +_func_exit_;
  7670. +
  7671. + return res;
  7672. +}
  7673. +
  7674. +
  7675. +/*
  7676. +unsigned char rtw_setphy_cmd(unsigned char *adapter)
  7677. +
  7678. +1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program
  7679. +2. for AdHoc/Ap mode or mp mode?
  7680. +
  7681. +*/
  7682. +u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch)
  7683. +{
  7684. + struct cmd_obj* ph2c;
  7685. + struct setphy_parm* psetphypara;
  7686. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7687. +// struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  7688. +// struct registry_priv* pregistry_priv = &padapter->registrypriv;
  7689. + u8 res=_SUCCESS;
  7690. +
  7691. +_func_enter_;
  7692. +
  7693. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7694. + if(ph2c==NULL){
  7695. + res= _FAIL;
  7696. + goto exit;
  7697. + }
  7698. + psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm));
  7699. +
  7700. + if(psetphypara==NULL){
  7701. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7702. + res= _FAIL;
  7703. + goto exit;
  7704. + }
  7705. +
  7706. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_);
  7707. +
  7708. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem));
  7709. +
  7710. + psetphypara->modem = modem;
  7711. + psetphypara->rfchannel = ch;
  7712. +
  7713. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7714. +exit:
  7715. +_func_exit_;
  7716. + return res;
  7717. +}
  7718. +
  7719. +u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val)
  7720. +{
  7721. + struct cmd_obj* ph2c;
  7722. + struct writeBB_parm* pwritebbparm;
  7723. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7724. + u8 res=_SUCCESS;
  7725. +_func_enter_;
  7726. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7727. + if(ph2c==NULL){
  7728. + res= _FAIL;
  7729. + goto exit;
  7730. + }
  7731. + pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm));
  7732. +
  7733. + if(pwritebbparm==NULL){
  7734. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7735. + res= _FAIL;
  7736. + goto exit;
  7737. + }
  7738. +
  7739. + init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg));
  7740. +
  7741. + pwritebbparm->offset = offset;
  7742. + pwritebbparm->value = val;
  7743. +
  7744. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7745. +exit:
  7746. +_func_exit_;
  7747. + return res;
  7748. +}
  7749. +
  7750. +u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval)
  7751. +{
  7752. + struct cmd_obj* ph2c;
  7753. + struct readBB_parm* prdbbparm;
  7754. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7755. + u8 res=_SUCCESS;
  7756. +
  7757. +_func_enter_;
  7758. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7759. + if(ph2c==NULL){
  7760. + res=_FAIL;
  7761. + goto exit;
  7762. + }
  7763. + prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm));
  7764. +
  7765. + if(prdbbparm ==NULL){
  7766. + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
  7767. + return _FAIL;
  7768. + }
  7769. +
  7770. + _rtw_init_listhead(&ph2c->list);
  7771. + ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg);
  7772. + ph2c->parmbuf = (unsigned char *)prdbbparm;
  7773. + ph2c->cmdsz = sizeof(struct readBB_parm);
  7774. + ph2c->rsp = pval;
  7775. + ph2c->rspsz = sizeof(struct readBB_rsp);
  7776. +
  7777. + prdbbparm ->offset = offset;
  7778. +
  7779. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7780. +exit:
  7781. +_func_exit_;
  7782. + return res;
  7783. +}
  7784. +
  7785. +u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val)
  7786. +{
  7787. + struct cmd_obj* ph2c;
  7788. + struct writeRF_parm* pwriterfparm;
  7789. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7790. + u8 res=_SUCCESS;
  7791. +_func_enter_;
  7792. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7793. + if(ph2c==NULL){
  7794. + res= _FAIL;
  7795. + goto exit;
  7796. + }
  7797. + pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm));
  7798. +
  7799. + if(pwriterfparm==NULL){
  7800. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7801. + res= _FAIL;
  7802. + goto exit;
  7803. + }
  7804. +
  7805. + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg));
  7806. +
  7807. + pwriterfparm->offset = offset;
  7808. + pwriterfparm->value = val;
  7809. +
  7810. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7811. +exit:
  7812. +_func_exit_;
  7813. + return res;
  7814. +}
  7815. +
  7816. +u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval)
  7817. +{
  7818. + struct cmd_obj* ph2c;
  7819. + struct readRF_parm* prdrfparm;
  7820. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7821. + u8 res=_SUCCESS;
  7822. +
  7823. +_func_enter_;
  7824. +
  7825. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7826. + if(ph2c==NULL){
  7827. + res= _FAIL;
  7828. + goto exit;
  7829. + }
  7830. +
  7831. + prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm));
  7832. + if(prdrfparm ==NULL){
  7833. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  7834. + res= _FAIL;
  7835. + goto exit;
  7836. + }
  7837. +
  7838. + _rtw_init_listhead(&ph2c->list);
  7839. + ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg);
  7840. + ph2c->parmbuf = (unsigned char *)prdrfparm;
  7841. + ph2c->cmdsz = sizeof(struct readRF_parm);
  7842. + ph2c->rsp = pval;
  7843. + ph2c->rspsz = sizeof(struct readRF_rsp);
  7844. +
  7845. + prdrfparm ->offset = offset;
  7846. +
  7847. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  7848. +
  7849. +exit:
  7850. +
  7851. +_func_exit_;
  7852. +
  7853. + return res;
  7854. +}
  7855. +
  7856. +void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
  7857. +{
  7858. + _func_enter_;
  7859. +
  7860. + //rtw_free_cmd_obj(pcmd);
  7861. + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);
  7862. + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));
  7863. +
  7864. +#ifdef CONFIG_MP_INCLUDED
  7865. + padapter->mppriv.workparam.bcompleted= _TRUE;
  7866. +#endif
  7867. +_func_exit_;
  7868. +}
  7869. +
  7870. +void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
  7871. +{
  7872. + _func_enter_;
  7873. +
  7874. + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);
  7875. + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));
  7876. +
  7877. +#ifdef CONFIG_MP_INCLUDED
  7878. + padapter->mppriv.workparam.bcompleted= _TRUE;
  7879. +#endif
  7880. +
  7881. +_func_exit_;
  7882. +}
  7883. +
  7884. +u8 rtw_createbss_cmd(_adapter *padapter)
  7885. +{
  7886. + struct cmd_obj* pcmd;
  7887. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7888. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  7889. + WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network;
  7890. + u8 res=_SUCCESS;
  7891. +
  7892. +_func_enter_;
  7893. +
  7894. + rtw_led_control(padapter, LED_CTL_START_TO_LINK);
  7895. +
  7896. + if (pmlmepriv->assoc_ssid.SsidLength == 0){
  7897. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid));
  7898. + } else {
  7899. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid));
  7900. + }
  7901. +
  7902. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7903. + if(pcmd==NULL){
  7904. + res= _FAIL;
  7905. + goto exit;
  7906. + }
  7907. +
  7908. + _rtw_init_listhead(&pcmd->list);
  7909. + pcmd->cmdcode = _CreateBss_CMD_;
  7910. + pcmd->parmbuf = (unsigned char *)pdev_network;
  7911. + pcmd->cmdsz = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX*)pdev_network);
  7912. + pcmd->rsp = NULL;
  7913. + pcmd->rspsz = 0;
  7914. +
  7915. + pdev_network->Length = pcmd->cmdsz;
  7916. +
  7917. +#ifdef CONFIG_RTL8712
  7918. + //notes: translate IELength & Length after assign the Length to cmdsz;
  7919. + pdev_network->Length = cpu_to_le32(pcmd->cmdsz);
  7920. + pdev_network->IELength = cpu_to_le32(pdev_network->IELength);
  7921. + pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength);
  7922. +#endif
  7923. +
  7924. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  7925. +
  7926. +exit:
  7927. +
  7928. +_func_exit_;
  7929. +
  7930. + return res;
  7931. +}
  7932. +
  7933. +u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz)
  7934. +{
  7935. + struct cmd_obj* pcmd;
  7936. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7937. + u8 res=_SUCCESS;
  7938. +
  7939. +_func_enter_;
  7940. +
  7941. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7942. + if(pcmd==NULL){
  7943. + res= _FAIL;
  7944. + goto exit;
  7945. + }
  7946. +
  7947. + _rtw_init_listhead(&pcmd->list);
  7948. + pcmd->cmdcode = GEN_CMD_CODE(_CreateBss);
  7949. + pcmd->parmbuf = pbss;
  7950. + pcmd->cmdsz = sz;
  7951. + pcmd->rsp = NULL;
  7952. + pcmd->rspsz = 0;
  7953. +
  7954. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  7955. +
  7956. +exit:
  7957. +
  7958. +_func_exit_;
  7959. +
  7960. + return res;
  7961. +}
  7962. +
  7963. +u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork)
  7964. +{
  7965. + u8 *auth, res = _SUCCESS;
  7966. + uint t_len = 0;
  7967. + WLAN_BSSID_EX *psecnetwork;
  7968. + struct cmd_obj *pcmd;
  7969. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  7970. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  7971. + struct qos_priv *pqospriv= &pmlmepriv->qospriv;
  7972. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  7973. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  7974. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  7975. + NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode;
  7976. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  7977. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  7978. +
  7979. +_func_enter_;
  7980. +
  7981. + rtw_led_control(padapter, LED_CTL_START_TO_LINK);
  7982. +
  7983. + if (pmlmepriv->assoc_ssid.SsidLength == 0){
  7984. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n"));
  7985. + } else {
  7986. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid));
  7987. + }
  7988. +
  7989. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  7990. + if(pcmd==NULL){
  7991. + res=_FAIL;
  7992. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n"));
  7993. + goto exit;
  7994. + }
  7995. + /* // for IEs is pointer
  7996. + t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 +
  7997. + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) +
  7998. + sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) +
  7999. + sizeof (NDIS_802_11_CONFIGURATION) +
  8000. + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) +
  8001. + sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ;
  8002. + */
  8003. + //for IEs is fix buf size
  8004. + t_len = sizeof(WLAN_BSSID_EX);
  8005. +
  8006. +
  8007. + //for hidden ap to set fw_state here
  8008. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE)
  8009. + {
  8010. + switch(ndis_network_mode)
  8011. + {
  8012. + case Ndis802_11IBSS:
  8013. + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
  8014. + break;
  8015. +
  8016. + case Ndis802_11Infrastructure:
  8017. + set_fwstate(pmlmepriv, WIFI_STATION_STATE);
  8018. + break;
  8019. +
  8020. + case Ndis802_11APMode:
  8021. + case Ndis802_11AutoUnknown:
  8022. + case Ndis802_11InfrastructureMax:
  8023. + break;
  8024. +
  8025. + }
  8026. + }
  8027. +
  8028. + psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss;
  8029. + if(psecnetwork==NULL)
  8030. + {
  8031. + if(pcmd !=NULL)
  8032. + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
  8033. +
  8034. + res=_FAIL;
  8035. +
  8036. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n"));
  8037. +
  8038. + goto exit;
  8039. + }
  8040. +
  8041. + _rtw_memset(psecnetwork, 0, t_len);
  8042. +
  8043. + _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network));
  8044. +
  8045. + auth=&psecuritypriv->authenticator_ie[0];
  8046. + psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength;
  8047. +
  8048. + if((psecnetwork->IELength-12) < (256-1)) {
  8049. + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12);
  8050. + } else {
  8051. + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1));
  8052. + }
  8053. +
  8054. + psecnetwork->IELength = 0;
  8055. + // Added by Albert 2009/02/18
  8056. + // If the the driver wants to use the bssid to create the connection.
  8057. + // If not, we have to copy the connecting AP's MAC address to it so that
  8058. + // the driver just has the bssid information for PMKIDList searching.
  8059. +
  8060. + if ( pmlmepriv->assoc_by_bssid == _FALSE )
  8061. + {
  8062. + _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN );
  8063. + }
  8064. +
  8065. + psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength);
  8066. +
  8067. +
  8068. + pqospriv->qos_option = 0;
  8069. +
  8070. + if(pregistrypriv->wmm_enable)
  8071. + {
  8072. + u32 tmp_len;
  8073. +
  8074. + tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength);
  8075. +
  8076. + if (psecnetwork->IELength != tmp_len)
  8077. + {
  8078. + psecnetwork->IELength = tmp_len;
  8079. + pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon
  8080. + }
  8081. + else
  8082. + {
  8083. + pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon
  8084. + }
  8085. + }
  8086. +
  8087. +#ifdef CONFIG_80211N_HT
  8088. + phtpriv->ht_option = _FALSE;
  8089. + if(pregistrypriv->ht_enable)
  8090. + {
  8091. + // Added by Albert 2010/06/23
  8092. + // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue.
  8093. + // Especially for Realtek 8192u SoftAP.
  8094. + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) &&
  8095. + ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) &&
  8096. + ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ ))
  8097. + {
  8098. + //rtw_restructure_ht_ie
  8099. + rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0],
  8100. + pnetwork->network.IELength, &psecnetwork->IELength, (u8)psecnetwork->Configuration.DSConfig );
  8101. + }
  8102. + }
  8103. +
  8104. +#endif
  8105. +
  8106. + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength);
  8107. +
  8108. + #if 0
  8109. + psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength;
  8110. +
  8111. + if(psecnetwork->IELength < (256-1))
  8112. + {
  8113. + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength);
  8114. + }
  8115. + else
  8116. + {
  8117. + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1));
  8118. + }
  8119. + #endif
  8120. +
  8121. + pcmd->cmdsz = get_WLAN_BSSID_EX_sz(psecnetwork);//get cmdsz before endian conversion
  8122. +
  8123. +#ifdef CONFIG_RTL8712
  8124. + //wlan_network endian conversion
  8125. + psecnetwork->Length = cpu_to_le32(psecnetwork->Length);
  8126. + psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength);
  8127. + psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy);
  8128. + psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi);
  8129. + psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse);
  8130. + psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow);
  8131. + psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod);
  8132. + psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig);
  8133. + psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime);
  8134. + psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern);
  8135. + psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet);
  8136. + psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length);
  8137. + psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length);
  8138. + psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode);
  8139. + psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength);
  8140. +#endif
  8141. +
  8142. + _rtw_init_listhead(&pcmd->list);
  8143. + pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss)
  8144. + pcmd->parmbuf = (unsigned char *)psecnetwork;
  8145. + pcmd->rsp = NULL;
  8146. + pcmd->rspsz = 0;
  8147. +
  8148. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  8149. +
  8150. +exit:
  8151. +
  8152. +_func_exit_;
  8153. +
  8154. + return res;
  8155. +}
  8156. +
  8157. +u8 rtw_disassoc_cmd(_adapter*padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */
  8158. +{
  8159. + struct cmd_obj *cmdobj = NULL;
  8160. + struct disconnect_parm *param = NULL;
  8161. + struct cmd_priv *cmdpriv = &padapter->cmdpriv;
  8162. + u8 res = _SUCCESS;
  8163. +
  8164. +_func_enter_;
  8165. +
  8166. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n"));
  8167. +
  8168. + /* prepare cmd parameter */
  8169. + param = (struct disconnect_parm *)rtw_zmalloc(sizeof(*param));
  8170. + if (param == NULL) {
  8171. + res = _FAIL;
  8172. + goto exit;
  8173. + }
  8174. + param->deauth_timeout_ms = deauth_timeout_ms;
  8175. +
  8176. + if (enqueue) {
  8177. + /* need enqueue, prepare cmd_obj and enqueue */
  8178. + cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));
  8179. + if (cmdobj == NULL) {
  8180. + res = _FAIL;
  8181. + rtw_mfree((u8 *)param, sizeof(*param));
  8182. + goto exit;
  8183. + }
  8184. + init_h2fwcmd_w_parm_no_rsp(cmdobj, param, _DisConnect_CMD_);
  8185. + res = rtw_enqueue_cmd(cmdpriv, cmdobj);
  8186. + } else {
  8187. + /* no need to enqueue, do the cmd hdl directly and free cmd parameter */
  8188. + if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param))
  8189. + res = _FAIL;
  8190. + rtw_mfree((u8 *)param, sizeof(*param));
  8191. + }
  8192. +
  8193. +exit:
  8194. +
  8195. +_func_exit_;
  8196. +
  8197. + return res;
  8198. +}
  8199. +
  8200. +u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
  8201. +{
  8202. + struct cmd_obj* ph2c;
  8203. + struct setopmode_parm* psetop;
  8204. +
  8205. + struct cmd_priv *pcmdpriv= &padapter->cmdpriv;
  8206. + u8 res=_SUCCESS;
  8207. +
  8208. +_func_enter_;
  8209. +
  8210. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8211. + if(ph2c==NULL){
  8212. + res= _FALSE;
  8213. + goto exit;
  8214. + }
  8215. + psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm));
  8216. +
  8217. + if(psetop==NULL){
  8218. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8219. + res=_FALSE;
  8220. + goto exit;
  8221. + }
  8222. +
  8223. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_);
  8224. + psetop->mode = (u8)networktype;
  8225. +
  8226. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8227. +
  8228. +exit:
  8229. +
  8230. +_func_exit_;
  8231. +
  8232. + return res;
  8233. +}
  8234. +
  8235. +u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key)
  8236. +{
  8237. + struct cmd_obj* ph2c;
  8238. + struct set_stakey_parm *psetstakey_para;
  8239. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8240. + struct set_stakey_rsp *psetstakey_rsp = NULL;
  8241. +
  8242. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  8243. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  8244. + struct sta_info* sta = (struct sta_info* )psta;
  8245. + u8 res=_SUCCESS;
  8246. +
  8247. +_func_enter_;
  8248. +
  8249. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8250. + if ( ph2c == NULL){
  8251. + res= _FAIL;
  8252. + goto exit;
  8253. + }
  8254. +
  8255. + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
  8256. + if(psetstakey_para==NULL){
  8257. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8258. + res=_FAIL;
  8259. + goto exit;
  8260. + }
  8261. +
  8262. + psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp));
  8263. + if(psetstakey_rsp == NULL){
  8264. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8265. + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
  8266. + res=_FAIL;
  8267. + goto exit;
  8268. + }
  8269. +
  8270. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
  8271. + ph2c->rsp = (u8 *) psetstakey_rsp;
  8272. + ph2c->rspsz = sizeof(struct set_stakey_rsp);
  8273. +
  8274. + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN);
  8275. +
  8276. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){
  8277. +#ifdef CONFIG_TDLS
  8278. + if(sta->tdls_sta_state&TDLS_LINKED_STATE)
  8279. + psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy;
  8280. + else
  8281. +#endif //CONFIG_TDLS
  8282. + psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm;
  8283. + }else{
  8284. + GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE);
  8285. + }
  8286. +
  8287. + if (unicast_key == _TRUE) {
  8288. +#ifdef CONFIG_TDLS
  8289. + if(sta->tdls_sta_state&TDLS_LINKED_STATE)
  8290. + _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16);
  8291. + else
  8292. +#endif //CONFIG_TDLS
  8293. + _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16);
  8294. + } else {
  8295. + _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16);
  8296. + }
  8297. +
  8298. + //jeff: set this becasue at least sw key is ready
  8299. + padapter->securitypriv.busetkipkey=_TRUE;
  8300. +
  8301. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8302. +
  8303. +exit:
  8304. +
  8305. +_func_exit_;
  8306. +
  8307. + return res;
  8308. +}
  8309. +
  8310. +u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
  8311. +{
  8312. + struct cmd_obj* ph2c;
  8313. + struct set_stakey_parm *psetstakey_para;
  8314. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8315. + struct set_stakey_rsp *psetstakey_rsp = NULL;
  8316. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  8317. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  8318. + struct sta_info* sta = (struct sta_info* )psta;
  8319. + u8 res=_SUCCESS;
  8320. +
  8321. +_func_enter_;
  8322. +
  8323. + if(!enqueue)
  8324. + {
  8325. + clear_cam_entry(padapter, entry);
  8326. + }
  8327. + else
  8328. + {
  8329. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8330. + if ( ph2c == NULL){
  8331. + res= _FAIL;
  8332. + goto exit;
  8333. + }
  8334. +
  8335. + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
  8336. + if(psetstakey_para==NULL){
  8337. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8338. + res=_FAIL;
  8339. + goto exit;
  8340. + }
  8341. +
  8342. + psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp));
  8343. + if(psetstakey_rsp == NULL){
  8344. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8345. + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
  8346. + res=_FAIL;
  8347. + goto exit;
  8348. + }
  8349. +
  8350. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
  8351. + ph2c->rsp = (u8 *) psetstakey_rsp;
  8352. + ph2c->rspsz = sizeof(struct set_stakey_rsp);
  8353. +
  8354. + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
  8355. +
  8356. + psetstakey_para->algorithm = _NO_PRIVACY_;
  8357. +
  8358. + psetstakey_para->id = entry;
  8359. +
  8360. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8361. +
  8362. + }
  8363. +
  8364. +exit:
  8365. +
  8366. +_func_exit_;
  8367. +
  8368. + return res;
  8369. +}
  8370. +
  8371. +u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table)
  8372. +{
  8373. + struct cmd_obj* ph2c;
  8374. + struct setratable_parm * psetrttblparm;
  8375. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8376. + u8 res=_SUCCESS;
  8377. +_func_enter_;
  8378. +
  8379. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8380. + if(ph2c==NULL){
  8381. + res= _FAIL;
  8382. + goto exit;
  8383. + }
  8384. + psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm));
  8385. +
  8386. + if(psetrttblparm==NULL){
  8387. + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
  8388. + res= _FAIL;
  8389. + goto exit;
  8390. + }
  8391. +
  8392. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));
  8393. +
  8394. + _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm));
  8395. +
  8396. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8397. +exit:
  8398. +_func_exit_;
  8399. + return res;
  8400. +
  8401. +}
  8402. +
  8403. +u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval)
  8404. +{
  8405. + struct cmd_obj* ph2c;
  8406. + struct getratable_parm * pgetrttblparm;
  8407. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8408. + u8 res=_SUCCESS;
  8409. +_func_enter_;
  8410. +
  8411. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8412. + if(ph2c==NULL){
  8413. + res= _FAIL;
  8414. + goto exit;
  8415. + }
  8416. + pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm));
  8417. +
  8418. + if(pgetrttblparm==NULL){
  8419. + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
  8420. + res= _FAIL;
  8421. + goto exit;
  8422. + }
  8423. +
  8424. +// init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));
  8425. +
  8426. + _rtw_init_listhead(&ph2c->list);
  8427. + ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable);
  8428. + ph2c->parmbuf = (unsigned char *)pgetrttblparm;
  8429. + ph2c->cmdsz = sizeof(struct getratable_parm);
  8430. + ph2c->rsp = (u8*)pval;
  8431. + ph2c->rspsz = sizeof(struct getratable_rsp);
  8432. +
  8433. + pgetrttblparm ->rsvd = 0x0;
  8434. +
  8435. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8436. +exit:
  8437. +_func_exit_;
  8438. + return res;
  8439. +
  8440. +}
  8441. +
  8442. +u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr)
  8443. +{
  8444. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8445. + struct cmd_obj* ph2c;
  8446. + struct set_assocsta_parm *psetassocsta_para;
  8447. + struct set_stakey_rsp *psetassocsta_rsp = NULL;
  8448. +
  8449. + u8 res=_SUCCESS;
  8450. +
  8451. +_func_enter_;
  8452. +
  8453. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8454. + if(ph2c==NULL){
  8455. + res= _FAIL;
  8456. + goto exit;
  8457. + }
  8458. +
  8459. + psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm));
  8460. + if(psetassocsta_para==NULL){
  8461. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8462. + res=_FAIL;
  8463. + goto exit;
  8464. + }
  8465. +
  8466. + psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp));
  8467. + if(psetassocsta_rsp==NULL){
  8468. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  8469. + rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm));
  8470. + return _FAIL;
  8471. + }
  8472. +
  8473. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_);
  8474. + ph2c->rsp = (u8 *) psetassocsta_rsp;
  8475. + ph2c->rspsz = sizeof(struct set_assocsta_rsp);
  8476. +
  8477. + _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN);
  8478. +
  8479. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8480. +
  8481. +exit:
  8482. +
  8483. +_func_exit_;
  8484. +
  8485. + return res;
  8486. + }
  8487. +
  8488. +u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr)
  8489. +{
  8490. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8491. + struct cmd_obj* ph2c;
  8492. + struct addBaReq_parm *paddbareq_parm;
  8493. +
  8494. + u8 res=_SUCCESS;
  8495. +
  8496. +_func_enter_;
  8497. +
  8498. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8499. + if(ph2c==NULL){
  8500. + res= _FAIL;
  8501. + goto exit;
  8502. + }
  8503. +
  8504. + paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm));
  8505. + if(paddbareq_parm==NULL){
  8506. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  8507. + res= _FAIL;
  8508. + goto exit;
  8509. + }
  8510. +
  8511. + paddbareq_parm->tid = tid;
  8512. + _rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN);
  8513. +
  8514. + init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq));
  8515. +
  8516. + //DBG_871X("rtw_addbareq_cmd, tid=%d\n", tid);
  8517. +
  8518. + //rtw_enqueue_cmd(pcmdpriv, ph2c);
  8519. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8520. +
  8521. +exit:
  8522. +
  8523. +_func_exit_;
  8524. +
  8525. + return res;
  8526. +}
  8527. +//add for CONFIG_IEEE80211W, none 11w can use it
  8528. +u8 rtw_reset_securitypriv_cmd(_adapter*padapter)
  8529. +{
  8530. + struct cmd_obj* ph2c;
  8531. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  8532. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8533. + u8 res=_SUCCESS;
  8534. +
  8535. +_func_enter_;
  8536. +
  8537. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8538. + if(ph2c==NULL){
  8539. + res= _FAIL;
  8540. + goto exit;
  8541. + }
  8542. +
  8543. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  8544. + if(pdrvextra_cmd_parm==NULL){
  8545. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  8546. + res= _FAIL;
  8547. + goto exit;
  8548. + }
  8549. +
  8550. + pdrvextra_cmd_parm->ec_id = RESET_SECURITYPRIV;
  8551. + pdrvextra_cmd_parm->type_size = 0;
  8552. + pdrvextra_cmd_parm->pbuf = (u8 *)padapter;
  8553. +
  8554. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  8555. +
  8556. +
  8557. + //rtw_enqueue_cmd(pcmdpriv, ph2c);
  8558. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8559. +
  8560. +exit:
  8561. +
  8562. +_func_exit_;
  8563. +
  8564. + return res;
  8565. +
  8566. +}
  8567. +
  8568. +u8 rtw_free_assoc_resources_cmd(_adapter*padapter)
  8569. +{
  8570. + struct cmd_obj* ph2c;
  8571. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  8572. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8573. + u8 res=_SUCCESS;
  8574. +
  8575. +_func_enter_;
  8576. +
  8577. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8578. + if(ph2c==NULL){
  8579. + res= _FAIL;
  8580. + goto exit;
  8581. + }
  8582. +
  8583. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  8584. + if(pdrvextra_cmd_parm==NULL){
  8585. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  8586. + res= _FAIL;
  8587. + goto exit;
  8588. + }
  8589. +
  8590. + pdrvextra_cmd_parm->ec_id = FREE_ASSOC_RESOURCES;
  8591. + pdrvextra_cmd_parm->type_size = 0;
  8592. + pdrvextra_cmd_parm->pbuf = (u8 *)padapter;
  8593. +
  8594. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  8595. +
  8596. +
  8597. + //rtw_enqueue_cmd(pcmdpriv, ph2c);
  8598. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8599. +
  8600. +exit:
  8601. +
  8602. +_func_exit_;
  8603. +
  8604. + return res;
  8605. +
  8606. +}
  8607. +
  8608. +
  8609. +u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter)
  8610. +{
  8611. + struct cmd_obj* ph2c;
  8612. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  8613. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  8614. + u8 res=_SUCCESS;
  8615. +
  8616. +_func_enter_;
  8617. +
  8618. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
  8619. + goto exit;
  8620. +
  8621. +
  8622. +#ifdef CONFIG_CONCURRENT_MODE
  8623. + if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)
  8624. + pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);
  8625. +#endif
  8626. +
  8627. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8628. + if(ph2c==NULL){
  8629. + res= _FAIL;
  8630. + goto exit;
  8631. + }
  8632. +
  8633. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  8634. + if(pdrvextra_cmd_parm==NULL){
  8635. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  8636. + res= _FAIL;
  8637. + goto exit;
  8638. + }
  8639. +
  8640. + pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID;
  8641. + pdrvextra_cmd_parm->type_size = 0;
  8642. + pdrvextra_cmd_parm->pbuf = (u8 *)padapter;
  8643. +
  8644. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  8645. +
  8646. +
  8647. + //rtw_enqueue_cmd(pcmdpriv, ph2c);
  8648. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  8649. +
  8650. +exit:
  8651. +
  8652. +_func_exit_;
  8653. +
  8654. + return res;
  8655. +
  8656. +}
  8657. +
  8658. +u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)
  8659. +{
  8660. + struct cmd_obj *pcmdobj;
  8661. + struct set_ch_parm *set_ch_parm;
  8662. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8663. +
  8664. + u8 res=_SUCCESS;
  8665. +
  8666. +_func_enter_;
  8667. +
  8668. + DBG_871X(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n",
  8669. + FUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset);
  8670. +
  8671. + /* check input parameter */
  8672. +
  8673. + /* prepare cmd parameter */
  8674. + set_ch_parm = (struct set_ch_parm *)rtw_zmalloc(sizeof(*set_ch_parm));
  8675. + if (set_ch_parm == NULL) {
  8676. + res= _FAIL;
  8677. + goto exit;
  8678. + }
  8679. + set_ch_parm->ch = ch;
  8680. + set_ch_parm->bw = bw;
  8681. + set_ch_parm->ch_offset = ch_offset;
  8682. +
  8683. + if (enqueue) {
  8684. + /* need enqueue, prepare cmd_obj and enqueue */
  8685. + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8686. + if(pcmdobj == NULL){
  8687. + rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
  8688. + res=_FAIL;
  8689. + goto exit;
  8690. + }
  8691. +
  8692. + init_h2fwcmd_w_parm_no_rsp(pcmdobj, set_ch_parm, GEN_CMD_CODE(_SetChannel));
  8693. + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
  8694. + } else {
  8695. + /* no need to enqueue, do the cmd hdl directly and free cmd parameter */
  8696. + if( H2C_SUCCESS !=set_ch_hdl(padapter, (u8 *)set_ch_parm) )
  8697. + res = _FAIL;
  8698. +
  8699. + rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
  8700. + }
  8701. +
  8702. + /* do something based on res... */
  8703. +
  8704. +exit:
  8705. +
  8706. + DBG_871X(FUNC_NDEV_FMT" res:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), res);
  8707. +
  8708. +_func_exit_;
  8709. +
  8710. + return res;
  8711. +}
  8712. +
  8713. +u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue)
  8714. +{
  8715. + struct cmd_obj* pcmdobj;
  8716. + struct SetChannelPlan_param *setChannelPlan_param;
  8717. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8718. +
  8719. + u8 res=_SUCCESS;
  8720. +
  8721. +_func_enter_;
  8722. +
  8723. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_chplan_cmd\n"));
  8724. +
  8725. + //check input parameter
  8726. + if(!rtw_is_channel_plan_valid(chplan)) {
  8727. + res = _FAIL;
  8728. + goto exit;
  8729. + }
  8730. +
  8731. + //prepare cmd parameter
  8732. + setChannelPlan_param = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(struct SetChannelPlan_param));
  8733. + if(setChannelPlan_param == NULL) {
  8734. + res= _FAIL;
  8735. + goto exit;
  8736. + }
  8737. + setChannelPlan_param->channel_plan=chplan;
  8738. +
  8739. + if(enqueue)
  8740. + {
  8741. + //need enqueue, prepare cmd_obj and enqueue
  8742. + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8743. + if(pcmdobj == NULL){
  8744. + rtw_mfree((u8 *)setChannelPlan_param, sizeof(struct SetChannelPlan_param));
  8745. + res=_FAIL;
  8746. + goto exit;
  8747. + }
  8748. +
  8749. + init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan));
  8750. + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
  8751. + }
  8752. + else
  8753. + {
  8754. + //no need to enqueue, do the cmd hdl directly and free cmd parameter
  8755. + if( H2C_SUCCESS !=set_chplan_hdl(padapter, (unsigned char *)setChannelPlan_param) )
  8756. + res = _FAIL;
  8757. +
  8758. + rtw_mfree((u8 *)setChannelPlan_param, sizeof(struct SetChannelPlan_param));
  8759. + }
  8760. +
  8761. + //do something based on res...
  8762. + if(res == _SUCCESS)
  8763. + padapter->mlmepriv.ChannelPlan = chplan;
  8764. +
  8765. +exit:
  8766. +
  8767. +_func_exit_;
  8768. +
  8769. + return res;
  8770. +}
  8771. +
  8772. +u8 rtw_led_blink_cmd(_adapter*padapter, PLED_871x pLed)
  8773. +{
  8774. + struct cmd_obj* pcmdobj;
  8775. + struct LedBlink_param *ledBlink_param;
  8776. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8777. +
  8778. + u8 res=_SUCCESS;
  8779. +
  8780. +_func_enter_;
  8781. +
  8782. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_led_blink_cmd\n"));
  8783. +
  8784. + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8785. + if(pcmdobj == NULL){
  8786. + res=_FAIL;
  8787. + goto exit;
  8788. + }
  8789. +
  8790. + ledBlink_param = (struct LedBlink_param *)rtw_zmalloc(sizeof(struct LedBlink_param));
  8791. + if(ledBlink_param == NULL) {
  8792. + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
  8793. + res= _FAIL;
  8794. + goto exit;
  8795. + }
  8796. +
  8797. + ledBlink_param->pLed=pLed;
  8798. +
  8799. + init_h2fwcmd_w_parm_no_rsp(pcmdobj, ledBlink_param, GEN_CMD_CODE(_LedBlink));
  8800. + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
  8801. +
  8802. +exit:
  8803. +
  8804. +_func_exit_;
  8805. +
  8806. + return res;
  8807. +}
  8808. +
  8809. +u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no)
  8810. +{
  8811. + struct cmd_obj* pcmdobj;
  8812. + struct SetChannelSwitch_param*setChannelSwitch_param;
  8813. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  8814. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8815. +
  8816. + u8 res=_SUCCESS;
  8817. +
  8818. +_func_enter_;
  8819. +
  8820. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_csa_cmd\n"));
  8821. +
  8822. + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8823. + if(pcmdobj == NULL){
  8824. + res=_FAIL;
  8825. + goto exit;
  8826. + }
  8827. +
  8828. + setChannelSwitch_param = (struct SetChannelSwitch_param *)rtw_zmalloc(sizeof(struct SetChannelSwitch_param));
  8829. + if(setChannelSwitch_param == NULL) {
  8830. + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
  8831. + res= _FAIL;
  8832. + goto exit;
  8833. + }
  8834. +
  8835. + setChannelSwitch_param->new_ch_no=new_ch_no;
  8836. +
  8837. + init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelSwitch_param, GEN_CMD_CODE(_SetChannelSwitch));
  8838. + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
  8839. +
  8840. +exit:
  8841. +
  8842. +_func_exit_;
  8843. +
  8844. + return res;
  8845. +}
  8846. +
  8847. +u8 rtw_tdls_cmd(_adapter *padapter, u8 *addr, u8 option)
  8848. +{
  8849. + struct cmd_obj* pcmdobj;
  8850. + struct TDLSoption_param *TDLSoption;
  8851. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  8852. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  8853. +
  8854. + u8 res=_SUCCESS;
  8855. +
  8856. +_func_enter_;
  8857. +
  8858. +#ifdef CONFIG_TDLS
  8859. +
  8860. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_tdls_cmd\n"));
  8861. +
  8862. + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  8863. + if(pcmdobj == NULL){
  8864. + res=_FAIL;
  8865. + goto exit;
  8866. + }
  8867. +
  8868. + TDLSoption= (struct TDLSoption_param *)rtw_zmalloc(sizeof(struct TDLSoption_param));
  8869. + if(TDLSoption == NULL) {
  8870. + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
  8871. + res= _FAIL;
  8872. + goto exit;
  8873. + }
  8874. +
  8875. + _rtw_spinlock(&(padapter->tdlsinfo.cmd_lock));
  8876. + _rtw_memcpy(TDLSoption->addr, addr, 6);
  8877. + TDLSoption->option = option;
  8878. + _rtw_spinunlock(&(padapter->tdlsinfo.cmd_lock));
  8879. + init_h2fwcmd_w_parm_no_rsp(pcmdobj, TDLSoption, GEN_CMD_CODE(_TDLS));
  8880. + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
  8881. +
  8882. +#endif //CONFIG_TDLS
  8883. +
  8884. +exit:
  8885. +
  8886. +
  8887. +_func_exit_;
  8888. +
  8889. + return res;
  8890. +}
  8891. +
  8892. +static void traffic_status_watchdog(_adapter *padapter)
  8893. +{
  8894. +#ifdef CONFIG_LPS
  8895. + u8 bEnterPS;
  8896. +#endif
  8897. + u16 BusyThreshold = 100;
  8898. + u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;
  8899. + u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;
  8900. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  8901. +#ifdef CONFIG_TDLS
  8902. + struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);
  8903. +#endif //CONFIG_TDLS
  8904. +
  8905. + RT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo;
  8906. +
  8907. + //
  8908. + // Determine if our traffic is busy now
  8909. + //
  8910. + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  8911. + /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
  8912. + {
  8913. +
  8914. + // if we raise bBusyTraffic in last watchdog, using lower threshold.
  8915. + if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
  8916. + BusyThreshold = 75;
  8917. + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||
  8918. + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )
  8919. + {
  8920. + bBusyTraffic = _TRUE;
  8921. +
  8922. + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold)
  8923. + bRxBusyTraffic = _TRUE;
  8924. +
  8925. + if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold)
  8926. + bTxBusyTraffic = _TRUE;
  8927. + }
  8928. +
  8929. + // Higher Tx/Rx data.
  8930. + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 ||
  8931. + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 )
  8932. + {
  8933. + bHigherBusyTraffic = _TRUE;
  8934. +
  8935. + // Extremely high Rx data.
  8936. + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 5000)
  8937. + bHigherBusyRxTraffic = _TRUE;
  8938. +
  8939. + // Extremely high Tx data.
  8940. + if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 5000)
  8941. + bHigherBusyTxTraffic = _TRUE;
  8942. + }
  8943. +
  8944. +#ifdef CONFIG_TRAFFIC_PROTECT
  8945. +#define TX_ACTIVE_TH 2
  8946. +#define RX_ACTIVE_TH 1
  8947. +#define TRAFFIC_PROTECT_PERIOD_MS 4500
  8948. +
  8949. + if (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH
  8950. + || link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) {
  8951. +
  8952. + LOG_LEVEL(_drv_info_, FUNC_ADPT_FMT" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\n",
  8953. + FUNC_ADPT_ARG(padapter),
  8954. + TRAFFIC_PROTECT_PERIOD_MS,
  8955. + link_detect->NumTxOkInPeriod,
  8956. + link_detect->NumRxUnicastOkInPeriod);
  8957. +
  8958. + rtw_lock_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS);
  8959. + }
  8960. +#endif
  8961. +
  8962. +#ifdef CONFIG_TDLS
  8963. +#ifdef CONFIG_TDLS_AUTOSETUP
  8964. + if( ( ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0 ) //TDLS_WATCHDOG_PERIOD * 2sec, periodically sending
  8965. + issue_tdls_dis_req( padapter, NULL );
  8966. + ptdlsinfo->watchdog_count++;
  8967. +#endif //CONFIG_TDLS_AUTOSETUP
  8968. +#endif //CONFIG_TDLS
  8969. +
  8970. +#ifdef CONFIG_LPS
  8971. + // check traffic for powersaving.
  8972. + if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
  8973. + (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
  8974. + {
  8975. + //DBG_871X("Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);
  8976. + bEnterPS= _FALSE;
  8977. + }
  8978. + else
  8979. + {
  8980. + bEnterPS= _TRUE;
  8981. + }
  8982. +
  8983. + // LeisurePS only work in infra mode.
  8984. + if(bEnterPS)
  8985. + {
  8986. + LPS_Enter(padapter);
  8987. + }
  8988. + else
  8989. + {
  8990. + LPS_Leave(padapter);
  8991. + }
  8992. +#endif
  8993. + }
  8994. + else
  8995. + {
  8996. +#ifdef CONFIG_LPS
  8997. + LPS_Leave(padapter);
  8998. +#endif
  8999. + }
  9000. +
  9001. + pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0;
  9002. + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0;
  9003. + pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
  9004. + pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
  9005. + pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic;
  9006. + pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic;
  9007. + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic;
  9008. + pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
  9009. + pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic;
  9010. +
  9011. +}
  9012. +
  9013. +void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz);
  9014. +void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz)
  9015. +{
  9016. + struct mlme_priv *pmlmepriv;
  9017. +
  9018. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
  9019. + return;
  9020. +
  9021. + if((void*)padapter != (void*)pbuf && padapter->pbuddy_adapter == NULL)
  9022. + return;
  9023. +
  9024. + padapter = (_adapter *)pbuf;
  9025. +
  9026. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
  9027. + return;
  9028. +
  9029. + pmlmepriv = &(padapter->mlmepriv);
  9030. +
  9031. +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  9032. +#ifdef CONFIG_AP_MODE
  9033. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  9034. + {
  9035. + expire_timeout_chk(padapter);
  9036. + }
  9037. +#endif
  9038. +#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  9039. +
  9040. + #ifdef DBG_CONFIG_ERROR_DETECT
  9041. + rtw_hal_sreset_xmit_status_check(padapter);
  9042. + #endif
  9043. +
  9044. + //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE)
  9045. + {
  9046. + linked_status_chk(padapter);
  9047. + traffic_status_watchdog(padapter);
  9048. + }
  9049. +
  9050. + rtw_hal_dm_watchdog(padapter);
  9051. +
  9052. + //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size);
  9053. +
  9054. +}
  9055. +
  9056. +#ifdef CONFIG_LPS
  9057. +
  9058. +void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type);
  9059. +void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type)
  9060. +{
  9061. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  9062. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  9063. + u8 mstatus;
  9064. +
  9065. +_func_enter_;
  9066. +
  9067. + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)
  9068. + || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
  9069. + {
  9070. + return;
  9071. + }
  9072. +
  9073. + switch(lps_ctrl_type)
  9074. + {
  9075. + case LPS_CTRL_SCAN:
  9076. + //DBG_871X("LPS_CTRL_SCAN \n");
  9077. + LeaveAllPowerSaveMode(padapter);
  9078. + break;
  9079. + case LPS_CTRL_JOINBSS:
  9080. + //DBG_871X("LPS_CTRL_JOINBSS \n");
  9081. + LPS_Leave(padapter);
  9082. + break;
  9083. + case LPS_CTRL_CONNECT:
  9084. + //DBG_871X("LPS_CTRL_CONNECT \n");
  9085. + mstatus = 1;
  9086. + // Reset LPS Setting
  9087. + padapter->pwrctrlpriv.LpsIdleCount = 0;
  9088. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
  9089. + break;
  9090. + case LPS_CTRL_DISCONNECT:
  9091. + //DBG_871X("LPS_CTRL_DISCONNECT \n");
  9092. + mstatus = 0;
  9093. + LPS_Leave(padapter);
  9094. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
  9095. + break;
  9096. + case LPS_CTRL_SPECIAL_PACKET:
  9097. + //DBG_871X("LPS_CTRL_SPECIAL_PACKET \n");
  9098. + pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time();
  9099. + LPS_Leave(padapter);
  9100. + break;
  9101. +
  9102. + default:
  9103. + break;
  9104. + }
  9105. +
  9106. +_func_exit_;
  9107. +}
  9108. +
  9109. +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue)
  9110. +{
  9111. + struct cmd_obj *ph2c;
  9112. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9113. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9114. + //struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  9115. + u8 res = _SUCCESS;
  9116. +
  9117. +_func_enter_;
  9118. +
  9119. + //if(!pwrctrlpriv->bLeisurePs)
  9120. + // return res;
  9121. +
  9122. +#ifdef CONFIG_CONCURRENT_MODE
  9123. + if (padapter->iface_type != IFACE_PORT0)
  9124. + return res;
  9125. +#endif
  9126. +
  9127. + if(enqueue)
  9128. + {
  9129. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9130. + if(ph2c==NULL){
  9131. + res= _FAIL;
  9132. + goto exit;
  9133. + }
  9134. +
  9135. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9136. + if(pdrvextra_cmd_parm==NULL){
  9137. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  9138. + res= _FAIL;
  9139. + goto exit;
  9140. + }
  9141. +
  9142. + pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID;
  9143. + pdrvextra_cmd_parm->type_size = lps_ctrl_type;
  9144. + pdrvextra_cmd_parm->pbuf = NULL;
  9145. +
  9146. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9147. +
  9148. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  9149. + }
  9150. + else
  9151. + {
  9152. + lps_ctrl_wk_hdl(padapter, lps_ctrl_type);
  9153. + }
  9154. +
  9155. +exit:
  9156. +
  9157. +_func_exit_;
  9158. +
  9159. + return res;
  9160. +
  9161. +}
  9162. +
  9163. +#endif
  9164. +#ifdef CONFIG_ANTENNA_DIVERSITY
  9165. +
  9166. +void antenna_select_wk_hdl(_adapter *padapter, u8 antenna)
  9167. +{
  9168. + rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna));
  9169. +}
  9170. +
  9171. +u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue)
  9172. +{
  9173. + struct cmd_obj *ph2c;
  9174. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9175. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9176. + u8 bSupportAntDiv = _FALSE;
  9177. + u8 res = _SUCCESS;
  9178. +
  9179. +_func_enter_;
  9180. + rtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv));
  9181. + if(_FALSE == bSupportAntDiv ) return res;
  9182. +
  9183. + if(_TRUE == enqueue)
  9184. + {
  9185. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9186. + if(ph2c==NULL){
  9187. + res= _FAIL;
  9188. + goto exit;
  9189. + }
  9190. +
  9191. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9192. + if(pdrvextra_cmd_parm==NULL){
  9193. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  9194. + res= _FAIL;
  9195. + goto exit;
  9196. + }
  9197. +
  9198. + pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID;
  9199. + pdrvextra_cmd_parm->type_size = antenna;
  9200. + pdrvextra_cmd_parm->pbuf = NULL;
  9201. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9202. +
  9203. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  9204. + }
  9205. + else{
  9206. + antenna_select_wk_hdl(padapter,antenna );
  9207. + }
  9208. +exit:
  9209. +
  9210. +_func_exit_;
  9211. +
  9212. + return res;
  9213. +
  9214. +}
  9215. +#endif
  9216. +
  9217. +void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz);
  9218. +void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz)
  9219. +{
  9220. + rtw_ps_processor(padapter);
  9221. +}
  9222. +
  9223. +//add for CONFIG_IEEE80211W, none 11w can use it
  9224. +void reset_securitypriv_hdl(_adapter *padapter)
  9225. +{
  9226. + rtw_reset_securitypriv(padapter);
  9227. +}
  9228. +
  9229. +void free_assoc_resources_hdl(_adapter *padapter)
  9230. +{
  9231. + rtw_free_assoc_resources(padapter, 1);
  9232. +}
  9233. +
  9234. +#ifdef CONFIG_P2P
  9235. +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType )
  9236. +{
  9237. + struct cmd_obj *ph2c;
  9238. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9239. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  9240. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9241. + u8 res = _SUCCESS;
  9242. +
  9243. +_func_enter_;
  9244. +
  9245. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  9246. + {
  9247. + return res;
  9248. + }
  9249. +
  9250. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9251. + if(ph2c==NULL){
  9252. + res= _FAIL;
  9253. + goto exit;
  9254. + }
  9255. +
  9256. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9257. + if(pdrvextra_cmd_parm==NULL){
  9258. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  9259. + res= _FAIL;
  9260. + goto exit;
  9261. + }
  9262. +
  9263. + pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;
  9264. + pdrvextra_cmd_parm->type_size = intCmdType; // As the command tppe.
  9265. + pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here
  9266. +
  9267. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9268. +
  9269. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  9270. +
  9271. +exit:
  9272. +
  9273. +_func_exit_;
  9274. +
  9275. + return res;
  9276. +
  9277. +}
  9278. +#endif //CONFIG_P2P
  9279. +
  9280. +u8 rtw_ps_cmd(_adapter*padapter)
  9281. +{
  9282. + struct cmd_obj *ppscmd;
  9283. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9284. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9285. +
  9286. + u8 res = _SUCCESS;
  9287. +_func_enter_;
  9288. +
  9289. +#ifdef CONFIG_CONCURRENT_MODE
  9290. + if (padapter->adapter_type != PRIMARY_ADAPTER)
  9291. + goto exit;
  9292. +#endif
  9293. +
  9294. + ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9295. + if(ppscmd==NULL){
  9296. + res= _FAIL;
  9297. + goto exit;
  9298. + }
  9299. +
  9300. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9301. + if(pdrvextra_cmd_parm==NULL){
  9302. + rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj));
  9303. + res= _FAIL;
  9304. + goto exit;
  9305. + }
  9306. +
  9307. + pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID;
  9308. + pdrvextra_cmd_parm->pbuf = NULL;
  9309. + init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9310. +
  9311. + res = rtw_enqueue_cmd(pcmdpriv, ppscmd);
  9312. +
  9313. +exit:
  9314. +
  9315. +_func_exit_;
  9316. +
  9317. + return res;
  9318. +
  9319. +}
  9320. +
  9321. +#ifdef CONFIG_AP_MODE
  9322. +
  9323. +static void rtw_chk_hi_queue_hdl(_adapter *padapter)
  9324. +{
  9325. + int cnt=0;
  9326. + struct sta_info *psta_bmc;
  9327. + struct sta_priv *pstapriv = &padapter->stapriv;
  9328. +
  9329. + psta_bmc = rtw_get_bcmc_stainfo(padapter);
  9330. + if(!psta_bmc)
  9331. + return;
  9332. +
  9333. +
  9334. + if(psta_bmc->sleepq_len==0)
  9335. + {
  9336. + while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0)
  9337. + {
  9338. + rtw_msleep_os(100);
  9339. +
  9340. + cnt++;
  9341. +
  9342. + if(cnt>10)
  9343. + break;
  9344. + }
  9345. +
  9346. + if(cnt<=10)
  9347. + {
  9348. + pstapriv->tim_bitmap &= ~BIT(0);
  9349. + pstapriv->sta_dz_bitmap &= ~BIT(0);
  9350. +
  9351. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  9352. + }
  9353. + }
  9354. +
  9355. +}
  9356. +
  9357. +u8 rtw_chk_hi_queue_cmd(_adapter*padapter)
  9358. +{
  9359. + struct cmd_obj *ph2c;
  9360. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9361. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9362. + u8 res = _SUCCESS;
  9363. +
  9364. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9365. + if(ph2c==NULL){
  9366. + res= _FAIL;
  9367. + goto exit;
  9368. + }
  9369. +
  9370. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9371. + if(pdrvextra_cmd_parm==NULL){
  9372. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  9373. + res= _FAIL;
  9374. + goto exit;
  9375. + }
  9376. +
  9377. + pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID;
  9378. + pdrvextra_cmd_parm->type_size = 0;
  9379. + pdrvextra_cmd_parm->pbuf = NULL;
  9380. +
  9381. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9382. +
  9383. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  9384. +
  9385. +exit:
  9386. +
  9387. + return res;
  9388. +
  9389. +}
  9390. +#endif
  9391. +
  9392. +u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt)
  9393. +{
  9394. + struct cmd_obj *ph2c;
  9395. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  9396. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  9397. + u8 res = _SUCCESS;
  9398. +
  9399. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  9400. + if (ph2c == NULL) {
  9401. + res = _FAIL;
  9402. + goto exit;
  9403. + }
  9404. +
  9405. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  9406. + if (pdrvextra_cmd_parm == NULL) {
  9407. + rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
  9408. + res = _FAIL;
  9409. + goto exit;
  9410. + }
  9411. +
  9412. + pdrvextra_cmd_parm->ec_id = C2H_WK_CID;
  9413. + pdrvextra_cmd_parm->type_size = c2h_evt?16:0;
  9414. + pdrvextra_cmd_parm->pbuf = c2h_evt;
  9415. +
  9416. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  9417. +
  9418. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  9419. +
  9420. +exit:
  9421. +
  9422. + return res;
  9423. +}
  9424. +
  9425. +s32 c2h_evt_hdl(_adapter *adapter, struct c2h_evt_hdr *c2h_evt, c2h_id_filter filter)
  9426. +{
  9427. + s32 ret = _FAIL;
  9428. + u8 buf[16];
  9429. +
  9430. + if (!c2h_evt) {
  9431. + /* No c2h event in cmd_obj, read c2h event before handling*/
  9432. + if (c2h_evt_read(adapter, buf) == _SUCCESS) {
  9433. + c2h_evt = (struct c2h_evt_hdr *)buf;
  9434. +
  9435. + if (filter && filter(c2h_evt->id) == _FALSE)
  9436. + goto exit;
  9437. +
  9438. + ret = rtw_hal_c2h_handler(adapter, c2h_evt);
  9439. + }
  9440. + } else {
  9441. +
  9442. + if (filter && filter(c2h_evt->id) == _FALSE)
  9443. + goto exit;
  9444. +
  9445. + ret = rtw_hal_c2h_handler(adapter, c2h_evt);
  9446. + }
  9447. +exit:
  9448. + return ret;
  9449. +}
  9450. +
  9451. +#ifdef CONFIG_C2H_WK
  9452. +static void c2h_wk_callback(_workitem *work)
  9453. +{
  9454. + struct evt_priv *evtpriv = container_of(work, struct evt_priv, c2h_wk);
  9455. + _adapter *adapter = container_of(evtpriv, _adapter, evtpriv);
  9456. + struct c2h_evt_hdr *c2h_evt;
  9457. + c2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(adapter);
  9458. +
  9459. + evtpriv->c2h_wk_alive = _TRUE;
  9460. +
  9461. + while (!rtw_cbuf_empty(evtpriv->c2h_queue)) {
  9462. + if ((c2h_evt = (struct c2h_evt_hdr *)rtw_cbuf_pop(evtpriv->c2h_queue)) != NULL) {
  9463. + /* This C2H event is read, clear it */
  9464. + c2h_evt_clear(adapter);
  9465. + } else if ((c2h_evt = (struct c2h_evt_hdr *)rtw_malloc(16)) != NULL) {
  9466. + /* This C2H event is not read, read & clear now */
  9467. + if (c2h_evt_read(adapter, (u8*)c2h_evt) != _SUCCESS)
  9468. + continue;
  9469. + }
  9470. +
  9471. + /* Special pointer to trigger c2h_evt_clear only */
  9472. + if ((void *)c2h_evt == (void *)evtpriv)
  9473. + continue;
  9474. +
  9475. + if (!c2h_evt_exist(c2h_evt)) {
  9476. + rtw_mfree((u8*)c2h_evt, 16);
  9477. + continue;
  9478. + }
  9479. +
  9480. + if (ccx_id_filter(c2h_evt->id) == _TRUE) {
  9481. + /* Handle CCX report here */
  9482. + rtw_hal_c2h_handler(adapter, c2h_evt);
  9483. + rtw_mfree((u8*)c2h_evt, 16);
  9484. + } else {
  9485. + /* Enqueue into cmd_thread for others */
  9486. + rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt);
  9487. + }
  9488. + }
  9489. +
  9490. + evtpriv->c2h_wk_alive = _FALSE;
  9491. +}
  9492. +#endif
  9493. +
  9494. +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
  9495. +{
  9496. + struct drvextra_cmd_parm *pdrvextra_cmd;
  9497. +
  9498. + if(!pbuf)
  9499. + return H2C_PARAMETERS_ERROR;
  9500. +
  9501. + pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf;
  9502. +
  9503. + switch(pdrvextra_cmd->ec_id)
  9504. + {
  9505. + case DYNAMIC_CHK_WK_CID:
  9506. + dynamic_chk_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size);
  9507. + break;
  9508. + case POWER_SAVING_CTRL_WK_CID:
  9509. + power_saving_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size);
  9510. + break;
  9511. +#ifdef CONFIG_LPS
  9512. + case LPS_CTRL_WK_CID:
  9513. + lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size);
  9514. + break;
  9515. +#endif
  9516. +#ifdef CONFIG_ANTENNA_DIVERSITY
  9517. + case ANT_SELECT_WK_CID:
  9518. + antenna_select_wk_hdl(padapter, pdrvextra_cmd->type_size);
  9519. + break;
  9520. +#endif
  9521. +#ifdef CONFIG_P2P_PS
  9522. + case P2P_PS_WK_CID:
  9523. + p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size);
  9524. + break;
  9525. +#endif // CONFIG_P2P_PS
  9526. + case P2P_PROTO_WK_CID:
  9527. + // Commented by Albert 2011/07/01
  9528. + // I used the type_size as the type command
  9529. + p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type_size );
  9530. + break;
  9531. +#ifdef CONFIG_AP_MODE
  9532. + case CHECK_HIQ_WK_CID:
  9533. + rtw_chk_hi_queue_hdl(padapter);
  9534. + break;
  9535. +#endif //CONFIG_AP_MODE
  9536. +#ifdef CONFIG_INTEL_WIDI
  9537. + case INTEl_WIDI_WK_CID:
  9538. + intel_widi_wk_hdl(padapter, pdrvextra_cmd->type_size, pdrvextra_cmd->pbuf);
  9539. + break;
  9540. +#endif //CONFIG_INTEL_WIDI
  9541. + //add for CONFIG_IEEE80211W, none 11w can use it
  9542. + case RESET_SECURITYPRIV:
  9543. + reset_securitypriv_hdl(padapter);
  9544. + break;
  9545. + case FREE_ASSOC_RESOURCES:
  9546. + free_assoc_resources_hdl(padapter);
  9547. + break;
  9548. + case C2H_WK_CID:
  9549. + c2h_evt_hdl(padapter, (struct c2h_evt_hdr *)pdrvextra_cmd->pbuf, NULL);
  9550. + break;
  9551. +
  9552. + default:
  9553. + break;
  9554. + }
  9555. +
  9556. +
  9557. + if(pdrvextra_cmd->pbuf && pdrvextra_cmd->type_size>0)
  9558. + {
  9559. + rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size);
  9560. + }
  9561. +
  9562. +
  9563. + return H2C_SUCCESS;
  9564. +
  9565. +}
  9566. +
  9567. +void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd)
  9568. +{
  9569. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  9570. +
  9571. +_func_enter_;
  9572. +
  9573. + if(pcmd->res == H2C_DROPPED)
  9574. + {
  9575. + //TODO: cancel timer and do timeout handler directly...
  9576. + //need to make timeout handlerOS independent
  9577. + _set_timer(&pmlmepriv->scan_to_timer, 1);
  9578. + }
  9579. + else if (pcmd->res != H2C_SUCCESS) {
  9580. + _set_timer(&pmlmepriv->scan_to_timer, 1);
  9581. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n."));
  9582. + }
  9583. +
  9584. + // free cmd
  9585. + rtw_free_cmd_obj(pcmd);
  9586. +
  9587. +_func_exit_;
  9588. +}
  9589. +void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd)
  9590. +{
  9591. + _irqL irqL;
  9592. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  9593. +
  9594. +_func_enter_;
  9595. +
  9596. + if (pcmd->res != H2C_SUCCESS)
  9597. + {
  9598. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  9599. + set_fwstate(pmlmepriv, _FW_LINKED);
  9600. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  9601. +
  9602. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n."));
  9603. +
  9604. + goto exit;
  9605. + }
  9606. +#ifdef CONFIG_BR_EXT
  9607. + else //clear bridge database
  9608. + nat25_db_cleanup(padapter);
  9609. +#endif //CONFIG_BR_EXT
  9610. +
  9611. + // free cmd
  9612. + rtw_free_cmd_obj(pcmd);
  9613. +
  9614. +exit:
  9615. +
  9616. +_func_exit_;
  9617. +}
  9618. +
  9619. +
  9620. +void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd)
  9621. +{
  9622. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  9623. +
  9624. +_func_enter_;
  9625. +
  9626. + if(pcmd->res == H2C_DROPPED)
  9627. + {
  9628. + //TODO: cancel timer and do timeout handler directly...
  9629. + //need to make timeout handlerOS independent
  9630. + _set_timer(&pmlmepriv->assoc_timer, 1);
  9631. + }
  9632. + else if(pcmd->res != H2C_SUCCESS)
  9633. + {
  9634. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("********Error:rtw_select_and_join_from_scanned_queue Wait Sema Fail ************\n"));
  9635. + _set_timer(&pmlmepriv->assoc_timer, 1);
  9636. + }
  9637. +
  9638. + rtw_free_cmd_obj(pcmd);
  9639. +
  9640. +_func_exit_;
  9641. +}
  9642. +
  9643. +void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd)
  9644. +{
  9645. + _irqL irqL;
  9646. + u8 timer_cancelled;
  9647. + struct sta_info *psta = NULL;
  9648. + struct wlan_network *pwlan = NULL;
  9649. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  9650. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)pcmd->parmbuf;
  9651. + struct wlan_network *tgt_network = &(pmlmepriv->cur_network);
  9652. +
  9653. +_func_enter_;
  9654. +
  9655. + if((pcmd->res != H2C_SUCCESS))
  9656. + {
  9657. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: rtw_createbss_cmd_callback Fail ************\n\n."));
  9658. + _set_timer(&pmlmepriv->assoc_timer, 1 );
  9659. + }
  9660. +
  9661. + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);
  9662. +
  9663. +#ifdef CONFIG_FW_MLMLE
  9664. + //endian_convert
  9665. + pnetwork->Length = le32_to_cpu(pnetwork->Length);
  9666. + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);
  9667. + pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy);
  9668. + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
  9669. + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse);
  9670. + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow);
  9671. + //pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod);
  9672. + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig);
  9673. + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
  9674. + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
  9675. + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
  9676. + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
  9677. + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length);
  9678. + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode);
  9679. + pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
  9680. +#endif
  9681. +
  9682. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  9683. +
  9684. +
  9685. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) )
  9686. + {
  9687. + psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress);
  9688. + if(!psta)
  9689. + {
  9690. + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress);
  9691. + if (psta == NULL)
  9692. + {
  9693. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n"));
  9694. + goto createbss_cmd_fail ;
  9695. + }
  9696. + }
  9697. +
  9698. + rtw_indicate_connect( padapter);
  9699. + }
  9700. + else
  9701. + {
  9702. + _irqL irqL;
  9703. +
  9704. + pwlan = _rtw_alloc_network(pmlmepriv);
  9705. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  9706. + if ( pwlan == NULL)
  9707. + {
  9708. + pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue);
  9709. + if( pwlan == NULL)
  9710. + {
  9711. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in rtw_joinbss_event_callback \n"));
  9712. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  9713. + goto createbss_cmd_fail;
  9714. + }
  9715. + pwlan->last_scanned = rtw_get_current_time();
  9716. + }
  9717. + else
  9718. + {
  9719. + rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);
  9720. + }
  9721. +
  9722. + pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork);
  9723. + _rtw_memcpy(&(pwlan->network), pnetwork, pnetwork->Length);
  9724. + //pwlan->fixed = _TRUE;
  9725. +
  9726. + //rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);
  9727. +
  9728. + // copy pdev_network information to pmlmepriv->cur_network
  9729. + _rtw_memcpy(&tgt_network->network, pnetwork, (get_WLAN_BSSID_EX_sz(pnetwork)));
  9730. +
  9731. + // reset DSConfig
  9732. + //tgt_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pnetwork->Configuration.DSConfig);
  9733. +
  9734. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  9735. +
  9736. +#if 0
  9737. + if((pmlmepriv->fw_state) & WIFI_AP_STATE)
  9738. + {
  9739. + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress);
  9740. +
  9741. + if (psta == NULL) { // for AP Mode & Adhoc Master Mode
  9742. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n"));
  9743. + goto createbss_cmd_fail ;
  9744. + }
  9745. +
  9746. + rtw_indicate_connect( padapter);
  9747. + }
  9748. + else {
  9749. +
  9750. + //rtw_indicate_disconnect(dev);
  9751. + }
  9752. +#endif
  9753. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  9754. + // we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback)
  9755. +
  9756. + }
  9757. +
  9758. +createbss_cmd_fail:
  9759. +
  9760. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  9761. +
  9762. + rtw_free_cmd_obj(pcmd);
  9763. +
  9764. +_func_exit_;
  9765. +
  9766. +}
  9767. +
  9768. +
  9769. +
  9770. +void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd)
  9771. +{
  9772. +
  9773. + struct sta_priv * pstapriv = &padapter->stapriv;
  9774. + struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp);
  9775. + struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr);
  9776. +
  9777. +_func_enter_;
  9778. +
  9779. + if(psta==NULL)
  9780. + {
  9781. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n"));
  9782. + goto exit;
  9783. + }
  9784. +
  9785. + //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY)
  9786. +
  9787. +exit:
  9788. +
  9789. + rtw_free_cmd_obj(pcmd);
  9790. +
  9791. +_func_exit_;
  9792. +
  9793. +}
  9794. +void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
  9795. +{
  9796. + _irqL irqL;
  9797. + struct sta_priv * pstapriv = &padapter->stapriv;
  9798. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  9799. + struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf);
  9800. + struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp);
  9801. + struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr);
  9802. +
  9803. +_func_enter_;
  9804. +
  9805. + if(psta==NULL)
  9806. + {
  9807. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n"));
  9808. + goto exit;
  9809. + }
  9810. +
  9811. + psta->aid = psta->mac_id = passocsta_rsp->cam_id;
  9812. +
  9813. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  9814. +
  9815. + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE))
  9816. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  9817. +
  9818. + set_fwstate(pmlmepriv, _FW_LINKED);
  9819. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  9820. +
  9821. +exit:
  9822. + rtw_free_cmd_obj(pcmd);
  9823. +
  9824. +_func_exit_;
  9825. +}
  9826. +
  9827. +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd);
  9828. +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
  9829. +{
  9830. +_func_enter_;
  9831. +
  9832. + rtw_free_cmd_obj(pcmd);
  9833. +#ifdef CONFIG_MP_INCLUDED
  9834. + padapter->mppriv.workparam.bcompleted=_TRUE;
  9835. +#endif
  9836. +
  9837. +_func_exit_;
  9838. +
  9839. +}
  9840. --- /dev/null
  9841. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_debug.c
  9842. @@ -0,0 +1,1336 @@
  9843. +/******************************************************************************
  9844. + *
  9845. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  9846. + *
  9847. + * This program is free software; you can redistribute it and/or modify it
  9848. + * under the terms of version 2 of the GNU General Public License as
  9849. + * published by the Free Software Foundation.
  9850. + *
  9851. + * This program is distributed in the hope that it will be useful, but WITHOUT
  9852. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9853. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  9854. + * more details.
  9855. + *
  9856. + * You should have received a copy of the GNU General Public License along with
  9857. + * this program; if not, write to the Free Software Foundation, Inc.,
  9858. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  9859. + *
  9860. + *
  9861. + ******************************************************************************/
  9862. +#define _RTW_DEBUG_C_
  9863. +
  9864. +
  9865. +#include <rtw_debug.h>
  9866. +#include <../hal/dm.h>
  9867. +
  9868. +//#ifdef CONFIG_DEBUG_RTL871X
  9869. +
  9870. + u32 GlobalDebugLevel = _drv_err_;
  9871. +
  9872. + u64 GlobalDebugComponents = \
  9873. + _module_rtl871x_xmit_c_ |
  9874. + _module_xmit_osdep_c_ |
  9875. + _module_rtl871x_recv_c_ |
  9876. + _module_recv_osdep_c_ |
  9877. + _module_rtl871x_mlme_c_ |
  9878. + _module_mlme_osdep_c_ |
  9879. + _module_rtl871x_sta_mgt_c_ |
  9880. + _module_rtl871x_cmd_c_ |
  9881. + _module_cmd_osdep_c_ |
  9882. + _module_rtl871x_io_c_ |
  9883. + _module_io_osdep_c_ |
  9884. + _module_os_intfs_c_|
  9885. + _module_rtl871x_security_c_|
  9886. + _module_rtl871x_eeprom_c_|
  9887. + _module_hal_init_c_|
  9888. + _module_hci_hal_init_c_|
  9889. + _module_rtl871x_ioctl_c_|
  9890. + _module_rtl871x_ioctl_set_c_|
  9891. + _module_rtl871x_ioctl_query_c_|
  9892. + _module_rtl871x_pwrctrl_c_|
  9893. + _module_hci_intfs_c_|
  9894. + _module_hci_ops_c_|
  9895. + _module_hci_ops_os_c_|
  9896. + _module_rtl871x_ioctl_os_c|
  9897. + _module_rtl8712_cmd_c_|
  9898. + _module_hal_xmit_c_|
  9899. + _module_rtl8712_recv_c_ |
  9900. + _module_mp_ |
  9901. + _module_efuse_;
  9902. +
  9903. +//#endif
  9904. +
  9905. +#ifdef CONFIG_PROC_DEBUG
  9906. +#include <rtw_version.h>
  9907. +
  9908. +int proc_get_drv_version(char *page, char **start,
  9909. + off_t offset, int count,
  9910. + int *eof, void *data)
  9911. +{
  9912. + struct net_device *dev = data;
  9913. +
  9914. + int len = 0;
  9915. +
  9916. + len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION);
  9917. +
  9918. + *eof = 1;
  9919. + return len;
  9920. +}
  9921. +
  9922. +int proc_get_log_level(char *page, char **start,
  9923. + off_t offset, int count,
  9924. + int *eof, void *data)
  9925. +{
  9926. + struct net_device *dev = data;
  9927. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  9928. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  9929. +
  9930. + int len = 0;
  9931. +
  9932. + len += snprintf(page + len, count - len,
  9933. + "log_level:%d\n",
  9934. + GlobalDebugLevel
  9935. + );
  9936. +
  9937. + *eof = 1;
  9938. + return len;
  9939. +}
  9940. +
  9941. +int proc_set_log_level(struct file *file, const char *buffer,
  9942. + unsigned long count, void *data)
  9943. +{
  9944. + struct net_device *dev = (struct net_device *)data;
  9945. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  9946. + char tmp[32];
  9947. + u32 is_signal_dbg;
  9948. +
  9949. + if (count < 1)
  9950. + return -EFAULT;
  9951. +
  9952. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  9953. +
  9954. + int num = sscanf(tmp, "%d ", &is_signal_dbg);
  9955. +
  9956. + if( is_signal_dbg >= 0 && is_signal_dbg < 10 )
  9957. + {
  9958. + GlobalDebugLevel= is_signal_dbg;
  9959. + printk("%d\n", GlobalDebugLevel);
  9960. + }
  9961. + }
  9962. +
  9963. + return count;
  9964. +
  9965. +}
  9966. +
  9967. +#ifdef DBG_MEM_ALLOC
  9968. +int proc_get_mstat(char *page, char **start,
  9969. + off_t offset, int count,
  9970. + int *eof, void *data)
  9971. +{
  9972. + int len = 0;
  9973. +
  9974. + len += _rtw_mstat_dump(page+len, count-len);
  9975. + *eof = 1;
  9976. +
  9977. + return len;
  9978. +}
  9979. +#endif /* DBG_MEM_ALLOC */
  9980. +
  9981. +int proc_get_write_reg(char *page, char **start,
  9982. + off_t offset, int count,
  9983. + int *eof, void *data)
  9984. +{
  9985. + *eof = 1;
  9986. + return 0;
  9987. +}
  9988. +
  9989. +int proc_set_write_reg(struct file *file, const char *buffer,
  9990. + unsigned long count, void *data)
  9991. +{
  9992. + struct net_device *dev = (struct net_device *)data;
  9993. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  9994. + char tmp[32];
  9995. + u32 addr, val, len;
  9996. +
  9997. + if (count < 3)
  9998. + {
  9999. + DBG_871X("argument size is less than 3\n");
  10000. + return -EFAULT;
  10001. + }
  10002. +
  10003. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10004. +
  10005. + int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
  10006. +
  10007. + if (num != 3) {
  10008. + DBG_871X("invalid write_reg parameter!\n");
  10009. + return count;
  10010. + }
  10011. +
  10012. + switch(len)
  10013. + {
  10014. + case 1:
  10015. + rtw_write8(padapter, addr, (u8)val);
  10016. + break;
  10017. + case 2:
  10018. + rtw_write16(padapter, addr, (u16)val);
  10019. + break;
  10020. + case 4:
  10021. + rtw_write32(padapter, addr, val);
  10022. + break;
  10023. + default:
  10024. + DBG_871X("error write length=%d", len);
  10025. + break;
  10026. + }
  10027. +
  10028. + }
  10029. +
  10030. + return count;
  10031. +
  10032. +}
  10033. +
  10034. +static u32 proc_get_read_addr=0xeeeeeeee;
  10035. +static u32 proc_get_read_len=0x4;
  10036. +
  10037. +int proc_get_read_reg(char *page, char **start,
  10038. + off_t offset, int count,
  10039. + int *eof, void *data)
  10040. +{
  10041. + struct net_device *dev = data;
  10042. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10043. +
  10044. + int len = 0;
  10045. +
  10046. + if(proc_get_read_addr==0xeeeeeeee)
  10047. + {
  10048. + *eof = 1;
  10049. + return len;
  10050. + }
  10051. +
  10052. + switch(proc_get_read_len)
  10053. + {
  10054. + case 1:
  10055. + len += snprintf(page + len, count - len, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));
  10056. + break;
  10057. + case 2:
  10058. + len += snprintf(page + len, count - len, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));
  10059. + break;
  10060. + case 4:
  10061. + len += snprintf(page + len, count - len, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));
  10062. + break;
  10063. + default:
  10064. + len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len);
  10065. + break;
  10066. + }
  10067. +
  10068. + *eof = 1;
  10069. + return len;
  10070. +
  10071. +}
  10072. +
  10073. +int proc_set_read_reg(struct file *file, const char *buffer,
  10074. + unsigned long count, void *data)
  10075. +{
  10076. + char tmp[16];
  10077. + u32 addr, len;
  10078. +
  10079. + if (count < 2)
  10080. + {
  10081. + DBG_871X("argument size is less than 2\n");
  10082. + return -EFAULT;
  10083. + }
  10084. +
  10085. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10086. +
  10087. + int num = sscanf(tmp, "%x %x", &addr, &len);
  10088. +
  10089. + if (num != 2) {
  10090. + DBG_871X("invalid read_reg parameter!\n");
  10091. + return count;
  10092. + }
  10093. +
  10094. + proc_get_read_addr = addr;
  10095. +
  10096. + proc_get_read_len = len;
  10097. + }
  10098. +
  10099. + return count;
  10100. +
  10101. +}
  10102. +
  10103. +int proc_get_fwstate(char *page, char **start,
  10104. + off_t offset, int count,
  10105. + int *eof, void *data)
  10106. +{
  10107. + struct net_device *dev = data;
  10108. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10109. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  10110. +
  10111. + int len = 0;
  10112. +
  10113. + len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv));
  10114. +
  10115. + *eof = 1;
  10116. + return len;
  10117. +}
  10118. +
  10119. +int proc_get_sec_info(char *page, char **start,
  10120. + off_t offset, int count,
  10121. + int *eof, void *data)
  10122. +{
  10123. + struct net_device *dev = data;
  10124. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10125. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  10126. +
  10127. + int len = 0;
  10128. +
  10129. + len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
  10130. + psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
  10131. + psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
  10132. +
  10133. + *eof = 1;
  10134. + return len;
  10135. +}
  10136. +
  10137. +int proc_get_mlmext_state(char *page, char **start,
  10138. + off_t offset, int count,
  10139. + int *eof, void *data)
  10140. +{
  10141. + struct net_device *dev = data;
  10142. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10143. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  10144. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  10145. +
  10146. + int len = 0;
  10147. +
  10148. + len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
  10149. +
  10150. + *eof = 1;
  10151. + return len;
  10152. +}
  10153. +
  10154. +int proc_get_qos_option(char *page, char **start,
  10155. + off_t offset, int count,
  10156. + int *eof, void *data)
  10157. +{
  10158. + struct net_device *dev = data;
  10159. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10160. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  10161. +
  10162. + int len = 0;
  10163. +
  10164. + len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);
  10165. +
  10166. + *eof = 1;
  10167. + return len;
  10168. +
  10169. +}
  10170. +
  10171. +int proc_get_ht_option(char *page, char **start,
  10172. + off_t offset, int count,
  10173. + int *eof, void *data)
  10174. +{
  10175. + struct net_device *dev = data;
  10176. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10177. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  10178. +
  10179. + int len = 0;
  10180. +
  10181. + len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);
  10182. +
  10183. + *eof = 1;
  10184. + return len;
  10185. +}
  10186. +
  10187. +int proc_get_rf_info(char *page, char **start,
  10188. + off_t offset, int count,
  10189. + int *eof, void *data)
  10190. +{
  10191. + struct net_device *dev = data;
  10192. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10193. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  10194. + int len = 0;
  10195. +
  10196. + len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n"
  10197. + "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n",
  10198. + pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset,
  10199. + rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
  10200. + *eof = 1;
  10201. +
  10202. + return len;
  10203. +}
  10204. +
  10205. +int proc_get_ap_info(char *page, char **start,
  10206. + off_t offset, int count,
  10207. + int *eof, void *data)
  10208. +{
  10209. + struct sta_info *psta;
  10210. + struct net_device *dev = data;
  10211. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10212. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  10213. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  10214. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  10215. + struct sta_priv *pstapriv = &padapter->stapriv;
  10216. + int len = 0;
  10217. +
  10218. + psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
  10219. + if(psta)
  10220. + {
  10221. + int i;
  10222. + struct recv_reorder_ctrl *preorder_ctrl;
  10223. +
  10224. + len += snprintf(page + len, count - len, "SSID=%s\n", cur_network->network.Ssid.Ssid);
  10225. + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  10226. + len += snprintf(page + len, count - len, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  10227. + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
  10228. + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  10229. + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  10230. + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
  10231. + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  10232. + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  10233. +
  10234. + for(i=0;i<16;i++)
  10235. + {
  10236. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  10237. + if(preorder_ctrl->enable)
  10238. + {
  10239. + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
  10240. + }
  10241. + }
  10242. +
  10243. + }
  10244. + else
  10245. + {
  10246. + len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
  10247. + }
  10248. +
  10249. + *eof = 1;
  10250. + return len;
  10251. +
  10252. +}
  10253. +
  10254. +int proc_get_adapter_state(char *page, char **start,
  10255. + off_t offset, int count,
  10256. + int *eof, void *data)
  10257. +{
  10258. + struct net_device *dev = data;
  10259. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10260. + int len = 0;
  10261. +
  10262. + len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n",
  10263. + padapter->bSurpriseRemoved, padapter->bDriverStopped);
  10264. +
  10265. + *eof = 1;
  10266. + return len;
  10267. +
  10268. +}
  10269. +
  10270. +int proc_get_trx_info(char *page, char **start,
  10271. + off_t offset, int count,
  10272. + int *eof, void *data)
  10273. +{
  10274. + int i;
  10275. + struct net_device *dev = data;
  10276. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10277. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  10278. + struct recv_priv *precvpriv = &padapter->recvpriv;
  10279. + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
  10280. + struct hw_xmit *phwxmit;
  10281. + int len = 0;
  10282. +
  10283. + len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d"
  10284. + ", free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d"
  10285. + ", free_recvframe_cnt=%d\n",
  10286. + pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt,
  10287. + pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt,
  10288. + precvpriv->free_recvframe_cnt);
  10289. +#ifdef CONFIG_USB_HCI
  10290. + len += snprintf(page + len, count - len, "rx_urb_pending_cnt=%d\n", precvpriv->rx_pending_cnt);
  10291. +#endif
  10292. +
  10293. + len += snprintf(page + len, count - len, "recvbuf_skb_alloc_fail_cnt=%d\n", precvpriv->recvbuf_skb_alloc_fail_cnt);
  10294. + len += snprintf(page + len, count - len, "recvbuf_null_cnt=%d\n", precvpriv->recvbuf_null_cnt);
  10295. + len += snprintf(page + len, count - len, "read_port_complete_EINPROGRESS_cnt=%d\n", precvpriv->read_port_complete_EINPROGRESS_cnt);
  10296. + len += snprintf(page + len, count - len, "read_port_complete_other_urb_err_cnt=%d\n", precvpriv->read_port_complete_other_urb_err_cnt);
  10297. + len += snprintf(page + len, count - len, "hw_init_completed=%d\n", padapter->hw_init_completed);
  10298. +#ifdef CONFIG_USB_HCI
  10299. + len += snprintf(page + len, count - len, "continual_urb_error=%d\n", atomic_read(&pdvobj->continual_urb_error));
  10300. +#endif
  10301. +
  10302. + for(i = 0; i < 4; i++)
  10303. + {
  10304. + phwxmit = pxmitpriv->hwxmits + i;
  10305. + len += snprintf(page + len, count - len, "%d, hwq.accnt=%d\n", i, phwxmit->accnt);
  10306. + }
  10307. +
  10308. + *eof = 1;
  10309. + return len;
  10310. +
  10311. +}
  10312. +
  10313. +
  10314. +
  10315. +int proc_get_mac_reg_dump1(char *page, char **start,
  10316. + off_t offset, int count,
  10317. + int *eof, void *data)
  10318. +{
  10319. + struct net_device *dev = data;
  10320. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10321. + int len = 0;
  10322. + int i,j=1;
  10323. +
  10324. + len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
  10325. +
  10326. + for(i=0x0;i<0x300;i+=4)
  10327. + {
  10328. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10329. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10330. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10331. + }
  10332. +
  10333. + *eof = 1;
  10334. + return len;
  10335. +
  10336. +}
  10337. +
  10338. +int proc_get_mac_reg_dump2(char *page, char **start,
  10339. + off_t offset, int count,
  10340. + int *eof, void *data)
  10341. +{
  10342. + struct net_device *dev = data;
  10343. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10344. + int len = 0;
  10345. + int i,j=1;
  10346. +
  10347. + len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
  10348. + memset(page, 0, count);
  10349. + for(i=0x300;i<0x600;i+=4)
  10350. + {
  10351. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10352. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10353. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10354. + }
  10355. +
  10356. + *eof = 1;
  10357. + return len;
  10358. +
  10359. +}
  10360. +
  10361. +int proc_get_mac_reg_dump3(char *page, char **start,
  10362. + off_t offset, int count,
  10363. + int *eof, void *data)
  10364. +{
  10365. + struct net_device *dev = data;
  10366. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10367. + int len = 0;
  10368. + int i,j=1;
  10369. +
  10370. + len += snprintf(page + len, count - len, "\n======= MAC REG =======\n");
  10371. +
  10372. + for(i=0x600;i<0x800;i+=4)
  10373. + {
  10374. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10375. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10376. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10377. + }
  10378. +
  10379. + *eof = 1;
  10380. + return len;
  10381. +
  10382. +}
  10383. +
  10384. +int proc_get_bb_reg_dump1(char *page, char **start,
  10385. + off_t offset, int count,
  10386. + int *eof, void *data)
  10387. +{
  10388. + struct net_device *dev = data;
  10389. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10390. + int len = 0;
  10391. + int i,j=1;
  10392. +
  10393. + len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
  10394. + for(i=0x800;i<0xB00;i+=4)
  10395. + {
  10396. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10397. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10398. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10399. + }
  10400. + *eof = 1;
  10401. + return len;
  10402. +}
  10403. +
  10404. +int proc_get_bb_reg_dump2(char *page, char **start,
  10405. + off_t offset, int count,
  10406. + int *eof, void *data)
  10407. +{
  10408. + struct net_device *dev = data;
  10409. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10410. + int len = 0;
  10411. + int i,j=1;
  10412. +
  10413. + len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
  10414. + for(i=0xB00;i<0xE00;i+=4)
  10415. + {
  10416. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10417. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10418. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10419. + }
  10420. + *eof = 1;
  10421. + return len;
  10422. +}
  10423. +
  10424. +int proc_get_bb_reg_dump3(char *page, char **start,
  10425. + off_t offset, int count,
  10426. + int *eof, void *data)
  10427. +{
  10428. + struct net_device *dev = data;
  10429. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10430. + int len = 0;
  10431. + int i,j=1;
  10432. +
  10433. + len += snprintf(page + len, count - len, "\n======= BB REG =======\n");
  10434. + for(i=0xE00;i<0x1000;i+=4)
  10435. + {
  10436. + if(j%4==1) len += snprintf(page + len, count - len,"0x%02x",i);
  10437. + len += snprintf(page + len, count - len," 0x%08x ",rtw_read32(padapter,i));
  10438. + if((j++)%4 == 0) len += snprintf(page + len, count - len,"\n");
  10439. + }
  10440. + *eof = 1;
  10441. + return len;
  10442. +}
  10443. +
  10444. +int proc_get_rf_reg_dump1(char *page, char **start,
  10445. + off_t offset, int count,
  10446. + int *eof, void *data)
  10447. +{
  10448. + struct net_device *dev = data;
  10449. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10450. + int len = 0;
  10451. + int i,j=1,path;
  10452. + u32 value;
  10453. +
  10454. + len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
  10455. + path = 1;
  10456. + len += snprintf(page + len, count - len, "\nRF_Path(%x)\n",path);
  10457. + for(i=0;i<0xC0;i++)
  10458. + {
  10459. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  10460. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  10461. + if(j%4==1) len += snprintf(page + len, count - len, "0x%02x ",i);
  10462. + len += snprintf(page + len, count - len, " 0x%08x ",value);
  10463. + if((j++)%4==0) len += snprintf(page + len, count - len, "\n");
  10464. + }
  10465. +
  10466. + *eof = 1;
  10467. + return len;
  10468. +}
  10469. +
  10470. +
  10471. +int proc_get_rf_reg_dump2(char *page, char **start,
  10472. + off_t offset, int count,
  10473. + int *eof, void *data)
  10474. +{
  10475. + struct net_device *dev = data;
  10476. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10477. + int len = 0;
  10478. + int i,j=1,path;
  10479. + u32 value;
  10480. +
  10481. + len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
  10482. + path = 1;
  10483. + len += snprintf(page + len, count - len, "\nRF_Path(%x)\n",path);
  10484. + for(i=0xC0;i<0x100;i++)
  10485. + {
  10486. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  10487. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  10488. + if(j%4==1) len += snprintf(page + len, count - len, "0x%02x ",i);
  10489. + len += snprintf(page + len, count - len, " 0x%08x ",value);
  10490. + if((j++)%4==0) len += snprintf(page + len, count - len, "\n");
  10491. + }
  10492. + *eof = 1;
  10493. + return len;
  10494. +}
  10495. +
  10496. +
  10497. +int proc_get_rf_reg_dump3(char *page, char **start,
  10498. + off_t offset, int count,
  10499. + int *eof, void *data)
  10500. +{
  10501. + struct net_device *dev = data;
  10502. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10503. + int len = 0;
  10504. + int i,j=1,path;
  10505. + u32 value;
  10506. +
  10507. + len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
  10508. + path = 2;
  10509. + len += snprintf(page + len, count - len, "\nRF_Path(%x)\n",path);
  10510. + for(i=0;i<0xC0;i++)
  10511. + {
  10512. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  10513. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  10514. + if(j%4==1) len += snprintf(page + len, count - len, "0x%02x ",i);
  10515. + len += snprintf(page + len, count - len, " 0x%08x ",value);
  10516. + if((j++)%4==0) len += snprintf(page + len, count - len, "\n");
  10517. + }
  10518. +
  10519. + *eof = 1;
  10520. + return len;
  10521. +}
  10522. +
  10523. +
  10524. +int proc_get_rf_reg_dump4(char *page, char **start,
  10525. + off_t offset, int count,
  10526. + int *eof, void *data)
  10527. +{
  10528. + struct net_device *dev = data;
  10529. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10530. + int len = 0;
  10531. + int i,j=1,path;
  10532. + u32 value;
  10533. +
  10534. + len += snprintf(page + len, count - len, "\n======= RF REG =======\n");
  10535. + path = 2;
  10536. + len += snprintf(page + len, count - len, "\nRF_Path(%x)\n",path);
  10537. + for(i=0xC0;i<0x100;i++)
  10538. + {
  10539. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  10540. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  10541. + if(j%4==1) len += snprintf(page + len, count - len, "0x%02x ",i);
  10542. + len += snprintf(page + len, count - len, " 0x%08x ",value);
  10543. + if((j++)%4==0) len += snprintf(page + len, count - len, "\n");
  10544. + }
  10545. + *eof = 1;
  10546. + return len;
  10547. +}
  10548. +
  10549. +
  10550. +
  10551. +int proc_get_rx_signal(char *page, char **start,
  10552. + off_t offset, int count,
  10553. + int *eof, void *data)
  10554. +{
  10555. + struct net_device *dev = data;
  10556. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10557. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  10558. +
  10559. + int len = 0;
  10560. +
  10561. + len += snprintf(page + len, count - len,
  10562. + "rssi:%d\n"
  10563. + "rxpwdb:%d\n"
  10564. + "signal_strength:%u\n"
  10565. + "signal_qual:%u\n"
  10566. + "noise:%u\n",
  10567. + padapter->recvpriv.rssi,
  10568. + padapter->recvpriv.rxpwdb,
  10569. + padapter->recvpriv.signal_strength,
  10570. + padapter->recvpriv.signal_qual,
  10571. + padapter->recvpriv.noise
  10572. + );
  10573. +
  10574. + *eof = 1;
  10575. + return len;
  10576. +}
  10577. +
  10578. +int proc_set_rx_signal(struct file *file, const char *buffer,
  10579. + unsigned long count, void *data)
  10580. +{
  10581. + struct net_device *dev = (struct net_device *)data;
  10582. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10583. + char tmp[32];
  10584. + u32 is_signal_dbg, signal_strength;
  10585. +
  10586. + if (count < 1)
  10587. + return -EFAULT;
  10588. +
  10589. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10590. +
  10591. + int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
  10592. +
  10593. + is_signal_dbg = is_signal_dbg==0?0:1;
  10594. +
  10595. + if(is_signal_dbg && num!=2)
  10596. + return count;
  10597. +
  10598. + signal_strength = signal_strength>100?100:signal_strength;
  10599. + signal_strength = signal_strength<0?0:signal_strength;
  10600. +
  10601. + padapter->recvpriv.is_signal_dbg = is_signal_dbg;
  10602. + padapter->recvpriv.signal_strength_dbg=signal_strength;
  10603. +
  10604. + if(is_signal_dbg)
  10605. + DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
  10606. + else
  10607. + DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH");
  10608. +
  10609. + }
  10610. +
  10611. + return count;
  10612. +
  10613. +}
  10614. +
  10615. +int proc_get_ht_enable(char *page, char **start,
  10616. + off_t offset, int count,
  10617. + int *eof, void *data)
  10618. +{
  10619. + struct net_device *dev = data;
  10620. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10621. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10622. +
  10623. + int len = 0;
  10624. +
  10625. + if(pregpriv)
  10626. + len += snprintf(page + len, count - len,
  10627. + "%d\n",
  10628. + pregpriv->ht_enable
  10629. + );
  10630. +
  10631. + *eof = 1;
  10632. + return len;
  10633. +}
  10634. +
  10635. +int proc_set_ht_enable(struct file *file, const char *buffer,
  10636. + unsigned long count, void *data)
  10637. +{
  10638. + struct net_device *dev = (struct net_device *)data;
  10639. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10640. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10641. + char tmp[32];
  10642. + u32 mode;
  10643. +
  10644. + if (count < 1)
  10645. + return -EFAULT;
  10646. +
  10647. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10648. +
  10649. + int num = sscanf(tmp, "%d ", &mode);
  10650. +
  10651. + if( pregpriv && mode >= 0 && mode < 2 )
  10652. + {
  10653. + pregpriv->ht_enable= mode;
  10654. + printk("ht_enable=%d\n", pregpriv->ht_enable);
  10655. + }
  10656. + }
  10657. +
  10658. + return count;
  10659. +
  10660. +}
  10661. +
  10662. +
  10663. +int proc_get_cbw40_enable(char *page, char **start,
  10664. + off_t offset, int count,
  10665. + int *eof, void *data)
  10666. +{
  10667. + struct net_device *dev = data;
  10668. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10669. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10670. +
  10671. + int len = 0;
  10672. +
  10673. + if(pregpriv)
  10674. + len += snprintf(page + len, count - len,
  10675. + "%d\n",
  10676. + pregpriv->cbw40_enable
  10677. + );
  10678. +
  10679. + *eof = 1;
  10680. + return len;
  10681. +}
  10682. +
  10683. +int proc_set_cbw40_enable(struct file *file, const char *buffer,
  10684. + unsigned long count, void *data)
  10685. +{
  10686. + struct net_device *dev = (struct net_device *)data;
  10687. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10688. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10689. + char tmp[32];
  10690. + u32 mode;
  10691. +
  10692. + if (count < 1)
  10693. + return -EFAULT;
  10694. +
  10695. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10696. +
  10697. + int num = sscanf(tmp, "%d ", &mode);
  10698. +
  10699. + if( pregpriv && mode >= 0 && mode < 2 )
  10700. + {
  10701. + pregpriv->cbw40_enable= mode;
  10702. + printk("cbw40_enable=%d\n", mode);
  10703. + }
  10704. + }
  10705. +
  10706. + return count;
  10707. +
  10708. +}
  10709. +
  10710. +int proc_get_ampdu_enable(char *page, char **start,
  10711. + off_t offset, int count,
  10712. + int *eof, void *data)
  10713. +{
  10714. + struct net_device *dev = data;
  10715. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10716. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10717. +
  10718. + int len = 0;
  10719. +
  10720. + if(pregpriv)
  10721. + len += snprintf(page + len, count - len,
  10722. + "%d\n",
  10723. + pregpriv->ampdu_enable
  10724. + );
  10725. +
  10726. + *eof = 1;
  10727. + return len;
  10728. +}
  10729. +
  10730. +int proc_set_ampdu_enable(struct file *file, const char *buffer,
  10731. + unsigned long count, void *data)
  10732. +{
  10733. + struct net_device *dev = (struct net_device *)data;
  10734. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10735. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10736. + char tmp[32];
  10737. + u32 mode;
  10738. +
  10739. + if (count < 1)
  10740. + return -EFAULT;
  10741. +
  10742. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10743. +
  10744. + int num = sscanf(tmp, "%d ", &mode);
  10745. +
  10746. + if( pregpriv && mode >= 0 && mode < 3 )
  10747. + {
  10748. + pregpriv->ampdu_enable= mode;
  10749. + printk("ampdu_enable=%d\n", mode);
  10750. + }
  10751. + }
  10752. +
  10753. + return count;
  10754. +
  10755. +}
  10756. +
  10757. +
  10758. +int proc_get_two_path_rssi(char *page, char **start,
  10759. + off_t offset, int count,
  10760. + int *eof, void *data)
  10761. +{
  10762. + struct net_device *dev = data;
  10763. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10764. +
  10765. + int len = 0;
  10766. +
  10767. + if(padapter)
  10768. + len += snprintf(page + len, count - len,
  10769. + "%d %d\n",
  10770. + padapter->recvpriv.RxRssi[0],
  10771. + padapter->recvpriv.RxRssi[1]
  10772. + );
  10773. +
  10774. + *eof = 1;
  10775. + return len;
  10776. +}
  10777. +
  10778. +int proc_get_rx_stbc(char *page, char **start,
  10779. + off_t offset, int count,
  10780. + int *eof, void *data)
  10781. +{
  10782. + struct net_device *dev = data;
  10783. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10784. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10785. +
  10786. + int len = 0;
  10787. +
  10788. + if(pregpriv)
  10789. + len += snprintf(page + len, count - len,
  10790. + "%d\n",
  10791. + pregpriv->rx_stbc
  10792. + );
  10793. +
  10794. + *eof = 1;
  10795. + return len;
  10796. +}
  10797. +
  10798. +int proc_set_rx_stbc(struct file *file, const char *buffer,
  10799. + unsigned long count, void *data)
  10800. +{
  10801. + struct net_device *dev = (struct net_device *)data;
  10802. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10803. + struct registry_priv *pregpriv = &padapter->registrypriv;
  10804. + char tmp[32];
  10805. + u32 mode;
  10806. +
  10807. + if (count < 1)
  10808. + return -EFAULT;
  10809. +
  10810. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10811. +
  10812. + int num = sscanf(tmp, "%d ", &mode);
  10813. +
  10814. + if( pregpriv && (mode == 0 || mode == 1|| mode == 2|| mode == 3))
  10815. + {
  10816. + pregpriv->rx_stbc= mode;
  10817. + printk("rx_stbc=%d\n", mode);
  10818. + }
  10819. + }
  10820. +
  10821. + return count;
  10822. +
  10823. +}
  10824. +
  10825. +int proc_get_vid(char *page, char **start,
  10826. + off_t offset, int count,
  10827. + int *eof, void *data)
  10828. +{
  10829. + struct net_device *dev = data;
  10830. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10831. + u16 VID=0;
  10832. + int len = 0;
  10833. +
  10834. + rtw_hal_get_hwreg(padapter, HW_VAR_VID, (u8 *)&VID);
  10835. + len += snprintf(page + len, count - len,
  10836. + "%04x\n",
  10837. + VID
  10838. + );
  10839. +
  10840. + *eof = 1;
  10841. + return len;
  10842. +}
  10843. +
  10844. +int proc_get_pid(char *page, char **start,
  10845. + off_t offset, int count,
  10846. + int *eof, void *data)
  10847. +{
  10848. + struct net_device *dev = data;
  10849. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10850. + u16 PID=0;
  10851. + int len = 0;
  10852. +
  10853. + rtw_hal_get_hwreg(padapter, HW_VAR_PID, (u8 *)&PID);
  10854. + len += snprintf(page + len, count - len,
  10855. + "%04x\n",
  10856. + PID
  10857. + );
  10858. +
  10859. + *eof = 1;
  10860. + return len;
  10861. +}
  10862. +
  10863. +int proc_get_rssi_disp(char *page, char **start,
  10864. + off_t offset, int count,
  10865. + int *eof, void *data)
  10866. +{
  10867. + *eof = 1;
  10868. + return 0;
  10869. +}
  10870. +
  10871. +int proc_set_rssi_disp(struct file *file, const char *buffer,
  10872. + unsigned long count, void *data)
  10873. +{
  10874. + struct net_device *dev = (struct net_device *)data;
  10875. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10876. + char tmp[32];
  10877. + u32 enable=0;
  10878. +
  10879. + if (count < 1)
  10880. + {
  10881. + DBG_8192C("argument size is less than 1\n");
  10882. + return -EFAULT;
  10883. + }
  10884. +
  10885. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  10886. +
  10887. + int num = sscanf(tmp, "%x", &enable);
  10888. +
  10889. + if (num != 1) {
  10890. + DBG_8192C("invalid set_rssi_disp parameter!\n");
  10891. + return count;
  10892. + }
  10893. +
  10894. + if(enable)
  10895. + {
  10896. + DBG_8192C("Turn On Rx RSSI Display Function\n");
  10897. + padapter->bRxRSSIDisplay = enable ;
  10898. + }
  10899. + else
  10900. + {
  10901. + DBG_8192C("Turn Off Rx RSSI Display Function\n");
  10902. + padapter->bRxRSSIDisplay = 0 ;
  10903. + }
  10904. +
  10905. + }
  10906. +
  10907. + return count;
  10908. +
  10909. +}
  10910. +
  10911. +
  10912. +#ifdef CONFIG_AP_MODE
  10913. +
  10914. +int proc_get_all_sta_info(char *page, char **start,
  10915. + off_t offset, int count,
  10916. + int *eof, void *data)
  10917. +{
  10918. + _irqL irqL;
  10919. + struct sta_info *psta;
  10920. + struct net_device *dev = data;
  10921. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  10922. + struct sta_priv *pstapriv = &padapter->stapriv;
  10923. + int i, j;
  10924. + _list *plist, *phead;
  10925. + struct recv_reorder_ctrl *preorder_ctrl;
  10926. + int len = 0;
  10927. +
  10928. +
  10929. + len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
  10930. +
  10931. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  10932. +
  10933. + for(i=0; i< NUM_STA; i++)
  10934. + {
  10935. + phead = &(pstapriv->sta_hash[i]);
  10936. + plist = get_next(phead);
  10937. +
  10938. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  10939. + {
  10940. + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  10941. +
  10942. + plist = get_next(plist);
  10943. +
  10944. + //if(extra_arg == psta->aid)
  10945. + {
  10946. + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  10947. + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
  10948. + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  10949. + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  10950. + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
  10951. + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  10952. + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  10953. + len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len);
  10954. + len += snprintf(page + len, count - len, "capability=0x%x\n", psta->capability);
  10955. + len += snprintf(page + len, count - len, "flags=0x%x\n", psta->flags);
  10956. + len += snprintf(page + len, count - len, "wpa_psk=0x%x\n", psta->wpa_psk);
  10957. + len += snprintf(page + len, count - len, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
  10958. + len += snprintf(page + len, count - len, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
  10959. + len += snprintf(page + len, count - len, "qos_info=0x%x\n", psta->qos_info);
  10960. + len += snprintf(page + len, count - len, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
  10961. +
  10962. + for(j=0;j<16;j++)
  10963. + {
  10964. + preorder_ctrl = &psta->recvreorder_ctrl[j];
  10965. + if(preorder_ctrl->enable)
  10966. + {
  10967. + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
  10968. + }
  10969. + }
  10970. +
  10971. + }
  10972. +
  10973. + }
  10974. +
  10975. + }
  10976. +
  10977. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  10978. +
  10979. + *eof = 1;
  10980. + return len;
  10981. +
  10982. +}
  10983. +
  10984. +#endif
  10985. +
  10986. +#ifdef DBG_MEMORY_LEAK
  10987. +#include <asm/atomic.h>
  10988. +extern atomic_t _malloc_cnt;;
  10989. +extern atomic_t _malloc_size;;
  10990. +
  10991. +int proc_get_malloc_cnt(char *page, char **start,
  10992. + off_t offset, int count,
  10993. + int *eof, void *data)
  10994. +{
  10995. +
  10996. + int len = 0;
  10997. +
  10998. + len += snprintf(page + len, count - len, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt));
  10999. + len += snprintf(page + len, count - len, "_malloc_size=%d\n", atomic_read(&_malloc_size));
  11000. +
  11001. + *eof = 1;
  11002. + return len;
  11003. +}
  11004. +#endif /* DBG_MEMORY_LEAK */
  11005. +
  11006. +#ifdef CONFIG_FIND_BEST_CHANNEL
  11007. +int proc_get_best_channel(char *page, char **start,
  11008. + off_t offset, int count,
  11009. + int *eof, void *data)
  11010. +{
  11011. + struct net_device *dev = data;
  11012. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11013. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  11014. + int len = 0;
  11015. + u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
  11016. +
  11017. + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
  11018. + if ( pmlmeext->channel_set[i].ChannelNum == 1)
  11019. + index_24G = i;
  11020. + if ( pmlmeext->channel_set[i].ChannelNum == 36)
  11021. + index_5G = i;
  11022. + }
  11023. +
  11024. + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
  11025. + // 2.4G
  11026. + if ( pmlmeext->channel_set[i].ChannelNum == 6 ) {
  11027. + if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {
  11028. + index_24G = i;
  11029. + best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
  11030. + }
  11031. + }
  11032. +
  11033. + // 5G
  11034. + if ( pmlmeext->channel_set[i].ChannelNum >= 36
  11035. + && pmlmeext->channel_set[i].ChannelNum < 140 ) {
  11036. + // Find primary channel
  11037. + if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)
  11038. + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
  11039. + index_5G = i;
  11040. + best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
  11041. + }
  11042. + }
  11043. +
  11044. + if ( pmlmeext->channel_set[i].ChannelNum >= 149
  11045. + && pmlmeext->channel_set[i].ChannelNum < 165) {
  11046. + // find primary channel
  11047. + if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)
  11048. + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
  11049. + index_5G = i;
  11050. + best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
  11051. + }
  11052. + }
  11053. +#if 1 // debug
  11054. + len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n",
  11055. + pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);
  11056. +#endif
  11057. + }
  11058. +
  11059. + len += snprintf(page + len, count - len, "best_channel_5G = %d\n", best_channel_5G);
  11060. + len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G);
  11061. +
  11062. + *eof = 1;
  11063. + return len;
  11064. +
  11065. +}
  11066. +
  11067. +int proc_set_best_channel(struct file *file, const char *buffer,
  11068. + unsigned long count, void *data)
  11069. +{
  11070. + struct net_device *dev = (struct net_device *)data;
  11071. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11072. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  11073. + char tmp[32];
  11074. +
  11075. + if(count < 1)
  11076. + return -EFAULT;
  11077. +
  11078. + if(buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
  11079. + {
  11080. + int i;
  11081. + for(i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++)
  11082. + {
  11083. + pmlmeext->channel_set[i].rx_count = 0;
  11084. + }
  11085. +
  11086. + DBG_871X("set %s\n", "Clean Best Channel Count");
  11087. + }
  11088. +
  11089. + return count;
  11090. +}
  11091. +#endif /* CONFIG_FIND_BEST_CHANNEL */
  11092. +
  11093. +#if defined(DBG_CONFIG_ERROR_DETECT)
  11094. +#include <rtw_sreset.h>
  11095. +int proc_get_sreset(char *page, char **start, off_t offset, int count, int *eof, void *data)
  11096. +{
  11097. + struct net_device *dev = data;
  11098. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11099. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  11100. +
  11101. + int len = 0;
  11102. +
  11103. + *eof = 1;
  11104. + return len;
  11105. +}
  11106. +
  11107. +int proc_set_sreset(struct file *file, const char *buffer, unsigned long count, void *data)
  11108. +{
  11109. + struct net_device *dev = (struct net_device *)data;
  11110. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11111. + char tmp[32];
  11112. + s32 trigger_point;
  11113. +
  11114. + if (count < 1)
  11115. + return -EFAULT;
  11116. +
  11117. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  11118. +
  11119. + int num = sscanf(tmp, "%d", &trigger_point);
  11120. +
  11121. + if (trigger_point == SRESET_TGP_NULL)
  11122. + rtw_hal_sreset_reset(padapter);
  11123. + else
  11124. + sreset_set_trigger_point(padapter, trigger_point);
  11125. + }
  11126. +
  11127. + return count;
  11128. +
  11129. +}
  11130. +#endif /* DBG_CONFIG_ERROR_DETECT */
  11131. +
  11132. +#ifdef CONFIG_DM_ADAPTIVITY
  11133. +int proc_get_dm_adaptivity(char *page, char **start,
  11134. + off_t offset, int count,
  11135. + int *eof, void *data)
  11136. +{
  11137. + struct net_device *dev = data;
  11138. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11139. + int len = 0;
  11140. +
  11141. + len += dm_adaptivity_get_parm_str(padapter, page, count);
  11142. +
  11143. + *eof = 1;
  11144. + return len;
  11145. +}
  11146. +
  11147. +int proc_set_dm_adaptivity(struct file *file, const char *buffer,
  11148. + unsigned long count, void *data)
  11149. +{
  11150. + struct net_device *dev = (struct net_device *)data;
  11151. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  11152. + char tmp[32];
  11153. + u32 TH_L2H_ini;
  11154. + s8 TH_EDCCA_HL_diff;
  11155. + u32 IGI_Base;
  11156. + int ForceEDCCA;
  11157. + u8 AdapEn_RSSI;
  11158. + u8 IGI_LowerBound;
  11159. +
  11160. + if (count < 1)
  11161. + return -EFAULT;
  11162. +
  11163. + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  11164. +
  11165. + int num = sscanf(tmp, "%x %hhd %x %d %hhu %hhu",
  11166. + &TH_L2H_ini, &TH_EDCCA_HL_diff, &IGI_Base, &ForceEDCCA, &AdapEn_RSSI, &IGI_LowerBound);
  11167. +
  11168. + if (num != 6)
  11169. + return count;
  11170. +
  11171. + dm_adaptivity_set_parm(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)IGI_Base, (bool)ForceEDCCA, AdapEn_RSSI, IGI_LowerBound);
  11172. + }
  11173. +
  11174. + return count;
  11175. +}
  11176. +#endif /* CONFIG_DM_ADAPTIVITY */
  11177. +
  11178. +#endif
  11179. --- /dev/null
  11180. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c
  11181. @@ -0,0 +1,422 @@
  11182. +/******************************************************************************
  11183. + *
  11184. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  11185. + *
  11186. + * This program is free software; you can redistribute it and/or modify it
  11187. + * under the terms of version 2 of the GNU General Public License as
  11188. + * published by the Free Software Foundation.
  11189. + *
  11190. + * This program is distributed in the hope that it will be useful, but WITHOUT
  11191. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11192. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11193. + * more details.
  11194. + *
  11195. + * You should have received a copy of the GNU General Public License along with
  11196. + * this program; if not, write to the Free Software Foundation, Inc.,
  11197. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  11198. + *
  11199. + *
  11200. + ******************************************************************************/
  11201. +#define _RTW_EEPROM_C_
  11202. +
  11203. +#include <drv_conf.h>
  11204. +#include <osdep_service.h>
  11205. +#include <drv_types.h>
  11206. +
  11207. +void up_clk(_adapter* padapter, u16 *x)
  11208. +{
  11209. +_func_enter_;
  11210. + *x = *x | _EESK;
  11211. + rtw_write8(padapter, EE_9346CR, (u8)*x);
  11212. + rtw_udelay_os(CLOCK_RATE);
  11213. +
  11214. +_func_exit_;
  11215. +
  11216. +}
  11217. +
  11218. +void down_clk(_adapter * padapter, u16 *x )
  11219. +{
  11220. +_func_enter_;
  11221. + *x = *x & ~_EESK;
  11222. + rtw_write8(padapter, EE_9346CR, (u8)*x);
  11223. + rtw_udelay_os(CLOCK_RATE);
  11224. +_func_exit_;
  11225. +}
  11226. +
  11227. +void shift_out_bits(_adapter * padapter, u16 data, u16 count)
  11228. +{
  11229. + u16 x,mask;
  11230. +_func_enter_;
  11231. +
  11232. + if(padapter->bSurpriseRemoved==_TRUE){
  11233. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11234. + goto out;
  11235. + }
  11236. + mask = 0x01 << (count - 1);
  11237. + x = rtw_read8(padapter, EE_9346CR);
  11238. +
  11239. + x &= ~(_EEDO | _EEDI);
  11240. +
  11241. + do
  11242. + {
  11243. + x &= ~_EEDI;
  11244. + if(data & mask)
  11245. + x |= _EEDI;
  11246. + if(padapter->bSurpriseRemoved==_TRUE){
  11247. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11248. + goto out;
  11249. + }
  11250. + rtw_write8(padapter, EE_9346CR, (u8)x);
  11251. + rtw_udelay_os(CLOCK_RATE);
  11252. + up_clk(padapter, &x);
  11253. + down_clk(padapter, &x);
  11254. + mask = mask >> 1;
  11255. + } while(mask);
  11256. + if(padapter->bSurpriseRemoved==_TRUE){
  11257. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11258. + goto out;
  11259. + }
  11260. + x &= ~_EEDI;
  11261. + rtw_write8(padapter, EE_9346CR, (u8)x);
  11262. +out:
  11263. +_func_exit_;
  11264. +}
  11265. +
  11266. +u16 shift_in_bits (_adapter * padapter)
  11267. +{
  11268. + u16 x,d=0,i;
  11269. +_func_enter_;
  11270. + if(padapter->bSurpriseRemoved==_TRUE){
  11271. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11272. + goto out;
  11273. + }
  11274. + x = rtw_read8(padapter, EE_9346CR);
  11275. +
  11276. + x &= ~( _EEDO | _EEDI);
  11277. + d = 0;
  11278. +
  11279. + for(i=0; i<16; i++)
  11280. + {
  11281. + d = d << 1;
  11282. + up_clk(padapter, &x);
  11283. + if(padapter->bSurpriseRemoved==_TRUE){
  11284. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11285. + goto out;
  11286. + }
  11287. + x = rtw_read8(padapter, EE_9346CR);
  11288. +
  11289. + x &= ~(_EEDI);
  11290. + if(x & _EEDO)
  11291. + d |= 1;
  11292. +
  11293. + down_clk(padapter, &x);
  11294. + }
  11295. +out:
  11296. +_func_exit_;
  11297. +
  11298. + return d;
  11299. +}
  11300. +
  11301. +void standby(_adapter * padapter )
  11302. +{
  11303. + u8 x;
  11304. +_func_enter_;
  11305. + x = rtw_read8(padapter, EE_9346CR);
  11306. +
  11307. + x &= ~(_EECS | _EESK);
  11308. + rtw_write8(padapter, EE_9346CR,x);
  11309. +
  11310. + rtw_udelay_os(CLOCK_RATE);
  11311. + x |= _EECS;
  11312. + rtw_write8(padapter, EE_9346CR, x);
  11313. + rtw_udelay_os(CLOCK_RATE);
  11314. +_func_exit_;
  11315. +}
  11316. +
  11317. +u16 wait_eeprom_cmd_done(_adapter* padapter)
  11318. +{
  11319. + u8 x;
  11320. + u16 i,res=_FALSE;
  11321. +_func_enter_;
  11322. + standby(padapter );
  11323. + for (i=0; i<200; i++)
  11324. + {
  11325. + x = rtw_read8(padapter, EE_9346CR);
  11326. + if (x & _EEDO){
  11327. + res=_TRUE;
  11328. + goto exit;
  11329. + }
  11330. + rtw_udelay_os(CLOCK_RATE);
  11331. + }
  11332. +exit:
  11333. +_func_exit_;
  11334. + return res;
  11335. +}
  11336. +
  11337. +void eeprom_clean(_adapter * padapter)
  11338. +{
  11339. + u16 x;
  11340. +_func_enter_;
  11341. + if(padapter->bSurpriseRemoved==_TRUE){
  11342. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11343. + goto out;
  11344. + }
  11345. + x = rtw_read8(padapter, EE_9346CR);
  11346. + if(padapter->bSurpriseRemoved==_TRUE){
  11347. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11348. + goto out;
  11349. + }
  11350. + x &= ~(_EECS | _EEDI);
  11351. + rtw_write8(padapter, EE_9346CR, (u8)x);
  11352. + if(padapter->bSurpriseRemoved==_TRUE){
  11353. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11354. + goto out;
  11355. + }
  11356. + up_clk(padapter, &x);
  11357. + if(padapter->bSurpriseRemoved==_TRUE){
  11358. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11359. + goto out;
  11360. + }
  11361. + down_clk(padapter, &x);
  11362. +out:
  11363. +_func_exit_;
  11364. +}
  11365. +
  11366. +void eeprom_write16(_adapter * padapter, u16 reg, u16 data)
  11367. +{
  11368. + u8 x;
  11369. +#ifdef CONFIG_RTL8712
  11370. + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new;
  11371. + tmp8_ori=rtw_read8(padapter, 0x102502f1);
  11372. + tmp8_new=tmp8_ori & 0xf7;
  11373. + if(tmp8_ori != tmp8_new){
  11374. + rtw_write8(padapter, 0x102502f1, tmp8_new);
  11375. + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n"));
  11376. + }
  11377. + tmp8_clk_ori=rtw_read8(padapter,0x10250003);
  11378. + tmp8_clk_new=tmp8_clk_ori|0x20;
  11379. + if(tmp8_clk_new!=tmp8_clk_ori){
  11380. + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n"));
  11381. + rtw_write8(padapter, 0x10250003, tmp8_clk_new);
  11382. + }
  11383. +#endif
  11384. +_func_enter_;
  11385. +
  11386. + x = rtw_read8(padapter, EE_9346CR);
  11387. +
  11388. + x &= ~(_EEDI | _EEDO | _EESK | _EEM0);
  11389. + x |= _EEM1 | _EECS;
  11390. + rtw_write8(padapter, EE_9346CR, x);
  11391. +
  11392. + shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5);
  11393. +
  11394. + if(padapter->EepromAddressSize==8) //CF+ and SDIO
  11395. + shift_out_bits(padapter, 0, 6);
  11396. + else //USB
  11397. + shift_out_bits(padapter, 0, 4);
  11398. +
  11399. + standby( padapter);
  11400. +
  11401. +// Commented out by rcnjko, 2004.0
  11402. +// // Erase this particular word. Write the erase opcode and register
  11403. +// // number in that order. The opcode is 3bits in length; reg is 6 bits long.
  11404. +// shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3);
  11405. +// shift_out_bits(Adapter, reg, Adapter->EepromAddressSize);
  11406. +//
  11407. +// if (wait_eeprom_cmd_done(Adapter ) == FALSE)
  11408. +// {
  11409. +// return;
  11410. +// }
  11411. +
  11412. +
  11413. + standby(padapter );
  11414. +
  11415. + // write the new word to the EEPROM
  11416. +
  11417. + // send the write opcode the EEPORM
  11418. + shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3);
  11419. +
  11420. + // select which word in the EEPROM that we are writing to.
  11421. + shift_out_bits(padapter, reg, padapter->EepromAddressSize);
  11422. +
  11423. + // write the data to the selected EEPROM word.
  11424. + shift_out_bits(padapter, data, 16);
  11425. +
  11426. + if (wait_eeprom_cmd_done(padapter ) == _FALSE)
  11427. + {
  11428. +
  11429. + goto exit;
  11430. + }
  11431. +
  11432. + standby(padapter );
  11433. +
  11434. + shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5);
  11435. + shift_out_bits(padapter, reg, 4);
  11436. +
  11437. + eeprom_clean(padapter );
  11438. +exit:
  11439. +#ifdef CONFIG_RTL8712
  11440. + if(tmp8_clk_new!=tmp8_clk_ori)
  11441. + rtw_write8(padapter, 0x10250003, tmp8_clk_ori);
  11442. + if(tmp8_new!=tmp8_ori)
  11443. + rtw_write8(padapter, 0x102502f1, tmp8_ori);
  11444. +
  11445. +#endif
  11446. +_func_exit_;
  11447. + return;
  11448. +}
  11449. +
  11450. +u16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom
  11451. +{
  11452. +
  11453. + u16 x;
  11454. + u16 data=0;
  11455. +#ifdef CONFIG_RTL8712
  11456. + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new;
  11457. + tmp8_ori= rtw_read8(padapter, 0x102502f1);
  11458. + tmp8_new = tmp8_ori & 0xf7;
  11459. + if(tmp8_ori != tmp8_new){
  11460. + rtw_write8(padapter, 0x102502f1, tmp8_new);
  11461. + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n"));
  11462. + }
  11463. + tmp8_clk_ori=rtw_read8(padapter,0x10250003);
  11464. + tmp8_clk_new=tmp8_clk_ori|0x20;
  11465. + if(tmp8_clk_new!=tmp8_clk_ori){
  11466. + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n"));
  11467. + rtw_write8(padapter, 0x10250003, tmp8_clk_new);
  11468. + }
  11469. +#endif
  11470. +_func_enter_;
  11471. +
  11472. + if(padapter->bSurpriseRemoved==_TRUE){
  11473. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11474. + goto out;
  11475. + }
  11476. + // select EEPROM, reset bits, set _EECS
  11477. + x = rtw_read8(padapter, EE_9346CR);
  11478. +
  11479. + if(padapter->bSurpriseRemoved==_TRUE){
  11480. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11481. + goto out;
  11482. + }
  11483. +
  11484. + x &= ~(_EEDI | _EEDO | _EESK | _EEM0);
  11485. + x |= _EEM1 | _EECS;
  11486. + rtw_write8(padapter, EE_9346CR, (unsigned char)x);
  11487. +
  11488. + // write the read opcode and register number in that order
  11489. + // The opcode is 3bits in length, reg is 6 bits long
  11490. + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3);
  11491. + shift_out_bits(padapter, reg, padapter->EepromAddressSize);
  11492. +
  11493. + // Now read the data (16 bits) in from the selected EEPROM word
  11494. + data = shift_in_bits(padapter);
  11495. +
  11496. + eeprom_clean(padapter);
  11497. +out:
  11498. +#ifdef CONFIG_RTL8712
  11499. + if(tmp8_clk_new!=tmp8_clk_ori)
  11500. + rtw_write8(padapter, 0x10250003, tmp8_clk_ori);
  11501. + if(tmp8_new!=tmp8_ori)
  11502. + rtw_write8(padapter, 0x102502f1, tmp8_ori);
  11503. +
  11504. +#endif
  11505. +_func_exit_;
  11506. + return data;
  11507. +
  11508. +
  11509. +}
  11510. +
  11511. +
  11512. +
  11513. +
  11514. +//From even offset
  11515. +void eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz)
  11516. +{
  11517. +
  11518. + u16 x, data16;
  11519. + u32 i;
  11520. +_func_enter_;
  11521. + if(padapter->bSurpriseRemoved==_TRUE){
  11522. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11523. + goto out;
  11524. + }
  11525. + // select EEPROM, reset bits, set _EECS
  11526. + x = rtw_read8(padapter, EE_9346CR);
  11527. +
  11528. + if(padapter->bSurpriseRemoved==_TRUE){
  11529. + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE"));
  11530. + goto out;
  11531. + }
  11532. +
  11533. + x &= ~(_EEDI | _EEDO | _EESK | _EEM0);
  11534. + x |= _EEM1 | _EECS;
  11535. + rtw_write8(padapter, EE_9346CR, (unsigned char)x);
  11536. +
  11537. + // write the read opcode and register number in that order
  11538. + // The opcode is 3bits in length, reg is 6 bits long
  11539. + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3);
  11540. + shift_out_bits(padapter, reg, padapter->EepromAddressSize);
  11541. +
  11542. +
  11543. + for(i=0; i<sz; i+=2)
  11544. + {
  11545. + data16 = shift_in_bits(padapter);
  11546. + data[i] = data16 & 0xff;
  11547. + data[i+1] = data16 >>8;
  11548. + }
  11549. +
  11550. + eeprom_clean(padapter);
  11551. +out:
  11552. +_func_exit_;
  11553. +
  11554. +
  11555. +
  11556. +}
  11557. +
  11558. +
  11559. +//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg)
  11560. +u8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf)
  11561. +{
  11562. + u8 quotient, remainder, addr_2align_odd;
  11563. + u16 reg, stmp , i=0, idx = 0;
  11564. +_func_enter_;
  11565. + reg = (u16)(addr_off >> 1);
  11566. + addr_2align_odd = (u8)(addr_off & 0x1);
  11567. +
  11568. + if(addr_2align_odd) //read that start at high part: e.g 1,3,5,7,9,...
  11569. + {
  11570. + stmp = eeprom_read16(padapter, reg);
  11571. + rbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short
  11572. + reg++; sz--;
  11573. + }
  11574. +
  11575. + quotient = sz >> 1;
  11576. + remainder = sz & 0x1;
  11577. +
  11578. + for( i=0 ; i < quotient; i++)
  11579. + {
  11580. + stmp = eeprom_read16(padapter, reg+i);
  11581. + rbuf[idx++] = (u8) (stmp&0xff);
  11582. + rbuf[idx++] = (u8) ((stmp>>8)&0xff);
  11583. + }
  11584. +
  11585. + reg = reg+i;
  11586. + if(remainder){ //end of read at lower part of short : 0,2,4,6,...
  11587. + stmp = eeprom_read16(padapter, reg);
  11588. + rbuf[idx] = (u8)(stmp & 0xff);
  11589. + }
  11590. +_func_exit_;
  11591. + return _TRUE;
  11592. +}
  11593. +
  11594. +
  11595. +
  11596. +VOID read_eeprom_content(_adapter * padapter)
  11597. +{
  11598. +
  11599. +_func_enter_;
  11600. +
  11601. +
  11602. +_func_exit_;
  11603. +}
  11604. --- /dev/null
  11605. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c
  11606. @@ -0,0 +1,1914 @@
  11607. +/******************************************************************************
  11608. + *
  11609. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  11610. + *
  11611. + * This program is free software; you can redistribute it and/or modify it
  11612. + * under the terms of version 2 of the GNU General Public License as
  11613. + * published by the Free Software Foundation.
  11614. + *
  11615. + * This program is distributed in the hope that it will be useful, but WITHOUT
  11616. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11617. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11618. + * more details.
  11619. + *
  11620. + * You should have received a copy of the GNU General Public License along with
  11621. + * this program; if not, write to the Free Software Foundation, Inc.,
  11622. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  11623. + *
  11624. + *
  11625. + ******************************************************************************/
  11626. +#define _IEEE80211_C
  11627. +
  11628. +#include <drv_types.h>
  11629. +#include <ieee80211.h>
  11630. +#include <wifi.h>
  11631. +#include <osdep_service.h>
  11632. +#include <wlan_bssdef.h>
  11633. +
  11634. +u8 RTW_WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 };
  11635. +u16 RTW_WPA_VERSION = 1;
  11636. +u8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 };
  11637. +u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 };
  11638. +u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 };
  11639. +u8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 };
  11640. +u8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 };
  11641. +u8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 };
  11642. +u8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 };
  11643. +u8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 };
  11644. +u8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 };
  11645. +
  11646. +u16 RSN_VERSION_BSD = 1;
  11647. +u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 };
  11648. +u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 };
  11649. +u8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 };
  11650. +u8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 };
  11651. +u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 };
  11652. +u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 };
  11653. +u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 };
  11654. +u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 };
  11655. +//-----------------------------------------------------------
  11656. +// for adhoc-master to generate ie and provide supported-rate to fw
  11657. +//-----------------------------------------------------------
  11658. +
  11659. +static u8 WIFI_CCKRATES[] =
  11660. +{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK),
  11661. + (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK),
  11662. + (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK),
  11663. + (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)};
  11664. +
  11665. +static u8 WIFI_OFDMRATES[] =
  11666. +{(IEEE80211_OFDM_RATE_6MB),
  11667. + (IEEE80211_OFDM_RATE_9MB),
  11668. + (IEEE80211_OFDM_RATE_12MB),
  11669. + (IEEE80211_OFDM_RATE_18MB),
  11670. + (IEEE80211_OFDM_RATE_24MB),
  11671. + IEEE80211_OFDM_RATE_36MB,
  11672. + IEEE80211_OFDM_RATE_48MB,
  11673. + IEEE80211_OFDM_RATE_54MB};
  11674. +
  11675. +
  11676. +int rtw_get_bit_value_from_ieee_value(u8 val)
  11677. +{
  11678. + unsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!!
  11679. +
  11680. + int i=0;
  11681. + while(dot11_rate_table[i] != 0) {
  11682. + if (dot11_rate_table[i] == val)
  11683. + return BIT(i);
  11684. + i++;
  11685. + }
  11686. + return 0;
  11687. +}
  11688. +
  11689. +uint rtw_is_cckrates_included(u8 *rate)
  11690. +{
  11691. + u32 i = 0;
  11692. +
  11693. + while(rate[i]!=0)
  11694. + {
  11695. + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) ||
  11696. + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) )
  11697. + return _TRUE;
  11698. + i++;
  11699. + }
  11700. +
  11701. + return _FALSE;
  11702. +}
  11703. +
  11704. +uint rtw_is_cckratesonly_included(u8 *rate)
  11705. +{
  11706. + u32 i = 0;
  11707. +
  11708. +
  11709. + while(rate[i]!=0)
  11710. + {
  11711. + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
  11712. + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) )
  11713. +
  11714. + return _FALSE;
  11715. +
  11716. + i++;
  11717. + }
  11718. +
  11719. + return _TRUE;
  11720. +
  11721. +}
  11722. +
  11723. +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel)
  11724. +{
  11725. + if (channel > 14)
  11726. + {
  11727. + if ((rtw_is_cckrates_included(rate)) == _TRUE)
  11728. + return WIRELESS_INVALID;
  11729. + else
  11730. + return WIRELESS_11A;
  11731. + }
  11732. + else // could be pure B, pure G, or B/G
  11733. + {
  11734. + if ((rtw_is_cckratesonly_included(rate)) == _TRUE)
  11735. + return WIRELESS_11B;
  11736. + else if((rtw_is_cckrates_included(rate)) == _TRUE)
  11737. + return WIRELESS_11BG;
  11738. + else
  11739. + return WIRELESS_11G;
  11740. + }
  11741. +
  11742. +}
  11743. +
  11744. +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source,
  11745. + unsigned int *frlen)
  11746. +{
  11747. + _rtw_memcpy((void *)pbuf, (void *)source, len);
  11748. + *frlen = *frlen + len;
  11749. + return (pbuf + len);
  11750. +}
  11751. +
  11752. +// rtw_set_ie will update frame length
  11753. +u8 *rtw_set_ie
  11754. +(
  11755. + u8 *pbuf,
  11756. + sint index,
  11757. + uint len,
  11758. + u8 *source,
  11759. + uint *frlen //frame length
  11760. +)
  11761. +{
  11762. +_func_enter_;
  11763. + *pbuf = (u8)index;
  11764. +
  11765. + *(pbuf + 1) = (u8)len;
  11766. +
  11767. + if (len > 0)
  11768. + _rtw_memcpy((void *)(pbuf + 2), (void *)source, len);
  11769. +
  11770. + *frlen = *frlen + (len + 2);
  11771. +
  11772. + return (pbuf + len + 2);
  11773. +_func_exit_;
  11774. +}
  11775. +
  11776. +inline u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode,
  11777. + u8 new_ch, u8 ch_switch_cnt)
  11778. +{
  11779. + u8 ie_data[3];
  11780. +
  11781. + ie_data[0] = ch_switch_mode;
  11782. + ie_data[1] = new_ch;
  11783. + ie_data[2] = ch_switch_cnt;
  11784. + return rtw_set_ie(buf, WLAN_EID_CHANNEL_SWITCH, 3, ie_data, buf_len);
  11785. +}
  11786. +
  11787. +inline u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset)
  11788. +{
  11789. + if (ch_offset == SCN)
  11790. + return HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  11791. + else if(ch_offset == SCA)
  11792. + return HAL_PRIME_CHNL_OFFSET_UPPER;
  11793. + else if(ch_offset == SCB)
  11794. + return HAL_PRIME_CHNL_OFFSET_LOWER;
  11795. +
  11796. + return HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  11797. +}
  11798. +
  11799. +inline u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset)
  11800. +{
  11801. + if (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)
  11802. + return SCN;
  11803. + else if(ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
  11804. + return SCB;
  11805. + else if(ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
  11806. + return SCA;
  11807. +
  11808. + return SCN;
  11809. +}
  11810. +
  11811. +inline u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch_offset)
  11812. +{
  11813. + return rtw_set_ie(buf, WLAN_EID_SECONDARY_CHANNEL_OFFSET, 1, &secondary_ch_offset, buf_len);
  11814. +}
  11815. +
  11816. +inline u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl,
  11817. + u8 flags, u16 reason, u16 precedence)
  11818. +{
  11819. + u8 ie_data[6];
  11820. +
  11821. + ie_data[0] = ttl;
  11822. + ie_data[1] = flags;
  11823. + RTW_PUT_LE16((u8*)&ie_data[2], reason);
  11824. + RTW_PUT_LE16((u8*)&ie_data[4], precedence);
  11825. +
  11826. + return rtw_set_ie(buf, 0x118, 6, ie_data, buf_len);
  11827. +}
  11828. +
  11829. +/*----------------------------------------------------------------------------
  11830. +index: the information element id index, limit is the limit for search
  11831. +-----------------------------------------------------------------------------*/
  11832. +u8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit)
  11833. +{
  11834. + sint tmp,i;
  11835. + u8 *p;
  11836. +_func_enter_;
  11837. + if (limit < 1){
  11838. + _func_exit_;
  11839. + return NULL;
  11840. + }
  11841. +
  11842. + p = pbuf;
  11843. + i = 0;
  11844. + *len = 0;
  11845. + while(1)
  11846. + {
  11847. + if (*p == index)
  11848. + {
  11849. + *len = *(p + 1);
  11850. + return (p);
  11851. + }
  11852. + else
  11853. + {
  11854. + tmp = *(p + 1);
  11855. + p += (tmp + 2);
  11856. + i += (tmp + 2);
  11857. + }
  11858. + if (i >= limit)
  11859. + break;
  11860. + }
  11861. +_func_exit_;
  11862. + return NULL;
  11863. +}
  11864. +
  11865. +/**
  11866. + * rtw_get_ie_ex - Search specific IE from a series of IEs
  11867. + * @in_ie: Address of IEs to search
  11868. + * @in_len: Length limit from in_ie
  11869. + * @eid: Element ID to match
  11870. + * @oui: OUI to match
  11871. + * @oui_len: OUI length
  11872. + * @ie: If not NULL and the specific IE is found, the IE will be copied to the buf starting from the specific IE
  11873. + * @ielen: If not NULL and the specific IE is found, will set to the length of the entire IE
  11874. + *
  11875. + * Returns: The address of the specific IE found, or NULL
  11876. + */
  11877. +u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen)
  11878. +{
  11879. + uint cnt;
  11880. + u8 *target_ie = NULL;
  11881. +
  11882. +
  11883. + if(ielen)
  11884. + *ielen = 0;
  11885. +
  11886. + if(!in_ie || in_len<=0)
  11887. + return target_ie;
  11888. +
  11889. + cnt = 0;
  11890. +
  11891. + while(cnt<in_len)
  11892. + {
  11893. + if(eid == in_ie[cnt]
  11894. + && ( !oui || _rtw_memcmp(&in_ie[cnt+2], oui, oui_len) == _TRUE))
  11895. + {
  11896. + target_ie = &in_ie[cnt];
  11897. +
  11898. + if(ie)
  11899. + _rtw_memcpy(ie, &in_ie[cnt], in_ie[cnt+1]+2);
  11900. +
  11901. + if(ielen)
  11902. + *ielen = in_ie[cnt+1]+2;
  11903. +
  11904. + break;
  11905. + }
  11906. + else
  11907. + {
  11908. + cnt+=in_ie[cnt+1]+2; //goto next
  11909. + }
  11910. +
  11911. + }
  11912. +
  11913. + return target_ie;
  11914. +}
  11915. +
  11916. +/**
  11917. + * rtw_ies_remove_ie - Find matching IEs and remove
  11918. + * @ies: Address of IEs to search
  11919. + * @ies_len: Pointer of length of ies, will update to new length
  11920. + * @offset: The offset to start scarch
  11921. + * @eid: Element ID to match
  11922. + * @oui: OUI to match
  11923. + * @oui_len: OUI length
  11924. + *
  11925. + * Returns: _SUCCESS: ies is updated, _FAIL: not updated
  11926. + */
  11927. +int rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len)
  11928. +{
  11929. + int ret = _FAIL;
  11930. + u8 *target_ie;
  11931. + u32 target_ielen;
  11932. + u8 *start;
  11933. + uint search_len;
  11934. +
  11935. + if(!ies || !ies_len || *ies_len <= offset)
  11936. + goto exit;
  11937. +
  11938. + start = ies + offset;
  11939. + search_len = *ies_len - offset;
  11940. +
  11941. + while (1) {
  11942. + target_ie = rtw_get_ie_ex(start, search_len, eid, oui, oui_len, NULL, &target_ielen);
  11943. + if (target_ie && target_ielen) {
  11944. + u8 buf[MAX_IE_SZ] = {0};
  11945. + u8 *remain_ies = target_ie + target_ielen;
  11946. + uint remain_len = search_len - (remain_ies - start);
  11947. +
  11948. + _rtw_memcpy(buf, remain_ies, remain_len);
  11949. + _rtw_memcpy(target_ie, buf, remain_len);
  11950. + *ies_len = *ies_len - target_ielen;
  11951. + ret = _SUCCESS;
  11952. +
  11953. + start = target_ie;
  11954. + search_len = remain_len;
  11955. + } else {
  11956. + break;
  11957. + }
  11958. + }
  11959. +exit:
  11960. + return ret;
  11961. +}
  11962. +
  11963. +void rtw_set_supported_rate(u8* SupportedRates, uint mode)
  11964. +{
  11965. +_func_enter_;
  11966. +
  11967. + _rtw_memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);
  11968. +
  11969. + switch (mode)
  11970. + {
  11971. + case WIRELESS_11B:
  11972. + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN);
  11973. + break;
  11974. +
  11975. + case WIRELESS_11G:
  11976. + case WIRELESS_11A:
  11977. + case WIRELESS_11_5N:
  11978. + case WIRELESS_11A_5N://Todo: no basic rate for ofdm ?
  11979. + _rtw_memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN);
  11980. + break;
  11981. +
  11982. + case WIRELESS_11BG:
  11983. + case WIRELESS_11G_24N:
  11984. + case WIRELESS_11_24N:
  11985. + case WIRELESS_11BG_24N:
  11986. + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN);
  11987. + _rtw_memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN);
  11988. + break;
  11989. +
  11990. + }
  11991. +_func_exit_;
  11992. +}
  11993. +
  11994. +uint rtw_get_rateset_len(u8 *rateset)
  11995. +{
  11996. + uint i = 0;
  11997. +_func_enter_;
  11998. + while(1)
  11999. + {
  12000. + if ((rateset[i]) == 0)
  12001. + break;
  12002. +
  12003. + if (i > 12)
  12004. + break;
  12005. +
  12006. + i++;
  12007. + }
  12008. +_func_exit_;
  12009. + return i;
  12010. +}
  12011. +
  12012. +int rtw_generate_ie(struct registry_priv *pregistrypriv)
  12013. +{
  12014. + u8 wireless_mode;
  12015. + int sz = 0, rateLen;
  12016. + WLAN_BSSID_EX* pdev_network = &pregistrypriv->dev_network;
  12017. + u8* ie = pdev_network->IEs;
  12018. +
  12019. +_func_enter_;
  12020. +
  12021. + //timestamp will be inserted by hardware
  12022. + sz += 8;
  12023. + ie += sz;
  12024. +
  12025. + //beacon interval : 2bytes
  12026. + *(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL;
  12027. + sz += 2;
  12028. + ie += 2;
  12029. +
  12030. + //capability info
  12031. + *(u16*)ie = 0;
  12032. +
  12033. + *(u16*)ie |= cpu_to_le16(cap_IBSS);
  12034. +
  12035. + if(pregistrypriv->preamble == PREAMBLE_SHORT)
  12036. + *(u16*)ie |= cpu_to_le16(cap_ShortPremble);
  12037. +
  12038. + if (pdev_network->Privacy)
  12039. + *(u16*)ie |= cpu_to_le16(cap_Privacy);
  12040. +
  12041. + sz += 2;
  12042. + ie += 2;
  12043. +
  12044. + //SSID
  12045. + ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz);
  12046. +
  12047. + //supported rates
  12048. + if(pregistrypriv->wireless_mode == WIRELESS_11ABGN)
  12049. + {
  12050. + if(pdev_network->Configuration.DSConfig > 14)
  12051. + wireless_mode = WIRELESS_11A_5N;
  12052. + else
  12053. + wireless_mode = WIRELESS_11BG_24N;
  12054. + }
  12055. + else
  12056. + {
  12057. + wireless_mode = pregistrypriv->wireless_mode;
  12058. + }
  12059. +
  12060. + rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ;
  12061. +
  12062. + rateLen = rtw_get_rateset_len(pdev_network->SupportedRates);
  12063. +
  12064. + if (rateLen > 8)
  12065. + {
  12066. + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz);
  12067. + //ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz);
  12068. + }
  12069. + else
  12070. + {
  12071. + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz);
  12072. + }
  12073. +
  12074. + //DS parameter set
  12075. + ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz);
  12076. +
  12077. +
  12078. + //IBSS Parameter Set
  12079. +
  12080. + ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz);
  12081. +
  12082. + if (rateLen > 8)
  12083. + {
  12084. + ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz);
  12085. + }
  12086. +
  12087. +
  12088. + //HT Cap.
  12089. + if(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N))
  12090. + && (pregistrypriv->ht_enable==_TRUE))
  12091. + {
  12092. + //todo:
  12093. + }
  12094. +
  12095. + //pdev_network->IELength = sz; //update IELength
  12096. +
  12097. +_func_exit_;
  12098. +
  12099. + //return _SUCCESS;
  12100. +
  12101. + return sz;
  12102. +
  12103. +}
  12104. +
  12105. +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit)
  12106. +{
  12107. + int len;
  12108. + u16 val16;
  12109. + unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01};
  12110. + u8 *pbuf = pie;
  12111. +
  12112. + while(1)
  12113. + {
  12114. + pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit);
  12115. +
  12116. + if (pbuf) {
  12117. +
  12118. + //check if oui matches...
  12119. + if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) {
  12120. +
  12121. + goto check_next_ie;
  12122. + }
  12123. +
  12124. + //check version...
  12125. + _rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16));
  12126. +
  12127. + val16 = le16_to_cpu(val16);
  12128. + if (val16 != 0x0001)
  12129. + goto check_next_ie;
  12130. +
  12131. + *wpa_ie_len = *(pbuf + 1);
  12132. +
  12133. + return pbuf;
  12134. + }
  12135. + else {
  12136. +
  12137. + *wpa_ie_len = 0;
  12138. + return NULL;
  12139. + }
  12140. +
  12141. +check_next_ie:
  12142. +
  12143. + limit -= (2 + len);
  12144. +
  12145. + if (limit <= 0)
  12146. + break;
  12147. +
  12148. + pbuf += (2 + len);
  12149. + }
  12150. +
  12151. + *wpa_ie_len = 0;
  12152. +
  12153. + return NULL;
  12154. +}
  12155. +
  12156. +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit)
  12157. +{
  12158. +
  12159. + return rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit);
  12160. +
  12161. +}
  12162. +
  12163. +int rtw_get_wpa_cipher_suite(u8 *s)
  12164. +{
  12165. + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN) == _TRUE)
  12166. + return WPA_CIPHER_NONE;
  12167. + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN) == _TRUE)
  12168. + return WPA_CIPHER_WEP40;
  12169. + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN) == _TRUE)
  12170. + return WPA_CIPHER_TKIP;
  12171. + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN) == _TRUE)
  12172. + return WPA_CIPHER_CCMP;
  12173. + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN) == _TRUE)
  12174. + return WPA_CIPHER_WEP104;
  12175. +
  12176. + return 0;
  12177. +}
  12178. +
  12179. +int rtw_get_wpa2_cipher_suite(u8 *s)
  12180. +{
  12181. + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN) == _TRUE)
  12182. + return WPA_CIPHER_NONE;
  12183. + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN) == _TRUE)
  12184. + return WPA_CIPHER_WEP40;
  12185. + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN) == _TRUE)
  12186. + return WPA_CIPHER_TKIP;
  12187. + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN) == _TRUE)
  12188. + return WPA_CIPHER_CCMP;
  12189. + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN) == _TRUE)
  12190. + return WPA_CIPHER_WEP104;
  12191. +
  12192. + return 0;
  12193. +}
  12194. +
  12195. +
  12196. +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher)
  12197. +{
  12198. + int i, ret=_SUCCESS;
  12199. + int left, count;
  12200. + u8 *pos;
  12201. +
  12202. + if (wpa_ie_len <= 0) {
  12203. + /* No WPA IE - fail silently */
  12204. + return _FAIL;
  12205. + }
  12206. +
  12207. +
  12208. + if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) ||
  12209. + (_rtw_memcmp(wpa_ie+2, RTW_WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) )
  12210. + {
  12211. + return _FAIL;
  12212. + }
  12213. +
  12214. + pos = wpa_ie;
  12215. +
  12216. + pos += 8;
  12217. + left = wpa_ie_len - 8;
  12218. +
  12219. +
  12220. + //group_cipher
  12221. + if (left >= WPA_SELECTOR_LEN) {
  12222. +
  12223. + *group_cipher = rtw_get_wpa_cipher_suite(pos);
  12224. +
  12225. + pos += WPA_SELECTOR_LEN;
  12226. + left -= WPA_SELECTOR_LEN;
  12227. +
  12228. + }
  12229. + else if (left > 0)
  12230. + {
  12231. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left));
  12232. +
  12233. + return _FAIL;
  12234. + }
  12235. +
  12236. +
  12237. + //pairwise_cipher
  12238. + if (left >= 2)
  12239. + {
  12240. + //count = le16_to_cpu(*(u16*)pos);
  12241. + count = RTW_GET_LE16(pos);
  12242. + pos += 2;
  12243. + left -= 2;
  12244. +
  12245. + if (count == 0 || left < count * WPA_SELECTOR_LEN) {
  12246. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), "
  12247. + "count %u left %u", __FUNCTION__, count, left));
  12248. + return _FAIL;
  12249. + }
  12250. +
  12251. + for (i = 0; i < count; i++)
  12252. + {
  12253. + *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos);
  12254. +
  12255. + pos += WPA_SELECTOR_LEN;
  12256. + left -= WPA_SELECTOR_LEN;
  12257. + }
  12258. +
  12259. + }
  12260. + else if (left == 1)
  12261. + {
  12262. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__));
  12263. + return _FAIL;
  12264. + }
  12265. +
  12266. +
  12267. + return ret;
  12268. +
  12269. +}
  12270. +
  12271. +int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher)
  12272. +{
  12273. + int i, ret=_SUCCESS;
  12274. + int left, count;
  12275. + u8 *pos;
  12276. +
  12277. + if (rsn_ie_len <= 0) {
  12278. + /* No RSN IE - fail silently */
  12279. + return _FAIL;
  12280. + }
  12281. +
  12282. +
  12283. + if ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2)))
  12284. + {
  12285. + return _FAIL;
  12286. + }
  12287. +
  12288. + pos = rsn_ie;
  12289. + pos += 4;
  12290. + left = rsn_ie_len - 4;
  12291. +
  12292. + //group_cipher
  12293. + if (left >= RSN_SELECTOR_LEN) {
  12294. +
  12295. + *group_cipher = rtw_get_wpa2_cipher_suite(pos);
  12296. +
  12297. + pos += RSN_SELECTOR_LEN;
  12298. + left -= RSN_SELECTOR_LEN;
  12299. +
  12300. + } else if (left > 0) {
  12301. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left));
  12302. + return _FAIL;
  12303. + }
  12304. +
  12305. + //pairwise_cipher
  12306. + if (left >= 2)
  12307. + {
  12308. + //count = le16_to_cpu(*(u16*)pos);
  12309. + count = RTW_GET_LE16(pos);
  12310. + pos += 2;
  12311. + left -= 2;
  12312. +
  12313. + if (count == 0 || left < count * RSN_SELECTOR_LEN) {
  12314. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), "
  12315. + "count %u left %u", __FUNCTION__, count, left));
  12316. + return _FAIL;
  12317. + }
  12318. +
  12319. + for (i = 0; i < count; i++)
  12320. + {
  12321. + *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos);
  12322. +
  12323. + pos += RSN_SELECTOR_LEN;
  12324. + left -= RSN_SELECTOR_LEN;
  12325. + }
  12326. +
  12327. + }
  12328. + else if (left == 1)
  12329. + {
  12330. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__));
  12331. +
  12332. + return _FAIL;
  12333. + }
  12334. +
  12335. +
  12336. + return ret;
  12337. +
  12338. +}
  12339. +
  12340. +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len)
  12341. +{
  12342. + u8 authmode, sec_idx, i;
  12343. + u8 wpa_oui[4]={0x0,0x50,0xf2,0x01};
  12344. + uint cnt;
  12345. +
  12346. +_func_enter_;
  12347. +
  12348. + //Search required WPA or WPA2 IE and copy to sec_ie[ ]
  12349. +
  12350. + cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_);
  12351. +
  12352. + sec_idx=0;
  12353. +
  12354. + while(cnt<in_len)
  12355. + {
  12356. + authmode=in_ie[cnt];
  12357. +
  12358. + if((authmode==_WPA_IE_ID_)&&(_rtw_memcmp(&in_ie[cnt+2], &wpa_oui[0],4)==_TRUE))
  12359. + {
  12360. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_get_wpa_ie: sec_idx=%d in_ie[cnt+1]+2=%d\n",sec_idx,in_ie[cnt+1]+2));
  12361. +
  12362. + _rtw_memcpy(wpa_ie, &in_ie[cnt],in_ie[cnt+1]+2);
  12363. +
  12364. + for(i=0;i<(in_ie[cnt+1]+2);i=i+8){
  12365. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n %2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x\n",wpa_ie[i],wpa_ie[i+1],wpa_ie[i+2],wpa_ie[i+3],wpa_ie[i+4],wpa_ie[i+5],wpa_ie[i+6],wpa_ie[i+7]));
  12366. + }
  12367. +
  12368. + *wpa_len=in_ie[cnt+1]+2;
  12369. + cnt+=in_ie[cnt+1]+2; //get next
  12370. + }
  12371. + else
  12372. + {
  12373. + if(authmode==_WPA2_IE_ID_)
  12374. + {
  12375. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n get_rsn_ie: sec_idx=%d in_ie[cnt+1]+2=%d\n",sec_idx,in_ie[cnt+1]+2));
  12376. +
  12377. + _rtw_memcpy(rsn_ie, &in_ie[cnt],in_ie[cnt+1]+2);
  12378. +
  12379. + for(i=0;i<(in_ie[cnt+1]+2);i=i+8){
  12380. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n %2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x\n",rsn_ie[i],rsn_ie[i+1],rsn_ie[i+2],rsn_ie[i+3],rsn_ie[i+4],rsn_ie[i+5],rsn_ie[i+6],rsn_ie[i+7]));
  12381. + }
  12382. +
  12383. + *rsn_len=in_ie[cnt+1]+2;
  12384. + cnt+=in_ie[cnt+1]+2; //get next
  12385. + }
  12386. + else
  12387. + {
  12388. + cnt+=in_ie[cnt+1]+2; //get next
  12389. + }
  12390. + }
  12391. +
  12392. + }
  12393. +
  12394. +_func_exit_;
  12395. +
  12396. + return (*rsn_len+*wpa_len);
  12397. +
  12398. +}
  12399. +
  12400. +u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen)
  12401. +{
  12402. + u8 match = _FALSE;
  12403. + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};
  12404. +
  12405. + if(ie_ptr == NULL) return match;
  12406. +
  12407. + eid = ie_ptr[0];
  12408. +
  12409. + if((eid==_WPA_IE_ID_)&&(_rtw_memcmp(&ie_ptr[2], wps_oui, 4)==_TRUE))
  12410. + {
  12411. + //printk("==> found WPS_IE.....\n");
  12412. + *wps_ielen = ie_ptr[1]+2;
  12413. + match=_TRUE;
  12414. + }
  12415. + return match;
  12416. +}
  12417. +
  12418. +/**
  12419. + * rtw_get_wps_ie - Search WPS IE from a series of IEs
  12420. + * @in_ie: Address of IEs to search
  12421. + * @in_len: Length limit from in_ie
  12422. + * @wps_ie: If not NULL and WPS IE is found, WPS IE will be copied to the buf starting from wps_ie
  12423. + * @wps_ielen: If not NULL and WPS IE is found, will set to the length of the entire WPS IE
  12424. + *
  12425. + * Returns: The address of the WPS IE found, or NULL
  12426. + */
  12427. +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
  12428. +{
  12429. + uint cnt;
  12430. + u8 *wpsie_ptr=NULL;
  12431. + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};
  12432. +
  12433. + if(wps_ielen)
  12434. + *wps_ielen = 0;
  12435. +
  12436. + if(!in_ie || in_len<=0)
  12437. + return wpsie_ptr;
  12438. +
  12439. + cnt = 0;
  12440. +
  12441. + while(cnt<in_len)
  12442. + {
  12443. + eid = in_ie[cnt];
  12444. +
  12445. + if((eid==_WPA_IE_ID_)&&(_rtw_memcmp(&in_ie[cnt+2], wps_oui, 4)==_TRUE))
  12446. + {
  12447. + wpsie_ptr = &in_ie[cnt];
  12448. +
  12449. + if(wps_ie)
  12450. + _rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt+1]+2);
  12451. +
  12452. + if(wps_ielen)
  12453. + *wps_ielen = in_ie[cnt+1]+2;
  12454. +
  12455. + cnt+=in_ie[cnt+1]+2;
  12456. +
  12457. + break;
  12458. + }
  12459. + else
  12460. + {
  12461. + cnt+=in_ie[cnt+1]+2; //goto next
  12462. + }
  12463. +
  12464. + }
  12465. +
  12466. + return wpsie_ptr;
  12467. +}
  12468. +
  12469. +/**
  12470. + * rtw_get_wps_attr - Search a specific WPS attribute from a given WPS IE
  12471. + * @wps_ie: Address of WPS IE to search
  12472. + * @wps_ielen: Length limit from wps_ie
  12473. + * @target_attr_id: The attribute ID of WPS attribute to search
  12474. + * @buf_attr: If not NULL and the WPS attribute is found, WPS attribute will be copied to the buf starting from buf_attr
  12475. + * @len_attr: If not NULL and the WPS attribute is found, will set to the length of the entire WPS attribute
  12476. + *
  12477. + * Returns: the address of the specific WPS attribute found, or NULL
  12478. + */
  12479. +u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr)
  12480. +{
  12481. + u8 *attr_ptr = NULL;
  12482. + u8 * target_attr_ptr = NULL;
  12483. + u8 wps_oui[4]={0x00,0x50,0xF2,0x04};
  12484. +
  12485. + if(len_attr)
  12486. + *len_attr = 0;
  12487. +
  12488. + if ( ( wps_ie[0] != _VENDOR_SPECIFIC_IE_ ) ||
  12489. + ( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) )
  12490. + {
  12491. + return attr_ptr;
  12492. + }
  12493. +
  12494. + // 6 = 1(Element ID) + 1(Length) + 4(WPS OUI)
  12495. + attr_ptr = wps_ie + 6; //goto first attr
  12496. +
  12497. + while(attr_ptr - wps_ie < wps_ielen)
  12498. + {
  12499. + // 4 = 2(Attribute ID) + 2(Length)
  12500. + u16 attr_id = RTW_GET_BE16(attr_ptr);
  12501. + u16 attr_data_len = RTW_GET_BE16(attr_ptr + 2);
  12502. + u16 attr_len = attr_data_len + 4;
  12503. +
  12504. + //DBG_871X("%s attr_ptr:%p, id:%u, length:%u\n", __FUNCTION__, attr_ptr, attr_id, attr_data_len);
  12505. + if( attr_id == target_attr_id )
  12506. + {
  12507. + target_attr_ptr = attr_ptr;
  12508. +
  12509. + if(buf_attr)
  12510. + _rtw_memcpy(buf_attr, attr_ptr, attr_len);
  12511. +
  12512. + if(len_attr)
  12513. + *len_attr = attr_len;
  12514. +
  12515. + break;
  12516. + }
  12517. + else
  12518. + {
  12519. + attr_ptr += attr_len; //goto next
  12520. + }
  12521. +
  12522. + }
  12523. +
  12524. + return target_attr_ptr;
  12525. +}
  12526. +
  12527. +/**
  12528. + * rtw_get_wps_attr_content - Search a specific WPS attribute content from a given WPS IE
  12529. + * @wps_ie: Address of WPS IE to search
  12530. + * @wps_ielen: Length limit from wps_ie
  12531. + * @target_attr_id: The attribute ID of WPS attribute to search
  12532. + * @buf_content: If not NULL and the WPS attribute is found, WPS attribute content will be copied to the buf starting from buf_content
  12533. + * @len_content: If not NULL and the WPS attribute is found, will set to the length of the WPS attribute content
  12534. + *
  12535. + * Returns: the address of the specific WPS attribute content found, or NULL
  12536. + */
  12537. +u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content)
  12538. +{
  12539. + u8 *attr_ptr;
  12540. + u32 attr_len;
  12541. +
  12542. + if(len_content)
  12543. + *len_content = 0;
  12544. +
  12545. + attr_ptr = rtw_get_wps_attr(wps_ie, wps_ielen, target_attr_id, NULL, &attr_len);
  12546. +
  12547. + if(attr_ptr && attr_len)
  12548. + {
  12549. + if(buf_content)
  12550. + _rtw_memcpy(buf_content, attr_ptr+4, attr_len-4);
  12551. +
  12552. + if(len_content)
  12553. + *len_content = attr_len-4;
  12554. +
  12555. + return attr_ptr+4;
  12556. + }
  12557. +
  12558. + return NULL;
  12559. +}
  12560. +
  12561. +static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
  12562. + struct rtw_ieee802_11_elems *elems,
  12563. + int show_errors)
  12564. +{
  12565. + unsigned int oui;
  12566. +
  12567. + /* first 3 bytes in vendor specific information element are the IEEE
  12568. + * OUI of the vendor. The following byte is used a vendor specific
  12569. + * sub-type. */
  12570. + if (elen < 4) {
  12571. + if (show_errors) {
  12572. + DBG_871X("short vendor specific "
  12573. + "information element ignored (len=%lu)\n",
  12574. + (unsigned long) elen);
  12575. + }
  12576. + return -1;
  12577. + }
  12578. +
  12579. + oui = RTW_GET_BE24(pos);
  12580. + switch (oui) {
  12581. + case OUI_MICROSOFT:
  12582. + /* Microsoft/Wi-Fi information elements are further typed and
  12583. + * subtyped */
  12584. + switch (pos[3]) {
  12585. + case 1:
  12586. + /* Microsoft OUI (00:50:F2) with OUI Type 1:
  12587. + * real WPA information element */
  12588. + elems->wpa_ie = pos;
  12589. + elems->wpa_ie_len = elen;
  12590. + break;
  12591. + case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */
  12592. + if (elen < 5) {
  12593. + DBG_871X("short WME "
  12594. + "information element ignored "
  12595. + "(len=%lu)\n",
  12596. + (unsigned long) elen);
  12597. + return -1;
  12598. + }
  12599. + switch (pos[4]) {
  12600. + case WME_OUI_SUBTYPE_INFORMATION_ELEMENT:
  12601. + case WME_OUI_SUBTYPE_PARAMETER_ELEMENT:
  12602. + elems->wme = pos;
  12603. + elems->wme_len = elen;
  12604. + break;
  12605. + case WME_OUI_SUBTYPE_TSPEC_ELEMENT:
  12606. + elems->wme_tspec = pos;
  12607. + elems->wme_tspec_len = elen;
  12608. + break;
  12609. + default:
  12610. + DBG_871X("unknown WME "
  12611. + "information element ignored "
  12612. + "(subtype=%d len=%lu)\n",
  12613. + pos[4], (unsigned long) elen);
  12614. + return -1;
  12615. + }
  12616. + break;
  12617. + case 4:
  12618. + /* Wi-Fi Protected Setup (WPS) IE */
  12619. + elems->wps_ie = pos;
  12620. + elems->wps_ie_len = elen;
  12621. + break;
  12622. + default:
  12623. + DBG_871X("Unknown Microsoft "
  12624. + "information element ignored "
  12625. + "(type=%d len=%lu)\n",
  12626. + pos[3], (unsigned long) elen);
  12627. + return -1;
  12628. + }
  12629. + break;
  12630. +
  12631. + case OUI_BROADCOM:
  12632. + switch (pos[3]) {
  12633. + case VENDOR_HT_CAPAB_OUI_TYPE:
  12634. + elems->vendor_ht_cap = pos;
  12635. + elems->vendor_ht_cap_len = elen;
  12636. + break;
  12637. + default:
  12638. + DBG_871X("Unknown Broadcom "
  12639. + "information element ignored "
  12640. + "(type=%d len=%lu)\n",
  12641. + pos[3], (unsigned long) elen);
  12642. + return -1;
  12643. + }
  12644. + break;
  12645. +
  12646. + default:
  12647. + DBG_871X("unknown vendor specific information "
  12648. + "element ignored (vendor OUI %02x:%02x:%02x "
  12649. + "len=%lu)\n",
  12650. + pos[0], pos[1], pos[2], (unsigned long) elen);
  12651. + return -1;
  12652. + }
  12653. +
  12654. + return 0;
  12655. +
  12656. +}
  12657. +
  12658. +/**
  12659. + * ieee802_11_parse_elems - Parse information elements in management frames
  12660. + * @start: Pointer to the start of IEs
  12661. + * @len: Length of IE buffer in octets
  12662. + * @elems: Data structure for parsed elements
  12663. + * @show_errors: Whether to show parsing errors in debug log
  12664. + * Returns: Parsing result
  12665. + */
  12666. +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,
  12667. + struct rtw_ieee802_11_elems *elems,
  12668. + int show_errors)
  12669. +{
  12670. + uint left = len;
  12671. + u8 *pos = start;
  12672. + int unknown = 0;
  12673. +
  12674. + _rtw_memset(elems, 0, sizeof(*elems));
  12675. +
  12676. + while (left >= 2) {
  12677. + u8 id, elen;
  12678. +
  12679. + id = *pos++;
  12680. + elen = *pos++;
  12681. + left -= 2;
  12682. +
  12683. + if (elen > left) {
  12684. + if (show_errors) {
  12685. + DBG_871X("IEEE 802.11 element "
  12686. + "parse failed (id=%d elen=%d "
  12687. + "left=%lu)\n",
  12688. + id, elen, (unsigned long) left);
  12689. + }
  12690. + return ParseFailed;
  12691. + }
  12692. +
  12693. + switch (id) {
  12694. + case WLAN_EID_SSID:
  12695. + elems->ssid = pos;
  12696. + elems->ssid_len = elen;
  12697. + break;
  12698. + case WLAN_EID_SUPP_RATES:
  12699. + elems->supp_rates = pos;
  12700. + elems->supp_rates_len = elen;
  12701. + break;
  12702. + case WLAN_EID_FH_PARAMS:
  12703. + elems->fh_params = pos;
  12704. + elems->fh_params_len = elen;
  12705. + break;
  12706. + case WLAN_EID_DS_PARAMS:
  12707. + elems->ds_params = pos;
  12708. + elems->ds_params_len = elen;
  12709. + break;
  12710. + case WLAN_EID_CF_PARAMS:
  12711. + elems->cf_params = pos;
  12712. + elems->cf_params_len = elen;
  12713. + break;
  12714. + case WLAN_EID_TIM:
  12715. + elems->tim = pos;
  12716. + elems->tim_len = elen;
  12717. + break;
  12718. + case WLAN_EID_IBSS_PARAMS:
  12719. + elems->ibss_params = pos;
  12720. + elems->ibss_params_len = elen;
  12721. + break;
  12722. + case WLAN_EID_CHALLENGE:
  12723. + elems->challenge = pos;
  12724. + elems->challenge_len = elen;
  12725. + break;
  12726. + case WLAN_EID_ERP_INFO:
  12727. + elems->erp_info = pos;
  12728. + elems->erp_info_len = elen;
  12729. + break;
  12730. + case WLAN_EID_EXT_SUPP_RATES:
  12731. + elems->ext_supp_rates = pos;
  12732. + elems->ext_supp_rates_len = elen;
  12733. + break;
  12734. + case WLAN_EID_VENDOR_SPECIFIC:
  12735. + if (rtw_ieee802_11_parse_vendor_specific(pos, elen,
  12736. + elems,
  12737. + show_errors))
  12738. + unknown++;
  12739. + break;
  12740. + case WLAN_EID_RSN:
  12741. + elems->rsn_ie = pos;
  12742. + elems->rsn_ie_len = elen;
  12743. + break;
  12744. + case WLAN_EID_PWR_CAPABILITY:
  12745. + elems->power_cap = pos;
  12746. + elems->power_cap_len = elen;
  12747. + break;
  12748. + case WLAN_EID_SUPPORTED_CHANNELS:
  12749. + elems->supp_channels = pos;
  12750. + elems->supp_channels_len = elen;
  12751. + break;
  12752. + case WLAN_EID_MOBILITY_DOMAIN:
  12753. + elems->mdie = pos;
  12754. + elems->mdie_len = elen;
  12755. + break;
  12756. + case WLAN_EID_FAST_BSS_TRANSITION:
  12757. + elems->ftie = pos;
  12758. + elems->ftie_len = elen;
  12759. + break;
  12760. + case WLAN_EID_TIMEOUT_INTERVAL:
  12761. + elems->timeout_int = pos;
  12762. + elems->timeout_int_len = elen;
  12763. + break;
  12764. + case WLAN_EID_HT_CAP:
  12765. + elems->ht_capabilities = pos;
  12766. + elems->ht_capabilities_len = elen;
  12767. + break;
  12768. + case WLAN_EID_HT_OPERATION:
  12769. + elems->ht_operation = pos;
  12770. + elems->ht_operation_len = elen;
  12771. + break;
  12772. + default:
  12773. + unknown++;
  12774. + if (!show_errors)
  12775. + break;
  12776. + DBG_871X("IEEE 802.11 element parse "
  12777. + "ignored unknown element (id=%d elen=%d)\n",
  12778. + id, elen);
  12779. + break;
  12780. + }
  12781. +
  12782. + left -= elen;
  12783. + pos += elen;
  12784. + }
  12785. +
  12786. + if (left)
  12787. + return ParseFailed;
  12788. +
  12789. + return unknown ? ParseUnknown : ParseOK;
  12790. +
  12791. +}
  12792. +
  12793. +static u8 key_char2num(u8 ch);
  12794. +static u8 key_char2num(u8 ch)
  12795. +{
  12796. + if((ch>='0')&&(ch<='9'))
  12797. + return ch - '0';
  12798. + else if ((ch>='a')&&(ch<='f'))
  12799. + return ch - 'a' + 10;
  12800. + else if ((ch>='A')&&(ch<='F'))
  12801. + return ch - 'A' + 10;
  12802. + else
  12803. + return 0xff;
  12804. +}
  12805. +
  12806. +u8 str_2char2num(u8 hch, u8 lch);
  12807. +u8 str_2char2num(u8 hch, u8 lch)
  12808. +{
  12809. + return ((key_char2num(hch) * 10 ) + key_char2num(lch));
  12810. +}
  12811. +
  12812. +u8 key_2char2num(u8 hch, u8 lch);
  12813. +u8 key_2char2num(u8 hch, u8 lch)
  12814. +{
  12815. + return ((key_char2num(hch) << 4) | key_char2num(lch));
  12816. +}
  12817. +
  12818. +u8 convert_ip_addr(u8 hch, u8 mch, u8 lch)
  12819. +{
  12820. + return ((key_char2num(hch) * 100) + (key_char2num(mch) * 10 ) + key_char2num(lch));
  12821. +}
  12822. +
  12823. +extern char* rtw_initmac;
  12824. +void rtw_macaddr_cfg(u8 *mac_addr)
  12825. +{
  12826. + u8 mac[ETH_ALEN];
  12827. + if(mac_addr == NULL) return;
  12828. +
  12829. + if ( rtw_initmac )
  12830. + { // Users specify the mac address
  12831. + int jj,kk;
  12832. +
  12833. + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
  12834. + {
  12835. + mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]);
  12836. + }
  12837. + _rtw_memcpy(mac_addr, mac, ETH_ALEN);
  12838. + }
  12839. + else
  12840. + { // Use the mac address stored in the Efuse
  12841. + _rtw_memcpy(mac, mac_addr, ETH_ALEN);
  12842. + }
  12843. +
  12844. + if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
  12845. + (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) ||
  12846. + ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) &&
  12847. + (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0)))
  12848. + {
  12849. + mac[0] = 0x00;
  12850. + mac[1] = 0xe0;
  12851. + mac[2] = 0x4c;
  12852. + mac[3] = 0x87;
  12853. + mac[4] = 0x00;
  12854. + mac[5] = 0x00;
  12855. + // use default mac addresss
  12856. + _rtw_memcpy(mac_addr, mac, ETH_ALEN);
  12857. + DBG_871X("MAC Address from efuse error, assign default one !!!\n");
  12858. + }
  12859. +
  12860. + DBG_871X("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr));
  12861. +}
  12862. +
  12863. +void dump_ies(u8 *buf, u32 buf_len) {
  12864. + u8* pos = (u8*)buf;
  12865. + u8 id, len;
  12866. +
  12867. + while(pos-buf<=buf_len){
  12868. + id = *pos;
  12869. + len = *(pos+1);
  12870. +
  12871. + DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
  12872. + #ifdef CONFIG_P2P
  12873. + dump_p2p_ie(pos, len);
  12874. + #endif
  12875. + dump_wps_ie(pos, len);
  12876. +
  12877. + pos+=(2+len);
  12878. + }
  12879. +}
  12880. +
  12881. +void dump_wps_ie(u8 *ie, u32 ie_len) {
  12882. + u8* pos = (u8*)ie;
  12883. + u16 id;
  12884. + u16 len;
  12885. +
  12886. + u8 *wps_ie;
  12887. + uint wps_ielen;
  12888. +
  12889. + wps_ie = rtw_get_wps_ie(ie, ie_len, NULL, &wps_ielen);
  12890. + if(wps_ie != ie || wps_ielen == 0)
  12891. + return;
  12892. +
  12893. + pos+=6;
  12894. + while(pos-ie < ie_len){
  12895. + id = RTW_GET_BE16(pos);
  12896. + len = RTW_GET_BE16(pos + 2);
  12897. +
  12898. + DBG_871X("%s ID:0x%04x, LEN:%u\n", __FUNCTION__, id, len);
  12899. +
  12900. + pos+=(4+len);
  12901. + }
  12902. +}
  12903. +
  12904. +#ifdef CONFIG_P2P
  12905. +/**
  12906. + * rtw_get_p2p_merged_len - Get merged ie length from muitiple p2p ies.
  12907. + * @in_ie: Pointer of the first p2p ie
  12908. + * @in_len: Total len of muiltiple p2p ies
  12909. + * Returns: Length of merged p2p ie length
  12910. + */
  12911. +u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len)
  12912. +{
  12913. + PNDIS_802_11_VARIABLE_IEs pIE;
  12914. + u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 };
  12915. + int i=0;
  12916. + int j=0, len=0;
  12917. +
  12918. + while( i < in_len)
  12919. + {
  12920. + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i);
  12921. +
  12922. + if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) )
  12923. + {
  12924. + len += pIE->Length-4; // 4 is P2P OUI length, don't count it in this loop
  12925. + }
  12926. +
  12927. + i += (pIE->Length + 2);
  12928. + }
  12929. +
  12930. + return len + 4; // Append P2P OUI length at last.
  12931. +}
  12932. +
  12933. +/**
  12934. + * rtw_p2p_merge_ies - Merge muitiple p2p ies into one
  12935. + * @in_ie: Pointer of the first p2p ie
  12936. + * @in_len: Total len of muiltiple p2p ies
  12937. + * @merge_ie: Pointer of merged ie
  12938. + * Returns: Length of merged p2p ie
  12939. + */
  12940. +int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie)
  12941. +{
  12942. + PNDIS_802_11_VARIABLE_IEs pIE;
  12943. + u8 len = 0;
  12944. + u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 };
  12945. + u8 ELOUI[6] = { 0xDD, 0x00, 0x50, 0x6f, 0x9a, 0x09 }; //EID;Len;OUI, Len would copy at the end of function
  12946. + int i=0;
  12947. +
  12948. + if( merge_ie != NULL)
  12949. + {
  12950. + //Set first P2P OUI
  12951. + _rtw_memcpy(merge_ie, ELOUI, 6);
  12952. + merge_ie += 6;
  12953. +
  12954. + while( i < in_len)
  12955. + {
  12956. + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i);
  12957. +
  12958. + // Take out the rest of P2P OUIs
  12959. + if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) )
  12960. + {
  12961. + _rtw_memcpy( merge_ie, pIE->data +4, pIE->Length -4);
  12962. + len += pIE->Length-4;
  12963. + merge_ie += pIE->Length-4;
  12964. + }
  12965. +
  12966. + i += (pIE->Length + 2);
  12967. + }
  12968. +
  12969. + return len + 4; // 4 is for P2P OUI
  12970. +
  12971. + }
  12972. +
  12973. + return 0;
  12974. +}
  12975. +
  12976. +void dump_p2p_ie(u8 *ie, u32 ie_len) {
  12977. + u8* pos = (u8*)ie;
  12978. + u8 id;
  12979. + u16 len;
  12980. +
  12981. + u8 *p2p_ie;
  12982. + uint p2p_ielen;
  12983. +
  12984. + p2p_ie = rtw_get_p2p_ie(ie, ie_len, NULL, &p2p_ielen);
  12985. + if(p2p_ie != ie || p2p_ielen == 0)
  12986. + return;
  12987. +
  12988. + pos+=6;
  12989. + while(pos-ie < ie_len){
  12990. + id = *pos;
  12991. + len = RTW_GET_LE16(pos+1);
  12992. +
  12993. + DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
  12994. +
  12995. + pos+=(3+len);
  12996. + }
  12997. +}
  12998. +
  12999. +/**
  13000. + * rtw_get_p2p_ie - Search P2P IE from a series of IEs
  13001. + * @in_ie: Address of IEs to search
  13002. + * @in_len: Length limit from in_ie
  13003. + * @p2p_ie: If not NULL and P2P IE is found, P2P IE will be copied to the buf starting from p2p_ie
  13004. + * @p2p_ielen: If not NULL and P2P IE is found, will set to the length of the entire P2P IE
  13005. + *
  13006. + * Returns: The address of the P2P IE found, or NULL
  13007. + */
  13008. +u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)
  13009. +{
  13010. + uint cnt = 0;
  13011. + u8 *p2p_ie_ptr;
  13012. + u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09};
  13013. +
  13014. + if ( p2p_ielen != NULL )
  13015. + *p2p_ielen = 0;
  13016. +
  13017. + while(cnt<in_len)
  13018. + {
  13019. + eid = in_ie[cnt];
  13020. + if ((in_len < 0) || (cnt > MAX_IE_SZ)) {
  13021. +#ifdef PLATFORM_LINUX
  13022. + dump_stack();
  13023. +#endif
  13024. + return NULL;
  13025. + }
  13026. + if( ( eid == _VENDOR_SPECIFIC_IE_ ) && ( _rtw_memcmp( &in_ie[cnt+2], p2p_oui, 4) == _TRUE ) )
  13027. + {
  13028. + p2p_ie_ptr = in_ie + cnt;
  13029. +
  13030. + if ( p2p_ie != NULL )
  13031. + {
  13032. + _rtw_memcpy( p2p_ie, &in_ie[ cnt ], in_ie[ cnt + 1 ] + 2 );
  13033. + }
  13034. +
  13035. + if ( p2p_ielen != NULL )
  13036. + {
  13037. + *p2p_ielen = in_ie[ cnt + 1 ] + 2;
  13038. + }
  13039. +
  13040. + return p2p_ie_ptr;
  13041. +
  13042. + break;
  13043. + }
  13044. + else
  13045. + {
  13046. + cnt += in_ie[ cnt + 1 ] +2; //goto next
  13047. + }
  13048. +
  13049. + }
  13050. +
  13051. + return NULL;
  13052. +
  13053. +}
  13054. +
  13055. +/**
  13056. + * rtw_get_p2p_attr - Search a specific P2P attribute from a given P2P IE
  13057. + * @p2p_ie: Address of P2P IE to search
  13058. + * @p2p_ielen: Length limit from p2p_ie
  13059. + * @target_attr_id: The attribute ID of P2P attribute to search
  13060. + * @buf_attr: If not NULL and the P2P attribute is found, P2P attribute will be copied to the buf starting from buf_attr
  13061. + * @len_attr: If not NULL and the P2P attribute is found, will set to the length of the entire P2P attribute
  13062. + *
  13063. + * Returns: the address of the specific WPS attribute found, or NULL
  13064. + */
  13065. +u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr)
  13066. +{
  13067. + u8 *attr_ptr = NULL;
  13068. + u8 *target_attr_ptr = NULL;
  13069. + u8 p2p_oui[4]={0x50,0x6F,0x9A,0x09};
  13070. +
  13071. + if(len_attr)
  13072. + *len_attr = 0;
  13073. +
  13074. + if ( !p2p_ie || ( p2p_ie[0] != _VENDOR_SPECIFIC_IE_ ) ||
  13075. + ( _rtw_memcmp( p2p_ie + 2, p2p_oui , 4 ) != _TRUE ) )
  13076. + {
  13077. + return attr_ptr;
  13078. + }
  13079. +
  13080. + // 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type)
  13081. + attr_ptr = p2p_ie + 6; //goto first attr
  13082. +
  13083. + while(attr_ptr - p2p_ie < p2p_ielen)
  13084. + {
  13085. + // 3 = 1(Attribute ID) + 2(Length)
  13086. + u8 attr_id = *attr_ptr;
  13087. + u16 attr_data_len = RTW_GET_LE16(attr_ptr + 1);
  13088. + u16 attr_len = attr_data_len + 3;
  13089. +
  13090. + //DBG_871X("%s attr_ptr:%p, id:%u, length:%u\n", __FUNCTION__, attr_ptr, attr_id, attr_data_len);
  13091. + if( attr_id == target_attr_id )
  13092. + {
  13093. + target_attr_ptr = attr_ptr;
  13094. +
  13095. + if(buf_attr)
  13096. + _rtw_memcpy(buf_attr, attr_ptr, attr_len);
  13097. +
  13098. + if(len_attr)
  13099. + *len_attr = attr_len;
  13100. +
  13101. + break;
  13102. + }
  13103. + else
  13104. + {
  13105. + attr_ptr += attr_len; //goto next
  13106. + }
  13107. +
  13108. + }
  13109. +
  13110. + return target_attr_ptr;
  13111. +}
  13112. +
  13113. +/**
  13114. + * rtw_get_p2p_attr_content - Search a specific P2P attribute content from a given P2P IE
  13115. + * @p2p_ie: Address of P2P IE to search
  13116. + * @p2p_ielen: Length limit from p2p_ie
  13117. + * @target_attr_id: The attribute ID of P2P attribute to search
  13118. + * @buf_content: If not NULL and the P2P attribute is found, P2P attribute content will be copied to the buf starting from buf_content
  13119. + * @len_content: If not NULL and the P2P attribute is found, will set to the length of the P2P attribute content
  13120. + *
  13121. + * Returns: the address of the specific P2P attribute content found, or NULL
  13122. + */
  13123. +u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content)
  13124. +{
  13125. + u8 *attr_ptr;
  13126. + u32 attr_len;
  13127. +
  13128. + if(len_content)
  13129. + *len_content = 0;
  13130. +
  13131. + attr_ptr = rtw_get_p2p_attr(p2p_ie, p2p_ielen, target_attr_id, NULL, &attr_len);
  13132. +
  13133. + if(attr_ptr && attr_len)
  13134. + {
  13135. + if(buf_content)
  13136. + _rtw_memcpy(buf_content, attr_ptr+3, attr_len-3);
  13137. +
  13138. + if(len_content)
  13139. + *len_content = attr_len-3;
  13140. +
  13141. + return attr_ptr+3;
  13142. + }
  13143. +
  13144. + return NULL;
  13145. +}
  13146. +
  13147. +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr)
  13148. +{
  13149. + u32 a_len;
  13150. +
  13151. + *pbuf = attr_id;
  13152. +
  13153. + //*(u16*)(pbuf + 1) = cpu_to_le16(attr_len);
  13154. + RTW_PUT_LE16(pbuf + 1, attr_len);
  13155. +
  13156. + if(pdata_attr)
  13157. + _rtw_memcpy(pbuf + 3, pdata_attr, attr_len);
  13158. +
  13159. + a_len = attr_len + 3;
  13160. +
  13161. + return a_len;
  13162. +}
  13163. +
  13164. +static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)
  13165. +{
  13166. + u8 *target_attr;
  13167. + u32 target_attr_len;
  13168. + uint ielen = ielen_ori;
  13169. + int index=0;
  13170. +
  13171. + while(1) {
  13172. + target_attr=rtw_get_p2p_attr(ie, ielen, attr_id, NULL, &target_attr_len);
  13173. + if(target_attr && target_attr_len)
  13174. + {
  13175. + u8 *next_attr = target_attr+target_attr_len;
  13176. + uint remain_len = ielen-(next_attr-ie);
  13177. + //dump_ies(ie, ielen);
  13178. + #if 0
  13179. + DBG_871X("[%d] ie:%p, ielen:%u\n"
  13180. + "target_attr:%p, target_attr_len:%u\n"
  13181. + "next_attr:%p, remain_len:%u\n"
  13182. + , index++
  13183. + , ie, ielen
  13184. + , target_attr, target_attr_len
  13185. + , next_attr, remain_len
  13186. + );
  13187. + #endif
  13188. +
  13189. + _rtw_memset(target_attr, 0, target_attr_len);
  13190. + _rtw_memcpy(target_attr, next_attr, remain_len);
  13191. + _rtw_memset(target_attr+remain_len, 0, target_attr_len);
  13192. + *(ie+1) -= target_attr_len;
  13193. + ielen-=target_attr_len;
  13194. + }
  13195. + else
  13196. + {
  13197. + //if(index>0)
  13198. + // dump_ies(ie, ielen);
  13199. + break;
  13200. + }
  13201. + }
  13202. +
  13203. + return ielen;
  13204. +}
  13205. +
  13206. +void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id)
  13207. +{
  13208. + u8 *p2p_ie;
  13209. + uint p2p_ielen, p2p_ielen_ori;
  13210. + int cnt;
  13211. +
  13212. + if( (p2p_ie=rtw_get_p2p_ie(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen_ori)) )
  13213. + {
  13214. + #if 0
  13215. + if(rtw_get_p2p_attr(p2p_ie, p2p_ielen_ori, attr_id, NULL, NULL)) {
  13216. + DBG_871X("rtw_get_p2p_attr: GOT P2P_ATTR:%u!!!!!!!!\n", attr_id);
  13217. + dump_ies(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
  13218. + }
  13219. + #endif
  13220. +
  13221. + p2p_ielen=rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id);
  13222. + if(p2p_ielen != p2p_ielen_ori) {
  13223. +
  13224. + u8 *next_ie_ori = p2p_ie+p2p_ielen_ori;
  13225. + u8 *next_ie = p2p_ie+p2p_ielen;
  13226. + uint remain_len = bss_ex->IELength-(next_ie_ori-bss_ex->IEs);
  13227. +
  13228. + _rtw_memcpy(next_ie, next_ie_ori, remain_len);
  13229. + _rtw_memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen);
  13230. + bss_ex->IELength -= p2p_ielen_ori-p2p_ielen;
  13231. +
  13232. + #if 0
  13233. + DBG_871X("remove P2P_ATTR:%u!\n", attr_id);
  13234. + dump_ies(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
  13235. + #endif
  13236. + }
  13237. + }
  13238. +}
  13239. +
  13240. +#endif //CONFIG_P2P
  13241. +
  13242. +#ifdef CONFIG_WFD
  13243. +int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen)
  13244. +{
  13245. + int match;
  13246. + uint cnt = 0;
  13247. + u8 eid, wfd_oui[4]={0x50,0x6F,0x9A,0x0A};
  13248. +
  13249. +
  13250. + match=_FALSE;
  13251. +
  13252. + if ( in_len < 0 )
  13253. + {
  13254. + return match;
  13255. + }
  13256. +
  13257. + while(cnt<in_len)
  13258. + {
  13259. + eid = in_ie[cnt];
  13260. +
  13261. + if( ( eid == _VENDOR_SPECIFIC_IE_ ) && ( _rtw_memcmp( &in_ie[cnt+2], wfd_oui, 4) == _TRUE ) )
  13262. + {
  13263. + if ( wfd_ie != NULL )
  13264. + {
  13265. + _rtw_memcpy( wfd_ie, &in_ie[ cnt ], in_ie[ cnt + 1 ] + 2 );
  13266. +
  13267. + }
  13268. + else
  13269. + {
  13270. + if ( wfd_ielen != NULL )
  13271. + {
  13272. + *wfd_ielen = 0;
  13273. + }
  13274. + }
  13275. +
  13276. + if ( wfd_ielen != NULL )
  13277. + {
  13278. + *wfd_ielen = in_ie[ cnt + 1 ] + 2;
  13279. + }
  13280. +
  13281. + cnt += in_ie[ cnt + 1 ] + 2;
  13282. +
  13283. + match = _TRUE;
  13284. + break;
  13285. + }
  13286. + else
  13287. + {
  13288. + cnt += in_ie[ cnt + 1 ] +2; //goto next
  13289. + }
  13290. +
  13291. + }
  13292. +
  13293. + if ( match == _TRUE )
  13294. + {
  13295. + match = cnt;
  13296. + }
  13297. +
  13298. + return match;
  13299. +
  13300. +}
  13301. +
  13302. +// attr_content: The output buffer, contains the "body field" of WFD attribute.
  13303. +// attr_contentlen: The data length of the "body field" of WFD attribute.
  13304. +int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen)
  13305. +{
  13306. + int match;
  13307. + uint cnt = 0;
  13308. + u8 attr_id, wfd_oui[4]={0x50,0x6F,0x9A,0x0A};
  13309. +
  13310. +
  13311. + match=_FALSE;
  13312. +
  13313. + if ( ( wfd_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) ||
  13314. + ( _rtw_memcmp( wfd_ie + 2, wfd_oui , 4 ) != _TRUE ) )
  13315. + {
  13316. + return( match );
  13317. + }
  13318. +
  13319. + // 1 ( WFD IE ) + 1 ( Length ) + 3 ( OUI ) + 1 ( OUI Type )
  13320. + cnt = 6;
  13321. + while( cnt < wfd_ielen )
  13322. + {
  13323. + u16 attrlen = RTW_GET_BE16(wfd_ie + cnt + 1);
  13324. +
  13325. + attr_id = wfd_ie[cnt];
  13326. + if( attr_id == target_attr_id )
  13327. + {
  13328. + // 3 -> 1 byte for attribute ID field, 2 bytes for length field
  13329. + if(attr_content)
  13330. + _rtw_memcpy( attr_content, &wfd_ie[ cnt + 3 ], attrlen );
  13331. +
  13332. + if(attr_contentlen)
  13333. + *attr_contentlen = attrlen;
  13334. +
  13335. + cnt += attrlen + 3;
  13336. +
  13337. + match = _TRUE;
  13338. + break;
  13339. + }
  13340. + else
  13341. + {
  13342. + cnt += attrlen + 3; //goto next
  13343. + }
  13344. +
  13345. + }
  13346. +
  13347. + return match;
  13348. +
  13349. +}
  13350. +#endif // CONFIG_WFD
  13351. +
  13352. +//Baron adds to avoid FreeBSD warning
  13353. +int ieee80211_is_empty_essid(const char *essid, int essid_len)
  13354. +{
  13355. + /* Single white space is for Linksys APs */
  13356. + if (essid_len == 1 && essid[0] == ' ')
  13357. + return 1;
  13358. +
  13359. + /* Otherwise, if the entire essid is 0, we assume it is hidden */
  13360. + while (essid_len) {
  13361. + essid_len--;
  13362. + if (essid[essid_len] != '\0')
  13363. + return 0;
  13364. + }
  13365. +
  13366. + return 1;
  13367. +}
  13368. +
  13369. +int ieee80211_get_hdrlen(u16 fc)
  13370. +{
  13371. + int hdrlen = 24;
  13372. +
  13373. + switch (WLAN_FC_GET_TYPE(fc)) {
  13374. + case RTW_IEEE80211_FTYPE_DATA:
  13375. + if (fc & RTW_IEEE80211_STYPE_QOS_DATA)
  13376. + hdrlen += 2;
  13377. + if ((fc & RTW_IEEE80211_FCTL_FROMDS) && (fc & RTW_IEEE80211_FCTL_TODS))
  13378. + hdrlen += 6; /* Addr4 */
  13379. + break;
  13380. + case RTW_IEEE80211_FTYPE_CTL:
  13381. + switch (WLAN_FC_GET_STYPE(fc)) {
  13382. + case RTW_IEEE80211_STYPE_CTS:
  13383. + case RTW_IEEE80211_STYPE_ACK:
  13384. + hdrlen = 10;
  13385. + break;
  13386. + default:
  13387. + hdrlen = 16;
  13388. + break;
  13389. + }
  13390. + break;
  13391. + }
  13392. +
  13393. + return hdrlen;
  13394. +}
  13395. +
  13396. +//show MCS rate, unit: 100Kbps
  13397. +u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char * MCS_rate)
  13398. +{
  13399. + u16 max_rate = 0;
  13400. +
  13401. + if(rf_type == RF_1T1R)
  13402. + {
  13403. + if(MCS_rate[0] & BIT(7))
  13404. + max_rate = (bw_40MHz) ? ((short_GI_40)?1500:1350):((short_GI_20)?722:650);
  13405. + else if(MCS_rate[0] & BIT(6))
  13406. + max_rate = (bw_40MHz) ? ((short_GI_40)?1350:1215):((short_GI_20)?650:585);
  13407. + else if(MCS_rate[0] & BIT(5))
  13408. + max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
  13409. + else if(MCS_rate[0] & BIT(4))
  13410. + max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
  13411. + else if(MCS_rate[0] & BIT(3))
  13412. + max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
  13413. + else if(MCS_rate[0] & BIT(2))
  13414. + max_rate = (bw_40MHz) ? ((short_GI_40)?450:405):((short_GI_20)?217:195);
  13415. + else if(MCS_rate[0] & BIT(1))
  13416. + max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
  13417. + else if(MCS_rate[0] & BIT(0))
  13418. + max_rate = (bw_40MHz) ? ((short_GI_40)?150:135):((short_GI_20)?72:65);
  13419. + }
  13420. + else
  13421. + {
  13422. + if(MCS_rate[1])
  13423. + {
  13424. + if(MCS_rate[1] & BIT(7))
  13425. + max_rate = (bw_40MHz) ? ((short_GI_40)?3000:2700):((short_GI_20)?1444:1300);
  13426. + else if(MCS_rate[1] & BIT(6))
  13427. + max_rate = (bw_40MHz) ? ((short_GI_40)?2700:2430):((short_GI_20)?1300:1170);
  13428. + else if(MCS_rate[1] & BIT(5))
  13429. + max_rate = (bw_40MHz) ? ((short_GI_40)?2400:2160):((short_GI_20)?1156:1040);
  13430. + else if(MCS_rate[1] & BIT(4))
  13431. + max_rate = (bw_40MHz) ? ((short_GI_40)?1800:1620):((short_GI_20)?867:780);
  13432. + else if(MCS_rate[1] & BIT(3))
  13433. + max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
  13434. + else if(MCS_rate[1] & BIT(2))
  13435. + max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
  13436. + else if(MCS_rate[1] & BIT(1))
  13437. + max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
  13438. + else if(MCS_rate[1] & BIT(0))
  13439. + max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
  13440. + }
  13441. + else
  13442. + {
  13443. + if(MCS_rate[0] & BIT(7))
  13444. + max_rate = (bw_40MHz) ? ((short_GI_40)?1500:1350):((short_GI_20)?722:650);
  13445. + else if(MCS_rate[0] & BIT(6))
  13446. + max_rate = (bw_40MHz) ? ((short_GI_40)?1350:1215):((short_GI_20)?650:585);
  13447. + else if(MCS_rate[0] & BIT(5))
  13448. + max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
  13449. + else if(MCS_rate[0] & BIT(4))
  13450. + max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
  13451. + else if(MCS_rate[0] & BIT(3))
  13452. + max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
  13453. + else if(MCS_rate[0] & BIT(2))
  13454. + max_rate = (bw_40MHz) ? ((short_GI_40)?450:405):((short_GI_20)?217:195);
  13455. + else if(MCS_rate[0] & BIT(1))
  13456. + max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
  13457. + else if(MCS_rate[0] & BIT(0))
  13458. + max_rate = (bw_40MHz) ? ((short_GI_40)?150:135):((short_GI_20)?72:65);
  13459. + }
  13460. + }
  13461. + return max_rate;
  13462. +}
  13463. +
  13464. +int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action)
  13465. +{
  13466. + const u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr);
  13467. + u16 fc;
  13468. + u8 c, a;
  13469. +
  13470. + fc = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)frame)->frame_ctl);
  13471. +
  13472. + if ((fc & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE))
  13473. + != (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION)
  13474. + )
  13475. + {
  13476. + return _FALSE;
  13477. + }
  13478. +
  13479. + c = frame_body[0];
  13480. +
  13481. + switch(c) {
  13482. + case RTW_WLAN_CATEGORY_P2P: /* vendor-specific */
  13483. + break;
  13484. + default:
  13485. + a = frame_body[1];
  13486. + }
  13487. +
  13488. + if (category)
  13489. + *category = c;
  13490. + if (action)
  13491. + *action = a;
  13492. +
  13493. + return _TRUE;
  13494. +}
  13495. +
  13496. +static const char *_action_public_str[] = {
  13497. + "ACT_PUB_BSSCOEXIST",
  13498. + "ACT_PUB_DSE_ENABLE",
  13499. + "ACT_PUB_DSE_DEENABLE",
  13500. + "ACT_PUB_DSE_REG_LOCATION",
  13501. + "ACT_PUB_EXT_CHL_SWITCH",
  13502. + "ACT_PUB_DSE_MSR_REQ",
  13503. + "ACT_PUB_DSE_MSR_RPRT",
  13504. + "ACT_PUB_MP",
  13505. + "ACT_PUB_DSE_PWR_CONSTRAINT",
  13506. + "ACT_PUB_VENDOR",
  13507. + "ACT_PUB_GAS_INITIAL_REQ",
  13508. + "ACT_PUB_GAS_INITIAL_RSP",
  13509. + "ACT_PUB_GAS_COMEBACK_REQ",
  13510. + "ACT_PUB_GAS_COMEBACK_RSP",
  13511. + "ACT_PUB_TDLS_DISCOVERY_RSP",
  13512. + "ACT_PUB_LOCATION_TRACK",
  13513. + "ACT_PUB_RSVD",
  13514. +};
  13515. +
  13516. +const char *action_public_str(u8 action)
  13517. +{
  13518. + action = (action >= ACT_PUBLIC_MAX) ? ACT_PUBLIC_MAX : action;
  13519. + return _action_public_str[action];
  13520. +}
  13521. --- /dev/null
  13522. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_io.c
  13523. @@ -0,0 +1,462 @@
  13524. +/******************************************************************************
  13525. + *
  13526. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  13527. + *
  13528. + * This program is free software; you can redistribute it and/or modify it
  13529. + * under the terms of version 2 of the GNU General Public License as
  13530. + * published by the Free Software Foundation.
  13531. + *
  13532. + * This program is distributed in the hope that it will be useful, but WITHOUT
  13533. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13534. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13535. + * more details.
  13536. + *
  13537. + * You should have received a copy of the GNU General Public License along with
  13538. + * this program; if not, write to the Free Software Foundation, Inc.,
  13539. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  13540. + *
  13541. + *
  13542. + ******************************************************************************/
  13543. +/*
  13544. +
  13545. +The purpose of rtw_io.c
  13546. +
  13547. +a. provides the API
  13548. +
  13549. +b. provides the protocol engine
  13550. +
  13551. +c. provides the software interface between caller and the hardware interface
  13552. +
  13553. +
  13554. +Compiler Flag Option:
  13555. +
  13556. +1. CONFIG_SDIO_HCI:
  13557. + a. USE_SYNC_IRP: Only sync operations are provided.
  13558. + b. USE_ASYNC_IRP:Both sync/async operations are provided.
  13559. +
  13560. +2. CONFIG_USB_HCI:
  13561. + a. USE_ASYNC_IRP: Both sync/async operations are provided.
  13562. +
  13563. +3. CONFIG_CFIO_HCI:
  13564. + b. USE_SYNC_IRP: Only sync operations are provided.
  13565. +
  13566. +
  13567. +Only sync read/rtw_write_mem operations are provided.
  13568. +
  13569. +jackson@realtek.com.tw
  13570. +
  13571. +*/
  13572. +
  13573. +#define _RTW_IO_C_
  13574. +#include <drv_conf.h>
  13575. +#include <osdep_service.h>
  13576. +#include <drv_types.h>
  13577. +#include <rtw_io.h>
  13578. +#include <osdep_intf.h>
  13579. +
  13580. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  13581. +#error "Shall be Linux or Windows, but not both!\n"
  13582. +#endif
  13583. +
  13584. +#ifdef CONFIG_SDIO_HCI
  13585. +#include <sdio_ops.h>
  13586. +#endif
  13587. +
  13588. +#ifdef CONFIG_USB_HCI
  13589. +#include <usb_ops.h>
  13590. +#endif
  13591. +
  13592. +#ifdef CONFIG_PCI_HCI
  13593. +#include <pci_ops.h>
  13594. +#endif
  13595. +
  13596. +
  13597. +u8 _rtw_read8(_adapter *adapter, u32 addr)
  13598. +{
  13599. + u8 r_val;
  13600. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13601. + struct io_priv *pio_priv = &adapter->iopriv;
  13602. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13603. + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
  13604. + _func_enter_;
  13605. + _read8 = pintfhdl->io_ops._read8;
  13606. +
  13607. + r_val = _read8(pintfhdl, addr);
  13608. + _func_exit_;
  13609. + return r_val;
  13610. +}
  13611. +
  13612. +u16 _rtw_read16(_adapter *adapter, u32 addr)
  13613. +{
  13614. + u16 r_val;
  13615. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13616. + struct io_priv *pio_priv = &adapter->iopriv;
  13617. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13618. + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
  13619. + _func_enter_;
  13620. + _read16 = pintfhdl->io_ops._read16;
  13621. +
  13622. + r_val = _read16(pintfhdl, addr);
  13623. + _func_exit_;
  13624. + return r_val;
  13625. +}
  13626. +
  13627. +u32 _rtw_read32(_adapter *adapter, u32 addr)
  13628. +{
  13629. + u32 r_val;
  13630. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13631. + struct io_priv *pio_priv = &adapter->iopriv;
  13632. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13633. + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
  13634. + _func_enter_;
  13635. + _read32 = pintfhdl->io_ops._read32;
  13636. +
  13637. + r_val = _read32(pintfhdl, addr);
  13638. + _func_exit_;
  13639. + return r_val;
  13640. +
  13641. +}
  13642. +
  13643. +int _rtw_write8(_adapter *adapter, u32 addr, u8 val)
  13644. +{
  13645. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13646. + struct io_priv *pio_priv = &adapter->iopriv;
  13647. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13648. + int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
  13649. + int ret;
  13650. + _func_enter_;
  13651. + _write8 = pintfhdl->io_ops._write8;
  13652. +
  13653. + ret = _write8(pintfhdl, addr, val);
  13654. + _func_exit_;
  13655. +
  13656. + return RTW_STATUS_CODE(ret);
  13657. +}
  13658. +int _rtw_write16(_adapter *adapter, u32 addr, u16 val)
  13659. +{
  13660. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13661. + struct io_priv *pio_priv = &adapter->iopriv;
  13662. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13663. + int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
  13664. + int ret;
  13665. + _func_enter_;
  13666. + _write16 = pintfhdl->io_ops._write16;
  13667. +
  13668. + ret = _write16(pintfhdl, addr, val);
  13669. + _func_exit_;
  13670. +
  13671. + return RTW_STATUS_CODE(ret);
  13672. +}
  13673. +int _rtw_write32(_adapter *adapter, u32 addr, u32 val)
  13674. +{
  13675. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13676. + struct io_priv *pio_priv = &adapter->iopriv;
  13677. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13678. + int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
  13679. + int ret;
  13680. + _func_enter_;
  13681. + _write32 = pintfhdl->io_ops._write32;
  13682. +
  13683. + ret = _write32(pintfhdl, addr, val);
  13684. + _func_exit_;
  13685. +
  13686. + return RTW_STATUS_CODE(ret);
  13687. +}
  13688. +
  13689. +int _rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata)
  13690. +{
  13691. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13692. + struct io_priv *pio_priv = &adapter->iopriv;
  13693. + struct intf_hdl *pintfhdl = (struct intf_hdl*)(&(pio_priv->intf));
  13694. + int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata);
  13695. + int ret;
  13696. + _func_enter_;
  13697. + _writeN = pintfhdl->io_ops._writeN;
  13698. +
  13699. + ret = _writeN(pintfhdl, addr,length,pdata);
  13700. + _func_exit_;
  13701. +
  13702. + return RTW_STATUS_CODE(ret);
  13703. +}
  13704. +int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val)
  13705. +{
  13706. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13707. + struct io_priv *pio_priv = &adapter->iopriv;
  13708. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13709. + int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
  13710. + int ret;
  13711. + _func_enter_;
  13712. + _write8_async = pintfhdl->io_ops._write8_async;
  13713. +
  13714. + ret = _write8_async(pintfhdl, addr, val);
  13715. + _func_exit_;
  13716. +
  13717. + return RTW_STATUS_CODE(ret);
  13718. +}
  13719. +int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val)
  13720. +{
  13721. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13722. + struct io_priv *pio_priv = &adapter->iopriv;
  13723. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13724. + int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
  13725. + int ret;
  13726. + _func_enter_;
  13727. + _write16_async = pintfhdl->io_ops._write16_async;
  13728. +
  13729. + ret = _write16_async(pintfhdl, addr, val);
  13730. + _func_exit_;
  13731. +
  13732. + return RTW_STATUS_CODE(ret);
  13733. +}
  13734. +int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val)
  13735. +{
  13736. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13737. + struct io_priv *pio_priv = &adapter->iopriv;
  13738. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13739. + int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
  13740. + int ret;
  13741. + _func_enter_;
  13742. + _write32_async = pintfhdl->io_ops._write32_async;
  13743. +
  13744. + ret = _write32_async(pintfhdl, addr, val);
  13745. + _func_exit_;
  13746. +
  13747. + return RTW_STATUS_CODE(ret);
  13748. +}
  13749. +void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
  13750. +{
  13751. + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  13752. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13753. + struct io_priv *pio_priv = &adapter->iopriv;
  13754. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13755. +
  13756. + _func_enter_;
  13757. +
  13758. + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE))
  13759. + {
  13760. + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_mem:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved));
  13761. + return;
  13762. + }
  13763. +
  13764. + _read_mem = pintfhdl->io_ops._read_mem;
  13765. +
  13766. + _read_mem(pintfhdl, addr, cnt, pmem);
  13767. +
  13768. + _func_exit_;
  13769. +
  13770. +}
  13771. +
  13772. +void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
  13773. +{
  13774. + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  13775. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13776. + struct io_priv *pio_priv = &adapter->iopriv;
  13777. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13778. +
  13779. + _func_enter_;
  13780. +
  13781. + _write_mem = pintfhdl->io_ops._write_mem;
  13782. +
  13783. + _write_mem(pintfhdl, addr, cnt, pmem);
  13784. +
  13785. + _func_exit_;
  13786. +
  13787. +}
  13788. +
  13789. +void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
  13790. +{
  13791. + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  13792. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13793. + struct io_priv *pio_priv = &adapter->iopriv;
  13794. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13795. +
  13796. + _func_enter_;
  13797. +
  13798. + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE))
  13799. + {
  13800. + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_port:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved));
  13801. + return;
  13802. + }
  13803. +
  13804. + _read_port = pintfhdl->io_ops._read_port;
  13805. +
  13806. + _read_port(pintfhdl, addr, cnt, pmem);
  13807. +
  13808. + _func_exit_;
  13809. +
  13810. +}
  13811. +
  13812. +void _rtw_read_port_cancel(_adapter *adapter)
  13813. +{
  13814. + void (*_read_port_cancel)(struct intf_hdl *pintfhdl);
  13815. + struct io_priv *pio_priv = &adapter->iopriv;
  13816. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13817. +
  13818. + _read_port_cancel = pintfhdl->io_ops._read_port_cancel;
  13819. +
  13820. + if(_read_port_cancel)
  13821. + _read_port_cancel(pintfhdl);
  13822. +
  13823. +}
  13824. +
  13825. +u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
  13826. +{
  13827. + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  13828. + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  13829. + struct io_priv *pio_priv = &adapter->iopriv;
  13830. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13831. + u32 ret = _SUCCESS;
  13832. +
  13833. + _func_enter_;
  13834. +
  13835. + _write_port = pintfhdl->io_ops._write_port;
  13836. +
  13837. + ret = _write_port(pintfhdl, addr, cnt, pmem);
  13838. +
  13839. + _func_exit_;
  13840. +
  13841. + return ret;
  13842. +}
  13843. +
  13844. +u32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms)
  13845. +{
  13846. + int ret = _SUCCESS;
  13847. + struct xmit_buf *pxmitbuf = (struct xmit_buf *)pmem;
  13848. + struct submit_ctx sctx;
  13849. +
  13850. + rtw_sctx_init(&sctx, timeout_ms);
  13851. + pxmitbuf->sctx = &sctx;
  13852. +
  13853. + ret = _rtw_write_port(adapter, addr, cnt, pmem);
  13854. +
  13855. + if (ret == _SUCCESS)
  13856. + ret = rtw_sctx_wait(&sctx);
  13857. +
  13858. + return ret;
  13859. +}
  13860. +
  13861. +void _rtw_write_port_cancel(_adapter *adapter)
  13862. +{
  13863. + void (*_write_port_cancel)(struct intf_hdl *pintfhdl);
  13864. + struct io_priv *pio_priv = &adapter->iopriv;
  13865. + struct intf_hdl *pintfhdl = &(pio_priv->intf);
  13866. +
  13867. + _write_port_cancel = pintfhdl->io_ops._write_port_cancel;
  13868. +
  13869. + if(_write_port_cancel)
  13870. + _write_port_cancel(pintfhdl);
  13871. +
  13872. +}
  13873. +
  13874. +int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops))
  13875. +{
  13876. + struct io_priv *piopriv = &padapter->iopriv;
  13877. + struct intf_hdl *pintf = &piopriv->intf;
  13878. +
  13879. + if (set_intf_ops == NULL)
  13880. + return _FAIL;
  13881. +
  13882. + piopriv->padapter = padapter;
  13883. + pintf->padapter = padapter;
  13884. + pintf->pintf_dev = adapter_to_dvobj(padapter);
  13885. +
  13886. + set_intf_ops(&pintf->io_ops);
  13887. +
  13888. + return _SUCCESS;
  13889. +}
  13890. +
  13891. +#ifdef DBG_IO
  13892. +
  13893. +u16 read_sniff_ranges[][2] = {
  13894. + //{0x550, 0x551},
  13895. +};
  13896. +
  13897. +u16 write_sniff_ranges[][2] = {
  13898. + //{0x550, 0x551},
  13899. + //{0x4c, 0x4c},
  13900. +};
  13901. +
  13902. +int read_sniff_num = sizeof(read_sniff_ranges)/sizeof(u16)/2;
  13903. +int write_sniff_num = sizeof(write_sniff_ranges)/sizeof(u16)/2;
  13904. +
  13905. +bool match_read_sniff_ranges(u16 addr, u16 len)
  13906. +{
  13907. + int i;
  13908. + for (i = 0; i<read_sniff_num; i++) {
  13909. + if (addr + len > read_sniff_ranges[i][0] && addr <= read_sniff_ranges[i][1])
  13910. + return _TRUE;
  13911. + }
  13912. +
  13913. + return _FALSE;
  13914. +}
  13915. +
  13916. +bool match_write_sniff_ranges(u16 addr, u16 len)
  13917. +{
  13918. + int i;
  13919. + for (i = 0; i<write_sniff_num; i++) {
  13920. + if (addr + len > write_sniff_ranges[i][0] && addr <= write_sniff_ranges[i][1])
  13921. + return _TRUE;
  13922. + }
  13923. +
  13924. + return _FALSE;
  13925. +}
  13926. +
  13927. +u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line)
  13928. +{
  13929. + u8 val = _rtw_read8(adapter, addr);
  13930. +
  13931. + if (match_read_sniff_ranges(addr, 1))
  13932. + DBG_871X("DBG_IO %s:%d rtw_read8(0x%04x) return 0x%02x\n", caller, line, addr, val);
  13933. +
  13934. + return val;
  13935. +}
  13936. +
  13937. +u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line)
  13938. +{
  13939. + u16 val = _rtw_read16(adapter, addr);
  13940. +
  13941. + if (match_read_sniff_ranges(addr, 2))
  13942. + DBG_871X("DBG_IO %s:%d rtw_read16(0x%04x) return 0x%04x\n", caller, line, addr, val);
  13943. +
  13944. + return val;
  13945. +}
  13946. +
  13947. +u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line)
  13948. +{
  13949. + u32 val = _rtw_read32(adapter, addr);
  13950. +
  13951. + if (match_read_sniff_ranges(addr, 4))
  13952. + DBG_871X("DBG_IO %s:%d rtw_read32(0x%04x) return 0x%08x\n", caller, line, addr, val);
  13953. +
  13954. + return val;
  13955. +}
  13956. +
  13957. +int dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line)
  13958. +{
  13959. + if (match_write_sniff_ranges(addr, 1))
  13960. + DBG_871X("DBG_IO %s:%d rtw_write8(0x%04x, 0x%02x)\n", caller, line, addr, val);
  13961. +
  13962. + return _rtw_write8(adapter, addr, val);
  13963. +}
  13964. +int dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line)
  13965. +{
  13966. + if (match_write_sniff_ranges(addr, 2))
  13967. + DBG_871X("DBG_IO %s:%d rtw_write16(0x%04x, 0x%04x)\n", caller, line, addr, val);
  13968. +
  13969. + return _rtw_write16(adapter, addr, val);
  13970. +}
  13971. +int dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line)
  13972. +{
  13973. + if (match_write_sniff_ranges(addr, 4))
  13974. + DBG_871X("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", caller, line, addr, val);
  13975. +
  13976. + return _rtw_write32(adapter, addr, val);
  13977. +}
  13978. +int dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line)
  13979. +{
  13980. + if (match_write_sniff_ranges(addr, length))
  13981. + DBG_871X("DBG_IO %s:%d rtw_writeN(0x%04x, %u)\n", caller, line, addr, length);
  13982. +
  13983. + return _rtw_writeN(adapter, addr, length, data);
  13984. +}
  13985. +#endif
  13986. --- /dev/null
  13987. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c
  13988. @@ -0,0 +1,195 @@
  13989. +/******************************************************************************
  13990. + *
  13991. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  13992. + *
  13993. + * This program is free software; you can redistribute it and/or modify it
  13994. + * under the terms of version 2 of the GNU General Public License as
  13995. + * published by the Free Software Foundation.
  13996. + *
  13997. + * This program is distributed in the hope that it will be useful, but WITHOUT
  13998. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13999. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14000. + * more details.
  14001. + *
  14002. + * You should have received a copy of the GNU General Public License along with
  14003. + * this program; if not, write to the Free Software Foundation, Inc.,
  14004. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  14005. + *
  14006. + *
  14007. + ******************************************************************************/
  14008. +#define _RTW_IOCTL_QUERY_C_
  14009. +
  14010. +#include <drv_conf.h>
  14011. +#include <osdep_service.h>
  14012. +#include <drv_types.h>
  14013. +#include <rtw_ioctl_query.h>
  14014. +#include <wifi.h>
  14015. +
  14016. +
  14017. +#ifdef PLATFORM_WINDOWS
  14018. +//
  14019. +// Added for WPA2-PSK, by Annie, 2005-09-20.
  14020. +//
  14021. +u8
  14022. +query_802_11_capability(
  14023. + _adapter* Adapter,
  14024. + u8* pucBuf,
  14025. + u32 * pulOutLen
  14026. +)
  14027. +{
  14028. + static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] =
  14029. + {
  14030. + {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled},
  14031. + {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled},
  14032. + {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled},
  14033. + {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled},
  14034. + {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled},
  14035. + {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled},
  14036. + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled},
  14037. + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled},
  14038. + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled},
  14039. + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled},
  14040. + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled},
  14041. + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled},
  14042. + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled},
  14043. + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled}
  14044. + };
  14045. + static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
  14046. + NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf;
  14047. + u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported;
  14048. +
  14049. +
  14050. + pCap->Length = sizeof(NDIS_802_11_CAPABILITY);
  14051. + if(ulNumOfPairSupported > 1 )
  14052. + pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
  14053. +
  14054. + pCap->Version = 2;
  14055. + pCap->NoOfPMKIDs = NUM_PMKID_CACHE;
  14056. + pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported;
  14057. +
  14058. + if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size.
  14059. + {
  14060. + _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) );
  14061. + *pulOutLen = pCap->Length;
  14062. + return _TRUE;
  14063. + }
  14064. + else
  14065. + {
  14066. + *pulOutLen = 0;
  14067. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n"));
  14068. + return _FALSE;
  14069. + }
  14070. +}
  14071. +
  14072. +u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo)
  14073. +{
  14074. + struct wlan_network *tgt_network;
  14075. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  14076. + struct security_priv *psecuritypriv=&(padapter->securitypriv);
  14077. + WLAN_BSSID_EX *psecnetwork=(WLAN_BSSID_EX*)&(psecuritypriv->sec_bss);
  14078. + u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  14079. + unsigned char i,*auth_ie,*supp_ie;
  14080. +
  14081. + //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
  14082. + _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
  14083. + //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  14084. +
  14085. + //------------------------------------------------------
  14086. + // Association Request related information
  14087. + //------------------------------------------------------
  14088. + // Req_1. AvailableRequestFixedIEs
  14089. + if(psecnetwork!=NULL){
  14090. +
  14091. + pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS;
  14092. + pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10];
  14093. + _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress,
  14094. + & psecnetwork->MacAddress, 6);
  14095. +
  14096. + pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  14097. +
  14098. + if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE)
  14099. + {
  14100. +
  14101. + if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2)
  14102. + pDest[0] =48; //RSN Information Element
  14103. + else
  14104. + pDest[0] =221; //WPA(SSN) Information Element
  14105. +
  14106. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0]));
  14107. + supp_ie=&psecuritypriv->supplicant_ie[0];
  14108. + for(i=0;i<supp_ie[0];i++)
  14109. + {
  14110. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("IEs [%d] = 0x%x \n\n", i,supp_ie[i]));
  14111. + }
  14112. +
  14113. + i=13; //0~11 is fixed information element
  14114. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("i= %d tgt_network->network.IELength=%d\n\n", i,(int)psecnetwork->IELength));
  14115. + while((i<supp_ie[0]) && (i<256)){
  14116. + if((unsigned char)supp_ie[i]==pDest[0]){
  14117. + _rtw_memcpy((u8 *)(pDest),
  14118. + &supp_ie[i],
  14119. + supp_ie[1+i]+2);
  14120. +
  14121. + break;
  14122. + }
  14123. +
  14124. + i=i+supp_ie[i+1]+2;
  14125. + if(supp_ie[1+i]==0)
  14126. + i=i+1;
  14127. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("iteration i=%d IEs [%d] = 0x%x \n\n", i,i,supp_ie[i+1]));
  14128. +
  14129. + }
  14130. +
  14131. +
  14132. + pAssocInfo->RequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4);
  14133. +
  14134. + }
  14135. +
  14136. +
  14137. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n"));
  14138. +
  14139. + }
  14140. +
  14141. +
  14142. + //------------------------------------------------------
  14143. + // Association Response related information
  14144. + //------------------------------------------------------
  14145. +
  14146. + if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE)
  14147. + {
  14148. + tgt_network =&(pmlmepriv->cur_network);
  14149. + if(tgt_network!=NULL){
  14150. + pAssocInfo->AvailableResponseFixedIEs =
  14151. + NDIS_802_11_AI_RESFI_CAPABILITIES
  14152. + |NDIS_802_11_AI_RESFI_ASSOCIATIONID
  14153. + ;
  14154. +
  14155. + pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10];
  14156. + pAssocInfo->ResponseFixedIEs.StatusCode = 0;
  14157. + pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid;
  14158. +
  14159. + pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength;
  14160. + auth_ie=&psecuritypriv->authenticator_ie[0];
  14161. +
  14162. + for(i=0;i<auth_ie[0];i++)
  14163. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("IEs [%d] = 0x%x \n\n", i,auth_ie[i]));
  14164. +
  14165. + i=auth_ie[0]-12;
  14166. + if(i>0){
  14167. + _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i);
  14168. + pAssocInfo->ResponseIELength =i;
  14169. + }
  14170. +
  14171. +
  14172. + pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength;
  14173. +
  14174. +
  14175. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n"));
  14176. + }
  14177. + }
  14178. + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n"));
  14179. +_func_exit_;
  14180. +
  14181. + return _TRUE;
  14182. +}
  14183. +#endif
  14184. --- /dev/null
  14185. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c
  14186. @@ -0,0 +1,1031 @@
  14187. +/******************************************************************************
  14188. + *
  14189. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  14190. + *
  14191. + * This program is free software; you can redistribute it and/or modify it
  14192. + * under the terms of version 2 of the GNU General Public License as
  14193. + * published by the Free Software Foundation.
  14194. + *
  14195. + * This program is distributed in the hope that it will be useful, but WITHOUT
  14196. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14197. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14198. + * more details.
  14199. + *
  14200. + * You should have received a copy of the GNU General Public License along with
  14201. + * this program; if not, write to the Free Software Foundation, Inc.,
  14202. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  14203. + *
  14204. + *
  14205. + ******************************************************************************/
  14206. +#define _RTW_IOCTL_RTL_C_
  14207. +
  14208. +#include <drv_conf.h>
  14209. +#include <osdep_service.h>
  14210. +#include <drv_types.h>
  14211. +#include <wlan_bssdef.h>
  14212. +#include <wifi.h>
  14213. +#include <rtw_ioctl.h>
  14214. +#include <rtw_ioctl_set.h>
  14215. +#include <rtw_ioctl_query.h>
  14216. +#include <rtw_ioctl_rtl.h>
  14217. +#include <mp_custom_oid.h>
  14218. +#ifdef CONFIG_MP_INCLUDED
  14219. +#include <rtw_mp.h>
  14220. +#include <rtw_mp_ioctl.h>
  14221. +#endif
  14222. +
  14223. +struct oid_obj_priv oid_rtl_seg_01_01[] =
  14224. +{
  14225. + {1, &oid_null_function}, //0x80
  14226. + {1, &oid_null_function}, //0x81
  14227. + {1, &oid_null_function}, //0x82
  14228. + {1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE
  14229. + {1, &oid_rt_get_signal_quality_hdl}, //0x84
  14230. + {1, &oid_rt_get_small_packet_crc_hdl}, //0x85
  14231. + {1, &oid_rt_get_middle_packet_crc_hdl}, //0x86
  14232. + {1, &oid_rt_get_large_packet_crc_hdl}, //0x87
  14233. + {1, &oid_rt_get_tx_retry_hdl}, //0x88
  14234. + {1, &oid_rt_get_rx_retry_hdl}, //0x89
  14235. + {1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A
  14236. + {1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B
  14237. + {1, &oid_null_function}, //0x8C
  14238. + {1, &oid_null_function}, //0x8D
  14239. + {1, &oid_null_function}, //0x8E
  14240. + {1, &oid_null_function}, //0x8F
  14241. + {1, &oid_rt_get_rx_total_packet_hdl}, //0x90
  14242. + {1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91
  14243. + {1, &oid_rt_get_tx_beacon_err_hdl}, //0x92
  14244. + {1, &oid_rt_get_rx_icv_err_hdl}, //0x93
  14245. + {1, &oid_rt_set_encryption_algorithm_hdl}, //0x94
  14246. + {1, &oid_null_function}, //0x95
  14247. + {1, &oid_rt_get_preamble_mode_hdl}, //0x96
  14248. + {1, &oid_null_function}, //0x97
  14249. + {1, &oid_rt_get_ap_ip_hdl}, //0x98
  14250. + {1, &oid_rt_get_channelplan_hdl}, //0x99
  14251. + {1, &oid_rt_set_preamble_mode_hdl}, //0x9A
  14252. + {1, &oid_rt_set_bcn_intvl_hdl}, //0x9B
  14253. + {1, &oid_null_function}, //0x9C
  14254. + {1, &oid_rt_dedicate_probe_hdl}, //0x9D
  14255. + {1, &oid_null_function}, //0x9E
  14256. + {1, &oid_null_function}, //0x9F
  14257. + {1, &oid_null_function}, //0xA0
  14258. + {1, &oid_null_function}, //0xA1
  14259. + {1, &oid_null_function}, //0xA2
  14260. + {1, &oid_null_function}, //0xA3
  14261. + {1, &oid_null_function}, //0xA4
  14262. + {1, &oid_null_function}, //0xA5
  14263. + {1, &oid_null_function}, //0xA6
  14264. + {1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7
  14265. + {1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8
  14266. + {1, &oid_rt_current_tx_power_level_hdl}, //0xA9
  14267. + {1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA
  14268. + {1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB
  14269. + {1, &oid_rt_get_channel_hdl}, //0xAC
  14270. + {1, &oid_rt_set_channelplan_hdl}, //0xAD
  14271. + {1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE
  14272. + {1, &oid_null_function}, //0xAF
  14273. + {1, &oid_null_function}, //0xB0
  14274. + {1, &oid_null_function}, //0xB1
  14275. + {1, &oid_null_function}, //0xB2
  14276. + {1, &oid_null_function}, //0xB3
  14277. + {1, &oid_rt_get_key_mismatch_hdl}, //0xB4
  14278. + {1, &oid_null_function}, //0xB5
  14279. + {1, &oid_null_function}, //0xB6
  14280. + {1, &oid_null_function}, //0xB7
  14281. + {1, &oid_null_function}, //0xB8
  14282. + {1, &oid_null_function}, //0xB9
  14283. + {1, &oid_null_function}, //0xBA
  14284. + {1, &oid_rt_supported_wireless_mode_hdl}, //0xBB
  14285. + {1, &oid_rt_get_channel_list_hdl}, //0xBC
  14286. + {1, &oid_rt_get_scan_in_progress_hdl}, //0xBD
  14287. + {1, &oid_null_function}, //0xBE
  14288. + {1, &oid_null_function}, //0xBF
  14289. + {1, &oid_null_function}, //0xC0
  14290. + {1, &oid_rt_forced_data_rate_hdl}, //0xC1
  14291. + {1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2
  14292. + {1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3
  14293. + {1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4
  14294. + {1, &oid_null_function}, //0xC5
  14295. + {1, &oid_null_function}, //0xC6
  14296. + {1, &oid_null_function}, //0xC7
  14297. + {1, &oid_null_function}, //0xC8
  14298. + {1, &oid_null_function}, //0xC9
  14299. + {1, &oid_null_function}, //0xCA
  14300. + {1, &oid_null_function}, //0xCB
  14301. + {1, &oid_null_function}, //0xCC
  14302. + {1, &oid_null_function}, //0xCD
  14303. + {1, &oid_null_function}, //0xCE
  14304. + {1, &oid_null_function}, //0xCF
  14305. +
  14306. +};
  14307. +
  14308. +struct oid_obj_priv oid_rtl_seg_01_03[] =
  14309. +{
  14310. + {1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00
  14311. + {1, &oid_null_function}, //0x01
  14312. + {1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02
  14313. + {1, &oid_null_function}, //0x03
  14314. + {1, &oid_rt_ap_supported_hdl}, //0x04
  14315. + {1, &oid_rt_ap_set_passphrase_hdl}, //0x05
  14316. +
  14317. +};
  14318. +
  14319. +struct oid_obj_priv oid_rtl_seg_01_11[] =
  14320. +{
  14321. + {1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER
  14322. + {1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY
  14323. + {1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY
  14324. + {1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN
  14325. + {1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE
  14326. + {1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE
  14327. + {1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP
  14328. + {1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP
  14329. + {1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8
  14330. + {1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9
  14331. + {1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE
  14332. +
  14333. +};
  14334. +
  14335. +struct oid_obj_priv oid_rtl_seg_03_00[] =
  14336. +{
  14337. + {1, &oid_null_function}, //0x00
  14338. + {1, &oid_rt_get_connect_state_hdl}, //0x01
  14339. + {1, &oid_null_function}, //0x02
  14340. + {1, &oid_null_function}, //0x03
  14341. + {1, &oid_rt_set_default_key_id_hdl}, //0x04
  14342. +
  14343. +
  14344. +};
  14345. +
  14346. +
  14347. +//************** oid_rtl_seg_01_01 section start **************
  14348. +
  14349. +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv)
  14350. +{
  14351. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14352. +#if 0
  14353. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  14354. + _irqL oldirql;
  14355. +
  14356. + _func_enter_;
  14357. +
  14358. + if(poid_par_priv->type_of_oid != SET_OID)
  14359. + {
  14360. + status = NDIS_STATUS_NOT_ACCEPTED;
  14361. + return status;
  14362. + }
  14363. +
  14364. + _irqlevel_changed_(&oldirql,LOWER);
  14365. + if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm))
  14366. + {
  14367. + //DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));
  14368. + if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))
  14369. + {
  14370. + status = NDIS_STATUS_NOT_ACCEPTED;
  14371. + }
  14372. +
  14373. + }
  14374. + else{
  14375. + status = NDIS_STATUS_NOT_ACCEPTED;
  14376. + }
  14377. + _irqlevel_changed_(&oldirql,RAISE);
  14378. + _func_exit_;
  14379. +#endif
  14380. + return status;
  14381. +}
  14382. +//-----------------------------------------------------------------------------
  14383. +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv)
  14384. +{
  14385. +
  14386. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14387. +#if 0
  14388. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  14389. + _irqL oldirql;
  14390. +
  14391. + _func_enter_;
  14392. + if(poid_par_priv->type_of_oid != SET_OID)
  14393. + {
  14394. + status = NDIS_STATUS_NOT_ACCEPTED;
  14395. + return status;
  14396. + }
  14397. +
  14398. +
  14399. + _irqlevel_changed_(&oldirql,LOWER);
  14400. +
  14401. + if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm))
  14402. + {
  14403. + //DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));
  14404. + if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))
  14405. + {
  14406. + status = NDIS_STATUS_NOT_ACCEPTED;
  14407. + }
  14408. +
  14409. + }
  14410. + else{
  14411. + status = NDIS_STATUS_NOT_ACCEPTED;
  14412. + }
  14413. + _irqlevel_changed_(&oldirql,RAISE);
  14414. + _func_exit_;
  14415. +#endif
  14416. + return status;
  14417. +}
  14418. +//-----------------------------------------------------------------------------
  14419. +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv)
  14420. +{
  14421. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14422. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14423. +
  14424. + //DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n"));
  14425. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14426. + {
  14427. + status = NDIS_STATUS_NOT_ACCEPTED;
  14428. + return status;
  14429. + }
  14430. +
  14431. +#if 0
  14432. + if(pMgntInfo->mAssoc || pMgntInfo->mIbss)
  14433. + {
  14434. + ulInfo = pAdapter->RxStats.SignalQuality;
  14435. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14436. + }
  14437. + else
  14438. + {
  14439. + ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer.
  14440. + }
  14441. + break;
  14442. +#endif
  14443. +
  14444. + return status;
  14445. +}
  14446. +
  14447. +//------------------------------------------------------------------------------
  14448. +
  14449. +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
  14450. +{
  14451. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14452. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14453. +
  14454. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14455. + {
  14456. + status = NDIS_STATUS_NOT_ACCEPTED;
  14457. + return status;
  14458. + }
  14459. +
  14460. + if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
  14461. + {
  14462. + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr;
  14463. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14464. + }
  14465. + else
  14466. + {
  14467. + status = NDIS_STATUS_INVALID_LENGTH;
  14468. + }
  14469. +
  14470. + return status;
  14471. +}
  14472. +//------------------------------------------------------------------------------
  14473. +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
  14474. +{
  14475. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14476. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14477. +
  14478. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14479. + {
  14480. + status = NDIS_STATUS_NOT_ACCEPTED;
  14481. + return status;
  14482. + }
  14483. +
  14484. + if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
  14485. + {
  14486. + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr;
  14487. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14488. + }
  14489. + else
  14490. + {
  14491. + status = NDIS_STATUS_INVALID_LENGTH;
  14492. + }
  14493. +
  14494. +
  14495. + return status;
  14496. +}
  14497. +//------------------------------------------------------------------------------
  14498. +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
  14499. +{
  14500. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14501. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14502. +
  14503. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14504. + {
  14505. + status = NDIS_STATUS_NOT_ACCEPTED;
  14506. + return status;
  14507. + }
  14508. +
  14509. + if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
  14510. + {
  14511. + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr;
  14512. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14513. + }
  14514. + else
  14515. + {
  14516. + status = NDIS_STATUS_INVALID_LENGTH;
  14517. + }
  14518. +
  14519. +
  14520. + return status;
  14521. +}
  14522. +
  14523. +//------------------------------------------------------------------------------
  14524. +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv)
  14525. +{
  14526. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14527. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14528. +
  14529. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14530. + {
  14531. + status = NDIS_STATUS_NOT_ACCEPTED;
  14532. + return status;
  14533. + }
  14534. +
  14535. + return status;
  14536. +}
  14537. +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv)
  14538. +{
  14539. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14540. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14541. +
  14542. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14543. + {
  14544. + status = NDIS_STATUS_NOT_ACCEPTED;
  14545. + return status;
  14546. + }
  14547. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14548. + return status;
  14549. +}
  14550. +//------------------------------------------------------------------------------
  14551. +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv)
  14552. +{
  14553. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14554. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14555. +
  14556. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14557. + {
  14558. + status = NDIS_STATUS_NOT_ACCEPTED;
  14559. + return status;
  14560. + }
  14561. + if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
  14562. + {
  14563. + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop;
  14564. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14565. + }
  14566. + else
  14567. + {
  14568. + status = NDIS_STATUS_INVALID_LENGTH;
  14569. + }
  14570. +
  14571. +
  14572. + return status;
  14573. +}
  14574. +//------------------------------------------------------------------------------
  14575. +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv)
  14576. +{
  14577. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14578. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14579. +
  14580. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14581. + {
  14582. + status = NDIS_STATUS_NOT_ACCEPTED;
  14583. + return status;
  14584. + }
  14585. +
  14586. + return status;
  14587. +}
  14588. +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv)
  14589. +{
  14590. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14591. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14592. +
  14593. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14594. + {
  14595. + status = NDIS_STATUS_NOT_ACCEPTED;
  14596. + return status;
  14597. + }
  14598. +
  14599. + return status;
  14600. +}
  14601. +//------------------------------------------------------------------------------
  14602. +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv)
  14603. +{
  14604. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14605. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14606. +
  14607. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14608. + {
  14609. + status = NDIS_STATUS_NOT_ACCEPTED;
  14610. + return status;
  14611. + }
  14612. + if(poid_par_priv->information_buf_len>= sizeof(u32))
  14613. + {
  14614. + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));
  14615. + *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err;
  14616. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14617. + }
  14618. + else
  14619. + {
  14620. + status = NDIS_STATUS_INVALID_LENGTH ;
  14621. + }
  14622. +
  14623. +
  14624. + return status;
  14625. +}
  14626. +//------------------------------------------------------------------------------
  14627. +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv)
  14628. +{
  14629. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14630. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14631. +
  14632. + if(poid_par_priv->type_of_oid != SET_OID)
  14633. + {
  14634. + status = NDIS_STATUS_NOT_ACCEPTED;
  14635. + return status;
  14636. + }
  14637. +
  14638. + return status;
  14639. +}
  14640. +//------------------------------------------------------------------------------
  14641. +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)
  14642. +{
  14643. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14644. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14645. + ULONG preamblemode = 0 ;
  14646. +
  14647. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14648. + {
  14649. + status = NDIS_STATUS_NOT_ACCEPTED;
  14650. + return status;
  14651. + }
  14652. + if(poid_par_priv->information_buf_len>= sizeof(ULONG))
  14653. + {
  14654. + if(padapter->registrypriv.preamble == PREAMBLE_LONG)
  14655. + preamblemode = 0;
  14656. + else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
  14657. + preamblemode = 1;
  14658. + else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
  14659. + preamblemode = 2;
  14660. +
  14661. +
  14662. + *(ULONG *)poid_par_priv->information_buf = preamblemode ;
  14663. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14664. + }
  14665. + else
  14666. + {
  14667. + status = NDIS_STATUS_INVALID_LENGTH ;
  14668. + }
  14669. + return status;
  14670. +}
  14671. +//------------------------------------------------------------------------------
  14672. +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv)
  14673. +{
  14674. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14675. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14676. +
  14677. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14678. + {
  14679. + status = NDIS_STATUS_NOT_ACCEPTED;
  14680. + return status;
  14681. + }
  14682. +
  14683. + return status;
  14684. +}
  14685. +
  14686. +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv)
  14687. +{
  14688. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14689. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14690. + struct eeprom_priv* peeprompriv = &padapter->eeprompriv;
  14691. +
  14692. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14693. + {
  14694. + status = NDIS_STATUS_NOT_ACCEPTED;
  14695. + return status;
  14696. + }
  14697. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14698. + *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan ;
  14699. +
  14700. + return status;
  14701. +}
  14702. +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv)
  14703. +{
  14704. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14705. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14706. + struct eeprom_priv* peeprompriv = &padapter->eeprompriv;
  14707. +
  14708. + if(poid_par_priv->type_of_oid != SET_OID)
  14709. + {
  14710. + status = NDIS_STATUS_NOT_ACCEPTED;
  14711. + return status;
  14712. + }
  14713. +
  14714. + peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf ;
  14715. +
  14716. + return status;
  14717. +}
  14718. +//------------------------------------------------------------------------------
  14719. +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)
  14720. +{
  14721. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14722. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14723. + ULONG preamblemode = 0;
  14724. + if(poid_par_priv->type_of_oid != SET_OID)
  14725. + {
  14726. + status = NDIS_STATUS_NOT_ACCEPTED;
  14727. + return status;
  14728. + }
  14729. +
  14730. + if(poid_par_priv->information_buf_len>= sizeof(ULONG))
  14731. + {
  14732. + preamblemode = *(ULONG *)poid_par_priv->information_buf ;
  14733. + if( preamblemode == 0)
  14734. + padapter->registrypriv.preamble = PREAMBLE_LONG;
  14735. + else if (preamblemode==1 )
  14736. + padapter->registrypriv.preamble = PREAMBLE_AUTO;
  14737. + else if ( preamblemode==2 )
  14738. + padapter->registrypriv.preamble = PREAMBLE_SHORT;
  14739. +
  14740. + *(ULONG *)poid_par_priv->information_buf = preamblemode ;
  14741. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14742. + }
  14743. + else
  14744. + {
  14745. + status = NDIS_STATUS_INVALID_LENGTH ;
  14746. + }
  14747. +
  14748. + return status;
  14749. +}
  14750. +//------------------------------------------------------------------------------
  14751. +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv)
  14752. +{
  14753. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14754. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14755. +
  14756. + if(poid_par_priv->type_of_oid != SET_OID)
  14757. + {
  14758. + status = NDIS_STATUS_NOT_ACCEPTED;
  14759. + return status;
  14760. + }
  14761. +
  14762. + return status;
  14763. +}
  14764. +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv)
  14765. +{
  14766. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14767. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14768. +
  14769. + return status;
  14770. +}
  14771. +//------------------------------------------------------------------------------
  14772. +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv)
  14773. +{
  14774. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14775. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14776. +
  14777. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14778. + {
  14779. + status = NDIS_STATUS_NOT_ACCEPTED;
  14780. + return status;
  14781. + }
  14782. + if(poid_par_priv->information_buf_len>= sizeof(ULONG))
  14783. + {
  14784. + *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes;
  14785. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14786. + }
  14787. + else
  14788. + {
  14789. + status = NDIS_STATUS_INVALID_LENGTH ;
  14790. + }
  14791. +
  14792. +
  14793. + return status;
  14794. +}
  14795. +//------------------------------------------------------------------------------
  14796. +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv)
  14797. +{
  14798. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14799. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14800. +
  14801. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14802. + {
  14803. + status = NDIS_STATUS_NOT_ACCEPTED;
  14804. + return status;
  14805. + }
  14806. + if(poid_par_priv->information_buf_len>= sizeof(ULONG))
  14807. + {
  14808. + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));
  14809. + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes;
  14810. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14811. + }
  14812. + else
  14813. + {
  14814. + status = NDIS_STATUS_INVALID_LENGTH ;
  14815. + }
  14816. + return status;
  14817. +}
  14818. +//------------------------------------------------------------------------------
  14819. +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv)
  14820. +{
  14821. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14822. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14823. +
  14824. + return status;
  14825. +}
  14826. +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv)
  14827. +{
  14828. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14829. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14830. +
  14831. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14832. + {
  14833. + status = NDIS_STATUS_NOT_ACCEPTED;
  14834. + return status;
  14835. + }
  14836. +
  14837. + return status;
  14838. +}
  14839. +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv)
  14840. +{
  14841. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14842. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14843. +
  14844. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14845. + {
  14846. + status = NDIS_STATUS_NOT_ACCEPTED;
  14847. + return status;
  14848. + }
  14849. +
  14850. + return status;
  14851. +}
  14852. +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv)
  14853. +{
  14854. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14855. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14856. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  14857. + NDIS_802_11_CONFIGURATION *pnic_Config;
  14858. +
  14859. + ULONG channelnum;
  14860. +
  14861. + _func_enter_;
  14862. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14863. + {
  14864. + status = NDIS_STATUS_NOT_ACCEPTED;
  14865. + return status;
  14866. + }
  14867. +
  14868. + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
  14869. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
  14870. + pnic_Config = &pmlmepriv->cur_network.network.Configuration;
  14871. + else
  14872. + pnic_Config = &padapter->registrypriv.dev_network.Configuration;
  14873. +
  14874. + channelnum = pnic_Config->DSConfig;
  14875. + *(ULONG *)poid_par_priv->information_buf = channelnum;
  14876. +
  14877. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14878. +
  14879. + _func_exit_;
  14880. +
  14881. +
  14882. +
  14883. + return status;
  14884. +}
  14885. +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv)
  14886. +{
  14887. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14888. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14889. +
  14890. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14891. + {
  14892. + status = NDIS_STATUS_NOT_ACCEPTED;
  14893. + return status;
  14894. + }
  14895. +
  14896. + return status;
  14897. +}
  14898. +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv)
  14899. +{
  14900. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14901. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14902. +
  14903. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14904. + {
  14905. + status = NDIS_STATUS_NOT_ACCEPTED;
  14906. + return status;
  14907. + }
  14908. +
  14909. + return status;
  14910. +}
  14911. +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)
  14912. +{
  14913. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14914. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14915. + ULONG ulInfo = 0 ;
  14916. + //DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n"));
  14917. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14918. + {
  14919. + status = NDIS_STATUS_NOT_ACCEPTED;
  14920. + return status;
  14921. + }
  14922. + if(poid_par_priv->information_buf_len >= sizeof(ULONG)){
  14923. + ulInfo |= 0x0100; //WIRELESS_MODE_B
  14924. + ulInfo |= 0x0200; //WIRELESS_MODE_G
  14925. + ulInfo |= 0x0400; //WIRELESS_MODE_A
  14926. +
  14927. + *(ULONG *) poid_par_priv->information_buf = ulInfo;
  14928. + //DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo));
  14929. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  14930. + }
  14931. + else{
  14932. + status = NDIS_STATUS_INVALID_LENGTH;
  14933. + }
  14934. +
  14935. + return status;
  14936. +}
  14937. +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv)
  14938. +{
  14939. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14940. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14941. +
  14942. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14943. + {
  14944. + status = NDIS_STATUS_NOT_ACCEPTED;
  14945. + return status;
  14946. + }
  14947. +
  14948. + return status;
  14949. +}
  14950. +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv)
  14951. +{
  14952. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14953. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14954. +
  14955. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14956. + {
  14957. + status = NDIS_STATUS_NOT_ACCEPTED;
  14958. + return status;
  14959. + }
  14960. +
  14961. + return status;
  14962. +}
  14963. +
  14964. +
  14965. +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv)
  14966. +{
  14967. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14968. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14969. +
  14970. + return status;
  14971. +}
  14972. +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv)
  14973. +{
  14974. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14975. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14976. +
  14977. + return status;
  14978. +}
  14979. +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)
  14980. +{
  14981. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14982. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14983. +
  14984. + if(poid_par_priv->type_of_oid != QUERY_OID)
  14985. + {
  14986. + status = NDIS_STATUS_NOT_ACCEPTED;
  14987. + return status;
  14988. + }
  14989. +
  14990. + return status;
  14991. +}
  14992. +
  14993. +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv)
  14994. +{
  14995. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  14996. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  14997. +
  14998. + return status;
  14999. +}
  15000. +//************** oid_rtl_seg_01_01 section end **************
  15001. +
  15002. +//************** oid_rtl_seg_01_03 section start **************
  15003. +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv)
  15004. +{
  15005. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15006. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15007. +
  15008. + if(poid_par_priv->type_of_oid != QUERY_OID)
  15009. + {
  15010. + status = NDIS_STATUS_NOT_ACCEPTED;
  15011. + return status;
  15012. + }
  15013. +
  15014. + return status;
  15015. +}
  15016. +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv)
  15017. +{
  15018. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15019. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15020. +
  15021. + return status;
  15022. +}
  15023. +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv)
  15024. +{
  15025. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15026. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15027. +
  15028. + return status;
  15029. +}
  15030. +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv)
  15031. +{
  15032. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15033. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15034. +
  15035. + if(poid_par_priv->type_of_oid != SET_OID)
  15036. + {
  15037. + status = NDIS_STATUS_NOT_ACCEPTED;
  15038. + return status;
  15039. + }
  15040. +
  15041. + return status;
  15042. +}
  15043. +
  15044. +//************** oid_rtl_seg_01_03 section end **************
  15045. +
  15046. +//**************** oid_rtl_seg_01_11 section start ****************
  15047. +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv)
  15048. +{
  15049. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15050. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  15051. + _irqL oldirql;
  15052. + _func_enter_;
  15053. + //DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n"));
  15054. + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID
  15055. + {
  15056. + status = NDIS_STATUS_NOT_ACCEPTED;
  15057. + return status;
  15058. + }
  15059. +
  15060. + _irqlevel_changed_(&oldirql,LOWER);
  15061. + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))
  15062. + {
  15063. + //RegOffsetValue - The offset of RF register to write.
  15064. + //RegDataWidth - The data width of RF register to write.
  15065. + //RegDataValue - The value to write.
  15066. + //RegOffsetValue = *((unsigned long*)InformationBuffer);
  15067. + //RegDataWidth = *((unsigned long*)InformationBuffer+1);
  15068. + //RegDataValue = *((unsigned long*)InformationBuffer+2);
  15069. + if(!rtw_setrfreg_cmd(Adapter,
  15070. + *(unsigned char*)poid_par_priv->information_buf,
  15071. + (unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2))))
  15072. + {
  15073. + status = NDIS_STATUS_NOT_ACCEPTED;
  15074. + }
  15075. +
  15076. + }
  15077. + else{
  15078. + status = NDIS_STATUS_INVALID_LENGTH;
  15079. + }
  15080. + _irqlevel_changed_(&oldirql,RAISE);
  15081. + _func_exit_;
  15082. +
  15083. + return status;
  15084. +}
  15085. +
  15086. +//------------------------------------------------------------------------------
  15087. +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv)
  15088. +{
  15089. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15090. +#if 0
  15091. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  15092. + _irqL oldirql;
  15093. + _func_enter_;
  15094. +
  15095. + //DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n"));
  15096. + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID
  15097. + {
  15098. + status = NDIS_STATUS_NOT_ACCEPTED;
  15099. + return status;
  15100. + }
  15101. +
  15102. + _irqlevel_changed_(&oldirql,LOWER);
  15103. + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))
  15104. + {
  15105. + if(Adapter->mppriv.act_in_progress == _TRUE)
  15106. + {
  15107. + status = NDIS_STATUS_NOT_ACCEPTED;
  15108. + }
  15109. + else
  15110. + {
  15111. + //init workparam
  15112. + Adapter->mppriv.act_in_progress = _TRUE;
  15113. + Adapter->mppriv.workparam.bcompleted= _FALSE;
  15114. + Adapter->mppriv.workparam.act_type = MPT_READ_RF;
  15115. + Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf;
  15116. + Adapter->mppriv.workparam.io_value = 0xcccccccc;
  15117. +
  15118. + //RegOffsetValue - The offset of RF register to read.
  15119. + //RegDataWidth - The data width of RF register to read.
  15120. + //RegDataValue - The value to read.
  15121. + //RegOffsetValue = *((unsigned long*)InformationBuffer);
  15122. + //RegDataWidth = *((unsigned long*)InformationBuffer+1);
  15123. + //RegDataValue = *((unsigned long*)InformationBuffer+2);
  15124. + if(!rtw_getrfreg_cmd(Adapter,
  15125. + *(unsigned char*)poid_par_priv->information_buf,
  15126. + (unsigned char*)&Adapter->mppriv.workparam.io_value))
  15127. + {
  15128. + status = NDIS_STATUS_NOT_ACCEPTED;
  15129. + }
  15130. + }
  15131. +
  15132. +
  15133. + }
  15134. + else {
  15135. + status = NDIS_STATUS_INVALID_LENGTH;
  15136. + }
  15137. + _irqlevel_changed_(&oldirql,RAISE);
  15138. + _func_exit_;
  15139. +#endif
  15140. + return status;
  15141. +}
  15142. +
  15143. +//**************** oid_rtl_seg_01_11 section end****************
  15144. +
  15145. +
  15146. +//************** oid_rtl_seg_03_00 section start **************
  15147. +enum _CONNECT_STATE_{
  15148. + CHECKINGSTATUS,
  15149. + ASSOCIATED,
  15150. + ADHOCMODE,
  15151. + NOTASSOCIATED
  15152. +};
  15153. +
  15154. +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv)
  15155. +{
  15156. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15157. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15158. +
  15159. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  15160. +
  15161. + ULONG ulInfo;
  15162. +
  15163. + if(poid_par_priv->type_of_oid != QUERY_OID)
  15164. + {
  15165. + status = NDIS_STATUS_NOT_ACCEPTED;
  15166. + return status;
  15167. + }
  15168. +
  15169. + // nStatus==0 CheckingStatus
  15170. + // nStatus==1 Associated
  15171. + // nStatus==2 AdHocMode
  15172. + // nStatus==3 NotAssociated
  15173. +
  15174. + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
  15175. + ulInfo = CHECKINGSTATUS;
  15176. + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15177. + ulInfo = ASSOCIATED;
  15178. + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE)
  15179. + ulInfo = ADHOCMODE;
  15180. + else
  15181. + ulInfo = NOTASSOCIATED ;
  15182. +
  15183. + *(ULONG *)poid_par_priv->information_buf = ulInfo;
  15184. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  15185. +
  15186. +#if 0
  15187. + // Rearrange the order to let the UI still shows connection when scan is in progress
  15188. + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n"));
  15189. + if(pMgntInfo->mAssoc)
  15190. + ulInfo = 1;
  15191. + else if(pMgntInfo->mIbss)
  15192. + ulInfo = 2;
  15193. + else if(pMgntInfo->bScanInProgress)
  15194. + ulInfo = 0;
  15195. + else
  15196. + ulInfo = 3;
  15197. + ulInfoLen = sizeof(ULONG);
  15198. + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo));
  15199. +#endif
  15200. +
  15201. + return status;
  15202. +}
  15203. +
  15204. +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv)
  15205. +{
  15206. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  15207. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  15208. +
  15209. + if(poid_par_priv->type_of_oid != SET_OID)
  15210. + {
  15211. + status = NDIS_STATUS_NOT_ACCEPTED;
  15212. + return status;
  15213. + }
  15214. +
  15215. + return status;
  15216. +}
  15217. +//************** oid_rtl_seg_03_00 section end **************
  15218. --- /dev/null
  15219. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c
  15220. @@ -0,0 +1,1493 @@
  15221. +/******************************************************************************
  15222. + *
  15223. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  15224. + *
  15225. + * This program is free software; you can redistribute it and/or modify it
  15226. + * under the terms of version 2 of the GNU General Public License as
  15227. + * published by the Free Software Foundation.
  15228. + *
  15229. + * This program is distributed in the hope that it will be useful, but WITHOUT
  15230. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15231. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  15232. + * more details.
  15233. + *
  15234. + * You should have received a copy of the GNU General Public License along with
  15235. + * this program; if not, write to the Free Software Foundation, Inc.,
  15236. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  15237. + *
  15238. + *
  15239. + ******************************************************************************/
  15240. +#define _RTW_IOCTL_SET_C_
  15241. +
  15242. +
  15243. +#include <drv_conf.h>
  15244. +#include <osdep_service.h>
  15245. +#include <drv_types.h>
  15246. +#include <rtw_ioctl_set.h>
  15247. +#include <hal_intf.h>
  15248. +
  15249. +#ifdef CONFIG_USB_HCI
  15250. +#include <usb_osintf.h>
  15251. +#include <usb_ops.h>
  15252. +#endif
  15253. +#ifdef CONFIG_SDIO_HCI
  15254. +#include <sdio_osintf.h>
  15255. +#endif
  15256. +
  15257. +extern void indicate_wx_scan_complete_event(_adapter *padapter);
  15258. +
  15259. +#define IS_MAC_ADDRESS_BROADCAST(addr) \
  15260. +( \
  15261. + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \
  15262. + (addr[2] == 0xff) && (addr[3] == 0xff) && \
  15263. + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \
  15264. +)
  15265. +
  15266. +u8 rtw_validate_bssid(u8 *bssid)
  15267. +{
  15268. + u8 ret = _TRUE;
  15269. +
  15270. + if (is_zero_mac_addr(bssid)
  15271. + || is_broadcast_mac_addr(bssid)
  15272. + || is_multicast_mac_addr(bssid)
  15273. + ) {
  15274. + ret = _FALSE;
  15275. + }
  15276. +
  15277. + return ret;
  15278. +}
  15279. +
  15280. +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid)
  15281. +{
  15282. + u8 i;
  15283. + u8 ret=_TRUE;
  15284. +
  15285. +_func_enter_;
  15286. +
  15287. + if (ssid->SsidLength > 32) {
  15288. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n"));
  15289. + ret= _FALSE;
  15290. + goto exit;
  15291. + }
  15292. +
  15293. +#ifdef CONFIG_VALIDATE_SSID
  15294. + for(i = 0; i < ssid->SsidLength; i++)
  15295. + {
  15296. + //wifi, printable ascii code must be supported
  15297. + if(!( (ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e) )){
  15298. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n"));
  15299. + ret= _FALSE;
  15300. + break;
  15301. + }
  15302. + }
  15303. +#endif /* CONFIG_VALIDATE_SSID */
  15304. +
  15305. +exit:
  15306. +
  15307. +_func_exit_;
  15308. +
  15309. + return ret;
  15310. +}
  15311. +
  15312. +u8 rtw_do_join(_adapter * padapter);
  15313. +u8 rtw_do_join(_adapter * padapter)
  15314. +{
  15315. + _irqL irqL;
  15316. + _list *plist, *phead;
  15317. + u8* pibss = NULL;
  15318. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  15319. + _queue *queue = &(pmlmepriv->scanned_queue);
  15320. + u8 ret=_SUCCESS;
  15321. +
  15322. +_func_enter_;
  15323. +
  15324. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  15325. + phead = get_list_head(queue);
  15326. + plist = get_next(phead);
  15327. +
  15328. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("\n rtw_do_join: phead = %p; plist = %p \n\n\n", phead, plist));
  15329. +
  15330. + pmlmepriv->cur_network.join_res = -2;
  15331. +
  15332. + set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  15333. +
  15334. + pmlmepriv->pscanned = plist;
  15335. +
  15336. + pmlmepriv->to_join = _TRUE;
  15337. +
  15338. + if(_rtw_queue_empty(queue)== _TRUE)
  15339. + {
  15340. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  15341. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  15342. +
  15343. + //when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty
  15344. + //we try to issue sitesurvey firstly
  15345. +
  15346. + if (pmlmepriv->LinkDetectInfo.bBusyTraffic ==_FALSE
  15347. + || rtw_to_roaming(padapter) > 0
  15348. + )
  15349. + {
  15350. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_do_join(): site survey if scanned_queue is empty\n."));
  15351. + // submit site_survey_cmd
  15352. + if(_SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ) {
  15353. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_do_join(): site survey return error\n."));
  15354. + }
  15355. + }
  15356. +
  15357. + goto exit;
  15358. + }
  15359. + else
  15360. + {
  15361. + int select_ret;
  15362. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  15363. + if((select_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS)
  15364. + {
  15365. + pmlmepriv->to_join = _FALSE;
  15366. + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
  15367. + }
  15368. + else if(ret == 2)//there is no need to wait for join
  15369. + {
  15370. + ret = _SUCCESS;
  15371. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  15372. + rtw_indicate_connect(padapter);
  15373. + }
  15374. + else
  15375. + {
  15376. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE)
  15377. + {
  15378. + // submit createbss_cmd to change to a ADHOC_MASTER
  15379. +
  15380. + //pmlmepriv->lock has been acquired by caller...
  15381. + WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network);
  15382. +
  15383. + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
  15384. +
  15385. + pibss = padapter->registrypriv.dev_network.MacAddress;
  15386. +
  15387. + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));
  15388. + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));
  15389. +
  15390. + rtw_update_registrypriv_dev_network(padapter);
  15391. +
  15392. + rtw_generate_random_ibss(pibss);
  15393. +
  15394. + if(rtw_createbss_cmd(padapter)!=_SUCCESS)
  15395. + {
  15396. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>do_goin: rtw_createbss_cmd status FAIL*** \n "));
  15397. + ret = _FALSE;
  15398. + goto exit;
  15399. + }
  15400. +
  15401. + pmlmepriv->to_join = _FALSE;
  15402. +
  15403. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("***Error=> rtw_select_and_join_from_scanned_queue FAIL under STA_Mode*** \n "));
  15404. +
  15405. + }
  15406. + else
  15407. + {
  15408. + // can't associate ; reset under-linking
  15409. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  15410. +
  15411. +#if 0
  15412. + if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE))
  15413. + {
  15414. + if(_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength))
  15415. + {
  15416. + // for funk to do roaming
  15417. + // funk will reconnect, but funk will not sitesurvey before reconnect
  15418. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("for funk to do roaming"));
  15419. + if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE)
  15420. + rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
  15421. + }
  15422. +
  15423. + }
  15424. +#endif
  15425. +
  15426. + //when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue
  15427. + //we try to issue sitesurvey firstly
  15428. + if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE
  15429. + || rtw_to_roaming(padapter) > 0
  15430. + )
  15431. + {
  15432. + //DBG_871X("rtw_do_join() when no desired bss in scanning queue \n");
  15433. + if( _SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ){
  15434. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("do_join(): site survey return error\n."));
  15435. + }
  15436. + }
  15437. +
  15438. +
  15439. + }
  15440. +
  15441. + }
  15442. +
  15443. + }
  15444. +
  15445. +exit:
  15446. +
  15447. +_func_exit_;
  15448. +
  15449. + return ret;
  15450. +}
  15451. +
  15452. +#ifdef PLATFORM_WINDOWS
  15453. +u8 rtw_pnp_set_power_wakeup(_adapter* padapter)
  15454. +{
  15455. + u8 res=_SUCCESS;
  15456. +
  15457. +_func_enter_;
  15458. +
  15459. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_wakeup!!!\n"));
  15460. +
  15461. + res = rtw_setstandby_cmd(padapter, 0);
  15462. +
  15463. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_wakeup!!!\n"));
  15464. +
  15465. +_func_exit_;
  15466. +
  15467. + return res;
  15468. +}
  15469. +
  15470. +u8 rtw_pnp_set_power_sleep(_adapter* padapter)
  15471. +{
  15472. + u8 res=_SUCCESS;
  15473. +
  15474. +_func_enter_;
  15475. +
  15476. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_sleep!!!\n"));
  15477. + //DbgPrint("+rtw_pnp_set_power_sleep\n");
  15478. +
  15479. + res = rtw_setstandby_cmd(padapter, 1);
  15480. +
  15481. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_sleep!!!\n"));
  15482. +
  15483. +_func_exit_;
  15484. +
  15485. + return res;
  15486. +}
  15487. +
  15488. +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults)
  15489. +{
  15490. +_func_enter_;
  15491. +
  15492. + switch( reloadDefaults)
  15493. + {
  15494. + case Ndis802_11ReloadWEPKeys:
  15495. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("SetInfo OID_802_11_RELOAD_DEFAULTS : Ndis802_11ReloadWEPKeys\n"));
  15496. + break;
  15497. + }
  15498. +
  15499. + // SecClearAllKeys(Adapter);
  15500. + // 8711 CAM was not for En/Decrypt only
  15501. + // so, we can't clear all keys.
  15502. + // should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM
  15503. +
  15504. + //TO DO...
  15505. +
  15506. +_func_exit_;
  15507. +
  15508. + return _TRUE;
  15509. +}
  15510. +
  15511. +u8 set_802_11_test(_adapter* padapter, NDIS_802_11_TEST *test)
  15512. +{
  15513. + u8 ret=_TRUE;
  15514. +
  15515. +_func_enter_;
  15516. +
  15517. + switch(test->Type)
  15518. + {
  15519. + case 1:
  15520. + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8);
  15521. + NdisMIndicateStatusComplete(padapter->hndis_adapter);
  15522. + break;
  15523. +
  15524. + case 2:
  15525. + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI));
  15526. + NdisMIndicateStatusComplete(padapter->hndis_adapter);
  15527. + break;
  15528. +
  15529. + default:
  15530. + ret=_FALSE;
  15531. + break;
  15532. + }
  15533. +
  15534. +_func_exit_;
  15535. +
  15536. + return ret;
  15537. +}
  15538. +
  15539. +u8 rtw_set_802_11_pmkid(_adapter* padapter, NDIS_802_11_PMKID *pmkid)
  15540. +{
  15541. + u8 ret=_SUCCESS;
  15542. +
  15543. + return ret;
  15544. +}
  15545. +
  15546. +#endif
  15547. +
  15548. +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid)
  15549. +{
  15550. + _irqL irqL;
  15551. + u8 status=_SUCCESS;
  15552. + u32 cur_time = 0;
  15553. +
  15554. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  15555. +
  15556. +_func_enter_;
  15557. +
  15558. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_,
  15559. + ("+rtw_set_802_11_bssid: bssid="MAC_FMT"\n", MAC_ARG(bssid) ));
  15560. +
  15561. + if ((bssid[0]==0x00 && bssid[1]==0x00 && bssid[2]==0x00 && bssid[3]==0x00 && bssid[4]==0x00 &&bssid[5]==0x00) ||
  15562. + (bssid[0]==0xFF && bssid[1]==0xFF && bssid[2]==0xFF && bssid[3]==0xFF && bssid[4]==0xFF &&bssid[5]==0xFF))
  15563. + {
  15564. + status = _FAIL;
  15565. + goto exit;
  15566. + }
  15567. +
  15568. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  15569. +
  15570. +
  15571. + DBG_871X("Set BSSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv));
  15572. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15573. + goto handle_tkip_countermeasure;
  15574. + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {
  15575. + goto release_mlme_lock;
  15576. + }
  15577. +
  15578. + if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  15579. + {
  15580. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
  15581. +
  15582. + if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE)
  15583. + {
  15584. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)
  15585. + goto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.
  15586. + } else {
  15587. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set BSSID not the same bssid\n"));
  15588. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_bssid="MAC_FMT"\n", MAC_ARG(bssid) ));
  15589. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("cur_bssid="MAC_FMT"\n", MAC_ARG(pmlmepriv->cur_network.network.MacAddress) ));
  15590. +
  15591. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  15592. +
  15593. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15594. + rtw_indicate_disconnect(padapter);
  15595. +
  15596. + rtw_free_assoc_resources(padapter, 1);
  15597. +
  15598. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  15599. + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
  15600. + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
  15601. + }
  15602. + }
  15603. + }
  15604. +
  15605. +handle_tkip_countermeasure:
  15606. + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
  15607. + status = _FAIL;
  15608. + goto release_mlme_lock;
  15609. + }
  15610. +
  15611. + _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
  15612. + pmlmepriv->assoc_by_bssid=_TRUE;
  15613. +
  15614. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15615. + pmlmepriv->to_join = _TRUE;
  15616. + }
  15617. + else {
  15618. + status = rtw_do_join(padapter);
  15619. + }
  15620. +
  15621. +release_mlme_lock:
  15622. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  15623. +
  15624. +exit:
  15625. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
  15626. + ("rtw_set_802_11_bssid: status=%d\n", status));
  15627. +
  15628. +_func_exit_;
  15629. +
  15630. + return status;
  15631. +}
  15632. +
  15633. +u8 rtw_set_802_11_ssid(_adapter* padapter, NDIS_802_11_SSID *ssid)
  15634. +{
  15635. + _irqL irqL;
  15636. + u8 status = _SUCCESS;
  15637. + u32 cur_time = 0;
  15638. +
  15639. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  15640. + struct wlan_network *pnetwork = &pmlmepriv->cur_network;
  15641. +
  15642. +_func_enter_;
  15643. +
  15644. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_,
  15645. + ("+rtw_set_802_11_ssid: ssid=[%s] fw_state=0x%08x\n",
  15646. + ssid->Ssid, get_fwstate(pmlmepriv)));
  15647. +
  15648. + if(padapter->hw_init_completed==_FALSE){
  15649. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
  15650. + ("set_ssid: hw_init_completed==_FALSE=>exit!!!\n"));
  15651. + status = _FAIL;
  15652. + goto exit;
  15653. + }
  15654. +
  15655. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  15656. +
  15657. + DBG_871X("Set SSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv));
  15658. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15659. + goto handle_tkip_countermeasure;
  15660. + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {
  15661. + goto release_mlme_lock;
  15662. + }
  15663. +
  15664. + if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  15665. + {
  15666. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
  15667. + ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
  15668. +
  15669. + if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&
  15670. + (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE))
  15671. + {
  15672. + if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE))
  15673. + {
  15674. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
  15675. + ("Set SSID is the same ssid, fw_state=0x%08x\n",
  15676. + get_fwstate(pmlmepriv)));
  15677. +
  15678. + if(rtw_is_same_ibss(padapter, pnetwork) == _FALSE)
  15679. + {
  15680. + //if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again
  15681. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  15682. +
  15683. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15684. + rtw_indicate_disconnect(padapter);
  15685. +
  15686. + rtw_free_assoc_resources(padapter, 1);
  15687. +
  15688. + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {
  15689. + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
  15690. + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
  15691. + }
  15692. + }
  15693. + else
  15694. + {
  15695. + goto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.
  15696. + }
  15697. + }
  15698. +#ifdef CONFIG_LPS
  15699. + else {
  15700. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1);
  15701. + }
  15702. +#endif
  15703. + }
  15704. + else
  15705. + {
  15706. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set SSID not the same ssid\n"));
  15707. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_ssid=[%s] len=0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength));
  15708. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("assoc_ssid=[%s] len=0x%x\n", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength));
  15709. +
  15710. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  15711. +
  15712. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15713. + rtw_indicate_disconnect(padapter);
  15714. +
  15715. + rtw_free_assoc_resources(padapter, 1);
  15716. +
  15717. + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {
  15718. + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
  15719. + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
  15720. + }
  15721. + }
  15722. + }
  15723. +
  15724. +handle_tkip_countermeasure:
  15725. + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
  15726. + status = _FAIL;
  15727. + goto release_mlme_lock;
  15728. + }
  15729. +
  15730. + if (rtw_validate_ssid(ssid) == _FALSE) {
  15731. + status = _FAIL;
  15732. + goto release_mlme_lock;
  15733. + }
  15734. +
  15735. + _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));
  15736. + pmlmepriv->assoc_by_bssid=_FALSE;
  15737. +
  15738. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15739. + pmlmepriv->to_join = _TRUE;
  15740. + }
  15741. + else {
  15742. + status = rtw_do_join(padapter);
  15743. + }
  15744. +
  15745. +release_mlme_lock:
  15746. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  15747. +
  15748. +exit:
  15749. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
  15750. + ("-rtw_set_802_11_ssid: status=%d\n", status));
  15751. +
  15752. +_func_exit_;
  15753. +
  15754. + return status;
  15755. +
  15756. +}
  15757. +
  15758. +u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid)
  15759. +{
  15760. + _irqL irqL;
  15761. + u8 status = _SUCCESS;
  15762. + u32 cur_time = 0;
  15763. + bool bssid_valid = _TRUE;
  15764. + bool ssid_valid = _TRUE;
  15765. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  15766. +
  15767. +_func_enter_;
  15768. +
  15769. + if (!ssid || rtw_validate_ssid(ssid) == _FALSE)
  15770. + ssid_valid = _FALSE;
  15771. +
  15772. + if (!bssid || rtw_validate_bssid(bssid) == _FALSE)
  15773. + bssid_valid = _FALSE;
  15774. +
  15775. + if (ssid_valid == _FALSE && bssid_valid == _FALSE) {
  15776. + DBG_871X(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n",
  15777. + FUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid);
  15778. + status = _FAIL;
  15779. + goto exit;
  15780. + }
  15781. +
  15782. + if(padapter->hw_init_completed==_FALSE){
  15783. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
  15784. + ("set_ssid: hw_init_completed==_FALSE=>exit!!!\n"));
  15785. + status = _FAIL;
  15786. + goto exit;
  15787. + }
  15788. +
  15789. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  15790. +
  15791. + LOG_LEVEL(_drv_info_, FUNC_ADPT_FMT" fw_state=0x%08x\n",
  15792. + FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
  15793. +
  15794. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15795. + goto handle_tkip_countermeasure;
  15796. + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {
  15797. + goto release_mlme_lock;
  15798. + }
  15799. +
  15800. +handle_tkip_countermeasure:
  15801. + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
  15802. + status = _FAIL;
  15803. + goto release_mlme_lock;
  15804. + }
  15805. +
  15806. + if (ssid && ssid_valid)
  15807. + _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));
  15808. +
  15809. + if (bssid && bssid_valid) {
  15810. + _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
  15811. + pmlmepriv->assoc_by_bssid = _TRUE;
  15812. + }
  15813. +
  15814. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  15815. + pmlmepriv->to_join = _TRUE;
  15816. + }
  15817. + else {
  15818. + status = rtw_do_join(padapter);
  15819. + }
  15820. +
  15821. +release_mlme_lock:
  15822. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  15823. +
  15824. +exit:
  15825. +
  15826. +_func_exit_;
  15827. +
  15828. + return status;
  15829. +}
  15830. +
  15831. +/*
  15832. +rtw_set_802_11_infrastructure_mode(~)
  15833. + ### NOTE:#### (!!!!)
  15834. + MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock and scanned_queue->lock in sequence
  15835. +*/
  15836. +u8 rtw_set_802_11_infrastructure_mode(_adapter* padapter,
  15837. + NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
  15838. +{
  15839. + _irqL irqL;
  15840. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  15841. + struct wlan_network *cur_network = &pmlmepriv->cur_network;
  15842. + NDIS_802_11_NETWORK_INFRASTRUCTURE* pold_state = &(cur_network->network.InfrastructureMode);
  15843. +
  15844. +_func_enter_;
  15845. +
  15846. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_notice_,
  15847. + ("+rtw_set_802_11_infrastructure_mode: old=%d new=%d fw_state=0x%08x\n",
  15848. + *pold_state, networktype, get_fwstate(pmlmepriv)));
  15849. +
  15850. + if(*pold_state != networktype)
  15851. + {
  15852. +
  15853. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(" change mode!"));
  15854. + //DBG_871X("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv));
  15855. +
  15856. + if(*pold_state==Ndis802_11APMode)
  15857. + {
  15858. + //change to other mode from Ndis802_11APMode
  15859. + cur_network->join_res = -1;
  15860. +
  15861. +#ifdef CONFIG_NATIVEAP_MLME
  15862. + stop_ap_mode(padapter);
  15863. +#endif
  15864. + }
  15865. +
  15866. + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||(*pold_state==Ndis802_11IBSS))
  15867. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  15868. +
  15869. + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||
  15870. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)== _TRUE) )
  15871. + rtw_free_assoc_resources(padapter, 0);
  15872. +
  15873. + if((*pold_state == Ndis802_11Infrastructure) ||(*pold_state == Ndis802_11IBSS))
  15874. + {
  15875. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15876. + {
  15877. + rtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not
  15878. + }
  15879. + }
  15880. +
  15881. + *pold_state = networktype;
  15882. +
  15883. + _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);
  15884. +
  15885. + switch(networktype)
  15886. + {
  15887. + case Ndis802_11IBSS:
  15888. + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
  15889. + break;
  15890. +
  15891. + case Ndis802_11Infrastructure:
  15892. + set_fwstate(pmlmepriv, WIFI_STATION_STATE);
  15893. + break;
  15894. +
  15895. + case Ndis802_11APMode:
  15896. + set_fwstate(pmlmepriv, WIFI_AP_STATE);
  15897. +#ifdef CONFIG_NATIVEAP_MLME
  15898. + start_ap_mode(padapter);
  15899. + //rtw_indicate_connect(padapter);
  15900. +#endif
  15901. +
  15902. + break;
  15903. +
  15904. + case Ndis802_11AutoUnknown:
  15905. + case Ndis802_11InfrastructureMax:
  15906. + break;
  15907. + }
  15908. +
  15909. + //SecClearAllKeys(adapter);
  15910. +
  15911. + //RT_TRACE(COMP_OID_SET, DBG_LOUD, ("set_infrastructure: fw_state:%x after changing mode\n",
  15912. + // get_fwstate(pmlmepriv) ));
  15913. +
  15914. + }
  15915. +
  15916. +_func_exit_;
  15917. +
  15918. + return _TRUE;
  15919. +}
  15920. +
  15921. +
  15922. +u8 rtw_set_802_11_disassociate(_adapter *padapter)
  15923. +{
  15924. + _irqL irqL;
  15925. + struct mlme_priv * pmlmepriv = &padapter->mlmepriv;
  15926. +
  15927. +_func_enter_;
  15928. +
  15929. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  15930. +
  15931. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  15932. + {
  15933. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n"));
  15934. +
  15935. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  15936. + rtw_indicate_disconnect(padapter);
  15937. + //modify for CONFIG_IEEE80211W, none 11w can use it
  15938. + rtw_free_assoc_resources_cmd(padapter);
  15939. + }
  15940. +
  15941. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  15942. +
  15943. +_func_exit_;
  15944. +
  15945. + return _TRUE;
  15946. +}
  15947. +
  15948. +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num)
  15949. +{
  15950. + _irqL irqL;
  15951. + struct mlme_priv *pmlmepriv= &padapter->mlmepriv;
  15952. + u8 res=_TRUE;
  15953. +
  15954. +_func_enter_;
  15955. +
  15956. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("+rtw_set_802_11_bssid_list_scan(), fw_state=%x\n", get_fwstate(pmlmepriv)));
  15957. +
  15958. + if (padapter == NULL) {
  15959. + res=_FALSE;
  15960. + goto exit;
  15961. + }
  15962. + if (padapter->hw_init_completed==_FALSE){
  15963. + res = _FALSE;
  15964. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n===rtw_set_802_11_bssid_list_scan:hw_init_completed==_FALSE===\n"));
  15965. + goto exit;
  15966. + }
  15967. +
  15968. + if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) ||
  15969. + (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE))
  15970. + {
  15971. + // Scan or linking is in progress, do nothing.
  15972. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_bssid_list_scan fail since fw_state = %x\n", get_fwstate(pmlmepriv)));
  15973. + res = _TRUE;
  15974. +
  15975. + if(check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE){
  15976. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n"));
  15977. + } else {
  15978. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###pmlmepriv->sitesurveyctrl.traffic_busy==_TRUE\n\n"));
  15979. + }
  15980. + } else {
  15981. + if (rtw_is_scan_deny(padapter)) {
  15982. + DBG_871X(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter));
  15983. + indicate_wx_scan_complete_event(padapter);
  15984. + return _SUCCESS;
  15985. + }
  15986. +
  15987. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  15988. +
  15989. + res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0);
  15990. +
  15991. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  15992. + }
  15993. +exit:
  15994. +
  15995. +_func_exit_;
  15996. +
  15997. + return res;
  15998. +}
  15999. +
  16000. +u8 rtw_set_802_11_authentication_mode(_adapter* padapter, NDIS_802_11_AUTHENTICATION_MODE authmode)
  16001. +{
  16002. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  16003. + int res;
  16004. + u8 ret;
  16005. +
  16006. +_func_enter_;
  16007. +
  16008. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_802_11_auth.mode(): mode=%x\n", authmode));
  16009. +
  16010. + psecuritypriv->ndisauthtype=authmode;
  16011. +
  16012. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d", psecuritypriv->ndisauthtype));
  16013. +
  16014. + if(psecuritypriv->ndisauthtype>3)
  16015. + psecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_8021X;
  16016. +
  16017. + res=rtw_set_auth(padapter,psecuritypriv);
  16018. +
  16019. + if(res==_SUCCESS)
  16020. + ret=_TRUE;
  16021. + else
  16022. + ret=_FALSE;
  16023. +
  16024. +_func_exit_;
  16025. +
  16026. + return ret;
  16027. +}
  16028. +
  16029. +u8 rtw_set_802_11_add_wep(_adapter* padapter, NDIS_802_11_WEP *wep){
  16030. +
  16031. + u8 bdefaultkey;
  16032. + u8 btransmitkey;
  16033. + sint keyid,res;
  16034. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  16035. + u8 ret=_SUCCESS;
  16036. +
  16037. +_func_enter_;
  16038. +
  16039. + bdefaultkey=(wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; //for ???
  16040. + btransmitkey= (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; //for ???
  16041. + keyid=wep->KeyIndex & 0x3fffffff;
  16042. +
  16043. + if(keyid>4)
  16044. + {
  16045. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MgntActrtw_set_802_11_add_wep:keyid>4=>fail\n"));
  16046. + ret=_FALSE;
  16047. + goto exit;
  16048. + }
  16049. +
  16050. + switch(wep->KeyLength)
  16051. + {
  16052. + case 5:
  16053. + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_;
  16054. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=5\n"));
  16055. + break;
  16056. + case 13:
  16057. + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_;
  16058. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=13\n"));
  16059. + break;
  16060. + default:
  16061. + psecuritypriv->dot11PrivacyAlgrthm=_NO_PRIVACY_;
  16062. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\n"));
  16063. + break;
  16064. + }
  16065. +
  16066. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength=0x%x wep->KeyIndex=0x%x keyid =%x\n",wep->KeyLength,wep->KeyIndex,keyid));
  16067. +
  16068. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial),wep->KeyLength);
  16069. +
  16070. + psecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength;
  16071. +
  16072. + psecuritypriv->dot11PrivacyKeyIndex=keyid;
  16073. +
  16074. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
  16075. + psecuritypriv->dot11DefKey[keyid].skey[0],psecuritypriv->dot11DefKey[keyid].skey[1],psecuritypriv->dot11DefKey[keyid].skey[2],
  16076. + psecuritypriv->dot11DefKey[keyid].skey[3],psecuritypriv->dot11DefKey[keyid].skey[4],psecuritypriv->dot11DefKey[keyid].skey[5],
  16077. + psecuritypriv->dot11DefKey[keyid].skey[6],psecuritypriv->dot11DefKey[keyid].skey[7],psecuritypriv->dot11DefKey[keyid].skey[8],
  16078. + psecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11],
  16079. + psecuritypriv->dot11DefKey[keyid].skey[12]));
  16080. +
  16081. + res=rtw_set_key(padapter,psecuritypriv, keyid, 1);
  16082. +
  16083. + if(res==_FAIL)
  16084. + ret= _FALSE;
  16085. +exit:
  16086. +
  16087. +_func_exit_;
  16088. +
  16089. + return ret;
  16090. +
  16091. +}
  16092. +
  16093. +u8 rtw_set_802_11_remove_wep(_adapter* padapter, u32 keyindex){
  16094. +
  16095. + u8 ret=_SUCCESS;
  16096. +
  16097. +_func_enter_;
  16098. +
  16099. + if (keyindex >= 0x80000000 || padapter == NULL){
  16100. +
  16101. + ret=_FALSE;
  16102. + goto exit;
  16103. +
  16104. + }
  16105. + else
  16106. + {
  16107. + int res;
  16108. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  16109. + if( keyindex < 4 ){
  16110. +
  16111. + _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16);
  16112. +
  16113. + res=rtw_set_key(padapter,psecuritypriv,keyindex, 0);
  16114. +
  16115. + psecuritypriv->dot11DefKeylen[keyindex]=0;
  16116. +
  16117. + if(res==_FAIL)
  16118. + ret=_FAIL;
  16119. +
  16120. + }
  16121. + else
  16122. + {
  16123. + ret=_FAIL;
  16124. + }
  16125. +
  16126. + }
  16127. +
  16128. +exit:
  16129. +
  16130. +_func_exit_;
  16131. +
  16132. + return ret;
  16133. +
  16134. +}
  16135. +
  16136. +u8 rtw_set_802_11_add_key(_adapter* padapter, NDIS_802_11_KEY *key){
  16137. +
  16138. + uint encryptionalgo;
  16139. + u8 * pbssid;
  16140. + struct sta_info *stainfo;
  16141. + u8 bgroup = _FALSE;
  16142. + u8 bgrouptkey = _FALSE;//can be remove later
  16143. + u8 ret=_SUCCESS;
  16144. +
  16145. +_func_enter_;
  16146. +
  16147. + if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)){
  16148. +
  16149. + // It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination,
  16150. + // it must fail the request and return NDIS_STATUS_INVALID_DATA.
  16151. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000) == 0)[=%d] ",(int)(key->KeyIndex & 0x80000000) == 0));
  16152. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000) > 0)[=%d]" , (int)(key->KeyIndex & 0x40000000) > 0));
  16153. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: key->KeyIndex=%d \n" ,(int)key->KeyIndex));
  16154. + ret= _FAIL;
  16155. + goto exit;
  16156. + }
  16157. +
  16158. + if(key->KeyIndex & 0x40000000)
  16159. + {
  16160. + // Pairwise key
  16161. +
  16162. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Pairwise key +++++\n"));
  16163. +
  16164. + pbssid=get_bssid(&padapter->mlmepriv);
  16165. + stainfo=rtw_get_stainfo(&padapter->stapriv, pbssid);
  16166. +
  16167. + if((stainfo!=NULL)&&(padapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)){
  16168. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:( stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n"));
  16169. + encryptionalgo=stainfo->dot118021XPrivacy;
  16170. + }
  16171. + else{
  16172. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: stainfo==NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!=dot11AuthAlgrthm_8021X)\n"));
  16173. + encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm;
  16174. + }
  16175. +
  16176. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (encryptionalgo ==%d)!\n",encryptionalgo ));
  16177. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm ==%d)!\n",padapter->securitypriv.dot11PrivacyAlgrthm));
  16178. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm ==%d)!\n",padapter->securitypriv.dot11AuthAlgrthm));
  16179. +
  16180. + if((stainfo!=NULL)){
  16181. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy ==%d)!\n", stainfo->dot118021XPrivacy));
  16182. + }
  16183. +
  16184. + if(key->KeyIndex & 0x000000FF){
  16185. + // The key index is specified in the lower 8 bits by values of zero to 255.
  16186. + // The key index should be set to zero for a Pairwise key, and the driver should fail with
  16187. + // NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero
  16188. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" key->KeyIndex & 0x000000FF.\n"));
  16189. + ret= _FAIL;
  16190. + goto exit;
  16191. + }
  16192. +
  16193. + // check BSSID
  16194. + if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE){
  16195. +
  16196. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MacAddr_isBcst(key->BSSID)\n"));
  16197. + ret= _FALSE;
  16198. + goto exit;
  16199. + }
  16200. +
  16201. + // Check key length for TKIP.
  16202. + //if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32)
  16203. + if((encryptionalgo== _TKIP_)&& (key->KeyLength != 32)){
  16204. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("TKIP KeyLength:0x%x != 32\n", key->KeyLength));
  16205. + ret=_FAIL;
  16206. + goto exit;
  16207. +
  16208. + }
  16209. +
  16210. + // Check key length for AES.
  16211. + if((encryptionalgo== _AES_)&& (key->KeyLength != 16)) {
  16212. + // For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case.
  16213. + if(key->KeyLength == 32) {
  16214. + key->KeyLength = 16;
  16215. + } else {
  16216. + ret= _FAIL;
  16217. + goto exit;
  16218. + }
  16219. + }
  16220. +
  16221. + // Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko.
  16222. + if( (encryptionalgo== _WEP40_|| encryptionalgo== _WEP104_) && (key->KeyLength != 5 || key->KeyLength != 13)) {
  16223. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("WEP KeyLength:0x%x != 5 or 13\n", key->KeyLength));
  16224. + ret=_FAIL;
  16225. + goto exit;
  16226. + }
  16227. +
  16228. + bgroup = _FALSE;
  16229. +
  16230. + // Check the pairwise key. Added by Annie, 2005-07-06.
  16231. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n"));
  16232. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Pairwise Key set]\n"));
  16233. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n"));
  16234. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3)));
  16235. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength));
  16236. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n"));
  16237. +
  16238. + }
  16239. + else
  16240. + {
  16241. + // Group key - KeyIndex(BIT30==0)
  16242. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Group key +++++\n"));
  16243. +
  16244. +
  16245. + // when add wep key through add key and didn't assigned encryption type before
  16246. + if((padapter->securitypriv.ndisauthtype<=3)&&(padapter->securitypriv.dot118021XGrpPrivacy==0))
  16247. + {
  16248. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("keylen=%d( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )padapter->securitypriv.dot118021XGrpPrivacy(%x)\n", key->KeyLength,padapter->securitypriv.dot11PrivacyAlgrthm,padapter->securitypriv.dot118021XGrpPrivacy));
  16249. +
  16250. + switch(key->KeyLength)
  16251. + {
  16252. + case 5:
  16253. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  16254. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));
  16255. + break;
  16256. + case 13:
  16257. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  16258. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));
  16259. + break;
  16260. + default:
  16261. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  16262. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u \n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));
  16263. + break;
  16264. + }
  16265. +
  16266. + encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm;
  16267. +
  16268. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\n", padapter->securitypriv.dot11PrivacyAlgrthm));
  16269. +
  16270. + }
  16271. + else
  16272. + {
  16273. + encryptionalgo=padapter->securitypriv.dot118021XGrpPrivacy;
  16274. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\n", padapter->securitypriv.dot11PrivacyAlgrthm,encryptionalgo,padapter->securitypriv.dot118021XGrpPrivacy,key->KeyLength));
  16275. +
  16276. + }
  16277. +
  16278. + if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) {
  16279. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" IBSS but BSSID is not Broadcast Address.\n"));
  16280. + ret= _FAIL;
  16281. + goto exit;
  16282. + }
  16283. +
  16284. + // Check key length for TKIP
  16285. + if((encryptionalgo== _TKIP_) && (key->KeyLength != 32)) {
  16286. +
  16287. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" TKIP GTK KeyLength:%u != 32\n", key->KeyLength));
  16288. + ret= _FAIL;
  16289. + goto exit;
  16290. +
  16291. + } else if(encryptionalgo== _AES_ && (key->KeyLength != 16 && key->KeyLength != 32) ) {
  16292. +
  16293. + // Check key length for AES
  16294. + // For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko.
  16295. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\n", key->KeyLength));
  16296. + ret= _FAIL;
  16297. + goto exit;
  16298. + }
  16299. +
  16300. + // Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03.
  16301. + if((encryptionalgo== _AES_) && (key->KeyLength == 32) ) {
  16302. + key->KeyLength = 16;
  16303. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("AES key length changed: %u\n", key->KeyLength) );
  16304. + }
  16305. +
  16306. + if(key->KeyIndex & 0x8000000) {//error ??? 0x8000_0000
  16307. + bgrouptkey = _TRUE;
  16308. + }
  16309. +
  16310. + if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE)&&(check_fwstate(&padapter->mlmepriv, _FW_LINKED)==_TRUE))
  16311. + {
  16312. + bgrouptkey = _TRUE;
  16313. + }
  16314. +
  16315. + bgroup = _TRUE;
  16316. +
  16317. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n") );
  16318. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Group Key set]\n") );
  16319. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")) ;
  16320. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3)));
  16321. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)) ;
  16322. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n"));
  16323. +
  16324. + }
  16325. +
  16326. + // If WEP encryption algorithm, just call rtw_set_802_11_add_wep().
  16327. + if((padapter->securitypriv.dot11AuthAlgrthm !=dot11AuthAlgrthm_8021X)&&(encryptionalgo== _WEP40_ || encryptionalgo== _WEP104_))
  16328. + {
  16329. + u8 ret;
  16330. + u32 keyindex;
  16331. + u32 len = FIELD_OFFSET(NDIS_802_11_KEY, KeyMaterial) + key->KeyLength;
  16332. + NDIS_802_11_WEP *wep = &padapter->securitypriv.ndiswep;
  16333. +
  16334. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ WEP key +++++\n"));
  16335. +
  16336. + wep->Length = len;
  16337. + keyindex = key->KeyIndex&0x7fffffff;
  16338. + wep->KeyIndex = keyindex ;
  16339. + wep->KeyLength = key->KeyLength;
  16340. +
  16341. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:Before memcpy \n"));
  16342. +
  16343. + _rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength);
  16344. + _rtw_memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength);
  16345. +
  16346. + padapter->securitypriv.dot11DefKeylen[keyindex]=key->KeyLength;
  16347. + padapter->securitypriv.dot11PrivacyKeyIndex=keyindex;
  16348. +
  16349. + ret = rtw_set_802_11_add_wep(padapter, wep);
  16350. +
  16351. + goto exit;
  16352. +
  16353. + }
  16354. +
  16355. + if(key->KeyIndex & 0x20000000){
  16356. + // SetRSC
  16357. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ SetRSC+++++\n"));
  16358. + if(bgroup == _TRUE)
  16359. + {
  16360. + NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL;
  16361. + _rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8);
  16362. + }
  16363. + else
  16364. + {
  16365. + NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL;
  16366. + _rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8);
  16367. + }
  16368. +
  16369. + }
  16370. +
  16371. + // Indicate this key idx is used for TX
  16372. + // Save the key in KeyMaterial
  16373. + if(bgroup == _TRUE) // Group transmit key
  16374. + {
  16375. + int res;
  16376. +
  16377. + if(bgrouptkey == _TRUE)
  16378. + {
  16379. + padapter->securitypriv.dot118021XGrpKeyid=(u8)key->KeyIndex;
  16380. + }
  16381. +
  16382. + if((key->KeyIndex&0x3) == 0){
  16383. + ret = _FAIL;
  16384. + goto exit;
  16385. + }
  16386. +
  16387. + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
  16388. + _rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
  16389. + _rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
  16390. +
  16391. + if((key->KeyIndex & 0x10000000))
  16392. + {
  16393. + _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);
  16394. + _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);
  16395. +
  16396. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  16397. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],
  16398. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],
  16399. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],
  16400. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));
  16401. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n"));
  16402. +
  16403. + }
  16404. + else
  16405. + {
  16406. + _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);
  16407. + _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);
  16408. +
  16409. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  16410. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],
  16411. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],
  16412. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],
  16413. + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));
  16414. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n"));
  16415. +
  16416. + }
  16417. +
  16418. + //set group key by index
  16419. + _rtw_memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength);
  16420. +
  16421. + key->KeyIndex=key->KeyIndex & 0x03;
  16422. +
  16423. + padapter->securitypriv.binstallGrpkey=_TRUE;
  16424. +
  16425. + padapter->securitypriv.bcheck_grpkey=_FALSE;
  16426. +
  16427. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("reset group key"));
  16428. +
  16429. + res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1);
  16430. +
  16431. + if(res==_FAIL)
  16432. + ret= _FAIL;
  16433. +
  16434. + goto exit;
  16435. +
  16436. + }
  16437. + else // Pairwise Key
  16438. + {
  16439. + u8 res;
  16440. +
  16441. + pbssid=get_bssid(&padapter->mlmepriv);
  16442. + stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid );
  16443. +
  16444. + if(stainfo!=NULL)
  16445. + {
  16446. + _rtw_memset( &stainfo->dot118021x_UncstKey, 0, 16);// clear keybuffer
  16447. +
  16448. + _rtw_memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16);
  16449. +
  16450. + if(encryptionalgo== _TKIP_)
  16451. + {
  16452. + padapter->securitypriv.busetkipkey=_FALSE;
  16453. +
  16454. + //_set_timer(&padapter->securitypriv.tkip_timer, 50);
  16455. +
  16456. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n ==========_set_timer\n"));
  16457. +
  16458. + // if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255]
  16459. + if((key->KeyIndex & 0x10000000)){
  16460. + _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8);
  16461. + _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8);
  16462. +
  16463. + } else {
  16464. + _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8);
  16465. + _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8);
  16466. +
  16467. + }
  16468. +
  16469. + }
  16470. + else if(encryptionalgo == _AES_)
  16471. + {
  16472. +
  16473. + }
  16474. +
  16475. +
  16476. + //Set key to CAM through H2C command
  16477. + if(bgrouptkey)//never go to here
  16478. + {
  16479. + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE);
  16480. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n"));
  16481. + }
  16482. + else{
  16483. + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE);
  16484. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n"));
  16485. + }
  16486. +
  16487. + if(res ==_FALSE)
  16488. + ret= _FAIL;
  16489. +
  16490. + }
  16491. +
  16492. + }
  16493. +
  16494. +exit:
  16495. +
  16496. +_func_exit_;
  16497. +
  16498. + return ret;
  16499. +}
  16500. +
  16501. +u8 rtw_set_802_11_remove_key(_adapter* padapter, NDIS_802_11_REMOVE_KEY *key){
  16502. +
  16503. + uint encryptionalgo;
  16504. + u8 * pbssid;
  16505. + struct sta_info *stainfo;
  16506. + u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE: _TRUE;
  16507. + u8 keyIndex = (u8)key->KeyIndex & 0x03;
  16508. + u8 ret=_SUCCESS;
  16509. +
  16510. +_func_enter_;
  16511. +
  16512. + if ((key->KeyIndex & 0xbffffffc) > 0) {
  16513. + ret=_FAIL;
  16514. + goto exit;
  16515. + }
  16516. +
  16517. + if (bgroup == _TRUE) {
  16518. + encryptionalgo= padapter->securitypriv.dot118021XGrpPrivacy;
  16519. + // clear group key by index
  16520. + //NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN);
  16521. + //Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0;
  16522. +
  16523. + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16);
  16524. +
  16525. + //! \todo Send a H2C Command to Firmware for removing this Key in CAM Entry.
  16526. +
  16527. + } else {
  16528. +
  16529. + pbssid=get_bssid(&padapter->mlmepriv);
  16530. + stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid );
  16531. + if(stainfo !=NULL){
  16532. + encryptionalgo=stainfo->dot118021XPrivacy;
  16533. +
  16534. + // clear key by BSSID
  16535. + _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16);
  16536. +
  16537. + //! \todo Send a H2C Command to Firmware for disable this Key in CAM Entry.
  16538. +
  16539. + }
  16540. + else{
  16541. + ret= _FAIL;
  16542. + goto exit;
  16543. + }
  16544. + }
  16545. +
  16546. +exit:
  16547. +
  16548. +_func_exit_;
  16549. +
  16550. + return _TRUE;
  16551. +
  16552. +}
  16553. +
  16554. +/*
  16555. +* rtw_get_cur_max_rate -
  16556. +* @adapter: pointer to _adapter structure
  16557. +*
  16558. +* Return 0 or 100Kbps
  16559. +*/
  16560. +u16 rtw_get_cur_max_rate(_adapter *adapter)
  16561. +{
  16562. + int i = 0;
  16563. + u8 *p;
  16564. + u16 rate = 0, max_rate = 0;
  16565. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  16566. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  16567. + struct registry_priv *pregistrypriv = &adapter->registrypriv;
  16568. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  16569. + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;
  16570. +#ifdef CONFIG_80211N_HT
  16571. + struct rtw_ieee80211_ht_cap *pht_capie;
  16572. + u8 rf_type = 0;
  16573. + u8 bw_40MHz=0, short_GI_20=0, short_GI_40=0;
  16574. + u16 mcs_rate=0;
  16575. + u32 ht_ielen = 0;
  16576. +#endif
  16577. +
  16578. +#ifdef CONFIG_MP_INCLUDED
  16579. + if (adapter->registrypriv.mp_mode == 1)
  16580. + {
  16581. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  16582. + return 0;
  16583. + }
  16584. +#endif
  16585. +
  16586. + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE)
  16587. + && (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE))
  16588. + return 0;
  16589. +
  16590. +#ifdef CONFIG_80211N_HT
  16591. + if (pmlmeext->cur_wireless_mode & (WIRELESS_11_24N|WIRELESS_11_5N)) {
  16592. + p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength-12);
  16593. + if(p && ht_ielen>0)
  16594. + {
  16595. + pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);
  16596. +
  16597. + _rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
  16598. +
  16599. + //bw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;
  16600. + //cur_bwmod is updated by beacon, pmlmeinfo is updated by association response
  16601. + bw_40MHz = (pmlmeext->cur_bwmode && (HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH & pmlmeinfo->HT_info.infos[0])) ? 1:0;
  16602. +
  16603. + //short_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;
  16604. + short_GI_20 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_20) ? 1:0;
  16605. + short_GI_40 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_40) ? 1:0;
  16606. +
  16607. + rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  16608. + max_rate = rtw_mcs_rate(
  16609. + rf_type,
  16610. + bw_40MHz & (pregistrypriv->cbw40_enable),
  16611. + short_GI_20,
  16612. + short_GI_40,
  16613. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate
  16614. + );
  16615. + }
  16616. + }
  16617. + else
  16618. +#endif //CONFIG_80211N_HT
  16619. + {
  16620. + while( (pcur_bss->SupportedRates[i]!=0) && (pcur_bss->SupportedRates[i]!=0xFF))
  16621. + {
  16622. + rate = pcur_bss->SupportedRates[i]&0x7F;
  16623. + if(rate>max_rate)
  16624. + max_rate = rate;
  16625. + i++;
  16626. + }
  16627. +
  16628. + max_rate = max_rate*10/2;
  16629. + }
  16630. +
  16631. + return max_rate;
  16632. +}
  16633. +
  16634. +/*
  16635. +* rtw_set_scan_mode -
  16636. +* @adapter: pointer to _adapter structure
  16637. +* @scan_mode:
  16638. +*
  16639. +* Return _SUCCESS or _FAIL
  16640. +*/
  16641. +int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode)
  16642. +{
  16643. + if(scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE)
  16644. + return _FAIL;
  16645. +
  16646. + adapter->mlmepriv.scan_mode = scan_mode;
  16647. +
  16648. + return _SUCCESS;
  16649. +}
  16650. +
  16651. +/*
  16652. +* rtw_set_channel_plan -
  16653. +* @adapter: pointer to _adapter structure
  16654. +* @channel_plan:
  16655. +*
  16656. +* Return _SUCCESS or _FAIL
  16657. +*/
  16658. +int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan)
  16659. +{
  16660. + struct registry_priv *pregistrypriv = &adapter->registrypriv;
  16661. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  16662. +
  16663. + //handle by cmd_thread to sync with scan operation
  16664. + return rtw_set_chplan_cmd(adapter, channel_plan, 1);
  16665. +}
  16666. +
  16667. +/*
  16668. +* rtw_set_country -
  16669. +* @adapter: pointer to _adapter structure
  16670. +* @country_code: string of country code
  16671. +*
  16672. +* Return _SUCCESS or _FAIL
  16673. +*/
  16674. +int rtw_set_country(_adapter *adapter, const char *country_code)
  16675. +{
  16676. + int channel_plan = RT_CHANNEL_DOMAIN_WORLD_WIDE_5G;
  16677. +
  16678. + DBG_871X("%s country_code:%s\n", __func__, country_code);
  16679. +
  16680. + //TODO: should have a table to match country code and RT_CHANNEL_DOMAIN
  16681. + //TODO: should consider 2-character and 3-character country code
  16682. + if(0 == strcmp(country_code, "US"))
  16683. + channel_plan = RT_CHANNEL_DOMAIN_FCC;
  16684. + else if(0 == strcmp(country_code, "EU"))
  16685. + channel_plan = RT_CHANNEL_DOMAIN_ETSI;
  16686. + else if(0 == strcmp(country_code, "JP"))
  16687. + channel_plan = RT_CHANNEL_DOMAIN_MKK;
  16688. + else if(0 == strcmp(country_code, "CN"))
  16689. + channel_plan = RT_CHANNEL_DOMAIN_CHINA;
  16690. + else
  16691. + DBG_871X("%s unknown country_code:%s\n", __FUNCTION__, country_code);
  16692. +
  16693. + return rtw_set_channel_plan(adapter, channel_plan);
  16694. +}
  16695. +
  16696. +/*
  16697. +* rtw_set_band -
  16698. +* @adapter: pointer to _adapter structure
  16699. +* @band: band to set
  16700. +*
  16701. +* Return _SUCCESS or _FAIL
  16702. +*/
  16703. +int rtw_set_band(_adapter *adapter, enum _BAND band)
  16704. +{
  16705. + if (rtw_band_valid(band)) {
  16706. + DBG_871X(FUNC_ADPT_FMT" band:%d\n", FUNC_ADPT_ARG(adapter), band);
  16707. + adapter->setband = band;
  16708. + return _SUCCESS;
  16709. + }
  16710. +
  16711. + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" band:%d fail\n", FUNC_ADPT_ARG(adapter), band);
  16712. + return _FAIL;
  16713. +}
  16714. --- /dev/null
  16715. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_iol.c
  16716. @@ -0,0 +1,262 @@
  16717. +/******************************************************************************
  16718. + *
  16719. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  16720. + *
  16721. + * This program is free software; you can redistribute it and/or modify it
  16722. + * under the terms of version 2 of the GNU General Public License as
  16723. + * published by the Free Software Foundation.
  16724. + *
  16725. + * This program is distributed in the hope that it will be useful, but WITHOUT
  16726. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16727. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  16728. + * more details.
  16729. + *
  16730. + * You should have received a copy of the GNU General Public License along with
  16731. + * this program; if not, write to the Free Software Foundation, Inc.,
  16732. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  16733. + *
  16734. + *
  16735. + ******************************************************************************/
  16736. +
  16737. +#include<rtw_iol.h>
  16738. +
  16739. +#ifdef CONFIG_IOL
  16740. +struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter)
  16741. +{
  16742. + struct xmit_frame *xmit_frame;
  16743. + struct xmit_buf *xmitbuf;
  16744. + struct pkt_attrib *pattrib;
  16745. + struct xmit_priv *pxmitpriv = &(adapter->xmitpriv);
  16746. +
  16747. +#if 1
  16748. + if ((xmit_frame = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
  16749. + {
  16750. + DBG_871X("%s rtw_alloc_xmitframe return null\n", __FUNCTION__);
  16751. + goto exit;
  16752. + }
  16753. +
  16754. + if ((xmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL)
  16755. + {
  16756. + DBG_871X("%s rtw_alloc_xmitbuf return null\n", __FUNCTION__);
  16757. + rtw_free_xmitframe(pxmitpriv, xmit_frame);
  16758. + xmit_frame=NULL;
  16759. + goto exit;
  16760. + }
  16761. +
  16762. + xmit_frame->frame_tag = MGNT_FRAMETAG;
  16763. + xmit_frame->pxmitbuf = xmitbuf;
  16764. + xmit_frame->buf_addr = xmitbuf->pbuf;
  16765. + xmitbuf->priv_data = xmit_frame;
  16766. +
  16767. + pattrib = &xmit_frame->attrib;
  16768. + update_mgntframe_attrib(adapter, pattrib);
  16769. + pattrib->qsel = 0x10;
  16770. + pattrib->pktlen = pattrib->last_txcmdsz = 0;
  16771. +
  16772. +#else
  16773. + if ((xmit_frame = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  16774. + {
  16775. + DBG_871X("%s alloc_mgtxmitframe return null\n", __FUNCTION__);
  16776. + }
  16777. + else {
  16778. + pattrib = &xmit_frame->attrib;
  16779. + update_mgntframe_attrib(adapter, pattrib);
  16780. + pattrib->qsel = 0x10;
  16781. + pattrib->pktlen = pattrib->last_txcmdsz = 0;
  16782. + }
  16783. +#endif
  16784. +
  16785. +exit:
  16786. + return xmit_frame;
  16787. +}
  16788. +
  16789. +
  16790. +int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len)
  16791. +{
  16792. + struct pkt_attrib *pattrib = &xmit_frame->attrib;
  16793. + u16 buf_offset;
  16794. + u32 ori_len;
  16795. +
  16796. +//Todo: bulkout without this offset
  16797. +#ifdef CONFIG_USB_HCI
  16798. + buf_offset = TXDESC_OFFSET;
  16799. +#else
  16800. + buf_offset = 0;
  16801. +#endif
  16802. +
  16803. + ori_len = buf_offset+pattrib->pktlen;
  16804. +
  16805. + //check if the io_buf can accommodate new cmds
  16806. + if(ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) {
  16807. + DBG_871X("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\n", __FUNCTION__
  16808. + , ori_len + cmd_len + 8, MAX_XMITBUF_SZ);
  16809. + return _FAIL;
  16810. + }
  16811. +
  16812. + _rtw_memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, IOL_cmds, cmd_len);
  16813. + pattrib->pktlen += cmd_len;
  16814. + pattrib->last_txcmdsz += cmd_len;
  16815. +
  16816. + //DBG_871X("%s ori:%u + cmd_len:%u = %u\n", __FUNCTION__, ori_len, cmd_len, buf_offset+pattrib->pktlen);
  16817. +
  16818. + return _SUCCESS;
  16819. +}
  16820. +
  16821. +int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary)
  16822. +{
  16823. + IOL_CMD cmd = {0x0, IOL_CMD_LLT, 0x0, 0x0};
  16824. +
  16825. + RTW_PUT_BE32((u8*)&cmd.value, (u32)page_boundary);
  16826. +
  16827. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16828. +}
  16829. +
  16830. +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value)
  16831. +{
  16832. + IOL_CMD cmd = {0x0, IOL_CMD_WB_REG, 0x0, 0x0};
  16833. +
  16834. + RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
  16835. + RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
  16836. +
  16837. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16838. +}
  16839. +
  16840. +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value)
  16841. +{
  16842. + IOL_CMD cmd = {0x0, IOL_CMD_WW_REG, 0x0, 0x0};
  16843. +
  16844. + RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
  16845. + RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
  16846. +
  16847. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16848. +}
  16849. +
  16850. +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value)
  16851. +{
  16852. + IOL_CMD cmd = {0x0, IOL_CMD_WD_REG, 0x0, 0x0};
  16853. + u8* pos = (u8 *)&cmd;
  16854. +
  16855. + RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
  16856. + RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
  16857. +
  16858. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16859. +}
  16860. +
  16861. +#ifdef DBG_IO
  16862. +int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line)
  16863. +{
  16864. + if (match_write_sniff_ranges(addr, 1))
  16865. + DBG_871X("DBG_IO %s:%d IOL_WB(0x%04x, 0x%02x)\n", caller, line, addr, value);
  16866. +
  16867. + return _rtw_IOL_append_WB_cmd(xmit_frame, addr, value);
  16868. +}
  16869. +
  16870. +int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line)
  16871. +{
  16872. + if (match_write_sniff_ranges(addr, 2))
  16873. + DBG_871X("DBG_IO %s:%d IOL_WW(0x%04x, 0x%04x)\n", caller, line, addr, value);
  16874. +
  16875. + return _rtw_IOL_append_WW_cmd(xmit_frame, addr, value);
  16876. +}
  16877. +
  16878. +int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line)
  16879. +{
  16880. + if (match_write_sniff_ranges(addr, 4))
  16881. + DBG_871X("DBG_IO %s:%d IOL_WD(0x%04x, 0x%08x)\n", caller, line, addr, value);
  16882. +
  16883. + return _rtw_IOL_append_WD_cmd(xmit_frame, addr, value);
  16884. +}
  16885. +#endif
  16886. +
  16887. +int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)
  16888. +{
  16889. + IOL_CMD cmd = {0x0, IOL_CMD_DELAY_US, 0x0, 0x0};
  16890. +
  16891. + RTW_PUT_BE32((u8*)&cmd.value, (u32)us);
  16892. +
  16893. + //DBG_871X("%s %u\n", __FUNCTION__, us);
  16894. +
  16895. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16896. +}
  16897. +
  16898. +int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)
  16899. +{
  16900. + IOL_CMD cmd = {0x0, IOL_CMD_DELAY_MS, 0x0, 0x0};
  16901. +
  16902. + RTW_PUT_BE32((u8*)&cmd.value, (u32)ms);
  16903. +
  16904. + //DBG_871X("%s %u\n", __FUNCTION__, ms);
  16905. +
  16906. + return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
  16907. +}
  16908. +
  16909. +int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)
  16910. +{
  16911. + struct pkt_attrib *pattrib = &xmit_frame->attrib;
  16912. + u16 buf_offset;
  16913. + u32 ori_len;
  16914. + IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};
  16915. +
  16916. +//Todo: bulkout without this offset
  16917. +#ifdef CONFIG_USB_HCI
  16918. + buf_offset = TXDESC_OFFSET;
  16919. +#else
  16920. + buf_offset = 0;
  16921. +#endif
  16922. +
  16923. + ori_len = buf_offset+pattrib->pktlen;
  16924. +
  16925. + //check if the io_buf can accommodate new cmds
  16926. + if(ori_len + 8 > MAX_XMITBUF_SZ) {
  16927. + DBG_871X("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate end cmd\n", __FUNCTION__
  16928. + , ori_len + 8, MAX_XMITBUF_SZ);
  16929. + return _FAIL;
  16930. + }
  16931. +
  16932. + _rtw_memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, (u8*)&end_cmd, 8);
  16933. + pattrib->pktlen += 8;
  16934. + pattrib->last_txcmdsz += 8;
  16935. +
  16936. + //DBG_871X("%s ori:%u + 8 = %u\n", __FUNCTION__ , ori_len, buf_offset+pattrib->pktlen);
  16937. +
  16938. + return _SUCCESS;
  16939. +}
  16940. +
  16941. +int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms)
  16942. +{
  16943. + return rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms);
  16944. +}
  16945. +
  16946. +int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms)
  16947. +{
  16948. + struct xmit_frame *xmit_frame;
  16949. +
  16950. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(adapter)) == NULL)
  16951. + return _FAIL;
  16952. +
  16953. + if(rtw_IOL_append_cmds(xmit_frame, IOL_cmds, cmd_num<<3) == _FAIL)
  16954. + return _FAIL;
  16955. +
  16956. + return rtw_IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms);
  16957. +}
  16958. +
  16959. +int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms)
  16960. +{
  16961. + IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};
  16962. + return rtw_IOL_exec_cmd_array_sync(adapter, (u8*)&end_cmd, 1, max_wating_ms);
  16963. +}
  16964. +
  16965. +bool rtw_IOL_applied(ADAPTER *adapter)
  16966. +{
  16967. + if(adapter->registrypriv.force_iol)
  16968. + return _TRUE;
  16969. +
  16970. +#ifdef CONFIG_USB_HCI
  16971. + if(!adapter_to_dvobj(adapter)->ishighspeed)
  16972. + return _TRUE;
  16973. +#endif
  16974. +
  16975. + return _FALSE;
  16976. +}
  16977. +
  16978. +#endif //CONFIG_IOL
  16979. --- /dev/null
  16980. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_mlme.c
  16981. @@ -0,0 +1,3966 @@
  16982. +/******************************************************************************
  16983. + *
  16984. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  16985. + *
  16986. + * This program is free software; you can redistribute it and/or modify it
  16987. + * under the terms of version 2 of the GNU General Public License as
  16988. + * published by the Free Software Foundation.
  16989. + *
  16990. + * This program is distributed in the hope that it will be useful, but WITHOUT
  16991. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16992. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  16993. + * more details.
  16994. + *
  16995. + * You should have received a copy of the GNU General Public License along with
  16996. + * this program; if not, write to the Free Software Foundation, Inc.,
  16997. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  16998. + *
  16999. + *
  17000. + ******************************************************************************/
  17001. +#define _RTW_MLME_C_
  17002. +
  17003. +
  17004. +#include <drv_conf.h>
  17005. +#include <osdep_service.h>
  17006. +#include <drv_types.h>
  17007. +#include <recv_osdep.h>
  17008. +#include <xmit_osdep.h>
  17009. +#include <hal_intf.h>
  17010. +#include <mlme_osdep.h>
  17011. +#include <sta_info.h>
  17012. +#include <wifi.h>
  17013. +#include <wlan_bssdef.h>
  17014. +#include <rtw_ioctl_set.h>
  17015. +
  17016. +extern void indicate_wx_scan_complete_event(_adapter *padapter);
  17017. +extern u8 rtw_do_join(_adapter * padapter);
  17018. +
  17019. +#ifdef CONFIG_DISABLE_MCS13TO15
  17020. +extern unsigned char MCS_rate_2R_MCS13TO15_OFF[16];
  17021. +extern unsigned char MCS_rate_2R[16];
  17022. +#else //CONFIG_DISABLE_MCS13TO15
  17023. +extern unsigned char MCS_rate_2R[16];
  17024. +#endif //CONFIG_DISABLE_MCS13TO15
  17025. +extern unsigned char MCS_rate_1R[16];
  17026. +
  17027. +sint _rtw_init_mlme_priv (_adapter* padapter)
  17028. +{
  17029. + sint i;
  17030. + u8 *pbuf;
  17031. + struct wlan_network *pnetwork;
  17032. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  17033. + sint res = _SUCCESS;
  17034. +
  17035. +_func_enter_;
  17036. +
  17037. + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
  17038. + //_rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv));
  17039. +
  17040. + pmlmepriv->nic_hdl = (u8 *)padapter;
  17041. +
  17042. + pmlmepriv->pscanned = NULL;
  17043. + pmlmepriv->fw_state = 0;
  17044. + pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown;
  17045. + pmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff)
  17046. +
  17047. + _rtw_spinlock_init(&(pmlmepriv->lock));
  17048. + _rtw_init_queue(&(pmlmepriv->free_bss_pool));
  17049. + _rtw_init_queue(&(pmlmepriv->scanned_queue));
  17050. +
  17051. + set_scanned_network_val(pmlmepriv, 0);
  17052. +
  17053. + _rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID));
  17054. +
  17055. + pbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network)));
  17056. +
  17057. + if (pbuf == NULL){
  17058. + res=_FAIL;
  17059. + goto exit;
  17060. + }
  17061. + pmlmepriv->free_bss_buf = pbuf;
  17062. +
  17063. + pnetwork = (struct wlan_network *)pbuf;
  17064. +
  17065. + for(i = 0; i < MAX_BSS_CNT; i++)
  17066. + {
  17067. + _rtw_init_listhead(&(pnetwork->list));
  17068. +
  17069. + rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue));
  17070. +
  17071. + pnetwork++;
  17072. + }
  17073. +
  17074. + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf
  17075. +
  17076. + rtw_clear_scan_deny(padapter);
  17077. +
  17078. + rtw_init_mlme_timer(padapter);
  17079. +
  17080. +exit:
  17081. +
  17082. +_func_exit_;
  17083. +
  17084. + return res;
  17085. +}
  17086. +
  17087. +void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv);
  17088. +void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv)
  17089. +{
  17090. + _rtw_spinlock_free(&pmlmepriv->lock);
  17091. + _rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock));
  17092. + _rtw_spinlock_free(&(pmlmepriv->scanned_queue.lock));
  17093. +}
  17094. +
  17095. +static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)
  17096. +{
  17097. + if(*ppie)
  17098. + {
  17099. + rtw_mfree(*ppie, *plen);
  17100. + *plen = 0;
  17101. + *ppie=NULL;
  17102. + }
  17103. +}
  17104. +
  17105. +void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
  17106. +{
  17107. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  17108. + rtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len);
  17109. + rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len);
  17110. + rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len);
  17111. + rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len);
  17112. + rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len);
  17113. + rtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len);
  17114. +
  17115. + rtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len);
  17116. + rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len);
  17117. + rtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len);
  17118. + rtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len);
  17119. + rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len);
  17120. +#endif
  17121. +
  17122. +#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)
  17123. + rtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len);
  17124. + rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len);
  17125. + rtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len);
  17126. + rtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie, &pmlmepriv->wfd_go_probe_resp_ie_len);
  17127. + rtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len);
  17128. +#endif
  17129. +
  17130. +}
  17131. +
  17132. +void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv)
  17133. +{
  17134. +_func_enter_;
  17135. +
  17136. + rtw_free_mlme_priv_ie_data(pmlmepriv);
  17137. +
  17138. + if(pmlmepriv){
  17139. + rtw_mfree_mlme_priv_lock (pmlmepriv);
  17140. +
  17141. + if (pmlmepriv->free_bss_buf) {
  17142. + rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network));
  17143. + }
  17144. + }
  17145. +_func_exit_;
  17146. +}
  17147. +
  17148. +sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork)
  17149. +{
  17150. + _irqL irqL;
  17151. +
  17152. +_func_enter_;
  17153. +
  17154. + if (pnetwork == NULL)
  17155. + goto exit;
  17156. +
  17157. + _enter_critical_bh(&queue->lock, &irqL);
  17158. +
  17159. + rtw_list_insert_tail(&pnetwork->list, &queue->queue);
  17160. +
  17161. + _exit_critical_bh(&queue->lock, &irqL);
  17162. +
  17163. +exit:
  17164. +
  17165. +_func_exit_;
  17166. +
  17167. + return _SUCCESS;
  17168. +}
  17169. +
  17170. +struct wlan_network *_rtw_dequeue_network(_queue *queue)
  17171. +{
  17172. + _irqL irqL;
  17173. +
  17174. + struct wlan_network *pnetwork;
  17175. +
  17176. +_func_enter_;
  17177. +
  17178. + _enter_critical_bh(&queue->lock, &irqL);
  17179. +
  17180. + if (_rtw_queue_empty(queue) == _TRUE)
  17181. +
  17182. + pnetwork = NULL;
  17183. +
  17184. + else
  17185. + {
  17186. + pnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list);
  17187. +
  17188. + rtw_list_delete(&(pnetwork->list));
  17189. + }
  17190. +
  17191. + _exit_critical_bh(&queue->lock, &irqL);
  17192. +
  17193. +_func_exit_;
  17194. +
  17195. + return pnetwork;
  17196. +}
  17197. +
  17198. +struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue)
  17199. +{
  17200. + _irqL irqL;
  17201. + struct wlan_network *pnetwork;
  17202. + _queue *free_queue = &pmlmepriv->free_bss_pool;
  17203. + _list* plist = NULL;
  17204. +
  17205. +_func_enter_;
  17206. +
  17207. + _enter_critical_bh(&free_queue->lock, &irqL);
  17208. +
  17209. + if (_rtw_queue_empty(free_queue) == _TRUE) {
  17210. + pnetwork=NULL;
  17211. + goto exit;
  17212. + }
  17213. + plist = get_next(&(free_queue->queue));
  17214. +
  17215. + pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list);
  17216. +
  17217. + rtw_list_delete(&pnetwork->list);
  17218. +
  17219. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist));
  17220. + pnetwork->network_type = 0;
  17221. + pnetwork->fixed = _FALSE;
  17222. + pnetwork->last_scanned = rtw_get_current_time();
  17223. + pnetwork->aid=0;
  17224. + pnetwork->join_res=0;
  17225. +
  17226. + pmlmepriv->num_of_scanned ++;
  17227. +
  17228. +exit:
  17229. + _exit_critical_bh(&free_queue->lock, &irqL);
  17230. +
  17231. +_func_exit_;
  17232. +
  17233. + return pnetwork;
  17234. +}
  17235. +
  17236. +void _rtw_free_network(struct mlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall)
  17237. +{
  17238. + u32 curr_time, delta_time;
  17239. + u32 lifetime = SCANQUEUE_LIFETIME;
  17240. + _irqL irqL;
  17241. + _queue *free_queue = &(pmlmepriv->free_bss_pool);
  17242. +
  17243. +_func_enter_;
  17244. +
  17245. + if (pnetwork == NULL)
  17246. + goto exit;
  17247. +
  17248. + if (pnetwork->fixed == _TRUE)
  17249. + goto exit;
  17250. +
  17251. + curr_time = rtw_get_current_time();
  17252. +
  17253. + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) ||
  17254. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )
  17255. + lifetime = 1;
  17256. +
  17257. + if(!isfreeall)
  17258. + {
  17259. +#ifdef PLATFORM_WINDOWS
  17260. +
  17261. + delta_time = (curr_time -pnetwork->last_scanned)/10;
  17262. +
  17263. + if(delta_time < lifetime*1000000)// unit:usec
  17264. + {
  17265. + goto exit;
  17266. + }
  17267. +
  17268. +#endif
  17269. +
  17270. +#ifdef PLATFORM_LINUX
  17271. +
  17272. + delta_time = (curr_time -pnetwork->last_scanned)/HZ;
  17273. +
  17274. + if(delta_time < lifetime)// unit:sec
  17275. + {
  17276. + goto exit;
  17277. + }
  17278. +
  17279. +#endif
  17280. +
  17281. +#ifdef PLATFORM_FREEBSD
  17282. + //i think needs to check again
  17283. + delta_time = (curr_time -pnetwork->last_scanned)/hz;
  17284. +
  17285. + if(delta_time < lifetime)// unit:sec
  17286. + {
  17287. + goto exit;
  17288. + }
  17289. +
  17290. +#endif
  17291. + }
  17292. +
  17293. + _enter_critical_bh(&free_queue->lock, &irqL);
  17294. +
  17295. + rtw_list_delete(&(pnetwork->list));
  17296. +
  17297. + rtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue));
  17298. +
  17299. + pmlmepriv->num_of_scanned --;
  17300. +
  17301. +
  17302. + //DBG_871X("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid);
  17303. +
  17304. + _exit_critical_bh(&free_queue->lock, &irqL);
  17305. +
  17306. +exit:
  17307. +
  17308. +_func_exit_;
  17309. +
  17310. +}
  17311. +
  17312. +void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork)
  17313. +{
  17314. +
  17315. + _queue *free_queue = &(pmlmepriv->free_bss_pool);
  17316. +
  17317. +_func_enter_;
  17318. +
  17319. + if (pnetwork == NULL)
  17320. + goto exit;
  17321. +
  17322. + if (pnetwork->fixed == _TRUE)
  17323. + goto exit;
  17324. +
  17325. + //_enter_critical(&free_queue->lock, &irqL);
  17326. +
  17327. + rtw_list_delete(&(pnetwork->list));
  17328. +
  17329. + rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue));
  17330. +
  17331. + pmlmepriv->num_of_scanned --;
  17332. +
  17333. + //_exit_critical(&free_queue->lock, &irqL);
  17334. +
  17335. +exit:
  17336. +
  17337. +_func_exit_;
  17338. +
  17339. +}
  17340. +
  17341. +
  17342. +/*
  17343. + return the wlan_network with the matching addr
  17344. +
  17345. + Shall be calle under atomic context... to avoid possible racing condition...
  17346. +*/
  17347. +struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr)
  17348. +{
  17349. +
  17350. + //_irqL irqL;
  17351. + _list *phead, *plist;
  17352. + struct wlan_network *pnetwork = NULL;
  17353. + u8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0};
  17354. +
  17355. +_func_enter_;
  17356. +
  17357. + if(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){
  17358. + pnetwork=NULL;
  17359. + goto exit;
  17360. + }
  17361. +
  17362. + //_enter_critical_bh(&scanned_queue->lock, &irqL);
  17363. +
  17364. + phead = get_list_head(scanned_queue);
  17365. + plist = get_next(phead);
  17366. +
  17367. + while (plist != phead)
  17368. + {
  17369. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list);
  17370. +
  17371. + if (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE)
  17372. + break;
  17373. +
  17374. + plist = get_next(plist);
  17375. + }
  17376. +
  17377. + if(plist == phead)
  17378. + pnetwork = NULL;
  17379. +
  17380. + //_exit_critical_bh(&scanned_queue->lock, &irqL);
  17381. +
  17382. +exit:
  17383. +
  17384. +_func_exit_;
  17385. +
  17386. + return pnetwork;
  17387. +
  17388. +}
  17389. +
  17390. +
  17391. +void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall)
  17392. +{
  17393. + _irqL irqL;
  17394. + _list *phead, *plist;
  17395. + struct wlan_network *pnetwork;
  17396. + struct mlme_priv* pmlmepriv = &padapter->mlmepriv;
  17397. + _queue *scanned_queue = &pmlmepriv->scanned_queue;
  17398. +
  17399. +_func_enter_;
  17400. +
  17401. +
  17402. + _enter_critical_bh(&scanned_queue->lock, &irqL);
  17403. +
  17404. + phead = get_list_head(scanned_queue);
  17405. + plist = get_next(phead);
  17406. +
  17407. + while (rtw_end_of_queue_search(phead, plist) == _FALSE)
  17408. + {
  17409. +
  17410. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  17411. +
  17412. + plist = get_next(plist);
  17413. +
  17414. + _rtw_free_network(pmlmepriv,pnetwork, isfreeall);
  17415. +
  17416. + }
  17417. +
  17418. + _exit_critical_bh(&scanned_queue->lock, &irqL);
  17419. +
  17420. +_func_exit_;
  17421. +
  17422. +}
  17423. +
  17424. +
  17425. +
  17426. +
  17427. +sint rtw_if_up(_adapter *padapter) {
  17428. +
  17429. + sint res;
  17430. +_func_enter_;
  17431. +
  17432. + if( padapter->bDriverStopped || padapter->bSurpriseRemoved ||
  17433. + (check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _FALSE)){
  17434. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  17435. + res=_FALSE;
  17436. + }
  17437. + else
  17438. + res= _TRUE;
  17439. +
  17440. +_func_exit_;
  17441. + return res;
  17442. +}
  17443. +
  17444. +
  17445. +void rtw_generate_random_ibss(u8* pibss)
  17446. +{
  17447. + u32 curtime = rtw_get_current_time();
  17448. +
  17449. +_func_enter_;
  17450. + pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1
  17451. + pibss[1] = 0x11;
  17452. + pibss[2] = 0x87;
  17453. + pibss[3] = (u8)(curtime & 0xff) ;//p[0];
  17454. + pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1];
  17455. + pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2];
  17456. +_func_exit_;
  17457. + return;
  17458. +}
  17459. +
  17460. +u8 *rtw_get_capability_from_ie(u8 *ie)
  17461. +{
  17462. + return (ie + 8 + 2);
  17463. +}
  17464. +
  17465. +
  17466. +u16 rtw_get_capability(WLAN_BSSID_EX *bss)
  17467. +{
  17468. + u16 val;
  17469. +_func_enter_;
  17470. +
  17471. + _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2);
  17472. +
  17473. +_func_exit_;
  17474. + return le16_to_cpu(val);
  17475. +}
  17476. +
  17477. +u8 *rtw_get_timestampe_from_ie(u8 *ie)
  17478. +{
  17479. + return (ie + 0);
  17480. +}
  17481. +
  17482. +u8 *rtw_get_beacon_interval_from_ie(u8 *ie)
  17483. +{
  17484. + return (ie + 8);
  17485. +}
  17486. +
  17487. +
  17488. +int rtw_init_mlme_priv (_adapter *padapter)//(struct mlme_priv *pmlmepriv)
  17489. +{
  17490. + int res;
  17491. +_func_enter_;
  17492. + res = _rtw_init_mlme_priv(padapter);// (pmlmepriv);
  17493. +_func_exit_;
  17494. + return res;
  17495. +}
  17496. +
  17497. +void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv)
  17498. +{
  17499. +_func_enter_;
  17500. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_mlme_priv\n"));
  17501. + _rtw_free_mlme_priv (pmlmepriv);
  17502. +_func_exit_;
  17503. +}
  17504. +
  17505. +int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork);
  17506. +int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork)
  17507. +{
  17508. + int res;
  17509. +_func_enter_;
  17510. + res = _rtw_enqueue_network(queue, pnetwork);
  17511. +_func_exit_;
  17512. + return res;
  17513. +}
  17514. +
  17515. +
  17516. +#ifndef PLATFORM_FREEBSD //Baron
  17517. +static struct wlan_network *rtw_dequeue_network(_queue *queue)
  17518. +{
  17519. + struct wlan_network *pnetwork;
  17520. +_func_enter_;
  17521. + pnetwork = _rtw_dequeue_network(queue);
  17522. +_func_exit_;
  17523. + return pnetwork;
  17524. +}
  17525. +#endif //PLATFORM_FREEBSD
  17526. +
  17527. +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv );
  17528. +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue)
  17529. +{
  17530. + struct wlan_network *pnetwork;
  17531. +_func_enter_;
  17532. + pnetwork = _rtw_alloc_network(pmlmepriv);
  17533. +_func_exit_;
  17534. + return pnetwork;
  17535. +}
  17536. +
  17537. +void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall);
  17538. +void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)//(struct wlan_network *pnetwork, _queue *free_queue)
  17539. +{
  17540. +_func_enter_;
  17541. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
  17542. + _rtw_free_network(pmlmepriv, pnetwork, is_freeall);
  17543. +_func_exit_;
  17544. +}
  17545. +
  17546. +void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork );
  17547. +void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork )
  17548. +{
  17549. +_func_enter_;
  17550. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
  17551. + _rtw_free_network_nolock(pmlmepriv, pnetwork);
  17552. +_func_exit_;
  17553. +}
  17554. +
  17555. +
  17556. +void rtw_free_network_queue(_adapter* dev, u8 isfreeall)
  17557. +{
  17558. +_func_enter_;
  17559. + _rtw_free_network_queue(dev, isfreeall);
  17560. +_func_exit_;
  17561. +}
  17562. +
  17563. +/*
  17564. + return the wlan_network with the matching addr
  17565. +
  17566. + Shall be calle under atomic context... to avoid possible racing condition...
  17567. +*/
  17568. +struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr)
  17569. +{
  17570. + struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr);
  17571. +
  17572. + return pnetwork;
  17573. +}
  17574. +
  17575. +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork)
  17576. +{
  17577. + int ret=_TRUE;
  17578. + struct security_priv *psecuritypriv = &adapter->securitypriv;
  17579. +
  17580. + if ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) &&
  17581. + ( pnetwork->network.Privacy == 0 ) )
  17582. + {
  17583. + ret=_FALSE;
  17584. + }
  17585. + else if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) &&
  17586. + ( pnetwork->network.Privacy == 1 ) )
  17587. + {
  17588. + ret=_FALSE;
  17589. + }
  17590. + else
  17591. + {
  17592. + ret=_TRUE;
  17593. + }
  17594. +
  17595. + return ret;
  17596. +
  17597. +}
  17598. +
  17599. +inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b);
  17600. +inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b)
  17601. +{
  17602. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n",
  17603. + // a->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength));
  17604. + return (a->Ssid.SsidLength == b->Ssid.SsidLength)
  17605. + && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE;
  17606. +}
  17607. +
  17608. +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst)
  17609. +{
  17610. + u16 s_cap, d_cap;
  17611. +
  17612. +_func_enter_;
  17613. +
  17614. +#ifdef PLATFORM_OS_XP
  17615. + if ( ((uint)dst) <= 0x7fffffff ||
  17616. + ((uint)src) <= 0x7fffffff ||
  17617. + ((uint)&s_cap) <= 0x7fffffff ||
  17618. + ((uint)&d_cap) <= 0x7fffffff)
  17619. + {
  17620. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n@@@@ error address of dst\n"));
  17621. +
  17622. + KeBugCheckEx(0x87110000, (ULONG_PTR)dst, (ULONG_PTR)src,(ULONG_PTR)&s_cap, (ULONG_PTR)&d_cap);
  17623. +
  17624. + return _FALSE;
  17625. + }
  17626. +#endif
  17627. +
  17628. +
  17629. + _rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2);
  17630. + _rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2);
  17631. +
  17632. +
  17633. + s_cap = le16_to_cpu(s_cap);
  17634. + d_cap = le16_to_cpu(d_cap);
  17635. +
  17636. +_func_exit_;
  17637. +
  17638. + return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) &&
  17639. + // (src->Configuration.DSConfig == dst->Configuration.DSConfig) &&
  17640. + ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) &&
  17641. + ( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) &&
  17642. + ((s_cap & WLAN_CAPABILITY_IBSS) ==
  17643. + (d_cap & WLAN_CAPABILITY_IBSS)) &&
  17644. + ((s_cap & WLAN_CAPABILITY_BSS) ==
  17645. + (d_cap & WLAN_CAPABILITY_BSS)));
  17646. +
  17647. +}
  17648. +
  17649. +struct wlan_network * rtw_get_oldest_wlan_network(_queue *scanned_queue)
  17650. +{
  17651. + _list *plist, *phead;
  17652. +
  17653. +
  17654. + struct wlan_network *pwlan = NULL;
  17655. + struct wlan_network *oldest = NULL;
  17656. +_func_enter_;
  17657. + phead = get_list_head(scanned_queue);
  17658. +
  17659. + plist = get_next(phead);
  17660. +
  17661. + while(1)
  17662. + {
  17663. +
  17664. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  17665. + break;
  17666. +
  17667. + pwlan= LIST_CONTAINOR(plist, struct wlan_network, list);
  17668. +
  17669. + if(pwlan->fixed!=_TRUE)
  17670. + {
  17671. + if (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned))
  17672. + oldest = pwlan;
  17673. + }
  17674. +
  17675. + plist = get_next(plist);
  17676. + }
  17677. +_func_exit_;
  17678. + return oldest;
  17679. +
  17680. +}
  17681. +
  17682. +static void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src,
  17683. + _adapter * padapter, bool update_ie)
  17684. +{
  17685. + u8 ss_ori = dst->PhyInfo.SignalStrength;
  17686. + u8 sq_ori = dst->PhyInfo.SignalQuality;
  17687. + long rssi_ori = dst->Rssi;
  17688. +
  17689. + u8 ss_smp = src->PhyInfo.SignalStrength;
  17690. + u8 sq_smp = src->PhyInfo.SignalQuality;
  17691. + long rssi_smp = src->Rssi;
  17692. +
  17693. + u8 ss_final;
  17694. + u8 sq_final;
  17695. + long rssi_final;
  17696. +
  17697. +_func_enter_;
  17698. +
  17699. +#ifdef CONFIG_ANTENNA_DIVERSITY
  17700. + rtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again
  17701. +#endif
  17702. +
  17703. + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1
  17704. + if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {
  17705. + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n"
  17706. + , FUNC_ADPT_ARG(padapter)
  17707. + , src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig
  17708. + ,ss_ori, sq_ori, rssi_ori
  17709. + ,ss_smp, sq_smp, rssi_smp
  17710. + );
  17711. + }
  17712. + #endif
  17713. +
  17714. + /* The rule below is 1/5 for sample value, 4/5 for history value */
  17715. + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) {
  17716. + /* Take the recvpriv's value for the connected AP*/
  17717. + ss_final = padapter->recvpriv.signal_strength;
  17718. + sq_final = padapter->recvpriv.signal_qual;
  17719. + /* the rssi value here is undecorated, and will be used for antenna diversity */
  17720. + if(sq_smp != 101) /* from the right channel */
  17721. + rssi_final = (src->Rssi+dst->Rssi*4)/5;
  17722. + else
  17723. + rssi_final = rssi_ori;
  17724. + }
  17725. + else {
  17726. + if(sq_smp != 101) { /* from the right channel */
  17727. + ss_final = ((u32)(src->PhyInfo.SignalStrength)+(u32)(dst->PhyInfo.SignalStrength)*4)/5;
  17728. + sq_final = ((u32)(src->PhyInfo.SignalQuality)+(u32)(dst->PhyInfo.SignalQuality)*4)/5;
  17729. + rssi_final = (src->Rssi+dst->Rssi*4)/5;
  17730. + } else {
  17731. + /* bss info not receving from the right channel, use the original RX signal infos */
  17732. + ss_final = dst->PhyInfo.SignalStrength;
  17733. + sq_final = dst->PhyInfo.SignalQuality;
  17734. + rssi_final = dst->Rssi;
  17735. + }
  17736. +
  17737. + }
  17738. +
  17739. + if (update_ie)
  17740. + _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src));
  17741. +
  17742. + dst->PhyInfo.SignalStrength = ss_final;
  17743. + dst->PhyInfo.SignalQuality = sq_final;
  17744. + dst->Rssi = rssi_final;
  17745. +
  17746. + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1
  17747. + if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {
  17748. + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n"
  17749. + , FUNC_ADPT_ARG(padapter)
  17750. + , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi);
  17751. + }
  17752. + #endif
  17753. +
  17754. +#if 0 // old codes, may be useful one day...
  17755. +// DBG_871X("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi);
  17756. + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src))
  17757. + {
  17758. +
  17759. + //DBG_871X("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal);
  17760. + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX)
  17761. + {
  17762. + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;
  17763. + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];
  17764. + padapter->recvpriv.signal_qual_data.total_val -= last_evm;
  17765. + }
  17766. + padapter->recvpriv.signal_qual_data.total_val += query_rx_pwr_percentage(src->Rssi);
  17767. +
  17768. + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi);
  17769. + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)
  17770. + padapter->recvpriv.signal_qual_data.index = 0;
  17771. +
  17772. + //DBG_871X("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi);
  17773. +
  17774. + // <1> Showed on UI for user,in percentage.
  17775. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num;
  17776. + padapter->recvpriv.signal=(u8)tmpVal;//Link quality
  17777. +
  17778. + src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ;
  17779. + }
  17780. + else{
  17781. +// DBG_871X("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi);
  17782. + src->Rssi=(src->Rssi +dst->Rssi)/2;//dBM
  17783. + }
  17784. +
  17785. +// DBG_871X("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal);
  17786. +
  17787. +#endif
  17788. +
  17789. +_func_exit_;
  17790. +}
  17791. +
  17792. +static void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork)
  17793. +{
  17794. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  17795. +
  17796. +_func_enter_;
  17797. +
  17798. +#ifdef PLATFORM_OS_XP
  17799. + if ((unsigned long)(&(pmlmepriv->cur_network.network)) < 0x7ffffff)
  17800. + {
  17801. + KeBugCheckEx(0x87111c1c, (ULONG_PTR)(&(pmlmepriv->cur_network.network)), 0, 0,0);
  17802. + }
  17803. +#endif
  17804. +
  17805. + if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork)))
  17806. + {
  17807. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n");
  17808. +
  17809. + //if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength)
  17810. + {
  17811. + update_network(&(pmlmepriv->cur_network.network), pnetwork,adapter, _TRUE);
  17812. + rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs),
  17813. + pmlmepriv->cur_network.network.IELength);
  17814. + }
  17815. + }
  17816. +
  17817. +_func_exit_;
  17818. +
  17819. +}
  17820. +
  17821. +
  17822. +/*
  17823. +
  17824. +Caller must hold pmlmepriv->lock first.
  17825. +
  17826. +
  17827. +*/
  17828. +void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target)
  17829. +{
  17830. + _irqL irqL;
  17831. + _list *plist, *phead;
  17832. + ULONG bssid_ex_sz;
  17833. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  17834. + _queue *queue = &(pmlmepriv->scanned_queue);
  17835. + struct wlan_network *pnetwork = NULL;
  17836. + struct wlan_network *oldest = NULL;
  17837. +
  17838. +_func_enter_;
  17839. +
  17840. + _enter_critical_bh(&queue->lock, &irqL);
  17841. + phead = get_list_head(queue);
  17842. + plist = get_next(phead);
  17843. +
  17844. + while(1)
  17845. + {
  17846. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  17847. + break;
  17848. +
  17849. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  17850. +
  17851. + if ((unsigned long)(pnetwork) < 0x7ffffff)
  17852. + {
  17853. +#ifdef PLATFORM_OS_XP
  17854. + KeBugCheckEx(0x87111c1c, (ULONG_PTR)pnetwork, 0, 0,0);
  17855. +#endif
  17856. + }
  17857. +
  17858. + if (is_same_network(&(pnetwork->network), target))
  17859. + break;
  17860. +
  17861. + if ((oldest == ((struct wlan_network *)0)) ||
  17862. + time_after(oldest->last_scanned, pnetwork->last_scanned))
  17863. + oldest = pnetwork;
  17864. +
  17865. + plist = get_next(plist);
  17866. +
  17867. + }
  17868. +
  17869. +
  17870. + /* If we didn't find a match, then get a new network slot to initialize
  17871. + * with this beacon's information */
  17872. + if (rtw_end_of_queue_search(phead,plist)== _TRUE) {
  17873. +
  17874. + if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) {
  17875. + /* If there are no more slots, expire the oldest */
  17876. + //list_del_init(&oldest->list);
  17877. + pnetwork = oldest;
  17878. +
  17879. +#ifdef CONFIG_ANTENNA_DIVERSITY
  17880. + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity
  17881. + rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna));
  17882. +#endif
  17883. + _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target));
  17884. + //pnetwork->last_scanned = rtw_get_current_time();
  17885. + // variable initialize
  17886. + pnetwork->fixed = _FALSE;
  17887. + pnetwork->last_scanned = rtw_get_current_time();
  17888. +
  17889. + pnetwork->network_type = 0;
  17890. + pnetwork->aid=0;
  17891. + pnetwork->join_res=0;
  17892. +
  17893. + /* bss info not receving from the right channel */
  17894. + if (pnetwork->network.PhyInfo.SignalQuality == 101)
  17895. + pnetwork->network.PhyInfo.SignalQuality = 0;
  17896. + }
  17897. + else {
  17898. + /* Otherwise just pull from the free list */
  17899. +
  17900. + pnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time
  17901. +
  17902. + if(pnetwork==NULL){
  17903. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n"));
  17904. + goto exit;
  17905. + }
  17906. +
  17907. + bssid_ex_sz = get_WLAN_BSSID_EX_sz(target);
  17908. + target->Length = bssid_ex_sz;
  17909. +#ifdef CONFIG_ANTENNA_DIVERSITY
  17910. + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;
  17911. + rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna));
  17912. +#endif
  17913. + _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz );
  17914. +
  17915. + pnetwork->last_scanned = rtw_get_current_time();
  17916. +
  17917. + /* bss info not receving from the right channel */
  17918. + if (pnetwork->network.PhyInfo.SignalQuality == 101)
  17919. + pnetwork->network.PhyInfo.SignalQuality = 0;
  17920. +
  17921. + rtw_list_insert_tail(&(pnetwork->list),&(queue->queue));
  17922. +
  17923. + }
  17924. + }
  17925. + else {
  17926. + /* we have an entry and we are going to update it. But this entry may
  17927. + * be already expired. In this case we do the same as we found a new
  17928. + * net and call the new_net handler
  17929. + */
  17930. + bool update_ie = _TRUE;
  17931. +
  17932. + pnetwork->last_scanned = rtw_get_current_time();
  17933. +
  17934. + //target.Reserved[0]==1, means that scaned network is a bcn frame.
  17935. + if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1))
  17936. + update_ie = _FALSE;
  17937. +
  17938. + update_network(&(pnetwork->network), target,adapter, update_ie);
  17939. + }
  17940. +
  17941. +exit:
  17942. + _exit_critical_bh(&queue->lock, &irqL);
  17943. +
  17944. +_func_exit_;
  17945. +}
  17946. +
  17947. +void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork);
  17948. +void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork)
  17949. +{
  17950. + _irqL irqL;
  17951. + struct mlme_priv *pmlmepriv = &(((_adapter *)adapter)->mlmepriv);
  17952. + //_queue *queue = &(pmlmepriv->scanned_queue);
  17953. +
  17954. +_func_enter_;
  17955. +
  17956. + //_enter_critical_bh(&queue->lock, &irqL);
  17957. +
  17958. + #if defined(CONFIG_P2P) && defined(CONFIG_P2P_REMOVE_GROUP_INFO)
  17959. + rtw_WLAN_BSSID_EX_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO);
  17960. + #endif
  17961. +
  17962. + update_current_network(adapter, pnetwork);
  17963. +
  17964. + rtw_update_scanned_network(adapter, pnetwork);
  17965. +
  17966. + //_exit_critical_bh(&queue->lock, &irqL);
  17967. +
  17968. +_func_exit_;
  17969. +}
  17970. +
  17971. +//select the desired network based on the capability of the (i)bss.
  17972. +// check items: (1) security
  17973. +// (2) network_type
  17974. +// (3) WMM
  17975. +// (4) HT
  17976. +// (5) others
  17977. +int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork);
  17978. +int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork)
  17979. +{
  17980. + struct security_priv *psecuritypriv = &adapter->securitypriv;
  17981. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  17982. + u32 desired_encmode;
  17983. + u32 privacy;
  17984. +
  17985. + //u8 wps_ie[512];
  17986. + uint wps_ielen;
  17987. +
  17988. + int bselected = _TRUE;
  17989. +
  17990. + desired_encmode = psecuritypriv->ndisencryptstatus;
  17991. + privacy = pnetwork->network.Privacy;
  17992. +
  17993. + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))
  17994. + {
  17995. + if(rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen)!=NULL)
  17996. + {
  17997. + return _TRUE;
  17998. + }
  17999. + else
  18000. + {
  18001. + return _FALSE;
  18002. + }
  18003. + }
  18004. + if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do....
  18005. + {
  18006. + u8 *p=NULL;
  18007. + uint ie_len=0;
  18008. +
  18009. + if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0))
  18010. + bselected = _FALSE;
  18011. +
  18012. + if ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) {
  18013. + p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_));
  18014. + if (p && ie_len>0) {
  18015. + bselected = _TRUE;
  18016. + } else {
  18017. + bselected = _FALSE;
  18018. + }
  18019. + }
  18020. + }
  18021. +
  18022. +
  18023. + if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) {
  18024. + DBG_871X("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy);
  18025. + bselected = _FALSE;
  18026. + }
  18027. +
  18028. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
  18029. + {
  18030. + if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode)
  18031. + bselected = _FALSE;
  18032. + }
  18033. +
  18034. +
  18035. + return bselected;
  18036. +}
  18037. +
  18038. +/* TODO: Perry : For Power Management */
  18039. +void rtw_atimdone_event_callback(_adapter *adapter , u8 *pbuf)
  18040. +{
  18041. +
  18042. +_func_enter_;
  18043. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n"));
  18044. +_func_exit_;
  18045. + return;
  18046. +}
  18047. +
  18048. +
  18049. +void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf)
  18050. +{
  18051. + _irqL irqL;
  18052. + u32 len;
  18053. + WLAN_BSSID_EX *pnetwork;
  18054. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  18055. +
  18056. +_func_enter_;
  18057. +
  18058. + pnetwork = (WLAN_BSSID_EX *)pbuf;
  18059. +
  18060. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_callback, ssid=%s\n", pnetwork->Ssid.Ssid));
  18061. +
  18062. +#ifdef CONFIG_RTL8712
  18063. + //endian_convert
  18064. + pnetwork->Length = le32_to_cpu(pnetwork->Length);
  18065. + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);
  18066. + pnetwork->Privacy =le32_to_cpu( pnetwork->Privacy);
  18067. + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
  18068. + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse);
  18069. + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow);
  18070. + pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod);
  18071. + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig);
  18072. + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
  18073. + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
  18074. + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
  18075. + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
  18076. + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length);
  18077. + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode);
  18078. + pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
  18079. +#endif
  18080. +
  18081. + len = get_WLAN_BSSID_EX_sz(pnetwork);
  18082. + if(len > (sizeof(WLAN_BSSID_EX)))
  18083. + {
  18084. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_callback: return a wrong bss ***\n"));
  18085. + return;
  18086. + }
  18087. +
  18088. +
  18089. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  18090. +
  18091. + // update IBSS_network 's timestamp
  18092. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE)
  18093. + {
  18094. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \n\n");
  18095. + if(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN))
  18096. + {
  18097. + struct wlan_network* ibss_wlan = NULL;
  18098. + _irqL irqL;
  18099. +
  18100. + _rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8);
  18101. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18102. + ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress);
  18103. + if(ibss_wlan)
  18104. + {
  18105. + _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8);
  18106. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18107. + goto exit;
  18108. + }
  18109. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18110. + }
  18111. + }
  18112. +
  18113. + // lock pmlmepriv->lock when you accessing network_q
  18114. + if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE)
  18115. + {
  18116. + if( pnetwork->Ssid.Ssid[0] == 0 )
  18117. + {
  18118. + pnetwork->Ssid.SsidLength = 0;
  18119. + }
  18120. + rtw_add_network(adapter, pnetwork);
  18121. + }
  18122. +
  18123. +exit:
  18124. +
  18125. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  18126. +
  18127. +_func_exit_;
  18128. +
  18129. + return;
  18130. +}
  18131. +
  18132. +
  18133. +
  18134. +void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf)
  18135. +{
  18136. + _irqL irqL;
  18137. + u8 timer_cancelled = _FALSE;
  18138. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  18139. +
  18140. +#ifdef CONFIG_MLME_EXT
  18141. +
  18142. + mlmeext_surveydone_event_callback(adapter);
  18143. +
  18144. +#endif
  18145. +
  18146. +_func_enter_;
  18147. +
  18148. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  18149. + if(pmlmepriv->wps_probe_req_ie)
  18150. + {
  18151. + u32 free_len = pmlmepriv->wps_probe_req_ie_len;
  18152. + pmlmepriv->wps_probe_req_ie_len = 0;
  18153. + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);
  18154. + pmlmepriv->wps_probe_req_ie = NULL;
  18155. + }
  18156. +
  18157. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv)));
  18158. +
  18159. + if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY))
  18160. + {
  18161. + //u8 timer_cancelled;
  18162. +
  18163. + timer_cancelled = _TRUE;
  18164. + //_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
  18165. +
  18166. + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
  18167. + }
  18168. + else {
  18169. +
  18170. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv)));
  18171. + }
  18172. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  18173. +
  18174. + if(timer_cancelled)
  18175. + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
  18176. +
  18177. +
  18178. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  18179. +
  18180. + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  18181. + rtw_set_signal_stat_timer(&adapter->recvpriv);
  18182. + #endif
  18183. +
  18184. + if(pmlmepriv->to_join == _TRUE)
  18185. + {
  18186. + if((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) )
  18187. + {
  18188. + if(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE)
  18189. + {
  18190. + set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  18191. +
  18192. + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS)
  18193. + {
  18194. + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT );
  18195. + }
  18196. + else
  18197. + {
  18198. + WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network);
  18199. + u8 *pibss = adapter->registrypriv.dev_network.MacAddress;
  18200. +
  18201. + //pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer
  18202. + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
  18203. +
  18204. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("switching to adhoc master\n"));
  18205. +
  18206. + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));
  18207. + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));
  18208. +
  18209. + rtw_update_registrypriv_dev_network(adapter);
  18210. + rtw_generate_random_ibss(pibss);
  18211. +
  18212. + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
  18213. +
  18214. + if(rtw_createbss_cmd(adapter)!=_SUCCESS)
  18215. + {
  18216. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error=>rtw_createbss_cmd status FAIL\n"));
  18217. + }
  18218. +
  18219. + pmlmepriv->to_join = _FALSE;
  18220. + }
  18221. + }
  18222. + }
  18223. + else
  18224. + {
  18225. + int s_ret;
  18226. + set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  18227. + pmlmepriv->to_join = _FALSE;
  18228. + if(_SUCCESS == (s_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv)))
  18229. + {
  18230. + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
  18231. + }
  18232. + else if(s_ret == 2)//there is no need to wait for join
  18233. + {
  18234. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  18235. + rtw_indicate_connect(adapter);
  18236. + }
  18237. + else
  18238. + {
  18239. + DBG_871X("try_to_join, but select scanning queue fail, to_roaming:%d\n", rtw_to_roaming(adapter));
  18240. + #ifdef CONFIG_LAYER2_ROAMING
  18241. + if (rtw_to_roaming(adapter) != 0) {
  18242. + if( --pmlmepriv->to_roaming == 0
  18243. + || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)
  18244. + ) {
  18245. + rtw_set_roaming(adapter, 0);
  18246. +#ifdef CONFIG_INTEL_WIDI
  18247. + if(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)
  18248. + {
  18249. + _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);
  18250. + intel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL);
  18251. + DBG_871X("change to widi listen\n");
  18252. + }
  18253. +#endif // CONFIG_INTEL_WIDI
  18254. + rtw_free_assoc_resources(adapter, 1);
  18255. + rtw_indicate_disconnect(adapter);
  18256. + } else {
  18257. + pmlmepriv->to_join = _TRUE;
  18258. + }
  18259. + }
  18260. + #endif
  18261. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  18262. + }
  18263. + }
  18264. + }
  18265. +
  18266. + indicate_wx_scan_complete_event(adapter);
  18267. + //DBG_871X("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time));
  18268. +
  18269. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  18270. +
  18271. +#ifdef CONFIG_P2P_PS
  18272. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  18273. + p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0);
  18274. + }
  18275. +#endif // CONFIG_P2P_PS
  18276. +
  18277. + rtw_os_xmit_schedule(adapter);
  18278. +#ifdef CONFIG_CONCURRENT_MODE
  18279. + rtw_os_xmit_schedule(adapter->pbuddy_adapter);
  18280. +#endif
  18281. +#ifdef CONFIG_DUALMAC_CONCURRENT
  18282. + dc_resume_xmit(adapter);
  18283. +#endif
  18284. +
  18285. +#ifdef CONFIG_DRVEXT_MODULE_WSC
  18286. + drvext_surveydone_callback(&adapter->drvextpriv);
  18287. +#endif
  18288. +
  18289. +#ifdef DBG_CONFIG_ERROR_DETECT
  18290. +#ifdef CONFIG_INTEL_WIDI
  18291. + if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_NONE)
  18292. +#endif
  18293. + {
  18294. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  18295. + if(pmlmeext->sitesurvey_res.bss_cnt == 0){
  18296. + rtw_hal_sreset_reset(adapter);
  18297. + }
  18298. + }
  18299. +#endif
  18300. +
  18301. +#ifdef CONFIG_IOCTL_CFG80211
  18302. + rtw_cfg80211_surveydone_event_callback(adapter);
  18303. +#endif //CONFIG_IOCTL_CFG80211
  18304. +
  18305. +_func_exit_;
  18306. +
  18307. +}
  18308. +
  18309. +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf)
  18310. +{
  18311. +
  18312. +}
  18313. +
  18314. +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf)
  18315. +{
  18316. +
  18317. +}
  18318. +
  18319. +static void free_scanqueue(struct mlme_priv *pmlmepriv)
  18320. +{
  18321. + _irqL irqL, irqL0;
  18322. + _queue *free_queue = &pmlmepriv->free_bss_pool;
  18323. + _queue *scan_queue = &pmlmepriv->scanned_queue;
  18324. + _list *plist, *phead, *ptemp;
  18325. +
  18326. +_func_enter_;
  18327. +
  18328. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+free_scanqueue\n"));
  18329. + _enter_critical_bh(&scan_queue->lock, &irqL0);
  18330. + _enter_critical_bh(&free_queue->lock, &irqL);
  18331. +
  18332. + phead = get_list_head(scan_queue);
  18333. + plist = get_next(phead);
  18334. +
  18335. + while (plist != phead)
  18336. + {
  18337. + ptemp = get_next(plist);
  18338. + rtw_list_delete(plist);
  18339. + rtw_list_insert_tail(plist, &free_queue->queue);
  18340. + plist =ptemp;
  18341. + pmlmepriv->num_of_scanned --;
  18342. + }
  18343. +
  18344. + _exit_critical_bh(&free_queue->lock, &irqL);
  18345. + _exit_critical_bh(&scan_queue->lock, &irqL0);
  18346. +
  18347. +_func_exit_;
  18348. +}
  18349. +
  18350. +/*
  18351. +*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock
  18352. +*/
  18353. +void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue)
  18354. +{
  18355. + _irqL irqL;
  18356. + struct wlan_network* pwlan = NULL;
  18357. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  18358. + struct sta_priv *pstapriv = &adapter->stapriv;
  18359. + struct wlan_network *tgt_network = &pmlmepriv->cur_network;
  18360. +
  18361. +#ifdef CONFIG_TDLS
  18362. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  18363. +#endif //CONFIG_TDLS
  18364. +_func_enter_;
  18365. +
  18366. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources\n"));
  18367. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n",
  18368. + MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid));
  18369. +
  18370. + if(check_fwstate( pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE))
  18371. + {
  18372. + struct sta_info* psta;
  18373. +
  18374. + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress);
  18375. +
  18376. +#ifdef CONFIG_TDLS
  18377. + if(ptdlsinfo->setup_state != TDLS_STATE_NONE)
  18378. + {
  18379. + rtw_tdls_cmd(adapter, myid(&(adapter->eeprompriv)), TDLS_RS_RCR);
  18380. + rtw_reset_tdls_info(adapter);
  18381. + rtw_free_all_stainfo(adapter);
  18382. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  18383. + }
  18384. + else
  18385. +#endif //CONFIG_TDLS
  18386. + {
  18387. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  18388. + rtw_free_stainfo(adapter, psta);
  18389. + }
  18390. +
  18391. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  18392. +
  18393. + }
  18394. +
  18395. + if(check_fwstate( pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE))
  18396. + {
  18397. + struct sta_info* psta;
  18398. +
  18399. + rtw_free_all_stainfo(adapter);
  18400. +
  18401. + psta = rtw_get_bcmc_stainfo(adapter);
  18402. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  18403. + rtw_free_stainfo(adapter, psta);
  18404. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  18405. +
  18406. + rtw_init_bcmc_stainfo(adapter);
  18407. + }
  18408. +
  18409. + if(lock_scanned_queue)
  18410. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18411. +
  18412. + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
  18413. + if(pwlan)
  18414. + {
  18415. + pwlan->fixed = _FALSE;
  18416. +#ifdef CONFIG_P2P
  18417. + if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE))
  18418. + {
  18419. + u32 p2p_ielen=0;
  18420. + u8 *p2p_ie;
  18421. + //u16 capability;
  18422. + u8 *pcap = NULL;
  18423. + u32 capability_len=0;
  18424. +
  18425. + //DBG_871X("free disconnecting network\n");
  18426. + //rtw_free_network_nolock(pmlmepriv, pwlan);
  18427. +
  18428. + if((p2p_ie=rtw_get_p2p_ie(pwlan->network.IEs+_FIXED_IE_LENGTH_, pwlan->network.IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)))
  18429. + {
  18430. + pcap = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, NULL, &capability_len);
  18431. + if(pcap && capability_len==2)
  18432. + {
  18433. + u16 cap = *(u16*)pcap ;
  18434. + *(u16*)pcap = cap&0x00ff;//clear group capability when free this network
  18435. + }
  18436. + }
  18437. +
  18438. + rtw_set_scan_deny(adapter, 2000);
  18439. + //rtw_clear_scan_deny(adapter);
  18440. + }
  18441. +#endif //CONFIG_P2P
  18442. + }
  18443. + else
  18444. + {
  18445. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n"));
  18446. + }
  18447. +
  18448. +
  18449. + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1))
  18450. + /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/)
  18451. + {
  18452. + rtw_free_network_nolock(pmlmepriv, pwlan);
  18453. + }
  18454. +
  18455. + if(lock_scanned_queue)
  18456. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18457. +
  18458. + adapter->securitypriv.key_mask = 0;
  18459. +
  18460. +_func_exit_;
  18461. +
  18462. +}
  18463. +
  18464. +/*
  18465. +*rtw_indicate_connect: the caller has to lock pmlmepriv->lock
  18466. +*/
  18467. +void rtw_indicate_connect(_adapter *padapter)
  18468. +{
  18469. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  18470. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  18471. +
  18472. +_func_enter_;
  18473. +
  18474. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect\n"));
  18475. +
  18476. + pmlmepriv->to_join = _FALSE;
  18477. +
  18478. + if(!check_fwstate(&padapter->mlmepriv, _FW_LINKED))
  18479. + {
  18480. +
  18481. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  18482. + rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0);
  18483. +#endif
  18484. + set_fwstate(pmlmepriv, _FW_LINKED);
  18485. +
  18486. + rtw_led_control(padapter, LED_CTL_LINK);
  18487. +
  18488. +#ifdef CONFIG_DRVEXT_MODULE
  18489. + if(padapter->drvextpriv.enable_wpa)
  18490. + {
  18491. + indicate_l2_connect(padapter);
  18492. + }
  18493. + else
  18494. +#endif
  18495. + {
  18496. + rtw_os_indicate_connect(padapter);
  18497. + }
  18498. +
  18499. + }
  18500. +
  18501. + rtw_set_roaming(padapter, 0);
  18502. +
  18503. +#ifdef CONFIG_INTEL_WIDI
  18504. + if(padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)
  18505. + {
  18506. + _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);
  18507. + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_WK, NULL);
  18508. + DBG_871X("change to widi listen\n");
  18509. + }
  18510. +#endif // CONFIG_INTEL_WIDI
  18511. +
  18512. + rtw_set_scan_deny(padapter, 3000);
  18513. +
  18514. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect: fw_state=0x%08x\n", get_fwstate(pmlmepriv)));
  18515. +
  18516. +_func_exit_;
  18517. +
  18518. +}
  18519. +
  18520. +
  18521. +/*
  18522. +*rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock
  18523. +*/
  18524. +void rtw_indicate_disconnect( _adapter *padapter )
  18525. +{
  18526. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  18527. +
  18528. +_func_enter_;
  18529. +
  18530. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect\n"));
  18531. +
  18532. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS);
  18533. +
  18534. + if(rtw_to_roaming(padapter) > 0)
  18535. + _clr_fwstate_(pmlmepriv, _FW_LINKED);
  18536. +
  18537. + if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)
  18538. + || (rtw_to_roaming(padapter) <= 0)
  18539. + )
  18540. + {
  18541. + rtw_os_indicate_disconnect(padapter);
  18542. +
  18543. + //set ips_deny_time to avoid enter IPS before LPS leave
  18544. + padapter->pwrctrlpriv.ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000);
  18545. +
  18546. + _clr_fwstate_(pmlmepriv, _FW_LINKED);
  18547. +
  18548. + rtw_led_control(padapter, LED_CTL_NO_LINK);
  18549. +
  18550. + rtw_clear_scan_deny(padapter);
  18551. +
  18552. + }
  18553. +
  18554. +#ifdef CONFIG_P2P_PS
  18555. + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);
  18556. +#endif // CONFIG_P2P_PS
  18557. +
  18558. +#ifdef CONFIG_LPS
  18559. +#ifdef CONFIG_WOWLAN
  18560. + if(padapter->pwrctrlpriv.wowlan_mode==_FALSE)
  18561. +#endif //CONFIG_WOWLAN
  18562. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1);
  18563. +
  18564. +#endif
  18565. +
  18566. +_func_exit_;
  18567. +}
  18568. +
  18569. +inline void rtw_indicate_scan_done( _adapter *padapter, bool aborted)
  18570. +{
  18571. + rtw_os_indicate_scan_done(padapter, aborted);
  18572. +}
  18573. +
  18574. +void rtw_scan_abort(_adapter *adapter)
  18575. +{
  18576. + u32 cnt=0;
  18577. + u32 start;
  18578. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  18579. + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
  18580. +
  18581. + start = rtw_get_current_time();
  18582. + pmlmeext->scan_abort = _TRUE;
  18583. + while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)
  18584. + && rtw_get_passing_time_ms(start) <= 200) {
  18585. +
  18586. + if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
  18587. + break;
  18588. +
  18589. + DBG_871X(FUNC_NDEV_FMT"fw_state=_FW_UNDER_SURVEY!\n", FUNC_NDEV_ARG(adapter->pnetdev));
  18590. + rtw_msleep_os(20);
  18591. + }
  18592. +
  18593. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {
  18594. + if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved)
  18595. + DBG_871X(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev));
  18596. + #ifdef CONFIG_PLATFORM_MSTAR
  18597. + //_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
  18598. + set_survey_timer(pmlmeext, 0);
  18599. + _set_timer(&pmlmepriv->scan_to_timer, 50);
  18600. + #endif
  18601. + rtw_indicate_scan_done(adapter, _TRUE);
  18602. + }
  18603. + pmlmeext->scan_abort = _FALSE;
  18604. +}
  18605. +
  18606. +static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wlan_network *pnetwork)
  18607. +{
  18608. + int i;
  18609. + struct sta_info *bmc_sta, *psta=NULL;
  18610. + struct recv_reorder_ctrl *preorder_ctrl;
  18611. + struct sta_priv *pstapriv = &padapter->stapriv;
  18612. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  18613. +
  18614. + psta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress);
  18615. + if(psta==NULL) {
  18616. + psta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress);
  18617. + }
  18618. +
  18619. + if(psta) //update ptarget_sta
  18620. + {
  18621. + DBG_871X("%s\n", __FUNCTION__);
  18622. +
  18623. + psta->aid = pnetwork->join_res;
  18624. +#ifdef CONFIG_CONCURRENT_MODE
  18625. +
  18626. + if(PRIMARY_ADAPTER == padapter->adapter_type)
  18627. + psta->mac_id=0;
  18628. + else
  18629. + psta->mac_id=2;
  18630. +#else
  18631. + psta->mac_id=0;
  18632. +#endif
  18633. +
  18634. + psta->raid = networktype_to_raid(pmlmeext->cur_wireless_mode);
  18635. +
  18636. + //security related
  18637. + if(padapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X)
  18638. + {
  18639. + padapter->securitypriv.binstallGrpkey=_FALSE;
  18640. + padapter->securitypriv.busetkipkey=_FALSE;
  18641. + padapter->securitypriv.bgrpkey_handshake=_FALSE;
  18642. +
  18643. + psta->ieee8021x_blocked=_TRUE;
  18644. + psta->dot118021XPrivacy=padapter->securitypriv.dot11PrivacyAlgrthm;
  18645. +
  18646. + _rtw_memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof (union Keytype));
  18647. +
  18648. + _rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype));
  18649. + _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
  18650. +
  18651. + _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
  18652. +#ifdef CONFIG_IEEE80211W
  18653. + _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));
  18654. +#endif //CONFIG_IEEE80211W
  18655. + _rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48));
  18656. + }
  18657. +
  18658. + // Commented by Albert 2012/07/21
  18659. + // When doing the WPS, the wps_ie_len won't equal to 0
  18660. + // And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted.
  18661. + if ( padapter->securitypriv.wps_ie_len != 0 )
  18662. + {
  18663. + psta->ieee8021x_blocked=_TRUE;
  18664. + padapter->securitypriv.wps_ie_len = 0;
  18665. + }
  18666. +
  18667. +
  18668. + //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info
  18669. + //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff
  18670. + //todo: check if AP can send A-MPDU packets
  18671. + for(i=0; i < 16 ; i++)
  18672. + {
  18673. + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i];
  18674. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  18675. + preorder_ctrl->enable = _FALSE;
  18676. + preorder_ctrl->indicate_seq = 0xffff;
  18677. + #ifdef DBG_RX_SEQ
  18678. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  18679. + preorder_ctrl->indicate_seq);
  18680. + #endif
  18681. + preorder_ctrl->wend_b= 0xffff;
  18682. + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32
  18683. + }
  18684. +
  18685. +
  18686. + bmc_sta = rtw_get_bcmc_stainfo(padapter);
  18687. + if(bmc_sta)
  18688. + {
  18689. + for(i=0; i < 16 ; i++)
  18690. + {
  18691. + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i];
  18692. + preorder_ctrl = &bmc_sta->recvreorder_ctrl[i];
  18693. + preorder_ctrl->enable = _FALSE;
  18694. + preorder_ctrl->indicate_seq = 0xffff;
  18695. + #ifdef DBG_RX_SEQ
  18696. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  18697. + preorder_ctrl->indicate_seq);
  18698. + #endif
  18699. + preorder_ctrl->wend_b= 0xffff;
  18700. + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32
  18701. + }
  18702. + }
  18703. +
  18704. +
  18705. + //misc.
  18706. + update_sta_info(padapter, psta);
  18707. +
  18708. + }
  18709. +
  18710. + return psta;
  18711. +
  18712. +}
  18713. +
  18714. +//pnetwork : returns from rtw_joinbss_event_callback
  18715. +//ptarget_wlan: found from scanned_queue
  18716. +static void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network *pnetwork)
  18717. +{
  18718. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  18719. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  18720. +
  18721. + DBG_871X("%s\n", __FUNCTION__);
  18722. +
  18723. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:"MAC_FMT"\n"
  18724. + ,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress)));
  18725. +
  18726. +
  18727. + // why not use ptarget_wlan??
  18728. + _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length);
  18729. +
  18730. + cur_network->aid = pnetwork->join_res;
  18731. +
  18732. +
  18733. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  18734. + rtw_set_signal_stat_timer(&padapter->recvpriv);
  18735. +#endif
  18736. + padapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength;
  18737. + padapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality;
  18738. + //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled)
  18739. + padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);
  18740. + #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
  18741. + DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u"
  18742. + "\n"
  18743. + , FUNC_ADPT_ARG(padapter)
  18744. + , padapter->recvpriv.signal_strength
  18745. + , padapter->recvpriv.rssi
  18746. + , padapter->recvpriv.signal_qual
  18747. + );
  18748. + #endif
  18749. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  18750. + rtw_set_signal_stat_timer(&padapter->recvpriv);
  18751. +#endif
  18752. +
  18753. + //update fw_state //will clr _FW_UNDER_LINKING here indirectly
  18754. + switch(pnetwork->network.InfrastructureMode)
  18755. + {
  18756. + case Ndis802_11Infrastructure:
  18757. +
  18758. + if(pmlmepriv->fw_state&WIFI_UNDER_WPS)
  18759. + pmlmepriv->fw_state = WIFI_STATION_STATE|WIFI_UNDER_WPS;
  18760. + else
  18761. + pmlmepriv->fw_state = WIFI_STATION_STATE;
  18762. +
  18763. + break;
  18764. + case Ndis802_11IBSS:
  18765. + pmlmepriv->fw_state = WIFI_ADHOC_STATE;
  18766. + break;
  18767. + default:
  18768. + pmlmepriv->fw_state = WIFI_NULL_STATE;
  18769. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n"));
  18770. + break;
  18771. + }
  18772. +
  18773. + rtw_update_protection(padapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs),
  18774. + (cur_network->network.IELength));
  18775. +
  18776. +#ifdef CONFIG_80211N_HT
  18777. + rtw_update_ht_cap(padapter, cur_network->network.IEs, cur_network->network.IELength, (u8) cur_network->network.Configuration.DSConfig);
  18778. +#endif
  18779. +
  18780. +
  18781. +}
  18782. +
  18783. +//Notes: the fucntion could be > passive_level (the same context as Rx tasklet)
  18784. +//pnetwork : returns from rtw_joinbss_event_callback
  18785. +//ptarget_wlan: found from scanned_queue
  18786. +//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist.
  18787. +//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist.
  18788. +//if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL).
  18789. +//
  18790. +//#define REJOIN
  18791. +void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf)
  18792. +{
  18793. + _irqL irqL,irqL2;
  18794. + static u8 retry=0;
  18795. + u8 timer_cancelled;
  18796. + struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL;
  18797. + struct sta_priv *pstapriv = &adapter->stapriv;
  18798. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  18799. + struct wlan_network *pnetwork = (struct wlan_network *)pbuf;
  18800. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  18801. + struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL;
  18802. + unsigned int the_same_macaddr = _FALSE;
  18803. +
  18804. +_func_enter_;
  18805. +
  18806. +#ifdef CONFIG_RTL8712
  18807. + //endian_convert
  18808. + pnetwork->join_res = le32_to_cpu(pnetwork->join_res);
  18809. + pnetwork->network_type = le32_to_cpu(pnetwork->network_type);
  18810. + pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length);
  18811. + pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength);
  18812. + pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy);
  18813. + pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi);
  18814. + pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ;
  18815. + pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow);
  18816. + pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod);
  18817. + pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig);
  18818. + pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime);
  18819. + pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern);
  18820. + pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet);
  18821. + pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length);
  18822. + pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length);
  18823. + pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode);
  18824. + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength );
  18825. +#endif
  18826. +
  18827. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res));
  18828. +
  18829. + rtw_get_encrypt_decrypt_from_registrypriv(adapter);
  18830. +
  18831. +
  18832. + if (pmlmepriv->assoc_ssid.SsidLength == 0)
  18833. + {
  18834. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n"));
  18835. + }
  18836. + else
  18837. + {
  18838. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid));
  18839. + }
  18840. +
  18841. + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN);
  18842. +
  18843. + pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network);
  18844. + if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX))
  18845. + {
  18846. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n"));
  18847. + goto ignore_joinbss_callback;
  18848. + }
  18849. +
  18850. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  18851. +
  18852. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n"));
  18853. +
  18854. + if(pnetwork->join_res > 0)
  18855. + {
  18856. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18857. + retry = 0;
  18858. + if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) )
  18859. + {
  18860. + //s1. find ptarget_wlan
  18861. + if(check_fwstate(pmlmepriv, _FW_LINKED) )
  18862. + {
  18863. + if(the_same_macaddr == _TRUE)
  18864. + {
  18865. + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
  18866. + }
  18867. + else
  18868. + {
  18869. + pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
  18870. + if(pcur_wlan) pcur_wlan->fixed = _FALSE;
  18871. +
  18872. + pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
  18873. + if(pcur_sta){
  18874. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  18875. + rtw_free_stainfo(adapter, pcur_sta);
  18876. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  18877. + }
  18878. +
  18879. + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
  18880. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){
  18881. + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE;
  18882. + }
  18883. + }
  18884. +
  18885. + }
  18886. + else
  18887. + {
  18888. + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
  18889. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){
  18890. + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE;
  18891. + }
  18892. + }
  18893. +
  18894. + //s2. update cur_network
  18895. + if(ptarget_wlan)
  18896. + {
  18897. + rtw_joinbss_update_network(adapter, ptarget_wlan, pnetwork);
  18898. + }
  18899. + else
  18900. + {
  18901. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n"));
  18902. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18903. + goto ignore_joinbss_callback;
  18904. + }
  18905. +
  18906. +
  18907. + //s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode
  18908. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  18909. + {
  18910. + ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork);
  18911. + if(ptarget_sta==NULL)
  18912. + {
  18913. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't update stainfo when joinbss_event callback\n"));
  18914. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18915. + goto ignore_joinbss_callback;
  18916. + }
  18917. + }
  18918. +
  18919. + //s4. indicate connect
  18920. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  18921. + {
  18922. + rtw_indicate_connect(adapter);
  18923. + }
  18924. + else
  18925. + {
  18926. + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback
  18927. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv)));
  18928. + }
  18929. +
  18930. +
  18931. + //s5. Cancle assoc_timer
  18932. + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);
  18933. +
  18934. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer\n"));
  18935. +
  18936. + }
  18937. + else
  18938. + {
  18939. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv)));
  18940. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18941. + goto ignore_joinbss_callback;
  18942. + }
  18943. +
  18944. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  18945. +
  18946. + }
  18947. + else if(pnetwork->join_res == -4)
  18948. + {
  18949. + rtw_reset_securitypriv(adapter);
  18950. + _set_timer(&pmlmepriv->assoc_timer, 1);
  18951. +
  18952. + //rtw_free_assoc_resources(adapter, 1);
  18953. +
  18954. + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE)
  18955. + {
  18956. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv)));
  18957. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  18958. + }
  18959. +
  18960. + }
  18961. + else //if join_res < 0 (join fails), then try again
  18962. + {
  18963. +
  18964. + #ifdef REJOIN
  18965. + res = _FAIL;
  18966. + if(retry < 2) {
  18967. + res = rtw_select_and_join_from_scanned_queue(pmlmepriv);
  18968. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res));
  18969. + }
  18970. +
  18971. + if(res == _SUCCESS)
  18972. + {
  18973. + //extend time of assoc_timer
  18974. + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
  18975. + retry++;
  18976. + }
  18977. + else if(res == 2)//there is no need to wait for join
  18978. + {
  18979. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  18980. + rtw_indicate_connect(adapter);
  18981. + }
  18982. + else
  18983. + {
  18984. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n"));
  18985. + #endif
  18986. +
  18987. + _set_timer(&pmlmepriv->assoc_timer, 1);
  18988. + //rtw_free_assoc_resources(adapter, 1);
  18989. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  18990. +
  18991. + #ifdef REJOIN
  18992. + retry = 0;
  18993. + }
  18994. + #endif
  18995. + }
  18996. +
  18997. +ignore_joinbss_callback:
  18998. +
  18999. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  19000. + _func_exit_;
  19001. +}
  19002. +
  19003. +void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf)
  19004. +{
  19005. + struct wlan_network *pnetwork = (struct wlan_network *)pbuf;
  19006. +
  19007. +_func_enter_;
  19008. +
  19009. + mlmeext_joinbss_event_callback(adapter, pnetwork->join_res);
  19010. +
  19011. + rtw_os_xmit_schedule(adapter);
  19012. +
  19013. +#ifdef CONFIG_CONCURRENT_MODE
  19014. + rtw_os_xmit_schedule(adapter->pbuddy_adapter);
  19015. +#endif
  19016. +
  19017. +#ifdef CONFIG_DUALMAC_CONCURRENT
  19018. + dc_resume_xmit(adapter);
  19019. +#endif
  19020. +
  19021. +_func_exit_;
  19022. +}
  19023. +
  19024. +void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf)
  19025. +{
  19026. + _irqL irqL;
  19027. + struct sta_info *psta;
  19028. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  19029. + struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf;
  19030. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  19031. + struct wlan_network *ptarget_wlan = NULL;
  19032. +
  19033. +_func_enter_;
  19034. +
  19035. + if(rtw_access_ctrl(adapter, pstassoc->macaddr) == _FALSE)
  19036. + return;
  19037. +
  19038. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  19039. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE))
  19040. + {
  19041. + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);
  19042. + if(psta)
  19043. + {
  19044. +#ifdef CONFIG_IOCTL_CFG80211
  19045. +#ifdef COMPAT_KERNEL_RELEASE
  19046. +
  19047. +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  19048. + u8 *passoc_req = NULL;
  19049. + u32 assoc_req_len;
  19050. +
  19051. + _enter_critical_bh(&psta->lock, &irqL);
  19052. + if(psta->passoc_req && psta->assoc_req_len>0)
  19053. + {
  19054. + passoc_req = rtw_zmalloc(psta->assoc_req_len);
  19055. + if(passoc_req)
  19056. + {
  19057. + assoc_req_len = psta->assoc_req_len;
  19058. + _rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len);
  19059. +
  19060. + rtw_mfree(psta->passoc_req , psta->assoc_req_len);
  19061. + psta->passoc_req = NULL;
  19062. + psta->assoc_req_len = 0;
  19063. + }
  19064. + }
  19065. + _exit_critical_bh(&psta->lock, &irqL);
  19066. +
  19067. + if(passoc_req && assoc_req_len>0)
  19068. + {
  19069. + rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len);
  19070. +
  19071. + rtw_mfree(passoc_req, assoc_req_len);
  19072. + }
  19073. +#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  19074. +#endif //CONFIG_IOCTL_CFG80211
  19075. +
  19076. + //bss_cap_update_on_sta_join(adapter, psta);
  19077. + //sta_info_update(adapter, psta);
  19078. + ap_sta_info_defer_update(adapter, psta);
  19079. + }
  19080. +
  19081. + goto exit;
  19082. + }
  19083. +#endif
  19084. +
  19085. + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);
  19086. + if( psta != NULL)
  19087. + {
  19088. + //the sta have been in sta_info_queue => do nothing
  19089. +
  19090. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n"));
  19091. +
  19092. + goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY)
  19093. + }
  19094. +
  19095. + psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr);
  19096. + if (psta == NULL) {
  19097. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n"));
  19098. + goto exit;
  19099. + }
  19100. +
  19101. + //to do : init sta_info variable
  19102. + psta->qos_option = 0;
  19103. + psta->mac_id = (uint)pstassoc->cam_id;
  19104. + //psta->aid = (uint)pstassoc->cam_id;
  19105. +
  19106. + if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)
  19107. + psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm;
  19108. +
  19109. + psta->ieee8021x_blocked = _FALSE;
  19110. +
  19111. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  19112. +
  19113. + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) ||
  19114. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )
  19115. + {
  19116. + if(adapter->stapriv.asoc_sta_count== 2)
  19117. + {
  19118. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19119. + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
  19120. + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE;
  19121. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19122. + // a sta + bc/mc_stainfo (not Ibss_stainfo)
  19123. + rtw_indicate_connect(adapter);
  19124. + }
  19125. + }
  19126. +
  19127. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  19128. +
  19129. +
  19130. + mlmeext_sta_add_event_callback(adapter, psta);
  19131. +
  19132. +#ifdef CONFIG_RTL8711
  19133. + //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta
  19134. + rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE);
  19135. +#endif
  19136. +
  19137. +exit:
  19138. +
  19139. +_func_exit_;
  19140. +
  19141. +}
  19142. +
  19143. +void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf)
  19144. +{
  19145. + _irqL irqL,irqL2;
  19146. + struct sta_info *psta;
  19147. + struct wlan_network* pwlan = NULL;
  19148. + WLAN_BSSID_EX *pdev_network=NULL;
  19149. + u8* pibss = NULL;
  19150. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  19151. + struct stadel_event *pstadel = (struct stadel_event*)pbuf;
  19152. + struct sta_priv *pstapriv = &adapter->stapriv;
  19153. + struct wlan_network *tgt_network = &(pmlmepriv->cur_network);
  19154. +
  19155. +_func_enter_;
  19156. +
  19157. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE))
  19158. + {
  19159. +#ifdef CONFIG_IOCTL_CFG80211
  19160. +#ifdef COMPAT_KERNEL_RELEASE
  19161. +
  19162. +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  19163. + rtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16*)pstadel->rsvd);
  19164. +#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  19165. +#endif //CONFIG_IOCTL_CFG80211
  19166. +
  19167. + return;
  19168. + }
  19169. +
  19170. +
  19171. + mlmeext_sta_del_event_callback(adapter);
  19172. +
  19173. + _enter_critical_bh(&pmlmepriv->lock, &irqL2);
  19174. +
  19175. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) )
  19176. + {
  19177. + #ifdef CONFIG_LAYER2_ROAMING
  19178. + if (rtw_to_roaming(adapter) > 0)
  19179. + pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */
  19180. + else if (rtw_to_roaming(adapter) == 0)
  19181. + rtw_set_roaming(adapter, adapter->registrypriv.max_roaming_times);
  19182. +#ifdef CONFIG_INTEL_WIDI
  19183. + if(adapter->mlmepriv.widi_state != INTEL_WIDI_STATE_CONNECTED)
  19184. +#endif // CONFIG_INTEL_WIDI
  19185. + if(*((unsigned short *)(pstadel->rsvd)) != WLAN_REASON_EXPIRATION_CHK)
  19186. + rtw_set_roaming(adapter, 0); /* don't roam */
  19187. + #endif
  19188. +
  19189. + rtw_free_uc_swdec_pending_queue(adapter);
  19190. +
  19191. + rtw_free_assoc_resources(adapter, 1);
  19192. + rtw_indicate_disconnect(adapter);
  19193. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19194. + // remove the network entry in scanned_queue
  19195. + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
  19196. + if (pwlan) {
  19197. + pwlan->fixed = _FALSE;
  19198. + rtw_free_network_nolock(pmlmepriv, pwlan);
  19199. + }
  19200. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19201. +
  19202. + _rtw_roaming(adapter, tgt_network);
  19203. +
  19204. +#ifdef CONFIG_INTEL_WIDI
  19205. + if (!rtw_to_roaming(adapter))
  19206. + process_intel_widi_disconnect(adapter, 1);
  19207. +#endif // CONFIG_INTEL_WIDI
  19208. + }
  19209. +
  19210. + if ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) ||
  19211. + check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))
  19212. + {
  19213. + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr);
  19214. +
  19215. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  19216. + rtw_free_stainfo(adapter, psta);
  19217. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  19218. +
  19219. + if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo)
  19220. + {
  19221. + //rtw_indicate_disconnect(adapter);//removed@20091105
  19222. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19223. + //free old ibss network
  19224. + //pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr);
  19225. + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
  19226. + if(pwlan)
  19227. + {
  19228. + pwlan->fixed = _FALSE;
  19229. + rtw_free_network_nolock(pmlmepriv, pwlan);
  19230. + }
  19231. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19232. + //re-create ibss
  19233. + pdev_network = &(adapter->registrypriv.dev_network);
  19234. + pibss = adapter->registrypriv.dev_network.MacAddress;
  19235. +
  19236. + _rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network));
  19237. +
  19238. + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));
  19239. + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));
  19240. +
  19241. + rtw_update_registrypriv_dev_network(adapter);
  19242. +
  19243. + rtw_generate_random_ibss(pibss);
  19244. +
  19245. + if(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))
  19246. + {
  19247. + set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
  19248. + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE);
  19249. + }
  19250. +
  19251. + if(rtw_createbss_cmd(adapter)!=_SUCCESS)
  19252. + {
  19253. +
  19254. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>stadel_event_callback: rtw_createbss_cmd status FAIL*** \n "));
  19255. +
  19256. + }
  19257. +
  19258. +
  19259. + }
  19260. +
  19261. + }
  19262. +
  19263. + _exit_critical_bh(&pmlmepriv->lock, &irqL2);
  19264. +
  19265. +_func_exit_;
  19266. +
  19267. +}
  19268. +
  19269. +
  19270. +void rtw_cpwm_event_callback(PADAPTER padapter, u8 *pbuf)
  19271. +{
  19272. +#ifdef CONFIG_LPS_LCLK
  19273. + struct reportpwrstate_parm *preportpwrstate;
  19274. +#endif
  19275. +
  19276. +_func_enter_;
  19277. +
  19278. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_cpwm_event_callback !!!\n"));
  19279. +#ifdef CONFIG_LPS_LCLK
  19280. + preportpwrstate = (struct reportpwrstate_parm*)pbuf;
  19281. + preportpwrstate->state |= (u8)(padapter->pwrctrlpriv.cpwm_tog + 0x80);
  19282. + cpwm_int_hdl(padapter, preportpwrstate);
  19283. +#endif
  19284. +
  19285. +_func_exit_;
  19286. +
  19287. +}
  19288. +
  19289. +/*
  19290. +* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss
  19291. +* @adapter: pointer to _adapter structure
  19292. +*/
  19293. +void _rtw_join_timeout_handler (_adapter *adapter)
  19294. +{
  19295. + _irqL irqL;
  19296. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  19297. +#ifdef CONFIG_LAYER2_ROAMING
  19298. + int do_join_r;
  19299. +#endif //CONFIG_LAYER2_ROAMING
  19300. +
  19301. +#if 0
  19302. + if (adapter->bDriverStopped == _TRUE){
  19303. + _rtw_up_sema(&pmlmepriv->assoc_terminate);
  19304. + return;
  19305. + }
  19306. +#endif
  19307. +
  19308. +_func_enter_;
  19309. +#ifdef PLATFORM_FREEBSD
  19310. + rtw_mtx_lock(NULL);
  19311. + if (callout_pending(&adapter->mlmepriv.assoc_timer.callout)) {
  19312. + /* callout was reset */
  19313. + //mtx_unlock(&sc->sc_mtx);
  19314. + rtw_mtx_unlock(NULL);
  19315. + return;
  19316. + }
  19317. + if (!callout_active(&adapter->mlmepriv.assoc_timer.callout)) {
  19318. + /* callout was stopped */
  19319. + //mtx_unlock(&sc->sc_mtx);
  19320. + rtw_mtx_unlock(NULL);
  19321. + return;
  19322. + }
  19323. + callout_deactivate(&adapter->mlmepriv.assoc_timer.callout);
  19324. +
  19325. +
  19326. +#endif
  19327. +
  19328. + DBG_871X("%s, fw_state=%x\n", __FUNCTION__, get_fwstate(pmlmepriv));
  19329. +
  19330. + if(adapter->bDriverStopped ||adapter->bSurpriseRemoved)
  19331. + return;
  19332. +
  19333. +
  19334. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  19335. +
  19336. + #ifdef CONFIG_LAYER2_ROAMING
  19337. + if (rtw_to_roaming(adapter) > 0) { /* join timeout caused by roaming */
  19338. + while(1) {
  19339. + pmlmepriv->to_roaming--;
  19340. + if (rtw_to_roaming(adapter) != 0) { /* try another */
  19341. + DBG_871X("%s try another roaming\n", __FUNCTION__);
  19342. + if( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) {
  19343. + DBG_871X("%s roaming do_join return %d\n", __FUNCTION__ ,do_join_r);
  19344. + continue;
  19345. + }
  19346. + break;
  19347. + } else {
  19348. +#ifdef CONFIG_INTEL_WIDI
  19349. + if(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)
  19350. + {
  19351. + _rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);
  19352. + intel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL);
  19353. + DBG_871X("change to widi listen\n");
  19354. + }
  19355. +#endif // CONFIG_INTEL_WIDI
  19356. + DBG_871X("%s We've try roaming but fail\n", __FUNCTION__);
  19357. + rtw_indicate_disconnect(adapter);
  19358. + break;
  19359. + }
  19360. + }
  19361. +
  19362. + } else
  19363. + #endif
  19364. + {
  19365. + rtw_indicate_disconnect(adapter);
  19366. + free_scanqueue(pmlmepriv);//???
  19367. +
  19368. +#ifdef CONFIG_IOCTL_CFG80211
  19369. + //indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED
  19370. + rtw_cfg80211_indicate_disconnect(adapter);
  19371. +#endif //CONFIG_IOCTL_CFG80211
  19372. +
  19373. + }
  19374. +
  19375. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  19376. +
  19377. +
  19378. +#ifdef CONFIG_DRVEXT_MODULE_WSC
  19379. + drvext_assoc_fail_indicate(&adapter->drvextpriv);
  19380. +#endif
  19381. +#ifdef PLATFORM_FREEBSD
  19382. + rtw_mtx_unlock(NULL);
  19383. +#endif
  19384. +
  19385. +_func_exit_;
  19386. +
  19387. +}
  19388. +
  19389. +/*
  19390. +* rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey
  19391. +* @adapter: pointer to _adapter structure
  19392. +*/
  19393. +void rtw_scan_timeout_handler (_adapter *adapter)
  19394. +{
  19395. + _irqL irqL;
  19396. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  19397. +
  19398. + DBG_871X(FUNC_ADPT_FMT" fw_state=%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv));
  19399. +
  19400. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  19401. +
  19402. + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
  19403. +
  19404. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  19405. +
  19406. + rtw_indicate_scan_done(adapter, _TRUE);
  19407. +
  19408. +}
  19409. +
  19410. +static void rtw_auto_scan_handler(_adapter *padapter)
  19411. +{
  19412. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  19413. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  19414. +
  19415. + //auto site survey per 60sec
  19416. + if(pmlmepriv->scan_interval >0)
  19417. + {
  19418. + pmlmepriv->scan_interval--;
  19419. + if(pmlmepriv->scan_interval==0)
  19420. + {
  19421. +/*
  19422. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  19423. + {
  19424. + DBG_871X("exit %s when _FW_UNDER_SURVEY|_FW_UNDER_LINKING -> \n", __FUNCTION__);
  19425. + return;
  19426. + }
  19427. +
  19428. + if(pmlmepriv->sitesurveyctrl.traffic_busy == _TRUE)
  19429. + {
  19430. + DBG_871X("%s exit cause traffic_busy(%x)\n",__FUNCTION__, pmlmepriv->sitesurveyctrl.traffic_busy);
  19431. + return;
  19432. + }
  19433. +*/
  19434. +
  19435. +#ifdef CONFIG_CONCURRENT_MODE
  19436. + if (rtw_buddy_adapter_up(padapter))
  19437. + {
  19438. + if ((check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) ||
  19439. + (padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE))
  19440. + {
  19441. + DBG_871X("%s, but buddy_intf is under scanning or linking or BusyTraffic\n", __FUNCTION__);
  19442. + return;
  19443. + }
  19444. + }
  19445. +#endif
  19446. +
  19447. + DBG_871X("%s\n", __FUNCTION__);
  19448. +
  19449. + rtw_set_802_11_bssid_list_scan(padapter, NULL, 0);
  19450. +
  19451. + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec
  19452. +
  19453. + }
  19454. +
  19455. + }
  19456. +
  19457. +}
  19458. +
  19459. +void rtw_dynamic_check_timer_handlder(_adapter *adapter)
  19460. +{
  19461. +#ifdef CONFIG_AP_MODE
  19462. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  19463. +#endif //CONFIG_AP_MODE
  19464. + struct registry_priv *pregistrypriv = &adapter->registrypriv;
  19465. +#ifdef CONFIG_CONCURRENT_MODE
  19466. + PADAPTER pbuddy_adapter = adapter->pbuddy_adapter;
  19467. +#endif
  19468. +
  19469. + if(!adapter)
  19470. + return;
  19471. +
  19472. + if(adapter->hw_init_completed == _FALSE)
  19473. + return;
  19474. +
  19475. + if ((adapter->bDriverStopped == _TRUE)||(adapter->bSurpriseRemoved== _TRUE))
  19476. + return;
  19477. +
  19478. +
  19479. +#ifdef CONFIG_CONCURRENT_MODE
  19480. + if(pbuddy_adapter)
  19481. + {
  19482. + if(adapter->net_closed == _TRUE && pbuddy_adapter->net_closed == _TRUE)
  19483. + {
  19484. + return;
  19485. + }
  19486. + }
  19487. + else
  19488. +#endif //CONFIG_CONCURRENT_MODE
  19489. + if(adapter->net_closed == _TRUE)
  19490. + {
  19491. + return;
  19492. + }
  19493. +
  19494. + rtw_dynamic_chk_wk_cmd(adapter);
  19495. +
  19496. + if(pregistrypriv->wifi_spec==1)
  19497. + {
  19498. +#ifdef CONFIG_P2P
  19499. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  19500. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  19501. +#endif
  19502. + {
  19503. + //auto site survey
  19504. + rtw_auto_scan_handler(adapter);
  19505. + }
  19506. + }
  19507. +
  19508. +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  19509. +#ifdef CONFIG_AP_MODE
  19510. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  19511. + {
  19512. + expire_timeout_chk(adapter);
  19513. + }
  19514. +#endif
  19515. +#endif //!CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  19516. +
  19517. +#ifdef CONFIG_BR_EXT
  19518. +
  19519. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  19520. + rcu_read_lock();
  19521. +#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  19522. +
  19523. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  19524. + if( adapter->pnetdev->br_port
  19525. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  19526. + if( rcu_dereference(adapter->pnetdev->rx_handler_data)
  19527. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  19528. + && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )
  19529. + {
  19530. + // expire NAT2.5 entry
  19531. + void nat25_db_expire(_adapter *priv);
  19532. + nat25_db_expire(adapter);
  19533. +
  19534. + if (adapter->pppoe_connection_in_progress > 0) {
  19535. + adapter->pppoe_connection_in_progress--;
  19536. + }
  19537. +
  19538. + // due to rtw_dynamic_check_timer_handlder() is called every 2 seconds
  19539. + if (adapter->pppoe_connection_in_progress > 0) {
  19540. + adapter->pppoe_connection_in_progress--;
  19541. + }
  19542. + }
  19543. +
  19544. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  19545. + rcu_read_unlock();
  19546. +#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  19547. +
  19548. +#endif // CONFIG_BR_EXT
  19549. +
  19550. +}
  19551. +
  19552. +
  19553. +#ifdef CONFIG_SET_SCAN_DENY_TIMER
  19554. +inline bool rtw_is_scan_deny(_adapter *adapter)
  19555. +{
  19556. + struct mlme_priv *mlmepriv = &adapter->mlmepriv;
  19557. + return (ATOMIC_READ(&mlmepriv->set_scan_deny) != 0) ? _TRUE : _FALSE;
  19558. +}
  19559. +
  19560. +inline void rtw_clear_scan_deny(_adapter *adapter)
  19561. +{
  19562. + struct mlme_priv *mlmepriv = &adapter->mlmepriv;
  19563. + ATOMIC_SET(&mlmepriv->set_scan_deny, 0);
  19564. + if (0)
  19565. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
  19566. +}
  19567. +
  19568. +void rtw_set_scan_deny_timer_hdl(_adapter *adapter)
  19569. +{
  19570. + rtw_clear_scan_deny(adapter);
  19571. +}
  19572. +
  19573. +void rtw_set_scan_deny(_adapter *adapter, u32 ms)
  19574. +{
  19575. + struct mlme_priv *mlmepriv = &adapter->mlmepriv;
  19576. +#ifdef CONFIG_CONCURRENT_MODE
  19577. + struct mlme_priv *b_mlmepriv;
  19578. +#endif
  19579. +
  19580. + if (0)
  19581. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter));
  19582. + ATOMIC_SET(&mlmepriv->set_scan_deny, 1);
  19583. + _set_timer(&mlmepriv->set_scan_deny_timer, ms);
  19584. +
  19585. +#ifdef CONFIG_CONCURRENT_MODE
  19586. + if (!adapter->pbuddy_adapter)
  19587. + return;
  19588. +
  19589. + if (0)
  19590. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter->pbuddy_adapter));
  19591. + b_mlmepriv = &adapter->pbuddy_adapter->mlmepriv;
  19592. + ATOMIC_SET(&b_mlmepriv->set_scan_deny, 1);
  19593. + _set_timer(&b_mlmepriv->set_scan_deny_timer, ms);
  19594. +#endif
  19595. +
  19596. +}
  19597. +#endif
  19598. +
  19599. +#if defined(IEEE80211_SCAN_RESULT_EXPIRE)
  19600. +#define RTW_SCAN_RESULT_EXPIRE IEEE80211_SCAN_RESULT_EXPIRE/HZ*1000 -1000 //3000 -1000
  19601. +#else
  19602. +#define RTW_SCAN_RESULT_EXPIRE 2000
  19603. +#endif
  19604. +
  19605. +#ifndef PLATFORM_FREEBSD
  19606. +/*
  19607. +* Select a new join candidate from the original @param candidate and @param competitor
  19608. +* @return _TRUE: candidate is updated
  19609. +* @return _FALSE: candidate is not updated
  19610. +*/
  19611. +static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
  19612. + , struct wlan_network **candidate, struct wlan_network *competitor)
  19613. +{
  19614. + int updated = _FALSE;
  19615. + _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv);
  19616. +
  19617. +
  19618. + //check bssid, if needed
  19619. + if(pmlmepriv->assoc_by_bssid==_TRUE) {
  19620. + if(_rtw_memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN) ==_FALSE)
  19621. + goto exit;
  19622. + }
  19623. +
  19624. + //check ssid, if needed
  19625. + if(pmlmepriv->assoc_ssid.Ssid && pmlmepriv->assoc_ssid.SsidLength) {
  19626. + if( competitor->network.Ssid.SsidLength != pmlmepriv->assoc_ssid.SsidLength
  19627. + || _rtw_memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength) == _FALSE
  19628. + )
  19629. + goto exit;
  19630. + }
  19631. +
  19632. + if(rtw_is_desired_network(adapter, competitor) == _FALSE)
  19633. + goto exit;
  19634. +
  19635. +#ifdef CONFIG_LAYER2_ROAMING
  19636. + if(rtw_to_roaming(adapter) > 0) {
  19637. + if( rtw_get_passing_time_ms((u32)competitor->last_scanned) >= RTW_SCAN_RESULT_EXPIRE
  19638. + || is_same_ess(&competitor->network, &pmlmepriv->cur_network.network) == _FALSE
  19639. + )
  19640. + goto exit;
  19641. + }
  19642. +#endif
  19643. +
  19644. + if(*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi )
  19645. + {
  19646. + *candidate = competitor;
  19647. + updated = _TRUE;
  19648. + }
  19649. +
  19650. +#if 0
  19651. + if(pmlmepriv->assoc_by_bssid==_TRUE) { // associate with bssid
  19652. + if( (*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi )
  19653. + && _rtw_memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE
  19654. + ) {
  19655. + *candidate = competitor;
  19656. + updated = _TRUE;
  19657. + }
  19658. + } else if (pmlmepriv->assoc_ssid.SsidLength == 0 ) { // associate with ssid, but ssidlength is 0
  19659. + if( (*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi ) ) {
  19660. + *candidate = competitor;
  19661. + updated = _TRUE;
  19662. + }
  19663. + } else
  19664. +#ifdef CONFIG_LAYER2_ROAMING
  19665. + if(rtw_to_roaming(adapter)) { // roaming
  19666. + if( (*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi )
  19667. + && is_same_ess(&competitor->network, &pmlmepriv->cur_network.network)
  19668. + //&&(!is_same_network(&competitor->network, &pmlmepriv->cur_network.network))
  19669. + && rtw_get_passing_time_ms((u32)competitor->last_scanned) < RTW_SCAN_RESULT_EXPIRE
  19670. + && rtw_is_desired_network(adapter, competitor)
  19671. + ) {
  19672. + *candidate = competitor;
  19673. + updated = _TRUE;
  19674. + }
  19675. +
  19676. + } else
  19677. +#endif
  19678. + { // associate with ssid
  19679. + if( (*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi )
  19680. + && (competitor->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength)
  19681. + &&((_rtw_memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE)
  19682. + && rtw_is_desired_network(adapter, competitor)
  19683. + ) {
  19684. + *candidate = competitor;
  19685. + updated = _TRUE;
  19686. + }
  19687. + }
  19688. +#endif
  19689. +
  19690. + if(updated){
  19691. + DBG_871X("[by_bssid:%u][assoc_ssid:%s]"
  19692. + #ifdef CONFIG_LAYER2_ROAMING
  19693. + "[to_roaming:%u] "
  19694. + #endif
  19695. + "new candidate: %s("MAC_FMT", ch%u) rssi:%d\n",
  19696. + pmlmepriv->assoc_by_bssid,
  19697. + pmlmepriv->assoc_ssid.Ssid,
  19698. + #ifdef CONFIG_LAYER2_ROAMING
  19699. + rtw_to_roaming(adapter),
  19700. + #endif
  19701. + (*candidate)->network.Ssid.Ssid,
  19702. + MAC_ARG((*candidate)->network.MacAddress),
  19703. + (*candidate)->network.Configuration.DSConfig,
  19704. + (int)(*candidate)->network.Rssi
  19705. + );
  19706. + }
  19707. +
  19708. +exit:
  19709. + return updated;
  19710. +}
  19711. +
  19712. +/*
  19713. +Calling context:
  19714. +The caller of the sub-routine will be in critical section...
  19715. +
  19716. +The caller must hold the following spinlock
  19717. +
  19718. +pmlmepriv->lock
  19719. +
  19720. +
  19721. +*/
  19722. +
  19723. +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv )
  19724. +{
  19725. + _irqL irqL;
  19726. + int ret;
  19727. + _list *phead;
  19728. + _adapter *adapter;
  19729. + _queue *queue = &(pmlmepriv->scanned_queue);
  19730. + struct wlan_network *pnetwork = NULL;
  19731. + struct wlan_network *candidate = NULL;
  19732. + u8 bSupportAntDiv = _FALSE;
  19733. +
  19734. +_func_enter_;
  19735. +
  19736. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19737. + phead = get_list_head(queue);
  19738. + adapter = (_adapter *)pmlmepriv->nic_hdl;
  19739. +
  19740. + pmlmepriv->pscanned = get_next( phead );
  19741. +
  19742. + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) {
  19743. +
  19744. + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);
  19745. + if(pnetwork==NULL){
  19746. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__));
  19747. + ret = _FAIL;
  19748. + goto exit;
  19749. + }
  19750. +
  19751. + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
  19752. +
  19753. + #if 0
  19754. + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid);
  19755. + #endif
  19756. +
  19757. + rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork);
  19758. +
  19759. + }
  19760. +
  19761. + if(candidate == NULL) {
  19762. + DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__);
  19763. + ret = _FAIL;
  19764. + goto exit;
  19765. + } else {
  19766. + DBG_871X("%s: candidate: %s("MAC_FMT", ch:%u)\n", __FUNCTION__,
  19767. + candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress),
  19768. + candidate->network.Configuration.DSConfig);
  19769. + }
  19770. +
  19771. +
  19772. + // check for situation of _FW_LINKED
  19773. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  19774. + {
  19775. + DBG_871X("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__);
  19776. +
  19777. + #if 0 // for WPA/WPA2 authentication, wpa_supplicant will expect authentication from AP, it is needed to reconnect AP...
  19778. + if(is_same_network(&pmlmepriv->cur_network.network, &candidate->network))
  19779. + {
  19780. + DBG_871X("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__);
  19781. +
  19782. + rtw_indicate_connect(adapter);//rtw_indicate_connect again
  19783. +
  19784. + ret = 2;
  19785. + goto exit;
  19786. + }
  19787. + else
  19788. + #endif
  19789. + {
  19790. + rtw_disassoc_cmd(adapter, 0, _TRUE);
  19791. + rtw_indicate_disconnect(adapter);
  19792. + rtw_free_assoc_resources(adapter, 0);
  19793. + }
  19794. + }
  19795. +
  19796. + #ifdef CONFIG_ANTENNA_DIVERSITY
  19797. + rtw_hal_get_def_var(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv));
  19798. + if(_TRUE == bSupportAntDiv)
  19799. + {
  19800. + u8 CurrentAntenna;
  19801. + rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna));
  19802. + DBG_871X("#### Opt_Ant_(%s) , cur_Ant(%s)\n",
  19803. + (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B",
  19804. + (2==CurrentAntenna)?"A":"B"
  19805. + );
  19806. + }
  19807. + #endif
  19808. + set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  19809. + ret = rtw_joinbss_cmd(adapter, candidate);
  19810. +
  19811. +exit:
  19812. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19813. +
  19814. +_func_exit_;
  19815. +
  19816. + return ret;
  19817. +}
  19818. +#else
  19819. +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv )
  19820. +{
  19821. + _irqL irqL;
  19822. + _list *phead;
  19823. +#ifdef CONFIG_ANTENNA_DIVERSITY
  19824. + u8 CurrentAntenna;
  19825. +#endif
  19826. + unsigned char *dst_ssid, *src_ssid;
  19827. + _adapter *adapter;
  19828. + _queue *queue = &(pmlmepriv->scanned_queue);
  19829. + struct wlan_network *pnetwork = NULL;
  19830. + struct wlan_network *pnetwork_max_rssi = NULL;
  19831. + #ifdef CONFIG_LAYER2_ROAMING
  19832. + struct wlan_network * roaming_candidate=NULL;
  19833. + u32 cur_time=rtw_get_current_time();
  19834. + #endif
  19835. +
  19836. +_func_enter_;
  19837. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19838. + phead = get_list_head(queue);
  19839. + adapter = (_adapter *)pmlmepriv->nic_hdl;
  19840. +
  19841. + pmlmepriv->pscanned = get_next( phead );
  19842. +
  19843. + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) {
  19844. +
  19845. + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);
  19846. + if(pnetwork==NULL){
  19847. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(2)rtw_select_and_join_from_scanned_queue return _FAIL:(pnetwork==NULL)\n"));
  19848. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19849. + return _FAIL;
  19850. + }
  19851. +
  19852. + dst_ssid = pnetwork->network.Ssid.Ssid;
  19853. + src_ssid = pmlmepriv->assoc_ssid.Ssid;
  19854. +
  19855. + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
  19856. +
  19857. + #if 0
  19858. + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid);
  19859. + #endif
  19860. +
  19861. + if(pmlmepriv->assoc_by_bssid==_TRUE)
  19862. + {
  19863. + if(_rtw_memcmp(pnetwork->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE)
  19864. + {
  19865. + //remove the condition @ 20081125
  19866. + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)||
  19867. + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode)
  19868. + // goto ask_for_joinbss;
  19869. +
  19870. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  19871. + {
  19872. + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network))
  19873. + {
  19874. + //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n");
  19875. +
  19876. + rtw_indicate_connect(adapter);//rtw_indicate_connect again
  19877. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19878. + return 2;
  19879. + }
  19880. + else
  19881. + {
  19882. + rtw_disassoc_cmd(adapter, 0, _TRUE);
  19883. + rtw_indicate_disconnect(adapter);
  19884. + rtw_free_assoc_resources(adapter, 0);
  19885. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19886. + goto ask_for_joinbss;
  19887. +
  19888. + }
  19889. + }
  19890. + else
  19891. + {
  19892. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19893. + goto ask_for_joinbss;
  19894. + }
  19895. +
  19896. + }
  19897. +
  19898. + } else if (pmlmepriv->assoc_ssid.SsidLength == 0) {
  19899. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19900. + goto ask_for_joinbss;//anyway, join first selected(dequeued) pnetwork if ssid_len=0
  19901. +
  19902. + #ifdef CONFIG_LAYER2_ROAMING
  19903. + } else if (rtw_to_roaming(adapter) > 0) {
  19904. +
  19905. + if( (roaming_candidate == NULL ||roaming_candidate->network.Rssi<pnetwork->network.Rssi )
  19906. + && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network)
  19907. + //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network))
  19908. + && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000
  19909. + ) {
  19910. + roaming_candidate = pnetwork;
  19911. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
  19912. + DBG_871X
  19913. + ("roaming_candidate???: %s("MAC_FMT")\n",
  19914. + roaming_candidate->network.Ssid.Ssid, MAC_ARG(roaming_candidate->network.MacAddress) )
  19915. + //)
  19916. + ;
  19917. + }
  19918. + continue;
  19919. + #endif
  19920. +
  19921. + } else if ( (pnetwork->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength)
  19922. + &&((_rtw_memcmp(dst_ssid, src_ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE)
  19923. + )
  19924. + {
  19925. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("dst_ssid=%s, src_ssid=%s \n", dst_ssid, src_ssid));
  19926. +#ifdef CONFIG_ANTENNA_DIVERSITY
  19927. + rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna));
  19928. + DBG_871X("#### dst_ssid=(%s) Opt_Ant_(%s) , cur_Ant(%s)\n", dst_ssid,
  19929. + (2==pnetwork->network.PhyInfo.Optimum_antenna)?"A":"B",
  19930. + (2==CurrentAntenna)?"A":"B");
  19931. +#endif
  19932. + //remove the condition @ 20081125
  19933. + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)||
  19934. + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode)
  19935. + //{
  19936. + // _rtw_memcpy(pmlmepriv->assoc_bssid, pnetwork->network.MacAddress, ETH_ALEN);
  19937. + // goto ask_for_joinbss;
  19938. + //}
  19939. +
  19940. + if(pmlmepriv->assoc_by_rssi==_TRUE)//if the ssid is the same, select the bss which has the max rssi
  19941. + {
  19942. + if( NULL==pnetwork_max_rssi|| pnetwork->network.Rssi > pnetwork_max_rssi->network.Rssi)
  19943. + pnetwork_max_rssi = pnetwork;
  19944. + }
  19945. + else if(rtw_is_desired_network(adapter, pnetwork) == _TRUE)
  19946. + {
  19947. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  19948. + {
  19949. +#if 0
  19950. + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network))
  19951. + {
  19952. + DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n");
  19953. +
  19954. + rtw_indicate_connect(adapter);//rtw_indicate_connect again
  19955. +
  19956. + return 2;
  19957. + }
  19958. + else
  19959. +#endif
  19960. + {
  19961. + rtw_disassoc_cmd(adapter, 0, _TRUE);
  19962. + //rtw_indicate_disconnect(adapter);//
  19963. + rtw_free_assoc_resources(adapter, 0);
  19964. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19965. + goto ask_for_joinbss;
  19966. + }
  19967. + }
  19968. + else
  19969. + {
  19970. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19971. + goto ask_for_joinbss;
  19972. + }
  19973. +
  19974. + }
  19975. +
  19976. +
  19977. + }
  19978. +
  19979. + }
  19980. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  19981. + #ifdef CONFIG_LAYER2_ROAMING
  19982. + if(rtw_to_roaming(adapter) > 0 && roaming_candidate ){
  19983. + pnetwork=roaming_candidate;
  19984. + DBG_871X("select_and_join_from_scanned_queue: roaming_candidate: %s("MAC_FMT")\n",
  19985. + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress));
  19986. + goto ask_for_joinbss;
  19987. + }
  19988. + #endif
  19989. +
  19990. + if((pmlmepriv->assoc_by_rssi==_TRUE) && (pnetwork_max_rssi!=NULL))
  19991. + {
  19992. + pnetwork = pnetwork_max_rssi;
  19993. + DBG_871X("select_and_join_from_scanned_queue: pnetwork_max_rssi: %s("MAC_FMT")\n",
  19994. + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress));
  19995. + goto ask_for_joinbss;
  19996. + }
  19997. +
  19998. + DBG_871X("(1)rtw_select_and_join_from_scanned_queue return _FAIL\n");
  19999. +
  20000. +_func_exit_;
  20001. +
  20002. + return _FAIL;
  20003. +
  20004. +ask_for_joinbss:
  20005. +
  20006. +_func_exit_;
  20007. +
  20008. + return rtw_joinbss_cmd(adapter, pnetwork);
  20009. +
  20010. +}
  20011. +#endif //PLATFORM_FREEBSD
  20012. +
  20013. +
  20014. +sint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv)
  20015. +{
  20016. + struct cmd_obj* pcmd;
  20017. + struct setauth_parm *psetauthparm;
  20018. + struct cmd_priv *pcmdpriv=&(adapter->cmdpriv);
  20019. + sint res=_SUCCESS;
  20020. +
  20021. +_func_enter_;
  20022. +
  20023. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  20024. + if(pcmd==NULL){
  20025. + res= _FAIL; //try again
  20026. + goto exit;
  20027. + }
  20028. +
  20029. + psetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm));
  20030. + if(psetauthparm==NULL){
  20031. + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
  20032. + res= _FAIL;
  20033. + goto exit;
  20034. + }
  20035. +
  20036. + _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm));
  20037. + psetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm;
  20038. +
  20039. + pcmd->cmdcode = _SetAuth_CMD_;
  20040. + pcmd->parmbuf = (unsigned char *)psetauthparm;
  20041. + pcmd->cmdsz = (sizeof(struct setauth_parm));
  20042. + pcmd->rsp = NULL;
  20043. + pcmd->rspsz = 0;
  20044. +
  20045. +
  20046. + _rtw_init_listhead(&pcmd->list);
  20047. +
  20048. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm));
  20049. +
  20050. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  20051. +
  20052. +exit:
  20053. +
  20054. +_func_exit_;
  20055. +
  20056. + return res;
  20057. +
  20058. +}
  20059. +
  20060. +
  20061. +sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx)
  20062. +{
  20063. + u8 keylen;
  20064. + struct cmd_obj *pcmd;
  20065. + struct setkey_parm *psetkeyparm;
  20066. + struct cmd_priv *pcmdpriv = &(adapter->cmdpriv);
  20067. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  20068. + sint res=_SUCCESS;
  20069. +
  20070. +_func_enter_;
  20071. +
  20072. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  20073. + if(pcmd==NULL){
  20074. + res= _FAIL; //try again
  20075. + goto exit;
  20076. + }
  20077. + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));
  20078. + if(psetkeyparm==NULL){
  20079. + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
  20080. + res= _FAIL;
  20081. + goto exit;
  20082. + }
  20083. +
  20084. + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));
  20085. +
  20086. + if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){
  20087. + psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy;
  20088. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \n", psetkeyparm->algorithm));
  20089. + }
  20090. + else{
  20091. + psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm;
  20092. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \n", psetkeyparm->algorithm));
  20093. +
  20094. + }
  20095. + psetkeyparm->keyid = (u8)keyid;//0~3
  20096. + psetkeyparm->set_tx = set_tx;
  20097. + if (is_wep_enc(psetkeyparm->algorithm))
  20098. + psecuritypriv->key_mask |= BIT(psetkeyparm->keyid);
  20099. +
  20100. + DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid, psecuritypriv->key_mask);
  20101. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid));
  20102. +
  20103. + switch(psetkeyparm->algorithm){
  20104. +
  20105. + case _WEP40_:
  20106. + keylen=5;
  20107. + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);
  20108. + break;
  20109. + case _WEP104_:
  20110. + keylen=13;
  20111. + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);
  20112. + break;
  20113. + case _TKIP_:
  20114. + keylen=16;
  20115. + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen);
  20116. + psetkeyparm->grpkey=1;
  20117. + break;
  20118. + case _AES_:
  20119. + keylen=16;
  20120. + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen);
  20121. + psetkeyparm->grpkey=1;
  20122. + break;
  20123. + default:
  20124. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm));
  20125. + res= _FAIL;
  20126. + goto exit;
  20127. + }
  20128. +
  20129. +
  20130. + pcmd->cmdcode = _SetKey_CMD_;
  20131. + pcmd->parmbuf = (u8 *)psetkeyparm;
  20132. + pcmd->cmdsz = (sizeof(struct setkey_parm));
  20133. + pcmd->rsp = NULL;
  20134. + pcmd->rspsz = 0;
  20135. +
  20136. +
  20137. + _rtw_init_listhead(&pcmd->list);
  20138. +
  20139. + //_rtw_init_sema(&(pcmd->cmd_sem), 0);
  20140. +
  20141. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  20142. +
  20143. +exit:
  20144. +_func_exit_;
  20145. + return res;
  20146. +
  20147. +}
  20148. +
  20149. +
  20150. +//adjust IEs for rtw_joinbss_cmd in WMM
  20151. +int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len)
  20152. +{
  20153. + unsigned int ielength=0;
  20154. + unsigned int i, j;
  20155. +
  20156. + i = 12; //after the fixed IE
  20157. + while(i<in_len)
  20158. + {
  20159. + ielength = initial_out_len;
  20160. +
  20161. + if(in_ie[i] == 0xDD && in_ie[i+2] == 0x00 && in_ie[i+3] == 0x50 && in_ie[i+4] == 0xF2 && in_ie[i+5] == 0x02 && i+5 < in_len) //WMM element ID and OUI
  20162. + {
  20163. +
  20164. + //Append WMM IE to the last index of out_ie
  20165. + /*
  20166. + for(j=i; j< i+(in_ie[i+1]+2); j++)
  20167. + {
  20168. + out_ie[ielength] = in_ie[j];
  20169. + ielength++;
  20170. + }
  20171. + out_ie[initial_out_len+8] = 0x00; //force the QoS Info Field to be zero
  20172. + */
  20173. +
  20174. + for ( j = i; j < i + 9; j++ )
  20175. + {
  20176. + out_ie[ ielength] = in_ie[ j ];
  20177. + ielength++;
  20178. + }
  20179. + out_ie[ initial_out_len + 1 ] = 0x07;
  20180. + out_ie[ initial_out_len + 6 ] = 0x00;
  20181. + out_ie[ initial_out_len + 8 ] = 0x00;
  20182. +
  20183. + break;
  20184. + }
  20185. +
  20186. + i+=(in_ie[i+1]+2); // to the next IE element
  20187. + }
  20188. +
  20189. + return ielength;
  20190. +
  20191. +}
  20192. +
  20193. +
  20194. +//
  20195. +// Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.)
  20196. +// Added by Annie, 2006-05-07.
  20197. +//
  20198. +// Search by BSSID,
  20199. +// Return Value:
  20200. +// -1 :if there is no pre-auth key in the table
  20201. +// >=0 :if there is pre-auth key, and return the entry id
  20202. +//
  20203. +//
  20204. +
  20205. +static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid)
  20206. +{
  20207. + struct security_priv *psecuritypriv=&Adapter->securitypriv;
  20208. + int i=0;
  20209. +
  20210. + do
  20211. + {
  20212. + if( ( psecuritypriv->PMKIDList[i].bUsed ) &&
  20213. + ( _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) )
  20214. + {
  20215. + break;
  20216. + }
  20217. + else
  20218. + {
  20219. + i++;
  20220. + //continue;
  20221. + }
  20222. +
  20223. + }while(i<NUM_PMKID_CACHE);
  20224. +
  20225. + if( i == NUM_PMKID_CACHE )
  20226. + {
  20227. + i = -1;// Could not find.
  20228. + }
  20229. + else
  20230. + {
  20231. + // There is one Pre-Authentication Key for the specific BSSID.
  20232. + }
  20233. +
  20234. + return (i);
  20235. +
  20236. +}
  20237. +
  20238. +//
  20239. +// Check the RSN IE length
  20240. +// If the RSN IE length <= 20, the RSN IE didn't include the PMKID information
  20241. +// 0-11th element in the array are the fixed IE
  20242. +// 12th element in the array is the IE
  20243. +// 13th element in the array is the IE length
  20244. +//
  20245. +
  20246. +static int rtw_append_pmkid(_adapter *Adapter,int iEntry, u8 *ie, uint ie_len)
  20247. +{
  20248. + struct security_priv *psecuritypriv=&Adapter->securitypriv;
  20249. +
  20250. + if(ie[13]<=20){
  20251. + // The RSN IE didn't include the PMK ID, append the PMK information
  20252. + ie[ie_len]=1;
  20253. + ie_len++;
  20254. + ie[ie_len]=0; //PMKID count = 0x0100
  20255. + ie_len++;
  20256. + _rtw_memcpy( &ie[ie_len], &psecuritypriv->PMKIDList[iEntry].PMKID, 16);
  20257. +
  20258. + ie_len+=16;
  20259. + ie[13]+=18;//PMKID length = 2+16
  20260. +
  20261. + }
  20262. + return (ie_len);
  20263. +
  20264. +}
  20265. +sint rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie, u8 *out_ie, uint in_len)
  20266. +{
  20267. + u8 authmode, securitytype, match;
  20268. + u8 sec_ie[255], uncst_oui[4], bkup_ie[255];
  20269. + u8 wpa_oui[4]={0x0, 0x50, 0xf2, 0x01};
  20270. + uint ielength, cnt, remove_cnt;
  20271. + int iEntry;
  20272. +
  20273. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  20274. + struct security_priv *psecuritypriv=&adapter->securitypriv;
  20275. + uint ndisauthmode=psecuritypriv->ndisauthtype;
  20276. + uint ndissecuritytype = psecuritypriv->ndisencryptstatus;
  20277. +
  20278. +_func_enter_;
  20279. +
  20280. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
  20281. + ("+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\n",
  20282. + ndisauthmode, ndissecuritytype));
  20283. +
  20284. + //copy fixed ie only
  20285. + _rtw_memcpy(out_ie, in_ie,12);
  20286. + ielength=12;
  20287. + if((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK))
  20288. + authmode=_WPA_IE_ID_;
  20289. + if((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK))
  20290. + authmode=_WPA2_IE_ID_;
  20291. +
  20292. + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))
  20293. + {
  20294. + _rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len);
  20295. +
  20296. + ielength += psecuritypriv->wps_ie_len;
  20297. + }
  20298. + else if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_))
  20299. + {
  20300. + //copy RSN or SSN
  20301. + _rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2);
  20302. + /* debug for CONFIG_IEEE80211W
  20303. + {
  20304. + int jj;
  20305. + printk("supplicant_ie_length=%d &&&&&&&&&&&&&&&&&&&\n", psecuritypriv->supplicant_ie[1]+2);
  20306. + for(jj=0; jj < psecuritypriv->supplicant_ie[1]+2; jj++)
  20307. + printk(" %02x ", psecuritypriv->supplicant_ie[jj]);
  20308. + printk("\n");
  20309. + }*/
  20310. + ielength+=psecuritypriv->supplicant_ie[1]+2;
  20311. + rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie);
  20312. +
  20313. +#ifdef CONFIG_DRVEXT_MODULE
  20314. + drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie);
  20315. +#endif
  20316. + }
  20317. +
  20318. + iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
  20319. + if(iEntry<0)
  20320. + {
  20321. + return ielength;
  20322. + }
  20323. + else
  20324. + {
  20325. + if(authmode == _WPA2_IE_ID_)
  20326. + {
  20327. + ielength=rtw_append_pmkid(adapter, iEntry, out_ie, ielength);
  20328. + }
  20329. + }
  20330. +
  20331. +_func_exit_;
  20332. +
  20333. + return ielength;
  20334. +}
  20335. +
  20336. +void rtw_init_registrypriv_dev_network( _adapter* adapter)
  20337. +{
  20338. + struct registry_priv* pregistrypriv = &adapter->registrypriv;
  20339. + struct eeprom_priv* peepriv = &adapter->eeprompriv;
  20340. + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network;
  20341. + u8 *myhwaddr = myid(peepriv);
  20342. +
  20343. +_func_enter_;
  20344. +
  20345. + _rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN);
  20346. +
  20347. + _rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID));
  20348. +
  20349. + pdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION);
  20350. + pdev_network->Configuration.BeaconPeriod = 100;
  20351. + pdev_network->Configuration.FHConfig.Length = 0;
  20352. + pdev_network->Configuration.FHConfig.HopPattern = 0;
  20353. + pdev_network->Configuration.FHConfig.HopSet = 0;
  20354. + pdev_network->Configuration.FHConfig.DwellTime = 0;
  20355. +
  20356. +
  20357. +_func_exit_;
  20358. +
  20359. +}
  20360. +
  20361. +void rtw_update_registrypriv_dev_network(_adapter* adapter)
  20362. +{
  20363. + int sz=0;
  20364. + struct registry_priv* pregistrypriv = &adapter->registrypriv;
  20365. + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network;
  20366. + struct security_priv* psecuritypriv = &adapter->securitypriv;
  20367. + struct wlan_network *cur_network = &adapter->mlmepriv.cur_network;
  20368. + //struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
  20369. +
  20370. +_func_enter_;
  20371. +
  20372. +#if 0
  20373. + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
  20374. + pxmitpriv->vcs = pregistrypriv->vcs_type;
  20375. + pxmitpriv->vcs_type = pregistrypriv->vcs_type;
  20376. + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh;
  20377. + pxmitpriv->frag_len = pregistrypriv->frag_thresh;
  20378. +
  20379. + adapter->qospriv.qos_option = pregistrypriv->wmm_enable;
  20380. +#endif
  20381. +
  20382. + pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x
  20383. +
  20384. + pdev_network->Rssi = 0;
  20385. +
  20386. + switch(pregistrypriv->wireless_mode)
  20387. + {
  20388. + case WIRELESS_11B:
  20389. + pdev_network->NetworkTypeInUse = (Ndis802_11DS);
  20390. + break;
  20391. + case WIRELESS_11G:
  20392. + case WIRELESS_11BG:
  20393. + case WIRELESS_11_24N:
  20394. + case WIRELESS_11G_24N:
  20395. + case WIRELESS_11BG_24N:
  20396. + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24);
  20397. + break;
  20398. + case WIRELESS_11A:
  20399. + case WIRELESS_11A_5N:
  20400. + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5);
  20401. + break;
  20402. + case WIRELESS_11ABGN:
  20403. + if(pregistrypriv->channel > 14)
  20404. + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5);
  20405. + else
  20406. + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24);
  20407. + break;
  20408. + default :
  20409. + // TODO
  20410. + break;
  20411. + }
  20412. +
  20413. + pdev_network->Configuration.DSConfig = (pregistrypriv->channel);
  20414. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\n", pregistrypriv->channel, pdev_network->Configuration.DSConfig));
  20415. +
  20416. + if(cur_network->network.InfrastructureMode == Ndis802_11IBSS)
  20417. + pdev_network->Configuration.ATIMWindow = (0);
  20418. +
  20419. + pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode);
  20420. +
  20421. + // 1. Supported rates
  20422. + // 2. IE
  20423. +
  20424. + //rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie
  20425. + sz = rtw_generate_ie(pregistrypriv);
  20426. +
  20427. + pdev_network->IELength = sz;
  20428. +
  20429. + pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network);
  20430. +
  20431. + //notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd();
  20432. + //pdev_network->IELength = cpu_to_le32(sz);
  20433. +
  20434. +_func_exit_;
  20435. +
  20436. +}
  20437. +
  20438. +void rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter)
  20439. +{
  20440. +_func_enter_;
  20441. +
  20442. +
  20443. +_func_exit_;
  20444. +
  20445. +}
  20446. +
  20447. +//the fucntion is at passive_level
  20448. +void rtw_joinbss_reset(_adapter *padapter)
  20449. +{
  20450. + u8 threshold;
  20451. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  20452. +
  20453. +#ifdef CONFIG_80211N_HT
  20454. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  20455. +#endif
  20456. +
  20457. + //todo: if you want to do something io/reg/hw setting before join_bss, please add code here
  20458. +
  20459. +
  20460. +
  20461. +
  20462. +#ifdef CONFIG_80211N_HT
  20463. +
  20464. + pmlmepriv->num_FortyMHzIntolerant = 0;
  20465. +
  20466. + pmlmepriv->num_sta_no_ht = 0;
  20467. +
  20468. + phtpriv->ampdu_enable = _FALSE;//reset to disabled
  20469. +
  20470. +#ifdef CONFIG_USB_HCI
  20471. + // TH=1 => means that invalidate usb rx aggregation
  20472. + // TH=0 => means that validate usb rx aggregation, use init value.
  20473. + if(phtpriv->ht_option)
  20474. + {
  20475. + if(padapter->registrypriv.wifi_spec==1)
  20476. + threshold = 1;
  20477. + else
  20478. + threshold = 0;
  20479. + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  20480. + }
  20481. + else
  20482. + {
  20483. + threshold = 1;
  20484. + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  20485. + }
  20486. +#endif
  20487. +
  20488. +#endif
  20489. +
  20490. +}
  20491. +
  20492. +
  20493. +#ifdef CONFIG_80211N_HT
  20494. +
  20495. +//the fucntion is >= passive_level
  20496. +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel)
  20497. +{
  20498. + u32 ielen, out_len;
  20499. + unsigned char *p, *pframe;
  20500. + struct rtw_ieee80211_ht_cap ht_capie;
  20501. + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
  20502. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  20503. + struct qos_priv *pqospriv= &pmlmepriv->qospriv;
  20504. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  20505. + struct registry_priv *pregpriv = &padapter->registrypriv;
  20506. + u8 cbw40_enable = 0;
  20507. +
  20508. + phtpriv->ht_option = _FALSE;
  20509. +
  20510. + p = rtw_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12);
  20511. +
  20512. + if(p && ielen>0)
  20513. + {
  20514. + if(pqospriv->qos_option == 0)
  20515. + {
  20516. + out_len = *pout_len;
  20517. + pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_,
  20518. + _WMM_IE_Length_, WMM_IE, pout_len);
  20519. +
  20520. + pqospriv->qos_option = 1;
  20521. + }
  20522. +
  20523. + out_len = *pout_len;
  20524. +
  20525. + _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));
  20526. +
  20527. + ht_capie.cap_info = IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_TX_STBC |
  20528. + IEEE80211_HT_CAP_DSSSCCK40;
  20529. + //if insert module set only support 20MHZ, don't add the 40MHZ and SGI_40
  20530. + if( channel > 14 )
  20531. + {
  20532. + if( pregpriv->cbw40_enable & BIT(1) )
  20533. + cbw40_enable = 1;
  20534. + }
  20535. + else
  20536. + if( pregpriv->cbw40_enable & BIT(0) )
  20537. + cbw40_enable = 1;
  20538. +
  20539. + if ( cbw40_enable != 0 )
  20540. + ht_capie.cap_info |= IEEE80211_HT_CAP_SUP_WIDTH | IEEE80211_HT_CAP_SGI_40;
  20541. +
  20542. +
  20543. +
  20544. + {
  20545. + u32 rx_packet_offset, max_recvbuf_sz;
  20546. + rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);
  20547. + rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);
  20548. + //if(max_recvbuf_sz-rx_packet_offset>(8191-256)) {
  20549. + // DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__);
  20550. + // ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;
  20551. + //}
  20552. + }
  20553. +
  20554. + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);
  20555. +
  20556. + if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
  20557. + ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
  20558. + else
  20559. + ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
  20560. +
  20561. +
  20562. + pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_,
  20563. + sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len);
  20564. +
  20565. +
  20566. + //_rtw_memcpy(out_ie+out_len, p, ielen+2);//gtest
  20567. + //*pout_len = *pout_len + (ielen+2);
  20568. +
  20569. +
  20570. + phtpriv->ht_option = _TRUE;
  20571. +
  20572. + p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12);
  20573. + if(p && (ielen==sizeof(struct ieee80211_ht_addt_info)))
  20574. + {
  20575. + out_len = *pout_len;
  20576. + pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len);
  20577. + }
  20578. +
  20579. + }
  20580. +
  20581. + return (phtpriv->ht_option);
  20582. +
  20583. +}
  20584. +
  20585. +//the fucntion is > passive_level (in critical_section)
  20586. +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
  20587. +{
  20588. + u8 *p, max_ampdu_sz;
  20589. + int len;
  20590. + //struct sta_info *bmc_sta, *psta;
  20591. + struct rtw_ieee80211_ht_cap *pht_capie;
  20592. + struct ieee80211_ht_addt_info *pht_addtinfo;
  20593. + //struct recv_reorder_ctrl *preorder_ctrl;
  20594. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  20595. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  20596. + //struct recv_priv *precvpriv = &padapter->recvpriv;
  20597. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  20598. + //struct wlan_network *pcur_network = &(pmlmepriv->cur_network);;
  20599. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  20600. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  20601. + u8 cbw40_enable=0;
  20602. +
  20603. + if(!phtpriv->ht_option)
  20604. + return;
  20605. +
  20606. + if ((!pmlmeinfo->HT_info_enable) || (!pmlmeinfo->HT_caps_enable))
  20607. + return;
  20608. +
  20609. + DBG_871X("+rtw_update_ht_cap()\n");
  20610. +
  20611. + //maybe needs check if ap supports rx ampdu.
  20612. + if((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1))
  20613. + {
  20614. + //In the wifi cert. test, the test Lab should turn off the AP's RX AMPDU. client doen't need to close the TX AMPDU
  20615. + /*if(pregistrypriv->wifi_spec==1)
  20616. + {
  20617. + phtpriv->ampdu_enable = _FALSE;
  20618. + }
  20619. + else*/
  20620. + {
  20621. + phtpriv->ampdu_enable = _TRUE;
  20622. + }
  20623. + }
  20624. + else if(pregistrypriv->ampdu_enable==2)
  20625. + {
  20626. + phtpriv->ampdu_enable = _TRUE;
  20627. + }
  20628. +
  20629. +
  20630. + //check Max Rx A-MPDU Size
  20631. + len = 0;
  20632. + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs));
  20633. + if(p && len>0)
  20634. + {
  20635. + pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);
  20636. + max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR);
  20637. + max_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes);
  20638. +
  20639. + //DBG_871X("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz);
  20640. + phtpriv->rx_ampdu_maxlen = max_ampdu_sz;
  20641. +
  20642. + }
  20643. +
  20644. +
  20645. + len=0;
  20646. + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs));
  20647. + if(p && len>0)
  20648. + {
  20649. + pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2);
  20650. + //todo:
  20651. + }
  20652. +
  20653. + if( channel > 14 )
  20654. + {
  20655. + if( pregistrypriv->cbw40_enable & BIT(1) )
  20656. + cbw40_enable = 1;
  20657. + }
  20658. + else
  20659. + if( pregistrypriv->cbw40_enable & BIT(0) )
  20660. + cbw40_enable = 1;
  20661. +
  20662. +
  20663. + //update cur_bwmode & cur_ch_offset
  20664. + if ((cbw40_enable) &&
  20665. + (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) &&
  20666. + (pmlmeinfo->HT_info.infos[0] & BIT(2)))
  20667. + {
  20668. + int i;
  20669. + u8 rf_type;
  20670. +
  20671. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  20672. +
  20673. + //update the MCS rates
  20674. + for (i = 0; i < 16; i++)
  20675. + {
  20676. + if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
  20677. + {
  20678. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  20679. + }
  20680. + else
  20681. + {
  20682. + #ifdef CONFIG_DISABLE_MCS13TO15
  20683. + if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
  20684. + {
  20685. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
  20686. + }
  20687. + else
  20688. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
  20689. + #else
  20690. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
  20691. + #endif //CONFIG_DISABLE_MCS13TO15
  20692. + }
  20693. + #ifdef RTL8192C_RECONFIG_TO_1T1R
  20694. + {
  20695. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  20696. + }
  20697. + #endif
  20698. +
  20699. + if(pregistrypriv->special_rf_path)
  20700. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  20701. +
  20702. + }
  20703. + //switch to the 40M Hz mode accoring to the AP
  20704. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  20705. + switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
  20706. + {
  20707. + case HT_EXTCHNL_OFFSET_UPPER:
  20708. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  20709. + break;
  20710. +
  20711. + case HT_EXTCHNL_OFFSET_LOWER:
  20712. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  20713. + break;
  20714. +
  20715. + default:
  20716. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  20717. + break;
  20718. + }
  20719. + }
  20720. +
  20721. + //
  20722. + // Config SM Power Save setting
  20723. + //
  20724. + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
  20725. + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)
  20726. + {
  20727. + /*u8 i;
  20728. + //update the MCS rates
  20729. + for (i = 0; i < 16; i++)
  20730. + {
  20731. + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  20732. + }*/
  20733. + DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__);
  20734. + }
  20735. +
  20736. + //
  20737. + // Config current HT Protection mode.
  20738. + //
  20739. + pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;
  20740. +
  20741. +
  20742. +
  20743. +#if 0 //move to rtw_update_sta_info_client()
  20744. + //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info
  20745. + //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff
  20746. + //todo: check if AP can send A-MPDU packets
  20747. + bmc_sta = rtw_get_bcmc_stainfo(padapter);
  20748. + if(bmc_sta)
  20749. + {
  20750. + for(i=0; i < 16 ; i++)
  20751. + {
  20752. + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i];
  20753. + preorder_ctrl = &bmc_sta->recvreorder_ctrl[i];
  20754. + preorder_ctrl->enable = _FALSE;
  20755. + preorder_ctrl->indicate_seq = 0xffff;
  20756. + #ifdef DBG_RX_SEQ
  20757. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  20758. + preorder_ctrl->indicate_seq);
  20759. + #endif
  20760. + preorder_ctrl->wend_b= 0xffff;
  20761. + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32
  20762. + }
  20763. + }
  20764. +
  20765. + psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress);
  20766. + if(psta)
  20767. + {
  20768. + for(i=0; i < 16 ; i++)
  20769. + {
  20770. + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i];
  20771. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  20772. + preorder_ctrl->enable = _FALSE;
  20773. + preorder_ctrl->indicate_seq = 0xffff;
  20774. + #ifdef DBG_RX_SEQ
  20775. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  20776. + preorder_ctrl->indicate_seq);
  20777. + #endif
  20778. + preorder_ctrl->wend_b= 0xffff;
  20779. + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32
  20780. + }
  20781. + }
  20782. +#endif
  20783. +
  20784. +}
  20785. +
  20786. +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe)
  20787. +{
  20788. + u8 issued;
  20789. + int priority;
  20790. + struct sta_info *psta=NULL;
  20791. + struct ht_priv *phtpriv;
  20792. + struct pkt_attrib *pattrib =&pxmitframe->attrib;
  20793. + s32 bmcst = IS_MCAST(pattrib->ra);
  20794. +
  20795. + if(bmcst || (padapter->mlmepriv.LinkDetectInfo.bTxBusyTraffic == _FALSE))
  20796. + return;
  20797. +
  20798. + priority = pattrib->priority;
  20799. +
  20800. + if (pattrib->psta)
  20801. + psta = pattrib->psta;
  20802. + else
  20803. + {
  20804. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  20805. + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  20806. + }
  20807. +
  20808. + if(psta==NULL)
  20809. + {
  20810. + DBG_871X("%s, psta==NUL\n", __func__);
  20811. + return;
  20812. + }
  20813. +
  20814. + if(!(psta->state &_FW_LINKED))
  20815. + {
  20816. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  20817. + return;
  20818. + }
  20819. +
  20820. +
  20821. + phtpriv = &psta->htpriv;
  20822. +
  20823. + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE))
  20824. + {
  20825. + issued = (phtpriv->agg_enable_bitmap>>priority)&0x1;
  20826. + issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1;
  20827. +
  20828. + if(0==issued)
  20829. + {
  20830. + DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority);
  20831. + psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);
  20832. + rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra);
  20833. + }
  20834. + }
  20835. +
  20836. +}
  20837. +
  20838. +#endif
  20839. +
  20840. +#ifdef CONFIG_LAYER2_ROAMING
  20841. +inline void rtw_set_roaming(_adapter *adapter, u8 to_roaming)
  20842. +{
  20843. + if (to_roaming == 0)
  20844. + adapter->mlmepriv.to_join = _FALSE;
  20845. + adapter->mlmepriv.to_roaming = to_roaming;
  20846. +}
  20847. +
  20848. +inline u8 rtw_to_roaming(_adapter *adapter)
  20849. +{
  20850. + return adapter->mlmepriv.to_roaming;
  20851. +}
  20852. +
  20853. +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network)
  20854. +{
  20855. + _irqL irqL;
  20856. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  20857. +
  20858. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  20859. + _rtw_roaming(padapter, tgt_network);
  20860. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  20861. +}
  20862. +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network)
  20863. +{
  20864. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  20865. + int do_join_r;
  20866. +
  20867. + struct wlan_network *pnetwork;
  20868. +
  20869. + if(tgt_network != NULL)
  20870. + pnetwork = tgt_network;
  20871. + else
  20872. + pnetwork = &pmlmepriv->cur_network;
  20873. +
  20874. + if(0 < rtw_to_roaming(padapter)) {
  20875. + DBG_871X("roaming from %s("MAC_FMT"), length:%d\n",
  20876. + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress),
  20877. + pnetwork->network.Ssid.SsidLength);
  20878. + _rtw_memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(NDIS_802_11_SSID));
  20879. +
  20880. + pmlmepriv->assoc_by_bssid = _FALSE;
  20881. +
  20882. + while(1) {
  20883. + if( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) {
  20884. + break;
  20885. + } else {
  20886. + DBG_871X("roaming do_join return %d\n", do_join_r);
  20887. + pmlmepriv->to_roaming--;
  20888. +
  20889. + if(0< rtw_to_roaming(padapter)) {
  20890. + continue;
  20891. + } else {
  20892. + DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__);
  20893. + rtw_indicate_disconnect(padapter);
  20894. + break;
  20895. + }
  20896. + }
  20897. + }
  20898. + }
  20899. +
  20900. +}
  20901. +#endif
  20902. +
  20903. +#ifdef CONFIG_CONCURRENT_MODE
  20904. +sint rtw_buddy_adapter_up(_adapter *padapter)
  20905. +{
  20906. + sint res = _FALSE;
  20907. +
  20908. + if(padapter == NULL)
  20909. + return res;
  20910. +
  20911. +
  20912. + if(padapter->pbuddy_adapter == NULL)
  20913. + {
  20914. + res = _FALSE;
  20915. + }
  20916. + else if( (padapter->pbuddy_adapter->bDriverStopped) || (padapter->pbuddy_adapter->bSurpriseRemoved) ||
  20917. + (padapter->pbuddy_adapter->bup == _FALSE) || (padapter->pbuddy_adapter->hw_init_completed == _FALSE))
  20918. + {
  20919. + res = _FALSE;
  20920. + }
  20921. + else
  20922. + {
  20923. + res = _TRUE;
  20924. + }
  20925. +
  20926. + return res;
  20927. +
  20928. +}
  20929. +
  20930. +sint check_buddy_fwstate(_adapter *padapter, sint state)
  20931. +{
  20932. + if(padapter == NULL)
  20933. + return _FALSE;
  20934. +
  20935. + if(padapter->pbuddy_adapter == NULL)
  20936. + return _FALSE;
  20937. +
  20938. + if ((state == WIFI_FW_NULL_STATE) &&
  20939. + (padapter->pbuddy_adapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE))
  20940. + return _TRUE;
  20941. +
  20942. + if (padapter->pbuddy_adapter->mlmepriv.fw_state & state)
  20943. + return _TRUE;
  20944. +
  20945. + return _FALSE;
  20946. +}
  20947. +#endif //CONFIG_CONCURRENT_MODE
  20948. --- /dev/null
  20949. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c
  20950. @@ -0,0 +1,13599 @@
  20951. +/******************************************************************************
  20952. + *
  20953. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  20954. + *
  20955. + * This program is free software; you can redistribute it and/or modify it
  20956. + * under the terms of version 2 of the GNU General Public License as
  20957. + * published by the Free Software Foundation.
  20958. + *
  20959. + * This program is distributed in the hope that it will be useful, but WITHOUT
  20960. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  20961. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  20962. + * more details.
  20963. + *
  20964. + * You should have received a copy of the GNU General Public License along with
  20965. + * this program; if not, write to the Free Software Foundation, Inc.,
  20966. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  20967. + *
  20968. + *
  20969. + ******************************************************************************/
  20970. +#define _RTW_MLME_EXT_C_
  20971. +
  20972. +#include <drv_conf.h>
  20973. +#include <osdep_service.h>
  20974. +#include <drv_types.h>
  20975. +#include <wifi.h>
  20976. +#include <rtw_mlme_ext.h>
  20977. +#include <wlan_bssdef.h>
  20978. +#include <mlme_osdep.h>
  20979. +#include <recv_osdep.h>
  20980. +
  20981. +struct mlme_handler mlme_sta_tbl[]={
  20982. + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq},
  20983. + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp},
  20984. + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq},
  20985. + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp},
  20986. + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq},
  20987. + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp},
  20988. +
  20989. + /*----------------------------------------------------------
  20990. + below 2 are reserved
  20991. + -----------------------------------------------------------*/
  20992. + {0, "DoReserved", &DoReserved},
  20993. + {0, "DoReserved", &DoReserved},
  20994. + {WIFI_BEACON, "OnBeacon", &OnBeacon},
  20995. + {WIFI_ATIM, "OnATIM", &OnAtim},
  20996. + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc},
  20997. + {WIFI_AUTH, "OnAuth", &OnAuthClient},
  20998. + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth},
  20999. + {WIFI_ACTION, "OnAction", &OnAction},
  21000. +};
  21001. +
  21002. +#ifdef _CONFIG_NATIVEAP_MLME_
  21003. +struct mlme_handler mlme_ap_tbl[]={
  21004. + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq},
  21005. + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp},
  21006. + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq},
  21007. + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp},
  21008. + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq},
  21009. + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp},
  21010. +
  21011. + /*----------------------------------------------------------
  21012. + below 2 are reserved
  21013. + -----------------------------------------------------------*/
  21014. + {0, "DoReserved", &DoReserved},
  21015. + {0, "DoReserved", &DoReserved},
  21016. + {WIFI_BEACON, "OnBeacon", &OnBeacon},
  21017. + {WIFI_ATIM, "OnATIM", &OnAtim},
  21018. + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc},
  21019. + {WIFI_AUTH, "OnAuth", &OnAuth},
  21020. + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth},
  21021. + {WIFI_ACTION, "OnAction", &OnAction},
  21022. +};
  21023. +#endif
  21024. +
  21025. +struct action_handler OnAction_tbl[]={
  21026. + {RTW_WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", on_action_spct},
  21027. + {RTW_WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos},
  21028. + {RTW_WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls},
  21029. + {RTW_WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back},
  21030. + {RTW_WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", on_action_public},
  21031. + {RTW_WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved},
  21032. + {RTW_WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved},
  21033. + {RTW_WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht},
  21034. +#ifdef CONFIG_IEEE80211W
  21035. + {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &OnAction_sa_query},
  21036. +#else
  21037. + {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved},
  21038. +#endif //CONFIG_IEEE80211W
  21039. + //add for CONFIG_IEEE80211W
  21040. + {RTW_WLAN_CATEGORY_UNPROTECTED_WNM, "ACTION_UNPROTECTED_WNM", &DoReserved},
  21041. + {RTW_WLAN_CATEGORY_SELF_PROTECTED, "ACTION_SELF_PROTECTED", &DoReserved},
  21042. + {RTW_WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm},
  21043. + {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p},
  21044. +};
  21045. +
  21046. +
  21047. +u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
  21048. +
  21049. +/**************************************************
  21050. +OUI definitions for the vendor specific IE
  21051. +***************************************************/
  21052. +unsigned char RTW_WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};
  21053. +unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02};
  21054. +unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04};
  21055. +unsigned char P2P_OUI[] = {0x50,0x6F,0x9A,0x09};
  21056. +unsigned char WFD_OUI[] = {0x50,0x6F,0x9A,0x0A};
  21057. +
  21058. +unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
  21059. +unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
  21060. +
  21061. +unsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02};
  21062. +unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02};
  21063. +
  21064. +extern unsigned char REALTEK_96B_IE[];
  21065. +
  21066. +/********************************************************
  21067. +MCS rate definitions
  21068. +*********************************************************/
  21069. +#ifdef CONFIG_DISABLE_MCS13TO15
  21070. +unsigned char MCS_rate_2R_MCS13TO15_OFF[16] = {0xff, 0x1f, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  21071. +unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  21072. +#else //CONFIG_DISABLE_MCS13TO15
  21073. +unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  21074. +#endif //CONFIG_DISABLE_MCS13TO15
  21075. +unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  21076. +
  21077. +/********************************************************
  21078. +ChannelPlan definitions
  21079. +*********************************************************/
  21080. +/*static RT_CHANNEL_PLAN DefaultChannelPlan[RT_CHANNEL_DOMAIN_MAX] = {
  21081. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},32}, // 0x00, RT_CHANNEL_DOMAIN_FCC
  21082. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},31}, // 0x01, RT_CHANNEL_DOMAIN_IC
  21083. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x02, RT_CHANNEL_DOMAIN_ETSI
  21084. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x03, RT_CHANNEL_DOMAIN_SPAIN
  21085. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x04, RT_CHANNEL_DOMAIN_FRANCE
  21086. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x05, RT_CHANNEL_DOMAIN_MKK
  21087. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x06, RT_CHANNEL_DOMAIN_MKK1
  21088. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x07, RT_CHANNEL_DOMAIN_ISRAEL
  21089. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x08, RT_CHANNEL_DOMAIN_TELEC
  21090. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN
  21091. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13
  21092. + {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},26}, // 0x0B, RT_CHANNEL_DOMAIN_TAIWAN
  21093. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,149,153,157,161,165},18}, // 0x0C, RT_CHANNEL_DOMAIN_CHINA
  21094. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO
  21095. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165},31}, // 0x0E, RT_CHANNEL_DOMAIN_KOREA
  21096. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, // 0x0F, RT_CHANNEL_DOMAIN_TURKEY
  21097. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x10, RT_CHANNEL_DOMAIN_JAPAN
  21098. + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,153,157,161,165},20}, // 0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS
  21099. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48},17}, // 0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS
  21100. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165},37}, // 0x13, RT_CHANNEL_DOMAIN_WORLD_WIDE_5G
  21101. + {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,149,153,157,161,165},19}, // 0x14, RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS
  21102. +};*/
  21103. +
  21104. +static RT_CHANNEL_PLAN_2G RTW_ChannelPlan2G[RT_CHANNEL_DOMAIN_2G_MAX] = {
  21105. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x00, RT_CHANNEL_DOMAIN_2G_WORLD , Passive scan CH 12, 13
  21106. + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x01, RT_CHANNEL_DOMAIN_2G_ETSI1
  21107. + {{1,2,3,4,5,6,7,8,9,10,11},11}, // 0x02, RT_CHANNEL_DOMAIN_2G_FCC1
  21108. + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x03, RT_CHANNEL_DOMAIN_2G_MIKK1
  21109. + {{10,11,12,13},4}, // 0x04, RT_CHANNEL_DOMAIN_2G_ETSI2
  21110. + {{},0}, // 0x05, RT_CHANNEL_DOMAIN_2G_NULL
  21111. +};
  21112. +
  21113. +static RT_CHANNEL_PLAN_5G RTW_ChannelPlan5G[RT_CHANNEL_DOMAIN_5G_MAX] = {
  21114. + {{},0}, // 0x00, RT_CHANNEL_DOMAIN_5G_NULL
  21115. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},19}, // 0x01, RT_CHANNEL_DOMAIN_5G_ETSI1
  21116. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165},24}, // 0x02, RT_CHANNEL_DOMAIN_5G_ETSI2
  21117. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165},22}, // 0x03, RT_CHANNEL_DOMAIN_5G_ETSI3
  21118. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165},24}, // 0x04, RT_CHANNEL_DOMAIN_5G_FCC1
  21119. + {{36,40,44,48,149,153,157,161,165},9}, // 0x05, RT_CHANNEL_DOMAIN_5G_FCC2
  21120. + {{36,40,44,48,52,56,60,64,149,153,157,161,165},13}, // 0x06, RT_CHANNEL_DOMAIN_5G_FCC3
  21121. + {{36,40,44,48,52,56,60,64,149,153,157,161},12}, // 0x07, RT_CHANNEL_DOMAIN_5G_FCC4
  21122. + {{149,153,157,161,165},5}, // 0x08, RT_CHANNEL_DOMAIN_5G_FCC5
  21123. + {{36,40,44,48,52,56,60,64},8}, // 0x09, RT_CHANNEL_DOMAIN_5G_FCC6
  21124. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},20}, // 0x0A, RT_CHANNEL_DOMAIN_5G_FCC7_IC1
  21125. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165},20}, // 0x0B, RT_CHANNEL_DOMAIN_5G_KCC1
  21126. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},19}, // 0x0C, RT_CHANNEL_DOMAIN_5G_MKK1
  21127. + {{36,40,44,48,52,56,60,64},8}, // 0x0D, RT_CHANNEL_DOMAIN_5G_MKK2
  21128. + {{100,104,108,112,116,120,124,128,132,136,140},11}, // 0x0E, RT_CHANNEL_DOMAIN_5G_MKK3
  21129. + {{56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},15}, // 0x0F, RT_CHANNEL_DOMAIN_5G_NCC1
  21130. + {{56,60,64,149,153,157,161,165},8}, // 0x10, RT_CHANNEL_DOMAIN_5G_NCC2
  21131. +
  21132. + //===== Driver self defined for old channel plan Compatible ,Remember to modify if have new channel plan definition =====
  21133. + {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21}, // 0x11, RT_CHANNEL_DOMAIN_5G_FCC
  21134. + {{36,40,44,48},4}, // 0x12, RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS
  21135. + {{36,40,44,48,149,153,157,161},8}, // 0x13, RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS
  21136. +};
  21137. +
  21138. +static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
  21139. + //===== 0x00 ~ 0x1F , Old Define =====
  21140. + {0x02,0x11}, //0x00, RT_CHANNEL_DOMAIN_FCC
  21141. + {0x02,0x0A}, //0x01, RT_CHANNEL_DOMAIN_IC
  21142. + {0x01,0x01}, //0x02, RT_CHANNEL_DOMAIN_ETSI
  21143. + {0x01,0x00}, //0x03, RT_CHANNEL_DOMAIN_SPAIN
  21144. + {0x01,0x00}, //0x04, RT_CHANNEL_DOMAIN_FRANCE
  21145. + {0x03,0x00}, //0x05, RT_CHANNEL_DOMAIN_MKK
  21146. + {0x03,0x00}, //0x06, RT_CHANNEL_DOMAIN_MKK1
  21147. + {0x01,0x09}, //0x07, RT_CHANNEL_DOMAIN_ISRAEL
  21148. + {0x03,0x09}, //0x08, RT_CHANNEL_DOMAIN_TELEC
  21149. + {0x03,0x00}, //0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN
  21150. + {0x00,0x00}, //0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13
  21151. + {0x02,0x0F}, //0x0B, RT_CHANNEL_DOMAIN_TAIWAN
  21152. + {0x01,0x08}, //0x0C, RT_CHANNEL_DOMAIN_CHINA
  21153. + {0x02,0x06}, //0x0D, RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO
  21154. + {0x02,0x0B}, //0x0E, RT_CHANNEL_DOMAIN_KOREA
  21155. + {0x02,0x09}, //0x0F, RT_CHANNEL_DOMAIN_TURKEY
  21156. + {0x01,0x01}, //0x10, RT_CHANNEL_DOMAIN_JAPAN
  21157. + {0x02,0x05}, //0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS
  21158. + {0x01,0x12}, //0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS
  21159. + {0x00,0x04}, //0x13, RT_CHANNEL_DOMAIN_WORLD_WIDE_5G
  21160. + {0x02,0x10}, //0x14, RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS
  21161. + {0x00,0x12}, //0x15, RT_CHANNEL_DOMAIN_ETSI_NO_DFS
  21162. + {0x00,0x13}, //0x16, RT_CHANNEL_DOMAIN_KOREA_NO_DFS
  21163. + {0x03,0x12}, //0x17, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS
  21164. + {0x05,0x08}, //0x18, RT_CHANNEL_DOMAIN_PAKISTAN_NO_DFS
  21165. + {0x02,0x08}, //0x19, RT_CHANNEL_DOMAIN_TAIWAN2_NO_DFS
  21166. + {0x00,0x00}, //0x1A,
  21167. + {0x00,0x00}, //0x1B,
  21168. + {0x00,0x00}, //0x1C,
  21169. + {0x00,0x00}, //0x1D,
  21170. + {0x00,0x00}, //0x1E,
  21171. + {0x05,0x04}, //0x1F, RT_CHANNEL_DOMAIN_WORLD_WIDE_ONLY_5G
  21172. + //===== 0x20 ~ 0x7F ,New Define =====
  21173. + {0x00,0x00}, //0x20, RT_CHANNEL_DOMAIN_WORLD_NULL
  21174. + {0x01,0x00}, //0x21, RT_CHANNEL_DOMAIN_ETSI1_NULL
  21175. + {0x02,0x00}, //0x22, RT_CHANNEL_DOMAIN_FCC1_NULL
  21176. + {0x03,0x00}, //0x23, RT_CHANNEL_DOMAIN_MKK1_NULL
  21177. + {0x04,0x00}, //0x24, RT_CHANNEL_DOMAIN_ETSI2_NULL
  21178. + {0x02,0x04}, //0x25, RT_CHANNEL_DOMAIN_FCC1_FCC1
  21179. + {0x00,0x01}, //0x26, RT_CHANNEL_DOMAIN_WORLD_ETSI1
  21180. + {0x03,0x0C}, //0x27, RT_CHANNEL_DOMAIN_MKK1_MKK1
  21181. + {0x00,0x0B}, //0x28, RT_CHANNEL_DOMAIN_WORLD_KCC1
  21182. + {0x00,0x05}, //0x29, RT_CHANNEL_DOMAIN_WORLD_FCC2
  21183. + {0x00,0x00}, //0x2A,
  21184. + {0x00,0x00}, //0x2B,
  21185. + {0x00,0x00}, //0x2C,
  21186. + {0x00,0x00}, //0x2D,
  21187. + {0x00,0x00}, //0x2E,
  21188. + {0x00,0x00}, //0x2F,
  21189. + {0x00,0x06}, //0x30, RT_CHANNEL_DOMAIN_WORLD_FCC3
  21190. + {0x00,0x07}, //0x31, RT_CHANNEL_DOMAIN_WORLD_FCC4
  21191. + {0x00,0x08}, //0x32, RT_CHANNEL_DOMAIN_WORLD_FCC5
  21192. + {0x00,0x09}, //0x33, RT_CHANNEL_DOMAIN_WORLD_FCC6
  21193. + {0x02,0x0A}, //0x34, RT_CHANNEL_DOMAIN_FCC1_FCC7
  21194. + {0x00,0x02}, //0x35, RT_CHANNEL_DOMAIN_WORLD_ETSI2
  21195. + {0x00,0x03}, //0x36, RT_CHANNEL_DOMAIN_WORLD_ETSI3
  21196. + {0x03,0x0D}, //0x37, RT_CHANNEL_DOMAIN_MKK1_MKK2
  21197. + {0x03,0x0E}, //0x38, RT_CHANNEL_DOMAIN_MKK1_MKK3
  21198. + {0x02,0x0F}, //0x39, RT_CHANNEL_DOMAIN_FCC1_NCC1
  21199. + {0x00,0x00}, //0x3A,
  21200. + {0x00,0x00}, //0x3B,
  21201. + {0x00,0x00}, //0x3C,
  21202. + {0x00,0x00}, //0x3D,
  21203. + {0x00,0x00}, //0x3E,
  21204. + {0x00,0x00}, //0x3F,
  21205. + {0x02,0x10}, //0x40, RT_CHANNEL_DOMAIN_FCC1_NCC2
  21206. +};
  21207. +
  21208. +static RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x03,0x02}; //use the conbination for max channel numbers
  21209. +
  21210. +/*
  21211. + * Search the @param ch in given @param ch_set
  21212. + * @ch_set: the given channel set
  21213. + * @ch: the given channel number
  21214. + *
  21215. + * return the index of channel_num in channel_set, -1 if not found
  21216. + */
  21217. +int rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch)
  21218. +{
  21219. + int i;
  21220. + for(i=0;ch_set[i].ChannelNum!=0;i++){
  21221. + if(ch == ch_set[i].ChannelNum)
  21222. + break;
  21223. + }
  21224. +
  21225. + if(i >= ch_set[i].ChannelNum)
  21226. + return -1;
  21227. + return i;
  21228. +}
  21229. +
  21230. +/*
  21231. + * Check the @param ch is fit with setband setting of @param adapter
  21232. + * @adapter: the given adapter
  21233. + * @ch: the given channel number
  21234. + *
  21235. + * return _TRUE when check valid, _FALSE not valid
  21236. + */
  21237. +bool rtw_mlme_band_check(_adapter *adapter, const u32 ch)
  21238. +{
  21239. + if (adapter->setband == GHZ24_50 /* 2.4G and 5G */
  21240. + || (adapter->setband == GHZ_24 && ch < 35) /* 2.4G only */
  21241. + || (adapter->setband == GHZ_50 && ch > 35) /* 5G only */
  21242. + ) {
  21243. + return _TRUE;
  21244. + }
  21245. + return _FALSE;
  21246. +}
  21247. +
  21248. +/****************************************************************************
  21249. +
  21250. +Following are the initialization functions for WiFi MLME
  21251. +
  21252. +*****************************************************************************/
  21253. +
  21254. +int init_hw_mlme_ext(_adapter *padapter)
  21255. +{
  21256. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  21257. +
  21258. + //set_opmode_cmd(padapter, infra_client_with_mlme);//removed
  21259. +
  21260. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  21261. +
  21262. + return _SUCCESS;
  21263. +}
  21264. +
  21265. +static void init_mlme_ext_priv_value(_adapter* padapter)
  21266. +{
  21267. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  21268. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  21269. +
  21270. + //unsigned char default_channel_set[MAX_CHANNEL_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0};
  21271. + unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff};
  21272. + unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,};
  21273. +
  21274. + ATOMIC_SET(&pmlmeext->event_seq, 0);
  21275. + pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode
  21276. +#ifdef CONFIG_IEEE80211W
  21277. + pmlmeext->sa_query_seq = 0;
  21278. + pmlmeext->mgnt_80211w_IPN=0;
  21279. + pmlmeext->mgnt_80211w_IPN_rx=0;
  21280. +#endif //CONFIG_IEEE80211W
  21281. + pmlmeext->cur_channel = padapter->registrypriv.channel;
  21282. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  21283. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  21284. +
  21285. + pmlmeext->retry = 0;
  21286. +
  21287. + pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode;
  21288. +
  21289. + //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len);
  21290. + //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, MAX_CHANNEL_NUM);
  21291. + _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
  21292. + _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
  21293. +
  21294. + if(pmlmeext->cur_channel > 14)
  21295. + pmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB;
  21296. + else
  21297. + pmlmeext->tx_rate = IEEE80211_CCK_RATE_1MB;
  21298. +
  21299. + pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
  21300. + pmlmeext->sitesurvey_res.channel_idx = 0;
  21301. + pmlmeext->sitesurvey_res.bss_cnt = 0;
  21302. + pmlmeext->scan_abort = _FALSE;
  21303. +
  21304. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  21305. + pmlmeinfo->reauth_count = 0;
  21306. + pmlmeinfo->reassoc_count = 0;
  21307. + pmlmeinfo->link_count = 0;
  21308. + pmlmeinfo->auth_seq = 0;
  21309. + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open;
  21310. + pmlmeinfo->key_index = 0;
  21311. + pmlmeinfo->iv = 0;
  21312. +
  21313. + pmlmeinfo->enc_algo = _NO_PRIVACY_;
  21314. + pmlmeinfo->authModeToggle = 0;
  21315. +
  21316. + _rtw_memset(pmlmeinfo->chg_txt, 0, 128);
  21317. +
  21318. + pmlmeinfo->slotTime = SHORT_SLOT_TIME;
  21319. + pmlmeinfo->preamble_mode = PREAMBLE_AUTO;
  21320. +
  21321. + pmlmeinfo->dialogToken = 0;
  21322. +
  21323. + pmlmeext->action_public_rxseq = 0xffff;
  21324. + pmlmeext->action_public_dialog_token = 0xff;
  21325. +}
  21326. +
  21327. +static int has_channel(RT_CHANNEL_INFO *channel_set,
  21328. + u8 chanset_size,
  21329. + u8 chan) {
  21330. + int i;
  21331. +
  21332. + for (i = 0; i < chanset_size; i++) {
  21333. + if (channel_set[i].ChannelNum == chan) {
  21334. + return 1;
  21335. + }
  21336. + }
  21337. +
  21338. + return 0;
  21339. +}
  21340. +
  21341. +static void init_channel_list(_adapter *padapter, RT_CHANNEL_INFO *channel_set,
  21342. + u8 chanset_size,
  21343. + struct p2p_channels *channel_list) {
  21344. +
  21345. + struct p2p_oper_class_map op_class[] = {
  21346. + { IEEE80211G, 81, 1, 13, 1, BW20 },
  21347. + { IEEE80211G, 82, 14, 14, 1, BW20 },
  21348. +#if 0 /* Do not enable HT40 on 2 GHz */
  21349. + { IEEE80211G, 83, 1, 9, 1, BW40PLUS },
  21350. + { IEEE80211G, 84, 5, 13, 1, BW40MINUS },
  21351. +#endif
  21352. + { IEEE80211A, 115, 36, 48, 4, BW20 },
  21353. + { IEEE80211A, 116, 36, 44, 8, BW40PLUS },
  21354. + { IEEE80211A, 117, 40, 48, 8, BW40MINUS },
  21355. + { IEEE80211A, 124, 149, 161, 4, BW20 },
  21356. + { IEEE80211A, 125, 149, 169, 4, BW20 },
  21357. + { IEEE80211A, 126, 149, 157, 8, BW40PLUS },
  21358. + { IEEE80211A, 127, 153, 161, 8, BW40MINUS },
  21359. + { -1, 0, 0, 0, 0, BW20 }
  21360. + };
  21361. +
  21362. + int cla, op;
  21363. +
  21364. + cla = 0;
  21365. +
  21366. + for (op = 0; op_class[op].op_class; op++) {
  21367. + u8 ch;
  21368. + struct p2p_oper_class_map *o = &op_class[op];
  21369. + struct p2p_reg_class *reg = NULL;
  21370. +
  21371. + for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
  21372. + if (!has_channel(channel_set, chanset_size, ch)) {
  21373. + continue;
  21374. + }
  21375. +
  21376. + if ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc))
  21377. + continue;
  21378. +
  21379. + if ((0 == (padapter->registrypriv.cbw40_enable & BIT(1))) &&
  21380. + ((BW40MINUS == o->bw) || (BW40PLUS == o->bw)))
  21381. + continue;
  21382. +
  21383. + if (reg == NULL) {
  21384. + reg = &channel_list->reg_class[cla];
  21385. + cla++;
  21386. + reg->reg_class = o->op_class;
  21387. + reg->channels = 0;
  21388. + }
  21389. + reg->channel[reg->channels] = ch;
  21390. + reg->channels++;
  21391. + }
  21392. + }
  21393. + channel_list->reg_classes = cla;
  21394. +
  21395. +}
  21396. +
  21397. +static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set)
  21398. +{
  21399. + u8 index,chanset_size = 0;
  21400. + u8 b5GBand = _FALSE, b2_4GBand = _FALSE;
  21401. + u8 Index2G = 0, Index5G=0;
  21402. +
  21403. + _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM);
  21404. +
  21405. + if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX && ChannelPlan != RT_CHANNEL_DOMAIN_REALTEK_DEFINE)
  21406. + {
  21407. + DBG_871X("ChannelPlan ID %x error !!!!!\n",ChannelPlan);
  21408. + return chanset_size;
  21409. + }
  21410. +
  21411. + if(padapter->registrypriv.wireless_mode & WIRELESS_11G)
  21412. + {
  21413. + b2_4GBand = _TRUE;
  21414. + if(RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan)
  21415. + Index2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G;
  21416. + else
  21417. + Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G;
  21418. + }
  21419. +
  21420. + if(padapter->registrypriv.wireless_mode & WIRELESS_11A)
  21421. + {
  21422. + b5GBand = _TRUE;
  21423. + if(RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan)
  21424. + Index5G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index5G;
  21425. + else
  21426. + Index5G = RTW_ChannelPlanMap[ChannelPlan].Index5G;
  21427. + }
  21428. +
  21429. + if(b2_4GBand)
  21430. + {
  21431. + for(index=0;index<RTW_ChannelPlan2G[Index2G].Len;index++)
  21432. + {
  21433. + channel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index];
  21434. +
  21435. + if(RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == ChannelPlan) //Channel 1~11 is active, and 12~14 is passive
  21436. + {
  21437. + if(channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11)
  21438. + channel_set[chanset_size].ScanType = SCAN_ACTIVE;
  21439. + else if((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14))
  21440. + channel_set[chanset_size].ScanType = SCAN_PASSIVE;
  21441. + }
  21442. + else if(RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan ||
  21443. + RT_CHANNEL_DOMAIN_WORLD_WIDE_5G == ChannelPlan ||
  21444. + RT_CHANNEL_DOMAIN_2G_WORLD == Index2G)// channel 12~13, passive scan
  21445. + {
  21446. + if(channel_set[chanset_size].ChannelNum <= 11)
  21447. + channel_set[chanset_size].ScanType = SCAN_ACTIVE;
  21448. + else
  21449. + channel_set[chanset_size].ScanType = SCAN_PASSIVE;
  21450. + }
  21451. + else
  21452. + {
  21453. + channel_set[chanset_size].ScanType = SCAN_ACTIVE;
  21454. + }
  21455. +
  21456. + chanset_size++;
  21457. + }
  21458. + }
  21459. +
  21460. + if(b5GBand)
  21461. + {
  21462. + for(index=0;index<RTW_ChannelPlan5G[Index5G].Len;index++)
  21463. + {
  21464. +#ifdef CONFIG_DFS
  21465. + channel_set[chanset_size].ChannelNum = RTW_ChannelPlan5G[Index5G].Channel[index];
  21466. + if ( channel_set[chanset_size].ChannelNum <= 48
  21467. + || channel_set[chanset_size].ChannelNum >= 149 )
  21468. + {
  21469. + if(RT_CHANNEL_DOMAIN_WORLD_WIDE_5G == ChannelPlan)//passive scan for all 5G channels
  21470. + channel_set[chanset_size].ScanType = SCAN_PASSIVE;
  21471. + else
  21472. + channel_set[chanset_size].ScanType = SCAN_ACTIVE;
  21473. + }
  21474. + else
  21475. + {
  21476. + channel_set[chanset_size].ScanType = SCAN_PASSIVE;
  21477. + }
  21478. + chanset_size++;
  21479. +#else /* CONFIG_DFS */
  21480. + if ( RTW_ChannelPlan5G[Index5G].Channel[index] <= 48
  21481. + || RTW_ChannelPlan5G[Index5G].Channel[index] >= 149 ) {
  21482. + channel_set[chanset_size].ChannelNum = RTW_ChannelPlan5G[Index5G].Channel[index];
  21483. + if(RT_CHANNEL_DOMAIN_WORLD_WIDE_5G == ChannelPlan)//passive scan for all 5G channels
  21484. + channel_set[chanset_size].ScanType = SCAN_PASSIVE;
  21485. + else
  21486. + channel_set[chanset_size].ScanType = SCAN_ACTIVE;
  21487. + DBG_871X("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum);
  21488. + chanset_size++;
  21489. + }
  21490. +#endif /* CONFIG_DFS */
  21491. + }
  21492. + }
  21493. +
  21494. + return chanset_size;
  21495. +}
  21496. +
  21497. +int init_mlme_ext_priv(_adapter* padapter)
  21498. +{
  21499. + int res = _SUCCESS;
  21500. + struct registry_priv* pregistrypriv = &padapter->registrypriv;
  21501. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  21502. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  21503. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  21504. +
  21505. + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
  21506. + //_rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv));
  21507. +
  21508. + pmlmeext->padapter = padapter;
  21509. +
  21510. + //fill_fwpriv(padapter, &(pmlmeext->fwpriv));
  21511. +
  21512. + init_mlme_ext_priv_value(padapter);
  21513. + pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq;
  21514. +
  21515. + init_mlme_ext_timer(padapter);
  21516. +
  21517. +#ifdef CONFIG_AP_MODE
  21518. + init_mlme_ap_info(padapter);
  21519. +#endif
  21520. +
  21521. + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set);
  21522. + init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list);
  21523. +
  21524. + pmlmeext->chan_scan_time = SURVEY_TO;
  21525. + pmlmeext->mlmeext_init = _TRUE;
  21526. +
  21527. +
  21528. +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  21529. + pmlmeext->active_keep_alive_check = _TRUE;
  21530. +#endif
  21531. +
  21532. + return res;
  21533. +
  21534. +}
  21535. +
  21536. +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext)
  21537. +{
  21538. + _adapter *padapter = pmlmeext->padapter;
  21539. +
  21540. + if (!padapter)
  21541. + return;
  21542. +
  21543. + if (padapter->bDriverStopped == _TRUE)
  21544. + {
  21545. + _cancel_timer_ex(&pmlmeext->survey_timer);
  21546. + _cancel_timer_ex(&pmlmeext->link_timer);
  21547. + //_cancel_timer_ex(&pmlmeext->ADDBA_timer);
  21548. + }
  21549. +}
  21550. +
  21551. +static u8 cmp_pkt_chnl_diff(_adapter *padapter,u8* pframe,uint packet_len)
  21552. +{ // if the channel is same, return 0. else return channel differential
  21553. + uint len;
  21554. + u8 channel;
  21555. + u8 *p;
  21556. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, _DSSET_IE_, &len, packet_len - _BEACON_IE_OFFSET_);
  21557. + if (p)
  21558. + {
  21559. + channel = *(p + 2);
  21560. + if(padapter->mlmeextpriv.cur_channel >= channel)
  21561. + {
  21562. + return (padapter->mlmeextpriv.cur_channel - channel);
  21563. + }
  21564. + else
  21565. + {
  21566. + return (channel-padapter->mlmeextpriv.cur_channel);
  21567. + }
  21568. + }
  21569. + else
  21570. + {
  21571. + return 0;
  21572. + }
  21573. +}
  21574. +
  21575. +static void _mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, union recv_frame *precv_frame)
  21576. +{
  21577. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  21578. + u8 *pframe = precv_frame->u.hdr.rx_data;
  21579. +
  21580. + if(ptable->func)
  21581. + {
  21582. + //receive the frames that ra(a1) is my address or ra(a1) is bc address.
  21583. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) &&
  21584. + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN))
  21585. + {
  21586. + return;
  21587. + }
  21588. +
  21589. + ptable->func(padapter, precv_frame);
  21590. + }
  21591. +
  21592. +}
  21593. +
  21594. +void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame)
  21595. +{
  21596. + int index;
  21597. + struct mlme_handler *ptable;
  21598. +#ifdef CONFIG_AP_MODE
  21599. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  21600. +#endif //CONFIG_AP_MODE
  21601. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  21602. + u8 *pframe = precv_frame->u.hdr.rx_data;
  21603. + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe));
  21604. +
  21605. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
  21606. + ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n",
  21607. + GetFrameType(pframe), GetFrameSubType(pframe)));
  21608. +
  21609. +#if 0
  21610. + {
  21611. + u8 *pbuf;
  21612. + pbuf = GetAddr1Ptr(pframe);
  21613. + DBG_871X("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));
  21614. + pbuf = GetAddr2Ptr(pframe);
  21615. + DBG_871X("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));
  21616. + pbuf = GetAddr3Ptr(pframe);
  21617. + DBG_871X("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));
  21618. + }
  21619. +#endif
  21620. +
  21621. + if (GetFrameType(pframe) != WIFI_MGT_TYPE)
  21622. + {
  21623. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("mgt_dispatcher: type(0x%x) error!\n", GetFrameType(pframe)));
  21624. + return;
  21625. + }
  21626. +
  21627. + //receive the frames that ra(a1) is my address or ra(a1) is bc address.
  21628. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) &&
  21629. + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN))
  21630. + {
  21631. + return;
  21632. + }
  21633. +
  21634. + ptable = mlme_sta_tbl;
  21635. +
  21636. + index = GetFrameSubType(pframe) >> 4;
  21637. +
  21638. +#ifdef CONFIG_TDLS
  21639. + if((index << 4)==WIFI_ACTION){
  21640. + //category==RTW_WLAN_CATEGORY_PUBLIC, action==TDLS_DISCOVERY_RESPONSE
  21641. + if(*(pframe + IEEE80211_MGMT_HDR_LEN ) == RTW_WLAN_CATEGORY_PUBLIC
  21642. + && *(pframe + IEEE80211_MGMT_HDR_LEN + 1) == TDLS_DISCOVERY_RESPONSE )
  21643. + {
  21644. + DBG_871X("recv tdls discovery response frame\n");
  21645. + On_TDLS_Dis_Rsp(padapter, precv_frame);
  21646. + }
  21647. + }
  21648. +#endif //CONFIG_TDLS
  21649. +
  21650. + if (index > 13)
  21651. + {
  21652. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index));
  21653. + return;
  21654. + }
  21655. + ptable += index;
  21656. +
  21657. +#if 1
  21658. + if (psta != NULL)
  21659. + {
  21660. + if (GetRetry(pframe))
  21661. + {
  21662. + if (precv_frame->u.hdr.attrib.seq_num == psta->RxMgmtFrameSeqNum)
  21663. + {
  21664. + /* drop the duplicate management frame */
  21665. + DBG_871X("Drop duplicate management frame with seq_num = %d.\n", precv_frame->u.hdr.attrib.seq_num);
  21666. + return;
  21667. + }
  21668. + }
  21669. + psta->RxMgmtFrameSeqNum = precv_frame->u.hdr.attrib.seq_num;
  21670. + }
  21671. +#else
  21672. +
  21673. + if(GetRetry(pframe))
  21674. + {
  21675. + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n"));
  21676. + //return;
  21677. + }
  21678. +#endif
  21679. +
  21680. +#ifdef CONFIG_AP_MODE
  21681. + switch (GetFrameSubType(pframe))
  21682. + {
  21683. + case WIFI_AUTH:
  21684. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  21685. + ptable->func = &OnAuth;
  21686. + else
  21687. + ptable->func = &OnAuthClient;
  21688. + //pass through
  21689. + case WIFI_ASSOCREQ:
  21690. + case WIFI_REASSOCREQ:
  21691. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21692. +#ifdef CONFIG_HOSTAPD_MLME
  21693. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  21694. + rtw_hostapd_mlme_rx(padapter, precv_frame);
  21695. +#endif
  21696. + break;
  21697. + case WIFI_PROBEREQ:
  21698. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  21699. + {
  21700. +#ifdef CONFIG_HOSTAPD_MLME
  21701. + rtw_hostapd_mlme_rx(padapter, precv_frame);
  21702. +#else
  21703. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21704. +#endif
  21705. + }
  21706. + else
  21707. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21708. + break;
  21709. + case WIFI_BEACON:
  21710. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21711. + break;
  21712. + case WIFI_ACTION:
  21713. + //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  21714. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21715. + break;
  21716. + default:
  21717. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21718. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  21719. + rtw_hostapd_mlme_rx(padapter, precv_frame);
  21720. + break;
  21721. + }
  21722. +#else
  21723. +
  21724. + _mgt_dispatcher(padapter, ptable, precv_frame);
  21725. +
  21726. +#endif
  21727. +
  21728. +}
  21729. +
  21730. +#ifdef CONFIG_P2P
  21731. +u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da)
  21732. +{
  21733. + bool response = _TRUE;
  21734. +
  21735. +#ifdef CONFIG_IOCTL_CFG80211
  21736. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  21737. + {
  21738. + if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _FALSE
  21739. + || padapter->mlmepriv.wps_probe_resp_ie == NULL
  21740. + || padapter->mlmepriv.p2p_probe_resp_ie == NULL
  21741. + )
  21742. + {
  21743. + DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n",
  21744. + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled,
  21745. + padapter->mlmepriv.wps_probe_resp_ie,
  21746. + padapter->mlmepriv.p2p_probe_resp_ie);
  21747. + response = _FALSE;
  21748. + }
  21749. + }
  21750. + else
  21751. +#endif //CONFIG_IOCTL_CFG80211
  21752. + if( padapter->wdinfo.driver_interface == DRIVER_WEXT )
  21753. + {
  21754. + // do nothing if the device name is empty
  21755. + if ( !padapter->wdinfo.device_name_len )
  21756. + {
  21757. + response = _FALSE;
  21758. + }
  21759. + }
  21760. +
  21761. + if (response == _TRUE)
  21762. + issue_probersp_p2p( padapter, da);
  21763. +
  21764. + return _SUCCESS;
  21765. +}
  21766. +#endif //CONFIG_P2P
  21767. +
  21768. +
  21769. +/****************************************************************************
  21770. +
  21771. +Following are the callback functions for each subtype of the management frames
  21772. +
  21773. +*****************************************************************************/
  21774. +
  21775. +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame)
  21776. +{
  21777. + unsigned int ielen;
  21778. + unsigned char *p;
  21779. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  21780. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  21781. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  21782. + WLAN_BSSID_EX *cur = &(pmlmeinfo->network);
  21783. + u8 *pframe = precv_frame->u.hdr.rx_data;
  21784. + uint len = precv_frame->u.hdr.len;
  21785. + u8 is_valid_p2p_probereq = _FALSE;
  21786. +
  21787. +#ifdef CONFIG_P2P
  21788. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  21789. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  21790. + u8 wifi_test_chk_rate = 1;
  21791. +
  21792. + if ( !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
  21793. + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) &&
  21794. + !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) &&
  21795. + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) &&
  21796. + !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)
  21797. + )
  21798. + {
  21799. + // Commented by Albert 2011/03/17
  21800. + // mcs_rate = 0 -> CCK 1M rate
  21801. + // mcs_rate = 1 -> CCK 2M rate
  21802. + // mcs_rate = 2 -> CCK 5.5M rate
  21803. + // mcs_rate = 3 -> CCK 11M rate
  21804. + // In the P2P mode, the driver should not support the CCK rate
  21805. +
  21806. + // Commented by Kurt 2012/10/16
  21807. + // IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client
  21808. +#ifdef CONFIG_WIFI_TEST
  21809. + if ( pattrib->mcs_rate <= 3 )
  21810. + {
  21811. + wifi_test_chk_rate = 0;
  21812. + }
  21813. +#endif //CONFIG_WIFI_TEST
  21814. +
  21815. + if( wifi_test_chk_rate == 1 )
  21816. + {
  21817. + if((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE)
  21818. + {
  21819. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))
  21820. + {
  21821. + p2p_listen_state_process( padapter, get_sa(pframe));
  21822. +
  21823. + return _SUCCESS;
  21824. + }
  21825. +
  21826. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  21827. + {
  21828. + goto _continue;
  21829. + }
  21830. + }
  21831. + }
  21832. + }
  21833. +
  21834. +_continue:
  21835. +#endif //CONFIG_P2P
  21836. +
  21837. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
  21838. + {
  21839. + return _SUCCESS;
  21840. + }
  21841. +
  21842. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE &&
  21843. + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE)
  21844. + {
  21845. + return _SUCCESS;
  21846. + }
  21847. +
  21848. +
  21849. + //DBG_871X("+OnProbeReq\n");
  21850. +
  21851. +#ifdef CONFIG_AUTO_AP_MODE
  21852. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE &&
  21853. + pmlmepriv->cur_network.join_res == _TRUE)
  21854. + {
  21855. + _irqL irqL;
  21856. + struct sta_info *psta;
  21857. + u8 *mac_addr, *peer_addr;
  21858. + struct sta_priv *pstapriv = &padapter->stapriv;
  21859. + u8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A};
  21860. + //EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2]
  21861. +
  21862. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, (int *)&ielen,
  21863. + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);
  21864. +
  21865. + if(!p || ielen !=14)
  21866. + goto _non_rc_device;
  21867. +
  21868. + if(!_rtw_memcmp(p+2, RC_OUI, sizeof(RC_OUI)))
  21869. + goto _non_rc_device;
  21870. +
  21871. + if(!_rtw_memcmp(p+6, get_sa(pframe), ETH_ALEN))
  21872. + {
  21873. + DBG_871X("%s, do rc pairing ("MAC_FMT"), but mac addr mismatch!("MAC_FMT")\n", __FUNCTION__,
  21874. + MAC_ARG(get_sa(pframe)), MAC_ARG(p+6));
  21875. +
  21876. + goto _non_rc_device;
  21877. + }
  21878. +
  21879. + DBG_871X("%s, got the pairing device("MAC_FMT")\n", __FUNCTION__, MAC_ARG(get_sa(pframe)));
  21880. +
  21881. + //new a station
  21882. + psta = rtw_get_stainfo(pstapriv, get_sa(pframe));
  21883. + if (psta == NULL)
  21884. + {
  21885. + // allocate a new one
  21886. + DBG_871X("going to alloc stainfo for rc="MAC_FMT"\n", MAC_ARG(get_sa(pframe)));
  21887. + psta = rtw_alloc_stainfo(pstapriv, get_sa(pframe));
  21888. + if (psta == NULL)
  21889. + {
  21890. + //TODO:
  21891. + DBG_871X(" Exceed the upper limit of supported clients...\n");
  21892. + return _SUCCESS;
  21893. + }
  21894. +
  21895. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  21896. + if (rtw_is_list_empty(&psta->asoc_list))
  21897. + {
  21898. + psta->expire_to = pstapriv->expire_to;
  21899. + rtw_list_insert_tail(&psta->asoc_list, &pstapriv->asoc_list);
  21900. + pstapriv->asoc_list_cnt++;
  21901. + }
  21902. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  21903. +
  21904. + //generate pairing ID
  21905. + mac_addr = myid(&(padapter->eeprompriv));
  21906. + peer_addr = psta->hwaddr;
  21907. + psta->pid = (u16)(((mac_addr[4]<<8) + mac_addr[5]) + ((peer_addr[4]<<8) + peer_addr[5]));
  21908. +
  21909. + //update peer stainfo
  21910. + psta->isrc = _TRUE;
  21911. + //psta->aid = 0;
  21912. + //psta->mac_id = 2;
  21913. +
  21914. + /* get a unique AID */
  21915. + if (psta->aid > 0) {
  21916. + DBG_871X("old AID %d\n", psta->aid);
  21917. + } else {
  21918. + for (psta->aid = 1; psta->aid <= NUM_STA; psta->aid++)
  21919. + if (pstapriv->sta_aid[psta->aid - 1] == NULL)
  21920. + break;
  21921. +
  21922. + if (psta->aid > pstapriv->max_num_sta) {
  21923. + psta->aid = 0;
  21924. + DBG_871X("no room for more AIDs\n");
  21925. + return _SUCCESS;
  21926. + } else {
  21927. + pstapriv->sta_aid[psta->aid - 1] = psta;
  21928. + DBG_871X("allocate new AID = (%d)\n", psta->aid);
  21929. + }
  21930. + }
  21931. +
  21932. + psta->qos_option = 1;
  21933. + psta->htpriv.ht_option = _TRUE;
  21934. + psta->ieee8021x_blocked = _FALSE;
  21935. + psta->htpriv.ampdu_enable = _FALSE;
  21936. + psta->htpriv.sgi = _FALSE;
  21937. + psta->htpriv.bwmode = HT_CHANNEL_WIDTH_20;
  21938. + psta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  21939. +
  21940. + //rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE);
  21941. +
  21942. + psta->htpriv.agg_enable_bitmap = 0x0;//reset
  21943. + psta->htpriv.candidate_tid_bitmap = 0x0;//reset
  21944. +
  21945. + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));
  21946. +
  21947. + _enter_critical_bh(&psta->lock, &irqL);
  21948. + psta->state |= _FW_LINKED;
  21949. + _exit_critical_bh(&psta->lock, &irqL);
  21950. +
  21951. + report_add_sta_event(padapter, psta->hwaddr, psta->aid);
  21952. +
  21953. + }
  21954. +
  21955. + issue_probersp(padapter, get_sa(pframe), _FALSE);
  21956. +
  21957. + return _SUCCESS;
  21958. +
  21959. + }
  21960. +
  21961. +_non_rc_device:
  21962. +
  21963. + return _SUCCESS;
  21964. +#endif //CONFIG_AUTO_AP_MODE
  21965. +
  21966. +
  21967. +#ifdef CONFIG_CONCURRENT_MODE
  21968. + if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  21969. + check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))
  21970. + {
  21971. + //don't process probe req
  21972. + return _SUCCESS;
  21973. + }
  21974. +#endif
  21975. +
  21976. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen,
  21977. + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);
  21978. +
  21979. +
  21980. + //check (wildcard) SSID
  21981. + if (p != NULL)
  21982. + {
  21983. + if(is_valid_p2p_probereq == _TRUE)
  21984. + {
  21985. + goto _issue_probersp;
  21986. + }
  21987. +
  21988. + if ( (ielen != 0 && _FALSE ==_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, cur->Ssid.SsidLength))
  21989. + || (ielen == 0 && pmlmeinfo->hidden_ssid_mode)
  21990. + )
  21991. + {
  21992. + return _SUCCESS;
  21993. + }
  21994. +
  21995. +_issue_probersp:
  21996. +
  21997. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE &&
  21998. + pmlmepriv->cur_network.join_res == _TRUE)
  21999. + {
  22000. + //DBG_871X("+issue_probersp during ap mode\n");
  22001. + issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq);
  22002. + }
  22003. +
  22004. + }
  22005. +
  22006. + return _SUCCESS;
  22007. +
  22008. +}
  22009. +
  22010. +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame)
  22011. +{
  22012. + struct sta_info *psta;
  22013. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  22014. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  22015. + struct sta_priv *pstapriv = &padapter->stapriv;
  22016. + u8 *pframe = precv_frame->u.hdr.rx_data;
  22017. +#ifdef CONFIG_P2P
  22018. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  22019. +#endif
  22020. +
  22021. +
  22022. +#ifdef CONFIG_P2P
  22023. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
  22024. + {
  22025. + if ( _TRUE == pwdinfo->tx_prov_disc_info.benable )
  22026. + {
  22027. + if( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) )
  22028. + {
  22029. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))
  22030. + {
  22031. + pwdinfo->tx_prov_disc_info.benable = _FALSE;
  22032. + issue_p2p_provision_request( padapter,
  22033. + pwdinfo->tx_prov_disc_info.ssid.Ssid,
  22034. + pwdinfo->tx_prov_disc_info.ssid.SsidLength,
  22035. + pwdinfo->tx_prov_disc_info.peerDevAddr );
  22036. + }
  22037. + else if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
  22038. + {
  22039. + pwdinfo->tx_prov_disc_info.benable = _FALSE;
  22040. + issue_p2p_provision_request( padapter,
  22041. + NULL,
  22042. + 0,
  22043. + pwdinfo->tx_prov_disc_info.peerDevAddr );
  22044. + }
  22045. + }
  22046. + }
  22047. + return _SUCCESS;
  22048. + }
  22049. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
  22050. + {
  22051. + if ( _TRUE == pwdinfo->nego_req_info.benable )
  22052. + {
  22053. + DBG_871X( "[%s] P2P State is GONEGO ING!\n", __FUNCTION__ );
  22054. + if( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) )
  22055. + {
  22056. + pwdinfo->nego_req_info.benable = _FALSE;
  22057. + issue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr);
  22058. + }
  22059. + }
  22060. + }
  22061. + else if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) )
  22062. + {
  22063. + if ( _TRUE == pwdinfo->invitereq_info.benable )
  22064. + {
  22065. + DBG_871X( "[%s] P2P_STATE_TX_INVITE_REQ!\n", __FUNCTION__ );
  22066. + if( _rtw_memcmp( pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN ) )
  22067. + {
  22068. + pwdinfo->invitereq_info.benable = _FALSE;
  22069. + issue_p2p_invitation_request( padapter, pwdinfo->invitereq_info.peer_macaddr );
  22070. + }
  22071. + }
  22072. + }
  22073. +#endif
  22074. +
  22075. +
  22076. + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
  22077. + {
  22078. + report_survey_event(padapter, precv_frame);
  22079. +#ifdef CONFIG_CONCURRENT_MODE
  22080. + report_survey_event(padapter->pbuddy_adapter, precv_frame);
  22081. +#endif
  22082. +#ifdef CONFIG_DUALMAC_CONCURRENT
  22083. + dc_report_survey_event(padapter, precv_frame);
  22084. +#endif
  22085. + return _SUCCESS;
  22086. + }
  22087. +
  22088. + #if 0 //move to validate_recv_mgnt_frame
  22089. + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))
  22090. + {
  22091. + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
  22092. + {
  22093. + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)
  22094. + {
  22095. + psta->sta_stats.rx_mgnt_pkts++;
  22096. + }
  22097. + }
  22098. + }
  22099. + #endif
  22100. +
  22101. + return _SUCCESS;
  22102. +
  22103. +}
  22104. +
  22105. +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame)
  22106. +{
  22107. + int cam_idx;
  22108. + struct sta_info *psta;
  22109. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  22110. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  22111. + struct sta_priv *pstapriv = &padapter->stapriv;
  22112. + u8 *pframe = precv_frame->u.hdr.rx_data;
  22113. + uint len = precv_frame->u.hdr.len;
  22114. + u8 *p = NULL;
  22115. + u32 ielen = 0;
  22116. +
  22117. +#ifdef CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR
  22118. + p = rtw_get_ie(pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ielen, precv_frame->u.hdr.len -sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_);
  22119. + if ((p != NULL) && (ielen > 0))
  22120. + {
  22121. + if ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D))
  22122. + {
  22123. + /* Invalid value 0x2D is detected in Extended Supported Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon parsing. */
  22124. + DBG_871X("[WIFIDBG] Error in ESR IE is detected in Beacon of BSSID:"MAC_FMT". Fix the length of ESR IE to avoid failed Beacon parsing.\n", MAC_ARG(GetAddr3Ptr(pframe)));
  22125. + *(p + 1) = ielen - 1;
  22126. + }
  22127. + }
  22128. +#endif
  22129. +
  22130. + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
  22131. + {
  22132. + report_survey_event(padapter, precv_frame);
  22133. +#ifdef CONFIG_CONCURRENT_MODE
  22134. + report_survey_event(padapter->pbuddy_adapter, precv_frame);
  22135. +#endif
  22136. +
  22137. +#ifdef CONFIG_DUALMAC_CONCURRENT
  22138. + dc_report_survey_event(padapter, precv_frame);
  22139. +#endif
  22140. +
  22141. + return _SUCCESS;
  22142. + }
  22143. +
  22144. + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))
  22145. + {
  22146. + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL)
  22147. + {
  22148. + //check the vendor of the assoc AP
  22149. + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct rtw_ieee80211_hdr_3addr), len-sizeof(struct rtw_ieee80211_hdr_3addr));
  22150. +#ifdef CONFIG_P2P_PS
  22151. + // do P2P PS Before link ? , ToDo
  22152. + //process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));
  22153. +#endif // CONFIG_P2P_PS
  22154. +
  22155. + //update TSF Value
  22156. + update_TSF(pmlmeext, pframe, len);
  22157. +
  22158. + //start auth
  22159. + start_clnt_auth(padapter);
  22160. +
  22161. + return _SUCCESS;
  22162. + }
  22163. +
  22164. + if(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
  22165. + {
  22166. + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)
  22167. + {
  22168. + #ifdef CONFIG_PATCH_JOIN_WRONG_CHANNEL
  22169. + //Merge from 8712 FW code
  22170. + if (cmp_pkt_chnl_diff(padapter,pframe,len) != 0)
  22171. + { // join wrong channel, deauth and reconnect
  22172. + issue_deauth(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_DEAUTH_LEAVING);
  22173. +
  22174. + report_del_sta_event(padapter,(&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL);
  22175. + pmlmeinfo->state &= (~WIFI_FW_ASSOC_SUCCESS);
  22176. + return _SUCCESS;
  22177. + }
  22178. + #endif //CONFIG_PATCH_JOIN_WRONG_CHANNEL
  22179. +
  22180. + //update WMM, ERP in the beacon
  22181. + //todo: the timer is used instead of the number of the beacon received
  22182. + if ((sta_rx_pkts(psta) & 0xf) == 0)
  22183. + {
  22184. + //DBG_871X("update_bcn_info\n");
  22185. + update_beacon_info(padapter, pframe, len, psta);
  22186. + }
  22187. +
  22188. +#ifdef CONFIG_DFS
  22189. + process_csa_ie(padapter, pframe, len); //channel switch announcement
  22190. +#endif //CONFIG_DFS
  22191. +
  22192. +#ifdef CONFIG_P2P_PS
  22193. + //if(psta->ieee8021x_blocked == _FALSE) // do not allow P2P PS during EAPOL handshake ?
  22194. + process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));
  22195. +#endif //CONFIG_P2P_PS
  22196. +
  22197. + #if 0 //move to validate_recv_mgnt_frame
  22198. + psta->sta_stats.rx_mgnt_pkts++;
  22199. + #endif
  22200. + }
  22201. + }
  22202. + else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  22203. + {
  22204. + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)
  22205. + {
  22206. + //update WMM, ERP in the beacon
  22207. + //todo: the timer is used instead of the number of the beacon received
  22208. + if ((sta_rx_pkts(psta) & 0xf) == 0)
  22209. + {
  22210. + //DBG_871X("update_bcn_info\n");
  22211. + update_beacon_info(padapter, pframe, len, psta);
  22212. + }
  22213. +
  22214. + #if 0 //move to validate_recv_mgnt_frame
  22215. + psta->sta_stats.rx_mgnt_pkts++;
  22216. + #endif
  22217. + }
  22218. + else
  22219. + {
  22220. + //allocate a new CAM entry for IBSS station
  22221. + if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA)
  22222. + {
  22223. + goto _END_ONBEACON_;
  22224. + }
  22225. +
  22226. + //get supported rate
  22227. + if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL)
  22228. + {
  22229. + pmlmeinfo->FW_sta_info[cam_idx].status = 0;
  22230. + goto _END_ONBEACON_;
  22231. + }
  22232. +
  22233. + //update TSF Value
  22234. + update_TSF(pmlmeext, pframe, len);
  22235. +
  22236. + //report sta add event
  22237. + report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx);
  22238. + }
  22239. + }
  22240. + }
  22241. +
  22242. +_END_ONBEACON_:
  22243. +
  22244. + return _SUCCESS;
  22245. +
  22246. +}
  22247. +
  22248. +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame)
  22249. +{
  22250. +#ifdef CONFIG_AP_MODE
  22251. + _irqL irqL;
  22252. + unsigned int auth_mode, seq, ie_len;
  22253. + unsigned char *sa, *p;
  22254. + u16 algorithm;
  22255. + int status;
  22256. + static struct sta_info stat;
  22257. + struct sta_info *pstat=NULL;
  22258. + struct sta_priv *pstapriv = &padapter->stapriv;
  22259. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  22260. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  22261. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  22262. + u8 *pframe = precv_frame->u.hdr.rx_data;
  22263. + uint len = precv_frame->u.hdr.len;
  22264. +
  22265. +
  22266. +#ifdef CONFIG_CONCURRENT_MODE
  22267. + if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  22268. + check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))
  22269. + {
  22270. + //don't process auth request;
  22271. + return _SUCCESS;
  22272. + }
  22273. +#endif //CONFIG_CONCURRENT_MODE
  22274. +
  22275. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  22276. + return _FAIL;
  22277. +
  22278. + DBG_871X("+OnAuth\n");
  22279. +
  22280. + sa = GetAddr2Ptr(pframe);
  22281. +
  22282. + auth_mode = psecuritypriv->dot11AuthAlgrthm;
  22283. + seq = cpu_to_le16(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + 2));
  22284. + algorithm = cpu_to_le16(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN));
  22285. +
  22286. + if (GetPrivacy(pframe))
  22287. + {
  22288. +#if 0 //TODO: SW rtw_wep_decrypt
  22289. + if (SWCRYPTO)
  22290. + {
  22291. + status = rtw_wep_decrypt(priv, pframe, pfrinfo->pktlen,
  22292. + priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm);
  22293. + if (status == FALSE)
  22294. + {
  22295. + SAVE_INT_AND_CLI(flags);
  22296. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"wep-decrypt a Auth frame error!\n");
  22297. + status = _STATS_CHALLENGE_FAIL_;
  22298. + goto auth_fail;
  22299. + }
  22300. + }
  22301. +
  22302. + seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4 + 2));
  22303. + algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4));
  22304. +#endif
  22305. + }
  22306. +
  22307. +
  22308. + DBG_871X("auth alg=%x, seq=%X\n", algorithm, seq);
  22309. +
  22310. + if (auth_mode == 2 &&
  22311. + psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ &&
  22312. + psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)
  22313. + auth_mode = 0;
  22314. +
  22315. + if ((algorithm > 0 && auth_mode == 0) || // rx a shared-key auth but shared not enabled
  22316. + (algorithm == 0 && auth_mode == 1) ) // rx a open-system auth but shared-key is enabled
  22317. + {
  22318. + DBG_871X("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n",
  22319. + algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]);
  22320. +
  22321. + status = _STATS_NO_SUPP_ALG_;
  22322. +
  22323. + goto auth_fail;
  22324. + }
  22325. +
  22326. +#if 0 //ACL control
  22327. + phead = &priv->wlan_acl_list;
  22328. + plist = phead->next;
  22329. + //check sa
  22330. + if (acl_mode == 1) // 1: positive check, only those on acl_list can be connected.
  22331. + res = FAIL;
  22332. + else
  22333. + res = SUCCESS;
  22334. +
  22335. + while(plist != phead)
  22336. + {
  22337. + paclnode = list_entry(plist, struct rtw_wlan_acl_node, list);
  22338. + plist = plist->next;
  22339. + if (!memcmp((void *)sa, paclnode->addr, 6)) {
  22340. + if (paclnode->mode & 2) { // deny
  22341. + res = FAIL;
  22342. + break;
  22343. + }
  22344. + else {
  22345. + res = SUCCESS;
  22346. + break;
  22347. + }
  22348. + }
  22349. + }
  22350. +
  22351. + if (res != SUCCESS) {
  22352. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"auth abort because ACL!\n");
  22353. + return FAIL;
  22354. + }
  22355. +#else
  22356. + if(rtw_access_ctrl(padapter, sa) == _FALSE)
  22357. + {
  22358. + status = _STATS_UNABLE_HANDLE_STA_;
  22359. + goto auth_fail;
  22360. + }
  22361. +#endif
  22362. +
  22363. + pstat = rtw_get_stainfo(pstapriv, sa);
  22364. + if (pstat == NULL)
  22365. + {
  22366. + // allocate a new one
  22367. + DBG_871X("going to alloc stainfo for sa="MAC_FMT"\n", MAC_ARG(sa));
  22368. + pstat = rtw_alloc_stainfo(pstapriv, sa);
  22369. + if (pstat == NULL)
  22370. + {
  22371. + DBG_871X(" Exceed the upper limit of supported clients...\n");
  22372. + status = _STATS_UNABLE_HANDLE_STA_;
  22373. + goto auth_fail;
  22374. + }
  22375. +
  22376. + pstat->state = WIFI_FW_AUTH_NULL;
  22377. + pstat->auth_seq = 0;
  22378. +
  22379. + //pstat->flags = 0;
  22380. + //pstat->capability = 0;
  22381. + }
  22382. + else
  22383. + {
  22384. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  22385. + if(rtw_is_list_empty(&pstat->asoc_list)==_FALSE)
  22386. + {
  22387. + rtw_list_delete(&pstat->asoc_list);
  22388. + pstapriv->asoc_list_cnt--;
  22389. + if (pstat->expire_to > 0)
  22390. + {
  22391. + //TODO: STA re_auth within expire_to
  22392. + }
  22393. + }
  22394. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  22395. +
  22396. + if (seq==1) {
  22397. + //TODO: STA re_auth and auth timeout
  22398. + }
  22399. + }
  22400. +
  22401. + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);
  22402. + if (rtw_is_list_empty(&pstat->auth_list))
  22403. + {
  22404. + rtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list);
  22405. + pstapriv->auth_list_cnt++;
  22406. + }
  22407. + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);
  22408. +
  22409. + if (pstat->auth_seq == 0)
  22410. + pstat->expire_to = pstapriv->auth_to;
  22411. +
  22412. + if ((pstat->auth_seq + 1) != seq)
  22413. + {
  22414. + DBG_871X("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n",
  22415. + seq, pstat->auth_seq+1);
  22416. + status = _STATS_OUT_OF_AUTH_SEQ_;
  22417. + goto auth_fail;
  22418. + }
  22419. +
  22420. + if (algorithm==0 && (auth_mode == 0 || auth_mode == 2))
  22421. + {
  22422. + if (seq == 1)
  22423. + {
  22424. + pstat->state &= ~WIFI_FW_AUTH_NULL;
  22425. + pstat->state |= WIFI_FW_AUTH_SUCCESS;
  22426. + pstat->expire_to = pstapriv->assoc_to;
  22427. + pstat->authalg = algorithm;
  22428. + }
  22429. + else
  22430. + {
  22431. + DBG_871X("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n",
  22432. + seq, pstat->auth_seq+1);
  22433. + status = _STATS_OUT_OF_AUTH_SEQ_;
  22434. + goto auth_fail;
  22435. + }
  22436. + }
  22437. + else // shared system or auto authentication
  22438. + {
  22439. + if (seq == 1)
  22440. + {
  22441. + //prepare for the challenging txt...
  22442. +
  22443. + //get_random_bytes((void *)pstat->chg_txt, 128);//TODO:
  22444. +
  22445. + pstat->state &= ~WIFI_FW_AUTH_NULL;
  22446. + pstat->state |= WIFI_FW_AUTH_STATE;
  22447. + pstat->authalg = algorithm;
  22448. + pstat->auth_seq = 2;
  22449. + }
  22450. + else if (seq == 3)
  22451. + {
  22452. + //checking for challenging txt...
  22453. + DBG_871X("checking for challenging txt...\n");
  22454. +
  22455. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len,
  22456. + len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4);
  22457. +
  22458. + if((p==NULL) || (ie_len<=0))
  22459. + {
  22460. + DBG_871X("auth rejected because challenge failure!(1)\n");
  22461. + status = _STATS_CHALLENGE_FAIL_;
  22462. + goto auth_fail;
  22463. + }
  22464. +
  22465. + if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128))
  22466. + {
  22467. + pstat->state &= (~WIFI_FW_AUTH_STATE);
  22468. + pstat->state |= WIFI_FW_AUTH_SUCCESS;
  22469. + // challenging txt is correct...
  22470. + pstat->expire_to = pstapriv->assoc_to;
  22471. + }
  22472. + else
  22473. + {
  22474. + DBG_871X("auth rejected because challenge failure!\n");
  22475. + status = _STATS_CHALLENGE_FAIL_;
  22476. + goto auth_fail;
  22477. + }
  22478. + }
  22479. + else
  22480. + {
  22481. + DBG_871X("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n",
  22482. + seq, pstat->auth_seq+1);
  22483. + status = _STATS_OUT_OF_AUTH_SEQ_;
  22484. + goto auth_fail;
  22485. + }
  22486. + }
  22487. +
  22488. +
  22489. + // Now, we are going to issue_auth...
  22490. + pstat->auth_seq = seq + 1;
  22491. +
  22492. +#ifdef CONFIG_NATIVEAP_MLME
  22493. + issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_));
  22494. +#endif
  22495. +
  22496. + if (pstat->state & WIFI_FW_AUTH_SUCCESS)
  22497. + pstat->auth_seq = 0;
  22498. +
  22499. +
  22500. + return _SUCCESS;
  22501. +
  22502. +auth_fail:
  22503. +
  22504. + if(pstat)
  22505. + rtw_free_stainfo(padapter , pstat);
  22506. +
  22507. + pstat = &stat;
  22508. + _rtw_memset((char *)pstat, '\0', sizeof(stat));
  22509. + pstat->auth_seq = 2;
  22510. + _rtw_memcpy(pstat->hwaddr, sa, 6);
  22511. +
  22512. +#ifdef CONFIG_NATIVEAP_MLME
  22513. + issue_auth(padapter, pstat, (unsigned short)status);
  22514. +#endif
  22515. +
  22516. +#endif
  22517. + return _FAIL;
  22518. +
  22519. +}
  22520. +
  22521. +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame)
  22522. +{
  22523. + unsigned int seq, len, status, algthm, offset;
  22524. + unsigned char *p;
  22525. + unsigned int go2asoc = 0;
  22526. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  22527. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  22528. + u8 *pframe = precv_frame->u.hdr.rx_data;
  22529. + uint pkt_len = precv_frame->u.hdr.len;
  22530. +
  22531. + DBG_871X("%s\n", __FUNCTION__);
  22532. +
  22533. + //check A1 matches or not
  22534. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN))
  22535. + return _SUCCESS;
  22536. +
  22537. + if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE))
  22538. + return _SUCCESS;
  22539. +
  22540. + offset = (GetPrivacy(pframe))? 4: 0;
  22541. +
  22542. + algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset));
  22543. + seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2));
  22544. + status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4));
  22545. +
  22546. + if (status != 0)
  22547. + {
  22548. + DBG_871X("clnt auth fail, status: %d\n", status);
  22549. + if(status == 13)//&& pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto)
  22550. + {
  22551. + if(pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
  22552. + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open;
  22553. + else
  22554. + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared;
  22555. + //pmlmeinfo->reauth_count = 0;
  22556. + }
  22557. +
  22558. + set_link_timer(pmlmeext, 1);
  22559. + goto authclnt_fail;
  22560. + }
  22561. +
  22562. + if (seq == 2)
  22563. + {
  22564. + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
  22565. + {
  22566. + // legendary shared system
  22567. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len,
  22568. + pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_);
  22569. +
  22570. + if (p == NULL)
  22571. + {
  22572. + //DBG_871X("marc: no challenge text?\n");
  22573. + goto authclnt_fail;
  22574. + }
  22575. +
  22576. + _rtw_memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len);
  22577. + pmlmeinfo->auth_seq = 3;
  22578. + issue_auth(padapter, NULL, 0);
  22579. + set_link_timer(pmlmeext, REAUTH_TO);
  22580. +
  22581. + return _SUCCESS;
  22582. + }
  22583. + else
  22584. + {
  22585. + // open system
  22586. + go2asoc = 1;
  22587. + }
  22588. + }
  22589. + else if (seq == 4)
  22590. + {
  22591. + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)
  22592. + {
  22593. + go2asoc = 1;
  22594. + }
  22595. + else
  22596. + {
  22597. + goto authclnt_fail;
  22598. + }
  22599. + }
  22600. + else
  22601. + {
  22602. + // this is also illegal
  22603. + //DBG_871X("marc: clnt auth failed due to illegal seq=%x\n", seq);
  22604. + goto authclnt_fail;
  22605. + }
  22606. +
  22607. + if (go2asoc)
  22608. + {
  22609. + start_clnt_assoc(padapter);
  22610. + return _SUCCESS;
  22611. + }
  22612. +
  22613. +authclnt_fail:
  22614. +
  22615. + //pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE);
  22616. +
  22617. + return _FAIL;
  22618. +
  22619. +}
  22620. +
  22621. +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)
  22622. +{
  22623. +#ifdef CONFIG_AP_MODE
  22624. + _irqL irqL;
  22625. + u16 capab_info, listen_interval;
  22626. + struct rtw_ieee802_11_elems elems;
  22627. + struct sta_info *pstat;
  22628. + unsigned char reassoc, *p, *pos, *wpa_ie;
  22629. + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
  22630. + int i, ie_len, wpa_ie_len, left;
  22631. + unsigned char supportRate[16];
  22632. + int supportRateNum;
  22633. + unsigned short status = _STATS_SUCCESSFUL_;
  22634. + unsigned short frame_type, ie_offset=0;
  22635. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  22636. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  22637. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  22638. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  22639. + WLAN_BSSID_EX *cur = &(pmlmeinfo->network);
  22640. + struct sta_priv *pstapriv = &padapter->stapriv;
  22641. + u8 *pframe = precv_frame->u.hdr.rx_data;
  22642. + uint pkt_len = precv_frame->u.hdr.len;
  22643. +#ifdef CONFIG_P2P
  22644. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  22645. + u8 p2p_status_code = P2P_STATUS_SUCCESS;
  22646. + u8 *p2pie;
  22647. + u32 p2pielen = 0;
  22648. +#ifdef CONFIG_WFD
  22649. + u8 wfd_ie[ 128 ] = { 0x00 };
  22650. + u32 wfd_ielen = 0;
  22651. +#endif // CONFIG_WFD
  22652. +#endif //CONFIG_P2P
  22653. +
  22654. +#ifdef CONFIG_CONCURRENT_MODE
  22655. + if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  22656. + check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))
  22657. + {
  22658. + //don't process assoc request;
  22659. + return _SUCCESS;
  22660. + }
  22661. +#endif //CONFIG_CONCURRENT_MODE
  22662. +
  22663. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  22664. + return _FAIL;
  22665. +
  22666. + frame_type = GetFrameSubType(pframe);
  22667. + if (frame_type == WIFI_ASSOCREQ)
  22668. + {
  22669. + reassoc = 0;
  22670. + ie_offset = _ASOCREQ_IE_OFFSET_;
  22671. + }
  22672. + else // WIFI_REASSOCREQ
  22673. + {
  22674. + reassoc = 1;
  22675. + ie_offset = _REASOCREQ_IE_OFFSET_;
  22676. + }
  22677. +
  22678. +
  22679. + if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) {
  22680. + DBG_871X("handle_assoc(reassoc=%d) - too short payload (len=%lu)"
  22681. + "\n", reassoc, (unsigned long)pkt_len);
  22682. + return _FAIL;
  22683. + }
  22684. +
  22685. + pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
  22686. + if (pstat == (struct sta_info *)NULL)
  22687. + {
  22688. + status = _RSON_CLS2_;
  22689. + goto asoc_class2_error;
  22690. + }
  22691. +
  22692. + capab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN);
  22693. + //capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
  22694. + //listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2));
  22695. + listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2);
  22696. +
  22697. + left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset);
  22698. + pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset);
  22699. +
  22700. +
  22701. + DBG_871X("%s\n", __FUNCTION__);
  22702. +
  22703. + // check if this stat has been successfully authenticated/assocated
  22704. + if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS))
  22705. + {
  22706. + if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS))
  22707. + {
  22708. + status = _RSON_CLS2_;
  22709. + goto asoc_class2_error;
  22710. + }
  22711. + else
  22712. + {
  22713. + pstat->state &= (~WIFI_FW_ASSOC_SUCCESS);
  22714. + pstat->state |= WIFI_FW_ASSOC_STATE;
  22715. + }
  22716. + }
  22717. + else
  22718. + {
  22719. + pstat->state &= (~WIFI_FW_AUTH_SUCCESS);
  22720. + pstat->state |= WIFI_FW_ASSOC_STATE;
  22721. + }
  22722. +
  22723. +
  22724. +#if 0// todo:tkip_countermeasures
  22725. + if (hapd->tkip_countermeasures) {
  22726. + resp = WLAN_REASON_MICHAEL_MIC_FAILURE;
  22727. + goto fail;
  22728. + }
  22729. +#endif
  22730. +
  22731. + pstat->capability = capab_info;
  22732. +
  22733. +#if 0//todo:
  22734. + //check listen_interval
  22735. + if (listen_interval > hapd->conf->max_listen_interval) {
  22736. + hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
  22737. + HOSTAPD_LEVEL_DEBUG,
  22738. + "Too large Listen Interval (%d)",
  22739. + listen_interval);
  22740. + resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE;
  22741. + goto fail;
  22742. + }
  22743. +
  22744. + pstat->listen_interval = listen_interval;
  22745. +#endif
  22746. +
  22747. + //now parse all ieee802_11 ie to point to elems
  22748. + if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed ||
  22749. + !elems.ssid) {
  22750. + DBG_871X("STA " MAC_FMT " sent invalid association request\n",
  22751. + MAC_ARG(pstat->hwaddr));
  22752. + status = _STATS_FAILURE_;
  22753. + goto OnAssocReqFail;
  22754. + }
  22755. +
  22756. +
  22757. + // now we should check all the fields...
  22758. + // checking SSID
  22759. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len,
  22760. + pkt_len - WLAN_HDR_A3_LEN - ie_offset);
  22761. + if (p == NULL)
  22762. + {
  22763. + status = _STATS_FAILURE_;
  22764. + }
  22765. +
  22766. + if (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq
  22767. + status = _STATS_FAILURE_;
  22768. + else
  22769. + {
  22770. + // check if ssid match
  22771. + if (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength))
  22772. + status = _STATS_FAILURE_;
  22773. +
  22774. + if (ie_len != cur->Ssid.SsidLength)
  22775. + status = _STATS_FAILURE_;
  22776. + }
  22777. +
  22778. + if(_STATS_SUCCESSFUL_ != status)
  22779. + goto OnAssocReqFail;
  22780. +
  22781. + // check if the supported rate is ok
  22782. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);
  22783. + if (p == NULL) {
  22784. + DBG_871X("Rx a sta assoc-req which supported rate is empty!\n");
  22785. + // use our own rate set as statoin used
  22786. + //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN);
  22787. + //supportRateNum = AP_BSSRATE_LEN;
  22788. +
  22789. + status = _STATS_FAILURE_;
  22790. + goto OnAssocReqFail;
  22791. + }
  22792. + else {
  22793. + _rtw_memcpy(supportRate, p+2, ie_len);
  22794. + supportRateNum = ie_len;
  22795. +
  22796. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len,
  22797. + pkt_len - WLAN_HDR_A3_LEN - ie_offset);
  22798. + if (p != NULL) {
  22799. +
  22800. + if(supportRateNum<=sizeof(supportRate))
  22801. + {
  22802. + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len);
  22803. + supportRateNum += ie_len;
  22804. + }
  22805. + }
  22806. + }
  22807. +
  22808. + //todo: mask supportRate between AP & STA -> move to update raid
  22809. + //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0);
  22810. +
  22811. + //update station supportRate
  22812. + pstat->bssratelen = supportRateNum;
  22813. + _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum);
  22814. +
  22815. +
  22816. + //check RSN/WPA/WPS
  22817. + pstat->dot8021xalg = 0;
  22818. + pstat->wpa_psk = 0;
  22819. + pstat->wpa_group_cipher = 0;
  22820. + pstat->wpa2_group_cipher = 0;
  22821. + pstat->wpa_pairwise_cipher = 0;
  22822. + pstat->wpa2_pairwise_cipher = 0;
  22823. + _rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie));
  22824. + if((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) {
  22825. +
  22826. + int group_cipher=0, pairwise_cipher=0;
  22827. +
  22828. + wpa_ie = elems.rsn_ie;
  22829. + wpa_ie_len = elems.rsn_ie_len;
  22830. +
  22831. + if(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  22832. + {
  22833. + pstat->dot8021xalg = 1;//psk, todo:802.1x
  22834. + pstat->wpa_psk |= BIT(1);
  22835. +
  22836. + pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher;
  22837. + pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher;
  22838. +
  22839. + if(!pstat->wpa2_group_cipher)
  22840. + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
  22841. +
  22842. + if(!pstat->wpa2_pairwise_cipher)
  22843. + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
  22844. + }
  22845. + else
  22846. + {
  22847. + status = WLAN_STATUS_INVALID_IE;
  22848. + }
  22849. +
  22850. + } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) {
  22851. +
  22852. + int group_cipher=0, pairwise_cipher=0;
  22853. +
  22854. + wpa_ie = elems.wpa_ie;
  22855. + wpa_ie_len = elems.wpa_ie_len;
  22856. +
  22857. + if(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  22858. + {
  22859. + pstat->dot8021xalg = 1;//psk, todo:802.1x
  22860. + pstat->wpa_psk |= BIT(0);
  22861. +
  22862. + pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher;
  22863. + pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher;
  22864. +
  22865. + if(!pstat->wpa_group_cipher)
  22866. + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
  22867. +
  22868. + if(!pstat->wpa_pairwise_cipher)
  22869. + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
  22870. +
  22871. + }
  22872. + else
  22873. + {
  22874. + status = WLAN_STATUS_INVALID_IE;
  22875. + }
  22876. +
  22877. + } else {
  22878. + wpa_ie = NULL;
  22879. + wpa_ie_len = 0;
  22880. + }
  22881. +
  22882. + if(_STATS_SUCCESSFUL_ != status)
  22883. + goto OnAssocReqFail;
  22884. +
  22885. + pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
  22886. + //if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS
  22887. + if(wpa_ie == NULL) {
  22888. + if (elems.wps_ie) {
  22889. + DBG_871X("STA included WPS IE in "
  22890. + "(Re)Association Request - assume WPS is "
  22891. + "used\n");
  22892. + pstat->flags |= WLAN_STA_WPS;
  22893. + //wpabuf_free(sta->wps_ie);
  22894. + //sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4,
  22895. + // elems.wps_ie_len - 4);
  22896. + } else {
  22897. + DBG_871X("STA did not include WPA/RSN IE "
  22898. + "in (Re)Association Request - possible WPS "
  22899. + "use\n");
  22900. + pstat->flags |= WLAN_STA_MAYBE_WPS;
  22901. + }
  22902. +
  22903. +
  22904. + // AP support WPA/RSN, and sta is going to do WPS, but AP is not ready
  22905. + // that the selected registrar of AP is _FLASE
  22906. + if((psecuritypriv->wpa_psk >0)
  22907. + && (pstat->flags & (WLAN_STA_WPS|WLAN_STA_MAYBE_WPS)))
  22908. + {
  22909. + if(pmlmepriv->wps_beacon_ie)
  22910. + {
  22911. + u8 selected_registrar = 0;
  22912. +
  22913. + rtw_get_wps_attr_content(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len, WPS_ATTR_SELECTED_REGISTRAR , &selected_registrar, NULL);
  22914. +
  22915. + if(!selected_registrar)
  22916. + {
  22917. + DBG_871X("selected_registrar is _FALSE , or AP is not ready to do WPS\n");
  22918. +
  22919. + status = _STATS_UNABLE_HANDLE_STA_;
  22920. +
  22921. + goto OnAssocReqFail;
  22922. + }
  22923. + }
  22924. + }
  22925. +
  22926. + }
  22927. + else
  22928. + {
  22929. + int copy_len;
  22930. +
  22931. + if(psecuritypriv->wpa_psk == 0)
  22932. + {
  22933. + DBG_871X("STA " MAC_FMT ": WPA/RSN IE in association "
  22934. + "request, but AP don't support WPA/RSN\n", MAC_ARG(pstat->hwaddr));
  22935. +
  22936. + status = WLAN_STATUS_INVALID_IE;
  22937. +
  22938. + goto OnAssocReqFail;
  22939. +
  22940. + }
  22941. +
  22942. + if (elems.wps_ie) {
  22943. + DBG_871X("STA included WPS IE in "
  22944. + "(Re)Association Request - WPS is "
  22945. + "used\n");
  22946. + pstat->flags |= WLAN_STA_WPS;
  22947. + copy_len=0;
  22948. + }
  22949. + else
  22950. + {
  22951. + copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2);
  22952. + }
  22953. +
  22954. +
  22955. + if(copy_len>0)
  22956. + _rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len);
  22957. +
  22958. + }
  22959. +
  22960. +
  22961. + // check if there is WMM IE & support WWM-PS
  22962. + pstat->flags &= ~WLAN_STA_WME;
  22963. + pstat->qos_option = 0;
  22964. + pstat->qos_info = 0;
  22965. + pstat->has_legacy_ac = _TRUE;
  22966. + pstat->uapsd_vo = 0;
  22967. + pstat->uapsd_vi = 0;
  22968. + pstat->uapsd_be = 0;
  22969. + pstat->uapsd_bk = 0;
  22970. + if (pmlmepriv->qospriv.qos_option)
  22971. + {
  22972. + p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0;
  22973. + for (;;)
  22974. + {
  22975. + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);
  22976. + if (p != NULL) {
  22977. + if (_rtw_memcmp(p+2, WMM_IE, 6)) {
  22978. +
  22979. + pstat->flags |= WLAN_STA_WME;
  22980. +
  22981. + pstat->qos_option = 1;
  22982. + pstat->qos_info = *(p+8);
  22983. +
  22984. + pstat->max_sp_len = (pstat->qos_info>>5)&0x3;
  22985. +
  22986. + if((pstat->qos_info&0xf) !=0xf)
  22987. + pstat->has_legacy_ac = _TRUE;
  22988. + else
  22989. + pstat->has_legacy_ac = _FALSE;
  22990. +
  22991. + if(pstat->qos_info&0xf)
  22992. + {
  22993. + if(pstat->qos_info&BIT(0))
  22994. + pstat->uapsd_vo = BIT(0)|BIT(1);
  22995. + else
  22996. + pstat->uapsd_vo = 0;
  22997. +
  22998. + if(pstat->qos_info&BIT(1))
  22999. + pstat->uapsd_vi = BIT(0)|BIT(1);
  23000. + else
  23001. + pstat->uapsd_vi = 0;
  23002. +
  23003. + if(pstat->qos_info&BIT(2))
  23004. + pstat->uapsd_bk = BIT(0)|BIT(1);
  23005. + else
  23006. + pstat->uapsd_bk = 0;
  23007. +
  23008. + if(pstat->qos_info&BIT(3))
  23009. + pstat->uapsd_be = BIT(0)|BIT(1);
  23010. + else
  23011. + pstat->uapsd_be = 0;
  23012. +
  23013. + }
  23014. +
  23015. + break;
  23016. + }
  23017. + }
  23018. + else {
  23019. + break;
  23020. + }
  23021. + p = p + ie_len + 2;
  23022. + }
  23023. + }
  23024. +
  23025. +
  23026. +#ifdef CONFIG_80211N_HT
  23027. + /* save HT capabilities in the sta object */
  23028. + _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));
  23029. + if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct rtw_ieee80211_ht_cap))
  23030. + {
  23031. + pstat->flags |= WLAN_STA_HT;
  23032. +
  23033. + pstat->flags |= WLAN_STA_WME;
  23034. +
  23035. + _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct rtw_ieee80211_ht_cap));
  23036. +
  23037. + } else
  23038. + pstat->flags &= ~WLAN_STA_HT;
  23039. +
  23040. +
  23041. + if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT))
  23042. + {
  23043. + status = _STATS_FAILURE_;
  23044. + goto OnAssocReqFail;
  23045. + }
  23046. +
  23047. +
  23048. + if ((pstat->flags & WLAN_STA_HT) &&
  23049. + ((pstat->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) ||
  23050. + (pstat->wpa_pairwise_cipher&WPA_CIPHER_TKIP)))
  23051. + {
  23052. + DBG_871X("HT: " MAC_FMT " tried to "
  23053. + "use TKIP with HT association\n", MAC_ARG(pstat->hwaddr));
  23054. +
  23055. + //status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;
  23056. + //goto OnAssocReqFail;
  23057. + }
  23058. +#endif /* CONFIG_80211N_HT */
  23059. +
  23060. + //
  23061. + //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//?
  23062. + pstat->flags |= WLAN_STA_NONERP;
  23063. + for (i = 0; i < pstat->bssratelen; i++) {
  23064. + if ((pstat->bssrateset[i] & 0x7f) > 22) {
  23065. + pstat->flags &= ~WLAN_STA_NONERP;
  23066. + break;
  23067. + }
  23068. + }
  23069. +
  23070. + if (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
  23071. + pstat->flags |= WLAN_STA_SHORT_PREAMBLE;
  23072. + else
  23073. + pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE;
  23074. +
  23075. +
  23076. +
  23077. + if (status != _STATS_SUCCESSFUL_)
  23078. + goto OnAssocReqFail;
  23079. +
  23080. +#ifdef CONFIG_P2P
  23081. + pstat->is_p2p_device = _FALSE;
  23082. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  23083. + {
  23084. + if( (p2pie=rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , NULL, &p2pielen)))
  23085. + {
  23086. + pstat->is_p2p_device = _TRUE;
  23087. + if((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat))>0)
  23088. + {
  23089. + pstat->p2p_status_code = p2p_status_code;
  23090. + status = _STATS_CAP_FAIL_;
  23091. + goto OnAssocReqFail;
  23092. + }
  23093. + }
  23094. +#ifdef CONFIG_WFD
  23095. + if(rtw_get_wfd_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , wfd_ie, &wfd_ielen ))
  23096. + {
  23097. + u8 attr_content[ 10 ] = { 0x00 };
  23098. + u32 attr_contentlen = 0;
  23099. +
  23100. + DBG_8192C( "[%s] WFD IE Found!!\n", __FUNCTION__ );
  23101. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
  23102. + if ( attr_contentlen )
  23103. + {
  23104. + pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
  23105. + DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
  23106. + }
  23107. + }
  23108. +#endif
  23109. + }
  23110. + pstat->p2p_status_code = p2p_status_code;
  23111. +#endif //CONFIG_P2P
  23112. +
  23113. + //TODO: identify_proprietary_vendor_ie();
  23114. + // Realtek proprietary IE
  23115. + // identify if this is Broadcom sta
  23116. + // identify if this is ralink sta
  23117. + // Customer proprietary IE
  23118. +
  23119. +
  23120. +
  23121. + /* get a unique AID */
  23122. + if (pstat->aid > 0) {
  23123. + DBG_871X(" old AID %d\n", pstat->aid);
  23124. + } else {
  23125. + for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++)
  23126. + if (pstapriv->sta_aid[pstat->aid - 1] == NULL)
  23127. + break;
  23128. +
  23129. + //if (pstat->aid > NUM_STA) {
  23130. + if (pstat->aid > pstapriv->max_num_sta) {
  23131. +
  23132. + pstat->aid = 0;
  23133. +
  23134. + DBG_871X(" no room for more AIDs\n");
  23135. +
  23136. + status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;
  23137. +
  23138. + goto OnAssocReqFail;
  23139. +
  23140. +
  23141. + } else {
  23142. + pstapriv->sta_aid[pstat->aid - 1] = pstat;
  23143. + DBG_871X("allocate new AID = (%d)\n", pstat->aid);
  23144. + }
  23145. + }
  23146. +
  23147. +
  23148. + pstat->state &= (~WIFI_FW_ASSOC_STATE);
  23149. + pstat->state |= WIFI_FW_ASSOC_SUCCESS;
  23150. +
  23151. + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);
  23152. + if (!rtw_is_list_empty(&pstat->auth_list))
  23153. + {
  23154. + rtw_list_delete(&pstat->auth_list);
  23155. + pstapriv->auth_list_cnt--;
  23156. + }
  23157. + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);
  23158. +
  23159. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23160. + if (rtw_is_list_empty(&pstat->asoc_list))
  23161. + {
  23162. + pstat->expire_to = pstapriv->expire_to;
  23163. + rtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list);
  23164. + pstapriv->asoc_list_cnt++;
  23165. + }
  23166. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23167. +
  23168. + // now the station is qualified to join our BSS...
  23169. + if(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status))
  23170. + {
  23171. +#ifdef CONFIG_NATIVEAP_MLME
  23172. + //.1 bss_cap_update & sta_info_update
  23173. + bss_cap_update_on_sta_join(padapter, pstat);
  23174. + sta_info_update(padapter, pstat);
  23175. +
  23176. + //issue assoc rsp before notify station join event.
  23177. + if (frame_type == WIFI_ASSOCREQ)
  23178. + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP);
  23179. + else
  23180. + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP);
  23181. +
  23182. + //.2 - report to upper layer
  23183. + DBG_871X("indicate_sta_join_event to upper layer - hostapd\n");
  23184. +
  23185. +#ifdef CONFIG_IOCTL_CFG80211
  23186. + #ifdef COMPAT_KERNEL_RELEASE
  23187. + rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len);
  23188. + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  23189. + rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len);
  23190. + #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  23191. + _enter_critical_bh(&pstat->lock, &irqL);
  23192. + if(pstat->passoc_req)
  23193. + {
  23194. + rtw_mfree(pstat->passoc_req, pstat->assoc_req_len);
  23195. + pstat->passoc_req = NULL;
  23196. + pstat->assoc_req_len = 0;
  23197. + }
  23198. +
  23199. + pstat->passoc_req = rtw_zmalloc(pkt_len);
  23200. + if(pstat->passoc_req)
  23201. + {
  23202. + _rtw_memcpy(pstat->passoc_req, pframe, pkt_len);
  23203. + pstat->assoc_req_len = pkt_len;
  23204. + }
  23205. + _exit_critical_bh(&pstat->lock, &irqL);
  23206. + #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  23207. +#else
  23208. + rtw_indicate_sta_assoc_event(padapter, pstat);
  23209. +#endif //CONFIG_IOCTL_CFG80211
  23210. +
  23211. + //.3-(1) report sta add event
  23212. + report_add_sta_event(padapter, pstat->hwaddr, pstat->aid);
  23213. +
  23214. +/*
  23215. + //issue assoc rsp before notify station join event.
  23216. + if (frame_type == WIFI_ASSOCREQ)
  23217. + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP);
  23218. + else
  23219. + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP);
  23220. +*/
  23221. +
  23222. +#endif
  23223. + }
  23224. +
  23225. + return _SUCCESS;
  23226. +
  23227. +asoc_class2_error:
  23228. +
  23229. +#ifdef CONFIG_NATIVEAP_MLME
  23230. + issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status);
  23231. +#endif
  23232. +
  23233. + return _FAIL;
  23234. +
  23235. +OnAssocReqFail:
  23236. +
  23237. +
  23238. +#ifdef CONFIG_NATIVEAP_MLME
  23239. + pstat->aid = 0;
  23240. + if (frame_type == WIFI_ASSOCREQ)
  23241. + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP);
  23242. + else
  23243. + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP);
  23244. +#endif
  23245. +
  23246. +
  23247. +#endif /* CONFIG_AP_MODE */
  23248. +
  23249. + return _FAIL;
  23250. +
  23251. +}
  23252. +
  23253. +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame)
  23254. +{
  23255. + uint i;
  23256. + int res;
  23257. + unsigned short status;
  23258. + PNDIS_802_11_VARIABLE_IEs pIE;
  23259. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  23260. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  23261. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  23262. + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  23263. + u8 *pframe = precv_frame->u.hdr.rx_data;
  23264. + uint pkt_len = precv_frame->u.hdr.len;
  23265. +
  23266. + DBG_871X("%s\n", __FUNCTION__);
  23267. +
  23268. + //check A1 matches or not
  23269. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN))
  23270. + return _SUCCESS;
  23271. +
  23272. + if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE)))
  23273. + return _SUCCESS;
  23274. +
  23275. + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
  23276. + return _SUCCESS;
  23277. +
  23278. + _cancel_timer_ex(&pmlmeext->link_timer);
  23279. +
  23280. + //status
  23281. + if ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0)
  23282. + {
  23283. + DBG_871X("assoc reject, status code: %d\n", status);
  23284. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  23285. + res = -4;
  23286. + goto report_assoc_result;
  23287. + }
  23288. +
  23289. + //get capabilities
  23290. + pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
  23291. +
  23292. + //set slot time
  23293. + pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20;
  23294. +
  23295. + //AID
  23296. + res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff);
  23297. +
  23298. + //following are moved to join event callback function
  23299. + //to handle HT, WMM, rate adaptive, update MAC reg
  23300. + //for not to handle the synchronous IO in the tasklet
  23301. + for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;)
  23302. + {
  23303. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i);
  23304. +
  23305. + switch (pIE->ElementID)
  23306. + {
  23307. + case _VENDOR_SPECIFIC_IE_:
  23308. + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM
  23309. + {
  23310. + WMM_param_handler(padapter, pIE);
  23311. + }
  23312. +#if defined(CONFIG_P2P) && defined(CONFIG_WFD)
  23313. + else if ( _rtw_memcmp(pIE->data, WFD_OUI, 4)) //WFD
  23314. + {
  23315. + DBG_871X( "[%s] Found WFD IE\n", __FUNCTION__ );
  23316. + WFD_info_handler( padapter, pIE );
  23317. + }
  23318. +#endif
  23319. + break;
  23320. +
  23321. + case _HT_CAPABILITY_IE_: //HT caps
  23322. + HT_caps_handler(padapter, pIE);
  23323. + break;
  23324. +
  23325. + case _HT_EXTRA_INFO_IE_: //HT info
  23326. + HT_info_handler(padapter, pIE);
  23327. + break;
  23328. +
  23329. + case _ERPINFO_IE_:
  23330. + ERP_IE_handler(padapter, pIE);
  23331. +
  23332. + default:
  23333. + break;
  23334. + }
  23335. +
  23336. + i += (pIE->Length + 2);
  23337. + }
  23338. +
  23339. + pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE);
  23340. + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
  23341. +
  23342. + //Update Basic Rate Table for spec, 2010-12-28 , by thomas
  23343. + UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates);
  23344. +
  23345. +#ifdef CONFIG_IOCTL_CFG80211
  23346. + if (!rtw_cfg80211_check_bss(padapter)) {
  23347. + DBG_871X("rtw_cfg80211_check_bss() : BSS not found !!\n");
  23348. + res = -2;
  23349. + goto report_assoc_result;
  23350. + }
  23351. +#endif
  23352. +
  23353. +report_assoc_result:
  23354. + if (res > 0) {
  23355. + rtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len);
  23356. + } else {
  23357. + rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len);
  23358. + }
  23359. +
  23360. + report_join_res(padapter, res);
  23361. + return _SUCCESS;
  23362. +}
  23363. +
  23364. +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame)
  23365. +{
  23366. + unsigned short reason;
  23367. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  23368. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  23369. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  23370. + u8 *pframe = precv_frame->u.hdr.rx_data;
  23371. +#ifdef CONFIG_P2P
  23372. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  23373. +#endif //CONFIG_P2P
  23374. +
  23375. + //check A3
  23376. + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))
  23377. + return _SUCCESS;
  23378. +
  23379. +#ifdef CONFIG_P2P
  23380. + if ( pwdinfo->rx_invitereq_info.scan_op_ch_only )
  23381. + {
  23382. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );
  23383. + _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );
  23384. + }
  23385. +#endif //CONFIG_P2P
  23386. +
  23387. + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
  23388. +
  23389. + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason);
  23390. +
  23391. +#ifdef CONFIG_AP_MODE
  23392. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  23393. + {
  23394. + _irqL irqL;
  23395. + struct sta_info *psta;
  23396. + struct sta_priv *pstapriv = &padapter->stapriv;
  23397. +
  23398. + //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  23399. + //rtw_free_stainfo(padapter, psta);
  23400. + //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  23401. +
  23402. + DBG_871X("%s, STA:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(GetAddr2Ptr(pframe)));
  23403. +
  23404. + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
  23405. + if(psta)
  23406. + {
  23407. + u8 updated;
  23408. +
  23409. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23410. + if(rtw_is_list_empty(&psta->asoc_list)==_FALSE)
  23411. + {
  23412. + rtw_list_delete(&psta->asoc_list);
  23413. + pstapriv->asoc_list_cnt--;
  23414. + updated = ap_free_sta(padapter, psta, _FALSE, reason);
  23415. +
  23416. + }
  23417. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23418. +
  23419. + associated_clients_update(padapter, updated);
  23420. + }
  23421. +
  23422. +
  23423. + return _SUCCESS;
  23424. + }
  23425. + else
  23426. +#endif
  23427. + {
  23428. + int ignore_received_deauth = 0;
  23429. +
  23430. + // Commented by Albert 20130604
  23431. + // Before sending the auth frame to start the STA/GC mode connection with AP/GO,
  23432. + // we will send the deauth first.
  23433. + // However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth.
  23434. + // Added the following code to avoid this case.
  23435. + if ( ( pmlmeinfo->state & WIFI_FW_AUTH_STATE ) ||
  23436. + ( pmlmeinfo->state & WIFI_FW_ASSOC_STATE ) )
  23437. + {
  23438. + if ( reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA )
  23439. + {
  23440. + ignore_received_deauth = 1;
  23441. + } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) {
  23442. + // TODO: 802.11r
  23443. + ignore_received_deauth = 1;
  23444. + }
  23445. + }
  23446. +
  23447. + DBG_871X("%s, STA:" MAC_FMT ", ignore = %d\n", __FUNCTION__, MAC_ARG(GetAddr3Ptr(pframe)), ignore_received_deauth);
  23448. + if ( 0 == ignore_received_deauth )
  23449. + {
  23450. + receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason);
  23451. + }
  23452. + }
  23453. + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
  23454. + return _SUCCESS;
  23455. +
  23456. +}
  23457. +
  23458. +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame)
  23459. +{
  23460. + unsigned short reason;
  23461. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  23462. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  23463. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  23464. + u8 *pframe = precv_frame->u.hdr.rx_data;
  23465. +#ifdef CONFIG_P2P
  23466. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  23467. +#endif //CONFIG_P2P
  23468. +
  23469. + //check A3
  23470. + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))
  23471. + return _SUCCESS;
  23472. +
  23473. +#ifdef CONFIG_P2P
  23474. + if ( pwdinfo->rx_invitereq_info.scan_op_ch_only )
  23475. + {
  23476. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );
  23477. + _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );
  23478. + }
  23479. +#endif //CONFIG_P2P
  23480. +
  23481. + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
  23482. +
  23483. + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason);
  23484. +
  23485. +#ifdef CONFIG_AP_MODE
  23486. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  23487. + {
  23488. + _irqL irqL;
  23489. + struct sta_info *psta;
  23490. + struct sta_priv *pstapriv = &padapter->stapriv;
  23491. +
  23492. + //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  23493. + //rtw_free_stainfo(padapter, psta);
  23494. + //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  23495. +
  23496. + DBG_871X("%s, STA:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(GetAddr2Ptr(pframe)));
  23497. +
  23498. + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
  23499. + if(psta)
  23500. + {
  23501. + u8 updated;
  23502. +
  23503. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23504. + if(rtw_is_list_empty(&psta->asoc_list)==_FALSE)
  23505. + {
  23506. + rtw_list_delete(&psta->asoc_list);
  23507. + pstapriv->asoc_list_cnt--;
  23508. + updated = ap_free_sta(padapter, psta, _FALSE, reason);
  23509. +
  23510. + }
  23511. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  23512. +
  23513. + associated_clients_update(padapter, updated);
  23514. + }
  23515. +
  23516. + return _SUCCESS;
  23517. + }
  23518. + else
  23519. +#endif
  23520. + {
  23521. + DBG_871X("%s, STA:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(GetAddr3Ptr(pframe)));
  23522. +
  23523. + receive_disconnect(padapter, GetAddr3Ptr(pframe), reason);
  23524. + }
  23525. + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
  23526. + return _SUCCESS;
  23527. +
  23528. +}
  23529. +
  23530. +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame)
  23531. +{
  23532. + DBG_871X("%s\n", __FUNCTION__);
  23533. + return _SUCCESS;
  23534. +}
  23535. +
  23536. +unsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, u8 *ies, uint ies_len)
  23537. +{
  23538. + unsigned int ret = _FAIL;
  23539. + struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
  23540. + struct mlme_ext_info *pmlmeinfo = &(mlmeext->mlmext_info);
  23541. +
  23542. + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
  23543. + ret = _SUCCESS;
  23544. + goto exit;
  23545. + }
  23546. +
  23547. + if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) {
  23548. +
  23549. + int ch_switch_mode = -1, ch = -1, ch_switch_cnt = -1;
  23550. + int ch_offset = -1;
  23551. + u8 bwmode;
  23552. + struct ieee80211_info_element *ie;
  23553. +
  23554. + DBG_871X(FUNC_NDEV_FMT" from "MAC_FMT"\n",
  23555. + FUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(psta->hwaddr));
  23556. +
  23557. + for_each_ie(ie, ies, ies_len) {
  23558. + if (ie->id == WLAN_EID_CHANNEL_SWITCH) {
  23559. + ch_switch_mode = ie->data[0];
  23560. + ch = ie->data[1];
  23561. + ch_switch_cnt = ie->data[2];
  23562. + DBG_871X("ch_switch_mode:%d, ch:%d, ch_switch_cnt:%d\n",
  23563. + ch_switch_mode, ch, ch_switch_cnt);
  23564. + }
  23565. + else if (ie->id == WLAN_EID_SECONDARY_CHANNEL_OFFSET) {
  23566. + ch_offset = secondary_ch_offset_to_hal_ch_offset(ie->data[0]);
  23567. + DBG_871X("ch_offset:%d\n", ch_offset);
  23568. + }
  23569. + }
  23570. +
  23571. + if (ch == -1)
  23572. + return _SUCCESS;
  23573. +
  23574. + if (ch_offset == -1)
  23575. + bwmode = mlmeext->cur_bwmode;
  23576. + else
  23577. + bwmode = (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ?
  23578. + HT_CHANNEL_WIDTH_20 : HT_CHANNEL_WIDTH_40;
  23579. +
  23580. + ch_offset = (ch_offset == -1) ? mlmeext->cur_ch_offset : ch_offset;
  23581. +
  23582. + /* todo:
  23583. + * 1. the decision of channel switching
  23584. + * 2. things after channel switching
  23585. + */
  23586. +
  23587. + ret = rtw_set_ch_cmd(padapter, ch, bwmode, ch_offset, _TRUE);
  23588. + }
  23589. +
  23590. +exit:
  23591. + return ret;
  23592. +}
  23593. +
  23594. +unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame)
  23595. +{
  23596. + unsigned int ret = _FAIL;
  23597. + struct sta_info *psta = NULL;
  23598. + struct sta_priv *pstapriv = &padapter->stapriv;
  23599. + u8 *pframe = precv_frame->u.hdr.rx_data;
  23600. + uint frame_len = precv_frame->u.hdr.len;
  23601. + u8 *frame_body = (u8 *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  23602. + u8 category;
  23603. + u8 action;
  23604. +
  23605. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev));
  23606. +
  23607. + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
  23608. +
  23609. + if (!psta)
  23610. + goto exit;
  23611. +
  23612. + category = frame_body[0];
  23613. + if(category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT)
  23614. + goto exit;
  23615. +
  23616. + action = frame_body[1];
  23617. + switch (action) {
  23618. + case RTW_WLAN_ACTION_SPCT_MSR_REQ:
  23619. + case RTW_WLAN_ACTION_SPCT_MSR_RPRT:
  23620. + case RTW_WLAN_ACTION_SPCT_TPC_REQ:
  23621. + case RTW_WLAN_ACTION_SPCT_TPC_RPRT:
  23622. + break;
  23623. + case RTW_WLAN_ACTION_SPCT_CHL_SWITCH:
  23624. + #ifdef CONFIG_SPCT_CH_SWITCH
  23625. + ret = on_action_spct_ch_switch(padapter, psta, &frame_body[2],
  23626. + frame_len-(frame_body-pframe)-2);
  23627. + #endif
  23628. + break;
  23629. + default:
  23630. + break;
  23631. + }
  23632. +
  23633. +exit:
  23634. + return ret;
  23635. +}
  23636. +
  23637. +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame)
  23638. +{
  23639. + return _SUCCESS;
  23640. +}
  23641. +
  23642. +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame)
  23643. +{
  23644. + return _SUCCESS;
  23645. +}
  23646. +
  23647. +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame)
  23648. +{
  23649. + u8 *addr;
  23650. + struct sta_info *psta=NULL;
  23651. + struct recv_reorder_ctrl *preorder_ctrl;
  23652. + unsigned char *frame_body;
  23653. + unsigned char category, action;
  23654. + unsigned short tid, status, reason_code = 0;
  23655. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  23656. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  23657. + u8 *pframe = precv_frame->u.hdr.rx_data;
  23658. + struct sta_priv *pstapriv = &padapter->stapriv;
  23659. +
  23660. + //check RA matches or not
  23661. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
  23662. + return _SUCCESS;
  23663. +
  23664. +/*
  23665. + //check A1 matches or not
  23666. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN))
  23667. + return _SUCCESS;
  23668. +*/
  23669. + DBG_871X("%s\n", __FUNCTION__);
  23670. +
  23671. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  23672. + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
  23673. + return _SUCCESS;
  23674. +
  23675. + addr = GetAddr2Ptr(pframe);
  23676. + psta = rtw_get_stainfo(pstapriv, addr);
  23677. +
  23678. + if(psta==NULL)
  23679. + return _SUCCESS;
  23680. +
  23681. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  23682. +
  23683. + category = frame_body[0];
  23684. + if (category == RTW_WLAN_CATEGORY_BACK)// representing Block Ack
  23685. + {
  23686. +#ifdef CONFIG_TDLS
  23687. + if((psta->tdls_sta_state & TDLS_LINKED_STATE) &&
  23688. + (psta->htpriv.ht_option==_TRUE) &&
  23689. + (psta->htpriv.ampdu_enable==_TRUE) )
  23690. + {
  23691. + //do nothing; just don't want to return _SUCCESS;
  23692. + }
  23693. + else
  23694. +#endif //CONFIG_TDLS
  23695. + if (!pmlmeinfo->HT_enable)
  23696. + {
  23697. + return _SUCCESS;
  23698. + }
  23699. +
  23700. + action = frame_body[1];
  23701. + DBG_871X("%s, action=%d\n", __FUNCTION__, action);
  23702. + switch (action)
  23703. + {
  23704. + case RTW_WLAN_ACTION_ADDBA_REQ: //ADDBA request
  23705. +
  23706. + _rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request));
  23707. + //process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe));
  23708. + process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr);
  23709. +
  23710. + if(pmlmeinfo->bAcceptAddbaReq == _TRUE)
  23711. + {
  23712. + issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0);
  23713. + }
  23714. + else
  23715. + {
  23716. + issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);//reject ADDBA Req
  23717. + }
  23718. +
  23719. + break;
  23720. +
  23721. + case RTW_WLAN_ACTION_ADDBA_RESP: //ADDBA response
  23722. +
  23723. + //status = frame_body[3] | (frame_body[4] << 8); //endian issue
  23724. + status = RTW_GET_LE16(&frame_body[3]);
  23725. + tid = ((frame_body[5] >> 2) & 0x7);
  23726. +
  23727. + if (status == 0)
  23728. + { //successful
  23729. + DBG_871X("agg_enable for TID=%d\n", tid);
  23730. + psta->htpriv.agg_enable_bitmap |= 1 << tid;
  23731. + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid);
  23732. + }
  23733. + else
  23734. + {
  23735. + psta->htpriv.agg_enable_bitmap &= ~BIT(tid);
  23736. + }
  23737. +
  23738. + //DBG_871X("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap);
  23739. + break;
  23740. +
  23741. + case RTW_WLAN_ACTION_DELBA: //DELBA
  23742. + if ((frame_body[3] & BIT(3)) == 0)
  23743. + {
  23744. + psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
  23745. + psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));
  23746. +
  23747. + //reason_code = frame_body[4] | (frame_body[5] << 8);
  23748. + reason_code = RTW_GET_LE16(&frame_body[4]);
  23749. + }
  23750. + else if((frame_body[3] & BIT(3)) == BIT(3))
  23751. + {
  23752. + tid = (frame_body[3] >> 4) & 0x0F;
  23753. +
  23754. + preorder_ctrl = &psta->recvreorder_ctrl[tid];
  23755. + preorder_ctrl->enable = _FALSE;
  23756. + preorder_ctrl->indicate_seq = 0xffff;
  23757. + #ifdef DBG_RX_SEQ
  23758. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  23759. + preorder_ctrl->indicate_seq);
  23760. + #endif
  23761. + }
  23762. +
  23763. + DBG_871X("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code);
  23764. + //todo: how to notify the host while receiving DELETE BA
  23765. + break;
  23766. +
  23767. + default:
  23768. + break;
  23769. + }
  23770. + }
  23771. +
  23772. + return _SUCCESS;
  23773. +}
  23774. +
  23775. +#ifdef CONFIG_P2P
  23776. +
  23777. +static int get_reg_classes_full_count(struct p2p_channels channel_list) {
  23778. + int cnt = 0;
  23779. + int i;
  23780. +
  23781. + for (i = 0; i < channel_list.reg_classes; i++) {
  23782. + cnt += channel_list.reg_class[i].channels;
  23783. + }
  23784. +
  23785. + return cnt;
  23786. +}
  23787. +
  23788. +static void get_channel_cnt_24g_5gl_5gh( struct mlme_ext_priv *pmlmeext, u8* p24g_cnt, u8* p5gl_cnt, u8* p5gh_cnt )
  23789. +{
  23790. + int i = 0;
  23791. +
  23792. + *p24g_cnt = 0;
  23793. + *p5gl_cnt = 0;
  23794. + *p5gh_cnt = 0;
  23795. +
  23796. + for( i = 0; i < pmlmeext->max_chan_nums; i++ )
  23797. + {
  23798. + if ( pmlmeext->channel_set[ i ].ChannelNum <= 14 )
  23799. + {
  23800. + (*p24g_cnt)++;
  23801. + }
  23802. + else if ( ( pmlmeext->channel_set[ i ].ChannelNum > 14 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 48 ) )
  23803. + {
  23804. + // Just include the channel 36, 40, 44, 48 channels for 5G low
  23805. + (*p5gl_cnt)++;
  23806. + }
  23807. + else if ( ( pmlmeext->channel_set[ i ].ChannelNum >= 149 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 161 ) )
  23808. + {
  23809. + // Just include the channel 149, 153, 157, 161 channels for 5G high
  23810. + (*p5gh_cnt)++;
  23811. + }
  23812. + }
  23813. +}
  23814. +
  23815. +void issue_p2p_GO_request(_adapter *padapter, u8* raddr)
  23816. +{
  23817. +
  23818. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  23819. + u8 action = P2P_PUB_ACTION_ACTION;
  23820. + u32 p2poui = cpu_to_be32(P2POUI);
  23821. + u8 oui_subtype = P2P_GO_NEGO_REQ;
  23822. + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
  23823. + u8 wpsielen = 0, p2pielen = 0, i;
  23824. + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;
  23825. + u16 len_channellist_attr = 0;
  23826. +#ifdef CONFIG_WFD
  23827. + u32 wfdielen = 0;
  23828. +#endif //CONFIG_WFD
  23829. +
  23830. + struct xmit_frame *pmgntframe;
  23831. + struct pkt_attrib *pattrib;
  23832. + unsigned char *pframe;
  23833. + struct rtw_ieee80211_hdr *pwlanhdr;
  23834. + unsigned short *fctrl;
  23835. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  23836. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  23837. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  23838. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
  23839. +
  23840. +
  23841. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  23842. + {
  23843. + return;
  23844. + }
  23845. +
  23846. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  23847. + //update attribute
  23848. + pattrib = &pmgntframe->attrib;
  23849. + update_mgntframe_attrib(padapter, pattrib);
  23850. +
  23851. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  23852. +
  23853. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  23854. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  23855. +
  23856. + fctrl = &(pwlanhdr->frame_ctl);
  23857. + *(fctrl) = 0;
  23858. +
  23859. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  23860. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  23861. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  23862. +
  23863. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  23864. + pmlmeext->mgnt_seq++;
  23865. + SetFrameSubType(pframe, WIFI_ACTION);
  23866. +
  23867. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  23868. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  23869. +
  23870. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  23871. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  23872. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  23873. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  23874. + pwdinfo->negotiation_dialog_token = 1; // Initialize the dialog value
  23875. + pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen));
  23876. +
  23877. +
  23878. +
  23879. + // WPS Section
  23880. + wpsielen = 0;
  23881. + // WPS OUI
  23882. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  23883. + wpsielen += 4;
  23884. +
  23885. + // WPS version
  23886. + // Type:
  23887. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  23888. + wpsielen += 2;
  23889. +
  23890. + // Length:
  23891. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  23892. + wpsielen += 2;
  23893. +
  23894. + // Value:
  23895. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  23896. +
  23897. + // Device Password ID
  23898. + // Type:
  23899. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );
  23900. + wpsielen += 2;
  23901. +
  23902. + // Length:
  23903. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  23904. + wpsielen += 2;
  23905. +
  23906. + // Value:
  23907. +
  23908. + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN )
  23909. + {
  23910. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );
  23911. + }
  23912. + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN )
  23913. + {
  23914. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );
  23915. + }
  23916. + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC )
  23917. + {
  23918. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );
  23919. + }
  23920. +
  23921. + wpsielen += 2;
  23922. +
  23923. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  23924. +
  23925. +
  23926. + // P2P IE Section.
  23927. +
  23928. + // P2P OUI
  23929. + p2pielen = 0;
  23930. + p2pie[ p2pielen++ ] = 0x50;
  23931. + p2pie[ p2pielen++ ] = 0x6F;
  23932. + p2pie[ p2pielen++ ] = 0x9A;
  23933. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  23934. +
  23935. + // Commented by Albert 20110306
  23936. + // According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes
  23937. + // 1. P2P Capability
  23938. + // 2. Group Owner Intent
  23939. + // 3. Configuration Timeout
  23940. + // 4. Listen Channel
  23941. + // 5. Extended Listen Timing
  23942. + // 6. Intended P2P Interface Address
  23943. + // 7. Channel List
  23944. + // 8. P2P Device Info
  23945. + // 9. Operating Channel
  23946. +
  23947. +
  23948. + // P2P Capability
  23949. + // Type:
  23950. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  23951. +
  23952. + // Length:
  23953. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  23954. + p2pielen += 2;
  23955. +
  23956. + // Value:
  23957. + // Device Capability Bitmap, 1 byte
  23958. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  23959. +
  23960. + // Group Capability Bitmap, 1 byte
  23961. + if ( pwdinfo->persistent_supported )
  23962. + {
  23963. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
  23964. + }
  23965. + else
  23966. + {
  23967. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;
  23968. + }
  23969. +
  23970. +
  23971. + // Group Owner Intent
  23972. + // Type:
  23973. + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;
  23974. +
  23975. + // Length:
  23976. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  23977. + p2pielen += 2;
  23978. +
  23979. + // Value:
  23980. + // Todo the tie breaker bit.
  23981. + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
  23982. +
  23983. + // Configuration Timeout
  23984. + // Type:
  23985. + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
  23986. +
  23987. + // Length:
  23988. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  23989. + p2pielen += 2;
  23990. +
  23991. + // Value:
  23992. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
  23993. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
  23994. +
  23995. +
  23996. + // Listen Channel
  23997. + // Type:
  23998. + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH;
  23999. +
  24000. + // Length:
  24001. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  24002. + p2pielen += 2;
  24003. +
  24004. + // Value:
  24005. + // Country String
  24006. + p2pie[ p2pielen++ ] = 'X';
  24007. + p2pie[ p2pielen++ ] = 'X';
  24008. +
  24009. + // The third byte should be set to 0x04.
  24010. + // Described in the "Operating Channel Attribute" section.
  24011. + p2pie[ p2pielen++ ] = 0x04;
  24012. +
  24013. + // Operating Class
  24014. + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7
  24015. +
  24016. + // Channel Number
  24017. + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listening channel number
  24018. +
  24019. +
  24020. + // Extended Listen Timing ATTR
  24021. + // Type:
  24022. + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
  24023. +
  24024. + // Length:
  24025. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );
  24026. + p2pielen += 2;
  24027. +
  24028. + // Value:
  24029. + // Availability Period
  24030. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  24031. + p2pielen += 2;
  24032. +
  24033. + // Availability Interval
  24034. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  24035. + p2pielen += 2;
  24036. +
  24037. +
  24038. + // Intended P2P Interface Address
  24039. + // Type:
  24040. + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;
  24041. +
  24042. + // Length:
  24043. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
  24044. + p2pielen += 2;
  24045. +
  24046. + // Value:
  24047. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  24048. + p2pielen += ETH_ALEN;
  24049. +
  24050. +
  24051. + // Channel List
  24052. + // Type:
  24053. + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
  24054. +
  24055. + // Length:
  24056. + // Country String(3)
  24057. + // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
  24058. + // + number of channels in all classes
  24059. + len_channellist_attr = 3
  24060. + + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes)
  24061. + + get_reg_classes_full_count(pmlmeext->channel_list);
  24062. +
  24063. +#ifdef CONFIG_CONCURRENT_MODE
  24064. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  24065. + {
  24066. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
  24067. + }
  24068. + else
  24069. + {
  24070. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  24071. + }
  24072. +#else
  24073. +
  24074. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  24075. +
  24076. +#endif
  24077. + p2pielen += 2;
  24078. +
  24079. + // Value:
  24080. + // Country String
  24081. + p2pie[ p2pielen++ ] = 'X';
  24082. + p2pie[ p2pielen++ ] = 'X';
  24083. +
  24084. + // The third byte should be set to 0x04.
  24085. + // Described in the "Operating Channel Attribute" section.
  24086. + p2pie[ p2pielen++ ] = 0x04;
  24087. +
  24088. + // Channel Entry List
  24089. +
  24090. +#ifdef CONFIG_CONCURRENT_MODE
  24091. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  24092. + {
  24093. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  24094. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  24095. +
  24096. + // Operating Class
  24097. + if ( pbuddy_mlmeext->cur_channel > 14 )
  24098. + {
  24099. + if ( pbuddy_mlmeext->cur_channel >= 149 )
  24100. + {
  24101. + p2pie[ p2pielen++ ] = 0x7c;
  24102. + }
  24103. + else
  24104. + {
  24105. + p2pie[ p2pielen++ ] = 0x73;
  24106. + }
  24107. + }
  24108. + else
  24109. + {
  24110. + p2pie[ p2pielen++ ] = 0x51;
  24111. + }
  24112. +
  24113. + // Number of Channels
  24114. + // Just support 1 channel and this channel is AP's channel
  24115. + p2pie[ p2pielen++ ] = 1;
  24116. +
  24117. + // Channel List
  24118. + p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
  24119. + }
  24120. + else
  24121. + {
  24122. + int i,j;
  24123. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  24124. + // Operating Class
  24125. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  24126. +
  24127. + // Number of Channels
  24128. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  24129. +
  24130. + // Channel List
  24131. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  24132. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  24133. + }
  24134. + }
  24135. + }
  24136. +#else // CONFIG_CONCURRENT_MODE
  24137. + {
  24138. + int i,j;
  24139. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  24140. + // Operating Class
  24141. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  24142. +
  24143. + // Number of Channels
  24144. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  24145. +
  24146. + // Channel List
  24147. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  24148. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  24149. + }
  24150. + }
  24151. + }
  24152. +#endif // CONFIG_CONCURRENT_MODE
  24153. +
  24154. + // Device Info
  24155. + // Type:
  24156. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  24157. +
  24158. + // Length:
  24159. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  24160. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  24161. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  24162. + p2pielen += 2;
  24163. +
  24164. + // Value:
  24165. + // P2P Device Address
  24166. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  24167. + p2pielen += ETH_ALEN;
  24168. +
  24169. + // Config Method
  24170. + // This field should be big endian. Noted by P2P specification.
  24171. +
  24172. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
  24173. +
  24174. + p2pielen += 2;
  24175. +
  24176. + // Primary Device Type
  24177. + // Category ID
  24178. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  24179. + p2pielen += 2;
  24180. +
  24181. + // OUI
  24182. + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  24183. + p2pielen += 4;
  24184. +
  24185. + // Sub Category ID
  24186. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  24187. + p2pielen += 2;
  24188. +
  24189. + // Number of Secondary Device Types
  24190. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  24191. +
  24192. + // Device Name
  24193. + // Type:
  24194. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  24195. + p2pielen += 2;
  24196. +
  24197. + // Length:
  24198. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  24199. + p2pielen += 2;
  24200. +
  24201. + // Value:
  24202. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );
  24203. + p2pielen += pwdinfo->device_name_len;
  24204. +
  24205. +
  24206. + // Operating Channel
  24207. + // Type:
  24208. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  24209. +
  24210. + // Length:
  24211. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  24212. + p2pielen += 2;
  24213. +
  24214. + // Value:
  24215. + // Country String
  24216. + p2pie[ p2pielen++ ] = 'X';
  24217. + p2pie[ p2pielen++ ] = 'X';
  24218. +
  24219. + // The third byte should be set to 0x04.
  24220. + // Described in the "Operating Channel Attribute" section.
  24221. + p2pie[ p2pielen++ ] = 0x04;
  24222. +
  24223. + // Operating Class
  24224. + if ( pwdinfo->operating_channel <= 14 )
  24225. + {
  24226. + // Operating Class
  24227. + p2pie[ p2pielen++ ] = 0x51;
  24228. + }
  24229. + else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
  24230. + {
  24231. + // Operating Class
  24232. + p2pie[ p2pielen++ ] = 0x73;
  24233. + }
  24234. + else
  24235. + {
  24236. + // Operating Class
  24237. + p2pie[ p2pielen++ ] = 0x7c;
  24238. + }
  24239. +
  24240. + // Channel Number
  24241. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
  24242. +
  24243. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  24244. +
  24245. +#ifdef CONFIG_WFD
  24246. + wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe);
  24247. + pframe += wfdielen;
  24248. + pattrib->pktlen += wfdielen;
  24249. +#endif //CONFIG_WFD
  24250. +
  24251. + pattrib->last_txcmdsz = pattrib->pktlen;
  24252. +
  24253. + dump_mgntframe(padapter, pmgntframe);
  24254. +
  24255. + return;
  24256. +
  24257. +}
  24258. +
  24259. +
  24260. +void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result)
  24261. +{
  24262. +
  24263. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  24264. + u8 action = P2P_PUB_ACTION_ACTION;
  24265. + u32 p2poui = cpu_to_be32(P2POUI);
  24266. + u8 oui_subtype = P2P_GO_NEGO_RESP;
  24267. + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
  24268. + u8 p2pielen = 0, i;
  24269. + uint wpsielen = 0;
  24270. + u16 wps_devicepassword_id = 0x0000;
  24271. + uint wps_devicepassword_id_len = 0;
  24272. + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh;
  24273. + u16 len_channellist_attr = 0;
  24274. +
  24275. + struct xmit_frame *pmgntframe;
  24276. + struct pkt_attrib *pattrib;
  24277. + unsigned char *pframe;
  24278. + struct rtw_ieee80211_hdr *pwlanhdr;
  24279. + unsigned short *fctrl;
  24280. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  24281. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  24282. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  24283. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
  24284. +
  24285. +#ifdef CONFIG_WFD
  24286. + u32 wfdielen = 0;
  24287. +#endif //CONFIG_WFD
  24288. +
  24289. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  24290. + {
  24291. + return;
  24292. + }
  24293. +
  24294. + DBG_871X( "[%s] In, result = %d\n", __FUNCTION__, result );
  24295. + //update attribute
  24296. + pattrib = &pmgntframe->attrib;
  24297. + update_mgntframe_attrib(padapter, pattrib);
  24298. +
  24299. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  24300. +
  24301. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  24302. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  24303. +
  24304. + fctrl = &(pwlanhdr->frame_ctl);
  24305. + *(fctrl) = 0;
  24306. +
  24307. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  24308. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  24309. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  24310. +
  24311. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  24312. + pmlmeext->mgnt_seq++;
  24313. + SetFrameSubType(pframe, WIFI_ACTION);
  24314. +
  24315. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  24316. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  24317. +
  24318. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  24319. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  24320. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  24321. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  24322. + pwdinfo->negotiation_dialog_token = frame_body[7]; // The Dialog Token of provisioning discovery request frame.
  24323. + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));
  24324. +
  24325. + // Commented by Albert 20110328
  24326. + // Try to get the device password ID from the WPS IE of group negotiation request frame
  24327. + // WiFi Direct test plan 5.1.15
  24328. + rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);
  24329. + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);
  24330. + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );
  24331. +
  24332. + _rtw_memset( wpsie, 0x00, 255 );
  24333. + wpsielen = 0;
  24334. +
  24335. + // WPS Section
  24336. + wpsielen = 0;
  24337. + // WPS OUI
  24338. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  24339. + wpsielen += 4;
  24340. +
  24341. + // WPS version
  24342. + // Type:
  24343. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  24344. + wpsielen += 2;
  24345. +
  24346. + // Length:
  24347. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  24348. + wpsielen += 2;
  24349. +
  24350. + // Value:
  24351. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  24352. +
  24353. + // Device Password ID
  24354. + // Type:
  24355. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );
  24356. + wpsielen += 2;
  24357. +
  24358. + // Length:
  24359. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  24360. + wpsielen += 2;
  24361. +
  24362. + // Value:
  24363. + if ( wps_devicepassword_id == WPS_DPID_USER_SPEC )
  24364. + {
  24365. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );
  24366. + }
  24367. + else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )
  24368. + {
  24369. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );
  24370. + }
  24371. + else
  24372. + {
  24373. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );
  24374. + }
  24375. + wpsielen += 2;
  24376. +
  24377. + // Commented by Kurt 20120113
  24378. + // If some device wants to do p2p handshake without sending prov_disc_req
  24379. + // We have to get peer_req_cm from here.
  24380. + if(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3) )
  24381. + {
  24382. + if ( wps_devicepassword_id == WPS_DPID_USER_SPEC )
  24383. + {
  24384. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 );
  24385. + }
  24386. + else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )
  24387. + {
  24388. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 );
  24389. + }
  24390. + else
  24391. + {
  24392. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 );
  24393. + }
  24394. + }
  24395. +
  24396. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  24397. +
  24398. +
  24399. + // P2P IE Section.
  24400. +
  24401. + // P2P OUI
  24402. + p2pielen = 0;
  24403. + p2pie[ p2pielen++ ] = 0x50;
  24404. + p2pie[ p2pielen++ ] = 0x6F;
  24405. + p2pie[ p2pielen++ ] = 0x9A;
  24406. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  24407. +
  24408. + // Commented by Albert 20100908
  24409. + // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes
  24410. + // 1. Status
  24411. + // 2. P2P Capability
  24412. + // 3. Group Owner Intent
  24413. + // 4. Configuration Timeout
  24414. + // 5. Operating Channel
  24415. + // 6. Intended P2P Interface Address
  24416. + // 7. Channel List
  24417. + // 8. Device Info
  24418. + // 9. Group ID ( Only GO )
  24419. +
  24420. +
  24421. + // ToDo:
  24422. +
  24423. + // P2P Status
  24424. + // Type:
  24425. + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
  24426. +
  24427. + // Length:
  24428. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  24429. + p2pielen += 2;
  24430. +
  24431. + // Value:
  24432. + p2pie[ p2pielen++ ] = result;
  24433. +
  24434. + // P2P Capability
  24435. + // Type:
  24436. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  24437. +
  24438. + // Length:
  24439. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  24440. + p2pielen += 2;
  24441. +
  24442. + // Value:
  24443. + // Device Capability Bitmap, 1 byte
  24444. +
  24445. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
  24446. + {
  24447. + // Commented by Albert 2011/03/08
  24448. + // According to the P2P specification
  24449. + // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame
  24450. + p2pie[ p2pielen++ ] = 0;
  24451. + }
  24452. + else
  24453. + {
  24454. + // Be group owner or meet the error case
  24455. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  24456. + }
  24457. +
  24458. + // Group Capability Bitmap, 1 byte
  24459. + if ( pwdinfo->persistent_supported )
  24460. + {
  24461. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
  24462. + }
  24463. + else
  24464. + {
  24465. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;
  24466. + }
  24467. +
  24468. + // Group Owner Intent
  24469. + // Type:
  24470. + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;
  24471. +
  24472. + // Length:
  24473. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  24474. + p2pielen += 2;
  24475. +
  24476. + // Value:
  24477. + if ( pwdinfo->peer_intent & 0x01 )
  24478. + {
  24479. + // Peer's tie breaker bit is 1, our tie breaker bit should be 0
  24480. + p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 );
  24481. + }
  24482. + else
  24483. + {
  24484. + // Peer's tie breaker bit is 0, our tie breaker bit should be 1
  24485. + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
  24486. + }
  24487. +
  24488. +
  24489. + // Configuration Timeout
  24490. + // Type:
  24491. + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
  24492. +
  24493. + // Length:
  24494. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  24495. + p2pielen += 2;
  24496. +
  24497. + // Value:
  24498. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
  24499. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
  24500. +
  24501. + // Operating Channel
  24502. + // Type:
  24503. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  24504. +
  24505. + // Length:
  24506. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  24507. + p2pielen += 2;
  24508. +
  24509. + // Value:
  24510. + // Country String
  24511. + p2pie[ p2pielen++ ] = 'X';
  24512. + p2pie[ p2pielen++ ] = 'X';
  24513. +
  24514. + // The third byte should be set to 0x04.
  24515. + // Described in the "Operating Channel Attribute" section.
  24516. + p2pie[ p2pielen++ ] = 0x04;
  24517. +
  24518. + // Operating Class
  24519. + if ( pwdinfo->operating_channel <= 14 )
  24520. + {
  24521. + // Operating Class
  24522. + p2pie[ p2pielen++ ] = 0x51;
  24523. + }
  24524. + else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
  24525. + {
  24526. + // Operating Class
  24527. + p2pie[ p2pielen++ ] = 0x73;
  24528. + }
  24529. + else
  24530. + {
  24531. + // Operating Class
  24532. + p2pie[ p2pielen++ ] = 0x7c;
  24533. + }
  24534. +
  24535. + // Channel Number
  24536. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
  24537. +
  24538. + // Intended P2P Interface Address
  24539. + // Type:
  24540. + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;
  24541. +
  24542. + // Length:
  24543. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
  24544. + p2pielen += 2;
  24545. +
  24546. + // Value:
  24547. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  24548. + p2pielen += ETH_ALEN;
  24549. +
  24550. + // Channel List
  24551. + // Type:
  24552. + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
  24553. +
  24554. + // Country String(3)
  24555. + // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
  24556. + // + number of channels in all classes
  24557. + len_channellist_attr = 3
  24558. + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
  24559. + + get_reg_classes_full_count(pmlmeext->channel_list);
  24560. +
  24561. +#ifdef CONFIG_CONCURRENT_MODE
  24562. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  24563. + {
  24564. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
  24565. + }
  24566. + else
  24567. + {
  24568. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  24569. + }
  24570. +#else
  24571. +
  24572. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  24573. +
  24574. + #endif
  24575. + p2pielen += 2;
  24576. +
  24577. + // Value:
  24578. + // Country String
  24579. + p2pie[ p2pielen++ ] = 'X';
  24580. + p2pie[ p2pielen++ ] = 'X';
  24581. +
  24582. + // The third byte should be set to 0x04.
  24583. + // Described in the "Operating Channel Attribute" section.
  24584. + p2pie[ p2pielen++ ] = 0x04;
  24585. +
  24586. + // Channel Entry List
  24587. +
  24588. +#ifdef CONFIG_CONCURRENT_MODE
  24589. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  24590. + {
  24591. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  24592. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  24593. +
  24594. + // Operating Class
  24595. + if ( pbuddy_mlmeext->cur_channel > 14 )
  24596. + {
  24597. + if ( pbuddy_mlmeext->cur_channel >= 149 )
  24598. + {
  24599. + p2pie[ p2pielen++ ] = 0x7c;
  24600. + }
  24601. + else
  24602. + {
  24603. + p2pie[ p2pielen++ ] = 0x73;
  24604. + }
  24605. + }
  24606. + else
  24607. + {
  24608. + p2pie[ p2pielen++ ] = 0x51;
  24609. + }
  24610. +
  24611. + // Number of Channels
  24612. + // Just support 1 channel and this channel is AP's channel
  24613. + p2pie[ p2pielen++ ] = 1;
  24614. +
  24615. + // Channel List
  24616. + p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
  24617. + }
  24618. + else
  24619. + {
  24620. + int i, j;
  24621. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  24622. + // Operating Class
  24623. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  24624. +
  24625. + // Number of Channels
  24626. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  24627. +
  24628. + // Channel List
  24629. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  24630. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  24631. + }
  24632. + }
  24633. + }
  24634. +#else // CONFIG_CONCURRENT_MODE
  24635. + {
  24636. + int i, j;
  24637. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  24638. + // Operating Class
  24639. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  24640. +
  24641. + // Number of Channels
  24642. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  24643. +
  24644. + // Channel List
  24645. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  24646. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  24647. + }
  24648. + }
  24649. + }
  24650. +#endif // CONFIG_CONCURRENT_MODE
  24651. +
  24652. + // Device Info
  24653. + // Type:
  24654. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  24655. +
  24656. + // Length:
  24657. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  24658. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  24659. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  24660. + p2pielen += 2;
  24661. +
  24662. + // Value:
  24663. + // P2P Device Address
  24664. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  24665. + p2pielen += ETH_ALEN;
  24666. +
  24667. + // Config Method
  24668. + // This field should be big endian. Noted by P2P specification.
  24669. +
  24670. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
  24671. +
  24672. + p2pielen += 2;
  24673. +
  24674. + // Primary Device Type
  24675. + // Category ID
  24676. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  24677. + p2pielen += 2;
  24678. +
  24679. + // OUI
  24680. + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  24681. + p2pielen += 4;
  24682. +
  24683. + // Sub Category ID
  24684. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  24685. + p2pielen += 2;
  24686. +
  24687. + // Number of Secondary Device Types
  24688. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  24689. +
  24690. + // Device Name
  24691. + // Type:
  24692. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  24693. + p2pielen += 2;
  24694. +
  24695. + // Length:
  24696. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  24697. + p2pielen += 2;
  24698. +
  24699. + // Value:
  24700. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );
  24701. + p2pielen += pwdinfo->device_name_len;
  24702. +
  24703. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
  24704. + {
  24705. + // Group ID Attribute
  24706. + // Type:
  24707. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
  24708. +
  24709. + // Length:
  24710. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );
  24711. + p2pielen += 2;
  24712. +
  24713. + // Value:
  24714. + // p2P Device Address
  24715. + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );
  24716. + p2pielen += ETH_ALEN;
  24717. +
  24718. + // SSID
  24719. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
  24720. + p2pielen += pwdinfo->nego_ssidlen;
  24721. +
  24722. + }
  24723. +
  24724. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  24725. +
  24726. +#ifdef CONFIG_WFD
  24727. + wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);
  24728. + pframe += wfdielen;
  24729. + pattrib->pktlen += wfdielen;
  24730. +#endif //CONFIG_WFD
  24731. +
  24732. + pattrib->last_txcmdsz = pattrib->pktlen;
  24733. +
  24734. + dump_mgntframe(padapter, pmgntframe);
  24735. +
  24736. + return;
  24737. +
  24738. +}
  24739. +
  24740. +void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result)
  24741. +{
  24742. +
  24743. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  24744. + u8 action = P2P_PUB_ACTION_ACTION;
  24745. + u32 p2poui = cpu_to_be32(P2POUI);
  24746. + u8 oui_subtype = P2P_GO_NEGO_CONF;
  24747. + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
  24748. + u8 wpsielen = 0, p2pielen = 0;
  24749. +
  24750. + struct xmit_frame *pmgntframe;
  24751. + struct pkt_attrib *pattrib;
  24752. + unsigned char *pframe;
  24753. + struct rtw_ieee80211_hdr *pwlanhdr;
  24754. + unsigned short *fctrl;
  24755. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  24756. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  24757. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  24758. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
  24759. +#ifdef CONFIG_WFD
  24760. + u32 wfdielen = 0;
  24761. +#endif //CONFIG_WFD
  24762. +
  24763. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  24764. + {
  24765. + return;
  24766. + }
  24767. +
  24768. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  24769. + //update attribute
  24770. + pattrib = &pmgntframe->attrib;
  24771. + update_mgntframe_attrib(padapter, pattrib);
  24772. +
  24773. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  24774. +
  24775. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  24776. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  24777. +
  24778. + fctrl = &(pwlanhdr->frame_ctl);
  24779. + *(fctrl) = 0;
  24780. +
  24781. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  24782. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  24783. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  24784. +
  24785. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  24786. + pmlmeext->mgnt_seq++;
  24787. + SetFrameSubType(pframe, WIFI_ACTION);
  24788. +
  24789. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  24790. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  24791. +
  24792. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  24793. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  24794. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  24795. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  24796. + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));
  24797. +
  24798. +
  24799. +
  24800. + // P2P IE Section.
  24801. +
  24802. + // P2P OUI
  24803. + p2pielen = 0;
  24804. + p2pie[ p2pielen++ ] = 0x50;
  24805. + p2pie[ p2pielen++ ] = 0x6F;
  24806. + p2pie[ p2pielen++ ] = 0x9A;
  24807. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  24808. +
  24809. + // Commented by Albert 20110306
  24810. + // According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes
  24811. + // 1. Status
  24812. + // 2. P2P Capability
  24813. + // 3. Operating Channel
  24814. + // 4. Channel List
  24815. + // 5. Group ID ( if this WiFi is GO )
  24816. +
  24817. + // P2P Status
  24818. + // Type:
  24819. + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
  24820. +
  24821. + // Length:
  24822. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  24823. + p2pielen += 2;
  24824. +
  24825. + // Value:
  24826. + p2pie[ p2pielen++ ] = result;
  24827. +
  24828. + // P2P Capability
  24829. + // Type:
  24830. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  24831. +
  24832. + // Length:
  24833. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  24834. + p2pielen += 2;
  24835. +
  24836. + // Value:
  24837. + // Device Capability Bitmap, 1 byte
  24838. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  24839. +
  24840. + // Group Capability Bitmap, 1 byte
  24841. + if ( pwdinfo->persistent_supported )
  24842. + {
  24843. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
  24844. + }
  24845. + else
  24846. + {
  24847. + p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;
  24848. + }
  24849. +
  24850. +
  24851. + // Operating Channel
  24852. + // Type:
  24853. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  24854. +
  24855. + // Length:
  24856. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  24857. + p2pielen += 2;
  24858. +
  24859. + // Value:
  24860. + // Country String
  24861. + p2pie[ p2pielen++ ] = 'X';
  24862. + p2pie[ p2pielen++ ] = 'X';
  24863. +
  24864. + // The third byte should be set to 0x04.
  24865. + // Described in the "Operating Channel Attribute" section.
  24866. + p2pie[ p2pielen++ ] = 0x04;
  24867. +
  24868. +
  24869. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
  24870. + {
  24871. + if ( pwdinfo->peer_operating_ch <= 14 )
  24872. + {
  24873. + // Operating Class
  24874. + p2pie[ p2pielen++ ] = 0x51;
  24875. + }
  24876. + else if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) )
  24877. + {
  24878. + // Operating Class
  24879. + p2pie[ p2pielen++ ] = 0x73;
  24880. + }
  24881. + else
  24882. + {
  24883. + // Operating Class
  24884. + p2pie[ p2pielen++ ] = 0x7c;
  24885. + }
  24886. +
  24887. + p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch;
  24888. + }
  24889. + else
  24890. + {
  24891. + if ( pwdinfo->operating_channel <= 14 )
  24892. + {
  24893. + // Operating Class
  24894. + p2pie[ p2pielen++ ] = 0x51;
  24895. + }
  24896. + else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
  24897. + {
  24898. + // Operating Class
  24899. + p2pie[ p2pielen++ ] = 0x73;
  24900. + }
  24901. + else
  24902. + {
  24903. + // Operating Class
  24904. + p2pie[ p2pielen++ ] = 0x7c;
  24905. + }
  24906. +
  24907. + // Channel Number
  24908. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel
  24909. + }
  24910. +
  24911. +
  24912. + // Channel List
  24913. + // Type:
  24914. + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
  24915. +
  24916. + *(u16*) ( p2pie + p2pielen ) = 6;
  24917. + p2pielen += 2;
  24918. +
  24919. + // Country String
  24920. + p2pie[ p2pielen++ ] = 'X';
  24921. + p2pie[ p2pielen++ ] = 'X';
  24922. +
  24923. + // The third byte should be set to 0x04.
  24924. + // Described in the "Operating Channel Attribute" section.
  24925. + p2pie[ p2pielen++ ] = 0x04;
  24926. +
  24927. + // Value:
  24928. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
  24929. + {
  24930. + if ( pwdinfo->peer_operating_ch <= 14 )
  24931. + {
  24932. + // Operating Class
  24933. + p2pie[ p2pielen++ ] = 0x51;
  24934. + }
  24935. + else if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) )
  24936. + {
  24937. + // Operating Class
  24938. + p2pie[ p2pielen++ ] = 0x73;
  24939. + }
  24940. + else
  24941. + {
  24942. + // Operating Class
  24943. + p2pie[ p2pielen++ ] = 0x7c;
  24944. + }
  24945. + p2pie[ p2pielen++ ] = 1;
  24946. + p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch;
  24947. + }
  24948. + else
  24949. + {
  24950. + if ( pwdinfo->operating_channel <= 14 )
  24951. + {
  24952. + // Operating Class
  24953. + p2pie[ p2pielen++ ] = 0x51;
  24954. + }
  24955. + else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
  24956. + {
  24957. + // Operating Class
  24958. + p2pie[ p2pielen++ ] = 0x73;
  24959. + }
  24960. + else
  24961. + {
  24962. + // Operating Class
  24963. + p2pie[ p2pielen++ ] = 0x7c;
  24964. + }
  24965. +
  24966. + // Channel Number
  24967. + p2pie[ p2pielen++ ] = 1;
  24968. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel
  24969. + }
  24970. +
  24971. + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
  24972. + {
  24973. + // Group ID Attribute
  24974. + // Type:
  24975. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
  24976. +
  24977. + // Length:
  24978. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );
  24979. + p2pielen += 2;
  24980. +
  24981. + // Value:
  24982. + // p2P Device Address
  24983. + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );
  24984. + p2pielen += ETH_ALEN;
  24985. +
  24986. + // SSID
  24987. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
  24988. + p2pielen += pwdinfo->nego_ssidlen;
  24989. + }
  24990. +
  24991. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  24992. +
  24993. +#ifdef CONFIG_WFD
  24994. + wfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe);
  24995. + pframe += wfdielen;
  24996. + pattrib->pktlen += wfdielen;
  24997. +#endif //CONFIG_WFD
  24998. +
  24999. + pattrib->last_txcmdsz = pattrib->pktlen;
  25000. +
  25001. + dump_mgntframe(padapter, pmgntframe);
  25002. +
  25003. + return;
  25004. +
  25005. +}
  25006. +
  25007. +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr )
  25008. +{
  25009. +
  25010. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  25011. + u8 action = P2P_PUB_ACTION_ACTION;
  25012. + u32 p2poui = cpu_to_be32(P2POUI);
  25013. + u8 oui_subtype = P2P_INVIT_REQ;
  25014. + u8 p2pie[ 255 ] = { 0x00 };
  25015. + u8 p2pielen = 0, i;
  25016. + u8 dialogToken = 3;
  25017. + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;
  25018. + u16 len_channellist_attr = 0;
  25019. +#ifdef CONFIG_WFD
  25020. + u32 wfdielen = 0;
  25021. +#endif //CONFIG_WFD
  25022. +#ifdef CONFIG_CONCURRENT_MODE
  25023. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  25024. + struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  25025. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  25026. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  25027. +#endif
  25028. +
  25029. + struct xmit_frame *pmgntframe;
  25030. + struct pkt_attrib *pattrib;
  25031. + unsigned char *pframe;
  25032. + struct rtw_ieee80211_hdr *pwlanhdr;
  25033. + unsigned short *fctrl;
  25034. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  25035. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  25036. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  25037. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
  25038. +
  25039. +
  25040. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  25041. + {
  25042. + return;
  25043. + }
  25044. +
  25045. + //update attribute
  25046. + pattrib = &pmgntframe->attrib;
  25047. + update_mgntframe_attrib(padapter, pattrib);
  25048. +
  25049. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  25050. +
  25051. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  25052. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  25053. +
  25054. + fctrl = &(pwlanhdr->frame_ctl);
  25055. + *(fctrl) = 0;
  25056. +
  25057. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  25058. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  25059. + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN);
  25060. +
  25061. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  25062. + pmlmeext->mgnt_seq++;
  25063. + SetFrameSubType(pframe, WIFI_ACTION);
  25064. +
  25065. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  25066. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  25067. +
  25068. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  25069. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  25070. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  25071. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  25072. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  25073. +
  25074. + // P2P IE Section.
  25075. +
  25076. + // P2P OUI
  25077. + p2pielen = 0;
  25078. + p2pie[ p2pielen++ ] = 0x50;
  25079. + p2pie[ p2pielen++ ] = 0x6F;
  25080. + p2pie[ p2pielen++ ] = 0x9A;
  25081. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  25082. +
  25083. + // Commented by Albert 20101011
  25084. + // According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes
  25085. + // 1. Configuration Timeout
  25086. + // 2. Invitation Flags
  25087. + // 3. Operating Channel ( Only GO )
  25088. + // 4. P2P Group BSSID ( Should be included if I am the GO )
  25089. + // 5. Channel List
  25090. + // 6. P2P Group ID
  25091. + // 7. P2P Device Info
  25092. +
  25093. + // Configuration Timeout
  25094. + // Type:
  25095. + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
  25096. +
  25097. + // Length:
  25098. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  25099. + p2pielen += 2;
  25100. +
  25101. + // Value:
  25102. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
  25103. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
  25104. +
  25105. + // Invitation Flags
  25106. + // Type:
  25107. + p2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS;
  25108. +
  25109. + // Length:
  25110. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  25111. + p2pielen += 2;
  25112. +
  25113. + // Value:
  25114. + p2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT;
  25115. +
  25116. +
  25117. + // Operating Channel
  25118. + // Type:
  25119. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  25120. +
  25121. + // Length:
  25122. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  25123. + p2pielen += 2;
  25124. +
  25125. + // Value:
  25126. + // Country String
  25127. + p2pie[ p2pielen++ ] = 'X';
  25128. + p2pie[ p2pielen++ ] = 'X';
  25129. +
  25130. + // The third byte should be set to 0x04.
  25131. + // Described in the "Operating Channel Attribute" section.
  25132. + p2pie[ p2pielen++ ] = 0x04;
  25133. +
  25134. + // Operating Class
  25135. + if ( pwdinfo->invitereq_info.operating_ch <= 14 )
  25136. + p2pie[ p2pielen++ ] = 0x51;
  25137. + else if ( ( pwdinfo->invitereq_info.operating_ch >= 36 ) && ( pwdinfo->invitereq_info.operating_ch <= 48 ) )
  25138. + p2pie[ p2pielen++ ] = 0x73;
  25139. + else
  25140. + p2pie[ p2pielen++ ] = 0x7c;
  25141. +
  25142. + // Channel Number
  25143. + p2pie[ p2pielen++ ] = pwdinfo->invitereq_info.operating_ch; // operating channel number
  25144. +
  25145. + if ( _rtw_memcmp( myid( &padapter->eeprompriv ), pwdinfo->invitereq_info.go_bssid, ETH_ALEN ) )
  25146. + {
  25147. + // P2P Group BSSID
  25148. + // Type:
  25149. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;
  25150. +
  25151. + // Length:
  25152. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
  25153. + p2pielen += 2;
  25154. +
  25155. + // Value:
  25156. + // P2P Device Address for GO
  25157. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN );
  25158. + p2pielen += ETH_ALEN;
  25159. + }
  25160. +
  25161. + // Channel List
  25162. + // Type:
  25163. + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
  25164. +
  25165. +
  25166. + // Length:
  25167. + // Country String(3)
  25168. + // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
  25169. + // + number of channels in all classes
  25170. + len_channellist_attr = 3
  25171. + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
  25172. + + get_reg_classes_full_count(pmlmeext->channel_list);
  25173. +
  25174. +#ifdef CONFIG_CONCURRENT_MODE
  25175. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  25176. + {
  25177. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
  25178. + }
  25179. + else
  25180. + {
  25181. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  25182. + }
  25183. +#else
  25184. +
  25185. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  25186. +
  25187. + #endif
  25188. + p2pielen += 2;
  25189. +
  25190. + // Value:
  25191. + // Country String
  25192. + p2pie[ p2pielen++ ] = 'X';
  25193. + p2pie[ p2pielen++ ] = 'X';
  25194. +
  25195. + // The third byte should be set to 0x04.
  25196. + // Described in the "Operating Channel Attribute" section.
  25197. + p2pie[ p2pielen++ ] = 0x04;
  25198. +
  25199. + // Channel Entry List
  25200. +#ifdef CONFIG_CONCURRENT_MODE
  25201. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  25202. + {
  25203. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  25204. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  25205. +
  25206. + // Operating Class
  25207. + if ( pbuddy_mlmeext->cur_channel > 14 )
  25208. + {
  25209. + if ( pbuddy_mlmeext->cur_channel >= 149 )
  25210. + {
  25211. + p2pie[ p2pielen++ ] = 0x7c;
  25212. + }
  25213. + else
  25214. + {
  25215. + p2pie[ p2pielen++ ] = 0x73;
  25216. + }
  25217. + }
  25218. + else
  25219. + {
  25220. + p2pie[ p2pielen++ ] = 0x51;
  25221. + }
  25222. +
  25223. + // Number of Channels
  25224. + // Just support 1 channel and this channel is AP's channel
  25225. + p2pie[ p2pielen++ ] = 1;
  25226. +
  25227. + // Channel List
  25228. + p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
  25229. + }
  25230. + else
  25231. + {
  25232. + int i, j;
  25233. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  25234. + // Operating Class
  25235. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  25236. +
  25237. + // Number of Channels
  25238. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  25239. +
  25240. + // Channel List
  25241. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  25242. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  25243. + }
  25244. + }
  25245. + }
  25246. +#else // CONFIG_CONCURRENT_MODE
  25247. + {
  25248. + int i, j;
  25249. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  25250. + // Operating Class
  25251. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  25252. +
  25253. + // Number of Channels
  25254. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  25255. +
  25256. + // Channel List
  25257. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  25258. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  25259. + }
  25260. + }
  25261. + }
  25262. +#endif // CONFIG_CONCURRENT_MODE
  25263. +
  25264. +
  25265. + // P2P Group ID
  25266. + // Type:
  25267. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
  25268. +
  25269. + // Length:
  25270. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen );
  25271. + p2pielen += 2;
  25272. +
  25273. + // Value:
  25274. + // P2P Device Address for GO
  25275. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN );
  25276. + p2pielen += ETH_ALEN;
  25277. +
  25278. + // SSID
  25279. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen );
  25280. + p2pielen += pwdinfo->invitereq_info.ssidlen;
  25281. +
  25282. +
  25283. + // Device Info
  25284. + // Type:
  25285. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  25286. +
  25287. + // Length:
  25288. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  25289. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  25290. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  25291. + p2pielen += 2;
  25292. +
  25293. + // Value:
  25294. + // P2P Device Address
  25295. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  25296. + p2pielen += ETH_ALEN;
  25297. +
  25298. + // Config Method
  25299. + // This field should be big endian. Noted by P2P specification.
  25300. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );
  25301. + p2pielen += 2;
  25302. +
  25303. + // Primary Device Type
  25304. + // Category ID
  25305. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  25306. + p2pielen += 2;
  25307. +
  25308. + // OUI
  25309. + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  25310. + p2pielen += 4;
  25311. +
  25312. + // Sub Category ID
  25313. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  25314. + p2pielen += 2;
  25315. +
  25316. + // Number of Secondary Device Types
  25317. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  25318. +
  25319. + // Device Name
  25320. + // Type:
  25321. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  25322. + p2pielen += 2;
  25323. +
  25324. + // Length:
  25325. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  25326. + p2pielen += 2;
  25327. +
  25328. + // Value:
  25329. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );
  25330. + p2pielen += pwdinfo->device_name_len;
  25331. +
  25332. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  25333. +
  25334. +#ifdef CONFIG_WFD
  25335. + wfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe);
  25336. + pframe += wfdielen;
  25337. + pattrib->pktlen += wfdielen;
  25338. +#endif //CONFIG_WFD
  25339. +
  25340. + pattrib->last_txcmdsz = pattrib->pktlen;
  25341. +
  25342. + dump_mgntframe(padapter, pmgntframe);
  25343. +
  25344. + return;
  25345. +
  25346. +}
  25347. +
  25348. +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 status_code)
  25349. +{
  25350. +
  25351. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  25352. + u8 action = P2P_PUB_ACTION_ACTION;
  25353. + u32 p2poui = cpu_to_be32(P2POUI);
  25354. + u8 oui_subtype = P2P_INVIT_RESP;
  25355. + u8 p2pie[ 255 ] = { 0x00 };
  25356. + u8 p2pielen = 0, i;
  25357. + u8 channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;
  25358. + u16 len_channellist_attr = 0;
  25359. +#ifdef CONFIG_CONCURRENT_MODE
  25360. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  25361. + struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  25362. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  25363. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  25364. +#endif
  25365. +#ifdef CONFIG_WFD
  25366. + u32 wfdielen = 0;
  25367. +#endif //CONFIG_WFD
  25368. +
  25369. + struct xmit_frame *pmgntframe;
  25370. + struct pkt_attrib *pattrib;
  25371. + unsigned char *pframe;
  25372. + struct rtw_ieee80211_hdr *pwlanhdr;
  25373. + unsigned short *fctrl;
  25374. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  25375. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  25376. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  25377. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo);
  25378. +
  25379. +
  25380. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  25381. + {
  25382. + return;
  25383. + }
  25384. +
  25385. + //update attribute
  25386. + pattrib = &pmgntframe->attrib;
  25387. + update_mgntframe_attrib(padapter, pattrib);
  25388. +
  25389. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  25390. +
  25391. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  25392. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  25393. +
  25394. + fctrl = &(pwlanhdr->frame_ctl);
  25395. + *(fctrl) = 0;
  25396. +
  25397. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  25398. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  25399. + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN);
  25400. +
  25401. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  25402. + pmlmeext->mgnt_seq++;
  25403. + SetFrameSubType(pframe, WIFI_ACTION);
  25404. +
  25405. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  25406. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  25407. +
  25408. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  25409. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  25410. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  25411. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  25412. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  25413. +
  25414. + // P2P IE Section.
  25415. +
  25416. + // P2P OUI
  25417. + p2pielen = 0;
  25418. + p2pie[ p2pielen++ ] = 0x50;
  25419. + p2pie[ p2pielen++ ] = 0x6F;
  25420. + p2pie[ p2pielen++ ] = 0x9A;
  25421. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  25422. +
  25423. + // Commented by Albert 20101005
  25424. + // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes
  25425. + // 1. Status
  25426. + // 2. Configuration Timeout
  25427. + // 3. Operating Channel ( Only GO )
  25428. + // 4. P2P Group BSSID ( Only GO )
  25429. + // 5. Channel List
  25430. +
  25431. + // P2P Status
  25432. + // Type:
  25433. + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
  25434. +
  25435. + // Length:
  25436. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
  25437. + p2pielen += 2;
  25438. +
  25439. + // Value:
  25440. + // When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE.
  25441. + // Sent the event receiving the P2P Invitation Req frame to DMP UI.
  25442. + // DMP had to compare the MAC address to find out the profile.
  25443. + // So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB.
  25444. + // If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req
  25445. + // to NB to rebuild the persistent group.
  25446. + p2pie[ p2pielen++ ] = status_code;
  25447. +
  25448. + // Configuration Timeout
  25449. + // Type:
  25450. + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
  25451. +
  25452. + // Length:
  25453. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  25454. + p2pielen += 2;
  25455. +
  25456. + // Value:
  25457. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO
  25458. + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client
  25459. +
  25460. + if( status_code == P2P_STATUS_SUCCESS )
  25461. + {
  25462. + if( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) )
  25463. + {
  25464. + // The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO
  25465. + // In this case, the P2P Invitation response frame should carry the two more P2P attributes.
  25466. + // First one is operating channel attribute.
  25467. + // Second one is P2P Group BSSID attribute.
  25468. +
  25469. + // Operating Channel
  25470. + // Type:
  25471. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  25472. +
  25473. + // Length:
  25474. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  25475. + p2pielen += 2;
  25476. +
  25477. + // Value:
  25478. + // Country String
  25479. + p2pie[ p2pielen++ ] = 'X';
  25480. + p2pie[ p2pielen++ ] = 'X';
  25481. +
  25482. + // The third byte should be set to 0x04.
  25483. + // Described in the "Operating Channel Attribute" section.
  25484. + p2pie[ p2pielen++ ] = 0x04;
  25485. +
  25486. + // Operating Class
  25487. + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7
  25488. +
  25489. + // Channel Number
  25490. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
  25491. +
  25492. +
  25493. + // P2P Group BSSID
  25494. + // Type:
  25495. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;
  25496. +
  25497. + // Length:
  25498. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
  25499. + p2pielen += 2;
  25500. +
  25501. + // Value:
  25502. + // P2P Device Address for GO
  25503. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  25504. + p2pielen += ETH_ALEN;
  25505. +
  25506. + }
  25507. +
  25508. + // Channel List
  25509. + // Type:
  25510. + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
  25511. +
  25512. + // Length:
  25513. + // Country String(3)
  25514. + // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
  25515. + // + number of channels in all classes
  25516. + len_channellist_attr = 3
  25517. + + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
  25518. + + get_reg_classes_full_count(pmlmeext->channel_list);
  25519. +
  25520. +#ifdef CONFIG_CONCURRENT_MODE
  25521. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  25522. + {
  25523. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
  25524. + }
  25525. + else
  25526. + {
  25527. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  25528. + }
  25529. +#else
  25530. +
  25531. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
  25532. +
  25533. +#endif
  25534. + p2pielen += 2;
  25535. +
  25536. + // Value:
  25537. + // Country String
  25538. + p2pie[ p2pielen++ ] = 'X';
  25539. + p2pie[ p2pielen++ ] = 'X';
  25540. +
  25541. + // The third byte should be set to 0x04.
  25542. + // Described in the "Operating Channel Attribute" section.
  25543. + p2pie[ p2pielen++ ] = 0x04;
  25544. +
  25545. + // Channel Entry List
  25546. +#ifdef CONFIG_CONCURRENT_MODE
  25547. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  25548. + {
  25549. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  25550. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  25551. +
  25552. + // Operating Class
  25553. + if ( pbuddy_mlmeext->cur_channel > 14 )
  25554. + {
  25555. + if ( pbuddy_mlmeext->cur_channel >= 149 )
  25556. + {
  25557. + p2pie[ p2pielen++ ] = 0x7c;
  25558. + }
  25559. + else
  25560. + {
  25561. + p2pie[ p2pielen++ ] = 0x73;
  25562. + }
  25563. + }
  25564. + else
  25565. + {
  25566. + p2pie[ p2pielen++ ] = 0x51;
  25567. + }
  25568. +
  25569. + // Number of Channels
  25570. + // Just support 1 channel and this channel is AP's channel
  25571. + p2pie[ p2pielen++ ] = 1;
  25572. +
  25573. + // Channel List
  25574. + p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
  25575. + }
  25576. + else
  25577. + {
  25578. + int i, j;
  25579. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  25580. + // Operating Class
  25581. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  25582. +
  25583. + // Number of Channels
  25584. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  25585. +
  25586. + // Channel List
  25587. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  25588. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  25589. + }
  25590. + }
  25591. + }
  25592. +#else // CONFIG_CONCURRENT_MODE
  25593. + {
  25594. + int i, j;
  25595. + for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
  25596. + // Operating Class
  25597. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
  25598. +
  25599. + // Number of Channels
  25600. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
  25601. +
  25602. + // Channel List
  25603. + for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
  25604. + p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
  25605. + }
  25606. + }
  25607. + }
  25608. +#endif // CONFIG_CONCURRENT_MODE
  25609. + }
  25610. +
  25611. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  25612. +
  25613. +#ifdef CONFIG_WFD
  25614. + wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);
  25615. + pframe += wfdielen;
  25616. + pattrib->pktlen += wfdielen;
  25617. +#endif //CONFIG_WFD
  25618. +
  25619. + pattrib->last_txcmdsz = pattrib->pktlen;
  25620. +
  25621. + dump_mgntframe(padapter, pmgntframe);
  25622. +
  25623. + return;
  25624. +
  25625. +}
  25626. +
  25627. +void issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr )
  25628. +{
  25629. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  25630. + u8 action = P2P_PUB_ACTION_ACTION;
  25631. + u8 dialogToken = 1;
  25632. + u32 p2poui = cpu_to_be32(P2POUI);
  25633. + u8 oui_subtype = P2P_PROVISION_DISC_REQ;
  25634. + u8 wpsie[ 100 ] = { 0x00 };
  25635. + u8 wpsielen = 0;
  25636. + u32 p2pielen = 0;
  25637. +#ifdef CONFIG_WFD
  25638. + u32 wfdielen = 0;
  25639. +#endif //CONFIG_WFD
  25640. +
  25641. + struct xmit_frame *pmgntframe;
  25642. + struct pkt_attrib *pattrib;
  25643. + unsigned char *pframe;
  25644. + struct rtw_ieee80211_hdr *pwlanhdr;
  25645. + unsigned short *fctrl;
  25646. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  25647. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  25648. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  25649. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  25650. +
  25651. +
  25652. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  25653. + {
  25654. + return;
  25655. + }
  25656. +
  25657. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  25658. + //update attribute
  25659. + pattrib = &pmgntframe->attrib;
  25660. + update_mgntframe_attrib(padapter, pattrib);
  25661. +
  25662. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  25663. +
  25664. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  25665. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  25666. +
  25667. + fctrl = &(pwlanhdr->frame_ctl);
  25668. + *(fctrl) = 0;
  25669. +
  25670. + _rtw_memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN);
  25671. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  25672. + _rtw_memcpy(pwlanhdr->addr3, pdev_raddr, ETH_ALEN);
  25673. +
  25674. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  25675. + pmlmeext->mgnt_seq++;
  25676. + SetFrameSubType(pframe, WIFI_ACTION);
  25677. +
  25678. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  25679. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  25680. +
  25681. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  25682. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  25683. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  25684. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  25685. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  25686. +
  25687. + p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr );
  25688. +
  25689. + pframe += p2pielen;
  25690. + pattrib->pktlen += p2pielen;
  25691. +
  25692. + wpsielen = 0;
  25693. + // WPS OUI
  25694. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  25695. + wpsielen += 4;
  25696. +
  25697. + // WPS version
  25698. + // Type:
  25699. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  25700. + wpsielen += 2;
  25701. +
  25702. + // Length:
  25703. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  25704. + wpsielen += 2;
  25705. +
  25706. + // Value:
  25707. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  25708. +
  25709. + // Config Method
  25710. + // Type:
  25711. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
  25712. + wpsielen += 2;
  25713. +
  25714. + // Length:
  25715. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  25716. + wpsielen += 2;
  25717. +
  25718. + // Value:
  25719. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request );
  25720. + wpsielen += 2;
  25721. +
  25722. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  25723. +
  25724. +
  25725. +#ifdef CONFIG_WFD
  25726. + wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
  25727. + pframe += wfdielen;
  25728. + pattrib->pktlen += wfdielen;
  25729. +#endif //CONFIG_WFD
  25730. +
  25731. + pattrib->last_txcmdsz = pattrib->pktlen;
  25732. +
  25733. + dump_mgntframe(padapter, pmgntframe);
  25734. +
  25735. + return;
  25736. +
  25737. +}
  25738. +
  25739. +
  25740. +u8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo )
  25741. +{
  25742. + u8 i, match_result = 0;
  25743. +
  25744. + DBG_871X( "[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__,
  25745. + peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]);
  25746. +
  25747. + for( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ )
  25748. + {
  25749. + DBG_871X( "[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__,
  25750. + profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]);
  25751. + if ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) )
  25752. + {
  25753. + match_result = 1;
  25754. + DBG_871X( "[%s] Match!\n", __FUNCTION__ );
  25755. + break;
  25756. + }
  25757. + }
  25758. +
  25759. + return (match_result );
  25760. +}
  25761. +
  25762. +void issue_probersp_p2p(_adapter *padapter, unsigned char *da)
  25763. +{
  25764. + struct xmit_frame *pmgntframe;
  25765. + struct pkt_attrib *pattrib;
  25766. + unsigned char *pframe;
  25767. + struct rtw_ieee80211_hdr *pwlanhdr;
  25768. + unsigned short *fctrl;
  25769. + unsigned char *mac;
  25770. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  25771. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  25772. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  25773. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  25774. + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  25775. + u16 beacon_interval = 100;
  25776. + u16 capInfo = 0;
  25777. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  25778. + u8 wpsie[255] = { 0x00 };
  25779. + u32 wpsielen = 0, p2pielen = 0;
  25780. +#ifdef CONFIG_WFD
  25781. + u32 wfdielen = 0;
  25782. +#endif //CONFIG_WFD
  25783. +#ifdef CONFIG_INTEL_WIDI
  25784. + u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };
  25785. +#endif //CONFIG_INTEL_WIDI
  25786. +
  25787. + //DBG_871X("%s\n", __FUNCTION__);
  25788. +
  25789. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  25790. + {
  25791. + return;
  25792. + }
  25793. +
  25794. + //update attribute
  25795. + pattrib = &pmgntframe->attrib;
  25796. + update_mgntframe_attrib(padapter, pattrib);
  25797. +
  25798. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  25799. +
  25800. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  25801. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  25802. +
  25803. + mac = myid(&(padapter->eeprompriv));
  25804. +
  25805. + fctrl = &(pwlanhdr->frame_ctl);
  25806. + *(fctrl) = 0;
  25807. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  25808. + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
  25809. +
  25810. + // Use the device address for BSSID field.
  25811. + _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN);
  25812. +
  25813. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  25814. + pmlmeext->mgnt_seq++;
  25815. + SetFrameSubType(fctrl, WIFI_PROBERSP);
  25816. +
  25817. + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  25818. + pattrib->pktlen = pattrib->hdrlen;
  25819. + pframe += pattrib->hdrlen;
  25820. +
  25821. + //timestamp will be inserted by hardware
  25822. + pframe += 8;
  25823. + pattrib->pktlen += 8;
  25824. +
  25825. + // beacon interval: 2 bytes
  25826. + _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2);
  25827. + pframe += 2;
  25828. + pattrib->pktlen += 2;
  25829. +
  25830. + // capability info: 2 bytes
  25831. + // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec)
  25832. + capInfo |= cap_ShortPremble;
  25833. + capInfo |= cap_ShortSlot;
  25834. +
  25835. + _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2);
  25836. + pframe += 2;
  25837. + pattrib->pktlen += 2;
  25838. +
  25839. +
  25840. + // SSID
  25841. + pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen);
  25842. +
  25843. + // supported rates...
  25844. + // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )
  25845. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);
  25846. +
  25847. + // DS parameter set
  25848. + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen);
  25849. +
  25850. +#ifdef CONFIG_IOCTL_CFG80211
  25851. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  25852. + {
  25853. + if( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL )
  25854. + {
  25855. + //WPS IE
  25856. + _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);
  25857. + pattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len;
  25858. + pframe += pmlmepriv->wps_probe_resp_ie_len;
  25859. +
  25860. + //P2P IE
  25861. + _rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len);
  25862. + pattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len;
  25863. + pframe += pmlmepriv->p2p_probe_resp_ie_len;
  25864. + }
  25865. + }
  25866. + else
  25867. +#endif //CONFIG_IOCTL_CFG80211
  25868. + {
  25869. +
  25870. + // Todo: WPS IE
  25871. + // Noted by Albert 20100907
  25872. + // According to the WPS specification, all the WPS attribute is presented by Big Endian.
  25873. +
  25874. + wpsielen = 0;
  25875. + // WPS OUI
  25876. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  25877. + wpsielen += 4;
  25878. +
  25879. + // WPS version
  25880. + // Type:
  25881. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  25882. + wpsielen += 2;
  25883. +
  25884. + // Length:
  25885. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  25886. + wpsielen += 2;
  25887. +
  25888. + // Value:
  25889. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  25890. +
  25891. +#ifdef CONFIG_INTEL_WIDI
  25892. + // Commented by Kurt
  25893. + // Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext.
  25894. + if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE
  25895. + || pmlmepriv->num_p2p_sdt != 0 )
  25896. + {
  25897. + //Sec dev type
  25898. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST );
  25899. + wpsielen += 2;
  25900. +
  25901. + // Length:
  25902. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
  25903. + wpsielen += 2;
  25904. +
  25905. + // Value:
  25906. + // Category ID
  25907. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS );
  25908. + wpsielen += 2;
  25909. +
  25910. + // OUI
  25911. + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI );
  25912. + wpsielen += 4;
  25913. +
  25914. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK );
  25915. + wpsielen += 2;
  25916. +
  25917. + if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE )
  25918. + {
  25919. + // Vendor Extension
  25920. + _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN );
  25921. + wpsielen += L2SDTA_SERVICE_VE_LEN;
  25922. + }
  25923. + }
  25924. +#endif //CONFIG_INTEL_WIDI
  25925. +
  25926. + // WiFi Simple Config State
  25927. + // Type:
  25928. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE );
  25929. + wpsielen += 2;
  25930. +
  25931. + // Length:
  25932. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  25933. + wpsielen += 2;
  25934. +
  25935. + // Value:
  25936. + wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured.
  25937. +
  25938. + // Response Type
  25939. + // Type:
  25940. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE );
  25941. + wpsielen += 2;
  25942. +
  25943. + // Length:
  25944. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  25945. + wpsielen += 2;
  25946. +
  25947. + // Value:
  25948. + wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
  25949. +
  25950. + // UUID-E
  25951. + // Type:
  25952. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );
  25953. + wpsielen += 2;
  25954. +
  25955. + // Length:
  25956. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );
  25957. + wpsielen += 2;
  25958. +
  25959. + // Value:
  25960. + if (pwdinfo->external_uuid == 0) {
  25961. + _rtw_memset( wpsie + wpsielen, 0x0, 16 );
  25962. + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  25963. + } else {
  25964. + _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );
  25965. + }
  25966. + wpsielen += 0x10;
  25967. +
  25968. + // Manufacturer
  25969. + // Type:
  25970. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER );
  25971. + wpsielen += 2;
  25972. +
  25973. + // Length:
  25974. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 );
  25975. + wpsielen += 2;
  25976. +
  25977. + // Value:
  25978. + _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 );
  25979. + wpsielen += 7;
  25980. +
  25981. + // Model Name
  25982. + // Type:
  25983. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME );
  25984. + wpsielen += 2;
  25985. +
  25986. + // Length:
  25987. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 );
  25988. + wpsielen += 2;
  25989. +
  25990. + // Value:
  25991. + _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 );
  25992. + wpsielen += 6;
  25993. +
  25994. + // Model Number
  25995. + // Type:
  25996. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER );
  25997. + wpsielen += 2;
  25998. +
  25999. + // Length:
  26000. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  26001. + wpsielen += 2;
  26002. +
  26003. + // Value:
  26004. + wpsie[ wpsielen++ ] = 0x31; // character 1
  26005. +
  26006. + // Serial Number
  26007. + // Type:
  26008. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER );
  26009. + wpsielen += 2;
  26010. +
  26011. + // Length:
  26012. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN );
  26013. + wpsielen += 2;
  26014. +
  26015. + // Value:
  26016. + _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN );
  26017. + wpsielen += ETH_ALEN;
  26018. +
  26019. + // Primary Device Type
  26020. + // Type:
  26021. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
  26022. + wpsielen += 2;
  26023. +
  26024. + // Length:
  26025. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
  26026. + wpsielen += 2;
  26027. +
  26028. + // Value:
  26029. + // Category ID
  26030. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI );
  26031. + wpsielen += 2;
  26032. +
  26033. + // OUI
  26034. + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );
  26035. + wpsielen += 4;
  26036. +
  26037. + // Sub Category ID
  26038. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP );
  26039. + wpsielen += 2;
  26040. +
  26041. + // Device Name
  26042. + // Type:
  26043. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  26044. + wpsielen += 2;
  26045. +
  26046. + // Length:
  26047. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );
  26048. + wpsielen += 2;
  26049. +
  26050. + // Value:
  26051. + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );
  26052. + wpsielen += pwdinfo->device_name_len;
  26053. +
  26054. + // Config Method
  26055. + // Type:
  26056. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
  26057. + wpsielen += 2;
  26058. +
  26059. + // Length:
  26060. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  26061. + wpsielen += 2;
  26062. +
  26063. + // Value:
  26064. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
  26065. + wpsielen += 2;
  26066. +
  26067. +
  26068. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  26069. +
  26070. +
  26071. + p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);
  26072. + pframe += p2pielen;
  26073. + pattrib->pktlen += p2pielen;
  26074. + }
  26075. +
  26076. +#ifdef CONFIG_WFD
  26077. +#ifdef CONFIG_IOCTL_CFG80211
  26078. + if ( _TRUE == pwdinfo->wfd_info->wfd_enable )
  26079. +#endif //CONFIG_IOCTL_CFG80211
  26080. + {
  26081. + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
  26082. + pframe += wfdielen;
  26083. + pattrib->pktlen += wfdielen;
  26084. + }
  26085. +#ifdef CONFIG_IOCTL_CFG80211
  26086. + else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0)
  26087. + {
  26088. + //WFD IE
  26089. + _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len);
  26090. + pattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len;
  26091. + pframe += pmlmepriv->wfd_probe_resp_ie_len;
  26092. + }
  26093. +#endif //CONFIG_IOCTL_CFG80211
  26094. +#endif //CONFIG_WFD
  26095. +
  26096. + pattrib->last_txcmdsz = pattrib->pktlen;
  26097. +
  26098. +
  26099. + dump_mgntframe(padapter, pmgntframe);
  26100. +
  26101. + return;
  26102. +
  26103. +}
  26104. +
  26105. +int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack)
  26106. +{
  26107. + int ret = _FAIL;
  26108. + struct xmit_frame *pmgntframe;
  26109. + struct pkt_attrib *pattrib;
  26110. + unsigned char *pframe;
  26111. + struct rtw_ieee80211_hdr *pwlanhdr;
  26112. + unsigned short *fctrl;
  26113. + unsigned char *mac;
  26114. + unsigned char bssrate[NumRates];
  26115. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  26116. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  26117. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  26118. + int bssrate_len = 0;
  26119. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  26120. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  26121. + u8 wpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
  26122. + u16 wpsielen = 0, p2pielen = 0;
  26123. +#ifdef CONFIG_WFD
  26124. + u32 wfdielen = 0;
  26125. +#endif //CONFIG_WFD
  26126. +
  26127. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  26128. +
  26129. +
  26130. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  26131. + {
  26132. + goto exit;
  26133. + }
  26134. +
  26135. + //update attribute
  26136. + pattrib = &pmgntframe->attrib;
  26137. + update_mgntframe_attrib(padapter, pattrib);
  26138. +
  26139. +
  26140. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  26141. +
  26142. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  26143. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  26144. +
  26145. + mac = myid(&(padapter->eeprompriv));
  26146. +
  26147. + fctrl = &(pwlanhdr->frame_ctl);
  26148. + *(fctrl) = 0;
  26149. +
  26150. + if (da) {
  26151. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  26152. + _rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN);
  26153. + } else {
  26154. + if ( ( pwdinfo->p2p_info.scan_op_ch_only ) || ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) )
  26155. + {
  26156. + // This two flags will be set when this is only the P2P client mode.
  26157. + _rtw_memcpy(pwlanhdr->addr1, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);
  26158. + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);
  26159. + }
  26160. + else
  26161. + {
  26162. + // broadcast probe request frame
  26163. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  26164. + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
  26165. + }
  26166. + }
  26167. + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
  26168. +
  26169. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  26170. + pmlmeext->mgnt_seq++;
  26171. + SetFrameSubType(pframe, WIFI_PROBEREQ);
  26172. +
  26173. + pframe += sizeof (struct rtw_ieee80211_hdr_3addr);
  26174. + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
  26175. +
  26176. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
  26177. + {
  26178. + pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen));
  26179. + }
  26180. + else
  26181. + {
  26182. + pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen));
  26183. + }
  26184. + // Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 )
  26185. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);
  26186. +
  26187. +#ifdef CONFIG_IOCTL_CFG80211
  26188. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  26189. + {
  26190. + if( pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL )
  26191. + {
  26192. + //WPS IE
  26193. + _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
  26194. + pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
  26195. + pframe += pmlmepriv->wps_probe_req_ie_len;
  26196. +
  26197. + //P2P IE
  26198. + _rtw_memcpy(pframe, pmlmepriv->p2p_probe_req_ie, pmlmepriv->p2p_probe_req_ie_len);
  26199. + pattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len;
  26200. + pframe += pmlmepriv->p2p_probe_req_ie_len;
  26201. + }
  26202. + }
  26203. + else
  26204. +#endif //CONFIG_IOCTL_CFG80211
  26205. + {
  26206. +
  26207. + // WPS IE
  26208. + // Noted by Albert 20110221
  26209. + // According to the WPS specification, all the WPS attribute is presented by Big Endian.
  26210. +
  26211. + wpsielen = 0;
  26212. + // WPS OUI
  26213. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  26214. + wpsielen += 4;
  26215. +
  26216. + // WPS version
  26217. + // Type:
  26218. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  26219. + wpsielen += 2;
  26220. +
  26221. + // Length:
  26222. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  26223. + wpsielen += 2;
  26224. +
  26225. + // Value:
  26226. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  26227. +
  26228. + if( pmlmepriv->wps_probe_req_ie == NULL )
  26229. + {
  26230. + // UUID-E
  26231. + // Type:
  26232. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );
  26233. + wpsielen += 2;
  26234. +
  26235. + // Length:
  26236. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );
  26237. + wpsielen += 2;
  26238. +
  26239. + // Value:
  26240. + if (pwdinfo->external_uuid == 0) {
  26241. + _rtw_memset( wpsie + wpsielen, 0x0, 16 );
  26242. + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  26243. + } else {
  26244. + _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );
  26245. + }
  26246. + wpsielen += 0x10;
  26247. +
  26248. + // Config Method
  26249. + // Type:
  26250. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
  26251. + wpsielen += 2;
  26252. +
  26253. + // Length:
  26254. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  26255. + wpsielen += 2;
  26256. +
  26257. + // Value:
  26258. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
  26259. + wpsielen += 2;
  26260. + }
  26261. +
  26262. + // Device Name
  26263. + // Type:
  26264. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  26265. + wpsielen += 2;
  26266. +
  26267. + // Length:
  26268. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );
  26269. + wpsielen += 2;
  26270. +
  26271. + // Value:
  26272. + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );
  26273. + wpsielen += pwdinfo->device_name_len;
  26274. +
  26275. + // Primary Device Type
  26276. + // Type:
  26277. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
  26278. + wpsielen += 2;
  26279. +
  26280. + // Length:
  26281. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
  26282. + wpsielen += 2;
  26283. +
  26284. + // Value:
  26285. + // Category ID
  26286. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  26287. + wpsielen += 2;
  26288. +
  26289. + // OUI
  26290. + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );
  26291. + wpsielen += 4;
  26292. +
  26293. + // Sub Category ID
  26294. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  26295. + wpsielen += 2;
  26296. +
  26297. + // Device Password ID
  26298. + // Type:
  26299. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );
  26300. + wpsielen += 2;
  26301. +
  26302. + // Length:
  26303. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  26304. + wpsielen += 2;
  26305. +
  26306. + // Value:
  26307. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); // Registrar-specified
  26308. + wpsielen += 2;
  26309. +
  26310. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  26311. +
  26312. + // P2P OUI
  26313. + p2pielen = 0;
  26314. + p2pie[ p2pielen++ ] = 0x50;
  26315. + p2pie[ p2pielen++ ] = 0x6F;
  26316. + p2pie[ p2pielen++ ] = 0x9A;
  26317. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  26318. +
  26319. + // Commented by Albert 20110221
  26320. + // According to the P2P Specification, the probe request frame should contain 5 P2P attributes
  26321. + // 1. P2P Capability
  26322. + // 2. P2P Device ID if this probe request wants to find the specific P2P device
  26323. + // 3. Listen Channel
  26324. + // 4. Extended Listen Timing
  26325. + // 5. Operating Channel if this WiFi is working as the group owner now
  26326. +
  26327. + // P2P Capability
  26328. + // Type:
  26329. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  26330. +
  26331. + // Length:
  26332. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  26333. + p2pielen += 2;
  26334. +
  26335. + // Value:
  26336. + // Device Capability Bitmap, 1 byte
  26337. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  26338. +
  26339. + // Group Capability Bitmap, 1 byte
  26340. + if ( pwdinfo->persistent_supported )
  26341. + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
  26342. + else
  26343. + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
  26344. +
  26345. + // Listen Channel
  26346. + // Type:
  26347. + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH;
  26348. +
  26349. + // Length:
  26350. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  26351. + p2pielen += 2;
  26352. +
  26353. + // Value:
  26354. + // Country String
  26355. + p2pie[ p2pielen++ ] = 'X';
  26356. + p2pie[ p2pielen++ ] = 'X';
  26357. +
  26358. + // The third byte should be set to 0x04.
  26359. + // Described in the "Operating Channel Attribute" section.
  26360. + p2pie[ p2pielen++ ] = 0x04;
  26361. +
  26362. + // Operating Class
  26363. + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7
  26364. +
  26365. + // Channel Number
  26366. + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listen channel
  26367. +
  26368. +
  26369. + // Extended Listen Timing
  26370. + // Type:
  26371. + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
  26372. +
  26373. + // Length:
  26374. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );
  26375. + p2pielen += 2;
  26376. +
  26377. + // Value:
  26378. + // Availability Period
  26379. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  26380. + p2pielen += 2;
  26381. +
  26382. + // Availability Interval
  26383. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  26384. + p2pielen += 2;
  26385. +
  26386. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
  26387. + {
  26388. + // Operating Channel (if this WiFi is working as the group owner now)
  26389. + // Type:
  26390. + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
  26391. +
  26392. + // Length:
  26393. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
  26394. + p2pielen += 2;
  26395. +
  26396. + // Value:
  26397. + // Country String
  26398. + p2pie[ p2pielen++ ] = 'X';
  26399. + p2pie[ p2pielen++ ] = 'X';
  26400. +
  26401. + // The third byte should be set to 0x04.
  26402. + // Described in the "Operating Channel Attribute" section.
  26403. + p2pie[ p2pielen++ ] = 0x04;
  26404. +
  26405. + // Operating Class
  26406. + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7
  26407. +
  26408. + // Channel Number
  26409. + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number
  26410. +
  26411. + }
  26412. +
  26413. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  26414. +
  26415. + if( pmlmepriv->wps_probe_req_ie != NULL )
  26416. + {
  26417. + //WPS IE
  26418. + _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
  26419. + pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
  26420. + pframe += pmlmepriv->wps_probe_req_ie_len;
  26421. + }
  26422. + }
  26423. +
  26424. +#ifdef CONFIG_WFD
  26425. +#ifdef CONFIG_IOCTL_CFG80211
  26426. + if ( _TRUE == pwdinfo->wfd_info->wfd_enable )
  26427. +#endif
  26428. + {
  26429. + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);
  26430. + pframe += wfdielen;
  26431. + pattrib->pktlen += wfdielen;
  26432. + }
  26433. +#ifdef CONFIG_IOCTL_CFG80211
  26434. + else if (pmlmepriv->wfd_probe_req_ie != NULL && pmlmepriv->wfd_probe_req_ie_len>0)
  26435. + {
  26436. + //WFD IE
  26437. + _rtw_memcpy(pframe, pmlmepriv->wfd_probe_req_ie, pmlmepriv->wfd_probe_req_ie_len);
  26438. + pattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len;
  26439. + pframe += pmlmepriv->wfd_probe_req_ie_len;
  26440. + }
  26441. +#endif //CONFIG_IOCTL_CFG80211
  26442. +#endif //CONFIG_WFD
  26443. +
  26444. + pattrib->last_txcmdsz = pattrib->pktlen;
  26445. +
  26446. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz));
  26447. +
  26448. + if (wait_ack) {
  26449. + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  26450. + } else {
  26451. + dump_mgntframe(padapter, pmgntframe);
  26452. + ret = _SUCCESS;
  26453. + }
  26454. +
  26455. +exit:
  26456. + return ret;
  26457. +}
  26458. +
  26459. +inline void issue_probereq_p2p(_adapter *adapter, u8 *da)
  26460. +{
  26461. + _issue_probereq_p2p(adapter, da, _FALSE);
  26462. +}
  26463. +
  26464. +int issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms)
  26465. +{
  26466. + int ret;
  26467. + int i = 0;
  26468. + u32 start = rtw_get_current_time();
  26469. +
  26470. + do
  26471. + {
  26472. + ret = _issue_probereq_p2p(adapter, da, wait_ms>0?_TRUE:_FALSE);
  26473. +
  26474. + i++;
  26475. +
  26476. + if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
  26477. + break;
  26478. +
  26479. + if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
  26480. + rtw_msleep_os(wait_ms);
  26481. +
  26482. + }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
  26483. +
  26484. + if (ret != _FAIL) {
  26485. + ret = _SUCCESS;
  26486. + #ifndef DBG_XMIT_ACK
  26487. + goto exit;
  26488. + #endif
  26489. + }
  26490. +
  26491. + if (try_cnt && wait_ms) {
  26492. + if (da)
  26493. + DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  26494. + FUNC_ADPT_ARG(adapter), MAC_ARG(da), rtw_get_oper_ch(adapter),
  26495. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  26496. + else
  26497. + DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  26498. + FUNC_ADPT_ARG(adapter), rtw_get_oper_ch(adapter),
  26499. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  26500. + }
  26501. +exit:
  26502. + return ret;
  26503. +}
  26504. +
  26505. +#endif //CONFIG_P2P
  26506. +
  26507. +s32 rtw_action_public_decache(union recv_frame *recv_frame, s32 token)
  26508. +{
  26509. + _adapter *adapter = recv_frame->u.hdr.adapter;
  26510. + struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);
  26511. + u8 *frame = recv_frame->u.hdr.rx_data;
  26512. + u16 seq_ctrl = ( (recv_frame->u.hdr.attrib.seq_num&0xffff) << 4) |
  26513. + (recv_frame->u.hdr.attrib.frag_num & 0xf);
  26514. +
  26515. + if (GetRetry(frame)) {
  26516. + if (token >= 0) {
  26517. + if ((seq_ctrl == mlmeext->action_public_rxseq)
  26518. + && (token == mlmeext->action_public_dialog_token))
  26519. + {
  26520. + DBG_871X(FUNC_ADPT_FMT" seq_ctrl=0x%x, rxseq=0x%x, token:%d\n",
  26521. + FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq, token);
  26522. + return _FAIL;
  26523. + }
  26524. + } else {
  26525. + if (seq_ctrl == mlmeext->action_public_rxseq) {
  26526. + DBG_871X(FUNC_ADPT_FMT" seq_ctrl=0x%x, rxseq=0x%x\n",
  26527. + FUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq);
  26528. + return _FAIL;
  26529. + }
  26530. + }
  26531. + }
  26532. +
  26533. + mlmeext->action_public_rxseq = seq_ctrl;
  26534. +
  26535. + if (token >= 0)
  26536. + mlmeext->action_public_dialog_token = token;
  26537. +
  26538. + return _SUCCESS;
  26539. +}
  26540. +
  26541. +unsigned int on_action_public_p2p(union recv_frame *precv_frame)
  26542. +{
  26543. + _adapter *padapter = precv_frame->u.hdr.adapter;
  26544. + u8 *pframe = precv_frame->u.hdr.rx_data;
  26545. + uint len = precv_frame->u.hdr.len;
  26546. + u8 *frame_body;
  26547. + u8 dialogToken=0;
  26548. +#ifdef CONFIG_P2P
  26549. + u8 *p2p_ie;
  26550. + u32 p2p_ielen, wps_ielen;
  26551. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  26552. + u8 result = P2P_STATUS_SUCCESS;
  26553. + u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  26554. + u8 *merged_p2pie = NULL;
  26555. + u32 merged_p2p_ielen = 0;
  26556. +#endif //CONFIG_P2P
  26557. +
  26558. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  26559. +
  26560. + dialogToken = frame_body[7];
  26561. +
  26562. + if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)
  26563. + return _FAIL;
  26564. +
  26565. +#ifdef CONFIG_P2P
  26566. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );
  26567. +#ifdef CONFIG_IOCTL_CFG80211
  26568. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211)
  26569. + {
  26570. + rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len);
  26571. + }
  26572. + else
  26573. +#endif //CONFIG_IOCTL_CFG80211
  26574. + {
  26575. + // Do nothing if the driver doesn't enable the P2P function.
  26576. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  26577. + return _SUCCESS;
  26578. +
  26579. + len -= sizeof(struct rtw_ieee80211_hdr_3addr);
  26580. +
  26581. + switch( frame_body[ 6 ] )//OUI Subtype
  26582. + {
  26583. + case P2P_GO_NEGO_REQ:
  26584. + {
  26585. + DBG_871X( "[%s] Got GO Nego Req Frame\n", __FUNCTION__);
  26586. + _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );
  26587. +
  26588. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
  26589. + {
  26590. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  26591. + }
  26592. +
  26593. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
  26594. + {
  26595. + // Commented by Albert 20110526
  26596. + // In this case, this means the previous nego fail doesn't be reset yet.
  26597. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  26598. + // Restore the previous p2p state
  26599. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  26600. + DBG_871X( "[%s] Restore the previous p2p state to %d\n", __FUNCTION__, rtw_p2p_state(pwdinfo) );
  26601. + }
  26602. +#ifdef CONFIG_CONCURRENT_MODE
  26603. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  26604. + {
  26605. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );
  26606. + }
  26607. +#endif // CONFIG_CONCURRENT_MODE
  26608. +
  26609. + // Commented by Kurt 20110902
  26610. + //Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered.
  26611. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
  26612. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  26613. +
  26614. + // Commented by Kurt 20120113
  26615. + // Get peer_dev_addr here if peer doesn't issue prov_disc frame.
  26616. + if( _rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN) );
  26617. + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);
  26618. +
  26619. + result = process_p2p_group_negotation_req( pwdinfo, frame_body, len );
  26620. + issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );
  26621. +#ifdef CONFIG_INTEL_WIDI
  26622. + if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
  26623. + {
  26624. + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
  26625. + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
  26626. + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
  26627. + }
  26628. +#endif //CONFIG_INTEL_WIDI
  26629. +
  26630. + // Commented by Albert 20110718
  26631. + // No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer.
  26632. +#ifdef CONFIG_CONCURRENT_MODE
  26633. + // Commented by Albert 20120107
  26634. + _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
  26635. +#else // CONFIG_CONCURRENT_MODE
  26636. + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );
  26637. +#endif // CONFIG_CONCURRENT_MODE
  26638. + break;
  26639. + }
  26640. + case P2P_GO_NEGO_RESP:
  26641. + {
  26642. + DBG_871X( "[%s] Got GO Nego Resp Frame\n", __FUNCTION__);
  26643. +
  26644. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
  26645. + {
  26646. + // Commented by Albert 20110425
  26647. + // The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function.
  26648. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  26649. + pwdinfo->nego_req_info.benable = _FALSE;
  26650. + result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len);
  26651. + issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result);
  26652. + if ( P2P_STATUS_SUCCESS == result )
  26653. + {
  26654. + if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT )
  26655. + {
  26656. + pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
  26657. + #ifdef P2P_OP_CHECK_SOCIAL_CH
  26658. + pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1;
  26659. + pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6;
  26660. + pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11;
  26661. + #endif //P2P_OP_CHECK_SOCIAL_CH
  26662. + pwdinfo->p2p_info.scan_op_ch_only = 1;
  26663. + _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH );
  26664. + }
  26665. + }
  26666. +
  26667. + // Reset the dialog token for group negotiation frames.
  26668. + pwdinfo->negotiation_dialog_token = 1;
  26669. +
  26670. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
  26671. + {
  26672. + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );
  26673. + }
  26674. + }
  26675. + else
  26676. + {
  26677. + DBG_871X( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__);
  26678. + }
  26679. +
  26680. + break;
  26681. + }
  26682. + case P2P_GO_NEGO_CONF:
  26683. + {
  26684. + DBG_871X( "[%s] Got GO Nego Confirm Frame\n", __FUNCTION__);
  26685. + result = process_p2p_group_negotation_confirm( pwdinfo, frame_body, len);
  26686. + if ( P2P_STATUS_SUCCESS == result )
  26687. + {
  26688. + if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT )
  26689. + {
  26690. + pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
  26691. + #ifdef P2P_OP_CHECK_SOCIAL_CH
  26692. + pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1;
  26693. + pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6;
  26694. + pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11;
  26695. + #endif //P2P_OP_CHECK_SOCIAL_CH
  26696. + pwdinfo->p2p_info.scan_op_ch_only = 1;
  26697. + _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH );
  26698. + }
  26699. + }
  26700. + break;
  26701. + }
  26702. + case P2P_INVIT_REQ:
  26703. + {
  26704. + // Added by Albert 2010/10/05
  26705. + // Received the P2P Invite Request frame.
  26706. +
  26707. + DBG_871X( "[%s] Got invite request frame!\n", __FUNCTION__ );
  26708. + if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )
  26709. + {
  26710. + // Parse the necessary information from the P2P Invitation Request frame.
  26711. + // For example: The MAC address of sending this P2P Invitation Request frame.
  26712. + u32 attr_contentlen = 0;
  26713. + u8 status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  26714. + struct group_id_info group_id;
  26715. + u8 invitation_flag = 0;
  26716. +
  26717. + merged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_);
  26718. +
  26719. + merged_p2pie = rtw_malloc(merged_p2p_ielen);
  26720. + if (merged_p2pie == NULL)
  26721. + {
  26722. + DBG_871X( "[%s] Malloc p2p ie fail\n", __FUNCTION__);
  26723. + goto exit;
  26724. + }
  26725. + _rtw_memset(merged_p2pie, 0x00, merged_p2p_ielen);
  26726. +
  26727. + merged_p2p_ielen = rtw_p2p_merge_ies(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, merged_p2pie);
  26728. +
  26729. + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen);
  26730. + if ( attr_contentlen )
  26731. + {
  26732. +
  26733. + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen);
  26734. + // Commented by Albert 20120510
  26735. + // Copy to the pwdinfo->p2p_peer_interface_addr.
  26736. + // So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command.
  26737. + // #> iwpriv wlan0 p2p_get peer_ifa
  26738. + // After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant.
  26739. +
  26740. + if ( attr_contentlen )
  26741. + {
  26742. + DBG_871X( "[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__,
  26743. + pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1],
  26744. + pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3],
  26745. + pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5] );
  26746. + }
  26747. +
  26748. + if ( invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT )
  26749. + {
  26750. + // Re-invoke the persistent group.
  26751. +
  26752. + _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) );
  26753. + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen);
  26754. + if ( attr_contentlen )
  26755. + {
  26756. + if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) )
  26757. + {
  26758. + // The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO.
  26759. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO );
  26760. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_GO );
  26761. + status_code = P2P_STATUS_SUCCESS;
  26762. + }
  26763. + else
  26764. + {
  26765. + // The p2p device sending this p2p invitation request wants to be the persistent GO.
  26766. + if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) )
  26767. + {
  26768. + u8 operatingch_info[5] = { 0x00 };
  26769. +
  26770. + if ( rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )
  26771. + {
  26772. + if( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) >= 0 )
  26773. + {
  26774. + // The operating channel is acceptable for this device.
  26775. + pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4];
  26776. + #ifdef P2P_OP_CHECK_SOCIAL_CH
  26777. + pwdinfo->rx_invitereq_info.operation_ch[1]= 1; //Check whether GO is operating in channel 1;
  26778. + pwdinfo->rx_invitereq_info.operation_ch[2]= 6; //Check whether GO is operating in channel 6;
  26779. + pwdinfo->rx_invitereq_info.operation_ch[3]= 11; //Check whether GO is operating in channel 11;
  26780. + #endif //P2P_OP_CHECK_SOCIAL_CH
  26781. + pwdinfo->rx_invitereq_info.scan_op_ch_only = 1;
  26782. + _set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH );
  26783. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH );
  26784. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );
  26785. + status_code = P2P_STATUS_SUCCESS;
  26786. + }
  26787. + else
  26788. + {
  26789. + // The operating channel isn't supported by this device.
  26790. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );
  26791. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_DEVICE );
  26792. + status_code = P2P_STATUS_FAIL_NO_COMMON_CH;
  26793. + _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
  26794. + }
  26795. + }
  26796. + else
  26797. + {
  26798. + // Commented by Albert 20121130
  26799. + // Intel will use the different P2P IE to store the operating channel information
  26800. + // Workaround for Intel WiDi 3.5
  26801. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH );
  26802. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );
  26803. + status_code = P2P_STATUS_SUCCESS;
  26804. + }
  26805. + }
  26806. + else
  26807. + {
  26808. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );
  26809. + #ifdef CONFIG_INTEL_WIDI
  26810. + _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN );
  26811. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );
  26812. + #endif //CONFIG_INTEL_WIDI
  26813. +
  26814. + status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
  26815. + }
  26816. + }
  26817. + }
  26818. + else
  26819. + {
  26820. + DBG_871X( "[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__ );
  26821. + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  26822. + }
  26823. + }
  26824. + else
  26825. + {
  26826. + // Received the invitation to join a P2P group.
  26827. +
  26828. + _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) );
  26829. + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen);
  26830. + if ( attr_contentlen )
  26831. + {
  26832. + if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) )
  26833. + {
  26834. + // In this case, the GO can't be myself.
  26835. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );
  26836. + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  26837. + }
  26838. + else
  26839. + {
  26840. + // The p2p device sending this p2p invitation request wants to join an existing P2P group
  26841. + // Commented by Albert 2012/06/28
  26842. + // In this case, this Wi-Fi device should use the iwpriv command to get the peer device address.
  26843. + // The peer device address should be the destination address for the provisioning discovery request.
  26844. + // Then, this Wi-Fi device should use the iwpriv command to get the peer interface address.
  26845. + // The peer interface address should be the address for WPS mac address
  26846. + _rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN );
  26847. + rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );
  26848. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN );
  26849. + status_code = P2P_STATUS_SUCCESS;
  26850. + }
  26851. + }
  26852. + else
  26853. + {
  26854. + DBG_871X( "[%s] P2P Group ID Attribute NOT FOUND!\n", __FUNCTION__ );
  26855. + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  26856. + }
  26857. + }
  26858. + }
  26859. + else
  26860. + {
  26861. + DBG_871X( "[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __FUNCTION__ );
  26862. + status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  26863. + }
  26864. +
  26865. + DBG_871X( "[%s] status_code = %d\n", __FUNCTION__, status_code );
  26866. +
  26867. + pwdinfo->inviteresp_info.token = frame_body[ 7 ];
  26868. + issue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code );
  26869. + _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
  26870. + }
  26871. +#ifdef CONFIG_INTEL_WIDI
  26872. + if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
  26873. + {
  26874. + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
  26875. + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
  26876. + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
  26877. + }
  26878. +#endif //CONFIG_INTEL_WIDI
  26879. + break;
  26880. + }
  26881. + case P2P_INVIT_RESP:
  26882. + {
  26883. + u8 attr_content = 0x00;
  26884. + u32 attr_contentlen = 0;
  26885. +
  26886. + DBG_871X( "[%s] Got invite response frame!\n", __FUNCTION__ );
  26887. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  26888. + if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )
  26889. + {
  26890. + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
  26891. +
  26892. + if ( attr_contentlen == 1 )
  26893. + {
  26894. + DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content );
  26895. + pwdinfo->invitereq_info.benable = _FALSE;
  26896. +
  26897. + if ( attr_content == P2P_STATUS_SUCCESS )
  26898. + {
  26899. + if ( _rtw_memcmp( pwdinfo->invitereq_info.go_bssid, myid( &padapter->eeprompriv ), ETH_ALEN ))
  26900. + {
  26901. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO );
  26902. + }
  26903. + else
  26904. + {
  26905. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  26906. + }
  26907. + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_OK );
  26908. + }
  26909. + else
  26910. + {
  26911. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  26912. + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );
  26913. + }
  26914. + }
  26915. + else
  26916. + {
  26917. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  26918. + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );
  26919. + }
  26920. + }
  26921. + else
  26922. + {
  26923. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  26924. + rtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );
  26925. + }
  26926. +
  26927. + if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ) )
  26928. + {
  26929. + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );
  26930. + }
  26931. + break;
  26932. + }
  26933. + case P2P_DEVDISC_REQ:
  26934. +
  26935. + process_p2p_devdisc_req(pwdinfo, pframe, len);
  26936. +
  26937. + break;
  26938. +
  26939. + case P2P_DEVDISC_RESP:
  26940. +
  26941. + process_p2p_devdisc_resp(pwdinfo, pframe, len);
  26942. +
  26943. + break;
  26944. +
  26945. + case P2P_PROVISION_DISC_REQ:
  26946. + DBG_871X( "[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__ );
  26947. + process_p2p_provdisc_req(pwdinfo, pframe, len);
  26948. + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);
  26949. +
  26950. + //20110902 Kurt
  26951. + //Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered.
  26952. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
  26953. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  26954. +
  26955. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
  26956. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
  26957. +#ifdef CONFIG_INTEL_WIDI
  26958. + if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
  26959. + {
  26960. + padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
  26961. + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
  26962. + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
  26963. + }
  26964. +#endif //CONFIG_INTEL_WIDI
  26965. + break;
  26966. +
  26967. + case P2P_PROVISION_DISC_RESP:
  26968. + // Commented by Albert 20110707
  26969. + // Should we check the pwdinfo->tx_prov_disc_info.bsent flag here??
  26970. + DBG_871X( "[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__ );
  26971. + // Commented by Albert 20110426
  26972. + // The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function.
  26973. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  26974. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP);
  26975. + process_p2p_provdisc_resp(pwdinfo, pframe);
  26976. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
  26977. + break;
  26978. +
  26979. + }
  26980. + }
  26981. +#endif //CONFIG_P2P
  26982. +
  26983. +exit:
  26984. +
  26985. + if(merged_p2pie)
  26986. + {
  26987. + rtw_mfree(merged_p2pie, merged_p2p_ielen);
  26988. + }
  26989. +
  26990. + return _SUCCESS;
  26991. +}
  26992. +
  26993. +unsigned int on_action_public_vendor(union recv_frame *precv_frame)
  26994. +{
  26995. + unsigned int ret = _FAIL;
  26996. + u8 *pframe = precv_frame->u.hdr.rx_data;
  26997. + uint frame_len = precv_frame->u.hdr.len;
  26998. + u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  26999. +
  27000. + if (_rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE) {
  27001. + ret = on_action_public_p2p(precv_frame);
  27002. + }
  27003. +
  27004. + return ret;
  27005. +}
  27006. +
  27007. +unsigned int on_action_public_default(union recv_frame *precv_frame, u8 action)
  27008. +{
  27009. + unsigned int ret = _FAIL;
  27010. + u8 *pframe = precv_frame->u.hdr.rx_data;
  27011. + uint frame_len = precv_frame->u.hdr.len;
  27012. + u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  27013. + u8 token;
  27014. + _adapter *adapter = precv_frame->u.hdr.adapter;
  27015. + int cnt = 0;
  27016. + char msg[64];
  27017. +
  27018. + token = frame_body[2];
  27019. +
  27020. + if (rtw_action_public_decache(precv_frame, token) == _FAIL)
  27021. + goto exit;
  27022. +
  27023. + #ifdef CONFIG_IOCTL_CFG80211
  27024. + cnt += sprintf((msg+cnt), "%s(token:%u)", action_public_str(action), token);
  27025. + rtw_cfg80211_rx_action(adapter, pframe, frame_len, msg);
  27026. + #endif
  27027. +
  27028. + ret = _SUCCESS;
  27029. +
  27030. +exit:
  27031. + return ret;
  27032. +}
  27033. +
  27034. +unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame)
  27035. +{
  27036. + unsigned int ret = _FAIL;
  27037. + u8 *pframe = precv_frame->u.hdr.rx_data;
  27038. + uint frame_len = precv_frame->u.hdr.len;
  27039. + u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  27040. + u8 category, action;
  27041. +
  27042. + /* check RA matches or not */
  27043. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))
  27044. + goto exit;
  27045. +
  27046. + category = frame_body[0];
  27047. + if(category != RTW_WLAN_CATEGORY_PUBLIC)
  27048. + goto exit;
  27049. +
  27050. + action = frame_body[1];
  27051. + switch (action) {
  27052. + case ACT_PUBLIC_VENDOR:
  27053. + ret = on_action_public_vendor(precv_frame);
  27054. + break;
  27055. + default:
  27056. + ret = on_action_public_default(precv_frame, action);
  27057. + break;
  27058. + }
  27059. +
  27060. +exit:
  27061. + return ret;
  27062. +}
  27063. +
  27064. +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame)
  27065. +{
  27066. + return _SUCCESS;
  27067. +}
  27068. +
  27069. +#ifdef CONFIG_IEEE80211W
  27070. +unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame)
  27071. +{
  27072. + u8 *pframe = precv_frame->u.hdr.rx_data;
  27073. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  27074. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  27075. + unsigned short tid;
  27076. + //Baron
  27077. +
  27078. + DBG_871X("OnAction_sa_query\n");
  27079. +
  27080. + switch (pframe[WLAN_HDR_A3_LEN+1])
  27081. + {
  27082. + case 0: //SA Query req
  27083. + _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(unsigned short));
  27084. + DBG_871X("OnAction_sa_query request,action=%d, tid=%04x\n", pframe[WLAN_HDR_A3_LEN+1], tid);
  27085. + issue_action_SA_Query(padapter, GetAddr2Ptr(pframe), 1, tid);
  27086. + break;
  27087. +
  27088. + case 1: //SA Query rsp
  27089. + _cancel_timer_ex(&pmlmeext->sa_query_timer);
  27090. + DBG_871X("OnAction_sa_query response,action=%d, tid=%04x, cancel timer\n", pframe[WLAN_HDR_A3_LEN+1], pframe[WLAN_HDR_A3_LEN+2]);
  27091. + break;
  27092. + default:
  27093. + break;
  27094. + }
  27095. + if(0)
  27096. + {
  27097. + int pp;
  27098. + printk("pattrib->pktlen = %d =>", pattrib->pkt_len);
  27099. + for(pp=0;pp< pattrib->pkt_len; pp++)
  27100. + printk(" %02x ", pframe[pp]);
  27101. + printk("\n");
  27102. + }
  27103. +
  27104. + return _SUCCESS;
  27105. +}
  27106. +#endif //CONFIG_IEEE80211W
  27107. +
  27108. +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame)
  27109. +{
  27110. + return _SUCCESS;
  27111. +}
  27112. +
  27113. +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
  27114. +{
  27115. +#ifdef CONFIG_P2P
  27116. + u8 *frame_body;
  27117. + u8 category, OUI_Subtype, dialogToken=0;
  27118. + u8 *pframe = precv_frame->u.hdr.rx_data;
  27119. + uint len = precv_frame->u.hdr.len;
  27120. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  27121. +
  27122. +
  27123. + DBG_871X("%s\n", __FUNCTION__);
  27124. +
  27125. + //check RA matches or not
  27126. + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
  27127. + return _SUCCESS;
  27128. +
  27129. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  27130. +
  27131. + category = frame_body[0];
  27132. + if(category != RTW_WLAN_CATEGORY_P2P)
  27133. + return _SUCCESS;
  27134. +
  27135. + if ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI )
  27136. + return _SUCCESS;
  27137. +
  27138. +#ifdef CONFIG_IOCTL_CFG80211
  27139. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  27140. + {
  27141. + rtw_cfg80211_rx_action_p2p(padapter, pframe, len);
  27142. + return _SUCCESS;
  27143. + }
  27144. + else
  27145. +#endif //CONFIG_IOCTL_CFG80211
  27146. + {
  27147. + len -= sizeof(struct rtw_ieee80211_hdr_3addr);
  27148. + OUI_Subtype = frame_body[5];
  27149. + dialogToken = frame_body[6];
  27150. +
  27151. + switch(OUI_Subtype)
  27152. + {
  27153. + case P2P_NOTICE_OF_ABSENCE:
  27154. +
  27155. + break;
  27156. +
  27157. + case P2P_PRESENCE_REQUEST:
  27158. +
  27159. + process_p2p_presence_req(pwdinfo, pframe, len);
  27160. +
  27161. + break;
  27162. +
  27163. + case P2P_PRESENCE_RESPONSE:
  27164. +
  27165. + break;
  27166. +
  27167. + case P2P_GO_DISC_REQUEST:
  27168. +
  27169. + break;
  27170. +
  27171. + default:
  27172. + break;
  27173. +
  27174. + }
  27175. + }
  27176. +#endif //CONFIG_P2P
  27177. +
  27178. + return _SUCCESS;
  27179. +
  27180. +}
  27181. +
  27182. +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame)
  27183. +{
  27184. + int i;
  27185. + unsigned char category;
  27186. + struct action_handler *ptable;
  27187. + unsigned char *frame_body;
  27188. + u8 *pframe = precv_frame->u.hdr.rx_data;
  27189. +
  27190. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  27191. +
  27192. + category = frame_body[0];
  27193. +
  27194. + for(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++)
  27195. + {
  27196. + ptable = &OnAction_tbl[i];
  27197. +
  27198. + if(category == ptable->num)
  27199. + ptable->func(padapter, precv_frame);
  27200. +
  27201. + }
  27202. +
  27203. + return _SUCCESS;
  27204. +
  27205. +}
  27206. +
  27207. +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame)
  27208. +{
  27209. +
  27210. + //DBG_871X("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe));
  27211. + return _SUCCESS;
  27212. +}
  27213. +
  27214. +struct xmit_frame *_alloc_mgtxmitframe(struct xmit_priv *pxmitpriv, bool once)
  27215. +{
  27216. + struct xmit_frame *pmgntframe;
  27217. + struct xmit_buf *pxmitbuf;
  27218. +
  27219. + if (once)
  27220. + pmgntframe = rtw_alloc_xmitframe_once(pxmitpriv);
  27221. + else
  27222. + pmgntframe = rtw_alloc_xmitframe_ext(pxmitpriv);
  27223. +
  27224. + if (pmgntframe == NULL) {
  27225. + DBG_871X(FUNC_ADPT_FMT" alloc xmitframe fail, once:%d\n", FUNC_ADPT_ARG(pxmitpriv->adapter), once);
  27226. + goto exit;
  27227. + }
  27228. +
  27229. + if ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) {
  27230. + DBG_871X(FUNC_ADPT_FMT" alloc xmitbuf fail\n", FUNC_ADPT_ARG(pxmitpriv->adapter));
  27231. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  27232. + pmgntframe = NULL;
  27233. + goto exit;
  27234. + }
  27235. +
  27236. + pmgntframe->frame_tag = MGNT_FRAMETAG;
  27237. + pmgntframe->pxmitbuf = pxmitbuf;
  27238. + pmgntframe->buf_addr = pxmitbuf->pbuf;
  27239. + pxmitbuf->priv_data = pmgntframe;
  27240. +
  27241. +exit:
  27242. + return pmgntframe;
  27243. +
  27244. +}
  27245. +
  27246. +inline struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv)
  27247. +{
  27248. + return _alloc_mgtxmitframe(pxmitpriv, _FALSE);
  27249. +}
  27250. +
  27251. +inline struct xmit_frame *alloc_mgtxmitframe_once(struct xmit_priv *pxmitpriv)
  27252. +{
  27253. + return _alloc_mgtxmitframe(pxmitpriv, _TRUE);
  27254. +}
  27255. +
  27256. +
  27257. +/****************************************************************************
  27258. +
  27259. +Following are some TX fuctions for WiFi MLME
  27260. +
  27261. +*****************************************************************************/
  27262. +
  27263. +void update_mgnt_tx_rate(_adapter *padapter, u8 rate)
  27264. +{
  27265. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  27266. +
  27267. + pmlmeext->tx_rate = rate;
  27268. +
  27269. + //DBG_871X("%s(): rate = %x\n",__FUNCTION__, rate);
  27270. +}
  27271. +
  27272. +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
  27273. +{
  27274. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  27275. +
  27276. + _rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib));
  27277. +
  27278. + pattrib->hdrlen = 24;
  27279. + pattrib->nr_frags = 1;
  27280. + pattrib->priority = 7;
  27281. + pattrib->mac_id = 0;
  27282. + pattrib->qsel = 0x12;
  27283. +
  27284. + pattrib->pktlen = 0;
  27285. +
  27286. + if(pmlmeext->cur_wireless_mode & WIRELESS_11B)
  27287. + pattrib->raid = 6;//b mode
  27288. + else
  27289. + pattrib->raid = 5;//a/g mode
  27290. +
  27291. + pattrib->encrypt = _NO_PRIVACY_;
  27292. + pattrib->bswenc = _FALSE;
  27293. +
  27294. + pattrib->qos_en = _FALSE;
  27295. + pattrib->ht_en = _FALSE;
  27296. + pattrib->bwmode = HT_CHANNEL_WIDTH_20;
  27297. + pattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  27298. + pattrib->sgi = _FALSE;
  27299. +
  27300. + pattrib->seqnum = pmlmeext->mgnt_seq;
  27301. +
  27302. + pattrib->retry_ctrl = _TRUE;
  27303. +
  27304. +}
  27305. +
  27306. +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe)
  27307. +{
  27308. + if(padapter->bSurpriseRemoved == _TRUE ||
  27309. + padapter->bDriverStopped == _TRUE)
  27310. + {
  27311. + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);
  27312. + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);
  27313. + return;
  27314. + }
  27315. +
  27316. + rtw_hal_mgnt_xmit(padapter, pmgntframe);
  27317. +}
  27318. +
  27319. +s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms)
  27320. +{
  27321. + s32 ret = _FAIL;
  27322. + _irqL irqL;
  27323. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  27324. + struct xmit_buf *pxmitbuf = pmgntframe->pxmitbuf;
  27325. + struct submit_ctx sctx;
  27326. +
  27327. + if(padapter->bSurpriseRemoved == _TRUE ||
  27328. + padapter->bDriverStopped == _TRUE)
  27329. + {
  27330. + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);
  27331. + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);
  27332. + return ret;
  27333. + }
  27334. +
  27335. + rtw_sctx_init(&sctx, timeout_ms);
  27336. + pxmitbuf->sctx = &sctx;
  27337. +
  27338. + ret = rtw_hal_mgnt_xmit(padapter, pmgntframe);
  27339. +
  27340. + if (ret == _SUCCESS)
  27341. + ret = rtw_sctx_wait(&sctx);
  27342. +
  27343. + _enter_critical(&pxmitpriv->lock_sctx, &irqL);
  27344. + pxmitbuf->sctx = NULL;
  27345. + _exit_critical(&pxmitpriv->lock_sctx, &irqL);
  27346. +
  27347. + return ret;
  27348. +}
  27349. +
  27350. +s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe)
  27351. +{
  27352. +#ifdef CONFIG_XMIT_ACK
  27353. + s32 ret = _FAIL;
  27354. + u32 timeout_ms = 500;// 500ms
  27355. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  27356. + #ifdef CONFIG_CONCURRENT_MODE
  27357. + if (padapter->pbuddy_adapter && !padapter->isprimary)
  27358. + pxmitpriv = &(padapter->pbuddy_adapter->xmitpriv);
  27359. + #endif
  27360. +
  27361. + if(padapter->bSurpriseRemoved == _TRUE ||
  27362. + padapter->bDriverStopped == _TRUE)
  27363. + {
  27364. + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);
  27365. + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);
  27366. + return -1;
  27367. + }
  27368. +
  27369. + _enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL);
  27370. + pxmitpriv->ack_tx = _TRUE;
  27371. +
  27372. + pmgntframe->ack_report = 1;
  27373. + if (rtw_hal_mgnt_xmit(padapter, pmgntframe) == _SUCCESS) {
  27374. + ret = rtw_ack_tx_wait(pxmitpriv, timeout_ms);
  27375. + }
  27376. +
  27377. + pxmitpriv->ack_tx = _FALSE;
  27378. + _exit_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL);
  27379. +
  27380. + return ret;
  27381. +#else //!CONFIG_XMIT_ACK
  27382. + dump_mgntframe(padapter, pmgntframe);
  27383. + rtw_msleep_os(50);
  27384. + return _SUCCESS;
  27385. +#endif //!CONFIG_XMIT_ACK
  27386. +}
  27387. +
  27388. +int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)
  27389. +{
  27390. + u8 *ssid_ie;
  27391. + sint ssid_len_ori;
  27392. + int len_diff = 0;
  27393. +
  27394. + ssid_ie = rtw_get_ie(ies, WLAN_EID_SSID, &ssid_len_ori, ies_len);
  27395. +
  27396. + //DBG_871X("%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\n", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori);
  27397. +
  27398. + if(ssid_ie && ssid_len_ori>0)
  27399. + {
  27400. + switch(hidden_ssid_mode)
  27401. + {
  27402. + case 1:
  27403. + {
  27404. + u8 *next_ie = ssid_ie + 2 + ssid_len_ori;
  27405. + u32 remain_len = 0;
  27406. +
  27407. + remain_len = ies_len -(next_ie-ies);
  27408. +
  27409. + ssid_ie[1] = 0;
  27410. + _rtw_memcpy(ssid_ie+2, next_ie, remain_len);
  27411. + len_diff -= ssid_len_ori;
  27412. +
  27413. + break;
  27414. + }
  27415. + case 2:
  27416. + _rtw_memset(&ssid_ie[2], 0, ssid_len_ori);
  27417. + break;
  27418. + default:
  27419. + break;
  27420. + }
  27421. + }
  27422. +
  27423. + return len_diff;
  27424. +}
  27425. +
  27426. +void issue_beacon(_adapter *padapter)
  27427. +{
  27428. + struct xmit_frame *pmgntframe;
  27429. + struct pkt_attrib *pattrib;
  27430. + unsigned char *pframe;
  27431. + struct rtw_ieee80211_hdr *pwlanhdr;
  27432. + unsigned short *fctrl;
  27433. + unsigned int rate_len;
  27434. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  27435. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27436. + _irqL irqL;
  27437. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  27438. +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27439. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  27440. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  27441. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  27442. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  27443. +#ifdef CONFIG_P2P
  27444. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  27445. +#endif //CONFIG_P2P
  27446. +
  27447. +
  27448. + //DBG_871X("%s\n", __FUNCTION__);
  27449. +
  27450. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  27451. + {
  27452. + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__);
  27453. + return;
  27454. + }
  27455. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27456. + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
  27457. +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27458. +
  27459. + //update attribute
  27460. + pattrib = &pmgntframe->attrib;
  27461. + update_mgntframe_attrib(padapter, pattrib);
  27462. + pattrib->qsel = 0x10;
  27463. +
  27464. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  27465. +
  27466. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  27467. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  27468. +
  27469. +
  27470. + fctrl = &(pwlanhdr->frame_ctl);
  27471. + *(fctrl) = 0;
  27472. +
  27473. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  27474. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  27475. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
  27476. +
  27477. + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
  27478. + //pmlmeext->mgnt_seq++;
  27479. + SetFrameSubType(pframe, WIFI_BEACON);
  27480. +
  27481. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  27482. + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
  27483. +
  27484. + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  27485. + {
  27486. + //DBG_871X("ie len=%d\n", cur_network->IELength);
  27487. +#ifdef CONFIG_P2P
  27488. + // for P2P : Primary Device Type & Device Name
  27489. + u32 wpsielen=0, insert_len=0;
  27490. + u8 *wpsie=NULL;
  27491. + wpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);
  27492. +
  27493. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0)
  27494. + {
  27495. + uint wps_offset, remainder_ielen;
  27496. + u8 *premainder_ie, *pframe_wscie;
  27497. +
  27498. + wps_offset = (uint)(wpsie - cur_network->IEs);
  27499. +
  27500. + premainder_ie = wpsie + wpsielen;
  27501. +
  27502. + remainder_ielen = cur_network->IELength - wps_offset - wpsielen;
  27503. +
  27504. +#ifdef CONFIG_IOCTL_CFG80211
  27505. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  27506. + {
  27507. + if(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0)
  27508. + {
  27509. + _rtw_memcpy(pframe, cur_network->IEs, wps_offset);
  27510. + pframe += wps_offset;
  27511. + pattrib->pktlen += wps_offset;
  27512. +
  27513. + _rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);
  27514. + pframe += pmlmepriv->wps_beacon_ie_len;
  27515. + pattrib->pktlen += pmlmepriv->wps_beacon_ie_len;
  27516. +
  27517. + //copy remainder_ie to pframe
  27518. + _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
  27519. + pframe += remainder_ielen;
  27520. + pattrib->pktlen += remainder_ielen;
  27521. + }
  27522. + else
  27523. + {
  27524. + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
  27525. + pframe += cur_network->IELength;
  27526. + pattrib->pktlen += cur_network->IELength;
  27527. + }
  27528. + }
  27529. + else
  27530. +#endif //CONFIG_IOCTL_CFG80211
  27531. + {
  27532. + pframe_wscie = pframe + wps_offset;
  27533. + _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);
  27534. + pframe += (wps_offset + wpsielen);
  27535. + pattrib->pktlen += (wps_offset + wpsielen);
  27536. +
  27537. + //now pframe is end of wsc ie, insert Primary Device Type & Device Name
  27538. + // Primary Device Type
  27539. + // Type:
  27540. + *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
  27541. + insert_len += 2;
  27542. +
  27543. + // Length:
  27544. + *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 );
  27545. + insert_len += 2;
  27546. +
  27547. + // Value:
  27548. + // Category ID
  27549. + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  27550. + insert_len += 2;
  27551. +
  27552. + // OUI
  27553. + *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI );
  27554. + insert_len += 4;
  27555. +
  27556. + // Sub Category ID
  27557. + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  27558. + insert_len += 2;
  27559. +
  27560. +
  27561. + // Device Name
  27562. + // Type:
  27563. + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  27564. + insert_len += 2;
  27565. +
  27566. + // Length:
  27567. + *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len );
  27568. + insert_len += 2;
  27569. +
  27570. + // Value:
  27571. + _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len );
  27572. + insert_len += pwdinfo->device_name_len;
  27573. +
  27574. +
  27575. + //update wsc ie length
  27576. + *(pframe_wscie+1) = (wpsielen -2) + insert_len;
  27577. +
  27578. + //pframe move to end
  27579. + pframe+=insert_len;
  27580. + pattrib->pktlen += insert_len;
  27581. +
  27582. + //copy remainder_ie to pframe
  27583. + _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
  27584. + pframe += remainder_ielen;
  27585. + pattrib->pktlen += remainder_ielen;
  27586. + }
  27587. + }
  27588. + else
  27589. +#endif //CONFIG_P2P
  27590. + {
  27591. + int len_diff;
  27592. + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
  27593. + len_diff = update_hidden_ssid(
  27594. + pframe+_BEACON_IE_OFFSET_
  27595. + , cur_network->IELength-_BEACON_IE_OFFSET_
  27596. + , pmlmeinfo->hidden_ssid_mode
  27597. + );
  27598. + pframe += (cur_network->IELength+len_diff);
  27599. + pattrib->pktlen += (cur_network->IELength+len_diff);
  27600. + }
  27601. +
  27602. + {
  27603. + u8 *wps_ie;
  27604. + uint wps_ielen;
  27605. + u8 sr = 0;
  27606. + wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,
  27607. + pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);
  27608. + if (wps_ie && wps_ielen>0) {
  27609. + rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);
  27610. + }
  27611. + if (sr != 0)
  27612. + set_fwstate(pmlmepriv, WIFI_UNDER_WPS);
  27613. + else
  27614. + _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
  27615. + }
  27616. +
  27617. +#ifdef CONFIG_P2P
  27618. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  27619. + {
  27620. + u32 len;
  27621. +#ifdef CONFIG_IOCTL_CFG80211
  27622. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  27623. + {
  27624. + len = pmlmepriv->p2p_beacon_ie_len;
  27625. + if(pmlmepriv->p2p_beacon_ie && len>0)
  27626. + _rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len);
  27627. + }
  27628. + else
  27629. +#endif //CONFIG_IOCTL_CFG80211
  27630. + {
  27631. + len = build_beacon_p2p_ie(pwdinfo, pframe);
  27632. + }
  27633. +
  27634. + pframe += len;
  27635. + pattrib->pktlen += len;
  27636. +#ifdef CONFIG_WFD
  27637. +#ifdef CONFIG_IOCTL_CFG80211
  27638. + if(_TRUE == pwdinfo->wfd_info->wfd_enable)
  27639. +#endif //CONFIG_IOCTL_CFG80211
  27640. + {
  27641. + len = build_beacon_wfd_ie( pwdinfo, pframe );
  27642. + }
  27643. +#ifdef CONFIG_IOCTL_CFG80211
  27644. + else
  27645. + {
  27646. + len = 0;
  27647. + if(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0)
  27648. + {
  27649. + len = pmlmepriv->wfd_beacon_ie_len;
  27650. + _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len);
  27651. + }
  27652. + }
  27653. +#endif //CONFIG_IOCTL_CFG80211
  27654. + pframe += len;
  27655. + pattrib->pktlen += len;
  27656. +#endif //CONFIG_WFD
  27657. + }
  27658. +#endif //CONFIG_P2P
  27659. +
  27660. + goto _issue_bcn;
  27661. +
  27662. + }
  27663. +
  27664. + //below for ad-hoc mode
  27665. +
  27666. + //timestamp will be inserted by hardware
  27667. + pframe += 8;
  27668. + pattrib->pktlen += 8;
  27669. +
  27670. + // beacon interval: 2 bytes
  27671. +
  27672. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
  27673. +
  27674. + pframe += 2;
  27675. + pattrib->pktlen += 2;
  27676. +
  27677. + // capability info: 2 bytes
  27678. +
  27679. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
  27680. +
  27681. + pframe += 2;
  27682. + pattrib->pktlen += 2;
  27683. +
  27684. + // SSID
  27685. + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen);
  27686. +
  27687. + // supported rates...
  27688. + rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
  27689. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen);
  27690. +
  27691. + // DS parameter set
  27692. + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen);
  27693. +
  27694. + //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  27695. + {
  27696. + u8 erpinfo=0;
  27697. + u32 ATIMWindow;
  27698. + // IBSS Parameter Set...
  27699. + //ATIMWindow = cur->Configuration.ATIMWindow;
  27700. + ATIMWindow = 0;
  27701. + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen);
  27702. +
  27703. + //ERP IE
  27704. + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen);
  27705. + }
  27706. +
  27707. +
  27708. + // EXTERNDED SUPPORTED RATE
  27709. + if (rate_len > 8)
  27710. + {
  27711. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen);
  27712. + }
  27713. +
  27714. +
  27715. + //todo:HT for adhoc
  27716. +
  27717. +_issue_bcn:
  27718. +
  27719. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27720. + pmlmepriv->update_bcn = _FALSE;
  27721. +
  27722. + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
  27723. +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27724. +
  27725. + if ((pattrib->pktlen + TXDESC_SIZE) > 512)
  27726. + {
  27727. + DBG_871X("beacon frame too large\n");
  27728. + return;
  27729. + }
  27730. +
  27731. + pattrib->last_txcmdsz = pattrib->pktlen;
  27732. +
  27733. + //DBG_871X("issue bcn_sz=%d\n", pattrib->last_txcmdsz);
  27734. +
  27735. + dump_mgntframe(padapter, pmgntframe);
  27736. +
  27737. +}
  27738. +
  27739. +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq)
  27740. +{
  27741. + struct xmit_frame *pmgntframe;
  27742. + struct pkt_attrib *pattrib;
  27743. + unsigned char *pframe;
  27744. + struct rtw_ieee80211_hdr *pwlanhdr;
  27745. + unsigned short *fctrl;
  27746. + unsigned char *mac, *bssid;
  27747. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  27748. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27749. + u8 *pwps_ie;
  27750. + uint wps_ielen;
  27751. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  27752. +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27753. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  27754. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  27755. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  27756. + unsigned int rate_len;
  27757. +#ifdef CONFIG_P2P
  27758. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  27759. +#ifdef CONFIG_WFD
  27760. + u32 wfdielen = 0;
  27761. +#endif //CONFIG_WFD
  27762. +#endif //CONFIG_P2P
  27763. +
  27764. + //DBG_871X("%s\n", __FUNCTION__);
  27765. +
  27766. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  27767. + {
  27768. + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__);
  27769. + return;
  27770. + }
  27771. +
  27772. +
  27773. + //update attribute
  27774. + pattrib = &pmgntframe->attrib;
  27775. + update_mgntframe_attrib(padapter, pattrib);
  27776. +
  27777. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  27778. +
  27779. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  27780. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  27781. +
  27782. + mac = myid(&(padapter->eeprompriv));
  27783. + bssid = cur_network->MacAddress;
  27784. +
  27785. + fctrl = &(pwlanhdr->frame_ctl);
  27786. + *(fctrl) = 0;
  27787. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  27788. + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
  27789. + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);
  27790. +
  27791. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  27792. + pmlmeext->mgnt_seq++;
  27793. + SetFrameSubType(fctrl, WIFI_PROBERSP);
  27794. +
  27795. + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  27796. + pattrib->pktlen = pattrib->hdrlen;
  27797. + pframe += pattrib->hdrlen;
  27798. +
  27799. +
  27800. + if(cur_network->IELength>MAX_IE_SZ)
  27801. + return;
  27802. +
  27803. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  27804. + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  27805. + {
  27806. + pwps_ie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen);
  27807. +
  27808. + //inerset & update wps_probe_resp_ie
  27809. + if((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0))
  27810. + {
  27811. + uint wps_offset, remainder_ielen;
  27812. + u8 *premainder_ie;
  27813. +
  27814. + wps_offset = (uint)(pwps_ie - cur_network->IEs);
  27815. +
  27816. + premainder_ie = pwps_ie + wps_ielen;
  27817. +
  27818. + remainder_ielen = cur_network->IELength - wps_offset - wps_ielen;
  27819. +
  27820. + _rtw_memcpy(pframe, cur_network->IEs, wps_offset);
  27821. + pframe += wps_offset;
  27822. + pattrib->pktlen += wps_offset;
  27823. +
  27824. + wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len
  27825. + if((wps_offset+wps_ielen+2)<=MAX_IE_SZ)
  27826. + {
  27827. + _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2);
  27828. + pframe += wps_ielen+2;
  27829. + pattrib->pktlen += wps_ielen+2;
  27830. + }
  27831. +
  27832. + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ)
  27833. + {
  27834. + _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
  27835. + pframe += remainder_ielen;
  27836. + pattrib->pktlen += remainder_ielen;
  27837. + }
  27838. + }
  27839. + else
  27840. + {
  27841. + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
  27842. + pframe += cur_network->IELength;
  27843. + pattrib->pktlen += cur_network->IELength;
  27844. + }
  27845. +
  27846. + /* retrieve SSID IE from cur_network->Ssid */
  27847. + {
  27848. + u8 *ssid_ie;
  27849. + sint ssid_ielen;
  27850. + sint ssid_ielen_diff;
  27851. + u8 buf[MAX_IE_SZ];
  27852. + u8 *ies = pmgntframe->buf_addr+TXDESC_OFFSET+sizeof(struct rtw_ieee80211_hdr_3addr);
  27853. +
  27854. + ssid_ie = rtw_get_ie(ies+_FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen,
  27855. + (pframe-ies)-_FIXED_IE_LENGTH_);
  27856. +
  27857. + ssid_ielen_diff = cur_network->Ssid.SsidLength - ssid_ielen;
  27858. +
  27859. + if (ssid_ie && cur_network->Ssid.SsidLength) {
  27860. + uint remainder_ielen;
  27861. + u8 *remainder_ie;
  27862. + remainder_ie = ssid_ie+2;
  27863. + remainder_ielen = (pframe-remainder_ie);
  27864. +
  27865. + LOG_LEVEL(_drv_warning_, FUNC_ADPT_FMT" remainder_ielen > MAX_IE_SZ\n", FUNC_ADPT_ARG(padapter));
  27866. + if (remainder_ielen > MAX_IE_SZ) {
  27867. + remainder_ielen = MAX_IE_SZ;
  27868. + }
  27869. +
  27870. + _rtw_memcpy(buf, remainder_ie, remainder_ielen);
  27871. + _rtw_memcpy(remainder_ie+ssid_ielen_diff, buf, remainder_ielen);
  27872. + *(ssid_ie+1) = cur_network->Ssid.SsidLength;
  27873. + _rtw_memcpy(ssid_ie+2, cur_network->Ssid.Ssid, cur_network->Ssid.SsidLength);
  27874. +
  27875. + pframe += ssid_ielen_diff;
  27876. + pattrib->pktlen += ssid_ielen_diff;
  27877. + }
  27878. + }
  27879. + }
  27880. + else
  27881. +#endif
  27882. + {
  27883. +
  27884. + //timestamp will be inserted by hardware
  27885. + pframe += 8;
  27886. + pattrib->pktlen += 8;
  27887. +
  27888. + // beacon interval: 2 bytes
  27889. +
  27890. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
  27891. +
  27892. + pframe += 2;
  27893. + pattrib->pktlen += 2;
  27894. +
  27895. + // capability info: 2 bytes
  27896. +
  27897. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
  27898. +
  27899. + pframe += 2;
  27900. + pattrib->pktlen += 2;
  27901. +
  27902. + //below for ad-hoc mode
  27903. +
  27904. + // SSID
  27905. + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen);
  27906. +
  27907. + // supported rates...
  27908. + rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
  27909. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen);
  27910. +
  27911. + // DS parameter set
  27912. + pframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen);
  27913. +
  27914. + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  27915. + {
  27916. + u8 erpinfo=0;
  27917. + u32 ATIMWindow;
  27918. + // IBSS Parameter Set...
  27919. + //ATIMWindow = cur->Configuration.ATIMWindow;
  27920. + ATIMWindow = 0;
  27921. + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen);
  27922. +
  27923. + //ERP IE
  27924. + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen);
  27925. + }
  27926. +
  27927. +
  27928. + // EXTERNDED SUPPORTED RATE
  27929. + if (rate_len > 8)
  27930. + {
  27931. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen);
  27932. + }
  27933. +
  27934. +
  27935. + //todo:HT for adhoc
  27936. +
  27937. + }
  27938. +
  27939. +#ifdef CONFIG_P2P
  27940. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) /*&& is_valid_p2p_probereq*/)
  27941. + {
  27942. + u32 len;
  27943. +#ifdef CONFIG_IOCTL_CFG80211
  27944. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  27945. + {
  27946. + //if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p()
  27947. + len = pmlmepriv->p2p_go_probe_resp_ie_len;
  27948. + if(pmlmepriv->p2p_go_probe_resp_ie && len>0)
  27949. + _rtw_memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie, len);
  27950. + }
  27951. + else
  27952. +#endif //CONFIG_IOCTL_CFG80211
  27953. + {
  27954. + len = build_probe_resp_p2p_ie(pwdinfo, pframe);
  27955. + }
  27956. +
  27957. + pframe += len;
  27958. + pattrib->pktlen += len;
  27959. +
  27960. +#ifdef CONFIG_WFD
  27961. +#ifdef CONFIG_IOCTL_CFG80211
  27962. + if(_TRUE == pwdinfo->wfd_info->wfd_enable)
  27963. +#endif //CONFIG_IOCTL_CFG80211
  27964. + {
  27965. + len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
  27966. + }
  27967. +#ifdef CONFIG_IOCTL_CFG80211
  27968. + else
  27969. + {
  27970. + len = 0;
  27971. + if(pmlmepriv->wfd_probe_resp_ie && pmlmepriv->wfd_probe_resp_ie_len>0)
  27972. + {
  27973. + len = pmlmepriv->wfd_probe_resp_ie_len;
  27974. + _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, len);
  27975. + }
  27976. + }
  27977. +#endif //CONFIG_IOCTL_CFG80211
  27978. + pframe += len;
  27979. + pattrib->pktlen += len;
  27980. +#endif //CONFIG_WFD
  27981. +
  27982. + }
  27983. +#endif //CONFIG_P2P
  27984. +
  27985. +
  27986. +#ifdef CONFIG_AUTO_AP_MODE
  27987. +{
  27988. + struct sta_info *psta;
  27989. + struct sta_priv *pstapriv = &padapter->stapriv;
  27990. +
  27991. + DBG_871X("(%s)\n", __FUNCTION__);
  27992. +
  27993. + //check rc station
  27994. + psta = rtw_get_stainfo(pstapriv, da);
  27995. + if (psta && psta->isrc && psta->pid>0)
  27996. + {
  27997. + u8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A};
  27998. + u8 RC_INFO[14] = {0};
  27999. + //EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2]
  28000. + u16 cu_ch = (u16)cur_network->Configuration.DSConfig;
  28001. +
  28002. + DBG_871X("%s, reply rc(pid=0x%x) device "MAC_FMT" in ch=%d\n", __FUNCTION__,
  28003. + psta->pid, MAC_ARG(psta->hwaddr), cu_ch);
  28004. +
  28005. + //append vendor specific ie
  28006. + _rtw_memcpy(RC_INFO, RC_OUI, sizeof(RC_OUI));
  28007. + _rtw_memcpy(&RC_INFO[4], mac, ETH_ALEN);
  28008. + _rtw_memcpy(&RC_INFO[10], (u8*)&psta->pid, 2);
  28009. + _rtw_memcpy(&RC_INFO[12], (u8*)&cu_ch, 2);
  28010. +
  28011. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(RC_INFO), RC_INFO, &pattrib->pktlen);
  28012. + }
  28013. +}
  28014. +#endif //CONFIG_AUTO_AP_MODE
  28015. +
  28016. +
  28017. + pattrib->last_txcmdsz = pattrib->pktlen;
  28018. +
  28019. +
  28020. + dump_mgntframe(padapter, pmgntframe);
  28021. +
  28022. + return;
  28023. +
  28024. +}
  28025. +
  28026. +int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, int wait_ack)
  28027. +{
  28028. + int ret = _FAIL;
  28029. + struct xmit_frame *pmgntframe;
  28030. + struct pkt_attrib *pattrib;
  28031. + unsigned char *pframe;
  28032. + struct rtw_ieee80211_hdr *pwlanhdr;
  28033. + unsigned short *fctrl;
  28034. + unsigned char *mac;
  28035. + unsigned char bssrate[NumRates];
  28036. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  28037. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  28038. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  28039. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  28040. + int bssrate_len = 0;
  28041. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  28042. +
  28043. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_notice_,("+issue_probereq\n"));
  28044. +
  28045. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  28046. + {
  28047. + goto exit;
  28048. + }
  28049. +
  28050. + //update attribute
  28051. + pattrib = &pmgntframe->attrib;
  28052. + update_mgntframe_attrib(padapter, pattrib);
  28053. +
  28054. +
  28055. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  28056. +
  28057. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  28058. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  28059. +
  28060. + mac = myid(&(padapter->eeprompriv));
  28061. +
  28062. + fctrl = &(pwlanhdr->frame_ctl);
  28063. + *(fctrl) = 0;
  28064. +
  28065. + if (da)
  28066. + {
  28067. + // unicast probe request frame
  28068. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  28069. + _rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN);
  28070. + }
  28071. + else
  28072. + {
  28073. + // broadcast probe request frame
  28074. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  28075. + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
  28076. + }
  28077. +
  28078. + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
  28079. +
  28080. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  28081. + pmlmeext->mgnt_seq++;
  28082. + SetFrameSubType(pframe, WIFI_PROBEREQ);
  28083. +
  28084. + pframe += sizeof (struct rtw_ieee80211_hdr_3addr);
  28085. + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
  28086. +
  28087. + if(pssid)
  28088. + pframe = rtw_set_ie(pframe, _SSID_IE_, pssid->SsidLength, pssid->Ssid, &(pattrib->pktlen));
  28089. + else
  28090. + pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &(pattrib->pktlen));
  28091. +
  28092. + get_rate_set(padapter, bssrate, &bssrate_len);
  28093. +
  28094. + if (bssrate_len > 8)
  28095. + {
  28096. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  28097. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  28098. + }
  28099. + else
  28100. + {
  28101. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  28102. + }
  28103. +
  28104. +#if 0
  28105. + //add wps_ie for wps2.0
  28106. + if(pmlmepriv->probereq_wpsie_len>0 && pmlmepriv->probereq_wpsie_len<MAX_WPS_IE_LEN)
  28107. + {
  28108. + _rtw_memcpy(pframe, pmlmepriv->probereq_wpsie, pmlmepriv->probereq_wpsie_len);
  28109. + pframe += pmlmepriv->probereq_wpsie_len;
  28110. + pattrib->pktlen += pmlmepriv->probereq_wpsie_len;
  28111. + //pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero
  28112. + }
  28113. +#else
  28114. + //add wps_ie for wps2.0
  28115. + if(pmlmepriv->wps_probe_req_ie_len>0 && pmlmepriv->wps_probe_req_ie)
  28116. + {
  28117. + _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
  28118. + pframe += pmlmepriv->wps_probe_req_ie_len;
  28119. + pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
  28120. + //pmlmepriv->wps_probe_req_ie_len = 0 ;//reset to zero
  28121. + }
  28122. +#endif
  28123. +
  28124. + pattrib->last_txcmdsz = pattrib->pktlen;
  28125. +
  28126. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_notice_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz));
  28127. +
  28128. + if (wait_ack) {
  28129. + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  28130. + } else {
  28131. + dump_mgntframe(padapter, pmgntframe);
  28132. + ret = _SUCCESS;
  28133. + }
  28134. +
  28135. +exit:
  28136. + return ret;
  28137. +}
  28138. +
  28139. +inline void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da)
  28140. +{
  28141. + _issue_probereq(padapter, pssid, da, _FALSE);
  28142. +}
  28143. +
  28144. +int issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da,
  28145. + int try_cnt, int wait_ms)
  28146. +{
  28147. + int ret;
  28148. + int i = 0;
  28149. + u32 start = rtw_get_current_time();
  28150. +
  28151. + do
  28152. + {
  28153. + ret = _issue_probereq(padapter, pssid, da, wait_ms>0?_TRUE:_FALSE);
  28154. +
  28155. + i++;
  28156. +
  28157. + if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
  28158. + break;
  28159. +
  28160. + if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
  28161. + rtw_msleep_os(wait_ms);
  28162. +
  28163. + }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
  28164. +
  28165. + if (ret != _FAIL) {
  28166. + ret = _SUCCESS;
  28167. + #ifndef DBG_XMIT_ACK
  28168. + goto exit;
  28169. + #endif
  28170. + }
  28171. +
  28172. + if (try_cnt && wait_ms) {
  28173. + if (da)
  28174. + DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  28175. + FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),
  28176. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  28177. + else
  28178. + DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  28179. + FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),
  28180. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  28181. + }
  28182. +exit:
  28183. + return ret;
  28184. +}
  28185. +
  28186. +// if psta == NULL, indiate we are station(client) now...
  28187. +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status)
  28188. +{
  28189. + struct xmit_frame *pmgntframe;
  28190. + struct pkt_attrib *pattrib;
  28191. + unsigned char *pframe;
  28192. + struct rtw_ieee80211_hdr *pwlanhdr;
  28193. + unsigned short *fctrl;
  28194. + unsigned int val32;
  28195. + unsigned short val16;
  28196. + int use_shared_key = 0;
  28197. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  28198. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  28199. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  28200. +
  28201. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  28202. + {
  28203. + return;
  28204. + }
  28205. +
  28206. + //update attribute
  28207. + pattrib = &pmgntframe->attrib;
  28208. + update_mgntframe_attrib(padapter, pattrib);
  28209. +
  28210. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  28211. +
  28212. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  28213. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  28214. +
  28215. + fctrl = &(pwlanhdr->frame_ctl);
  28216. + *(fctrl) = 0;
  28217. +
  28218. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  28219. + pmlmeext->mgnt_seq++;
  28220. + SetFrameSubType(pframe, WIFI_AUTH);
  28221. +
  28222. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  28223. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  28224. +
  28225. +
  28226. + if(psta)// for AP mode
  28227. + {
  28228. +#ifdef CONFIG_NATIVEAP_MLME
  28229. +
  28230. + _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN);
  28231. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  28232. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  28233. +
  28234. +
  28235. + // setting auth algo number
  28236. + val16 = (u16)psta->authalg;
  28237. +
  28238. + if(status != _STATS_SUCCESSFUL_)
  28239. + val16 = 0;
  28240. +
  28241. + if (val16) {
  28242. + val16 = cpu_to_le16(val16);
  28243. + use_shared_key = 1;
  28244. + }
  28245. +
  28246. + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));
  28247. +
  28248. + // setting auth seq number
  28249. + val16 =(u16)psta->auth_seq;
  28250. + val16 = cpu_to_le16(val16);
  28251. + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));
  28252. +
  28253. + // setting status code...
  28254. + val16 = status;
  28255. + val16 = cpu_to_le16(val16);
  28256. + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen));
  28257. +
  28258. + // added challenging text...
  28259. + if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))
  28260. + {
  28261. + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen));
  28262. + }
  28263. +#endif
  28264. + }
  28265. + else
  28266. + {
  28267. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN);
  28268. + _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
  28269. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN);
  28270. +
  28271. + // setting auth algo number
  28272. + val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key
  28273. + if (val16) {
  28274. + val16 = cpu_to_le16(val16);
  28275. + use_shared_key = 1;
  28276. + }
  28277. + //DBG_871X("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq);
  28278. +
  28279. + //setting IV for auth seq #3
  28280. + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))
  28281. + {
  28282. + //DBG_871X("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index);
  28283. + val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30));
  28284. + val32 = cpu_to_le32(val32);
  28285. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen));
  28286. +
  28287. + pattrib->iv_len = 4;
  28288. + }
  28289. +
  28290. + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));
  28291. +
  28292. + // setting auth seq number
  28293. + val16 = pmlmeinfo->auth_seq;
  28294. + val16 = cpu_to_le16(val16);
  28295. + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));
  28296. +
  28297. +
  28298. + // setting status code...
  28299. + val16 = status;
  28300. + val16 = cpu_to_le16(val16);
  28301. + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen));
  28302. +
  28303. + // then checking to see if sending challenging text...
  28304. + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))
  28305. + {
  28306. + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen));
  28307. +
  28308. + SetPrivacy(fctrl);
  28309. +
  28310. + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  28311. +
  28312. + pattrib->encrypt = _WEP40_;
  28313. +
  28314. + pattrib->icv_len = 4;
  28315. +
  28316. + pattrib->pktlen += pattrib->icv_len;
  28317. +
  28318. + }
  28319. +
  28320. + }
  28321. +
  28322. + pattrib->last_txcmdsz = pattrib->pktlen;
  28323. +
  28324. + rtw_wep_encrypt(padapter, (u8 *)pmgntframe);
  28325. +
  28326. + dump_mgntframe(padapter, pmgntframe);
  28327. +
  28328. + return;
  28329. +}
  28330. +
  28331. +
  28332. +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type)
  28333. +{
  28334. +#ifdef CONFIG_AP_MODE
  28335. + struct xmit_frame *pmgntframe;
  28336. + struct rtw_ieee80211_hdr *pwlanhdr;
  28337. + struct pkt_attrib *pattrib;
  28338. + unsigned char *pbuf, *pframe;
  28339. + unsigned short val;
  28340. + unsigned short *fctrl;
  28341. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  28342. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  28343. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  28344. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  28345. + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);
  28346. + u8 *ie = pnetwork->IEs;
  28347. +#ifdef CONFIG_P2P
  28348. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  28349. +#ifdef CONFIG_WFD
  28350. + u32 wfdielen = 0;
  28351. +#endif //CONFIG_WFD
  28352. +#endif //CONFIG_P2P
  28353. +
  28354. + DBG_871X("%s\n", __FUNCTION__);
  28355. +
  28356. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  28357. + {
  28358. + return;
  28359. + }
  28360. +
  28361. + //update attribute
  28362. + pattrib = &pmgntframe->attrib;
  28363. + update_mgntframe_attrib(padapter, pattrib);
  28364. +
  28365. +
  28366. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  28367. +
  28368. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  28369. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  28370. +
  28371. + fctrl = &(pwlanhdr->frame_ctl);
  28372. + *(fctrl) = 0;
  28373. +
  28374. + _rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN);
  28375. + _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&(padapter->eeprompriv)), ETH_ALEN);
  28376. + _rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  28377. +
  28378. +
  28379. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  28380. + pmlmeext->mgnt_seq++;
  28381. + if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP))
  28382. + SetFrameSubType(pwlanhdr, pkt_type);
  28383. + else
  28384. + return;
  28385. +
  28386. + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  28387. + pattrib->pktlen += pattrib->hdrlen;
  28388. + pframe += pattrib->hdrlen;
  28389. +
  28390. + //capability
  28391. + val = *(unsigned short *)rtw_get_capability_from_ie(ie);
  28392. +
  28393. + pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen));
  28394. +
  28395. + status = cpu_to_le16(status);
  28396. + pframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&status, &(pattrib->pktlen));
  28397. +
  28398. + val = cpu_to_le16(pstat->aid | BIT(14) | BIT(15));
  28399. + pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen));
  28400. +
  28401. + if (pstat->bssratelen <= 8)
  28402. + {
  28403. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen));
  28404. + }
  28405. + else
  28406. + {
  28407. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen));
  28408. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen));
  28409. + }
  28410. +
  28411. +#ifdef CONFIG_80211N_HT
  28412. + if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option))
  28413. + {
  28414. + uint ie_len=0;
  28415. +
  28416. + //FILL HT CAP INFO IE
  28417. + //p = hostapd_eid_ht_capabilities_info(hapd, p);
  28418. + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));
  28419. + if(pbuf && ie_len>0)
  28420. + {
  28421. + _rtw_memcpy(pframe, pbuf, ie_len+2);
  28422. + pframe += (ie_len+2);
  28423. + pattrib->pktlen +=(ie_len+2);
  28424. + }
  28425. +
  28426. + //FILL HT ADD INFO IE
  28427. + //p = hostapd_eid_ht_operation(hapd, p);
  28428. + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));
  28429. + if(pbuf && ie_len>0)
  28430. + {
  28431. + _rtw_memcpy(pframe, pbuf, ie_len+2);
  28432. + pframe += (ie_len+2);
  28433. + pattrib->pktlen +=(ie_len+2);
  28434. + }
  28435. +
  28436. + }
  28437. +#endif
  28438. +
  28439. + //FILL WMM IE
  28440. + if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option))
  28441. + {
  28442. + uint ie_len=0;
  28443. + unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
  28444. +
  28445. + for (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2))
  28446. + {
  28447. + pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));
  28448. + if(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6))
  28449. + {
  28450. + _rtw_memcpy(pframe, pbuf, ie_len+2);
  28451. + pframe += (ie_len+2);
  28452. + pattrib->pktlen +=(ie_len+2);
  28453. +
  28454. + break;
  28455. + }
  28456. +
  28457. + if ((pbuf == NULL) || (ie_len == 0))
  28458. + {
  28459. + break;
  28460. + }
  28461. + }
  28462. +
  28463. + }
  28464. +
  28465. +
  28466. + if (pmlmeinfo->assoc_AP_vendor == realtekAP)
  28467. + {
  28468. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen));
  28469. + }
  28470. +
  28471. + //add WPS IE ie for wps 2.0
  28472. + if(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0)
  28473. + {
  28474. + _rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len);
  28475. +
  28476. + pframe += pmlmepriv->wps_assoc_resp_ie_len;
  28477. + pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len;
  28478. + }
  28479. +
  28480. +#ifdef CONFIG_P2P
  28481. + if( padapter->wdinfo.driver_interface == DRIVER_WEXT )
  28482. + {
  28483. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE))
  28484. + {
  28485. + u32 len;
  28486. +
  28487. + len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code);
  28488. +
  28489. + pframe += len;
  28490. + pattrib->pktlen += len;
  28491. + }
  28492. + }
  28493. +#ifdef CONFIG_WFD
  28494. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)
  28495. +#ifdef CONFIG_IOCTL_CFG80211
  28496. + && (_TRUE == pwdinfo->wfd_info->wfd_enable)
  28497. +#endif //CONFIG_IOCTL_CFG80211
  28498. + )
  28499. + {
  28500. + wfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe);
  28501. + pframe += wfdielen;
  28502. + pattrib->pktlen += wfdielen;
  28503. + }
  28504. +#endif //CONFIG_WFD
  28505. +#endif //CONFIG_P2P
  28506. +
  28507. + pattrib->last_txcmdsz = pattrib->pktlen;
  28508. +
  28509. + dump_mgntframe(padapter, pmgntframe);
  28510. +
  28511. +#endif
  28512. +}
  28513. +
  28514. +void issue_assocreq(_adapter *padapter)
  28515. +{
  28516. + int ret = _FAIL;
  28517. + struct xmit_frame *pmgntframe;
  28518. + struct pkt_attrib *pattrib;
  28519. + unsigned char *pframe, *p;
  28520. + struct rtw_ieee80211_hdr *pwlanhdr;
  28521. + unsigned short *fctrl;
  28522. + unsigned short val16;
  28523. + unsigned int i, j, ie_len, index=0;
  28524. + unsigned char rf_type, bssrate[NumRates], sta_bssrate[NumRates];
  28525. + PNDIS_802_11_VARIABLE_IEs pIE;
  28526. + struct registry_priv *pregpriv = &padapter->registrypriv;
  28527. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  28528. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  28529. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  28530. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  28531. + int bssrate_len = 0, sta_bssrate_len = 0;
  28532. + u8 cbw40_enable = 0;
  28533. +#ifdef CONFIG_P2P
  28534. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  28535. + u8 p2pie[ 255 ] = { 0x00 };
  28536. + u16 p2pielen = 0;
  28537. +#ifdef CONFIG_WFD
  28538. + u32 wfdielen = 0;
  28539. +#endif //CONFIG_WFD
  28540. +#endif //CONFIG_P2P
  28541. +
  28542. +#ifdef CONFIG_DFS
  28543. + u16 cap;
  28544. + u8 pow_cap_ele[2] = { 0x00 };
  28545. + u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel
  28546. +#endif //CONFIG_DFS
  28547. +
  28548. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  28549. + goto exit;
  28550. +
  28551. + //update attribute
  28552. + pattrib = &pmgntframe->attrib;
  28553. + update_mgntframe_attrib(padapter, pattrib);
  28554. +
  28555. +
  28556. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  28557. +
  28558. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  28559. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  28560. +
  28561. + fctrl = &(pwlanhdr->frame_ctl);
  28562. + *(fctrl) = 0;
  28563. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  28564. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  28565. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  28566. +
  28567. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  28568. + pmlmeext->mgnt_seq++;
  28569. + SetFrameSubType(pframe, WIFI_ASSOCREQ);
  28570. +
  28571. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  28572. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  28573. +
  28574. + //caps
  28575. +
  28576. +#ifdef CONFIG_DFS
  28577. + _rtw_memcpy(&cap, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  28578. + if(pmlmeext->cur_channel > 14)
  28579. + cap |= BIT(8); //Spectrum Mgmt. Enabled
  28580. + _rtw_memcpy(pframe, &cap, 2);
  28581. +#else
  28582. + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  28583. +#endif //CONFIG_DFS
  28584. +
  28585. + pframe += 2;
  28586. + pattrib->pktlen += 2;
  28587. +
  28588. + //listen interval
  28589. + //todo: listen interval for power saving
  28590. + val16 = cpu_to_le16(3);
  28591. + _rtw_memcpy(pframe ,(unsigned char *)&val16, 2);
  28592. + pframe += 2;
  28593. + pattrib->pktlen += 2;
  28594. +
  28595. + //SSID
  28596. + pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen));
  28597. +
  28598. + //supported rate & extended supported rate
  28599. +
  28600. +#if 1 // Check if the AP's supported rates are also supported by STA.
  28601. + get_rate_set(padapter, sta_bssrate, &sta_bssrate_len);
  28602. + //DBG_871X("sta_bssrate_len=%d\n", sta_bssrate_len);
  28603. +
  28604. + if(pmlmeext->cur_channel == 14)// for JAPAN, channel 14 can only uses B Mode(CCK)
  28605. + {
  28606. + sta_bssrate_len = 4;
  28607. + }
  28608. +
  28609. +
  28610. + //for (i = 0; i < sta_bssrate_len; i++) {
  28611. + // DBG_871X("sta_bssrate[%d]=%02X\n", i, sta_bssrate[i]);
  28612. + //}
  28613. +
  28614. + for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
  28615. + if (pmlmeinfo->network.SupportedRates[i] == 0) break;
  28616. + DBG_871X("network.SupportedRates[%d]=%02X\n", i, pmlmeinfo->network.SupportedRates[i]);
  28617. + }
  28618. +
  28619. +
  28620. + for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
  28621. + if (pmlmeinfo->network.SupportedRates[i] == 0) break;
  28622. +
  28623. +
  28624. + // Check if the AP's supported rates are also supported by STA.
  28625. + for (j=0; j < sta_bssrate_len; j++) {
  28626. + // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP
  28627. + if ( (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK)
  28628. + == (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)) {
  28629. + //DBG_871X("match i = %d, j=%d\n", i, j);
  28630. + break;
  28631. + } else {
  28632. + //DBG_871X("not match: %02X != %02X\n", (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK), (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK));
  28633. + }
  28634. + }
  28635. +
  28636. + if (j == sta_bssrate_len) {
  28637. + // the rate is not supported by STA
  28638. + DBG_871X("%s(): the rate[%d]=%02X is not supported by STA!\n",__FUNCTION__, i, pmlmeinfo->network.SupportedRates[i]);
  28639. + } else {
  28640. + // the rate is supported by STA
  28641. + bssrate[index++] = pmlmeinfo->network.SupportedRates[i];
  28642. + }
  28643. + }
  28644. +
  28645. + bssrate_len = index;
  28646. + DBG_871X("bssrate_len = %d\n", bssrate_len);
  28647. +
  28648. +#else // Check if the AP's supported rates are also supported by STA.
  28649. +#if 0
  28650. + get_rate_set(padapter, bssrate, &bssrate_len);
  28651. +#else
  28652. + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) {
  28653. + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break;
  28654. +
  28655. + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0x2C) // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP
  28656. + break;
  28657. +
  28658. + bssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len];
  28659. + }
  28660. +#endif
  28661. +#endif // Check if the AP's supported rates are also supported by STA.
  28662. +
  28663. + if (bssrate_len == 0) {
  28664. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  28665. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  28666. + goto exit; //don't connect to AP if no joint supported rate
  28667. + }
  28668. +
  28669. +
  28670. + if (bssrate_len > 8)
  28671. + {
  28672. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  28673. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  28674. + }
  28675. + else
  28676. + {
  28677. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  28678. + }
  28679. +
  28680. +#ifdef CONFIG_DFS
  28681. + if(pmlmeext->cur_channel > 14)
  28682. + {
  28683. + pow_cap_ele[0] = 13; // Minimum transmit power capability
  28684. + pow_cap_ele[1] = 21; // Maximum transmit power capability
  28685. + pframe = rtw_set_ie(pframe, _POW_CAP_IE_, 2, pow_cap_ele, &(pattrib->pktlen));
  28686. +
  28687. + //supported channels
  28688. + do{
  28689. + if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 )
  28690. + {
  28691. + sup_ch[0] = 1; //First channel number
  28692. + sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel
  28693. + }
  28694. + else
  28695. + {
  28696. + sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;
  28697. + sup_ch[idx_5g++] = 1;
  28698. + }
  28699. + sup_ch_idx++;
  28700. + }
  28701. + while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 );
  28702. + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen));
  28703. + }
  28704. +#endif //CONFIG_DFS
  28705. +
  28706. + //RSN
  28707. + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _RSN_IE_2_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  28708. + if (p != NULL)
  28709. + {
  28710. + pframe = rtw_set_ie(pframe, _RSN_IE_2_, ie_len, (p + 2), &(pattrib->pktlen));
  28711. + }
  28712. +
  28713. +#ifdef CONFIG_80211N_HT
  28714. + //HT caps
  28715. + if(padapter->mlmepriv.htpriv.ht_option==_TRUE)
  28716. + {
  28717. + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_CAPABILITY_IE_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  28718. + if ((p != NULL) && (!(is_ap_in_tkip(padapter))))
  28719. + {
  28720. + _rtw_memcpy(&(pmlmeinfo->HT_caps), (p + 2), sizeof(struct HT_caps_element));
  28721. +
  28722. + //to disable 40M Hz support while gd_bw_40MHz_en = 0
  28723. + if( pmlmeext->cur_channel > 14)
  28724. + {
  28725. + if(pregpriv->cbw40_enable & BIT(1) )
  28726. + cbw40_enable=1;
  28727. + }
  28728. + else
  28729. + if(pregpriv->cbw40_enable & BIT(0) )
  28730. + cbw40_enable=1;
  28731. +
  28732. + if (cbw40_enable == 0)
  28733. + {
  28734. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info &= (~(BIT(6) | BIT(1)));
  28735. + }
  28736. + else
  28737. + {
  28738. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= BIT(1);
  28739. + }
  28740. +
  28741. + //todo: disable SM power save mode
  28742. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= 0x000c;
  28743. +
  28744. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  28745. + //switch (pregpriv->rf_config)
  28746. + switch(rf_type)
  28747. + {
  28748. + case RF_1T1R:
  28749. +
  28750. + if(pregpriv->rx_stbc)
  28751. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream
  28752. +
  28753. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R, 16);
  28754. + break;
  28755. +
  28756. + case RF_2T2R:
  28757. + case RF_1T2R:
  28758. + default:
  28759. +
  28760. +
  28761. + if(pregpriv->special_rf_path)
  28762. + {
  28763. + if(pregpriv->rx_stbc)
  28764. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream
  28765. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R, 16);
  28766. + break;
  28767. + }
  28768. +
  28769. + if((pregpriv->rx_stbc == 0x3) ||//enable for 2.4/5 GHz
  28770. + ((pmlmeext->cur_wireless_mode & WIRELESS_11_24N) && (pregpriv->rx_stbc == 0x1)) || //enable for 2.4GHz
  28771. + ((pmlmeext->cur_wireless_mode & WIRELESS_11_5N) && (pregpriv->rx_stbc == 0x2)) || //enable for 5GHz
  28772. + (pregpriv->wifi_spec==1))
  28773. + {
  28774. + DBG_871X("declare supporting RX STBC\n");
  28775. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0200);//RX STBC two spatial stream
  28776. + }
  28777. + #ifdef CONFIG_DISABLE_MCS13TO15
  28778. + if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40 && (pregpriv->wifi_spec!=1))
  28779. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_2R_MCS13TO15_OFF, 16);
  28780. + else
  28781. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_2R, 16);
  28782. + #else //CONFIG_DISABLE_MCS13TO15
  28783. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_2R, 16);
  28784. + #endif //CONFIG_DISABLE_MCS13TO15
  28785. + break;
  28786. + }
  28787. +#ifdef RTL8192C_RECONFIG_TO_1T1R
  28788. + {
  28789. + if(pregpriv->rx_stbc)
  28790. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream
  28791. +
  28792. + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R, 16);
  28793. + }
  28794. +#endif
  28795. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info);
  28796. + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, ie_len , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen));
  28797. +
  28798. + }
  28799. + }
  28800. +#endif
  28801. +
  28802. + //vendor specific IE, such as WPA, WMM, WPS
  28803. + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)
  28804. + {
  28805. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);
  28806. +
  28807. + switch (pIE->ElementID)
  28808. + {
  28809. + case _VENDOR_SPECIFIC_IE_:
  28810. + if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) ||
  28811. + (_rtw_memcmp(pIE->data, WMM_OUI, 4)) ||
  28812. + (_rtw_memcmp(pIE->data, WPS_OUI, 4)))
  28813. + {
  28814. + if(!padapter->registrypriv.wifi_spec)
  28815. + {
  28816. + //Commented by Kurt 20110629
  28817. + //In some older APs, WPS handshake
  28818. + //would be fail if we append vender extensions informations to AP
  28819. + if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){
  28820. + pIE->Length=14;
  28821. + }
  28822. + }
  28823. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen));
  28824. + }
  28825. + break;
  28826. +
  28827. + default:
  28828. + break;
  28829. + }
  28830. +
  28831. + i += (pIE->Length + 2);
  28832. + }
  28833. +
  28834. + if (pmlmeinfo->assoc_AP_vendor == realtekAP)
  28835. + {
  28836. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen));
  28837. + }
  28838. +
  28839. +#ifdef CONFIG_P2P
  28840. +
  28841. +#ifdef CONFIG_IOCTL_CFG80211
  28842. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )
  28843. + {
  28844. + if(pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len>0)
  28845. + {
  28846. + _rtw_memcpy(pframe, pmlmepriv->p2p_assoc_req_ie, pmlmepriv->p2p_assoc_req_ie_len);
  28847. + pframe += pmlmepriv->p2p_assoc_req_ie_len;
  28848. + pattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len;
  28849. + }
  28850. + }
  28851. + else
  28852. +#endif //CONFIG_IOCTL_CFG80211
  28853. + {
  28854. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  28855. + {
  28856. + // Should add the P2P IE in the association request frame.
  28857. + // P2P OUI
  28858. +
  28859. + p2pielen = 0;
  28860. + p2pie[ p2pielen++ ] = 0x50;
  28861. + p2pie[ p2pielen++ ] = 0x6F;
  28862. + p2pie[ p2pielen++ ] = 0x9A;
  28863. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  28864. +
  28865. + // Commented by Albert 20101109
  28866. + // According to the P2P Specification, the association request frame should contain 3 P2P attributes
  28867. + // 1. P2P Capability
  28868. + // 2. Extended Listen Timing
  28869. + // 3. Device Info
  28870. + // Commented by Albert 20110516
  28871. + // 4. P2P Interface
  28872. +
  28873. + // P2P Capability
  28874. + // Type:
  28875. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  28876. +
  28877. + // Length:
  28878. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  28879. + p2pielen += 2;
  28880. +
  28881. + // Value:
  28882. + // Device Capability Bitmap, 1 byte
  28883. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  28884. +
  28885. + // Group Capability Bitmap, 1 byte
  28886. + if ( pwdinfo->persistent_supported )
  28887. + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
  28888. + else
  28889. + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
  28890. +
  28891. + // Extended Listen Timing
  28892. + // Type:
  28893. + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
  28894. +
  28895. + // Length:
  28896. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );
  28897. + p2pielen += 2;
  28898. +
  28899. + // Value:
  28900. + // Availability Period
  28901. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  28902. + p2pielen += 2;
  28903. +
  28904. + // Availability Interval
  28905. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  28906. + p2pielen += 2;
  28907. +
  28908. + // Device Info
  28909. + // Type:
  28910. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  28911. +
  28912. + // Length:
  28913. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  28914. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  28915. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  28916. + p2pielen += 2;
  28917. +
  28918. + // Value:
  28919. + // P2P Device Address
  28920. + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
  28921. + p2pielen += ETH_ALEN;
  28922. +
  28923. + // Config Method
  28924. + // This field should be big endian. Noted by P2P specification.
  28925. + if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) ||
  28926. + ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) )
  28927. + {
  28928. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );
  28929. + }
  28930. + else
  28931. + {
  28932. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC );
  28933. + }
  28934. +
  28935. + p2pielen += 2;
  28936. +
  28937. + // Primary Device Type
  28938. + // Category ID
  28939. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  28940. + p2pielen += 2;
  28941. +
  28942. + // OUI
  28943. + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  28944. + p2pielen += 4;
  28945. +
  28946. + // Sub Category ID
  28947. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  28948. + p2pielen += 2;
  28949. +
  28950. + // Number of Secondary Device Types
  28951. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  28952. +
  28953. + // Device Name
  28954. + // Type:
  28955. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  28956. + p2pielen += 2;
  28957. +
  28958. + // Length:
  28959. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  28960. + p2pielen += 2;
  28961. +
  28962. + // Value:
  28963. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );
  28964. + p2pielen += pwdinfo->device_name_len;
  28965. +
  28966. + // P2P Interface
  28967. + // Type:
  28968. + p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE;
  28969. +
  28970. + // Length:
  28971. + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D );
  28972. + p2pielen += 2;
  28973. +
  28974. + // Value:
  28975. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Device Address
  28976. + p2pielen += ETH_ALEN;
  28977. +
  28978. + p2pie[ p2pielen++ ] = 1; // P2P Interface Address Count
  28979. +
  28980. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Interface Address List
  28981. + p2pielen += ETH_ALEN;
  28982. +
  28983. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );
  28984. +
  28985. +#ifdef CONFIG_WFD
  28986. + //wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);
  28987. + //pframe += wfdielen;
  28988. + //pattrib->pktlen += wfdielen;
  28989. +#endif //CONFIG_WFD
  28990. + }
  28991. + }
  28992. +
  28993. +#endif //CONFIG_P2P
  28994. +
  28995. +#ifdef CONFIG_WFD
  28996. +#ifdef CONFIG_IOCTL_CFG80211
  28997. + if ( _TRUE == pwdinfo->wfd_info->wfd_enable )
  28998. +#endif //CONFIG_IOCTL_CFG80211
  28999. + {
  29000. + wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);
  29001. + pframe += wfdielen;
  29002. + pattrib->pktlen += wfdielen;
  29003. + }
  29004. +#ifdef CONFIG_IOCTL_CFG80211
  29005. + else if (pmlmepriv->wfd_assoc_req_ie != NULL && pmlmepriv->wfd_assoc_req_ie_len>0)
  29006. + {
  29007. + //WFD IE
  29008. + _rtw_memcpy(pframe, pmlmepriv->wfd_assoc_req_ie, pmlmepriv->wfd_assoc_req_ie_len);
  29009. + pattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len;
  29010. + pframe += pmlmepriv->wfd_assoc_req_ie_len;
  29011. + }
  29012. +#endif //CONFIG_IOCTL_CFG80211
  29013. +#endif //CONFIG_WFD
  29014. +
  29015. + pattrib->last_txcmdsz = pattrib->pktlen;
  29016. + dump_mgntframe(padapter, pmgntframe);
  29017. +
  29018. + ret = _SUCCESS;
  29019. +
  29020. +exit:
  29021. + if (ret == _SUCCESS)
  29022. + rtw_buf_update(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len, (u8 *)pwlanhdr, pattrib->pktlen);
  29023. + else
  29024. + rtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len);
  29025. +
  29026. + return;
  29027. +}
  29028. +
  29029. +//when wait_ack is ture, this function shoule be called at process context
  29030. +static int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack)
  29031. +{
  29032. + int ret = _FAIL;
  29033. + struct xmit_frame *pmgntframe;
  29034. + struct pkt_attrib *pattrib;
  29035. + unsigned char *pframe;
  29036. + struct rtw_ieee80211_hdr *pwlanhdr;
  29037. + unsigned short *fctrl;
  29038. + struct xmit_priv *pxmitpriv;
  29039. + struct mlme_ext_priv *pmlmeext;
  29040. + struct mlme_ext_info *pmlmeinfo;
  29041. +
  29042. + //DBG_871X("%s:%d\n", __FUNCTION__, power_mode);
  29043. +
  29044. + if(!padapter)
  29045. + goto exit;
  29046. +
  29047. + pxmitpriv = &(padapter->xmitpriv);
  29048. + pmlmeext = &(padapter->mlmeextpriv);
  29049. + pmlmeinfo = &(pmlmeext->mlmext_info);
  29050. +
  29051. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29052. + {
  29053. + goto exit;
  29054. + }
  29055. +
  29056. + //update attribute
  29057. + pattrib = &pmgntframe->attrib;
  29058. + update_mgntframe_attrib(padapter, pattrib);
  29059. + pattrib->retry_ctrl = _FALSE;
  29060. +
  29061. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29062. +
  29063. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29064. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29065. +
  29066. + fctrl = &(pwlanhdr->frame_ctl);
  29067. + *(fctrl) = 0;
  29068. +
  29069. + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  29070. + {
  29071. + SetFrDs(fctrl);
  29072. + }
  29073. + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
  29074. + {
  29075. + SetToDs(fctrl);
  29076. + }
  29077. +
  29078. + if (power_mode)
  29079. + {
  29080. + SetPwrMgt(fctrl);
  29081. + }
  29082. +
  29083. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  29084. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29085. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29086. +
  29087. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29088. + pmlmeext->mgnt_seq++;
  29089. + SetFrameSubType(pframe, WIFI_DATA_NULL);
  29090. +
  29091. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29092. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29093. +
  29094. + pattrib->last_txcmdsz = pattrib->pktlen;
  29095. +
  29096. + if(wait_ack)
  29097. + {
  29098. + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  29099. + }
  29100. + else
  29101. + {
  29102. + dump_mgntframe(padapter, pmgntframe);
  29103. + ret = _SUCCESS;
  29104. + }
  29105. +
  29106. +exit:
  29107. + return ret;
  29108. +}
  29109. +
  29110. +
  29111. +//when wait_ms >0 , this function shoule be called at process context
  29112. +//da == NULL for station mode
  29113. +int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)
  29114. +{
  29115. + int ret;
  29116. + int i = 0;
  29117. + u32 start = rtw_get_current_time();
  29118. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29119. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29120. +
  29121. + /* da == NULL, assum it's null data for sta to ap*/
  29122. + if (da == NULL)
  29123. + da = get_my_bssid(&(pmlmeinfo->network));
  29124. +
  29125. + do
  29126. + {
  29127. + ret = _issue_nulldata(padapter, da, power_mode, wait_ms>0?_TRUE:_FALSE);
  29128. +
  29129. + i++;
  29130. +
  29131. + if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
  29132. + break;
  29133. +
  29134. + if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
  29135. + rtw_msleep_os(wait_ms);
  29136. +
  29137. + }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
  29138. +
  29139. + if (ret != _FAIL) {
  29140. + ret = _SUCCESS;
  29141. + #ifndef DBG_XMIT_ACK
  29142. + goto exit;
  29143. + #endif
  29144. + }
  29145. +
  29146. + if (try_cnt && wait_ms) {
  29147. + if (da)
  29148. + DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  29149. + FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),
  29150. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29151. + else
  29152. + DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  29153. + FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),
  29154. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29155. + }
  29156. +exit:
  29157. + return ret;
  29158. +}
  29159. +
  29160. +//when wait_ack is ture, this function shoule be called at process context
  29161. +static int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int wait_ack)
  29162. +{
  29163. + int ret = _FAIL;
  29164. + struct xmit_frame *pmgntframe;
  29165. + struct pkt_attrib *pattrib;
  29166. + unsigned char *pframe;
  29167. + struct rtw_ieee80211_hdr *pwlanhdr;
  29168. + unsigned short *fctrl, *qc;
  29169. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29170. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29171. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29172. +
  29173. + DBG_871X("%s\n", __FUNCTION__);
  29174. +
  29175. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29176. + {
  29177. + goto exit;
  29178. + }
  29179. +
  29180. + //update attribute
  29181. + pattrib = &pmgntframe->attrib;
  29182. + update_mgntframe_attrib(padapter, pattrib);
  29183. +
  29184. + pattrib->hdrlen +=2;
  29185. + pattrib->qos_en = _TRUE;
  29186. + pattrib->eosp = 1;
  29187. + pattrib->ack_policy = 0;
  29188. + pattrib->mdata = 0;
  29189. +
  29190. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29191. +
  29192. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29193. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29194. +
  29195. + fctrl = &(pwlanhdr->frame_ctl);
  29196. + *(fctrl) = 0;
  29197. +
  29198. + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  29199. + {
  29200. + SetFrDs(fctrl);
  29201. + }
  29202. + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
  29203. + {
  29204. + SetToDs(fctrl);
  29205. + }
  29206. +
  29207. + if(pattrib->mdata)
  29208. + SetMData(fctrl);
  29209. +
  29210. + qc = (unsigned short *)(pframe + pattrib->hdrlen - 2);
  29211. +
  29212. + SetPriority(qc, tid);
  29213. +
  29214. + SetEOSP(qc, pattrib->eosp);
  29215. +
  29216. + SetAckpolicy(qc, pattrib->ack_policy);
  29217. +
  29218. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  29219. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29220. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29221. +
  29222. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29223. + pmlmeext->mgnt_seq++;
  29224. + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);
  29225. +
  29226. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos);
  29227. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);
  29228. +
  29229. + pattrib->last_txcmdsz = pattrib->pktlen;
  29230. +
  29231. + if(wait_ack)
  29232. + {
  29233. + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  29234. + }
  29235. + else
  29236. + {
  29237. + dump_mgntframe(padapter, pmgntframe);
  29238. + ret = _SUCCESS;
  29239. + }
  29240. +
  29241. +exit:
  29242. + return ret;
  29243. +}
  29244. +
  29245. +//when wait_ms >0 , this function shoule be called at process context
  29246. +//da == NULL for station mode
  29247. +int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms)
  29248. +{
  29249. + int ret;
  29250. + int i = 0;
  29251. + u32 start = rtw_get_current_time();
  29252. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29253. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29254. +
  29255. + /* da == NULL, assum it's null data for sta to ap*/
  29256. + if (da == NULL)
  29257. + da = get_my_bssid(&(pmlmeinfo->network));
  29258. +
  29259. + do
  29260. + {
  29261. + ret = _issue_qos_nulldata(padapter, da, tid, wait_ms>0?_TRUE:_FALSE);
  29262. +
  29263. + i++;
  29264. +
  29265. + if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
  29266. + break;
  29267. +
  29268. + if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
  29269. + rtw_msleep_os(wait_ms);
  29270. +
  29271. + }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
  29272. +
  29273. + if (ret != _FAIL) {
  29274. + ret = _SUCCESS;
  29275. + #ifndef DBG_XMIT_ACK
  29276. + goto exit;
  29277. + #endif
  29278. + }
  29279. +
  29280. + if (try_cnt && wait_ms) {
  29281. + if (da)
  29282. + DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  29283. + FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),
  29284. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29285. + else
  29286. + DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  29287. + FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),
  29288. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29289. + }
  29290. +exit:
  29291. + return ret;
  29292. +}
  29293. +
  29294. +static int _issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason, u8 wait_ack)
  29295. +{
  29296. + struct xmit_frame *pmgntframe;
  29297. + struct pkt_attrib *pattrib;
  29298. + unsigned char *pframe;
  29299. + struct rtw_ieee80211_hdr *pwlanhdr;
  29300. + unsigned short *fctrl;
  29301. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29302. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29303. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29304. + int ret = _FAIL;
  29305. +#ifdef CONFIG_P2P
  29306. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  29307. +#endif //CONFIG_P2P
  29308. +
  29309. + //DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(da));
  29310. +
  29311. +#ifdef CONFIG_P2P
  29312. + if ( !( rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) && ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) )
  29313. + {
  29314. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );
  29315. + _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );
  29316. + }
  29317. +#endif //CONFIG_P2P
  29318. +
  29319. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29320. + {
  29321. + goto exit;
  29322. + }
  29323. +
  29324. + //update attribute
  29325. + pattrib = &pmgntframe->attrib;
  29326. + update_mgntframe_attrib(padapter, pattrib);
  29327. + pattrib->retry_ctrl = _FALSE;
  29328. +
  29329. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29330. +
  29331. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29332. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29333. +
  29334. + fctrl = &(pwlanhdr->frame_ctl);
  29335. + *(fctrl) = 0;
  29336. +
  29337. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  29338. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29339. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29340. +
  29341. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29342. + pmlmeext->mgnt_seq++;
  29343. + SetFrameSubType(pframe, WIFI_DEAUTH);
  29344. +
  29345. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29346. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29347. +
  29348. + reason = cpu_to_le16(reason);
  29349. + pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_ , (unsigned char *)&reason, &(pattrib->pktlen));
  29350. +
  29351. + pattrib->last_txcmdsz = pattrib->pktlen;
  29352. +
  29353. +
  29354. + if(wait_ack)
  29355. + {
  29356. + ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  29357. + }
  29358. + else
  29359. + {
  29360. + dump_mgntframe(padapter, pmgntframe);
  29361. + ret = _SUCCESS;
  29362. + }
  29363. +
  29364. +exit:
  29365. + return ret;
  29366. +}
  29367. +
  29368. +int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason)
  29369. +{
  29370. + DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(da));
  29371. + return _issue_deauth(padapter, da, reason, _FALSE);
  29372. +}
  29373. +
  29374. +int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt,
  29375. + int wait_ms)
  29376. +{
  29377. + int ret;
  29378. + int i = 0;
  29379. + u32 start = rtw_get_current_time();
  29380. +
  29381. + do
  29382. + {
  29383. + ret = _issue_deauth(padapter, da, reason, wait_ms>0?_TRUE:_FALSE);
  29384. +
  29385. + i++;
  29386. +
  29387. + if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
  29388. + break;
  29389. +
  29390. + if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
  29391. + rtw_msleep_os(wait_ms);
  29392. +
  29393. + }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
  29394. +
  29395. + if (ret != _FAIL) {
  29396. + ret = _SUCCESS;
  29397. + #ifndef DBG_XMIT_ACK
  29398. + goto exit;
  29399. + #endif
  29400. + }
  29401. +
  29402. + if (try_cnt && wait_ms) {
  29403. + if (da)
  29404. + DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  29405. + FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),
  29406. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29407. + else
  29408. + DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  29409. + FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),
  29410. + ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
  29411. + }
  29412. +exit:
  29413. + return ret;
  29414. +}
  29415. +
  29416. +void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset)
  29417. +{
  29418. + _irqL irqL;
  29419. + _list *plist, *phead;
  29420. + struct xmit_frame *pmgntframe;
  29421. + struct pkt_attrib *pattrib;
  29422. + unsigned char *pframe;
  29423. + struct rtw_ieee80211_hdr *pwlanhdr;
  29424. + unsigned short *fctrl;
  29425. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29426. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  29427. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29428. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29429. +
  29430. +
  29431. + DBG_871X(FUNC_NDEV_FMT" ra="MAC_FMT", ch:%u, offset:%u\n",
  29432. + FUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(ra), new_ch, ch_offset);
  29433. +
  29434. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29435. + return;
  29436. +
  29437. + //update attribute
  29438. + pattrib = &pmgntframe->attrib;
  29439. + update_mgntframe_attrib(padapter, pattrib);
  29440. +
  29441. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29442. +
  29443. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29444. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29445. +
  29446. + fctrl = &(pwlanhdr->frame_ctl);
  29447. + *(fctrl) = 0;
  29448. +
  29449. + _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN); /* RA */
  29450. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); /* TA */
  29451. + _rtw_memcpy(pwlanhdr->addr3, ra, ETH_ALEN); /* DA = RA */
  29452. +
  29453. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29454. + pmlmeext->mgnt_seq++;
  29455. + SetFrameSubType(pframe, WIFI_ACTION);
  29456. +
  29457. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29458. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29459. +
  29460. + /* category, action */
  29461. + {
  29462. + u8 category, action;
  29463. + category = RTW_WLAN_CATEGORY_SPECTRUM_MGMT;
  29464. + action = RTW_WLAN_ACTION_SPCT_CHL_SWITCH;
  29465. +
  29466. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  29467. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  29468. + }
  29469. +
  29470. + pframe = rtw_set_ie_ch_switch(pframe, &(pattrib->pktlen), 0, new_ch, 0);
  29471. + pframe = rtw_set_ie_secondary_ch_offset(pframe, &(pattrib->pktlen),
  29472. + hal_ch_offset_to_secondary_ch_offset(ch_offset));
  29473. +
  29474. + pattrib->last_txcmdsz = pattrib->pktlen;
  29475. +
  29476. + dump_mgntframe(padapter, pmgntframe);
  29477. +
  29478. +}
  29479. +
  29480. +#ifdef CONFIG_IEEE80211W
  29481. +void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid)
  29482. +{
  29483. + u8 category = RTW_WLAN_CATEGORY_SA_QUERY;
  29484. + u16 reason_code;
  29485. + struct xmit_frame *pmgntframe;
  29486. + struct pkt_attrib *pattrib;
  29487. + u8 *pframe;
  29488. + struct rtw_ieee80211_hdr *pwlanhdr;
  29489. + u16 *fctrl;
  29490. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29491. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29492. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29493. + struct sta_info *psta;
  29494. + struct sta_priv *pstapriv = &padapter->stapriv;
  29495. + struct registry_priv *pregpriv = &padapter->registrypriv;
  29496. +
  29497. +
  29498. + DBG_871X("%s\n", __FUNCTION__);
  29499. +
  29500. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29501. + {
  29502. + DBG_871X("%s: alloc_mgtxmitframe fail\n", __FUNCTION__);
  29503. + return;
  29504. + }
  29505. +
  29506. + //update attribute
  29507. + pattrib = &pmgntframe->attrib;
  29508. + update_mgntframe_attrib(padapter, pattrib);
  29509. +
  29510. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29511. +
  29512. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29513. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29514. +
  29515. + fctrl = &(pwlanhdr->frame_ctl);
  29516. + *(fctrl) = 0;
  29517. +
  29518. + if(raddr)
  29519. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  29520. + else
  29521. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29522. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29523. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29524. +
  29525. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29526. + pmlmeext->mgnt_seq++;
  29527. + SetFrameSubType(pframe, WIFI_ACTION);
  29528. +
  29529. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29530. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29531. +
  29532. + pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);
  29533. + pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen);
  29534. +
  29535. + switch (action)
  29536. + {
  29537. + case 0: //SA Query req
  29538. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeext->sa_query_seq, &pattrib->pktlen);
  29539. + pmlmeext->sa_query_seq++;
  29540. + //send sa query request to AP, AP should reply sa query response in 1 second
  29541. + set_sa_query_timer(pmlmeext, 1000);
  29542. + break;
  29543. +
  29544. + case 1: //SA Query rsp
  29545. + tid = cpu_to_le16(tid);
  29546. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&tid, &pattrib->pktlen);
  29547. + break;
  29548. + default:
  29549. + break;
  29550. + }
  29551. +
  29552. + pattrib->last_txcmdsz = pattrib->pktlen;
  29553. +
  29554. + dump_mgntframe(padapter, pmgntframe);
  29555. +}
  29556. +#endif //CONFIG_IEEE80211W
  29557. +
  29558. +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status)
  29559. +{
  29560. + u8 category = RTW_WLAN_CATEGORY_BACK;
  29561. + u16 start_seq;
  29562. + u16 BA_para_set;
  29563. + u16 reason_code;
  29564. + u16 BA_timeout_value;
  29565. + u16 BA_starting_seqctrl;
  29566. + struct xmit_frame *pmgntframe;
  29567. + struct pkt_attrib *pattrib;
  29568. + u8 *pframe;
  29569. + struct rtw_ieee80211_hdr *pwlanhdr;
  29570. + u16 *fctrl;
  29571. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29572. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29573. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29574. + struct sta_info *psta;
  29575. + struct sta_priv *pstapriv = &padapter->stapriv;
  29576. + struct registry_priv *pregpriv = &padapter->registrypriv;
  29577. +
  29578. +
  29579. + DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status);
  29580. +
  29581. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29582. + {
  29583. + return;
  29584. + }
  29585. +
  29586. + //update attribute
  29587. + pattrib = &pmgntframe->attrib;
  29588. + update_mgntframe_attrib(padapter, pattrib);
  29589. +
  29590. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29591. +
  29592. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29593. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29594. +
  29595. + fctrl = &(pwlanhdr->frame_ctl);
  29596. + *(fctrl) = 0;
  29597. +
  29598. + //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29599. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  29600. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29601. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29602. +
  29603. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29604. + pmlmeext->mgnt_seq++;
  29605. + SetFrameSubType(pframe, WIFI_ACTION);
  29606. +
  29607. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29608. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29609. +
  29610. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  29611. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  29612. +
  29613. + status = cpu_to_le16(status);
  29614. +
  29615. +
  29616. + if (category == 3)
  29617. + {
  29618. + switch (action)
  29619. + {
  29620. + case 0: //ADDBA req
  29621. + do {
  29622. + pmlmeinfo->dialogToken++;
  29623. + } while (pmlmeinfo->dialogToken == 0);
  29624. + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen));
  29625. +
  29626. + BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size
  29627. + //sys_mib.BA_para_set = 0x0802; //immediate ack & 32 buffer size
  29628. + BA_para_set = cpu_to_le16(BA_para_set);
  29629. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
  29630. +
  29631. + //BA_timeout_value = 0xffff;//max: 65535 TUs(~ 65 ms)
  29632. + BA_timeout_value = 5000;//~ 5ms
  29633. + BA_timeout_value = cpu_to_le16(BA_timeout_value);
  29634. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen));
  29635. +
  29636. + //if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)
  29637. + if ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL)
  29638. + {
  29639. + start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1;
  29640. +
  29641. + DBG_871X("BA_starting_seqctrl = %d for TID=%d\n", start_seq, status & 0x07);
  29642. +
  29643. + psta->BA_starting_seqctrl[status & 0x07] = start_seq;
  29644. +
  29645. + BA_starting_seqctrl = start_seq << 4;
  29646. + }
  29647. +
  29648. + BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl);
  29649. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen));
  29650. + break;
  29651. +
  29652. + case 1: //ADDBA rsp
  29653. + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen));
  29654. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen));
  29655. +
  29656. + //BA_para_set = cpu_to_le16((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
  29657. + BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
  29658. +
  29659. + if(pregpriv->ampdu_amsdu==0)//disabled
  29660. + BA_para_set = cpu_to_le16(BA_para_set & ~BIT(0));
  29661. + else if(pregpriv->ampdu_amsdu==1)//enabled
  29662. + BA_para_set = cpu_to_le16(BA_para_set | BIT(0));
  29663. + else //auto
  29664. + BA_para_set = cpu_to_le16(BA_para_set);
  29665. +
  29666. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
  29667. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen));
  29668. + break;
  29669. + case 2://DELBA
  29670. + BA_para_set = (status & 0x1F) << 3;
  29671. + BA_para_set = cpu_to_le16(BA_para_set);
  29672. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
  29673. +
  29674. + reason_code = 37;//Requested from peer STA as it does not want to use the mechanism
  29675. + reason_code = cpu_to_le16(reason_code);
  29676. + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(reason_code)), &(pattrib->pktlen));
  29677. + break;
  29678. + default:
  29679. + break;
  29680. + }
  29681. + }
  29682. +
  29683. + pattrib->last_txcmdsz = pattrib->pktlen;
  29684. +
  29685. + dump_mgntframe(padapter, pmgntframe);
  29686. +}
  29687. +
  29688. +static void issue_action_BSSCoexistPacket(_adapter *padapter)
  29689. +{
  29690. + _irqL irqL;
  29691. + _list *plist, *phead;
  29692. + unsigned char category, action;
  29693. + struct xmit_frame *pmgntframe;
  29694. + struct pkt_attrib *pattrib;
  29695. + unsigned char *pframe;
  29696. + struct rtw_ieee80211_hdr *pwlanhdr;
  29697. + unsigned short *fctrl;
  29698. + struct wlan_network *pnetwork = NULL;
  29699. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  29700. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  29701. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29702. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29703. + _queue *queue = &(pmlmepriv->scanned_queue);
  29704. + u8 InfoContent[16] = {0};
  29705. + u8 ICS[8][15];
  29706. +
  29707. + if((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0))
  29708. + return;
  29709. +
  29710. + if(_TRUE == pmlmeinfo->bwmode_updated)
  29711. + return;
  29712. +
  29713. +
  29714. + DBG_871X("%s\n", __FUNCTION__);
  29715. +
  29716. +
  29717. + category = RTW_WLAN_CATEGORY_PUBLIC;
  29718. + action = ACT_PUBLIC_BSSCOEXIST;
  29719. +
  29720. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  29721. + {
  29722. + return;
  29723. + }
  29724. +
  29725. + //update attribute
  29726. + pattrib = &pmgntframe->attrib;
  29727. + update_mgntframe_attrib(padapter, pattrib);
  29728. +
  29729. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  29730. +
  29731. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  29732. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  29733. +
  29734. + fctrl = &(pwlanhdr->frame_ctl);
  29735. + *(fctrl) = 0;
  29736. +
  29737. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29738. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  29739. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  29740. +
  29741. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  29742. + pmlmeext->mgnt_seq++;
  29743. + SetFrameSubType(pframe, WIFI_ACTION);
  29744. +
  29745. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  29746. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  29747. +
  29748. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  29749. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  29750. +
  29751. +
  29752. + //
  29753. + if(pmlmepriv->num_FortyMHzIntolerant>0)
  29754. + {
  29755. + u8 iedata=0;
  29756. +
  29757. + iedata |= BIT(2);//20 MHz BSS Width Request
  29758. +
  29759. + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));
  29760. +
  29761. + }
  29762. +
  29763. +
  29764. + //
  29765. + _rtw_memset(ICS, 0, sizeof(ICS));
  29766. + if(pmlmepriv->num_sta_no_ht>0)
  29767. + {
  29768. + int i;
  29769. +
  29770. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  29771. +
  29772. + phead = get_list_head(queue);
  29773. + plist = get_next(phead);
  29774. +
  29775. + while(1)
  29776. + {
  29777. + int len;
  29778. + u8 *p;
  29779. + WLAN_BSSID_EX *pbss_network;
  29780. +
  29781. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  29782. + break;
  29783. +
  29784. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  29785. +
  29786. + plist = get_next(plist);
  29787. +
  29788. + pbss_network = (WLAN_BSSID_EX *)&pnetwork->network;
  29789. +
  29790. + p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_);
  29791. + if((p==NULL) || (len==0))//non-HT
  29792. + {
  29793. + if((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14))
  29794. + continue;
  29795. +
  29796. + ICS[0][pbss_network->Configuration.DSConfig]=1;
  29797. +
  29798. + if(ICS[0][0] == 0)
  29799. + ICS[0][0] = 1;
  29800. + }
  29801. +
  29802. + }
  29803. +
  29804. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  29805. +
  29806. +
  29807. + for(i= 0;i<8;i++)
  29808. + {
  29809. + if(ICS[i][0] == 1)
  29810. + {
  29811. + int j, k = 0;
  29812. +
  29813. + InfoContent[k] = i;
  29814. + //SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i);
  29815. + k++;
  29816. +
  29817. + for(j=1;j<=14;j++)
  29818. + {
  29819. + if(ICS[i][j]==1)
  29820. + {
  29821. + if(k<16)
  29822. + {
  29823. + InfoContent[k] = j; //channel number
  29824. + //SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j);
  29825. + k++;
  29826. + }
  29827. + }
  29828. + }
  29829. +
  29830. + pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen));
  29831. +
  29832. + }
  29833. +
  29834. + }
  29835. +
  29836. +
  29837. + }
  29838. +
  29839. +
  29840. + pattrib->last_txcmdsz = pattrib->pktlen;
  29841. +
  29842. + dump_mgntframe(padapter, pmgntframe);
  29843. +
  29844. +}
  29845. +
  29846. +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr)
  29847. +{
  29848. + struct sta_priv *pstapriv = &padapter->stapriv;
  29849. + struct sta_info *psta = NULL;
  29850. + //struct recv_reorder_ctrl *preorder_ctrl;
  29851. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  29852. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29853. + u16 tid;
  29854. +
  29855. + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
  29856. + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
  29857. + return _SUCCESS;
  29858. +
  29859. + psta = rtw_get_stainfo(pstapriv, addr);
  29860. + if(psta==NULL)
  29861. + return _SUCCESS;
  29862. +
  29863. + //DBG_871X("%s:%s\n", __FUNCTION__, (initiator==0)?"RX_DIR":"TX_DIR");
  29864. +
  29865. + if(initiator==0) // recipient
  29866. + {
  29867. + for(tid = 0;tid<MAXTID;tid++)
  29868. + {
  29869. + if(psta->recvreorder_ctrl[tid].enable == _TRUE)
  29870. + {
  29871. + DBG_871X("rx agg disable tid(%d)\n",tid);
  29872. + issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F));
  29873. + psta->recvreorder_ctrl[tid].enable = _FALSE;
  29874. + psta->recvreorder_ctrl[tid].indicate_seq = 0xffff;
  29875. + #ifdef DBG_RX_SEQ
  29876. + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__,
  29877. + psta->recvreorder_ctrl[tid].indicate_seq);
  29878. + #endif
  29879. + }
  29880. + }
  29881. + }
  29882. + else if(initiator == 1)// originator
  29883. + {
  29884. + //DBG_871X("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap);
  29885. + for(tid = 0;tid<MAXTID;tid++)
  29886. + {
  29887. + if(psta->htpriv.agg_enable_bitmap & BIT(tid))
  29888. + {
  29889. + DBG_871X("tx agg disable tid(%d)\n",tid);
  29890. + issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F) );
  29891. + psta->htpriv.agg_enable_bitmap &= ~BIT(tid);
  29892. + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid);
  29893. +
  29894. + }
  29895. + }
  29896. + }
  29897. +
  29898. + return _SUCCESS;
  29899. +
  29900. +}
  29901. +
  29902. +unsigned int send_beacon(_adapter *padapter)
  29903. +{
  29904. + u8 bxmitok = _FALSE;
  29905. + int issue=0;
  29906. + int poll = 0;
  29907. +//#ifdef CONFIG_CONCURRENT_MODE
  29908. + //struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  29909. + //struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29910. + //_adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  29911. + //struct mlme_priv *pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  29912. +//#endif
  29913. +
  29914. +#ifdef CONFIG_PCI_HCI
  29915. +
  29916. + //DBG_871X("%s\n", __FUNCTION__);
  29917. +
  29918. + issue_beacon(padapter);
  29919. +
  29920. + return _SUCCESS;
  29921. +
  29922. +#endif
  29923. +
  29924. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  29925. + u32 start = rtw_get_current_time();
  29926. +
  29927. + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);
  29928. + do{
  29929. + issue_beacon(padapter);
  29930. + issue++;
  29931. + do {
  29932. + rtw_yield_os();
  29933. + rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok));
  29934. + poll++;
  29935. + }while((poll%10)!=0 && _FALSE == bxmitok && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
  29936. +
  29937. + }while(_FALSE == bxmitok && issue<100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
  29938. +
  29939. + if(padapter->bSurpriseRemoved || padapter->bDriverStopped)
  29940. + {
  29941. + return _FAIL;
  29942. + }
  29943. + if(_FALSE == bxmitok)
  29944. + {
  29945. + DBG_871X("%s fail! %u ms\n", __FUNCTION__, rtw_get_passing_time_ms(start));
  29946. + return _FAIL;
  29947. + }
  29948. + else
  29949. + {
  29950. + u32 passing_time = rtw_get_passing_time_ms(start);
  29951. +
  29952. + if(passing_time > 100 || issue > 3)
  29953. + DBG_871X("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start));
  29954. + //else
  29955. + // DBG_871X("%s success, issue:%d, poll:%d, %u ms\n", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start));
  29956. +
  29957. + return _SUCCESS;
  29958. + }
  29959. +
  29960. +#endif
  29961. +
  29962. +}
  29963. +
  29964. +/****************************************************************************
  29965. +
  29966. +Following are some utitity fuctions for WiFi MLME
  29967. +
  29968. +*****************************************************************************/
  29969. +
  29970. +BOOLEAN IsLegal5GChannel(
  29971. + IN PADAPTER Adapter,
  29972. + IN u8 channel)
  29973. +{
  29974. +
  29975. + int i=0;
  29976. + u8 Channel_5G[45] = {36,38,40,42,44,46,48,50,52,54,56,58,
  29977. + 60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,
  29978. + 124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,
  29979. + 161,163,165};
  29980. + for(i=0;i<sizeof(Channel_5G);i++)
  29981. + if(channel == Channel_5G[i])
  29982. + return _TRUE;
  29983. + return _FALSE;
  29984. +}
  29985. +
  29986. +void site_survey(_adapter *padapter)
  29987. +{
  29988. + unsigned char survey_channel = 0, val8;
  29989. + RT_SCAN_TYPE ScanType = SCAN_PASSIVE;
  29990. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  29991. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  29992. + u32 initialgain = 0;
  29993. + u8 restore_initial_gain = 1;
  29994. +
  29995. +#ifdef CONFIG_P2P
  29996. +
  29997. +#ifdef CONFIG_CONCURRENT_MODE
  29998. +
  29999. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30000. + u8 stay_buddy_ch = 0;
  30001. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30002. +
  30003. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  30004. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  30005. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  30006. +
  30007. +#endif //CONFIG_CONCURRENT_MODE
  30008. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  30009. + static unsigned char prev_survey_channel = 0;
  30010. + static unsigned int p2p_scan_count = 0;
  30011. +
  30012. +
  30013. + if ( ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) || ( pwdinfo->p2p_info.scan_op_ch_only ) )
  30014. + {
  30015. + if ( pwdinfo->rx_invitereq_info.scan_op_ch_only )
  30016. + {
  30017. + survey_channel = pwdinfo->rx_invitereq_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
  30018. + }
  30019. + else
  30020. + {
  30021. + survey_channel = pwdinfo->p2p_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
  30022. + }
  30023. + ScanType = SCAN_ACTIVE;
  30024. + }
  30025. + else if(rtw_p2p_findphase_ex_is_social(pwdinfo))
  30026. + {
  30027. + // Commented by Albert 2011/06/03
  30028. + // The driver is in the find phase, it should go through the social channel.
  30029. + int ch_set_idx;
  30030. + survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx];
  30031. + ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, survey_channel);
  30032. + if (ch_set_idx >= 0)
  30033. + ScanType = pmlmeext->channel_set[ch_set_idx].ScanType;
  30034. + else
  30035. + ScanType = SCAN_ACTIVE;
  30036. + }
  30037. + else
  30038. +#endif //CONFIG_P2P
  30039. + {
  30040. + struct rtw_ieee80211_channel *ch;
  30041. + if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
  30042. + ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
  30043. + survey_channel = ch->hw_value;
  30044. + ScanType = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE;
  30045. + }
  30046. + }
  30047. +
  30048. + if (0)
  30049. + DBG_871X(FUNC_ADPT_FMT" ch:%u(cnt:%u,idx:%d) at %dms, %c%c%c\n"
  30050. + , FUNC_ADPT_ARG(padapter)
  30051. + , survey_channel
  30052. + , pwdinfo->find_phase_state_exchange_cnt, pmlmeext->sitesurvey_res.channel_idx
  30053. + , rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time)
  30054. + , ScanType?'A':'P', pmlmeext->sitesurvey_res.scan_mode?'A':'P'
  30055. + , pmlmeext->sitesurvey_res.ssid[0].SsidLength?'S':' '
  30056. + );
  30057. +
  30058. + if(survey_channel != 0)
  30059. + {
  30060. + //PAUSE 4-AC Queue when site_survey
  30061. + //rtw_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8));
  30062. + //val8 |= 0x0f;
  30063. + //rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8));
  30064. +#ifdef CONFIG_CONCURRENT_MODE
  30065. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30066. + if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)
  30067. + {
  30068. + if( pmlmeinfo->scan_cnt == RTW_SCAN_NUM_OF_CH )
  30069. + {
  30070. + pmlmeinfo->scan_cnt = 0;
  30071. + survey_channel = pbuddy_mlmeext->cur_channel;
  30072. + stay_buddy_ch = 1;
  30073. + }
  30074. + else
  30075. + {
  30076. + if( pmlmeinfo->scan_cnt == 0 )
  30077. + stay_buddy_ch = 2;
  30078. + pmlmeinfo->scan_cnt++;
  30079. + }
  30080. + }
  30081. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30082. +#endif //CONFIG_CONCURRENT_MODE
  30083. + if(pmlmeext->sitesurvey_res.channel_idx == 0)
  30084. + {
  30085. + set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  30086. + }
  30087. + else
  30088. + {
  30089. + SelectChannel(padapter, survey_channel);
  30090. + }
  30091. +
  30092. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30093. + if( stay_buddy_ch == 1 )
  30094. + {
  30095. + val8 = 0; //survey done
  30096. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  30097. +
  30098. + if(check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&
  30099. + check_buddy_fwstate(padapter, _FW_LINKED))
  30100. + {
  30101. + update_beacon(padapter->pbuddy_adapter, 0, NULL, _TRUE);
  30102. + }
  30103. + }
  30104. + else if( stay_buddy_ch == 2 )
  30105. + {
  30106. + val8 = 1; //under site survey
  30107. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  30108. + }
  30109. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30110. +
  30111. + if(ScanType == SCAN_ACTIVE) //obey the channel plan setting...
  30112. + {
  30113. + #ifdef CONFIG_P2P
  30114. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) ||
  30115. + rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)
  30116. + )
  30117. + {
  30118. + issue_probereq_p2p(padapter, NULL);
  30119. + issue_probereq_p2p(padapter, NULL);
  30120. + issue_probereq_p2p(padapter, NULL);
  30121. + }
  30122. + else
  30123. + #endif //CONFIG_P2P
  30124. + {
  30125. + int i;
  30126. + for(i=0;i<RTW_SSID_SCAN_AMOUNT;i++){
  30127. + if(pmlmeext->sitesurvey_res.ssid[i].SsidLength) {
  30128. + //todo: to issue two probe req???
  30129. + issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
  30130. + //rtw_msleep_os(SURVEY_TO>>1);
  30131. + issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
  30132. + } else {
  30133. + break;
  30134. + }
  30135. + }
  30136. +
  30137. + if(pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
  30138. + //todo: to issue two probe req???
  30139. + issue_probereq(padapter, NULL, NULL);
  30140. + //rtw_msleep_os(SURVEY_TO>>1);
  30141. + issue_probereq(padapter, NULL, NULL);
  30142. + }
  30143. + }
  30144. + }
  30145. +
  30146. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30147. + if( stay_buddy_ch == 1 )
  30148. + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
  30149. + else
  30150. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30151. + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
  30152. +
  30153. + }
  30154. + else
  30155. + {
  30156. +
  30157. + // channel number is 0 or this channel is not valid.
  30158. +
  30159. +#ifdef CONFIG_CONCURRENT_MODE
  30160. + u8 cur_channel;
  30161. + u8 cur_bwmode;
  30162. + u8 cur_ch_offset;
  30163. +
  30164. + if (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0)
  30165. + {
  30166. + if (0)
  30167. + DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
  30168. + FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);
  30169. + }
  30170. + #ifdef CONFIG_IOCTL_CFG80211
  30171. + else if(padapter->pbuddy_adapter
  30172. + && pbuddy_adapter->wdinfo.driver_interface == DRIVER_CFG80211
  30173. + && wdev_to_priv(pbuddy_adapter->rtw_wdev)->p2p_enabled
  30174. + && rtw_p2p_chk_state(&pbuddy_adapter->wdinfo, P2P_STATE_LISTEN)
  30175. + )
  30176. + {
  30177. + cur_channel = pbuddy_adapter->wdinfo.listen_channel;
  30178. + cur_bwmode = pbuddy_mlmeext->cur_bwmode;
  30179. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  30180. + }
  30181. + #endif
  30182. + else
  30183. + {
  30184. + cur_channel = pmlmeext->cur_channel;
  30185. + cur_bwmode = pmlmeext->cur_bwmode;
  30186. + cur_ch_offset = pmlmeext->cur_ch_offset;
  30187. + }
  30188. +#endif
  30189. +
  30190. +
  30191. +#ifdef CONFIG_P2P
  30192. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
  30193. + {
  30194. + if( ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) || ( pwdinfo->p2p_info.scan_op_ch_only ) )
  30195. + {
  30196. + // Set the find_phase_state_exchange_cnt to P2P_FINDPHASE_EX_CNT.
  30197. + // This will let the following flow to run the scanning end.
  30198. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
  30199. + }
  30200. + #ifdef CONFIG_DBG_P2P
  30201. + DBG_871X( "[%s] find phase exchange cnt = %d\n", __FUNCTION__, pwdinfo->find_phase_state_exchange_cnt );
  30202. + #endif
  30203. + }
  30204. +
  30205. + if(rtw_p2p_findphase_ex_is_needed(pwdinfo))
  30206. + {
  30207. + // Set the P2P State to the listen state of find phase and set the current channel to the listen channel
  30208. + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  30209. + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);
  30210. + pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
  30211. +
  30212. + //turn on dynamic functions
  30213. + Restore_DM_Func_Flag(padapter);
  30214. + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
  30215. +
  30216. + _set_timer( &pwdinfo->find_phase_timer, ( u32 ) ( ( u32 ) ( pwdinfo->listen_dwell ) * 100 ) );
  30217. + }
  30218. + else
  30219. +#endif //CONFIG_P2P
  30220. + {
  30221. +
  30222. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  30223. + pmlmeinfo->scan_cnt = 0;
  30224. +#endif //CONFIG_DMP_STA_NODE_SCAN_UNDER_AP_MODE
  30225. +
  30226. +#ifdef CONFIG_ANTENNA_DIVERSITY
  30227. + // 20100721:Interrupt scan operation here.
  30228. + // For SW antenna diversity before link, it needs to switch to another antenna and scan again.
  30229. + // It compares the scan result and select beter one to do connection.
  30230. + if(rtw_hal_antdiv_before_linked(padapter))
  30231. + {
  30232. + pmlmeext->sitesurvey_res.bss_cnt = 0;
  30233. + pmlmeext->sitesurvey_res.channel_idx = -1;
  30234. + pmlmeext->chan_scan_time = SURVEY_TO /2;
  30235. + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
  30236. + return;
  30237. + }
  30238. +#endif
  30239. +
  30240. +#ifdef CONFIG_P2P
  30241. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
  30242. + {
  30243. + #ifdef CONFIG_CONCURRENT_MODE
  30244. + if( pwdinfo->driver_interface == DRIVER_WEXT )
  30245. + {
  30246. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  30247. + {
  30248. + _set_timer( &pwdinfo->ap_p2p_switch_timer, 500 );
  30249. + }
  30250. + }
  30251. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  30252. + #else
  30253. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  30254. + #endif
  30255. + }
  30256. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
  30257. +#endif //CONFIG_P2P
  30258. +
  30259. + pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
  30260. +
  30261. + //switch back to the original channel
  30262. + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);
  30263. +
  30264. + {
  30265. +#ifdef CONFIG_CONCURRENT_MODE
  30266. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  30267. +#else
  30268. +#ifdef CONFIG_DUALMAC_CONCURRENT
  30269. + dc_set_channel_bwmode_survey_done(padapter);
  30270. +#else
  30271. + if( pwdinfo->driver_interface == DRIVER_WEXT )
  30272. + {
  30273. + if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) )
  30274. + {
  30275. + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  30276. + }
  30277. + else
  30278. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  30279. + }
  30280. + else if( pwdinfo->driver_interface == DRIVER_CFG80211 )
  30281. + {
  30282. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  30283. + }
  30284. +#endif //CONFIG_DUALMAC_CONCURRENT
  30285. +#endif //CONFIG_CONCURRENT_MODE
  30286. + }
  30287. +
  30288. + //flush 4-AC Queue after site_survey
  30289. + //val8 = 0;
  30290. + //rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8));
  30291. +
  30292. + val8 = 0; //survey done
  30293. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  30294. +
  30295. + //config MSR
  30296. + Set_MSR(padapter, (pmlmeinfo->state & 0x3));
  30297. +
  30298. +
  30299. +#ifdef CONFIG_IOCTL_CFG80211
  30300. + if((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == _TRUE)
  30301. + {
  30302. + restore_initial_gain = 0;
  30303. + }
  30304. +#endif //CONFIG_IOCTL_CFG80211
  30305. +
  30306. + if(restore_initial_gain == 1)
  30307. + {
  30308. + initialgain = 0xff; //restore RX GAIN
  30309. + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  30310. + }
  30311. +
  30312. + //turn on dynamic functions
  30313. + Restore_DM_Func_Flag(padapter);
  30314. + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
  30315. +
  30316. + if (is_client_associated_to_ap(padapter) == _TRUE)
  30317. + {
  30318. + issue_nulldata(padapter, NULL, 0, 3, 500);
  30319. +
  30320. +#ifdef CONFIG_CONCURRENT_MODE
  30321. + if(is_client_associated_to_ap(padapter->pbuddy_adapter) == _TRUE)
  30322. + {
  30323. + DBG_871X("adapter is surveydone(buddy_adapter is linked), issue nulldata(pwrbit=0)\n");
  30324. +
  30325. + issue_nulldata(padapter->pbuddy_adapter, NULL, 0, 3, 500);
  30326. + }
  30327. +#endif
  30328. + }
  30329. +#ifdef CONFIG_CONCURRENT_MODE
  30330. + else if(is_client_associated_to_ap(padapter->pbuddy_adapter) == _TRUE)
  30331. + {
  30332. + issue_nulldata(padapter->pbuddy_adapter, NULL, 0, 3, 500);
  30333. + }
  30334. +#endif
  30335. +
  30336. + report_surveydone_event(padapter);
  30337. +
  30338. + pmlmeext->chan_scan_time = SURVEY_TO;
  30339. + pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
  30340. +
  30341. + issue_action_BSSCoexistPacket(padapter);
  30342. + issue_action_BSSCoexistPacket(padapter);
  30343. + issue_action_BSSCoexistPacket(padapter);
  30344. +
  30345. + }
  30346. +
  30347. +#ifdef CONFIG_CONCURRENT_MODE
  30348. + if(check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&
  30349. + check_buddy_fwstate(padapter, _FW_LINKED))
  30350. + {
  30351. +
  30352. + DBG_871X("survey done, current CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  30353. +
  30354. + DBG_871X("restart pbuddy_adapter's beacon\n");
  30355. +
  30356. + update_beacon(padapter->pbuddy_adapter, 0, NULL, _TRUE);
  30357. + }
  30358. +#endif
  30359. +
  30360. + }
  30361. +
  30362. + return;
  30363. +
  30364. +}
  30365. +
  30366. +//collect bss info from Beacon and Probe response frames.
  30367. +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid)
  30368. +{
  30369. + int i;
  30370. + u32 len;
  30371. + u8 *p;
  30372. + u16 val16, subtype;
  30373. + u8 *pframe = precv_frame->u.hdr.rx_data;
  30374. + u32 packet_len = precv_frame->u.hdr.len;
  30375. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  30376. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30377. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30378. +
  30379. + len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr);
  30380. +
  30381. + if (len > MAX_IE_SZ)
  30382. + {
  30383. + //DBG_871X("IE too long for survey event\n");
  30384. + return _FAIL;
  30385. + }
  30386. +
  30387. + _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX));
  30388. +
  30389. + subtype = GetFrameSubType(pframe);
  30390. +
  30391. + if(subtype==WIFI_BEACON)
  30392. + bssid->Reserved[0] = 1;
  30393. + else
  30394. + bssid->Reserved[0] = 0;
  30395. +
  30396. + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len;
  30397. +
  30398. + //below is to copy the information element
  30399. + bssid->IELength = len;
  30400. + _rtw_memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength);
  30401. +
  30402. + //get the signal strength
  30403. + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage
  30404. + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage
  30405. + bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data
  30406. +
  30407. +#ifdef CONFIG_ANTENNA_DIVERSITY
  30408. + //rtw_hal_get_hwreg(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna));
  30409. + rtw_hal_get_def_var(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna);
  30410. +#endif
  30411. +
  30412. + // checking SSID
  30413. + if ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL)
  30414. + {
  30415. + DBG_871X("marc: cannot find SSID for survey event\n");
  30416. + return _FAIL;
  30417. + }
  30418. +
  30419. + if (*(p + 1))
  30420. + {
  30421. + if (len > NDIS_802_11_LENGTH_SSID)
  30422. + {
  30423. + DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len);
  30424. + return _FAIL;
  30425. + }
  30426. + _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1));
  30427. + bssid->Ssid.SsidLength = *(p + 1);
  30428. + }
  30429. + else
  30430. + {
  30431. + bssid->Ssid.SsidLength = 0;
  30432. + }
  30433. +
  30434. + _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);
  30435. +
  30436. + //checking rate info...
  30437. + i = 0;
  30438. + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30439. + if (p != NULL)
  30440. + {
  30441. + if (len > NDIS_802_11_LENGTH_RATES_EX)
  30442. + {
  30443. + DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len);
  30444. + return _FAIL;
  30445. + }
  30446. + _rtw_memcpy(bssid->SupportedRates, (p + 2), len);
  30447. + i = len;
  30448. + }
  30449. +
  30450. + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30451. + if (p != NULL)
  30452. + {
  30453. + if (len > (NDIS_802_11_LENGTH_RATES_EX-i))
  30454. + {
  30455. + DBG_871X("%s()-%d: IE too long (%d) for survey event\n", __FUNCTION__, __LINE__, len);
  30456. + return _FAIL;
  30457. + }
  30458. + _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len);
  30459. + }
  30460. +
  30461. + //todo:
  30462. +#if 0
  30463. + if (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B)
  30464. + {
  30465. + bssid->NetworkTypeInUse = Ndis802_11DS;
  30466. + }
  30467. + else
  30468. +#endif
  30469. + {
  30470. + bssid->NetworkTypeInUse = Ndis802_11OFDM24;
  30471. + }
  30472. +
  30473. + if (bssid->IELength < 12)
  30474. + return _FAIL;
  30475. +
  30476. + // Checking for DSConfig
  30477. + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30478. +
  30479. + bssid->Configuration.DSConfig = 0;
  30480. + bssid->Configuration.Length = 0;
  30481. +
  30482. + if (p)
  30483. + {
  30484. + bssid->Configuration.DSConfig = *(p + 2);
  30485. + }
  30486. + else
  30487. + {// In 5G, some ap do not have DSSET IE
  30488. + // checking HT info for channel
  30489. + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30490. + if(p)
  30491. + {
  30492. + struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2);
  30493. + bssid->Configuration.DSConfig = HT_info->primary_channel;
  30494. + }
  30495. + else
  30496. + { // use current channel
  30497. + bssid->Configuration.DSConfig = rtw_get_oper_ch(padapter);
  30498. + }
  30499. + }
  30500. +
  30501. + _rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2);
  30502. + bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod);
  30503. +
  30504. + val16 = rtw_get_capability((WLAN_BSSID_EX *)bssid);
  30505. +
  30506. + if (val16 & BIT(0))
  30507. + {
  30508. + bssid->InfrastructureMode = Ndis802_11Infrastructure;
  30509. + _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN);
  30510. + }
  30511. + else
  30512. + {
  30513. + bssid->InfrastructureMode = Ndis802_11IBSS;
  30514. + _rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN);
  30515. + }
  30516. +
  30517. + if (val16 & BIT(4))
  30518. + bssid->Privacy = 1;
  30519. + else
  30520. + bssid->Privacy = 0;
  30521. +
  30522. + bssid->Configuration.ATIMWindow = 0;
  30523. +
  30524. + //20/40 BSS Coexistence check
  30525. + if((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated))
  30526. + {
  30527. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  30528. +
  30529. + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30530. + if(p && len>0)
  30531. + {
  30532. + struct HT_caps_element *pHT_caps;
  30533. + pHT_caps = (struct HT_caps_element *)(p + 2);
  30534. +
  30535. + if(pHT_caps->u.HT_cap_element.HT_caps_info&BIT(14))
  30536. + {
  30537. + pmlmepriv->num_FortyMHzIntolerant++;
  30538. + }
  30539. + }
  30540. + else
  30541. + {
  30542. + pmlmepriv->num_sta_no_ht++;
  30543. + }
  30544. +
  30545. + }
  30546. +
  30547. +#ifdef CONFIG_INTEL_WIDI
  30548. + //process_intel_widi_query_or_tigger(padapter, bssid);
  30549. + if(process_intel_widi_query_or_tigger(padapter, bssid))
  30550. + {
  30551. + return _FAIL;
  30552. + }
  30553. +#endif // CONFIG_INTEL_WIDI
  30554. +
  30555. + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) & 1
  30556. + if(strcmp(bssid->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {
  30557. + DBG_871X("Receiving %s("MAC_FMT", DSConfig:%u) from ch%u with ss:%3u, sq:%3u, RawRSSI:%3ld\n"
  30558. + , bssid->Ssid.Ssid, MAC_ARG(bssid->MacAddress), bssid->Configuration.DSConfig
  30559. + , rtw_get_oper_ch(padapter)
  30560. + , bssid->PhyInfo.SignalStrength, bssid->PhyInfo.SignalQuality, bssid->Rssi
  30561. + );
  30562. + }
  30563. + #endif
  30564. +
  30565. + // mark bss info receving from nearby channel as SignalQuality 101
  30566. + if(bssid->Configuration.DSConfig != rtw_get_oper_ch(padapter))
  30567. + {
  30568. + bssid->PhyInfo.SignalQuality= 101;
  30569. + }
  30570. +
  30571. + return _SUCCESS;
  30572. +}
  30573. +
  30574. +void start_create_ibss(_adapter* padapter)
  30575. +{
  30576. + unsigned short caps;
  30577. + u8 val8;
  30578. + u8 join_type;
  30579. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30580. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30581. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  30582. + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig;
  30583. + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork);
  30584. +
  30585. + //update wireless mode
  30586. + update_wireless_mode(padapter);
  30587. +
  30588. + //udpate capability
  30589. + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork);
  30590. + update_capinfo(padapter, caps);
  30591. + if(caps&cap_IBSS)//adhoc master
  30592. + {
  30593. + //set_opmode_cmd(padapter, adhoc);//removed
  30594. +
  30595. + val8 = 0xcf;
  30596. + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  30597. +
  30598. + //switch channel
  30599. + //SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE);
  30600. + set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  30601. +
  30602. + beacon_timing_control(padapter);
  30603. +
  30604. + //set msr to WIFI_FW_ADHOC_STATE
  30605. + pmlmeinfo->state = WIFI_FW_ADHOC_STATE;
  30606. + Set_MSR(padapter, (pmlmeinfo->state & 0x3));
  30607. +
  30608. + //issue beacon
  30609. + if(send_beacon(padapter)==_FAIL)
  30610. + {
  30611. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing beacon frame fail....\n"));
  30612. +
  30613. + report_join_res(padapter, -1);
  30614. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  30615. + }
  30616. + else
  30617. + {
  30618. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);
  30619. + join_type = 0;
  30620. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  30621. +
  30622. + report_join_res(padapter, 1);
  30623. + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
  30624. + }
  30625. + }
  30626. + else
  30627. + {
  30628. + DBG_871X("start_create_ibss, invalid cap:%x\n", caps);
  30629. + return;
  30630. + }
  30631. +
  30632. +}
  30633. +
  30634. +void start_clnt_join(_adapter* padapter)
  30635. +{
  30636. + unsigned short caps;
  30637. + u8 val8;
  30638. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30639. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30640. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  30641. +
  30642. + //update wireless mode
  30643. + update_wireless_mode(padapter);
  30644. +
  30645. + //udpate capability
  30646. + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork);
  30647. + update_capinfo(padapter, caps);
  30648. + if (caps&cap_ESS)
  30649. + {
  30650. + Set_MSR(padapter, WIFI_FW_STATION_STATE);
  30651. +
  30652. + val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
  30653. + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  30654. +
  30655. + #ifdef CONFIG_DEAUTH_BEFORE_CONNECT
  30656. + // Because of AP's not receiving deauth before
  30657. + // AP may: 1)not response auth or 2)deauth us after link is complete
  30658. + // issue deauth before issuing auth to deal with the situation
  30659. +
  30660. + // Commented by Albert 2012/07/21
  30661. + // For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it.
  30662. + {
  30663. + #ifdef CONFIG_P2P
  30664. + _queue *queue = &(padapter->mlmepriv.scanned_queue);
  30665. + _list *head = get_list_head(queue);
  30666. + _list *pos = get_next(head);
  30667. + struct wlan_network *scanned = NULL;
  30668. + u8 ie_offset = 0;
  30669. + _irqL irqL;
  30670. + bool has_p2p_ie = _FALSE;
  30671. +
  30672. + _enter_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL);
  30673. +
  30674. + for (pos = get_next(head);!rtw_end_of_queue_search(head, pos); pos = get_next(pos)) {
  30675. +
  30676. + scanned = LIST_CONTAINOR(pos, struct wlan_network, list);
  30677. + if(scanned==NULL)
  30678. + rtw_warn_on(1);
  30679. +
  30680. + if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE
  30681. + && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE
  30682. + ) {
  30683. + ie_offset = (scanned->network.Reserved[0] == 2? 0:12);
  30684. + if (rtw_get_p2p_ie(scanned->network.IEs+ie_offset, scanned->network.IELength-ie_offset, NULL, NULL))
  30685. + has_p2p_ie = _TRUE;
  30686. + break;
  30687. + }
  30688. + }
  30689. +
  30690. + _exit_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL);
  30691. +
  30692. + if (scanned == NULL || rtw_end_of_queue_search(head, pos) || has_p2p_ie == _FALSE)
  30693. + #endif /* CONFIG_P2P */
  30694. + issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 5, 100);
  30695. + }
  30696. + #endif /* CONFIG_DEAUTH_BEFORE_CONNECT */
  30697. +
  30698. + //here wait for receiving the beacon to start auth
  30699. + //and enable a timer
  30700. + set_link_timer(pmlmeext, decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval));
  30701. +
  30702. + pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE;
  30703. + }
  30704. + else if (caps&cap_IBSS) //adhoc client
  30705. + {
  30706. + Set_MSR(padapter, WIFI_FW_ADHOC_STATE);
  30707. +
  30708. + val8 = 0xcf;
  30709. + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  30710. +
  30711. + //switch channel
  30712. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  30713. +
  30714. + beacon_timing_control(padapter);
  30715. +
  30716. + pmlmeinfo->state = WIFI_FW_ADHOC_STATE;
  30717. +
  30718. + report_join_res(padapter, 1);
  30719. + }
  30720. + else
  30721. + {
  30722. + //DBG_871X("marc: invalid cap:%x\n", caps);
  30723. + return;
  30724. + }
  30725. +
  30726. +}
  30727. +
  30728. +void start_clnt_auth(_adapter* padapter)
  30729. +{
  30730. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30731. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30732. +
  30733. + _cancel_timer_ex(&pmlmeext->link_timer);
  30734. +
  30735. + pmlmeinfo->state &= (~WIFI_FW_AUTH_NULL);
  30736. + pmlmeinfo->state |= WIFI_FW_AUTH_STATE;
  30737. +
  30738. + pmlmeinfo->auth_seq = 1;
  30739. + pmlmeinfo->reauth_count = 0;
  30740. + pmlmeinfo->reassoc_count = 0;
  30741. + pmlmeinfo->link_count = 0;
  30742. + pmlmeext->retry = 0;
  30743. +
  30744. +
  30745. + issue_auth(padapter, NULL, 0);
  30746. +
  30747. + set_link_timer(pmlmeext, REAUTH_TO);
  30748. +
  30749. +}
  30750. +
  30751. +
  30752. +void start_clnt_assoc(_adapter* padapter)
  30753. +{
  30754. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30755. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30756. +
  30757. + _cancel_timer_ex(&pmlmeext->link_timer);
  30758. +
  30759. + pmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE));
  30760. + pmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE);
  30761. +
  30762. + issue_assocreq(padapter);
  30763. +
  30764. + set_link_timer(pmlmeext, REASSOC_TO);
  30765. +}
  30766. +
  30767. +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason)
  30768. +{
  30769. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  30770. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  30771. +
  30772. + //check A3
  30773. + if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))
  30774. + return _SUCCESS;
  30775. +
  30776. + DBG_871X("%s\n", __FUNCTION__);
  30777. +
  30778. + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
  30779. + {
  30780. + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
  30781. + {
  30782. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  30783. + report_del_sta_event(padapter, MacAddr, reason);
  30784. +
  30785. + }
  30786. + else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE)
  30787. + {
  30788. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  30789. + report_join_res(padapter, -2);
  30790. + }
  30791. + }
  30792. +
  30793. + return _SUCCESS;
  30794. +}
  30795. +
  30796. +#ifdef CONFIG_80211D
  30797. +static void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid)
  30798. +{
  30799. + struct registry_priv *pregistrypriv;
  30800. + struct mlme_ext_priv *pmlmeext;
  30801. + RT_CHANNEL_INFO *chplan_new;
  30802. + u8 channel;
  30803. + u8 i;
  30804. +
  30805. +
  30806. + pregistrypriv = &padapter->registrypriv;
  30807. + pmlmeext = &padapter->mlmeextpriv;
  30808. +
  30809. + // Adjust channel plan by AP Country IE
  30810. + if (pregistrypriv->enable80211d &&
  30811. + (!pmlmeext->update_channel_plan_by_ap_done))
  30812. + {
  30813. + u8 *ie, *p;
  30814. + u32 len;
  30815. + RT_CHANNEL_PLAN chplan_ap;
  30816. + RT_CHANNEL_INFO chplan_sta[MAX_CHANNEL_NUM];
  30817. + u8 country[4];
  30818. + u8 fcn; // first channel number
  30819. + u8 noc; // number of channel
  30820. + u8 j, k;
  30821. +
  30822. + ie = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _COUNTRY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
  30823. + if (!ie) return;
  30824. + if (len < 6) return;
  30825. +
  30826. + ie += 2;
  30827. + p = ie;
  30828. + ie += len;
  30829. +
  30830. + _rtw_memset(country, 0, 4);
  30831. + _rtw_memcpy(country, p, 3);
  30832. + p += 3;
  30833. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
  30834. + ("%s: 802.11d country=%s\n", __FUNCTION__, country));
  30835. +
  30836. + i = 0;
  30837. + while ((ie - p) >= 3)
  30838. + {
  30839. + fcn = *(p++);
  30840. + noc = *(p++);
  30841. + p++;
  30842. +
  30843. + for (j = 0; j < noc; j++)
  30844. + {
  30845. + if (fcn <= 14) channel = fcn + j; // 2.4 GHz
  30846. + else channel = fcn + j*4; // 5 GHz
  30847. +
  30848. + chplan_ap.Channel[i++] = channel;
  30849. + }
  30850. + }
  30851. + chplan_ap.Len = i;
  30852. +
  30853. +#ifdef CONFIG_DEBUG_RTL871X
  30854. +#ifdef PLATFORM_LINUX
  30855. + i = 0;
  30856. + printk("%s: AP[%s] channel plan {", __func__, bssid->Ssid.Ssid);
  30857. + while ((i < chplan_ap.Len) && (chplan_ap.Channel[i] != 0))
  30858. + {
  30859. + printk("%02d,", chplan_ap.Channel[i]);
  30860. + i++;
  30861. + }
  30862. + printk("}\n");
  30863. +#endif
  30864. +#endif
  30865. +
  30866. + _rtw_memcpy(chplan_sta, pmlmeext->channel_set, sizeof(chplan_sta));
  30867. +#ifdef CONFIG_DEBUG_RTL871X
  30868. +#ifdef PLATFORM_LINUX
  30869. + i = 0;
  30870. + printk("%s: STA channel plan {", __func__);
  30871. + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))
  30872. + {
  30873. + printk("%02d(%c),", chplan_sta[i].ChannelNum, chplan_sta[i].ScanType==SCAN_PASSIVE?'p':'a');
  30874. + i++;
  30875. + }
  30876. + printk("}\n");
  30877. +#endif
  30878. +#endif
  30879. +
  30880. + _rtw_memset(pmlmeext->channel_set, 0, sizeof(pmlmeext->channel_set));
  30881. + chplan_new = pmlmeext->channel_set;
  30882. +
  30883. + i = j = k = 0;
  30884. + if (pregistrypriv->wireless_mode & WIRELESS_11G)
  30885. + {
  30886. + do {
  30887. + if ((i == MAX_CHANNEL_NUM) ||
  30888. + (chplan_sta[i].ChannelNum == 0) ||
  30889. + (chplan_sta[i].ChannelNum > 14))
  30890. + break;
  30891. +
  30892. + if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] > 14))
  30893. + break;
  30894. +
  30895. + if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j])
  30896. + {
  30897. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  30898. + chplan_new[k].ScanType = SCAN_ACTIVE;
  30899. + i++;
  30900. + j++;
  30901. + k++;
  30902. + }
  30903. + else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j])
  30904. + {
  30905. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  30906. +// chplan_new[k].ScanType = chplan_sta[i].ScanType;
  30907. + chplan_new[k].ScanType = SCAN_PASSIVE;
  30908. + i++;
  30909. + k++;
  30910. + }
  30911. + else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j])
  30912. + {
  30913. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  30914. + chplan_new[k].ScanType = SCAN_ACTIVE;
  30915. + j++;
  30916. + k++;
  30917. + }
  30918. + } while (1);
  30919. +
  30920. + // change AP not support channel to Passive scan
  30921. + while ((i < MAX_CHANNEL_NUM) &&
  30922. + (chplan_sta[i].ChannelNum != 0) &&
  30923. + (chplan_sta[i].ChannelNum <= 14))
  30924. + {
  30925. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  30926. +// chplan_new[k].ScanType = chplan_sta[i].ScanType;
  30927. + chplan_new[k].ScanType = SCAN_PASSIVE;
  30928. + i++;
  30929. + k++;
  30930. + }
  30931. +
  30932. + // add channel AP supported
  30933. + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14))
  30934. + {
  30935. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  30936. + chplan_new[k].ScanType = SCAN_ACTIVE;
  30937. + j++;
  30938. + k++;
  30939. + }
  30940. + }
  30941. + else
  30942. + {
  30943. + // keep original STA 2.4G channel plan
  30944. + while ((i < MAX_CHANNEL_NUM) &&
  30945. + (chplan_sta[i].ChannelNum != 0) &&
  30946. + (chplan_sta[i].ChannelNum <= 14))
  30947. + {
  30948. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  30949. + chplan_new[k].ScanType = chplan_sta[i].ScanType;
  30950. + i++;
  30951. + k++;
  30952. + }
  30953. +
  30954. + // skip AP 2.4G channel plan
  30955. + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14))
  30956. + {
  30957. + j++;
  30958. + }
  30959. + }
  30960. +
  30961. + if (pregistrypriv->wireless_mode & WIRELESS_11A)
  30962. + {
  30963. + do {
  30964. + if ((i == MAX_CHANNEL_NUM) ||
  30965. + (chplan_sta[i].ChannelNum == 0))
  30966. + break;
  30967. +
  30968. + if ((j == chplan_ap.Len) || (chplan_ap.Channel[j] == 0))
  30969. + break;
  30970. +
  30971. + if (chplan_sta[i].ChannelNum == chplan_ap.Channel[j])
  30972. + {
  30973. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  30974. + chplan_new[k].ScanType = SCAN_ACTIVE;
  30975. + i++;
  30976. + j++;
  30977. + k++;
  30978. + }
  30979. + else if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j])
  30980. + {
  30981. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  30982. +// chplan_new[k].ScanType = chplan_sta[i].ScanType;
  30983. + chplan_new[k].ScanType = SCAN_PASSIVE;
  30984. + i++;
  30985. + k++;
  30986. + }
  30987. + else if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j])
  30988. + {
  30989. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  30990. + chplan_new[k].ScanType = SCAN_ACTIVE;
  30991. + j++;
  30992. + k++;
  30993. + }
  30994. + } while (1);
  30995. +
  30996. + // change AP not support channel to Passive scan
  30997. + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))
  30998. + {
  30999. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  31000. +// chplan_new[k].ScanType = chplan_sta[i].ScanType;
  31001. + chplan_new[k].ScanType = SCAN_PASSIVE;
  31002. + i++;
  31003. + k++;
  31004. + }
  31005. +
  31006. + // add channel AP supported
  31007. + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] != 0))
  31008. + {
  31009. + chplan_new[k].ChannelNum = chplan_ap.Channel[j];
  31010. + chplan_new[k].ScanType = SCAN_ACTIVE;
  31011. + j++;
  31012. + k++;
  31013. + }
  31014. + }
  31015. + else
  31016. + {
  31017. + // keep original STA 5G channel plan
  31018. + while ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))
  31019. + {
  31020. + chplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;
  31021. + chplan_new[k].ScanType = chplan_sta[i].ScanType;
  31022. + i++;
  31023. + k++;
  31024. + }
  31025. + }
  31026. +
  31027. + pmlmeext->update_channel_plan_by_ap_done = 1;
  31028. +
  31029. +#ifdef CONFIG_DEBUG_RTL871X
  31030. +#ifdef PLATFORM_LINUX
  31031. + k = 0;
  31032. + printk("%s: new STA channel plan {", __func__);
  31033. + while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0))
  31034. + {
  31035. + printk("%02d(%c),", chplan_new[k].ChannelNum, chplan_new[k].ScanType==SCAN_PASSIVE?'p':'c');
  31036. + k++;
  31037. + }
  31038. + printk("}\n");
  31039. +#endif
  31040. +#endif
  31041. +
  31042. +#if 0
  31043. + // recover the right channel index
  31044. + channel = chplan_sta[pmlmeext->sitesurvey_res.channel_idx].ChannelNum;
  31045. + k = 0;
  31046. + while ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0))
  31047. + {
  31048. + if (chplan_new[k].ChannelNum == channel) {
  31049. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
  31050. + ("%s: change mlme_ext sitesurvey channel index from %d to %d\n",
  31051. + __FUNCTION__, pmlmeext->sitesurvey_res.channel_idx, k));
  31052. + pmlmeext->sitesurvey_res.channel_idx = k;
  31053. + break;
  31054. + }
  31055. + k++;
  31056. + }
  31057. +#endif
  31058. + }
  31059. +
  31060. + // If channel is used by AP, set channel scan type to active
  31061. + channel = bssid->Configuration.DSConfig;
  31062. + chplan_new = pmlmeext->channel_set;
  31063. + i = 0;
  31064. + while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0))
  31065. + {
  31066. + if (chplan_new[i].ChannelNum == channel)
  31067. + {
  31068. + if (chplan_new[i].ScanType == SCAN_PASSIVE)
  31069. + {
  31070. + //5G Bnad 2, 3 (DFS) doesn't change to active scan
  31071. + if(channel >= 52 && channel <= 144)
  31072. + break;
  31073. +
  31074. + chplan_new[i].ScanType = SCAN_ACTIVE;
  31075. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,
  31076. + ("%s: change channel %d scan type from passive to active\n",
  31077. + __FUNCTION__, channel));
  31078. + }
  31079. + break;
  31080. + }
  31081. + i++;
  31082. + }
  31083. +}
  31084. +#endif
  31085. +
  31086. +/****************************************************************************
  31087. +
  31088. +Following are the functions to report events
  31089. +
  31090. +*****************************************************************************/
  31091. +
  31092. +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
  31093. +{
  31094. + struct cmd_obj *pcmd_obj;
  31095. + u8 *pevtcmd;
  31096. + u32 cmdsz;
  31097. + struct survey_event *psurvey_evt;
  31098. + struct C2HEvent_Header *pc2h_evt_hdr;
  31099. + struct mlme_ext_priv *pmlmeext;
  31100. + struct cmd_priv *pcmdpriv;
  31101. + //u8 *pframe = precv_frame->u.hdr.rx_data;
  31102. + //uint len = precv_frame->u.hdr.len;
  31103. +
  31104. + if(!padapter)
  31105. + return;
  31106. +
  31107. + pmlmeext = &padapter->mlmeextpriv;
  31108. + pcmdpriv = &padapter->cmdpriv;
  31109. +
  31110. +
  31111. + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31112. + {
  31113. + return;
  31114. + }
  31115. +
  31116. + cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header));
  31117. + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
  31118. + {
  31119. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31120. + return;
  31121. + }
  31122. +
  31123. + _rtw_init_listhead(&pcmd_obj->list);
  31124. +
  31125. + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
  31126. + pcmd_obj->cmdsz = cmdsz;
  31127. + pcmd_obj->parmbuf = pevtcmd;
  31128. +
  31129. + pcmd_obj->rsp = NULL;
  31130. + pcmd_obj->rspsz = 0;
  31131. +
  31132. + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
  31133. + pc2h_evt_hdr->len = sizeof(struct survey_event);
  31134. + pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey);
  31135. + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
  31136. +
  31137. + psurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
  31138. +
  31139. + if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL)
  31140. + {
  31141. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31142. + rtw_mfree((u8 *)pevtcmd, cmdsz);
  31143. + return;
  31144. + }
  31145. +
  31146. +#ifdef CONFIG_80211D
  31147. + process_80211d(padapter, &psurvey_evt->bss);
  31148. +#endif
  31149. +
  31150. + rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
  31151. +
  31152. + pmlmeext->sitesurvey_res.bss_cnt++;
  31153. +
  31154. + return;
  31155. +
  31156. +}
  31157. +
  31158. +void report_surveydone_event(_adapter *padapter)
  31159. +{
  31160. + struct cmd_obj *pcmd_obj;
  31161. + u8 *pevtcmd;
  31162. + u32 cmdsz;
  31163. + struct surveydone_event *psurveydone_evt;
  31164. + struct C2HEvent_Header *pc2h_evt_hdr;
  31165. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31166. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  31167. +
  31168. + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31169. + {
  31170. + return;
  31171. + }
  31172. +
  31173. + cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header));
  31174. + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
  31175. + {
  31176. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31177. + return;
  31178. + }
  31179. +
  31180. + _rtw_init_listhead(&pcmd_obj->list);
  31181. +
  31182. + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
  31183. + pcmd_obj->cmdsz = cmdsz;
  31184. + pcmd_obj->parmbuf = pevtcmd;
  31185. +
  31186. + pcmd_obj->rsp = NULL;
  31187. + pcmd_obj->rspsz = 0;
  31188. +
  31189. + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
  31190. + pc2h_evt_hdr->len = sizeof(struct surveydone_event);
  31191. + pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone);
  31192. + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
  31193. +
  31194. + psurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
  31195. + psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt;
  31196. +
  31197. + DBG_871X("survey done event(%x) band:%d for "ADPT_FMT"\n", psurveydone_evt->bss_cnt, padapter->setband, ADPT_ARG(padapter));
  31198. +
  31199. + rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
  31200. +
  31201. + return;
  31202. +
  31203. +}
  31204. +
  31205. +void report_join_res(_adapter *padapter, int res)
  31206. +{
  31207. + struct cmd_obj *pcmd_obj;
  31208. + u8 *pevtcmd;
  31209. + u32 cmdsz;
  31210. + struct joinbss_event *pjoinbss_evt;
  31211. + struct C2HEvent_Header *pc2h_evt_hdr;
  31212. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31213. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31214. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  31215. +
  31216. + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31217. + {
  31218. + return;
  31219. + }
  31220. +
  31221. + cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header));
  31222. + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
  31223. + {
  31224. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31225. + return;
  31226. + }
  31227. +
  31228. + _rtw_init_listhead(&pcmd_obj->list);
  31229. +
  31230. + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
  31231. + pcmd_obj->cmdsz = cmdsz;
  31232. + pcmd_obj->parmbuf = pevtcmd;
  31233. +
  31234. + pcmd_obj->rsp = NULL;
  31235. + pcmd_obj->rspsz = 0;
  31236. +
  31237. + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
  31238. + pc2h_evt_hdr->len = sizeof(struct joinbss_event);
  31239. + pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss);
  31240. + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
  31241. +
  31242. + pjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
  31243. + _rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));
  31244. + pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res;
  31245. +
  31246. + DBG_871X("report_join_res(%d)\n", res);
  31247. +
  31248. +
  31249. + rtw_joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network);
  31250. +
  31251. +
  31252. + rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
  31253. +
  31254. + return;
  31255. +
  31256. +}
  31257. +
  31258. +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason)
  31259. +{
  31260. + struct cmd_obj *pcmd_obj;
  31261. + u8 *pevtcmd;
  31262. + u32 cmdsz;
  31263. + struct sta_info *psta;
  31264. + int mac_id;
  31265. + struct stadel_event *pdel_sta_evt;
  31266. + struct C2HEvent_Header *pc2h_evt_hdr;
  31267. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31268. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  31269. +
  31270. + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31271. + {
  31272. + return;
  31273. + }
  31274. +
  31275. + cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header));
  31276. + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
  31277. + {
  31278. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31279. + return;
  31280. + }
  31281. +
  31282. + _rtw_init_listhead(&pcmd_obj->list);
  31283. +
  31284. + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
  31285. + pcmd_obj->cmdsz = cmdsz;
  31286. + pcmd_obj->parmbuf = pevtcmd;
  31287. +
  31288. + pcmd_obj->rsp = NULL;
  31289. + pcmd_obj->rspsz = 0;
  31290. +
  31291. + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
  31292. + pc2h_evt_hdr->len = sizeof(struct stadel_event);
  31293. + pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA);
  31294. + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
  31295. +
  31296. + pdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
  31297. + _rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN);
  31298. + _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2);
  31299. +
  31300. +
  31301. + psta = rtw_get_stainfo(&padapter->stapriv, MacAddr);
  31302. + if(psta)
  31303. + mac_id = (int)psta->mac_id;
  31304. + else
  31305. + mac_id = (-1);
  31306. +
  31307. + pdel_sta_evt->mac_id = mac_id;
  31308. +
  31309. + DBG_871X("report_del_sta_event: delete STA, mac_id=%d\n", mac_id);
  31310. +
  31311. + rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
  31312. +
  31313. + return;
  31314. +}
  31315. +
  31316. +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx)
  31317. +{
  31318. + struct cmd_obj *pcmd_obj;
  31319. + u8 *pevtcmd;
  31320. + u32 cmdsz;
  31321. + struct stassoc_event *padd_sta_evt;
  31322. + struct C2HEvent_Header *pc2h_evt_hdr;
  31323. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31324. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  31325. +
  31326. + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31327. + {
  31328. + return;
  31329. + }
  31330. +
  31331. + cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header));
  31332. + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
  31333. + {
  31334. + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
  31335. + return;
  31336. + }
  31337. +
  31338. + _rtw_init_listhead(&pcmd_obj->list);
  31339. +
  31340. + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
  31341. + pcmd_obj->cmdsz = cmdsz;
  31342. + pcmd_obj->parmbuf = pevtcmd;
  31343. +
  31344. + pcmd_obj->rsp = NULL;
  31345. + pcmd_obj->rspsz = 0;
  31346. +
  31347. + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
  31348. + pc2h_evt_hdr->len = sizeof(struct stassoc_event);
  31349. + pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA);
  31350. + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
  31351. +
  31352. + padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
  31353. + _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN);
  31354. + padd_sta_evt->cam_id = cam_idx;
  31355. +
  31356. + DBG_871X("report_add_sta_event: add STA\n");
  31357. +
  31358. + rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
  31359. +
  31360. + return;
  31361. +}
  31362. +
  31363. +
  31364. +/****************************************************************************
  31365. +
  31366. +Following are the event callback functions
  31367. +
  31368. +*****************************************************************************/
  31369. +
  31370. +//for sta/adhoc mode
  31371. +void update_sta_info(_adapter *padapter, struct sta_info *psta)
  31372. +{
  31373. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  31374. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31375. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31376. +
  31377. + //ERP
  31378. + VCS_update(padapter, psta);
  31379. +
  31380. +
  31381. + //HT
  31382. + if(pmlmepriv->htpriv.ht_option)
  31383. + {
  31384. + psta->htpriv.ht_option = _TRUE;
  31385. +
  31386. + psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable;
  31387. +
  31388. + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps)))
  31389. + psta->htpriv.sgi = _TRUE;
  31390. +
  31391. + psta->qos_option = _TRUE;
  31392. +
  31393. + }
  31394. + else
  31395. + {
  31396. + psta->htpriv.ht_option = _FALSE;
  31397. +
  31398. + psta->htpriv.ampdu_enable = _FALSE;
  31399. +
  31400. + psta->htpriv.sgi = _FALSE;
  31401. +
  31402. + psta->qos_option = _FALSE;
  31403. +
  31404. + }
  31405. +
  31406. + psta->htpriv.bwmode = pmlmeext->cur_bwmode;
  31407. + psta->htpriv.ch_offset = pmlmeext->cur_ch_offset;
  31408. +
  31409. + psta->htpriv.agg_enable_bitmap = 0x0;//reset
  31410. + psta->htpriv.candidate_tid_bitmap = 0x0;//reset
  31411. +
  31412. +
  31413. + //QoS
  31414. + if(pmlmepriv->qospriv.qos_option)
  31415. + psta->qos_option = _TRUE;
  31416. +
  31417. +
  31418. + psta->state = _FW_LINKED;
  31419. +
  31420. +}
  31421. +
  31422. +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
  31423. +{
  31424. + struct sta_info *psta, *psta_bmc;
  31425. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31426. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31427. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  31428. + struct sta_priv *pstapriv = &padapter->stapriv;
  31429. + u8 join_type;
  31430. +
  31431. + if(join_res < 0)
  31432. + {
  31433. + join_type = 1;
  31434. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  31435. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
  31436. +
  31437. + //restore to initial setting.
  31438. + update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
  31439. +#if 0 //temply remove
  31440. +#ifdef CONFIG_INTEL_WIDI
  31441. +#ifdef DBG_CONFIG_ERROR_DETECT
  31442. + DBG_871X("%s(): do silentreset\n",__FUNCTION__);
  31443. + rtw_hal_sreset_reset(padapter);
  31444. +#endif
  31445. +#endif
  31446. +#endif
  31447. + goto exit_mlmeext_joinbss_event_callback;
  31448. + }
  31449. +
  31450. + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  31451. + {
  31452. + //for bc/mc
  31453. + psta_bmc = rtw_get_bcmc_stainfo(padapter);
  31454. + if(psta_bmc)
  31455. + {
  31456. + pmlmeinfo->FW_sta_info[psta_bmc->mac_id].psta = psta_bmc;
  31457. + update_bmc_sta_support_rate(padapter, psta_bmc->mac_id);
  31458. + Update_RA_Entry(padapter, psta_bmc->mac_id);
  31459. + }
  31460. + }
  31461. +
  31462. +
  31463. + //turn on dynamic functions
  31464. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
  31465. +
  31466. + // update IOT-releated issue
  31467. + update_IOT_info(padapter);
  31468. +
  31469. + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates);
  31470. +
  31471. + //BCN interval
  31472. + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval));
  31473. +
  31474. + //udpate capability
  31475. + update_capinfo(padapter, pmlmeinfo->capability);
  31476. +
  31477. + //WMM, Update EDCA param
  31478. + WMMOnAssocRsp(padapter);
  31479. +
  31480. + //HT
  31481. + HTOnAssocRsp(padapter);
  31482. +
  31483. +#ifndef CONFIG_CONCURRENT_MODE
  31484. + // Call set_channel_bwmode when the CONFIG_CONCURRENT_MODE doesn't be defined.
  31485. + //Set cur_channel&cur_bwmode&cur_ch_offset
  31486. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  31487. +#endif
  31488. +
  31489. + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
  31490. + if (psta) //only for infra. mode
  31491. + {
  31492. + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;
  31493. +
  31494. + //DBG_871X("set_sta_rate\n");
  31495. +
  31496. + //set per sta rate after updating HT cap.
  31497. + set_sta_rate(padapter, psta);
  31498. + }
  31499. +
  31500. + join_type = 2;
  31501. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  31502. +
  31503. + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
  31504. + {
  31505. + // correcting TSF
  31506. + correct_TSF(padapter, pmlmeext);
  31507. +
  31508. + //set_link_timer(pmlmeext, DISCONNECT_TO);
  31509. + }
  31510. +
  31511. +#ifdef CONFIG_LPS
  31512. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0);
  31513. +#endif
  31514. +
  31515. +exit_mlmeext_joinbss_event_callback:
  31516. +
  31517. +#ifdef CONFIG_DUALMAC_CONCURRENT
  31518. + dc_handle_join_done(padapter, join_res);
  31519. +#endif
  31520. +#ifdef CONFIG_CONCURRENT_MODE
  31521. + concurrent_chk_joinbss_done(padapter, join_res);
  31522. +#endif
  31523. +
  31524. + DBG_871X("=>%s\n", __FUNCTION__);
  31525. +
  31526. +}
  31527. +
  31528. +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta)
  31529. +{
  31530. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  31531. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31532. + u8 join_type;
  31533. +
  31534. + DBG_871X("%s\n", __FUNCTION__);
  31535. +
  31536. + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  31537. + {
  31538. + if(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1
  31539. + {
  31540. + //nothing to do
  31541. + }
  31542. + else//adhoc client
  31543. + {
  31544. + //update TSF Value
  31545. + //update_TSF(pmlmeext, pframe, len);
  31546. +
  31547. + // correcting TSF
  31548. + correct_TSF(padapter, pmlmeext);
  31549. +
  31550. + //start beacon
  31551. + if(send_beacon(padapter)==_FAIL)
  31552. + {
  31553. + pmlmeinfo->FW_sta_info[psta->mac_id].status = 0;
  31554. +
  31555. + pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE;
  31556. +
  31557. + return;
  31558. + }
  31559. +
  31560. + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
  31561. +
  31562. + }
  31563. +
  31564. + join_type = 2;
  31565. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  31566. + }
  31567. +
  31568. + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;
  31569. +
  31570. + //rate radaptive
  31571. + Update_RA_Entry(padapter, psta->mac_id);
  31572. +
  31573. + //update adhoc sta_info
  31574. + update_sta_info(padapter, psta);
  31575. +
  31576. +}
  31577. +
  31578. +void mlmeext_sta_del_event_callback(_adapter *padapter)
  31579. +{
  31580. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31581. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31582. +
  31583. + if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter))
  31584. + {
  31585. + //set_opmode_cmd(padapter, infra_client_with_mlme);
  31586. +
  31587. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
  31588. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
  31589. +
  31590. + //restore to initial setting.
  31591. + update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
  31592. +
  31593. +#ifdef CONFIG_DUALMAC_CONCURRENT
  31594. + dc_set_channel_bwmode_disconnect(padapter);
  31595. +#else
  31596. +#ifdef CONFIG_CONCURRENT_MODE
  31597. + if((check_buddy_fwstate(padapter, _FW_LINKED)) != _TRUE)
  31598. + {
  31599. +#endif //CONFIG_CONCURRENT_MODE
  31600. +
  31601. + //switch to the 20M Hz mode after disconnect
  31602. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  31603. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  31604. +
  31605. + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);
  31606. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  31607. +
  31608. +#ifdef CONFIG_CONCURRENT_MODE
  31609. + }
  31610. +#endif //CONFIG_CONCURRENT_MODE
  31611. +#endif //CONFIG_DUALMAC_CONCURRENT
  31612. +
  31613. + flush_all_cam_entry(padapter);
  31614. +
  31615. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  31616. +
  31617. + //set MSR to no link state -> infra. mode
  31618. + Set_MSR(padapter, _HW_STATE_STATION_);
  31619. +
  31620. + _cancel_timer_ex(&pmlmeext->link_timer);
  31621. +
  31622. + }
  31623. +
  31624. +}
  31625. +
  31626. +/****************************************************************************
  31627. +
  31628. +Following are the functions for the timer handlers
  31629. +
  31630. +*****************************************************************************/
  31631. +void _linked_rx_signal_strehgth_display(_adapter *padapter);
  31632. +void _linked_rx_signal_strehgth_display(_adapter *padapter)
  31633. +{
  31634. + int UndecoratedSmoothedPWDB;
  31635. +
  31636. +#ifdef CONFIG_CONCURRENT_MODE
  31637. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  31638. + DBG_871X("============ pbuddy_adapter linked status check ===================\n");
  31639. + DBG_871X("buddy_adapter_type=%d\n", pbuddy_adapter->adapter_type);
  31640. + DBG_871X("pbuddy_adapter pathA Rx SNRdb:%d\n",pbuddy_adapter->recvpriv.RxSNRdB[0]);
  31641. + DBG_871X("pbuddy_adapter pathA Rx PWDB:%d\n",pbuddy_adapter->recvpriv.rxpwdb);
  31642. + DBG_871X("pbuddy_adapter pathA Rx RSSI:%d,pathB Rx RSSI:%d\n"
  31643. + ,pbuddy_adapter->recvpriv.RxRssi[0],pbuddy_adapter->recvpriv.RxRssi[1]);
  31644. + rtw_hal_get_def_var(pbuddy_adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);
  31645. + DBG_871X("pbuddy_adapter UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB);
  31646. + DBG_871X("Rx RSSI:%d\n",pbuddy_adapter->recvpriv.rssi);
  31647. + DBG_871X("Rx Signal_strength:%d\n",pbuddy_adapter->recvpriv.signal_strength);
  31648. + DBG_871X("Rx Signal_qual:%d \n",pbuddy_adapter->recvpriv.signal_qual);
  31649. + DBG_871X("============ linked status check ===================\n");
  31650. + DBG_871X("adapter_type=%d\n", padapter->adapter_type);
  31651. +#else //CONFIG_CONCURRENT_MODE
  31652. + DBG_871X("============ linked status check ===================\n");
  31653. +#endif //CONFIG_CONCURRENT_MODE
  31654. + DBG_871X("pathA Rx SNRdb:%d, pathB Rx SNRdb:%d\n",padapter->recvpriv.RxSNRdB[0], padapter->recvpriv.RxSNRdB[1]);
  31655. + DBG_871X("pathA Rx PWDB:%d\n",padapter->recvpriv.rxpwdb);
  31656. + DBG_871X("pathA Rx RSSI:%d,pathB Rx RSSI:%d\n",padapter->recvpriv.RxRssi[0],padapter->recvpriv.RxRssi[1]);
  31657. + rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);
  31658. + DBG_871X("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB);
  31659. + DBG_871X("Rx RSSI:%d\n",padapter->recvpriv.rssi);
  31660. + DBG_871X("Rx Signal_strength:%d\n",padapter->recvpriv.signal_strength);
  31661. + DBG_871X("Rx Signal_qual:%d \n",padapter->recvpriv.signal_qual);
  31662. + if ( check_fwstate( &padapter->mlmepriv, _FW_LINKED ))
  31663. + {
  31664. + DBG_871X("bw mode: %d, channel: %d\n", padapter->mlmeextpriv.cur_bwmode, padapter->mlmeextpriv.cur_channel );
  31665. + DBG_871X("received bytes = %d\n", (u32) (padapter->recvpriv.rx_bytes - padapter->recvpriv.last_rx_bytes ) );
  31666. + }
  31667. + DBG_871X("============ linked status check ===================\n");
  31668. + DBG_871X(" DIG PATH-A(0x%02x), PATH-B(0x%02x)\n",rtw_read8(padapter,0xc50),rtw_read8(padapter,0xc58));
  31669. + DBG_871X(" OFDM -Alarm DA2(0x%04x),DA4(0x%04x),DA6(0x%04x),DA8(0x%04x)\n",
  31670. + rtw_read16(padapter,0xDA2),rtw_read16(padapter,0xDA4),rtw_read16(padapter,0xDA6),rtw_read16(padapter,0xDA8));
  31671. +
  31672. + DBG_871X(" CCK -Alarm A5B(0x%02x),A5C(0x%02x)\n",rtw_read8(padapter,0xA5B),rtw_read8(padapter,0xA5C));
  31673. + DBG_871X(" FalseAlmCnt_all(%d)\n",padapter->recvpriv.FalseAlmCnt_all);
  31674. +
  31675. +}
  31676. +
  31677. +u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta)
  31678. +{
  31679. + u8 ret = _FALSE;
  31680. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31681. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31682. +
  31683. + #ifdef DBG_EXPIRATION_CHK
  31684. + DBG_871X(FUNC_ADPT_FMT" rx:"STA_PKTS_FMT", beacon:%llu, probersp_to_self:%llu"
  31685. + /*", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u"*/
  31686. + ", retry:%u\n"
  31687. + , FUNC_ADPT_ARG(padapter)
  31688. + , STA_RX_PKTS_DIFF_ARG(psta)
  31689. + , psta->sta_stats.rx_beacon_pkts - psta->sta_stats.last_rx_beacon_pkts
  31690. + , psta->sta_stats.rx_probersp_pkts - psta->sta_stats.last_rx_probersp_pkts
  31691. + /*, psta->sta_stats.rx_probersp_bm_pkts - psta->sta_stats.last_rx_probersp_bm_pkts
  31692. + , psta->sta_stats.rx_probersp_uo_pkts - psta->sta_stats.last_rx_probersp_uo_pkts
  31693. + , psta->sta_stats.rx_probereq_pkts - psta->sta_stats.last_rx_probereq_pkts
  31694. + , pmlmeinfo->bcn_interval*/
  31695. + , pmlmeext->retry
  31696. + );
  31697. +
  31698. + DBG_871X(FUNC_ADPT_FMT" tx_pkts:%llu, link_count:%u\n", FUNC_ADPT_ARG(padapter)
  31699. + , padapter->xmitpriv.tx_pkts
  31700. + , pmlmeinfo->link_count
  31701. + );
  31702. + #endif
  31703. +
  31704. + if((sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta))
  31705. + && sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta)
  31706. + && sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta)
  31707. + )
  31708. + {
  31709. + ret = _FALSE;
  31710. + }
  31711. + else
  31712. + {
  31713. + ret = _TRUE;
  31714. + }
  31715. +
  31716. + sta_update_last_rx_pkts(psta);
  31717. +
  31718. + return ret;
  31719. +}
  31720. +
  31721. +void linked_status_chk(_adapter *padapter)
  31722. +{
  31723. + u32 i;
  31724. + struct sta_info *psta;
  31725. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  31726. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31727. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31728. + struct sta_priv *pstapriv = &padapter->stapriv;
  31729. +
  31730. + if(padapter->bRxRSSIDisplay)
  31731. + _linked_rx_signal_strehgth_display(padapter);
  31732. +
  31733. + #ifdef DBG_CONFIG_ERROR_DETECT
  31734. + rtw_hal_sreset_linked_status_check(padapter);
  31735. + #endif
  31736. +
  31737. + if (is_client_associated_to_ap(padapter))
  31738. + {
  31739. + //linked infrastructure client mode
  31740. +
  31741. + int tx_chk = _SUCCESS, rx_chk = _SUCCESS;
  31742. + int rx_chk_limit;
  31743. +
  31744. + #if defined(DBG_ROAMING_TEST)
  31745. + rx_chk_limit = 1;
  31746. + #elif defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK)
  31747. + rx_chk_limit = 4;
  31748. + #else
  31749. + rx_chk_limit = 8;
  31750. + #endif
  31751. +
  31752. + // Marked by Kurt 20130715
  31753. + // For WiDi 3.5 and later on, they don't ask WiDi sink to do roaming, so we could not check rx limit that strictly.
  31754. + // todo: To check why rx_chk would be _FALSE under miracast session.
  31755. + //#ifdef CONFIG_INTEL_WIDI
  31756. + //if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE)
  31757. + // rx_chk_limit = 1;
  31758. + //#endif
  31759. +
  31760. + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)
  31761. + {
  31762. + bool is_p2p_enable = _FALSE;
  31763. + #ifdef CONFIG_P2P
  31764. + is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE);
  31765. + #endif
  31766. +
  31767. + if (chk_ap_is_alive(padapter, psta) == _FALSE)
  31768. + rx_chk = _FAIL;
  31769. +
  31770. + if (pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts)
  31771. + tx_chk = _FAIL;
  31772. +
  31773. + #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  31774. + if (pmlmeext->active_keep_alive_check && (rx_chk == _FAIL || tx_chk == _FAIL)) {
  31775. + u8 backup_oper_channel=0;
  31776. +
  31777. + /* switch to correct channel of current network before issue keep-alive frames */
  31778. + if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) {
  31779. + backup_oper_channel = rtw_get_oper_ch(padapter);
  31780. + SelectChannel(padapter, pmlmeext->cur_channel);
  31781. + }
  31782. +
  31783. + if (rx_chk != _SUCCESS)
  31784. + issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, psta->hwaddr, 3, 1);
  31785. +
  31786. + if ((tx_chk != _SUCCESS && pmlmeinfo->link_count++ == 0xf) || rx_chk != _SUCCESS) {
  31787. + tx_chk = issue_nulldata(padapter, psta->hwaddr, 0, 3, 1);
  31788. + /* if tx acked and p2p disabled, set rx_chk _SUCCESS to reset retry count */
  31789. + if (tx_chk == _SUCCESS && !is_p2p_enable)
  31790. + rx_chk = _SUCCESS;
  31791. + }
  31792. +
  31793. + /* back to the original operation channel */
  31794. + if(backup_oper_channel>0)
  31795. + SelectChannel(padapter, backup_oper_channel);
  31796. +
  31797. + }
  31798. + else
  31799. + #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */
  31800. + {
  31801. + if (rx_chk != _SUCCESS) {
  31802. + if (pmlmeext->retry == 0) {
  31803. + #ifdef DBG_EXPIRATION_CHK
  31804. + DBG_871X("issue_probereq to trigger probersp, retry=%d\n", pmlmeext->retry);
  31805. + #endif
  31806. + issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
  31807. + issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
  31808. + issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
  31809. + }
  31810. + }
  31811. +
  31812. + if (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == 0xf) {
  31813. + #ifdef DBG_EXPIRATION_CHK
  31814. + DBG_871X("%s issue_nulldata 0\n", __FUNCTION__);
  31815. + #endif
  31816. + tx_chk = issue_nulldata(padapter, NULL, 0, 1, 0);
  31817. + }
  31818. + }
  31819. +
  31820. + if (rx_chk == _FAIL) {
  31821. + pmlmeext->retry++;
  31822. + if (pmlmeext->retry > rx_chk_limit) {
  31823. + DBG_871X(FUNC_ADPT_FMT" disconnect or roaming\n",
  31824. + FUNC_ADPT_ARG(padapter));
  31825. + receive_disconnect(padapter, pmlmeinfo->network.MacAddress
  31826. + , WLAN_REASON_EXPIRATION_CHK);
  31827. + return;
  31828. + }
  31829. + } else {
  31830. + pmlmeext->retry = 0;
  31831. + }
  31832. +
  31833. + if (tx_chk == _FAIL) {
  31834. + pmlmeinfo->link_count &= 0xf;
  31835. + } else {
  31836. + pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts;
  31837. + pmlmeinfo->link_count = 0;
  31838. + }
  31839. +
  31840. + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL)
  31841. + }
  31842. + else if (is_client_associated_to_ibss(padapter))
  31843. + {
  31844. + //linked IBSS mode
  31845. + //for each assoc list entry to check the rx pkt counter
  31846. + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++)
  31847. + {
  31848. + if (pmlmeinfo->FW_sta_info[i].status == 1)
  31849. + {
  31850. + psta = pmlmeinfo->FW_sta_info[i].psta;
  31851. +
  31852. + if(NULL==psta) continue;
  31853. +
  31854. + if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta))
  31855. + {
  31856. +
  31857. + if(pmlmeinfo->FW_sta_info[i].retry<3)
  31858. + {
  31859. + pmlmeinfo->FW_sta_info[i].retry++;
  31860. + }
  31861. + else
  31862. + {
  31863. + pmlmeinfo->FW_sta_info[i].retry = 0;
  31864. + pmlmeinfo->FW_sta_info[i].status = 0;
  31865. + report_del_sta_event(padapter, psta->hwaddr
  31866. + , 65535// indicate disconnect caused by no rx
  31867. + );
  31868. + }
  31869. + }
  31870. + else
  31871. + {
  31872. + pmlmeinfo->FW_sta_info[i].retry = 0;
  31873. + pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)sta_rx_pkts(psta);
  31874. + }
  31875. + }
  31876. + }
  31877. +
  31878. + //set_link_timer(pmlmeext, DISCONNECT_TO);
  31879. +
  31880. + }
  31881. +
  31882. +}
  31883. +
  31884. +void survey_timer_hdl(_adapter *padapter)
  31885. +{
  31886. + struct cmd_obj *ph2c;
  31887. + struct sitesurvey_parm *psurveyPara;
  31888. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  31889. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31890. +#ifdef CONFIG_P2P
  31891. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  31892. +#endif
  31893. +
  31894. + //DBG_871X("marc: survey timer\n");
  31895. +#ifdef PLATFORM_FREEBSD
  31896. + rtw_mtx_lock(NULL);
  31897. + if (callout_pending(&padapter->mlmeextpriv.survey_timer.callout)) {
  31898. + /* callout was reset */
  31899. + //mtx_unlock(&sc->sc_mtx);
  31900. + rtw_mtx_unlock(NULL);
  31901. + return;
  31902. + }
  31903. + if (!callout_active(&padapter->mlmeextpriv.survey_timer.callout)) {
  31904. + /* callout was stopped */
  31905. + //mtx_unlock(&sc->sc_mtx);
  31906. + rtw_mtx_unlock(NULL);
  31907. + return;
  31908. + }
  31909. + callout_deactivate(&padapter->mlmeextpriv.survey_timer.callout);
  31910. +
  31911. +
  31912. +#endif
  31913. +
  31914. + //issue rtw_sitesurvey_cmd
  31915. + if (pmlmeext->sitesurvey_res.state > SCAN_START)
  31916. + {
  31917. + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
  31918. + {
  31919. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  31920. + if( padapter->mlmeextpriv.mlmext_info.scan_cnt != RTW_SCAN_NUM_OF_CH )
  31921. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  31922. + pmlmeext->sitesurvey_res.channel_idx++;
  31923. + }
  31924. +
  31925. + if(pmlmeext->scan_abort == _TRUE)
  31926. + {
  31927. + #ifdef CONFIG_P2P
  31928. + if(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))
  31929. + {
  31930. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
  31931. + pmlmeext->sitesurvey_res.channel_idx = 3;
  31932. + DBG_871X("%s idx:%d, cnt:%u\n", __FUNCTION__
  31933. + , pmlmeext->sitesurvey_res.channel_idx
  31934. + , pwdinfo->find_phase_state_exchange_cnt
  31935. + );
  31936. + }
  31937. + else
  31938. + #endif
  31939. + {
  31940. + pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num;
  31941. + DBG_871X("%s idx:%d\n", __FUNCTION__
  31942. + , pmlmeext->sitesurvey_res.channel_idx
  31943. + );
  31944. + }
  31945. +
  31946. + pmlmeext->scan_abort = _FALSE;//reset
  31947. + }
  31948. +
  31949. + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  31950. + {
  31951. + goto exit_survey_timer_hdl;
  31952. + }
  31953. +
  31954. + if ((psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm))) == NULL)
  31955. + {
  31956. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  31957. + goto exit_survey_timer_hdl;
  31958. + }
  31959. +
  31960. + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey));
  31961. + rtw_enqueue_cmd(pcmdpriv, ph2c);
  31962. + }
  31963. +
  31964. +
  31965. +exit_survey_timer_hdl:
  31966. +#ifdef PLATFORM_FREEBSD
  31967. + rtw_mtx_unlock(NULL);
  31968. +#endif
  31969. +
  31970. + return;
  31971. +}
  31972. +
  31973. +void link_timer_hdl(_adapter *padapter)
  31974. +{
  31975. + //static unsigned int rx_pkt = 0;
  31976. + //static u64 tx_cnt = 0;
  31977. + //struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  31978. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  31979. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  31980. + //struct sta_priv *pstapriv = &padapter->stapriv;
  31981. +
  31982. +#ifdef PLATFORM_FREEBSD
  31983. + rtw_mtx_lock(NULL);
  31984. + if (callout_pending(&padapter->mlmeextpriv.survey_timer.callout)) {
  31985. + /* callout was reset */
  31986. + //mtx_unlock(&sc->sc_mtx);
  31987. + rtw_mtx_unlock(NULL);
  31988. + return;
  31989. + }
  31990. + if (!callout_active(&padapter->mlmeextpriv.survey_timer.callout)) {
  31991. + /* callout was stopped */
  31992. + //mtx_unlock(&sc->sc_mtx);
  31993. + rtw_mtx_unlock(NULL);
  31994. + return;
  31995. + }
  31996. + callout_deactivate(&padapter->mlmeextpriv.survey_timer.callout);
  31997. +
  31998. +
  31999. +#endif
  32000. +
  32001. + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL)
  32002. + {
  32003. + DBG_871X("link_timer_hdl:no beacon while connecting\n");
  32004. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  32005. + report_join_res(padapter, -3);
  32006. + }
  32007. + else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE)
  32008. + {
  32009. + //re-auth timer
  32010. + if (++pmlmeinfo->reauth_count > REAUTH_LIMIT)
  32011. + {
  32012. + //if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto)
  32013. + //{
  32014. + pmlmeinfo->state = 0;
  32015. + report_join_res(padapter, -1);
  32016. + return;
  32017. + //}
  32018. + //else
  32019. + //{
  32020. + // pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared;
  32021. + // pmlmeinfo->reauth_count = 0;
  32022. + //}
  32023. + }
  32024. +
  32025. + DBG_871X("link_timer_hdl: auth timeout and try again\n");
  32026. + pmlmeinfo->auth_seq = 1;
  32027. + issue_auth(padapter, NULL, 0);
  32028. + set_link_timer(pmlmeext, REAUTH_TO);
  32029. + }
  32030. + else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)
  32031. + {
  32032. + //re-assoc timer
  32033. + if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT)
  32034. + {
  32035. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  32036. + report_join_res(padapter, -2);
  32037. + return;
  32038. + }
  32039. +
  32040. + DBG_871X("link_timer_hdl: assoc timeout and try again\n");
  32041. + issue_assocreq(padapter);
  32042. + set_link_timer(pmlmeext, REASSOC_TO);
  32043. + }
  32044. +#if 0
  32045. + else if (is_client_associated_to_ap(padapter))
  32046. + {
  32047. + //linked infrastructure client mode
  32048. + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)
  32049. + {
  32050. + /*to monitor whether the AP is alive or not*/
  32051. + if (rx_pkt == psta->sta_stats.rx_pkts)
  32052. + {
  32053. + receive_disconnect(padapter, pmlmeinfo->network.MacAddress);
  32054. + return;
  32055. + }
  32056. + else
  32057. + {
  32058. + rx_pkt = psta->sta_stats.rx_pkts;
  32059. + set_link_timer(pmlmeext, DISCONNECT_TO);
  32060. + }
  32061. +
  32062. + //update the EDCA paramter according to the Tx/RX mode
  32063. + update_EDCA_param(padapter);
  32064. +
  32065. + /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/
  32066. + if (pmlmeinfo->link_count++ == 0)
  32067. + {
  32068. + tx_cnt = pxmitpriv->tx_pkts;
  32069. + }
  32070. + else if ((pmlmeinfo->link_count & 0xf) == 0)
  32071. + {
  32072. + if (tx_cnt == pxmitpriv->tx_pkts)
  32073. + {
  32074. + issue_nulldata(padapter, NULL, 0, 0, 0);
  32075. + }
  32076. +
  32077. + tx_cnt = pxmitpriv->tx_pkts;
  32078. + }
  32079. + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL)
  32080. + }
  32081. + else if (is_client_associated_to_ibss(padapter))
  32082. + {
  32083. + //linked IBSS mode
  32084. + //for each assoc list entry to check the rx pkt counter
  32085. + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++)
  32086. + {
  32087. + if (pmlmeinfo->FW_sta_info[i].status == 1)
  32088. + {
  32089. + psta = pmlmeinfo->FW_sta_info[i].psta;
  32090. +
  32091. + if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts)
  32092. + {
  32093. + pmlmeinfo->FW_sta_info[i].status = 0;
  32094. + report_del_sta_event(padapter, psta->hwaddr);
  32095. + }
  32096. + else
  32097. + {
  32098. + pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts;
  32099. + }
  32100. + }
  32101. + }
  32102. +
  32103. + set_link_timer(pmlmeext, DISCONNECT_TO);
  32104. + }
  32105. +#endif
  32106. +
  32107. +#ifdef PLATFORM_FREEBSD
  32108. + rtw_mtx_unlock(NULL);
  32109. +#endif
  32110. +
  32111. + return;
  32112. +}
  32113. +
  32114. +void addba_timer_hdl(struct sta_info *psta)
  32115. +{
  32116. + struct ht_priv *phtpriv;
  32117. +
  32118. + if(!psta)
  32119. + return;
  32120. +
  32121. + phtpriv = &psta->htpriv;
  32122. +
  32123. + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE))
  32124. + {
  32125. + if(phtpriv->candidate_tid_bitmap)
  32126. + phtpriv->candidate_tid_bitmap=0x0;
  32127. +
  32128. + }
  32129. +}
  32130. +
  32131. +#ifdef CONFIG_IEEE80211W
  32132. +void sa_query_timer_hdl(_adapter *padapter)
  32133. +{
  32134. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32135. + struct mlme_priv * pmlmepriv = &padapter->mlmepriv;
  32136. + _irqL irqL;
  32137. + //disconnect
  32138. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  32139. +
  32140. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  32141. + {
  32142. + rtw_disassoc_cmd(padapter, 0, _TRUE);
  32143. + rtw_indicate_disconnect(padapter);
  32144. + rtw_free_assoc_resources(padapter, 1);
  32145. + }
  32146. +
  32147. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  32148. + DBG_871X("SA query timeout disconnect\n");
  32149. +}
  32150. +#endif //CONFIG_IEEE80211W
  32151. +
  32152. +u8 NULL_hdl(_adapter *padapter, u8 *pbuf)
  32153. +{
  32154. + return H2C_SUCCESS;
  32155. +}
  32156. +
  32157. +#ifdef CONFIG_AUTO_AP_MODE
  32158. +void rtw_start_auto_ap(_adapter *adapter)
  32159. +{
  32160. + DBG_871X("%s\n", __FUNCTION__);
  32161. +
  32162. + rtw_set_802_11_infrastructure_mode(adapter, Ndis802_11APMode);
  32163. +
  32164. + rtw_setopmode_cmd(adapter, Ndis802_11APMode);
  32165. +}
  32166. +
  32167. +static int rtw_auto_ap_start_beacon(_adapter *adapter)
  32168. +{
  32169. + int ret=0;
  32170. + u8 *pbuf = NULL;
  32171. + uint len;
  32172. + u8 supportRate[16];
  32173. + int sz = 0, rateLen;
  32174. + u8 * ie;
  32175. + u8 wireless_mode, oper_channel;
  32176. + u8 ssid[3] = {0}; //hidden ssid
  32177. + u32 ssid_len = sizeof(ssid);
  32178. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  32179. +
  32180. +
  32181. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  32182. + return -EINVAL;
  32183. +
  32184. +
  32185. + len = 128;
  32186. + pbuf = rtw_zmalloc(len);
  32187. + if(!pbuf)
  32188. + return -ENOMEM;
  32189. +
  32190. +
  32191. + //generate beacon
  32192. + ie = pbuf;
  32193. +
  32194. + //timestamp will be inserted by hardware
  32195. + sz += 8;
  32196. + ie += sz;
  32197. +
  32198. + //beacon interval : 2bytes
  32199. + *(u16*)ie = cpu_to_le16((u16)100);//BCN_INTERVAL=100;
  32200. + sz += 2;
  32201. + ie += 2;
  32202. +
  32203. + //capability info
  32204. + *(u16*)ie = 0;
  32205. + *(u16*)ie |= cpu_to_le16(cap_ESS);
  32206. + *(u16*)ie |= cpu_to_le16(cap_ShortPremble);
  32207. + //*(u16*)ie |= cpu_to_le16(cap_Privacy);
  32208. + sz += 2;
  32209. + ie += 2;
  32210. +
  32211. + //SSID
  32212. + ie = rtw_set_ie(ie, _SSID_IE_, ssid_len, ssid, &sz);
  32213. +
  32214. + //supported rates
  32215. + wireless_mode = WIRELESS_11BG_24N;
  32216. + rtw_set_supported_rate(supportRate, wireless_mode) ;
  32217. + rateLen = rtw_get_rateset_len(supportRate);
  32218. + if (rateLen > 8)
  32219. + {
  32220. + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, supportRate, &sz);
  32221. + }
  32222. + else
  32223. + {
  32224. + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, supportRate, &sz);
  32225. + }
  32226. +
  32227. +
  32228. + //DS parameter set
  32229. + if(check_buddy_fwstate(adapter, _FW_LINKED) &&
  32230. + check_buddy_fwstate(adapter, WIFI_STATION_STATE))
  32231. + {
  32232. + PADAPTER pbuddy_adapter = adapter->pbuddy_adapter;
  32233. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  32234. +
  32235. + oper_channel = pbuddy_mlmeext->cur_channel;
  32236. + }
  32237. + else
  32238. + {
  32239. + oper_channel = adapter_to_dvobj(adapter)->oper_channel;
  32240. + }
  32241. + ie = rtw_set_ie(ie, _DSSET_IE_, 1, &oper_channel, &sz);
  32242. +
  32243. + //ext supported rates
  32244. + if (rateLen > 8)
  32245. + {
  32246. + ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (supportRate + 8), &sz);
  32247. + }
  32248. +
  32249. + DBG_871X("%s, start auto ap beacon sz=%d\n", __FUNCTION__, sz);
  32250. +
  32251. + //lunch ap mode & start to issue beacon
  32252. + if(rtw_check_beacon_data(adapter, pbuf, sz) == _SUCCESS)
  32253. + {
  32254. +
  32255. + }
  32256. + else
  32257. + {
  32258. + ret = -EINVAL;
  32259. + }
  32260. +
  32261. +
  32262. + rtw_mfree(pbuf, len);
  32263. +
  32264. + return ret;
  32265. +
  32266. +}
  32267. +#endif//CONFIG_AUTO_AP_MODE
  32268. +
  32269. +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf)
  32270. +{
  32271. + u8 type;
  32272. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32273. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32274. + struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf;
  32275. +
  32276. + if(psetop->mode == Ndis802_11APMode)
  32277. + {
  32278. + pmlmeinfo->state = WIFI_FW_AP_STATE;
  32279. + type = _HW_STATE_AP_;
  32280. +#ifdef CONFIG_NATIVEAP_MLME
  32281. + //start_ap_mode(padapter);
  32282. +#endif
  32283. + }
  32284. + else if(psetop->mode == Ndis802_11Infrastructure)
  32285. + {
  32286. + pmlmeinfo->state &= ~(BIT(0)|BIT(1));// clear state
  32287. + pmlmeinfo->state |= WIFI_FW_STATION_STATE;//set to STATION_STATE
  32288. + type = _HW_STATE_STATION_;
  32289. + }
  32290. + else if(psetop->mode == Ndis802_11IBSS)
  32291. + {
  32292. + type = _HW_STATE_ADHOC_;
  32293. + }
  32294. + else
  32295. + {
  32296. + type = _HW_STATE_NOLINK_;
  32297. + }
  32298. +
  32299. + rtw_hal_set_hwreg(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type));
  32300. + //Set_NETYPE0_MSR(padapter, type);
  32301. +
  32302. +#ifdef CONFIG_AUTO_AP_MODE
  32303. + if(psetop->mode == Ndis802_11APMode)
  32304. + rtw_auto_ap_start_beacon(padapter);
  32305. +#endif
  32306. +
  32307. + return H2C_SUCCESS;
  32308. +
  32309. +}
  32310. +
  32311. +u8 createbss_hdl(_adapter *padapter, u8 *pbuf)
  32312. +{
  32313. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32314. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32315. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  32316. + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf;
  32317. + u32 initialgain;
  32318. +
  32319. +
  32320. + if(pparm->network.InfrastructureMode == Ndis802_11APMode)
  32321. + {
  32322. +#ifdef CONFIG_AP_MODE
  32323. +
  32324. + if(pmlmeinfo->state == WIFI_FW_AP_STATE)
  32325. + {
  32326. + //todo:
  32327. + return H2C_SUCCESS;
  32328. + }
  32329. +#endif
  32330. + }
  32331. +
  32332. + //below is for ad-hoc master
  32333. + if(pparm->network.InfrastructureMode == Ndis802_11IBSS)
  32334. + {
  32335. + rtw_joinbss_reset(padapter);
  32336. +
  32337. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  32338. + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  32339. + pmlmeinfo->ERP_enable = 0;
  32340. + pmlmeinfo->WMM_enable = 0;
  32341. + pmlmeinfo->HT_enable = 0;
  32342. + pmlmeinfo->HT_caps_enable = 0;
  32343. + pmlmeinfo->HT_info_enable = 0;
  32344. + pmlmeinfo->agg_enable_bitmap = 0;
  32345. + pmlmeinfo->candidate_tid_bitmap = 0;
  32346. +
  32347. + //disable dynamic functions, such as high power, DIG
  32348. + Save_DM_Func_Flag(padapter);
  32349. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  32350. +
  32351. + //config the initial gain under linking, need to write the BB registers
  32352. + initialgain = 0x1E;
  32353. + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  32354. +
  32355. + //cancel link timer
  32356. + _cancel_timer_ex(&pmlmeext->link_timer);
  32357. +
  32358. + //clear CAM
  32359. + flush_all_cam_entry(padapter);
  32360. +
  32361. + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength));
  32362. + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength;
  32363. +
  32364. + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength
  32365. + return H2C_PARAMETERS_ERROR;
  32366. +
  32367. + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength);
  32368. +
  32369. + start_create_ibss(padapter);
  32370. +
  32371. + }
  32372. +
  32373. + return H2C_SUCCESS;
  32374. +
  32375. +}
  32376. +
  32377. +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
  32378. +{
  32379. + u8 join_type;
  32380. + PNDIS_802_11_VARIABLE_IEs pIE;
  32381. + struct registry_priv *pregpriv = &padapter->registrypriv;
  32382. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32383. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32384. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  32385. +#ifdef CONFIG_ANTENNA_DIVERSITY
  32386. + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf;
  32387. +#endif //CONFIG_ANTENNA_DIVERSITY
  32388. + u32 initialgain, i;
  32389. + u8 cbw40_enable=0;
  32390. + //u32 acparm;
  32391. +
  32392. + //check already connecting to AP or not
  32393. + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
  32394. + {
  32395. + if (pmlmeinfo->state & WIFI_FW_STATION_STATE)
  32396. + {
  32397. + issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 5, 100);
  32398. + }
  32399. +
  32400. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  32401. +
  32402. + //clear CAM
  32403. + flush_all_cam_entry(padapter);
  32404. +
  32405. + _cancel_timer_ex(&pmlmeext->link_timer);
  32406. +
  32407. + //set MSR to nolink -> infra. mode
  32408. + //Set_MSR(padapter, _HW_STATE_NOLINK_);
  32409. + Set_MSR(padapter, _HW_STATE_STATION_);
  32410. +
  32411. +
  32412. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
  32413. + }
  32414. +
  32415. +#ifdef CONFIG_ANTENNA_DIVERSITY
  32416. + rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, _FALSE);
  32417. +#endif
  32418. +
  32419. + rtw_joinbss_reset(padapter);
  32420. +
  32421. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  32422. + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  32423. + pmlmeinfo->ERP_enable = 0;
  32424. + pmlmeinfo->WMM_enable = 0;
  32425. + pmlmeinfo->HT_enable = 0;
  32426. + pmlmeinfo->HT_caps_enable = 0;
  32427. + pmlmeinfo->HT_info_enable = 0;
  32428. + pmlmeinfo->agg_enable_bitmap = 0;
  32429. + pmlmeinfo->candidate_tid_bitmap = 0;
  32430. + pmlmeinfo->bwmode_updated = _FALSE;
  32431. + //pmlmeinfo->assoc_AP_vendor = maxAP;
  32432. +
  32433. + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength));
  32434. + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength;
  32435. +
  32436. + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength
  32437. + return H2C_PARAMETERS_ERROR;
  32438. +
  32439. + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength);
  32440. +
  32441. + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig;
  32442. + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork);
  32443. +
  32444. + //Check AP vendor to move rtw_joinbss_cmd()
  32445. + //pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength);
  32446. +
  32447. + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;)
  32448. + {
  32449. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);
  32450. +
  32451. + switch (pIE->ElementID)
  32452. + {
  32453. + case _VENDOR_SPECIFIC_IE_://Get WMM IE.
  32454. + if ( _rtw_memcmp(pIE->data, WMM_OUI, 4) )
  32455. + {
  32456. + pmlmeinfo->WMM_enable = 1;
  32457. + }
  32458. + break;
  32459. +
  32460. + case _HT_CAPABILITY_IE_: //Get HT Cap IE.
  32461. + pmlmeinfo->HT_caps_enable = 1;
  32462. + break;
  32463. +
  32464. + case _HT_EXTRA_INFO_IE_: //Get HT Info IE.
  32465. + pmlmeinfo->HT_info_enable = 1;
  32466. +
  32467. + //spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz
  32468. +//#if !defined(CONFIG_CONCURRENT_MODE) && !defined(CONFIG_DUALMAC_CONCURRENT)
  32469. +// if(pmlmeinfo->assoc_AP_vendor == ciscoAP)
  32470. +//#endif
  32471. + {
  32472. + struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data);
  32473. +
  32474. + if( pnetwork->Configuration.DSConfig > 14 )
  32475. + {
  32476. + if( pregpriv->cbw40_enable & BIT(1) )
  32477. + cbw40_enable = 1;
  32478. + }
  32479. + else
  32480. + if( pregpriv->cbw40_enable & BIT(0) )
  32481. + cbw40_enable = 1;
  32482. +
  32483. + if ((cbw40_enable) && (pht_info->infos[0] & BIT(2)))
  32484. + {
  32485. + //switch to the 40M Hz mode according to the AP
  32486. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  32487. + switch (pht_info->infos[0] & 0x3)
  32488. + {
  32489. + case 1:
  32490. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  32491. + break;
  32492. +
  32493. + case 3:
  32494. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  32495. + break;
  32496. +
  32497. + default:
  32498. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  32499. + break;
  32500. + }
  32501. +
  32502. + DBG_871X("set ch/bw before connected\n");
  32503. + }
  32504. + }
  32505. + break;
  32506. +
  32507. + default:
  32508. + break;
  32509. + }
  32510. +
  32511. + i += (pIE->Length + 2);
  32512. + }
  32513. +#if 0
  32514. + if (padapter->registrypriv.wifi_spec) {
  32515. + // for WiFi test, follow WMM test plan spec
  32516. + acparm = 0x002F431C; // VO
  32517. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));
  32518. + acparm = 0x005E541C; // VI
  32519. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));
  32520. + acparm = 0x0000A525; // BE
  32521. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));
  32522. + acparm = 0x0000A549; // BK
  32523. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));
  32524. +
  32525. + // for WiFi test, mixed mode with intel STA under bg mode throughput issue
  32526. + if (padapter->mlmepriv.htpriv.ht_option == _FALSE){
  32527. + acparm = 0x00004320;
  32528. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));
  32529. + }
  32530. + }
  32531. + else {
  32532. + acparm = 0x002F3217; // VO
  32533. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));
  32534. + acparm = 0x005E4317; // VI
  32535. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));
  32536. + acparm = 0x00105320; // BE
  32537. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));
  32538. + acparm = 0x0000A444; // BK
  32539. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));
  32540. + }
  32541. +#endif
  32542. +
  32543. + /* check channel, bandwidth, offset and switch */
  32544. +#ifdef CONFIG_DUALMAC_CONCURRENT
  32545. + if(dc_handle_join_request(padapter) == _FAIL) {
  32546. + DBG_871X("dc_handle_join_request fail !!!\n");
  32547. + return H2C_SUCCESS;
  32548. + }
  32549. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  32550. +#else //NON CONFIG_DUALMAC_CONCURRENT
  32551. + if(rtw_chk_start_clnt_join(padapter) == _FAIL) {
  32552. + report_join_res(padapter, (-4));
  32553. + return H2C_SUCCESS;
  32554. + }
  32555. +#endif
  32556. +
  32557. + //disable dynamic functions, such as high power, DIG
  32558. + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  32559. +
  32560. + //config the initial gain under linking, need to write the BB registers
  32561. +
  32562. + initialgain = 0x1E;
  32563. + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  32564. +
  32565. +
  32566. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
  32567. + join_type = 0;
  32568. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  32569. +
  32570. + //cancel link timer
  32571. + _cancel_timer_ex(&pmlmeext->link_timer);
  32572. +
  32573. + start_clnt_join(padapter);
  32574. +
  32575. + return H2C_SUCCESS;
  32576. +
  32577. +}
  32578. +
  32579. +u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
  32580. +{
  32581. + struct disconnect_parm *param = (struct disconnect_parm *)pbuf;
  32582. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32583. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32584. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  32585. + u8 val8;
  32586. +
  32587. + if (is_client_associated_to_ap(padapter))
  32588. + {
  32589. + issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms/100, 100);
  32590. + }
  32591. +
  32592. + //set_opmode_cmd(padapter, infra_client_with_mlme);
  32593. +
  32594. + //pmlmeinfo->state = WIFI_FW_NULL_STATE;
  32595. +
  32596. +
  32597. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
  32598. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
  32599. +
  32600. + //restore to initial setting.
  32601. + update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
  32602. +
  32603. + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  32604. + {
  32605. + //Stop BCN
  32606. + val8 = 0;
  32607. + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8));
  32608. + }
  32609. +
  32610. +
  32611. + //set MSR to no link state -> infra. mode
  32612. + Set_MSR(padapter, _HW_STATE_STATION_);
  32613. +
  32614. + pmlmeinfo->state = WIFI_FW_NULL_STATE;
  32615. +
  32616. +#ifdef CONFIG_DUALMAC_CONCURRENT
  32617. + dc_set_channel_bwmode_disconnect(padapter);
  32618. +#else
  32619. +#ifdef CONFIG_CONCURRENT_MODE
  32620. + if((check_buddy_fwstate(padapter, _FW_LINKED)) != _TRUE)
  32621. + {
  32622. +#endif //CONFIG_CONCURRENT_MODE
  32623. + //switch to the 20M Hz mode after disconnect
  32624. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  32625. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  32626. +
  32627. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  32628. +#ifdef CONFIG_CONCURRENT_MODE
  32629. + }
  32630. +#endif //CONFIG_CONCURRENT_MODE
  32631. +#endif //CONFIG_DUALMAC_CONCURRENT
  32632. +
  32633. + flush_all_cam_entry(padapter);
  32634. +
  32635. + _cancel_timer_ex(&pmlmeext->link_timer);
  32636. +
  32637. + rtw_free_uc_swdec_pending_queue(padapter);
  32638. +
  32639. + return H2C_SUCCESS;
  32640. +}
  32641. +
  32642. +int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
  32643. + u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)
  32644. +{
  32645. + int i, j;
  32646. + int scan_ch_num = 0;
  32647. + int set_idx;
  32648. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32649. +
  32650. + /* clear first */
  32651. + _rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel)*out_num);
  32652. +
  32653. + /* acquire channels from in */
  32654. + j = 0;
  32655. + for (i=0;i<in_num;i++) {
  32656. +
  32657. + if (0)
  32658. + DBG_871X(FUNC_ADPT_FMT" "CHAN_FMT"\n", FUNC_ADPT_ARG(padapter), CHAN_ARG(&in[i]));
  32659. +
  32660. + if(in[i].hw_value && !(in[i].flags & RTW_IEEE80211_CHAN_DISABLED)
  32661. + && (set_idx=rtw_ch_set_search_ch(pmlmeext->channel_set, in[i].hw_value)) >=0
  32662. + && rtw_mlme_band_check(padapter, in[i].hw_value) == _TRUE
  32663. + )
  32664. + {
  32665. + if (j >= out_num) {
  32666. + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" out_num:%u not enough\n",
  32667. + FUNC_ADPT_ARG(padapter), out_num);
  32668. + break;
  32669. + }
  32670. +
  32671. + _rtw_memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel));
  32672. +
  32673. + if(pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE)
  32674. + out[j].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
  32675. +
  32676. + j++;
  32677. + }
  32678. + if(j>=out_num)
  32679. + break;
  32680. + }
  32681. +
  32682. + /* if out is empty, use channel_set as default */
  32683. + if(j == 0) {
  32684. + for (i=0;i<pmlmeext->max_chan_nums;i++) {
  32685. +
  32686. + if (0)
  32687. + DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter), pmlmeext->channel_set[i].ChannelNum);
  32688. +
  32689. + if (rtw_mlme_band_check(padapter, pmlmeext->channel_set[i].ChannelNum) == _TRUE) {
  32690. +
  32691. + if (j >= out_num) {
  32692. + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" out_num:%u not enough\n",
  32693. + FUNC_ADPT_ARG(padapter), out_num);
  32694. + break;
  32695. + }
  32696. +
  32697. + out[j].hw_value = pmlmeext->channel_set[i].ChannelNum;
  32698. +
  32699. + if(pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE)
  32700. + out[j].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
  32701. +
  32702. + j++;
  32703. + }
  32704. + }
  32705. + }
  32706. +
  32707. + return j;
  32708. +}
  32709. +
  32710. +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf)
  32711. +{
  32712. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32713. + struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf;
  32714. + u8 bdelayscan = _FALSE;
  32715. + u8 val8;
  32716. + u32 initialgain;
  32717. + u32 i;
  32718. + u8 write_initial_gain = 1;
  32719. +
  32720. +#ifdef CONFIG_P2P
  32721. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  32722. +#endif
  32723. +
  32724. + if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE)
  32725. + {
  32726. +#ifdef CONFIG_CONCURRENT_MODE
  32727. + //for first time sitesurvey_cmd
  32728. + rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0);
  32729. +#endif //CONFIG_CONCURRENT_MODE
  32730. +
  32731. + pmlmeext->sitesurvey_res.state = SCAN_START;
  32732. + pmlmeext->sitesurvey_res.bss_cnt = 0;
  32733. + pmlmeext->sitesurvey_res.channel_idx = 0;
  32734. +
  32735. + for(i=0;i<RTW_SSID_SCAN_AMOUNT;i++){
  32736. + if(pparm->ssid[i].SsidLength) {
  32737. + _rtw_memcpy(pmlmeext->sitesurvey_res.ssid[i].Ssid, pparm->ssid[i].Ssid, IW_ESSID_MAX_SIZE);
  32738. + pmlmeext->sitesurvey_res.ssid[i].SsidLength= pparm->ssid[i].SsidLength;
  32739. + } else {
  32740. + pmlmeext->sitesurvey_res.ssid[i].SsidLength= 0;
  32741. + }
  32742. + }
  32743. +
  32744. + pmlmeext->sitesurvey_res.ch_num = rtw_scan_ch_decision(padapter
  32745. + , pmlmeext->sitesurvey_res.ch, RTW_CHANNEL_SCAN_AMOUNT
  32746. + , pparm->ch, pparm->ch_num
  32747. + );
  32748. +
  32749. + pmlmeext->sitesurvey_res.scan_mode = pparm->scan_mode;
  32750. +
  32751. +#ifdef CONFIG_DUALMAC_CONCURRENT
  32752. + bdelayscan = dc_handle_site_survey(padapter);
  32753. +#endif
  32754. +
  32755. + //issue null data if associating to the AP
  32756. + if (is_client_associated_to_ap(padapter) == _TRUE)
  32757. + {
  32758. + pmlmeext->sitesurvey_res.state = SCAN_TXNULL;
  32759. +
  32760. + issue_nulldata(padapter, NULL, 1, 3, 500);
  32761. +
  32762. +#ifdef CONFIG_CONCURRENT_MODE
  32763. + if(is_client_associated_to_ap(padapter->pbuddy_adapter) == _TRUE)
  32764. + {
  32765. + DBG_871X("adapter is scanning(buddy_adapter is linked), issue nulldata(pwrbit=1)\n");
  32766. +
  32767. + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);
  32768. + }
  32769. +#endif
  32770. + bdelayscan = _TRUE;
  32771. + }
  32772. +#ifdef CONFIG_CONCURRENT_MODE
  32773. + else if(is_client_associated_to_ap(padapter->pbuddy_adapter) == _TRUE)
  32774. + {
  32775. + #ifdef CONFIG_TDLS
  32776. + if(padapter->pbuddy_adapter->wdinfo.wfd_tdls_enable == 1)
  32777. + {
  32778. + issue_tunneled_probe_req(padapter->pbuddy_adapter);
  32779. + }
  32780. + #endif //CONFIG_TDLS
  32781. +
  32782. + pmlmeext->sitesurvey_res.state = SCAN_TXNULL;
  32783. +
  32784. + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);
  32785. +
  32786. + bdelayscan = _TRUE;
  32787. + }
  32788. +#endif
  32789. + if(bdelayscan)
  32790. + {
  32791. + //delay 50ms to protect nulldata(1).
  32792. + set_survey_timer(pmlmeext, 50);
  32793. + return H2C_SUCCESS;
  32794. + }
  32795. + }
  32796. +
  32797. + if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL))
  32798. + {
  32799. +#ifdef CONFIG_FIND_BEST_CHANNEL
  32800. +#if 0
  32801. + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
  32802. + pmlmeext->channel_set[i].rx_count = 0;
  32803. + }
  32804. +#endif
  32805. +#endif /* CONFIG_FIND_BEST_CHANNEL */
  32806. +
  32807. + //disable dynamic functions, such as high power, DIG
  32808. + Save_DM_Func_Flag(padapter);
  32809. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  32810. +
  32811. + //config the initial gain under scaning, need to write the BB registers
  32812. +
  32813. +#ifdef CONFIG_P2P
  32814. +#ifdef CONFIG_IOCTL_CFG80211
  32815. + if((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == _TRUE && pwdinfo->driver_interface == DRIVER_CFG80211 )
  32816. + {
  32817. + write_initial_gain = 0;
  32818. + }
  32819. + else
  32820. +#endif //CONFIG_IOCTL_CFG80211
  32821. + if ( !rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) )
  32822. + initialgain = 0x28;
  32823. + else
  32824. +#endif //CONFIG_P2P
  32825. + initialgain = 0x17;
  32826. +
  32827. + if(write_initial_gain == 1)
  32828. + rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
  32829. +
  32830. + //set MSR to no link state
  32831. + Set_MSR(padapter, _HW_STATE_NOLINK_);
  32832. +
  32833. + val8 = 1; //under site survey
  32834. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  32835. +
  32836. + pmlmeext->sitesurvey_res.state = SCAN_PROCESS;
  32837. + }
  32838. +
  32839. + site_survey(padapter);
  32840. +
  32841. + return H2C_SUCCESS;
  32842. +
  32843. +}
  32844. +
  32845. +u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf)
  32846. +{
  32847. + struct setauth_parm *pparm = (struct setauth_parm *)pbuf;
  32848. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32849. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32850. +
  32851. + if (pparm->mode < 4)
  32852. + {
  32853. + pmlmeinfo->auth_algo = pparm->mode;
  32854. + }
  32855. +
  32856. + return H2C_SUCCESS;
  32857. +}
  32858. +
  32859. +u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
  32860. +{
  32861. + unsigned short ctrl;
  32862. + struct setkey_parm *pparm = (struct setkey_parm *)pbuf;
  32863. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32864. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32865. + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  32866. +
  32867. + //main tx key for wep.
  32868. + if(pparm->set_tx)
  32869. + pmlmeinfo->key_index = pparm->keyid;
  32870. +
  32871. + //write cam
  32872. + ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
  32873. +
  32874. + write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
  32875. +
  32876. + //allow multicast packets to driver
  32877. + rtw_hal_set_hwreg(padapter, HW_VAR_ON_RCR_AM, null_addr);
  32878. +
  32879. + return H2C_SUCCESS;
  32880. +}
  32881. +
  32882. +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
  32883. +{
  32884. + u16 ctrl=0;
  32885. + u8 cam_id;//cam_entry
  32886. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  32887. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  32888. + struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf;
  32889. +#ifdef CONFIG_TDLS
  32890. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  32891. + struct sta_priv *pstapriv = &padapter->stapriv;
  32892. + struct sta_info *psta;
  32893. +#endif //CONFIG_TDLS
  32894. +
  32895. + //cam_entry:
  32896. + //0~3 for default key
  32897. +
  32898. + //for concurrent mode (ap+sta):
  32899. + //default key is disable, using sw encrypt/decrypt
  32900. + //cam_entry = 4 //for sta mode (macid=0)
  32901. + //cam_entry(macid+3) = 5 ~ N//for ap mode (aid=1~N, macid=2 ~N)
  32902. +
  32903. + //for concurrent mode (sta+sta):
  32904. + //default key is disable, using sw encrypt/decrypt
  32905. + //cam_entry = 4 //mapping to macid=0
  32906. + //cam_entry = 5 //mapping to macid=2
  32907. +
  32908. +#ifdef CONFIG_CONCURRENT_MODE
  32909. + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
  32910. + {
  32911. + struct sta_priv *pstapriv = &padapter->stapriv;
  32912. + struct sta_info *psta;
  32913. +
  32914. + psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
  32915. +
  32916. + if(psta && psta->mac_id==2)
  32917. + {
  32918. + cam_id = 5;
  32919. + }
  32920. + else
  32921. + {
  32922. + cam_id = 4;
  32923. + }
  32924. +/*
  32925. + if(padapter->iface_type > PRIMARY_IFACE)
  32926. + {
  32927. + cam_id = 5;
  32928. + }
  32929. + else
  32930. + {
  32931. + cam_id = 4;
  32932. + }
  32933. +*/
  32934. + }
  32935. +#else
  32936. + cam_id = 4;
  32937. +#endif
  32938. +
  32939. +
  32940. + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  32941. + {
  32942. +
  32943. + struct sta_info *psta;
  32944. + struct sta_priv *pstapriv = &padapter->stapriv;
  32945. +
  32946. + if(pparm->algorithm == _NO_PRIVACY_) // clear cam entry
  32947. + {
  32948. + clear_cam_entry(padapter, pparm->id);
  32949. + return H2C_SUCCESS_RSP;
  32950. + }
  32951. +
  32952. + psta = rtw_get_stainfo(pstapriv, pparm->addr);
  32953. + if(psta)
  32954. + {
  32955. + ctrl = (BIT(15) | ((pparm->algorithm) << 2));
  32956. +
  32957. + DBG_871X("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm);
  32958. +
  32959. + if((psta->mac_id<1) || (psta->mac_id>(NUM_STA-4)))
  32960. + {
  32961. + DBG_871X("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id);
  32962. + return H2C_REJECTED;
  32963. + }
  32964. +
  32965. + cam_id = (psta->mac_id + 3);//0~3 for default key, cmd_id=macid + 3, macid=aid+1;
  32966. +
  32967. + DBG_871X("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0],
  32968. + pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4],
  32969. + pparm->addr[5], cam_id);
  32970. +
  32971. + write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
  32972. +
  32973. + return H2C_SUCCESS_RSP;
  32974. +
  32975. + }
  32976. + else
  32977. + {
  32978. + DBG_871X("r871x_set_stakey_hdl(): sta has been free\n");
  32979. + return H2C_REJECTED;
  32980. + }
  32981. +
  32982. + }
  32983. +
  32984. + //below for sta mode
  32985. +
  32986. + if(pparm->algorithm == _NO_PRIVACY_) // clear cam entry
  32987. + {
  32988. + clear_cam_entry(padapter, pparm->id);
  32989. + return H2C_SUCCESS;
  32990. + }
  32991. +
  32992. + ctrl = BIT(15) | ((pparm->algorithm) << 2);
  32993. +
  32994. +#ifdef CONFIG_TDLS
  32995. + if(ptdlsinfo->clear_cam!=0){
  32996. + clear_cam_entry(padapter, ptdlsinfo->clear_cam);
  32997. + ptdlsinfo->clear_cam=0;
  32998. +
  32999. + return H2C_SUCCESS;
  33000. + }
  33001. +
  33002. + psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA
  33003. + if( psta->tdls_sta_state&TDLS_LINKED_STATE ){
  33004. + write_cam(padapter, psta->mac_id, ctrl, pparm->addr, pparm->key);
  33005. + }
  33006. + else
  33007. +#endif //CONFIG_TDLS
  33008. + write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
  33009. +
  33010. + pmlmeinfo->enc_algo = pparm->algorithm;
  33011. +
  33012. + return H2C_SUCCESS;
  33013. +}
  33014. +
  33015. +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)
  33016. +{
  33017. + struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf;
  33018. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33019. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33020. +
  33021. + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr);
  33022. +
  33023. + if(!psta)
  33024. + return H2C_SUCCESS;
  33025. +
  33026. +
  33027. + if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) ||
  33028. + ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  33029. + {
  33030. + //pmlmeinfo->ADDBA_retry_count = 0;
  33031. + //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid);
  33032. + //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid);
  33033. + issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid);
  33034. + //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO);
  33035. + _set_timer(&psta->addba_retry_timer, ADDBA_TO);
  33036. + }
  33037. +#ifdef CONFIG_TDLS
  33038. + else if((psta->tdls_sta_state & TDLS_LINKED_STATE)&&
  33039. + (psta->htpriv.ht_option==_TRUE) &&
  33040. + (psta->htpriv.ampdu_enable==_TRUE) )
  33041. + {
  33042. + issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid);
  33043. + //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO);
  33044. + _set_timer(&psta->addba_retry_timer, ADDBA_TO);
  33045. + }
  33046. +#endif //CONFIG
  33047. + else
  33048. + {
  33049. + psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid);
  33050. + }
  33051. +
  33052. + return H2C_SUCCESS;
  33053. +}
  33054. +
  33055. +u8 set_tx_beacon_cmd(_adapter* padapter)
  33056. +{
  33057. + struct cmd_obj *ph2c;
  33058. + struct Tx_Beacon_param *ptxBeacon_parm;
  33059. + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
  33060. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33061. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33062. + u8 res = _SUCCESS;
  33063. + int len_diff = 0;
  33064. +
  33065. +_func_enter_;
  33066. +
  33067. + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  33068. + {
  33069. + res= _FAIL;
  33070. + goto exit;
  33071. + }
  33072. +
  33073. + if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL)
  33074. + {
  33075. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  33076. + res= _FAIL;
  33077. + goto exit;
  33078. + }
  33079. +
  33080. + _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));
  33081. +
  33082. + len_diff = update_hidden_ssid(
  33083. + ptxBeacon_parm->network.IEs+_BEACON_IE_OFFSET_
  33084. + , ptxBeacon_parm->network.IELength-_BEACON_IE_OFFSET_
  33085. + , pmlmeinfo->hidden_ssid_mode
  33086. + );
  33087. + ptxBeacon_parm->network.IELength += len_diff;
  33088. +
  33089. + init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon));
  33090. +
  33091. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  33092. +
  33093. +
  33094. +exit:
  33095. +
  33096. +_func_exit_;
  33097. +
  33098. + return res;
  33099. +}
  33100. +
  33101. +
  33102. +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf)
  33103. +{
  33104. + u8 evt_code, evt_seq;
  33105. + u16 evt_sz;
  33106. + uint *peventbuf;
  33107. + void (*event_callback)(_adapter *dev, u8 *pbuf);
  33108. + struct evt_priv *pevt_priv = &(padapter->evtpriv);
  33109. +
  33110. + peventbuf = (uint*)pbuf;
  33111. + evt_sz = (u16)(*peventbuf&0xffff);
  33112. + evt_seq = (u8)((*peventbuf>>24)&0x7f);
  33113. + evt_code = (u8)((*peventbuf>>16)&0xff);
  33114. +
  33115. +
  33116. + #ifdef CHECK_EVENT_SEQ
  33117. + // checking event sequence...
  33118. + if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) )
  33119. + {
  33120. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("Evetn Seq Error! %d vs %d\n", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f)));
  33121. +
  33122. + pevt_priv->event_seq = (evt_seq+1)&0x7f;
  33123. +
  33124. + goto _abort_event_;
  33125. + }
  33126. + #endif
  33127. +
  33128. + // checking if event code is valid
  33129. + if (evt_code >= MAX_C2HEVT)
  33130. + {
  33131. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent Code(%d) mismatch!\n", evt_code));
  33132. + goto _abort_event_;
  33133. + }
  33134. +
  33135. + // checking if event size match the event parm size
  33136. + if ((wlanevents[evt_code].parmsize != 0) &&
  33137. + (wlanevents[evt_code].parmsize != evt_sz))
  33138. + {
  33139. +
  33140. + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent(%d) Parm Size mismatch (%d vs %d)!\n",
  33141. + evt_code, wlanevents[evt_code].parmsize, evt_sz));
  33142. + goto _abort_event_;
  33143. +
  33144. + }
  33145. +
  33146. + ATOMIC_INC(&pevt_priv->event_seq);
  33147. +
  33148. + peventbuf += 2;
  33149. +
  33150. + if(peventbuf)
  33151. + {
  33152. + event_callback = wlanevents[evt_code].event_callback;
  33153. + event_callback(padapter, (u8*)peventbuf);
  33154. +
  33155. + pevt_priv->evt_done_cnt++;
  33156. + }
  33157. +
  33158. +
  33159. +_abort_event_:
  33160. +
  33161. +
  33162. + return H2C_SUCCESS;
  33163. +
  33164. +}
  33165. +
  33166. +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf)
  33167. +{
  33168. + if(!pbuf)
  33169. + return H2C_PARAMETERS_ERROR;
  33170. +
  33171. + return H2C_SUCCESS;
  33172. +}
  33173. +
  33174. +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)
  33175. +{
  33176. + if(send_beacon(padapter)==_FAIL)
  33177. + {
  33178. + DBG_871X("issue_beacon, fail!\n");
  33179. + return H2C_PARAMETERS_ERROR;
  33180. + }
  33181. +#ifdef CONFIG_AP_MODE
  33182. + else //tx bc/mc frames after update TIM
  33183. + {
  33184. + _irqL irqL;
  33185. + struct sta_info *psta_bmc;
  33186. + _list *xmitframe_plist, *xmitframe_phead;
  33187. + struct xmit_frame *pxmitframe=NULL;
  33188. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  33189. + struct sta_priv *pstapriv = &padapter->stapriv;
  33190. +
  33191. + //for BC/MC Frames
  33192. + psta_bmc = rtw_get_bcmc_stainfo(padapter);
  33193. + if(!psta_bmc)
  33194. + return H2C_SUCCESS;
  33195. +
  33196. + if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))
  33197. + {
  33198. +#ifndef CONFIG_PCI_HCI
  33199. + rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows
  33200. +#endif
  33201. + //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  33202. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  33203. +
  33204. + xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
  33205. + xmitframe_plist = get_next(xmitframe_phead);
  33206. +
  33207. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  33208. + {
  33209. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  33210. +
  33211. + xmitframe_plist = get_next(xmitframe_plist);
  33212. +
  33213. + rtw_list_delete(&pxmitframe->list);
  33214. +
  33215. + psta_bmc->sleepq_len--;
  33216. + if(psta_bmc->sleepq_len>0)
  33217. + pxmitframe->attrib.mdata = 1;
  33218. + else
  33219. + pxmitframe->attrib.mdata = 0;
  33220. +
  33221. + pxmitframe->attrib.triggered=1;
  33222. +
  33223. + pxmitframe->attrib.qsel = 0x11;//HIQ
  33224. +
  33225. +#if 0
  33226. + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  33227. + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  33228. + {
  33229. + rtw_os_xmit_complete(padapter, pxmitframe);
  33230. + }
  33231. + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  33232. +
  33233. +#endif
  33234. + rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  33235. +
  33236. + //pstapriv->tim_bitmap &= ~BIT(0);
  33237. +
  33238. + }
  33239. +
  33240. + //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  33241. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  33242. +
  33243. + }
  33244. +
  33245. + }
  33246. +#endif
  33247. +
  33248. + return H2C_SUCCESS;
  33249. +
  33250. +}
  33251. +
  33252. +void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
  33253. +{
  33254. + u8 network_type,rate_len, total_rate_len,remainder_rate_len;
  33255. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  33256. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33257. + u8 erpinfo=0x4;
  33258. +
  33259. + //DBG_871X("%s\n", __FUNCTION__);
  33260. +
  33261. + if(pmlmeext->cur_channel >= 36)
  33262. + {
  33263. + network_type = WIRELESS_11A;
  33264. + total_rate_len = IEEE80211_NUM_OFDM_RATESLEN;
  33265. + DBG_871X("%s(): change to 5G Band\n",__FUNCTION__);
  33266. + rtw_remove_bcn_ie(padapter, pnetwork, _ERPINFO_IE_);
  33267. + }
  33268. + else
  33269. + {
  33270. + network_type = WIRELESS_11BG;
  33271. + total_rate_len = IEEE80211_CCK_RATE_LEN+IEEE80211_NUM_OFDM_RATESLEN;
  33272. + DBG_871X("%s(): change to 2.4G Band\n",__FUNCTION__);
  33273. + rtw_add_bcn_ie(padapter, pnetwork, _ERPINFO_IE_, &erpinfo, 1);
  33274. + }
  33275. +
  33276. + rtw_set_supported_rate(pnetwork->SupportedRates, network_type);
  33277. +
  33278. + UpdateBrateTbl(padapter, pnetwork->SupportedRates);
  33279. + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates);
  33280. +
  33281. + if(total_rate_len > 8)
  33282. + {
  33283. + rate_len = 8;
  33284. + remainder_rate_len = total_rate_len - 8;
  33285. + }
  33286. + else
  33287. + {
  33288. + rate_len = total_rate_len;
  33289. + remainder_rate_len = 0;
  33290. + }
  33291. +
  33292. + rtw_add_bcn_ie(padapter, pnetwork, _SUPPORTEDRATES_IE_, pnetwork->SupportedRates, rate_len);
  33293. +
  33294. + if(remainder_rate_len)
  33295. + {
  33296. + rtw_add_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_, (pnetwork->SupportedRates+8), remainder_rate_len);
  33297. + }
  33298. + else
  33299. + {
  33300. + rtw_remove_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_);
  33301. + }
  33302. +}
  33303. +
  33304. +
  33305. +#ifdef CONFIG_DUALMAC_CONCURRENT
  33306. +void dc_SelectChannel(_adapter *padapter, unsigned char channel)
  33307. +{
  33308. + PADAPTER ptarget_adapter;
  33309. +
  33310. + if( (padapter->pbuddy_adapter != NULL) &&
  33311. + (padapter->DualMacConcurrent == _TRUE) &&
  33312. + (padapter->adapter_type == SECONDARY_ADAPTER))
  33313. + {
  33314. + // only mac0 could control BB&RF
  33315. + ptarget_adapter = padapter->pbuddy_adapter;
  33316. + }
  33317. + else
  33318. + {
  33319. + ptarget_adapter = padapter;
  33320. + }
  33321. +
  33322. + _enter_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setch_mutex), NULL);
  33323. +
  33324. + rtw_hal_set_chan(ptarget_adapter, channel);
  33325. +
  33326. + _exit_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setch_mutex), NULL);
  33327. +}
  33328. +
  33329. +void dc_SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset)
  33330. +{
  33331. + PADAPTER ptarget_adapter;
  33332. +
  33333. + if( (padapter->pbuddy_adapter != NULL) &&
  33334. + (padapter->DualMacConcurrent == _TRUE) &&
  33335. + (padapter->adapter_type == SECONDARY_ADAPTER))
  33336. + {
  33337. + // only mac0 could control BB&RF
  33338. + ptarget_adapter = padapter->pbuddy_adapter;
  33339. + }
  33340. + else
  33341. + {
  33342. + ptarget_adapter = padapter;
  33343. + }
  33344. +
  33345. + _enter_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setbw_mutex), NULL);
  33346. +
  33347. + rtw_hal_set_bwmode(ptarget_adapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset);
  33348. +
  33349. + _exit_critical_mutex(&(adapter_to_dvobj(ptarget_adapter)->setbw_mutex), NULL);
  33350. +}
  33351. +
  33352. +void dc_set_channel_bwmode_disconnect(_adapter *padapter)
  33353. +{
  33354. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33355. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33356. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33357. +
  33358. + if(pbuddy_adapter != NULL &&
  33359. + padapter->DualMacConcurrent == _TRUE)
  33360. + {
  33361. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33362. + if((check_fwstate(pbuddy_mlmepriv, _FW_LINKED)) != _TRUE)
  33363. + {
  33364. + //switch to the 20M Hz mode after disconnect
  33365. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  33366. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  33367. +
  33368. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  33369. + }
  33370. + }
  33371. + else
  33372. + {
  33373. + //switch to the 20M Hz mode after disconnect
  33374. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  33375. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  33376. +
  33377. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  33378. + }
  33379. +}
  33380. +
  33381. +u8 dc_handle_join_request(_adapter *padapter)
  33382. +{
  33383. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33384. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33385. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
  33386. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33387. + struct mlme_ext_priv *pbuddy_mlmeext = NULL;
  33388. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33389. + u8 ret = _SUCCESS;
  33390. +
  33391. + if(pbuddy_adapter != NULL &&
  33392. + padapter->DualMacConcurrent == _TRUE)
  33393. + {
  33394. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33395. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33396. +
  33397. + if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel ||
  33398. + pmlmeext->cur_bwmode != pbuddy_mlmeext->cur_bwmode ||
  33399. + pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset)
  33400. + {
  33401. + if((check_fwstate(pbuddy_mlmepriv, WIFI_AP_STATE)) == _TRUE)
  33402. + {
  33403. + //issue deauth to all stas if if2 is at ap mode
  33404. + rtw_sta_flush(pbuddy_adapter);
  33405. +
  33406. + //rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0);
  33407. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_CHECK_TXBUF, 0);
  33408. + }
  33409. + else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE)
  33410. + {
  33411. + if(pmlmeext->cur_channel == pbuddy_mlmeext->cur_channel)
  33412. + {
  33413. + // HT_CHANNEL_WIDTH_40 or HT_CHANNEL_WIDTH_20 but channel offset is different
  33414. + if((pmlmeext->cur_bwmode == pbuddy_mlmeext->cur_bwmode) &&
  33415. + (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset) )
  33416. + {
  33417. + report_join_res(padapter, -4);
  33418. + ret = _FAIL;
  33419. + }
  33420. + }
  33421. + else
  33422. + {
  33423. + report_join_res(padapter, -4);
  33424. + ret = _FAIL;
  33425. + }
  33426. + }
  33427. + }
  33428. + else if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE)
  33429. + {
  33430. + issue_nulldata(pbuddy_adapter, NULL, 1, 0, 0);
  33431. + }
  33432. + }
  33433. +
  33434. + return ret;
  33435. +}
  33436. +
  33437. +void dc_handle_join_done(_adapter *padapter, u8 join_res)
  33438. +{
  33439. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33440. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33441. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33442. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33443. + struct mlme_ext_priv *pbuddy_mlmeext = NULL;
  33444. + struct mlme_ext_info *pbuddy_mlmeinfo = NULL;
  33445. + WLAN_BSSID_EX *pbuddy_network_mlmeext = NULL;
  33446. + u8 change_band = _FALSE;
  33447. +
  33448. +
  33449. + if(pbuddy_adapter != NULL &&
  33450. + padapter->DualMacConcurrent == _TRUE)
  33451. + {
  33452. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33453. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33454. + pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info);
  33455. + pbuddy_network_mlmeext = &(pbuddy_mlmeinfo->network);
  33456. +
  33457. + if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  33458. + check_fwstate(pbuddy_mlmepriv, _FW_LINKED))
  33459. + {
  33460. + //restart and update beacon
  33461. + DBG_871X("after join, current adapter, CH=%d, BW=%d, offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  33462. +
  33463. + if(join_res >= 0)
  33464. + {
  33465. + u8 *p;
  33466. + int ie_len;
  33467. + struct HT_info_element *pht_info=NULL;
  33468. +
  33469. + if((pbuddy_mlmeext->cur_channel <= 14 && pmlmeext->cur_channel >= 36) ||
  33470. + (pbuddy_mlmeext->cur_channel >= 36 && pmlmeext->cur_channel <= 14))
  33471. + {
  33472. + change_band = _TRUE;
  33473. + }
  33474. +
  33475. + //sync channel/bwmode/ch_offset with another adapter
  33476. + pbuddy_mlmeext->cur_channel = pmlmeext->cur_channel;
  33477. +
  33478. + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  33479. + {
  33480. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33481. + if( p && ie_len)
  33482. + {
  33483. + pht_info = (struct HT_info_element *)(p+2);
  33484. + pht_info->infos[0] &= ~(BIT(0)|BIT(1)); //no secondary channel is present
  33485. + }
  33486. +
  33487. + if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  33488. + {
  33489. + pbuddy_mlmeext->cur_ch_offset = pmlmeext->cur_ch_offset;
  33490. +
  33491. + //to update cur_ch_offset value in beacon
  33492. + if( pht_info )
  33493. + {
  33494. + switch(pmlmeext->cur_ch_offset)
  33495. + {
  33496. + case HAL_PRIME_CHNL_OFFSET_LOWER:
  33497. + pht_info->infos[0] |= 0x1;
  33498. + break;
  33499. + case HAL_PRIME_CHNL_OFFSET_UPPER:
  33500. + pht_info->infos[0] |= 0x3;
  33501. + break;
  33502. + case HAL_PRIME_CHNL_OFFSET_DONT_CARE:
  33503. + default:
  33504. + break;
  33505. + }
  33506. + }
  33507. + }
  33508. + else if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20)
  33509. + {
  33510. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  33511. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  33512. +
  33513. + if(pmlmeext->cur_channel>0 && pmlmeext->cur_channel<5)
  33514. + {
  33515. + if(pht_info)
  33516. + pht_info->infos[0] |= 0x1;
  33517. +
  33518. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  33519. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  33520. + }
  33521. +
  33522. + if(pmlmeext->cur_channel>7 && pmlmeext->cur_channel<(14+1))
  33523. + {
  33524. + if(pht_info)
  33525. + pht_info->infos[0] |= 0x3;
  33526. +
  33527. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  33528. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  33529. + }
  33530. +
  33531. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  33532. + }
  33533. + }
  33534. +
  33535. + // to update channel value in beacon
  33536. + pbuddy_network_mlmeext->Configuration.DSConfig = pmlmeext->cur_channel;
  33537. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33538. + if(p && ie_len>0)
  33539. + *(p + 2) = pmlmeext->cur_channel;
  33540. +
  33541. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33542. + if( p && ie_len)
  33543. + {
  33544. + pht_info = (struct HT_info_element *)(p+2);
  33545. + pht_info->primary_channel = pmlmeext->cur_channel;
  33546. + }
  33547. +
  33548. + // update mlmepriv's cur_network
  33549. + _rtw_memcpy(&pbuddy_mlmepriv->cur_network.network, pbuddy_network_mlmeext, pbuddy_network_mlmeext->Length);
  33550. + }
  33551. + else
  33552. + {
  33553. + // switch back to original channel/bwmode/ch_offset;
  33554. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  33555. + }
  33556. +
  33557. + DBG_871X("after join, another adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  33558. +
  33559. + if(change_band == _TRUE)
  33560. + change_band_update_ie(pbuddy_adapter, pbuddy_network_mlmeext);
  33561. +
  33562. + DBG_871X("update pbuddy_adapter's beacon\n");
  33563. +
  33564. + update_beacon(pbuddy_adapter, 0, NULL, _TRUE);
  33565. + }
  33566. + else if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE)
  33567. + {
  33568. + if((pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) &&
  33569. + (pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20))
  33570. + {
  33571. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  33572. + }
  33573. +
  33574. + issue_nulldata(pbuddy_adapter, NULL, 0, 0, 0);
  33575. + }
  33576. + }
  33577. +}
  33578. +
  33579. +sint dc_check_fwstate(_adapter *padapter, sint fw_state)
  33580. +{
  33581. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33582. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33583. +
  33584. + if(padapter->pbuddy_adapter != NULL &&
  33585. + padapter->DualMacConcurrent == _TRUE)
  33586. +
  33587. + {
  33588. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33589. +
  33590. + return check_fwstate(pbuddy_mlmepriv, fw_state);
  33591. + }
  33592. +
  33593. + return _FALSE;
  33594. +}
  33595. +
  33596. +u8 dc_handle_site_survey(_adapter *padapter)
  33597. +{
  33598. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33599. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33600. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33601. +
  33602. + // only mac0 can do scan request, help issue nulldata(1) for mac1
  33603. + if(pbuddy_adapter != NULL &&
  33604. + padapter->DualMacConcurrent == _TRUE)
  33605. + {
  33606. + if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE)
  33607. + {
  33608. + pmlmeext->sitesurvey_res.state = SCAN_TXNULL;
  33609. +
  33610. + issue_nulldata(pbuddy_adapter, NULL, 1, 2, 0);
  33611. +
  33612. + return _TRUE;
  33613. + }
  33614. + }
  33615. +
  33616. + return _FALSE;
  33617. +}
  33618. +
  33619. +void dc_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
  33620. +{
  33621. + if(padapter->pbuddy_adapter != NULL &&
  33622. + padapter->DualMacConcurrent == _TRUE)
  33623. + {
  33624. + report_survey_event(padapter->pbuddy_adapter, precv_frame);
  33625. + }
  33626. +}
  33627. +
  33628. +void dc_set_channel_bwmode_survey_done(_adapter *padapter)
  33629. +{
  33630. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  33631. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  33632. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33633. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33634. + struct mlme_ext_priv *pbuddy_mlmeext = NULL;
  33635. + struct mlme_ext_info *pbuddy_mlmeinfo = NULL;
  33636. + u8 cur_channel;
  33637. + u8 cur_bwmode;
  33638. + u8 cur_ch_offset;
  33639. +
  33640. + if(pbuddy_adapter != NULL &&
  33641. + padapter->DualMacConcurrent == _TRUE)
  33642. + {
  33643. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33644. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33645. + pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info);
  33646. +
  33647. + if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED))
  33648. + {
  33649. + if(check_fwstate(pmlmepriv, _FW_LINKED) &&
  33650. + (pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40))
  33651. + {
  33652. + cur_channel = pmlmeext->cur_channel;
  33653. + cur_bwmode = pmlmeext->cur_bwmode;
  33654. + cur_ch_offset = pmlmeext->cur_ch_offset;
  33655. + }
  33656. + else
  33657. + {
  33658. + cur_channel = pbuddy_mlmeext->cur_channel;
  33659. + cur_bwmode = pbuddy_mlmeext->cur_bwmode;
  33660. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  33661. + }
  33662. + }
  33663. + else
  33664. + {
  33665. + cur_channel = pmlmeext->cur_channel;
  33666. + cur_bwmode = pmlmeext->cur_bwmode;
  33667. + cur_ch_offset = pmlmeext->cur_ch_offset;
  33668. + }
  33669. +
  33670. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  33671. +
  33672. + if (is_client_associated_to_ap(pbuddy_adapter) == _TRUE)
  33673. + {
  33674. + //issue null data
  33675. + issue_nulldata(pbuddy_adapter, NULL, 0, 0, 0);
  33676. + }
  33677. +
  33678. + if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  33679. + check_fwstate(pbuddy_mlmepriv, _FW_LINKED))
  33680. + {
  33681. +
  33682. + DBG_871X("survey done, current CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  33683. +
  33684. + DBG_871X("restart pbuddy_adapter's beacon\n");
  33685. +
  33686. + update_beacon(pbuddy_adapter, 0, NULL, _TRUE);
  33687. + }
  33688. + }
  33689. + else
  33690. + {
  33691. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  33692. + }
  33693. +}
  33694. +
  33695. +void dc_set_ap_channel_bandwidth(_adapter *padapter, u8 channel, u8 channel_offset, u8 bwmode)
  33696. +{
  33697. + u8 *p;
  33698. + u8 val8, cur_channel, cur_bwmode, cur_ch_offset, change_band;
  33699. + int ie_len;
  33700. + struct registry_priv *pregpriv = &padapter->registrypriv;
  33701. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  33702. + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  33703. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  33704. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  33705. + struct HT_info_element *pht_info=NULL;
  33706. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  33707. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33708. + struct mlme_ext_priv *pbuddy_mlmeext = NULL;
  33709. +
  33710. + DBG_871X("dualmac_concurrent_ap_set_channel_bwmode ==>\n");
  33711. +
  33712. + cur_channel = channel;
  33713. + cur_bwmode = bwmode;
  33714. + cur_ch_offset = channel_offset;
  33715. + change_band = _FALSE;
  33716. +
  33717. + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33718. + if( p && ie_len)
  33719. + {
  33720. + pht_info = (struct HT_info_element *)(p+2);
  33721. + }
  33722. +
  33723. + if(pbuddy_adapter != NULL &&
  33724. + padapter->DualMacConcurrent == _TRUE)
  33725. + {
  33726. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33727. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33728. +
  33729. + if(!check_fwstate(pbuddy_mlmepriv, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY))
  33730. + {
  33731. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  33732. + }
  33733. + else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED)==_TRUE)
  33734. + {
  33735. + //To sync cur_channel/cur_bwmode/cur_ch_offset with another adapter
  33736. + DBG_871X("Another iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n");
  33737. + DBG_871X("Another adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  33738. + DBG_871X("Current adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  33739. +
  33740. + cur_channel = pbuddy_mlmeext->cur_channel;
  33741. + if(cur_bwmode == HT_CHANNEL_WIDTH_40)
  33742. + {
  33743. + if(pht_info)
  33744. + pht_info->infos[0] &= ~(BIT(0)|BIT(1));
  33745. +
  33746. + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  33747. + {
  33748. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  33749. +
  33750. + //to update cur_ch_offset value in beacon
  33751. + if(pht_info)
  33752. + {
  33753. + switch(cur_ch_offset)
  33754. + {
  33755. + case HAL_PRIME_CHNL_OFFSET_LOWER:
  33756. + pht_info->infos[0] |= 0x1;
  33757. + break;
  33758. + case HAL_PRIME_CHNL_OFFSET_UPPER:
  33759. + pht_info->infos[0] |= 0x3;
  33760. + break;
  33761. + case HAL_PRIME_CHNL_OFFSET_DONT_CARE:
  33762. + default:
  33763. + break;
  33764. + }
  33765. + }
  33766. + }
  33767. + else if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20)
  33768. + {
  33769. + cur_bwmode = HT_CHANNEL_WIDTH_20;
  33770. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  33771. +
  33772. + if(cur_channel>0 && cur_channel<5)
  33773. + {
  33774. + if(pht_info)
  33775. + pht_info->infos[0] |= 0x1;
  33776. +
  33777. + cur_bwmode = HT_CHANNEL_WIDTH_40;
  33778. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  33779. + }
  33780. +
  33781. + if(cur_channel>7 && cur_channel<(14+1))
  33782. + {
  33783. + if(pht_info)
  33784. + pht_info->infos[0] |= 0x3;
  33785. +
  33786. + cur_bwmode = HT_CHANNEL_WIDTH_40;
  33787. + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  33788. + }
  33789. +
  33790. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  33791. + }
  33792. + }
  33793. +
  33794. + // to update channel value in beacon
  33795. + pnetwork->Configuration.DSConfig = cur_channel;
  33796. + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33797. + if(p && ie_len>0)
  33798. + *(p + 2) = cur_channel;
  33799. +
  33800. + if(pht_info)
  33801. + pht_info->primary_channel = cur_channel;
  33802. + }
  33803. + }
  33804. + else
  33805. + {
  33806. + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);
  33807. + }
  33808. +
  33809. + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);
  33810. +
  33811. + if((channel <= 14 && cur_channel >= 36) ||
  33812. + (channel >= 36 && cur_channel <= 14))
  33813. + {
  33814. + change_band = _TRUE;
  33815. + }
  33816. +
  33817. + pmlmeext->cur_channel = cur_channel;
  33818. + pmlmeext->cur_bwmode = cur_bwmode;
  33819. + pmlmeext->cur_ch_offset = cur_ch_offset;
  33820. +
  33821. + if(change_band == _TRUE)
  33822. + change_band_update_ie(padapter, pnetwork);
  33823. +
  33824. + DBG_871X("dualmac_concurrent_ap_set_channel_bwmode <==\n");
  33825. +}
  33826. +
  33827. +void dc_resume_xmit(_adapter *padapter)
  33828. +{
  33829. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33830. +
  33831. + if(pbuddy_adapter != NULL &&
  33832. + padapter->DualMacConcurrent == _TRUE)
  33833. + {
  33834. + DBG_871X("dc_resume_xmit, resume pbuddy_adapter Tx\n");
  33835. + rtw_os_xmit_schedule(pbuddy_adapter);
  33836. + }
  33837. +}
  33838. +
  33839. +u8 dc_check_xmit(_adapter *padapter)
  33840. +{
  33841. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  33842. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  33843. +
  33844. + if(pbuddy_adapter != NULL &&
  33845. + padapter->DualMacConcurrent == _TRUE)
  33846. + {
  33847. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33848. + if (check_fwstate(pbuddy_mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  33849. + {
  33850. + DBG_871X("dc_check_xmit pbuddy_adapter is under survey or under linking\n");
  33851. + return _FALSE;
  33852. + }
  33853. + }
  33854. +
  33855. + return _TRUE;
  33856. +}
  33857. +#endif
  33858. +
  33859. +#ifdef CONFIG_CONCURRENT_MODE
  33860. +sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state)
  33861. +{
  33862. + PADAPTER pbuddy_adapter;
  33863. + struct mlme_ext_priv *pbuddy_mlmeext;
  33864. + struct mlme_ext_info *pbuddy_mlmeinfo;
  33865. +
  33866. + if(padapter == NULL)
  33867. + return _FALSE;
  33868. +
  33869. + pbuddy_adapter = padapter->pbuddy_adapter;
  33870. +
  33871. + if(pbuddy_adapter == NULL)
  33872. + return _FALSE;
  33873. +
  33874. +
  33875. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33876. + pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info);
  33877. +
  33878. + if((pbuddy_mlmeinfo->state&0x03) == state)
  33879. + return _TRUE;
  33880. +
  33881. + return _FALSE;
  33882. +
  33883. +}
  33884. +
  33885. +void concurrent_chk_joinbss_done(_adapter *padapter, int join_res)
  33886. +{
  33887. + struct mlme_ext_priv *pmlmeext;
  33888. + struct mlme_ext_info *pmlmeinfo;
  33889. + PADAPTER pbuddy_adapter;
  33890. + struct mlme_priv *pbuddy_mlmepriv;
  33891. + struct mlme_ext_priv *pbuddy_mlmeext;
  33892. + struct mlme_ext_info *pbuddy_mlmeinfo;
  33893. + WLAN_BSSID_EX *pbuddy_network_mlmeext;
  33894. +
  33895. + pmlmeext = &padapter->mlmeextpriv;
  33896. + pmlmeinfo = &(pmlmeext->mlmext_info);
  33897. +
  33898. +
  33899. + if(!rtw_buddy_adapter_up(padapter))
  33900. + {
  33901. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  33902. + return;
  33903. + }
  33904. +
  33905. + pbuddy_adapter = padapter->pbuddy_adapter;
  33906. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  33907. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  33908. + pbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info);
  33909. + pbuddy_network_mlmeext = &(pbuddy_mlmeinfo->network);
  33910. +
  33911. + if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
  33912. + check_fwstate(pbuddy_mlmepriv, _FW_LINKED))
  33913. + {
  33914. + //restart and update beacon
  33915. +
  33916. + DBG_871X("after join,primary adapter, CH=%d, BW=%d, offset=%d\n"
  33917. + , pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  33918. +
  33919. +
  33920. + if(join_res >= 0)
  33921. + {
  33922. + u8 *p;
  33923. + int ie_len;
  33924. + u8 change_band = _FALSE;
  33925. + struct HT_info_element *pht_info=NULL;
  33926. +
  33927. + if((pmlmeext->cur_channel <= 14 && pbuddy_mlmeext->cur_channel >= 36) ||
  33928. + (pmlmeext->cur_channel >= 36 && pbuddy_mlmeext->cur_channel <= 14))
  33929. + change_band = _TRUE;
  33930. +
  33931. + //sync channel/bwmode/ch_offset with primary adapter
  33932. + pbuddy_mlmeext->cur_channel = pmlmeext->cur_channel;
  33933. + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  33934. + {
  33935. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  33936. + if( p && ie_len)
  33937. + {
  33938. + pht_info = (struct HT_info_element *)(p+2);
  33939. + pht_info->infos[0] &= ~(BIT(0)|BIT(1)); //no secondary channel is present
  33940. + }
  33941. +
  33942. + if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  33943. + {
  33944. + pbuddy_mlmeext->cur_ch_offset = pmlmeext->cur_ch_offset;
  33945. +
  33946. + //to update cur_ch_offset value in beacon
  33947. + if( pht_info )
  33948. + {
  33949. + switch(pmlmeext->cur_ch_offset)
  33950. + {
  33951. + case HAL_PRIME_CHNL_OFFSET_LOWER:
  33952. + pht_info->infos[0] |= 0x1;
  33953. + break;
  33954. + case HAL_PRIME_CHNL_OFFSET_UPPER:
  33955. + pht_info->infos[0] |= 0x3;
  33956. + break;
  33957. + case HAL_PRIME_CHNL_OFFSET_DONT_CARE:
  33958. + default:
  33959. + break;
  33960. + }
  33961. +
  33962. + }
  33963. +
  33964. + }
  33965. + else if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20)
  33966. + {
  33967. + if(pmlmeext->cur_channel>=1 && pmlmeext->cur_channel<=4)
  33968. + {
  33969. + if(pht_info)
  33970. + pht_info->infos[0] |= HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE;
  33971. +
  33972. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  33973. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  33974. + }
  33975. + else if(pmlmeext->cur_channel>=5 && pmlmeext->cur_channel<=14)
  33976. + {
  33977. + if(pht_info)
  33978. + pht_info->infos[0] |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW;
  33979. +
  33980. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  33981. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  33982. + }
  33983. + else
  33984. + {
  33985. + switch(pmlmeext->cur_channel)
  33986. + {
  33987. + case 36:
  33988. + case 44:
  33989. + case 52:
  33990. + case 60:
  33991. + case 100:
  33992. + case 108:
  33993. + case 116:
  33994. + case 124:
  33995. + case 132:
  33996. + case 149:
  33997. + case 157:
  33998. + {
  33999. + if(pht_info)
  34000. + pht_info->infos[0] |= HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE;
  34001. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  34002. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  34003. + break;
  34004. + }
  34005. + case 40:
  34006. + case 48:
  34007. + case 56:
  34008. + case 64:
  34009. + case 104:
  34010. + case 112:
  34011. + case 120:
  34012. + case 128:
  34013. + case 136:
  34014. + case 153:
  34015. + case 161:
  34016. + {
  34017. + if(pht_info)
  34018. + pht_info->infos[0] |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW;
  34019. +
  34020. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  34021. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  34022. + break;
  34023. + }
  34024. + default:
  34025. + if(pht_info)
  34026. + pht_info->infos[0] &= ~HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW;
  34027. + pbuddy_mlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
  34028. + pbuddy_mlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  34029. + break;
  34030. +
  34031. + }
  34032. +
  34033. + }
  34034. +
  34035. + }
  34036. +
  34037. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  34038. +
  34039. + }
  34040. + else
  34041. + {
  34042. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  34043. + }
  34044. +
  34045. +
  34046. + // to update channel value in beacon
  34047. + pbuddy_network_mlmeext->Configuration.DSConfig = pmlmeext->cur_channel;
  34048. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  34049. + if(p && ie_len>0)
  34050. + *(p + 2) = pmlmeext->cur_channel;
  34051. +
  34052. + p = rtw_get_ie((pbuddy_network_mlmeext->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pbuddy_network_mlmeext->IELength - sizeof(NDIS_802_11_FIXED_IEs)));
  34053. + if( p && ie_len)
  34054. + {
  34055. + pht_info = (struct HT_info_element *)(p+2);
  34056. + pht_info->primary_channel = pmlmeext->cur_channel;
  34057. + }
  34058. +
  34059. + //buddy interface band is different from current interface, update ERP, support rate, ext support rate IE
  34060. + if(change_band == _TRUE)
  34061. + change_band_update_ie(pbuddy_adapter, pbuddy_network_mlmeext);
  34062. + }
  34063. + else
  34064. + {
  34065. + // switch back to original channel/bwmode/ch_offset;
  34066. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  34067. + }
  34068. +
  34069. + DBG_871X("after join, second adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  34070. +
  34071. + DBG_871X("update pbuddy_adapter's beacon\n");
  34072. +
  34073. + update_beacon(pbuddy_adapter, 0, NULL, _TRUE);
  34074. +
  34075. + }
  34076. + else if(((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) &&
  34077. + check_fwstate(pbuddy_mlmepriv, _FW_LINKED))
  34078. + {
  34079. + if(join_res >= 0)
  34080. + {
  34081. + pbuddy_mlmeext->cur_channel = pmlmeext->cur_channel;
  34082. + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  34083. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  34084. + else if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
  34085. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  34086. + else
  34087. + set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  34088. + }
  34089. + else
  34090. + {
  34091. + // switch back to original channel/bwmode/ch_offset;
  34092. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  34093. + }
  34094. + }
  34095. + else
  34096. + {
  34097. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  34098. + }
  34099. +
  34100. +}
  34101. +#endif //CONFIG_CONCURRENT_MODE
  34102. +
  34103. +int rtw_chk_start_clnt_join(_adapter *padapter)
  34104. +{
  34105. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  34106. + unsigned char cur_ch = pmlmeext->cur_channel;
  34107. + unsigned char cur_bw = pmlmeext->cur_bwmode;
  34108. + unsigned char cur_ch_offset = pmlmeext->cur_ch_offset;
  34109. + bool chbw_allow = _TRUE;
  34110. + bool connect_allow = _TRUE;
  34111. +
  34112. +#ifdef CONFIG_CONCURRENT_MODE
  34113. + PADAPTER pbuddy_adapter;
  34114. + struct mlme_ext_priv *pbuddy_mlmeext;
  34115. + struct mlme_ext_info *pbuddy_pmlmeinfo;
  34116. + struct mlme_priv *pbuddy_mlmepriv;
  34117. +
  34118. + if (!rtw_buddy_adapter_up(padapter)) {
  34119. + goto start_join_set_ch_bw;
  34120. + }
  34121. +
  34122. + pbuddy_adapter = padapter->pbuddy_adapter;
  34123. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  34124. + pbuddy_pmlmeinfo = &(pbuddy_mlmeext->mlmext_info);
  34125. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  34126. +
  34127. + if((pbuddy_pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)//for AP MODE
  34128. + {
  34129. + DBG_871X("start_clnt_join: "ADPT_FMT"(ch=%d, bw=%d, ch_offset=%d)"
  34130. + ", "ADPT_FMT" AP mode(ch=%d, bw=%d, ch_offset=%d)\n",
  34131. + ADPT_ARG(padapter), pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset,
  34132. + ADPT_ARG(pbuddy_adapter), pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  34133. +
  34134. + if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel)
  34135. + {
  34136. + chbw_allow = _FALSE;
  34137. + }
  34138. + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) &&
  34139. + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) &&
  34140. + (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset))
  34141. + {
  34142. + chbw_allow = _FALSE;
  34143. + }
  34144. + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) &&
  34145. + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40))
  34146. + {
  34147. + cur_ch = pmlmeext->cur_channel;
  34148. + cur_bw = pbuddy_mlmeext->cur_bwmode;
  34149. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  34150. + }
  34151. +
  34152. + DBG_871X("start_clnt_join: connect_allow:%d, chbw_allow:%d\n", connect_allow, chbw_allow);
  34153. + if (chbw_allow == _FALSE) {
  34154. + #ifdef CONFIG_SPCT_CH_SWITCH
  34155. + if (1) {
  34156. + rtw_ap_inform_ch_switch(pbuddy_adapter, pmlmeext->cur_channel , pmlmeext->cur_ch_offset);
  34157. + } else
  34158. + #endif
  34159. + {
  34160. + //issue deauth to all stas if if2 is at ap mode
  34161. + rtw_sta_flush(pbuddy_adapter);
  34162. + }
  34163. + rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0);
  34164. + }
  34165. + }
  34166. + else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE &&
  34167. + check_fwstate(pbuddy_mlmepriv, WIFI_STATION_STATE) == _TRUE) //for Client Mode/p2p client
  34168. + {
  34169. + DBG_871X("start_clnt_join: "ADPT_FMT"(ch=%d, bw=%d, ch_offset=%d)"
  34170. + ", "ADPT_FMT" STA mode(ch=%d, bw=%d, ch_offset=%d)\n",
  34171. + ADPT_ARG(padapter), pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset,
  34172. + ADPT_ARG(pbuddy_adapter), pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);
  34173. +
  34174. + if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel)
  34175. + {
  34176. + chbw_allow = _FALSE;
  34177. + }
  34178. + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) &&
  34179. + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40))
  34180. + {
  34181. + cur_bw = HT_CHANNEL_WIDTH_40;
  34182. + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset;
  34183. + }
  34184. + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) &&
  34185. + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) &&
  34186. + (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset))
  34187. + {
  34188. + chbw_allow = _FALSE;
  34189. + }
  34190. +
  34191. + connect_allow = chbw_allow;
  34192. +
  34193. + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
  34194. + /* wlan0-sta mode has higher priority than p2p0-p2p client */
  34195. + if (!rtw_p2p_chk_state(&(pbuddy_adapter->wdinfo), P2P_STATE_NONE)
  34196. + && pbuddy_adapter->wdinfo.driver_interface == DRIVER_CFG80211)
  34197. + {
  34198. + connect_allow = _TRUE;
  34199. + }
  34200. + #endif /* CONFIG_P2P && CONFIG_IOCTL_CFG80211 */
  34201. +
  34202. + DBG_871X("start_clnt_join: connect_allow:%d, chbw_allow:%d\n", connect_allow, chbw_allow);
  34203. + if (connect_allow == _TRUE && chbw_allow == _FALSE) {
  34204. + /* disconnect buddy's connection */
  34205. + rtw_disassoc_cmd(pbuddy_adapter, 500, _FALSE);
  34206. + rtw_indicate_disconnect(pbuddy_adapter);
  34207. + rtw_free_assoc_resources(pbuddy_adapter, 1);
  34208. + }
  34209. + }
  34210. +
  34211. +start_join_set_ch_bw:
  34212. +#endif /* CONFIG_CONCURRENT_MODE */
  34213. +
  34214. + if (connect_allow == _TRUE) {
  34215. + DBG_871X("start_join_set_ch_bw: ch=%d, bwmode=%d, ch_offset=%d\n", cur_ch, cur_bw, cur_ch_offset);
  34216. + set_channel_bwmode(padapter, cur_ch, cur_ch_offset, cur_bw);
  34217. + }
  34218. +
  34219. + return connect_allow == _TRUE ? _SUCCESS : _FAIL;
  34220. +}
  34221. +
  34222. +/* Find union about ch, bw, ch_offset of all linked interfaces */
  34223. +int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
  34224. +{
  34225. + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  34226. + _adapter *iface;
  34227. + struct mlme_ext_priv *mlmeext;
  34228. + int i;
  34229. + u8 ch_ret = 0;
  34230. + u8 bw_ret = HT_CHANNEL_WIDTH_20;
  34231. + u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  34232. + int num = 0;
  34233. +
  34234. + if (ch) *ch = 0;
  34235. + if (bw) *bw = HT_CHANNEL_WIDTH_20;
  34236. + if (offset) *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  34237. +
  34238. + for (i = 0; i<dvobj->iface_nums; i++) {
  34239. + iface = dvobj->padapters[i];
  34240. + mlmeext = &iface->mlmeextpriv;
  34241. +
  34242. + if (!check_fwstate(&iface->mlmepriv, _FW_LINKED))
  34243. + continue;
  34244. +
  34245. + if (num == 0) {
  34246. + ch_ret = mlmeext->cur_channel;
  34247. + bw_ret = mlmeext->cur_bwmode;
  34248. + offset_ret = mlmeext->cur_ch_offset;
  34249. + num++;
  34250. + continue;
  34251. + }
  34252. +
  34253. + if (ch_ret != mlmeext->cur_channel) {
  34254. + num = 0;
  34255. + break;
  34256. + }
  34257. +
  34258. + if (bw_ret < mlmeext->cur_bwmode) {
  34259. + bw_ret = mlmeext->cur_bwmode;
  34260. + offset_ret = mlmeext->cur_ch_offset;
  34261. + } else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) {
  34262. + num = 0;
  34263. + break;
  34264. + }
  34265. +
  34266. + num++;
  34267. + }
  34268. +
  34269. + if (num) {
  34270. + if (ch) *ch = ch_ret;
  34271. + if (bw) *bw = bw_ret;
  34272. + if (offset) *offset = offset_ret;
  34273. + }
  34274. +
  34275. + return num;
  34276. +}
  34277. +
  34278. +u8 set_ch_hdl(_adapter *padapter, u8 *pbuf)
  34279. +{
  34280. + struct set_ch_parm *set_ch_parm;
  34281. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  34282. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  34283. +
  34284. + if(!pbuf)
  34285. + return H2C_PARAMETERS_ERROR;
  34286. +
  34287. + set_ch_parm = (struct set_ch_parm *)pbuf;
  34288. +
  34289. + DBG_871X(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n",
  34290. + FUNC_NDEV_ARG(padapter->pnetdev),
  34291. + set_ch_parm->ch, set_ch_parm->bw, set_ch_parm->ch_offset);
  34292. +
  34293. + pmlmeext->cur_channel = set_ch_parm->ch;
  34294. + pmlmeext->cur_ch_offset = set_ch_parm->ch_offset;
  34295. + pmlmeext->cur_bwmode = set_ch_parm->bw;
  34296. +
  34297. + set_channel_bwmode(padapter, set_ch_parm->ch, set_ch_parm->ch_offset, set_ch_parm->bw);
  34298. +
  34299. + return H2C_SUCCESS;
  34300. +}
  34301. +
  34302. +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf)
  34303. +{
  34304. + struct SetChannelPlan_param *setChannelPlan_param;
  34305. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  34306. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  34307. +
  34308. + if(!pbuf)
  34309. + return H2C_PARAMETERS_ERROR;
  34310. +
  34311. + setChannelPlan_param = (struct SetChannelPlan_param *)pbuf;
  34312. +
  34313. + pmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set);
  34314. + init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list);
  34315. +
  34316. + return H2C_SUCCESS;
  34317. +}
  34318. +
  34319. +u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf)
  34320. +{
  34321. + struct LedBlink_param *ledBlink_param;
  34322. +
  34323. + if(!pbuf)
  34324. + return H2C_PARAMETERS_ERROR;
  34325. +
  34326. + ledBlink_param = (struct LedBlink_param *)pbuf;
  34327. +
  34328. + #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD
  34329. + BlinkHandler(ledBlink_param->pLed);
  34330. + #endif
  34331. +
  34332. + return H2C_SUCCESS;
  34333. +}
  34334. +
  34335. +u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf)
  34336. +{
  34337. +#ifdef CONFIG_DFS
  34338. + struct SetChannelSwitch_param *setChannelSwitch_param;
  34339. + struct SetChannelPlan_param *setChannelPlan_param;
  34340. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  34341. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  34342. + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  34343. + u8 new_ch_no;
  34344. + u8 gval8 = 0x00, sval8 = 0xff;
  34345. +
  34346. + if(!pbuf)
  34347. + return H2C_PARAMETERS_ERROR;
  34348. +
  34349. + setChannelSwitch_param = (struct SetChannelSwitch_param *)pbuf;
  34350. + new_ch_no = setChannelSwitch_param->new_ch_no;
  34351. +
  34352. + rtw_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, &gval8);
  34353. +
  34354. + rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &sval8);
  34355. +
  34356. + DBG_871X("DFS detected! Swiching channel to %d!\n", new_ch_no);
  34357. + SelectChannel(padapter, new_ch_no);
  34358. +
  34359. + rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &gval8);
  34360. +
  34361. + rtw_free_network_queue(padapter, _TRUE);
  34362. + rtw_indicate_disconnect(padapter);
  34363. +
  34364. + if ( ((new_ch_no >= 52) && (new_ch_no <= 64)) ||((new_ch_no >= 100) && (new_ch_no <= 140)) ) {
  34365. + DBG_871X("Switched to DFS band (ch %02x) again!!\n", new_ch_no);
  34366. + }
  34367. +
  34368. + return H2C_SUCCESS;
  34369. +#else
  34370. + return H2C_REJECTED;
  34371. +#endif //CONFIG_DFS
  34372. +
  34373. +}
  34374. +
  34375. +// TDLS_WRCR : write RCR DATA BIT
  34376. +// TDLS_SD_PTI : issue peer traffic indication
  34377. +// TDLS_CS_OFF : go back to the channel linked with AP, terminating channel switch procedure
  34378. +// TDLS_INIT_CH_SEN : init channel sensing, receive all data and mgnt frame
  34379. +// TDLS_DONE_CH_SEN: channel sensing and report candidate channel
  34380. +// TDLS_OFF_CH : first time set channel to off channel
  34381. +// TDLS_BASE_CH : go back tp the channel linked with AP when set base channel as target channel
  34382. +// TDLS_P_OFF_CH : periodically go to off channel
  34383. +// TDLS_P_BASE_CH : periodically go back to base channel
  34384. +// TDLS_RS_RCR : restore RCR
  34385. +// TDLS_CKALV_PH1 : check alive timer phase1
  34386. +// TDLS_CKALV_PH2 : check alive timer phase2
  34387. +// TDLS_FREE_STA : free tdls sta
  34388. +u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
  34389. +{
  34390. +#ifdef CONFIG_TDLS
  34391. + _irqL irqL;
  34392. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  34393. + struct TDLSoption_param *TDLSoption;
  34394. + struct sta_info *ptdls_sta;
  34395. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  34396. + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  34397. + u8 survey_channel, i, min, option;
  34398. +
  34399. + if(!pbuf)
  34400. + return H2C_PARAMETERS_ERROR;
  34401. +
  34402. + TDLSoption = (struct TDLSoption_param *)pbuf;
  34403. +
  34404. + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), TDLSoption->addr );
  34405. + option = TDLSoption->option;
  34406. +
  34407. + if( ptdls_sta == NULL )
  34408. + {
  34409. + if( option != TDLS_RS_RCR )
  34410. + return H2C_REJECTED;
  34411. + }
  34412. +
  34413. + //_enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);
  34414. + DBG_871X("[%s] option:%d\n", __FUNCTION__, option);
  34415. +
  34416. + switch(option){
  34417. + case TDLS_WRCR:
  34418. + //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0
  34419. + //such we can receive all kinds of data frames.
  34420. + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0);
  34421. + DBG_871X("TDLS with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr));
  34422. +
  34423. + pmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta;
  34424. + //set TDLS sta rate.
  34425. + set_sta_rate(padapter, ptdls_sta);
  34426. + break;
  34427. + case TDLS_SD_PTI:
  34428. + issue_tdls_peer_traffic_indication(padapter, ptdls_sta);
  34429. + break;
  34430. + case TDLS_CS_OFF:
  34431. + _cancel_timer_ex(&ptdls_sta->base_ch_timer);
  34432. + _cancel_timer_ex(&ptdls_sta->off_ch_timer);
  34433. + SelectChannel(padapter, pmlmeext->cur_channel);
  34434. + ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SWITCH_ON_STATE |
  34435. + TDLS_PEER_AT_OFF_STATE |
  34436. + TDLS_AT_OFF_CH_STATE);
  34437. + DBG_871X("go back to base channel\n ");
  34438. + issue_nulldata(padapter, NULL, 0, 0, 0);
  34439. + break;
  34440. + case TDLS_INIT_CH_SEN:
  34441. + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_INIT_CH_SEN, 0);
  34442. + pmlmeext->sitesurvey_res.channel_idx = 0;
  34443. + ptdls_sta->option = TDLS_DONE_CH_SEN;
  34444. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN);
  34445. + break;
  34446. + case TDLS_DONE_CH_SEN:
  34447. + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum;
  34448. + if(survey_channel){
  34449. + SelectChannel(padapter, survey_channel);
  34450. + ptdlsinfo->cur_channel = survey_channel;
  34451. + pmlmeext->sitesurvey_res.channel_idx++;
  34452. + _set_timer(&ptdls_sta->option_timer, SURVEY_TO);
  34453. + }else{
  34454. + SelectChannel(padapter, pmlmeext->cur_channel);
  34455. +
  34456. + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_DONE_CH_SEN, 0);
  34457. +
  34458. + if(ptdlsinfo->ch_sensing==1){
  34459. + ptdlsinfo->ch_sensing=0;
  34460. + ptdlsinfo->cur_channel=1;
  34461. + min=ptdlsinfo->collect_pkt_num[0];
  34462. + for(i=1; i<MAX_CHANNEL_NUM-1; i++){
  34463. + if(min > ptdlsinfo->collect_pkt_num[i]){
  34464. + ptdlsinfo->cur_channel=i+1;
  34465. + min=ptdlsinfo->collect_pkt_num[i];
  34466. + }
  34467. + ptdlsinfo->collect_pkt_num[i]=0;
  34468. + }
  34469. + ptdlsinfo->collect_pkt_num[0]=0;
  34470. + ptdlsinfo->candidate_ch=ptdlsinfo->cur_channel;
  34471. + DBG_871X("TDLS channel sensing done, candidate channel: %02x\n", ptdlsinfo->candidate_ch);
  34472. + ptdlsinfo->cur_channel=0;
  34473. +
  34474. + }
  34475. +
  34476. + if(ptdls_sta->tdls_sta_state & TDLS_PEER_SLEEP_STATE){
  34477. + ptdls_sta->tdls_sta_state |= TDLS_APSD_CHSW_STATE;
  34478. + }else{
  34479. + //send null data with pwrbit==1 before send ch_switching_req to peer STA.
  34480. + issue_nulldata(padapter, NULL, 1, 0, 0);
  34481. +
  34482. + ptdls_sta->tdls_sta_state |= TDLS_CH_SW_INITIATOR_STATE;
  34483. +
  34484. + issue_tdls_ch_switch_req(padapter, ptdls_sta->hwaddr);
  34485. + DBG_871X("issue tdls ch switch req\n");
  34486. + }
  34487. + }
  34488. + break;
  34489. + case TDLS_OFF_CH:
  34490. + issue_nulldata(padapter, NULL, 1, 0, 0);
  34491. + SelectChannel(padapter, ptdls_sta->off_ch);
  34492. +
  34493. + DBG_871X("change channel to tar ch:%02x\n", ptdls_sta->off_ch);
  34494. + ptdls_sta->tdls_sta_state |= TDLS_AT_OFF_CH_STATE;
  34495. + ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_AT_OFF_STATE);
  34496. + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time);
  34497. + break;
  34498. + case TDLS_BASE_CH:
  34499. + _cancel_timer_ex(&ptdls_sta->base_ch_timer);
  34500. + _cancel_timer_ex(&ptdls_sta->off_ch_timer);
  34501. + SelectChannel(padapter, pmlmeext->cur_channel);
  34502. + ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SWITCH_ON_STATE |
  34503. + TDLS_PEER_AT_OFF_STATE |
  34504. + TDLS_AT_OFF_CH_STATE);
  34505. + DBG_871X("go back to base channel\n ");
  34506. + issue_nulldata(padapter, NULL, 0, 0, 0);
  34507. + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time);
  34508. + break;
  34509. + case TDLS_P_OFF_CH:
  34510. + SelectChannel(padapter, pmlmeext->cur_channel);
  34511. + issue_nulldata(padapter, NULL, 0, 0, 0);
  34512. + DBG_871X("change channel to base ch:%02x\n", pmlmeext->cur_channel);
  34513. + ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_AT_OFF_STATE| TDLS_AT_OFF_CH_STATE);
  34514. + _set_timer(&ptdls_sta->off_ch_timer, TDLS_STAY_TIME);
  34515. + break;
  34516. + case TDLS_P_BASE_CH:
  34517. + issue_nulldata(ptdls_sta->padapter, NULL, 1, 0, 0);
  34518. + SelectChannel(padapter, ptdls_sta->off_ch);
  34519. + DBG_871X("change channel to off ch:%02x\n", ptdls_sta->off_ch);
  34520. + ptdls_sta->tdls_sta_state |= TDLS_AT_OFF_CH_STATE;
  34521. + if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){
  34522. + issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0);
  34523. + }
  34524. + _set_timer(&ptdls_sta->base_ch_timer, TDLS_STAY_TIME);
  34525. + break;
  34526. + case TDLS_RS_RCR:
  34527. + rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0);
  34528. + DBG_871X("wirte REG_RCR, set bit6 on\n");
  34529. + break;
  34530. + case TDLS_CKALV_PH1:
  34531. + _set_timer(&ptdls_sta->alive_timer2, TDLS_ALIVE_TIMER_PH2);
  34532. + break;
  34533. + case TDLS_CKALV_PH2:
  34534. + _set_timer(&ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);
  34535. + break;
  34536. + case TDLS_FREE_STA:
  34537. + free_tdls_sta(padapter, ptdls_sta);
  34538. + break;
  34539. +
  34540. + }
  34541. +
  34542. + //_exit_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);
  34543. +
  34544. + return H2C_SUCCESS;
  34545. +#else
  34546. + return H2C_REJECTED;
  34547. +#endif //CONFIG_TDLS
  34548. +
  34549. +}
  34550. --- /dev/null
  34551. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_mp.c
  34552. @@ -0,0 +1,1323 @@
  34553. +/******************************************************************************
  34554. + *
  34555. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  34556. + *
  34557. + * This program is free software; you can redistribute it and/or modify it
  34558. + * under the terms of version 2 of the GNU General Public License as
  34559. + * published by the Free Software Foundation.
  34560. + *
  34561. + * This program is distributed in the hope that it will be useful, but WITHOUT
  34562. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  34563. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  34564. + * more details.
  34565. + *
  34566. + * You should have received a copy of the GNU General Public License along with
  34567. + * this program; if not, write to the Free Software Foundation, Inc.,
  34568. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  34569. + *
  34570. + *
  34571. + ******************************************************************************/
  34572. +#define _RTW_MP_C_
  34573. +
  34574. +#include <drv_types.h>
  34575. +
  34576. +#ifdef PLATFORM_FREEBSD
  34577. +#include <sys/unistd.h> /* for RFHIGHPID */
  34578. +#endif
  34579. +
  34580. +#ifdef CONFIG_RTL8712
  34581. +#include <rtw_mp_phy_regdef.h>
  34582. +#endif
  34583. +#ifdef CONFIG_RTL8192C
  34584. +#include <rtl8192c_hal.h>
  34585. +#endif
  34586. +#ifdef CONFIG_RTL8192D
  34587. +#include <rtl8192d_hal.h>
  34588. +#endif
  34589. +#ifdef CONFIG_RTL8723A
  34590. +#include <rtl8723a_hal.h>
  34591. +#endif
  34592. +
  34593. +
  34594. +#ifdef CONFIG_MP_INCLUDED
  34595. +
  34596. +u32 read_macreg(_adapter *padapter, u32 addr, u32 sz)
  34597. +{
  34598. + u32 val = 0;
  34599. +
  34600. + switch(sz)
  34601. + {
  34602. + case 1:
  34603. + val = rtw_read8(padapter, addr);
  34604. + break;
  34605. + case 2:
  34606. + val = rtw_read16(padapter, addr);
  34607. + break;
  34608. + case 4:
  34609. + val = rtw_read32(padapter, addr);
  34610. + break;
  34611. + default:
  34612. + val = 0xffffffff;
  34613. + break;
  34614. + }
  34615. +
  34616. + return val;
  34617. +
  34618. +}
  34619. +
  34620. +void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz)
  34621. +{
  34622. + switch(sz)
  34623. + {
  34624. + case 1:
  34625. + rtw_write8(padapter, addr, (u8)val);
  34626. + break;
  34627. + case 2:
  34628. + rtw_write16(padapter, addr, (u16)val);
  34629. + break;
  34630. + case 4:
  34631. + rtw_write32(padapter, addr, val);
  34632. + break;
  34633. + default:
  34634. + break;
  34635. + }
  34636. +
  34637. +}
  34638. +
  34639. +u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask)
  34640. +{
  34641. + return rtw_hal_read_bbreg(padapter, addr, bitmask);
  34642. +}
  34643. +
  34644. +void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val)
  34645. +{
  34646. + rtw_hal_write_bbreg(padapter, addr, bitmask, val);
  34647. +}
  34648. +
  34649. +u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask)
  34650. +{
  34651. + return rtw_hal_read_rfreg(padapter, (RF_RADIO_PATH_E)rfpath, addr, bitmask);
  34652. +}
  34653. +
  34654. +void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val)
  34655. +{
  34656. + rtw_hal_write_rfreg(padapter, (RF_RADIO_PATH_E)rfpath, addr, bitmask, val);
  34657. +}
  34658. +
  34659. +u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr)
  34660. +{
  34661. + return _read_rfreg(padapter, (RF_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask);
  34662. +}
  34663. +
  34664. +void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val)
  34665. +{
  34666. + _write_rfreg(padapter, (RF_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask, val);
  34667. +}
  34668. +
  34669. +static void _init_mp_priv_(struct mp_priv *pmp_priv)
  34670. +{
  34671. + WLAN_BSSID_EX *pnetwork;
  34672. +
  34673. + _rtw_memset(pmp_priv, 0, sizeof(struct mp_priv));
  34674. +
  34675. + pmp_priv->mode = MP_OFF;
  34676. +
  34677. + pmp_priv->channel = 1;
  34678. + pmp_priv->bandwidth = HT_CHANNEL_WIDTH_20;
  34679. + pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  34680. + pmp_priv->rateidx = MPT_RATE_1M;
  34681. + pmp_priv->txpoweridx = 0x2A;
  34682. +
  34683. + pmp_priv->antenna_tx = ANTENNA_A;
  34684. + pmp_priv->antenna_rx = ANTENNA_AB;
  34685. +
  34686. + pmp_priv->check_mp_pkt = 0;
  34687. +
  34688. + pmp_priv->tx_pktcount = 0;
  34689. +
  34690. + pmp_priv->rx_pktcount = 0;
  34691. + pmp_priv->rx_crcerrpktcount = 0;
  34692. +
  34693. + pmp_priv->network_macaddr[0] = 0x00;
  34694. + pmp_priv->network_macaddr[1] = 0xE0;
  34695. + pmp_priv->network_macaddr[2] = 0x4C;
  34696. + pmp_priv->network_macaddr[3] = 0x87;
  34697. + pmp_priv->network_macaddr[4] = 0x66;
  34698. + pmp_priv->network_macaddr[5] = 0x55;
  34699. +
  34700. + pnetwork = &pmp_priv->mp_network.network;
  34701. + _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN);
  34702. +
  34703. + pnetwork->Ssid.SsidLength = 8;
  34704. + _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength);
  34705. +}
  34706. +
  34707. +#ifdef PLATFORM_WINDOWS
  34708. +/*
  34709. +void mp_wi_callback(
  34710. + IN NDIS_WORK_ITEM* pwk_item,
  34711. + IN PVOID cntx
  34712. + )
  34713. +{
  34714. + _adapter* padapter =(_adapter *)cntx;
  34715. + struct mp_priv *pmppriv=&padapter->mppriv;
  34716. + struct mp_wi_cntx *pmp_wi_cntx=&pmppriv->wi_cntx;
  34717. +
  34718. + // Execute specified action.
  34719. + if(pmp_wi_cntx->curractfunc != NULL)
  34720. + {
  34721. + LARGE_INTEGER cur_time;
  34722. + ULONGLONG start_time, end_time;
  34723. + NdisGetCurrentSystemTime(&cur_time); // driver version
  34724. + start_time = cur_time.QuadPart/10; // The return value is in microsecond
  34725. +
  34726. + pmp_wi_cntx->curractfunc(padapter);
  34727. +
  34728. + NdisGetCurrentSystemTime(&cur_time); // driver version
  34729. + end_time = cur_time.QuadPart/10; // The return value is in microsecond
  34730. +
  34731. + RT_TRACE(_module_mp_, _drv_info_,
  34732. + ("WorkItemActType: %d, time spent: %I64d us\n",
  34733. + pmp_wi_cntx->param.act_type, (end_time-start_time)));
  34734. + }
  34735. +
  34736. + NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock));
  34737. + pmp_wi_cntx->bmp_wi_progress= _FALSE;
  34738. + NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock));
  34739. +
  34740. + if (pmp_wi_cntx->bmpdrv_unload)
  34741. + {
  34742. + NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt));
  34743. + }
  34744. +
  34745. +}
  34746. +*/
  34747. +
  34748. +static int init_mp_priv_by_os(struct mp_priv *pmp_priv)
  34749. +{
  34750. + struct mp_wi_cntx *pmp_wi_cntx;
  34751. +
  34752. + if (pmp_priv == NULL) return _FAIL;
  34753. +
  34754. + pmp_priv->rx_testcnt = 0;
  34755. + pmp_priv->rx_testcnt1 = 0;
  34756. + pmp_priv->rx_testcnt2 = 0;
  34757. +
  34758. + pmp_priv->tx_testcnt = 0;
  34759. + pmp_priv->tx_testcnt1 = 0;
  34760. +
  34761. + pmp_wi_cntx = &pmp_priv->wi_cntx
  34762. + pmp_wi_cntx->bmpdrv_unload = _FALSE;
  34763. + pmp_wi_cntx->bmp_wi_progress = _FALSE;
  34764. + pmp_wi_cntx->curractfunc = NULL;
  34765. +
  34766. + return _SUCCESS;
  34767. +}
  34768. +#endif
  34769. +
  34770. +#ifdef PLATFORM_LINUX
  34771. +static int init_mp_priv_by_os(struct mp_priv *pmp_priv)
  34772. +{
  34773. + int i, res;
  34774. + struct mp_xmit_frame *pmp_xmitframe;
  34775. +
  34776. + if (pmp_priv == NULL) return _FAIL;
  34777. +
  34778. + _rtw_init_queue(&pmp_priv->free_mp_xmitqueue);
  34779. +
  34780. + pmp_priv->pallocated_mp_xmitframe_buf = NULL;
  34781. + pmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4);
  34782. + if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) {
  34783. + res = _FAIL;
  34784. + goto _exit_init_mp_priv;
  34785. + }
  34786. +
  34787. + pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((uint) (pmp_priv->pallocated_mp_xmitframe_buf) & 3);
  34788. +
  34789. + pmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf;
  34790. +
  34791. + for (i = 0; i < NR_MP_XMITFRAME; i++)
  34792. + {
  34793. + _rtw_init_listhead(&pmp_xmitframe->list);
  34794. + rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue);
  34795. +
  34796. + pmp_xmitframe->pkt = NULL;
  34797. + pmp_xmitframe->frame_tag = MP_FRAMETAG;
  34798. + pmp_xmitframe->padapter = pmp_priv->papdater;
  34799. +
  34800. + pmp_xmitframe++;
  34801. + }
  34802. +
  34803. + pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME;
  34804. +
  34805. + res = _SUCCESS;
  34806. +
  34807. +_exit_init_mp_priv:
  34808. +
  34809. + return res;
  34810. +}
  34811. +#endif
  34812. +
  34813. +static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter)
  34814. +{
  34815. + struct pkt_attrib *pattrib;
  34816. + struct tx_desc *desc;
  34817. +
  34818. + // init xmitframe attribute
  34819. + pattrib = &pmptx->attrib;
  34820. + _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));
  34821. + desc = &pmptx->desc;
  34822. + _rtw_memset(desc, 0, TXDESC_SIZE);
  34823. +
  34824. + pattrib->ether_type = 0x8712;
  34825. + //_rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN);
  34826. +// _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  34827. + _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
  34828. +// pattrib->pctrl = 0;
  34829. +// pattrib->dhcp_pkt = 0;
  34830. +// pattrib->pktlen = 0;
  34831. + pattrib->ack_policy = 0;
  34832. +// pattrib->pkt_hdrlen = ETH_HLEN;
  34833. + pattrib->hdrlen = WLAN_HDR_A3_LEN;
  34834. + pattrib->subtype = WIFI_DATA;
  34835. + pattrib->priority = 0;
  34836. + pattrib->qsel = pattrib->priority;
  34837. +// do_queue_select(padapter, pattrib);
  34838. + pattrib->nr_frags = 1;
  34839. + pattrib->encrypt = 0;
  34840. + pattrib->bswenc = _FALSE;
  34841. + pattrib->qos_en = _FALSE;
  34842. +}
  34843. +
  34844. +s32 init_mp_priv(PADAPTER padapter)
  34845. +{
  34846. + struct mp_priv *pmppriv = &padapter->mppriv;
  34847. +
  34848. + _init_mp_priv_(pmppriv);
  34849. + pmppriv->papdater = padapter;
  34850. +
  34851. + pmppriv->tx.stop = 1;
  34852. + mp_init_xmit_attrib(&pmppriv->tx, padapter);
  34853. +
  34854. + switch (padapter->registrypriv.rf_config) {
  34855. + case RF_1T1R:
  34856. + pmppriv->antenna_tx = ANTENNA_A;
  34857. + pmppriv->antenna_rx = ANTENNA_A;
  34858. + break;
  34859. + case RF_1T2R:
  34860. + default:
  34861. + pmppriv->antenna_tx = ANTENNA_A;
  34862. + pmppriv->antenna_rx = ANTENNA_AB;
  34863. + break;
  34864. + case RF_2T2R:
  34865. + case RF_2T2R_GREEN:
  34866. + pmppriv->antenna_tx = ANTENNA_AB;
  34867. + pmppriv->antenna_rx = ANTENNA_AB;
  34868. + break;
  34869. + case RF_2T4R:
  34870. + pmppriv->antenna_tx = ANTENNA_AB;
  34871. + pmppriv->antenna_rx = ANTENNA_ABCD;
  34872. + break;
  34873. + }
  34874. +
  34875. + return _SUCCESS;
  34876. +}
  34877. +
  34878. +void free_mp_priv(struct mp_priv *pmp_priv)
  34879. +{
  34880. + if (pmp_priv->pallocated_mp_xmitframe_buf) {
  34881. + rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0);
  34882. + pmp_priv->pallocated_mp_xmitframe_buf = NULL;
  34883. + }
  34884. + pmp_priv->pmp_xmtframe_buf = NULL;
  34885. +}
  34886. +
  34887. +#ifdef CONFIG_RTL8192C
  34888. +#define PHY_IQCalibrate(a,b) rtl8192c_PHY_IQCalibrate(a,b)
  34889. +#define PHY_LCCalibrate(a) rtl8192c_PHY_LCCalibrate(a)
  34890. +#define dm_CheckTXPowerTracking(a) rtl8192c_dm_CheckTXPowerTracking(a)
  34891. +#define PHY_SetRFPathSwitch(a,b) rtl8192c_PHY_SetRFPathSwitch(a,b)
  34892. +#endif
  34893. +
  34894. +#ifdef CONFIG_RTL8192D
  34895. +#define PHY_IQCalibrate(a) rtl8192d_PHY_IQCalibrate(a)
  34896. +#define PHY_LCCalibrate(a) rtl8192d_PHY_LCCalibrate(a)
  34897. +#define dm_CheckTXPowerTracking(a) rtl8192d_dm_CheckTXPowerTracking(a)
  34898. +#define PHY_SetRFPathSwitch(a,b) rtl8192d_PHY_SetRFPathSwitch(a,b)
  34899. +#endif
  34900. +
  34901. +s32
  34902. +MPT_InitializeAdapter(
  34903. + IN PADAPTER pAdapter,
  34904. + IN u8 Channel
  34905. + )
  34906. +{
  34907. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  34908. + s32 rtStatus = _SUCCESS;
  34909. + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
  34910. + u32 ledsetting;
  34911. +
  34912. + //-------------------------------------------------------------------------
  34913. + // HW Initialization for 8190 MPT.
  34914. + //-------------------------------------------------------------------------
  34915. + //-------------------------------------------------------------------------
  34916. + // SW Initialization for 8190 MP.
  34917. + //-------------------------------------------------------------------------
  34918. + pMptCtx->bMptDrvUnload = _FALSE;
  34919. + pMptCtx->bMassProdTest = _FALSE;
  34920. + pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db
  34921. +
  34922. + /* Init mpt event. */
  34923. +#if 0 // for Windows
  34924. + NdisInitializeEvent( &(pMptCtx->MptWorkItemEvent) );
  34925. + NdisAllocateSpinLock( &(pMptCtx->MptWorkItemSpinLock) );
  34926. +
  34927. + PlatformInitializeWorkItem(
  34928. + Adapter,
  34929. + &(pMptCtx->MptWorkItem),
  34930. + (RT_WORKITEM_CALL_BACK)MPT_WorkItemCallback,
  34931. + (PVOID)Adapter,
  34932. + "MptWorkItem");
  34933. +#endif
  34934. + pMptCtx->bMptWorkItemInProgress = _FALSE;
  34935. + pMptCtx->CurrMptAct = NULL;
  34936. + //-------------------------------------------------------------------------
  34937. +
  34938. +#if 1
  34939. + // Don't accept any packets
  34940. + rtw_write32(pAdapter, REG_RCR, 0);
  34941. +#else
  34942. + // Accept CRC error and destination address
  34943. + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP);
  34944. + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);
  34945. +#endif
  34946. +
  34947. +#if 0
  34948. + // If EEPROM or EFUSE is empty,we assign as RF 2T2R for MP.
  34949. + if (pHalData->AutoloadFailFlag == TRUE)
  34950. + {
  34951. + pHalData->RF_Type = RF_2T2R;
  34952. + }
  34953. +#endif
  34954. + ledsetting = rtw_read32(pAdapter, REG_LEDCFG0);
  34955. + rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS);
  34956. +
  34957. +#ifdef CONFIG_RTL8192C
  34958. + PHY_IQCalibrate(pAdapter, _FALSE);
  34959. + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter
  34960. + PHY_LCCalibrate(pAdapter);
  34961. +#endif
  34962. +
  34963. +#ifdef CONFIG_RTL8192D
  34964. + PHY_IQCalibrate(pAdapter);
  34965. + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter
  34966. + PHY_LCCalibrate(pAdapter);
  34967. +#endif
  34968. +
  34969. +#ifdef CONFIG_PCI_HCI
  34970. + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //Wifi default use Main
  34971. +#else
  34972. +
  34973. +#ifdef CONFIG_RTL8192C
  34974. +#if 1
  34975. + if (pHalData->BoardType == BOARD_MINICARD)
  34976. + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main
  34977. +#else
  34978. + if(pAdapter->HalFunc.GetInterfaceSelectionHandler(pAdapter) == INTF_SEL2_MINICARD )
  34979. + PHY_SetRFPathSwitch(Adapter, pAdapter->MgntInfo.bDefaultAntenna); //default use Main
  34980. +#endif
  34981. +
  34982. +#endif
  34983. +
  34984. +#endif
  34985. +
  34986. + pMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
  34987. + pMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
  34988. + pMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);
  34989. +
  34990. + return rtStatus;
  34991. +}
  34992. +
  34993. +/*-----------------------------------------------------------------------------
  34994. + * Function: MPT_DeInitAdapter()
  34995. + *
  34996. + * Overview: Extra DeInitialization for Mass Production Test.
  34997. + *
  34998. + * Input: PADAPTER pAdapter
  34999. + *
  35000. + * Output: NONE
  35001. + *
  35002. + * Return: NONE
  35003. + *
  35004. + * Revised History:
  35005. + * When Who Remark
  35006. + * 05/08/2007 MHC Create Version 0.
  35007. + * 05/18/2007 MHC Add normal driver MPHalt code.
  35008. + *
  35009. + *---------------------------------------------------------------------------*/
  35010. +VOID
  35011. +MPT_DeInitAdapter(
  35012. + IN PADAPTER pAdapter
  35013. + )
  35014. +{
  35015. + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
  35016. +
  35017. + pMptCtx->bMptDrvUnload = _TRUE;
  35018. +#if 0 // for Windows
  35019. + PlatformFreeWorkItem( &(pMptCtx->MptWorkItem) );
  35020. +
  35021. + while(pMptCtx->bMptWorkItemInProgress)
  35022. + {
  35023. + if(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50))
  35024. + {
  35025. + break;
  35026. + }
  35027. + }
  35028. + NdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) );
  35029. +#endif
  35030. +}
  35031. +
  35032. +static u8 mpt_ProStartTest(PADAPTER padapter)
  35033. +{
  35034. + PMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx;
  35035. +
  35036. + pMptCtx->bMassProdTest = _TRUE;
  35037. + pMptCtx->bStartContTx = _FALSE;
  35038. + pMptCtx->bCckContTx = _FALSE;
  35039. + pMptCtx->bOfdmContTx = _FALSE;
  35040. + pMptCtx->bSingleCarrier = _FALSE;
  35041. + pMptCtx->bCarrierSuppression = _FALSE;
  35042. + pMptCtx->bSingleTone = _FALSE;
  35043. +
  35044. + return _SUCCESS;
  35045. +}
  35046. +
  35047. +/*
  35048. + * General use
  35049. + */
  35050. +s32 SetPowerTracking(PADAPTER padapter, u8 enable)
  35051. +{
  35052. +
  35053. + Hal_SetPowerTracking( padapter, enable );
  35054. + return 0;
  35055. +}
  35056. +
  35057. +void GetPowerTracking(PADAPTER padapter, u8 *enable)
  35058. +{
  35059. + Hal_GetPowerTracking( padapter, enable );
  35060. +}
  35061. +
  35062. +static void disable_dm(PADAPTER padapter)
  35063. +{
  35064. +#ifndef CONFIG_RTL8723A
  35065. + u8 v8;
  35066. +#endif
  35067. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  35068. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  35069. +
  35070. +
  35071. + //3 1. disable firmware dynamic mechanism
  35072. + // disable Power Training, Rate Adaptive
  35073. +#ifdef CONFIG_RTL8723A
  35074. + SetBcnCtrlReg(padapter, 0, EN_BCN_FUNCTION);
  35075. +#else
  35076. + v8 = rtw_read8(padapter, REG_BCN_CTRL);
  35077. + v8 &= ~EN_BCN_FUNCTION;
  35078. + rtw_write8(padapter, REG_BCN_CTRL, v8);
  35079. +#endif
  35080. +
  35081. + //3 2. disable driver dynamic mechanism
  35082. + // disable Dynamic Initial Gain
  35083. + // disable High Power
  35084. + // disable Power Tracking
  35085. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  35086. +
  35087. + // enable APK, LCK and IQK but disable power tracking
  35088. + pdmpriv->TxPowerTrackControl = _FALSE;
  35089. + Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE);
  35090. +}
  35091. +
  35092. +//This function initializes the DUT to the MP test mode
  35093. +s32 mp_start_test(PADAPTER padapter)
  35094. +{
  35095. + WLAN_BSSID_EX bssid;
  35096. + struct sta_info *psta;
  35097. + u32 length;
  35098. + u8 val8;
  35099. +
  35100. + _irqL irqL;
  35101. + s32 res = _SUCCESS;
  35102. +
  35103. + struct mp_priv *pmppriv = &padapter->mppriv;
  35104. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  35105. + struct wlan_network *tgt_network = &pmlmepriv->cur_network;
  35106. +
  35107. +
  35108. + //3 disable dynamic mechanism
  35109. + disable_dm(padapter);
  35110. +
  35111. + //3 0. update mp_priv
  35112. +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D)
  35113. + if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) {
  35114. +// HAL_DATA_TYPE *phal = GET_HAL_DATA(padapter);
  35115. +// switch (phal->rf_type) {
  35116. + switch (GET_RF_TYPE(padapter)) {
  35117. + case RF_1T1R:
  35118. + pmppriv->antenna_tx = ANTENNA_A;
  35119. + pmppriv->antenna_rx = ANTENNA_A;
  35120. + break;
  35121. + case RF_1T2R:
  35122. + default:
  35123. + pmppriv->antenna_tx = ANTENNA_A;
  35124. + pmppriv->antenna_rx = ANTENNA_AB;
  35125. + break;
  35126. + case RF_2T2R:
  35127. + case RF_2T2R_GREEN:
  35128. + pmppriv->antenna_tx = ANTENNA_AB;
  35129. + pmppriv->antenna_rx = ANTENNA_AB;
  35130. + break;
  35131. + case RF_2T4R:
  35132. + pmppriv->antenna_tx = ANTENNA_AB;
  35133. + pmppriv->antenna_rx = ANTENNA_ABCD;
  35134. + break;
  35135. + }
  35136. + }
  35137. +#endif
  35138. + mpt_ProStartTest(padapter);
  35139. +
  35140. + //3 1. initialize a new WLAN_BSSID_EX
  35141. +// _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
  35142. + _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);
  35143. + bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc");
  35144. + _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_adhoc", bssid.Ssid.SsidLength);
  35145. + bssid.InfrastructureMode = Ndis802_11IBSS;
  35146. + bssid.NetworkTypeInUse = Ndis802_11DS;
  35147. + bssid.IELength = 0;
  35148. +
  35149. + length = get_WLAN_BSSID_EX_sz(&bssid);
  35150. + if (length % 4)
  35151. + bssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes.
  35152. + else
  35153. + bssid.Length = length;
  35154. +
  35155. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  35156. +
  35157. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  35158. + goto end_of_mp_start_test;
  35159. +
  35160. + //init mp_start_test status
  35161. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  35162. + rtw_disassoc_cmd(padapter, 500, _TRUE);
  35163. + rtw_indicate_disconnect(padapter);
  35164. + rtw_free_assoc_resources(padapter, 1);
  35165. + }
  35166. + pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
  35167. + pmlmepriv->fw_state = WIFI_MP_STATE;
  35168. +#if 0
  35169. + if (pmppriv->mode == _LOOPBOOK_MODE_) {
  35170. + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc
  35171. + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n"));
  35172. + } else {
  35173. + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n"));
  35174. + }
  35175. +#endif
  35176. + set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  35177. +
  35178. + //3 2. create a new psta for mp driver
  35179. + //clear psta in the cur_network, if any
  35180. + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
  35181. + if (psta) rtw_free_stainfo(padapter, psta);
  35182. +
  35183. + psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);
  35184. + if (psta == NULL) {
  35185. + RT_TRACE(_module_mp_, _drv_err_, ("mp_start_test: Can't alloc sta_info!\n"));
  35186. + pmlmepriv->fw_state = pmppriv->prev_fw_state;
  35187. + res = _FAIL;
  35188. + goto end_of_mp_start_test;
  35189. + }
  35190. +
  35191. + //3 3. join psudo AdHoc
  35192. + tgt_network->join_res = 1;
  35193. + tgt_network->aid = psta->aid = 1;
  35194. + _rtw_memcpy(&tgt_network->network, &bssid, length);
  35195. +
  35196. + rtw_indicate_connect(padapter);
  35197. + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  35198. +
  35199. +end_of_mp_start_test:
  35200. +
  35201. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  35202. +
  35203. + if (res == _SUCCESS)
  35204. + {
  35205. + // set MSR to WIFI_FW_ADHOC_STATE
  35206. +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D)
  35207. + val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
  35208. + val8 |= WIFI_FW_ADHOC_STATE;
  35209. + rtw_write8(padapter, MSR, val8); // Link in ad hoc network
  35210. +#endif
  35211. +
  35212. +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D)
  35213. + rtw_write8(padapter, MSR, 1); // Link in ad hoc network
  35214. + rtw_write8(padapter, RCR, 0); // RCR : disable all pkt, 0x10250048
  35215. + rtw_write8(padapter, RCR+2, 0x57); // RCR disable Check BSSID, 0x1025004a
  35216. +
  35217. + // disable RX filter map , mgt frames will put in RX FIFO 0
  35218. + rtw_write16(padapter, RXFLTMAP0, 0x0); // 0x10250116
  35219. +
  35220. + val8 = rtw_read8(padapter, EE_9346CR); // 0x1025000A
  35221. + if (!(val8 & _9356SEL))//boot from EFUSE
  35222. + efuse_change_max_size(padapter);
  35223. +#endif
  35224. + }
  35225. +
  35226. + return res;
  35227. +}
  35228. +//------------------------------------------------------------------------------
  35229. +//This function change the DUT from the MP test mode into normal mode
  35230. +void mp_stop_test(PADAPTER padapter)
  35231. +{
  35232. + struct mp_priv *pmppriv = &padapter->mppriv;
  35233. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  35234. + struct wlan_network *tgt_network = &pmlmepriv->cur_network;
  35235. + struct sta_info *psta;
  35236. +
  35237. + _irqL irqL;
  35238. +
  35239. +
  35240. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  35241. +
  35242. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)
  35243. + goto end_of_mp_stop_test;
  35244. +
  35245. + //3 1. disconnect psudo AdHoc
  35246. + rtw_indicate_disconnect(padapter);
  35247. +
  35248. + //3 2. clear psta used in mp test mode.
  35249. +// rtw_free_assoc_resources(padapter, 1);
  35250. + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
  35251. + if (psta) rtw_free_stainfo(padapter, psta);
  35252. +
  35253. + //3 3. return to normal state (default:station mode)
  35254. + pmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE;
  35255. +
  35256. + //flush the cur_network
  35257. + _rtw_memset(tgt_network, 0, sizeof(struct wlan_network));
  35258. +
  35259. + _clr_fwstate_(pmlmepriv, WIFI_MP_STATE);
  35260. +
  35261. +end_of_mp_stop_test:
  35262. +
  35263. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  35264. +}
  35265. +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
  35266. +#if 0
  35267. +//#ifdef CONFIG_USB_HCI
  35268. +static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID)
  35269. +{
  35270. + u8 eRFPath;
  35271. + u32 rfReg0x26;
  35272. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  35273. +
  35274. +
  35275. + if (RateIdx < MPT_RATE_6M) { // CCK rate,for 88cu
  35276. + rfReg0x26 = 0xf400;
  35277. + }
  35278. + else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu
  35279. + if ((4 == Channel) || (8 == Channel) || (12 == Channel))
  35280. + rfReg0x26 = 0xf000;
  35281. + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
  35282. + rfReg0x26 = 0xf400;
  35283. + else
  35284. + rfReg0x26 = 0x4f200;
  35285. + }
  35286. + else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu
  35287. +
  35288. + if (HT_CHANNEL_WIDTH_20 == BandWidthID) {
  35289. + if ((4 == Channel) || (8 == Channel))
  35290. + rfReg0x26 = 0xf000;
  35291. + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
  35292. + rfReg0x26 = 0xf400;
  35293. + else
  35294. + rfReg0x26 = 0x4f200;
  35295. + }
  35296. + else{
  35297. + if ((4 == Channel) || (8 == Channel))
  35298. + rfReg0x26 = 0xf000;
  35299. + else if ((5 == Channel) || (7 == Channel))
  35300. + rfReg0x26 = 0xf400;
  35301. + else
  35302. + rfReg0x26 = 0x4f200;
  35303. + }
  35304. + }
  35305. +
  35306. +// RT_TRACE(COMP_CMD, DBG_LOUD, ("\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\n",Channel, RateIdx,rfReg0x26));
  35307. + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) {
  35308. + write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26);
  35309. + }
  35310. +}
  35311. +#endif
  35312. +/*-----------------------------------------------------------------------------
  35313. + * Function: mpt_SwitchRfSetting
  35314. + *
  35315. + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP.
  35316. + *
  35317. + * Input: IN PADAPTER pAdapter
  35318. + *
  35319. + * Output: NONE
  35320. + *
  35321. + * Return: NONE
  35322. + *
  35323. + * Revised History:
  35324. + * When Who Remark
  35325. + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.
  35326. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.
  35327. + *
  35328. + *---------------------------------------------------------------------------*/
  35329. +static void mpt_SwitchRfSetting(PADAPTER pAdapter)
  35330. +{
  35331. + Hal_mpt_SwitchRfSetting(pAdapter);
  35332. + }
  35333. +
  35334. +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
  35335. +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  35336. +static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)
  35337. +{
  35338. + Hal_MPT_CCKTxPowerAdjust(Adapter,bInCH14);
  35339. +}
  35340. +
  35341. +static void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven)
  35342. +{
  35343. + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter,beven);
  35344. + }
  35345. +
  35346. +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  35347. +
  35348. +/*
  35349. + * SetChannel
  35350. + * Description
  35351. + * Use H2C command to change channel,
  35352. + * not only modify rf register, but also other setting need to be done.
  35353. + */
  35354. +void SetChannel(PADAPTER pAdapter)
  35355. +{
  35356. + Hal_SetChannel(pAdapter);
  35357. +
  35358. +}
  35359. +
  35360. +/*
  35361. + * Notice
  35362. + * Switch bandwitdth may change center frequency(channel)
  35363. + */
  35364. +void SetBandwidth(PADAPTER pAdapter)
  35365. +{
  35366. + Hal_SetBandwidth(pAdapter);
  35367. +
  35368. +}
  35369. +
  35370. +static void SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
  35371. +{
  35372. + Hal_SetCCKTxPower(pAdapter,TxPower);
  35373. +}
  35374. +
  35375. +static void SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower)
  35376. +{
  35377. + Hal_SetOFDMTxPower(pAdapter,TxPower);
  35378. + }
  35379. +
  35380. +
  35381. +void SetAntenna(PADAPTER pAdapter)
  35382. + {
  35383. + Hal_SetAntenna(pAdapter);
  35384. +}
  35385. +
  35386. +void SetAntennaPathPower(PADAPTER pAdapter)
  35387. +{
  35388. + Hal_SetAntennaPathPower(pAdapter);
  35389. +}
  35390. +
  35391. +void SetTxPower(PADAPTER pAdapter)
  35392. +{
  35393. + Hal_SetTxPower(pAdapter);
  35394. + }
  35395. +
  35396. +void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
  35397. +{
  35398. + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;
  35399. +
  35400. + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
  35401. + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
  35402. + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);
  35403. +
  35404. + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
  35405. + write_bbreg(pAdapter, rFPGA0_TxGainStage,
  35406. + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
  35407. +}
  35408. +
  35409. +void SetDataRate(PADAPTER pAdapter)
  35410. +{
  35411. + Hal_SetDataRate(pAdapter);
  35412. +}
  35413. +
  35414. +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D)
  35415. +/*------------------------------Define structure----------------------------*/
  35416. +typedef struct _R_ANTENNA_SELECT_OFDM {
  35417. + u32 r_tx_antenna:4;
  35418. + u32 r_ant_l:4;
  35419. + u32 r_ant_non_ht:4;
  35420. + u32 r_ant_ht1:4;
  35421. + u32 r_ant_ht2:4;
  35422. + u32 r_ant_ht_s1:4;
  35423. + u32 r_ant_non_ht_s1:4;
  35424. + u32 OFDM_TXSC:2;
  35425. + u32 Reserved:2;
  35426. +}R_ANTENNA_SELECT_OFDM;
  35427. +
  35428. +typedef struct _R_ANTENNA_SELECT_CCK {
  35429. + u8 r_cckrx_enable_2:2;
  35430. + u8 r_cckrx_enable:2;
  35431. + u8 r_ccktx_enable:4;
  35432. +}R_ANTENNA_SELECT_CCK;
  35433. +#endif
  35434. +
  35435. +s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
  35436. +{
  35437. + return Hal_SetThermalMeter( pAdapter, target_ther);
  35438. +}
  35439. +
  35440. +static void TriggerRFThermalMeter(PADAPTER pAdapter)
  35441. +{
  35442. + Hal_TriggerRFThermalMeter(pAdapter);
  35443. +}
  35444. +
  35445. +static u8 ReadRFThermalMeter(PADAPTER pAdapter)
  35446. +{
  35447. + return Hal_ReadRFThermalMeter(pAdapter);
  35448. +}
  35449. +
  35450. +void GetThermalMeter(PADAPTER pAdapter, u8 *value)
  35451. +{
  35452. + Hal_GetThermalMeter(pAdapter,value);
  35453. +}
  35454. +
  35455. +void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)
  35456. +{
  35457. + Hal_SetSingleCarrierTx(pAdapter,bStart);
  35458. +}
  35459. +
  35460. +void SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
  35461. +{
  35462. + Hal_SetSingleToneTx(pAdapter,bStart);
  35463. +}
  35464. +
  35465. +void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
  35466. +{
  35467. + Hal_SetCarrierSuppressionTx(pAdapter, bStart);
  35468. +}
  35469. +
  35470. +void SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)
  35471. + {
  35472. + Hal_SetCCKContinuousTx(pAdapter,bStart);
  35473. + }
  35474. +
  35475. +void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)
  35476. + {
  35477. + Hal_SetOFDMContinuousTx( pAdapter, bStart);
  35478. +}/* mpt_StartOfdmContTx */
  35479. +
  35480. +void SetContinuousTx(PADAPTER pAdapter, u8 bStart)
  35481. +{
  35482. + Hal_SetContinuousTx(pAdapter,bStart);
  35483. +}
  35484. +
  35485. +//------------------------------------------------------------------------------
  35486. +static void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe)
  35487. +{
  35488. + rtw_hal_mgnt_xmit(padapter, pmpframe);
  35489. +}
  35490. +
  35491. +static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)
  35492. +{
  35493. + struct xmit_frame *pmpframe;
  35494. + struct xmit_buf *pxmitbuf;
  35495. +
  35496. + if ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
  35497. + {
  35498. + return NULL;
  35499. + }
  35500. +
  35501. + if ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL)
  35502. + {
  35503. + rtw_free_xmitframe(pxmitpriv, pmpframe);
  35504. + return NULL;
  35505. + }
  35506. +
  35507. + pmpframe->frame_tag = MP_FRAMETAG;
  35508. +
  35509. + pmpframe->pxmitbuf = pxmitbuf;
  35510. +
  35511. + pmpframe->buf_addr = pxmitbuf->pbuf;
  35512. +
  35513. + pxmitbuf->priv_data = pmpframe;
  35514. +
  35515. + return pmpframe;
  35516. +
  35517. +}
  35518. +
  35519. +static thread_return mp_xmit_packet_thread(thread_context context)
  35520. +{
  35521. + struct xmit_frame *pxmitframe;
  35522. + struct mp_tx *pmptx;
  35523. + struct mp_priv *pmp_priv;
  35524. + struct xmit_priv *pxmitpriv;
  35525. + PADAPTER padapter;
  35526. +
  35527. + pmp_priv = (struct mp_priv *)context;
  35528. + pmptx = &pmp_priv->tx;
  35529. + padapter = pmp_priv->papdater;
  35530. + pxmitpriv = &(padapter->xmitpriv);
  35531. +
  35532. + thread_enter("RTW_MP_THREAD");
  35533. +
  35534. + DBG_871X("%s:pkTx Start\n", __func__);
  35535. + while (1) {
  35536. + pxmitframe = alloc_mp_xmitframe(pxmitpriv);
  35537. + if (pxmitframe == NULL) {
  35538. + if (pmptx->stop ||
  35539. + padapter->bSurpriseRemoved ||
  35540. + padapter->bDriverStopped) {
  35541. + goto exit;
  35542. + }
  35543. + else {
  35544. + rtw_msleep_os(1);
  35545. + continue;
  35546. + }
  35547. + }
  35548. +
  35549. + _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size);
  35550. + _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
  35551. +
  35552. + dump_mpframe(padapter, pxmitframe);
  35553. +
  35554. + pmptx->sended++;
  35555. + pmp_priv->tx_pktcount++;
  35556. +
  35557. + if (pmptx->stop ||
  35558. + padapter->bSurpriseRemoved ||
  35559. + padapter->bDriverStopped)
  35560. + goto exit;
  35561. + if ((pmptx->count != 0) &&
  35562. + (pmptx->count == pmptx->sended))
  35563. + goto exit;
  35564. +
  35565. + flush_signals_thread();
  35566. + }
  35567. +
  35568. +exit:
  35569. + //DBG_871X("%s:pkTx Exit\n", __func__);
  35570. + rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size);
  35571. + pmptx->pallocated_buf = NULL;
  35572. + pmptx->stop = 1;
  35573. +
  35574. + thread_exit();
  35575. +}
  35576. +
  35577. +void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc)
  35578. +{
  35579. + struct mp_priv *pmp_priv = &padapter->mppriv;
  35580. + _rtw_memcpy(ptxdesc, &(pmp_priv->tx.desc), TXDESC_SIZE);
  35581. +}
  35582. +
  35583. +void SetPacketTx(PADAPTER padapter)
  35584. +{
  35585. + u8 *ptr, *pkt_start, *pkt_end;
  35586. + u32 pkt_size;
  35587. + struct tx_desc *desc;
  35588. + struct rtw_ieee80211_hdr *hdr;
  35589. + u8 payload;
  35590. + s32 bmcast;
  35591. + struct pkt_attrib *pattrib;
  35592. + struct mp_priv *pmp_priv;
  35593. +
  35594. +
  35595. + pmp_priv = &padapter->mppriv;
  35596. + if (pmp_priv->tx.stop) return;
  35597. + pmp_priv->tx.sended = 0;
  35598. + pmp_priv->tx.stop = 0;
  35599. + pmp_priv->tx_pktcount = 0;
  35600. +
  35601. + //3 1. update_attrib()
  35602. + pattrib = &pmp_priv->tx.attrib;
  35603. + _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN);
  35604. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  35605. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  35606. + bmcast = IS_MCAST(pattrib->ra);
  35607. + if (bmcast) {
  35608. + pattrib->mac_id = 1;
  35609. + pattrib->psta = rtw_get_bcmc_stainfo(padapter);
  35610. + } else {
  35611. + pattrib->mac_id = 0;
  35612. + pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
  35613. + }
  35614. +
  35615. + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;
  35616. +
  35617. + //3 2. allocate xmit buffer
  35618. + pkt_size = pattrib->last_txcmdsz;
  35619. +
  35620. + if (pmp_priv->tx.pallocated_buf)
  35621. + rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size);
  35622. + pmp_priv->tx.write_size = pkt_size;
  35623. + pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ;
  35624. + pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size);
  35625. + if (pmp_priv->tx.pallocated_buf == NULL) {
  35626. + DBG_871X("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size);
  35627. + return;
  35628. + }
  35629. + pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ);
  35630. + ptr = pmp_priv->tx.buf;
  35631. +
  35632. + desc = &(pmp_priv->tx.desc);
  35633. + _rtw_memset(desc, 0, TXDESC_SIZE);
  35634. + pkt_start = ptr;
  35635. + pkt_end = pkt_start + pkt_size;
  35636. +
  35637. + //3 3. init TX descriptor
  35638. + // offset 0
  35639. + //desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size
  35640. + //desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
  35641. + //desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc
  35642. + //if (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet
  35643. +
  35644. + // offset 4
  35645. + desc->txdw1 |= cpu_to_le32(BK); // don't aggregate(AMPDU)
  35646. + desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x1F); //CAM_ID(MAC_ID)
  35647. + desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID
  35648. + desc->txdw1 |= cpu_to_le32((pattrib->raid << Rate_ID_SHT) & 0x000F0000); // Rate Adaptive ID
  35649. +
  35650. + // offset 8
  35651. + // offset 12
  35652. + //desc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0xffff0000);
  35653. +
  35654. + // offset 16
  35655. + //desc->txdw4 |= cpu_to_le32(QoS);
  35656. + desc->txdw4 |= cpu_to_le32(HW_SEQ_EN);
  35657. + desc->txdw4 |= cpu_to_le32(USERATE);
  35658. + desc->txdw4 |= cpu_to_le32(DISDATAFB);
  35659. +
  35660. + if( pmp_priv->preamble ){
  35661. + if (pmp_priv->rateidx <= MPT_RATE_54M)
  35662. + desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble
  35663. + }
  35664. + if (pmp_priv->bandwidth == HT_CHANNEL_WIDTH_40)
  35665. + desc->txdw4 |= cpu_to_le32(DATA_BW);
  35666. +
  35667. + // offset 20
  35668. + desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F);
  35669. +
  35670. + if( pmp_priv->preamble ){
  35671. + if (pmp_priv->rateidx > MPT_RATE_54M)
  35672. + desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval
  35673. + }
  35674. + desc->txdw5 |= cpu_to_le32(0x0001FF00); // DATA/RTS Rate Fallback Limit
  35675. +
  35676. + //3 4. make wlan header, make_wlanhdr()
  35677. + hdr = (struct rtw_ieee80211_hdr *)pkt_start;
  35678. + SetFrameSubType(&hdr->frame_ctl, pattrib->subtype);
  35679. + _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA
  35680. + _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA
  35681. + _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID
  35682. +
  35683. + //3 5. make payload
  35684. + ptr = pkt_start + pattrib->hdrlen;
  35685. +
  35686. + switch (pmp_priv->tx.payload) {
  35687. + case 0:
  35688. + payload = 0x00;
  35689. + break;
  35690. + case 1:
  35691. + payload = 0x5a;
  35692. + break;
  35693. + case 2:
  35694. + payload = 0xa5;
  35695. + break;
  35696. + case 3:
  35697. + payload = 0xff;
  35698. + break;
  35699. + default:
  35700. + payload = 0x00;
  35701. + break;
  35702. + }
  35703. +
  35704. + _rtw_memset(ptr, payload, pkt_end - ptr);
  35705. +
  35706. + //3 6. start thread
  35707. +#ifdef PLATFORM_LINUX
  35708. + pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD");
  35709. + if (IS_ERR(pmp_priv->tx.PktTxThread))
  35710. + DBG_871X("Create PktTx Thread Fail !!!!!\n");
  35711. +#endif
  35712. +#ifdef PLATFORM_FREEBSD
  35713. +{
  35714. + struct proc *p;
  35715. + struct thread *td;
  35716. + pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv,
  35717. + &p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread");
  35718. +
  35719. + if (pmp_priv->tx.PktTxThread < 0)
  35720. + DBG_871X("Create PktTx Thread Fail !!!!!\n");
  35721. +}
  35722. +#endif
  35723. +}
  35724. +
  35725. +void SetPacketRx(PADAPTER pAdapter, u8 bStartRx)
  35726. +{
  35727. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  35728. +
  35729. + if(bStartRx)
  35730. + {
  35731. + pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS;
  35732. +
  35733. + pHalData->ReceiveConfig |= ACRC32;
  35734. +
  35735. + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);
  35736. +
  35737. + // Accept all data frames
  35738. + rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF);
  35739. + }
  35740. + else
  35741. + {
  35742. + rtw_write32(pAdapter, REG_RCR, 0);
  35743. + }
  35744. +}
  35745. +
  35746. +void ResetPhyRxPktCount(PADAPTER pAdapter)
  35747. +{
  35748. + u32 i, phyrx_set = 0;
  35749. +
  35750. + for (i = 0; i <= 0xF; i++) {
  35751. + phyrx_set = 0;
  35752. + phyrx_set |= _RXERR_RPT_SEL(i); //select
  35753. + phyrx_set |= RXERR_RPT_RST; // set counter to zero
  35754. + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
  35755. + }
  35756. +}
  35757. +
  35758. +static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit)
  35759. +{
  35760. + //selection
  35761. + u32 phyrx_set = 0, count = 0;
  35762. +
  35763. + phyrx_set = _RXERR_RPT_SEL(selbit & 0xF);
  35764. + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
  35765. +
  35766. + //Read packet count
  35767. + count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK;
  35768. +
  35769. + return count;
  35770. +}
  35771. +
  35772. +u32 GetPhyRxPktReceived(PADAPTER pAdapter)
  35773. +{
  35774. + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  35775. +
  35776. + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK);
  35777. + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK);
  35778. + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK);
  35779. +
  35780. + return OFDM_cnt + CCK_cnt + HT_cnt;
  35781. +}
  35782. +
  35783. +u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter)
  35784. +{
  35785. + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  35786. +
  35787. + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL);
  35788. + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL);
  35789. + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL);
  35790. +
  35791. + return OFDM_cnt + CCK_cnt + HT_cnt;
  35792. +}
  35793. +
  35794. +//reg 0x808[9:0]: FFT data x
  35795. +//reg 0x808[22]: 0 --> 1 to get 1 FFT data y
  35796. +//reg 0x8B4[15:0]: FFT data y report
  35797. +static u32 GetPSDData(PADAPTER pAdapter, u32 point)
  35798. +{
  35799. + int psd_val;
  35800. +
  35801. +
  35802. + psd_val = rtw_read32(pAdapter, 0x808);
  35803. + psd_val &= 0xFFBFFC00;
  35804. + psd_val |= point;
  35805. +
  35806. + rtw_write32(pAdapter, 0x808, psd_val);
  35807. + rtw_mdelay_os(1);
  35808. + psd_val |= 0x00400000;
  35809. +
  35810. + rtw_write32(pAdapter, 0x808, psd_val);
  35811. + rtw_mdelay_os(1);
  35812. + psd_val = rtw_read32(pAdapter, 0x8B4);
  35813. +
  35814. + psd_val &= 0x0000FFFF;
  35815. +
  35816. + return psd_val;
  35817. +}
  35818. +
  35819. +/*
  35820. + * pts start_point_min stop_point_max
  35821. + * 128 64 64 + 128 = 192
  35822. + * 256 128 128 + 256 = 384
  35823. + * 512 256 256 + 512 = 768
  35824. + * 1024 512 512 + 1024 = 1536
  35825. + *
  35826. + */
  35827. +u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
  35828. +{
  35829. + u32 i, psd_pts=0, psd_start=0, psd_stop=0;
  35830. + u32 psd_data=0;
  35831. +
  35832. +#ifdef PLATFORM_LINUX
  35833. + if (!netif_running(pAdapter->pnetdev)) {
  35834. + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n"));
  35835. + return 0;
  35836. + }
  35837. +#endif
  35838. +
  35839. + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
  35840. + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! not in MP mode!\n"));
  35841. + return 0;
  35842. + }
  35843. +
  35844. + if (strlen(data) == 0) { //default value
  35845. + psd_pts = 128;
  35846. + psd_start = 64;
  35847. + psd_stop = 128;
  35848. + } else {
  35849. + sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
  35850. + }
  35851. +
  35852. + _rtw_memset(data, '\0', sizeof(data));
  35853. +
  35854. + i = psd_start;
  35855. + while (i < psd_stop)
  35856. + {
  35857. + if (i >= psd_pts) {
  35858. + psd_data = GetPSDData(pAdapter, i-psd_pts);
  35859. + } else {
  35860. + psd_data = GetPSDData(pAdapter, i);
  35861. + }
  35862. + sprintf(data, "%s%x ", data, psd_data);
  35863. + i++;
  35864. + }
  35865. +
  35866. + #ifdef CONFIG_LONG_DELAY_ISSUE
  35867. + rtw_msleep_os(100);
  35868. + #else
  35869. + rtw_mdelay_os(100);
  35870. + #endif
  35871. +
  35872. + return strlen(data)+1;
  35873. +}
  35874. +
  35875. +#endif
  35876. --- /dev/null
  35877. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c
  35878. @@ -0,0 +1,2953 @@
  35879. +/******************************************************************************
  35880. + *
  35881. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  35882. + *
  35883. + * This program is free software; you can redistribute it and/or modify it
  35884. + * under the terms of version 2 of the GNU General Public License as
  35885. + * published by the Free Software Foundation.
  35886. + *
  35887. + * This program is distributed in the hope that it will be useful, but WITHOUT
  35888. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  35889. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  35890. + * more details.
  35891. + *
  35892. + * You should have received a copy of the GNU General Public License along with
  35893. + * this program; if not, write to the Free Software Foundation, Inc.,
  35894. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  35895. + *
  35896. + *
  35897. + ******************************************************************************/
  35898. +#define _RTW_MP_IOCTL_C_
  35899. +
  35900. +#include <drv_conf.h>
  35901. +#include <osdep_service.h>
  35902. +#include <drv_types.h>
  35903. +#include <mlme_osdep.h>
  35904. +
  35905. +//#include <rtw_mp.h>
  35906. +#include <rtw_mp_ioctl.h>
  35907. +
  35908. +
  35909. +//**************** oid_rtl_seg_81_85 section start ****************
  35910. +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
  35911. +{
  35912. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  35913. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  35914. +
  35915. +_func_enter_;
  35916. +
  35917. + if (poid_par_priv->information_buf_len < sizeof(u8))
  35918. + return NDIS_STATUS_INVALID_LENGTH;
  35919. +
  35920. + if (poid_par_priv->type_of_oid == SET_OID) {
  35921. + Adapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf;
  35922. + } else if (poid_par_priv->type_of_oid == QUERY_OID) {
  35923. + *(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode;
  35924. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  35925. + RT_TRACE(_module_mp_, _drv_info_, ("-query Wireless Mode=%d\n", Adapter->registrypriv.wireless_mode));
  35926. + } else {
  35927. + status = NDIS_STATUS_NOT_ACCEPTED;
  35928. + }
  35929. +
  35930. +_func_exit_;
  35931. +
  35932. + return status;
  35933. +}
  35934. +//**************** oid_rtl_seg_81_87_80 section start ****************
  35935. +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
  35936. +{
  35937. +#ifdef PLATFORM_OS_XP
  35938. + _irqL oldirql;
  35939. +#endif
  35940. + struct bb_reg_param *pbbreg;
  35941. + u16 offset;
  35942. + u32 value;
  35943. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  35944. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  35945. +
  35946. +_func_enter_;
  35947. +
  35948. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_bb_reg_hdl\n"));
  35949. +
  35950. + if (poid_par_priv->type_of_oid != SET_OID)
  35951. + return NDIS_STATUS_NOT_ACCEPTED;
  35952. +
  35953. + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
  35954. + return NDIS_STATUS_INVALID_LENGTH;
  35955. +
  35956. + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
  35957. +
  35958. + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff
  35959. + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR;
  35960. +
  35961. + value = pbbreg->value;
  35962. +
  35963. + RT_TRACE(_module_mp_, _drv_notice_,
  35964. + ("oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\n",
  35965. + offset, value));
  35966. +
  35967. + _irqlevel_changed_(&oldirql, LOWER);
  35968. + write_bbreg(Adapter, offset, 0xFFFFFFFF, value);
  35969. + _irqlevel_changed_(&oldirql, RAISE);
  35970. +
  35971. +_func_exit_;
  35972. +
  35973. + return status;
  35974. +}
  35975. +//------------------------------------------------------------------------------
  35976. +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
  35977. +{
  35978. +#ifdef PLATFORM_OS_XP
  35979. + _irqL oldirql;
  35980. +#endif
  35981. + struct bb_reg_param *pbbreg;
  35982. + u16 offset;
  35983. + u32 value;
  35984. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  35985. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  35986. +
  35987. +_func_enter_;
  35988. +
  35989. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_bb_reg_hdl\n"));
  35990. +
  35991. + if (poid_par_priv->type_of_oid != QUERY_OID)
  35992. + return NDIS_STATUS_NOT_ACCEPTED;
  35993. +
  35994. + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
  35995. + return NDIS_STATUS_INVALID_LENGTH;
  35996. +
  35997. + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
  35998. +
  35999. + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff
  36000. + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR;
  36001. +
  36002. + _irqlevel_changed_(&oldirql, LOWER);
  36003. + value = read_bbreg(Adapter, offset, 0xFFFFFFFF);
  36004. + _irqlevel_changed_(&oldirql, RAISE);
  36005. +
  36006. + pbbreg->value = value;
  36007. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36008. +
  36009. + RT_TRACE(_module_mp_, _drv_notice_,
  36010. + ("-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\n",
  36011. + offset, value));
  36012. +_func_exit_;
  36013. +
  36014. + return status;
  36015. +}
  36016. +//------------------------------------------------------------------------------
  36017. +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
  36018. +{
  36019. +#ifdef PLATFORM_OS_XP
  36020. + _irqL oldirql;
  36021. +#endif
  36022. + struct rf_reg_param *pbbreg;
  36023. + u8 path;
  36024. + u8 offset;
  36025. + u32 value;
  36026. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36027. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36028. +
  36029. +_func_enter_;
  36030. +
  36031. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_rf_reg_hdl\n"));
  36032. +
  36033. + if (poid_par_priv->type_of_oid != SET_OID)
  36034. + return NDIS_STATUS_NOT_ACCEPTED;
  36035. +
  36036. + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
  36037. + return NDIS_STATUS_INVALID_LENGTH;
  36038. +
  36039. + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
  36040. +
  36041. + if (pbbreg->path >= MAX_RF_PATH_NUMS)
  36042. + return NDIS_STATUS_NOT_ACCEPTED;
  36043. + if (pbbreg->offset > 0xFF)
  36044. + return NDIS_STATUS_NOT_ACCEPTED;
  36045. + if (pbbreg->value > 0xFFFFF)
  36046. + return NDIS_STATUS_NOT_ACCEPTED;
  36047. +
  36048. + path = (u8)pbbreg->path;
  36049. + offset = (u8)pbbreg->offset;
  36050. + value = pbbreg->value;
  36051. +
  36052. + RT_TRACE(_module_mp_, _drv_notice_,
  36053. + ("oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n",
  36054. + path, offset, value));
  36055. +
  36056. + _irqlevel_changed_(&oldirql, LOWER);
  36057. + write_rfreg(Adapter, path, offset, value);
  36058. + _irqlevel_changed_(&oldirql, RAISE);
  36059. +
  36060. +_func_exit_;
  36061. +
  36062. + return status;
  36063. +}
  36064. +//------------------------------------------------------------------------------
  36065. +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
  36066. +{
  36067. +#ifdef PLATFORM_OS_XP
  36068. + _irqL oldirql;
  36069. +#endif
  36070. + struct rf_reg_param *pbbreg;
  36071. + u8 path;
  36072. + u8 offset;
  36073. + u32 value;
  36074. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36075. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36076. +
  36077. +_func_enter_;
  36078. +
  36079. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_rf_reg_hdl\n"));
  36080. +
  36081. + if (poid_par_priv->type_of_oid != QUERY_OID)
  36082. + return NDIS_STATUS_NOT_ACCEPTED;
  36083. +
  36084. + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
  36085. + return NDIS_STATUS_INVALID_LENGTH;
  36086. +
  36087. + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
  36088. +
  36089. + if (pbbreg->path >= MAX_RF_PATH_NUMS)
  36090. + return NDIS_STATUS_NOT_ACCEPTED;
  36091. + if (pbbreg->offset > 0xFF)
  36092. + return NDIS_STATUS_NOT_ACCEPTED;
  36093. +
  36094. + path = (u8)pbbreg->path;
  36095. + offset = (u8)pbbreg->offset;
  36096. +
  36097. + _irqlevel_changed_(&oldirql, LOWER);
  36098. + value = read_rfreg(Adapter, path, offset);
  36099. + _irqlevel_changed_(&oldirql, RAISE);
  36100. +
  36101. + pbbreg->value = value;
  36102. +
  36103. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36104. +
  36105. + RT_TRACE(_module_mp_, _drv_notice_,
  36106. + ("-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n",
  36107. + path, offset, value));
  36108. +
  36109. +_func_exit_;
  36110. +
  36111. + return status;
  36112. +}
  36113. +//**************** oid_rtl_seg_81_87_00 section end****************
  36114. +//------------------------------------------------------------------------------
  36115. +
  36116. +//**************** oid_rtl_seg_81_80_00 section start ****************
  36117. +//------------------------------------------------------------------------------
  36118. +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv)
  36119. +{
  36120. +#ifdef PLATFORM_OS_XP
  36121. + _irqL oldirql;
  36122. +#endif
  36123. + u32 ratevalue;//4
  36124. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36125. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36126. +
  36127. +_func_enter_;
  36128. +
  36129. + RT_TRACE(_module_mp_, _drv_notice_,
  36130. + ("+oid_rt_pro_set_data_rate_hdl\n"));
  36131. +
  36132. + if (poid_par_priv->type_of_oid != SET_OID)
  36133. + return NDIS_STATUS_NOT_ACCEPTED;
  36134. +
  36135. + if (poid_par_priv->information_buf_len != sizeof(u32))
  36136. + return NDIS_STATUS_INVALID_LENGTH;
  36137. +
  36138. + ratevalue = *((u32*)poid_par_priv->information_buf);//4
  36139. + RT_TRACE(_module_mp_, _drv_notice_,
  36140. + ("oid_rt_pro_set_data_rate_hdl: data rate idx=%d\n", ratevalue));
  36141. + if (ratevalue >= MPT_RATE_LAST)
  36142. + return NDIS_STATUS_INVALID_DATA;
  36143. +
  36144. + Adapter->mppriv.rateidx = ratevalue;
  36145. +
  36146. + _irqlevel_changed_(&oldirql, LOWER);
  36147. + SetDataRate(Adapter);
  36148. + _irqlevel_changed_(&oldirql, RAISE);
  36149. +
  36150. +_func_exit_;
  36151. +
  36152. + return status;
  36153. +}
  36154. +//------------------------------------------------------------------------------
  36155. +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv)
  36156. +{
  36157. +#ifdef PLATFORM_OS_XP
  36158. + _irqL oldirql;
  36159. +#endif
  36160. + u32 mode;
  36161. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36162. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36163. +
  36164. +_func_enter_;
  36165. +
  36166. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_start_test_hdl\n"));
  36167. +
  36168. + if (Adapter->registrypriv.mp_mode == 0)
  36169. + return NDIS_STATUS_NOT_ACCEPTED;
  36170. +
  36171. + if (poid_par_priv->type_of_oid != SET_OID)
  36172. + return NDIS_STATUS_NOT_ACCEPTED;
  36173. +
  36174. + _irqlevel_changed_(&oldirql, LOWER);
  36175. +
  36176. + //IQCalibrateBcut(Adapter);
  36177. +
  36178. + mode = *((u32*)poid_par_priv->information_buf);
  36179. + Adapter->mppriv.mode = mode;// 1 for loopback
  36180. +
  36181. + if (mp_start_test(Adapter) == _FAIL) {
  36182. + status = NDIS_STATUS_NOT_ACCEPTED;
  36183. + goto exit;
  36184. + }
  36185. +
  36186. +exit:
  36187. + _irqlevel_changed_(&oldirql, RAISE);
  36188. +
  36189. + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_start_test_hdl: mp_mode=%d\n", Adapter->mppriv.mode));
  36190. +
  36191. +_func_exit_;
  36192. +
  36193. + return status;
  36194. +}
  36195. +//------------------------------------------------------------------------------
  36196. +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv)
  36197. +{
  36198. +#ifdef PLATFORM_OS_XP
  36199. + _irqL oldirql;
  36200. +#endif
  36201. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36202. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36203. +
  36204. +_func_enter_;
  36205. +
  36206. + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_STOP_TEST\n"));
  36207. +
  36208. + if (poid_par_priv->type_of_oid != SET_OID)
  36209. + return NDIS_STATUS_NOT_ACCEPTED;
  36210. +
  36211. + _irqlevel_changed_(&oldirql, LOWER);
  36212. + mp_stop_test(Adapter);
  36213. + _irqlevel_changed_(&oldirql, RAISE);
  36214. +
  36215. + RT_TRACE(_module_mp_, _drv_notice_, ("-Set OID_RT_PRO_STOP_TEST\n"));
  36216. +
  36217. +_func_exit_;
  36218. +
  36219. + return status;
  36220. +}
  36221. +//------------------------------------------------------------------------------
  36222. +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv)
  36223. +{
  36224. +#ifdef PLATFORM_OS_XP
  36225. + _irqL oldirql;
  36226. +#endif
  36227. + u32 Channel;
  36228. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36229. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36230. +
  36231. +_func_enter_;
  36232. +
  36233. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_channel_direct_call_hdl\n"));
  36234. +
  36235. + if (poid_par_priv->information_buf_len != sizeof(u32))
  36236. + return NDIS_STATUS_INVALID_LENGTH;
  36237. +
  36238. + if (poid_par_priv->type_of_oid == QUERY_OID) {
  36239. + *((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel;
  36240. + return NDIS_STATUS_SUCCESS;
  36241. + }
  36242. +
  36243. + if (poid_par_priv->type_of_oid != SET_OID)
  36244. + return NDIS_STATUS_NOT_ACCEPTED;
  36245. +
  36246. + Channel = *((u32*)poid_par_priv->information_buf);
  36247. + RT_TRACE(_module_mp_, _drv_notice_, ("oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\n", Channel));
  36248. + if (Channel > 14)
  36249. + return NDIS_STATUS_NOT_ACCEPTED;
  36250. + Adapter->mppriv.channel = Channel;
  36251. +
  36252. + _irqlevel_changed_(&oldirql, LOWER);
  36253. + SetChannel(Adapter);
  36254. + _irqlevel_changed_(&oldirql, RAISE);
  36255. +
  36256. +_func_exit_;
  36257. +
  36258. + return status;
  36259. +}
  36260. +//------------------------------------------------------------------------------
  36261. +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv)
  36262. +{
  36263. +#ifdef PLATFORM_OS_XP
  36264. + _irqL oldirql;
  36265. +#endif
  36266. + u16 bandwidth;
  36267. + u16 channel_offset;
  36268. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36269. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  36270. +
  36271. +_func_enter_;
  36272. +
  36273. + RT_TRACE(_module_mp_, _drv_info_,
  36274. + ("+oid_rt_set_bandwidth_hdl\n"));
  36275. +
  36276. + if (poid_par_priv->type_of_oid != SET_OID)
  36277. + return NDIS_STATUS_NOT_ACCEPTED;
  36278. +
  36279. + if (poid_par_priv->information_buf_len < sizeof(u32))
  36280. + return NDIS_STATUS_INVALID_LENGTH;
  36281. +
  36282. + bandwidth = *((u32*)poid_par_priv->information_buf);//4
  36283. + channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  36284. +
  36285. + if (bandwidth != HT_CHANNEL_WIDTH_40)
  36286. + bandwidth = HT_CHANNEL_WIDTH_20;
  36287. + padapter->mppriv.bandwidth = (u8)bandwidth;
  36288. + padapter->mppriv.prime_channel_offset = (u8)channel_offset;
  36289. +
  36290. + _irqlevel_changed_(&oldirql, LOWER);
  36291. + SetBandwidth(padapter);
  36292. + _irqlevel_changed_(&oldirql, RAISE);
  36293. +
  36294. + RT_TRACE(_module_mp_, _drv_notice_,
  36295. + ("-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\n",
  36296. + bandwidth, channel_offset));
  36297. +
  36298. +_func_exit_;
  36299. +
  36300. + return status;
  36301. +}
  36302. +//------------------------------------------------------------------------------
  36303. +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv)
  36304. +{
  36305. +#ifdef PLATFORM_OS_XP
  36306. + _irqL oldirql;
  36307. +#endif
  36308. + u32 antenna;
  36309. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36310. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36311. +
  36312. +_func_enter_;
  36313. +
  36314. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_antenna_bb_hdl\n"));
  36315. +
  36316. + if (poid_par_priv->information_buf_len != sizeof(u32))
  36317. + return NDIS_STATUS_INVALID_LENGTH;
  36318. +
  36319. + if (poid_par_priv->type_of_oid == SET_OID)
  36320. + {
  36321. + antenna = *(u32*)poid_par_priv->information_buf;
  36322. +
  36323. + Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16);
  36324. + Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF);
  36325. + RT_TRACE(_module_mp_, _drv_notice_,
  36326. + ("oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\n",
  36327. + Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx));
  36328. +
  36329. + _irqlevel_changed_(&oldirql, LOWER);
  36330. + SetAntenna(Adapter);
  36331. + _irqlevel_changed_(&oldirql, RAISE);
  36332. + } else {
  36333. + antenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx;
  36334. + *(u32*)poid_par_priv->information_buf = antenna;
  36335. + }
  36336. +
  36337. +_func_exit_;
  36338. +
  36339. + return status;
  36340. +}
  36341. +
  36342. +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv)
  36343. +{
  36344. +#ifdef PLATFORM_OS_XP
  36345. + _irqL oldirql;
  36346. +#endif
  36347. + u32 tx_pwr_idx;
  36348. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36349. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36350. +
  36351. +_func_enter_;
  36352. +
  36353. + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_set_tx_power_control_hdl\n"));
  36354. +
  36355. + if (poid_par_priv->type_of_oid != SET_OID)
  36356. + return NDIS_STATUS_NOT_ACCEPTED;
  36357. +
  36358. + if (poid_par_priv->information_buf_len != sizeof(u32))
  36359. + return NDIS_STATUS_INVALID_LENGTH;
  36360. +
  36361. + tx_pwr_idx = *((u32*)poid_par_priv->information_buf);
  36362. + if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE)
  36363. + return NDIS_STATUS_NOT_ACCEPTED;
  36364. +
  36365. + Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx;
  36366. +
  36367. + RT_TRACE(_module_mp_, _drv_notice_,
  36368. + ("oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\n",
  36369. + Adapter->mppriv.txpoweridx));
  36370. +
  36371. + _irqlevel_changed_(&oldirql, LOWER);
  36372. + SetTxPower(Adapter);
  36373. + _irqlevel_changed_(&oldirql, RAISE);
  36374. +
  36375. +_func_exit_;
  36376. +
  36377. + return status;
  36378. +}
  36379. +
  36380. +//------------------------------------------------------------------------------
  36381. +//**************** oid_rtl_seg_81_80_20 section start ****************
  36382. +//------------------------------------------------------------------------------
  36383. +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
  36384. +{
  36385. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36386. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36387. +
  36388. +_func_enter_;
  36389. +
  36390. + if (poid_par_priv->type_of_oid !=QUERY_OID) {
  36391. + status = NDIS_STATUS_NOT_ACCEPTED;
  36392. + return status;
  36393. + }
  36394. +
  36395. + if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
  36396. + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount;
  36397. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36398. + } else {
  36399. + status = NDIS_STATUS_INVALID_LENGTH;
  36400. + }
  36401. +
  36402. +_func_exit_;
  36403. +
  36404. + return status;
  36405. +}
  36406. +//------------------------------------------------------------------------------
  36407. +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
  36408. +{
  36409. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36410. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36411. +
  36412. +_func_enter_;
  36413. +
  36414. + if (poid_par_priv->type_of_oid != QUERY_OID) {
  36415. + status = NDIS_STATUS_NOT_ACCEPTED;
  36416. + return status;
  36417. + }
  36418. + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_received_hdl.\n"));
  36419. + if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
  36420. + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount;
  36421. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36422. + RT_TRACE(_module_mp_, _drv_alert_, ("recv_ok:%d \n",Adapter->mppriv.rx_pktcount));
  36423. + } else {
  36424. + status = NDIS_STATUS_INVALID_LENGTH;
  36425. + }
  36426. +
  36427. +_func_exit_;
  36428. +
  36429. + return status;
  36430. +}
  36431. +//------------------------------------------------------------------------------
  36432. +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
  36433. +{
  36434. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36435. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36436. +
  36437. +_func_enter_;
  36438. +
  36439. + if (poid_par_priv->type_of_oid != QUERY_OID) {
  36440. + status = NDIS_STATUS_NOT_ACCEPTED;
  36441. + return status;
  36442. + }
  36443. + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\n"));
  36444. + if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
  36445. + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount;
  36446. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36447. + RT_TRACE(_module_mp_, _drv_alert_, ("recv_err:%d \n",Adapter->mppriv.rx_crcerrpktcount));
  36448. + } else {
  36449. + status = NDIS_STATUS_INVALID_LENGTH;
  36450. + }
  36451. +
  36452. +_func_exit_;
  36453. +
  36454. + return status;
  36455. +}
  36456. +//------------------------------------------------------------------------------
  36457. +
  36458. +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
  36459. +{
  36460. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36461. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36462. +
  36463. +_func_enter_;
  36464. +
  36465. + if (poid_par_priv->type_of_oid != SET_OID) {
  36466. + status = NDIS_STATUS_NOT_ACCEPTED;
  36467. + return status;
  36468. + }
  36469. +
  36470. + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_reset_tx_packet_sent_hdl.\n"));
  36471. + Adapter->mppriv.tx_pktcount = 0;
  36472. +
  36473. +_func_exit_;
  36474. +
  36475. + return status;
  36476. +}
  36477. +//------------------------------------------------------------------------------
  36478. +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
  36479. +{
  36480. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36481. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36482. +
  36483. +_func_enter_;
  36484. +
  36485. + if (poid_par_priv->type_of_oid != SET_OID)
  36486. + {
  36487. + status = NDIS_STATUS_NOT_ACCEPTED;
  36488. + return status;
  36489. + }
  36490. +
  36491. + if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
  36492. + Adapter->mppriv.rx_pktcount = 0;
  36493. + Adapter->mppriv.rx_crcerrpktcount = 0;
  36494. + } else {
  36495. + status = NDIS_STATUS_INVALID_LENGTH;
  36496. + }
  36497. +
  36498. +_func_exit_;
  36499. +
  36500. + return status;
  36501. +}
  36502. +//------------------------------------------------------------------------------
  36503. +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv)
  36504. +{
  36505. +#ifdef PLATFORM_OS_XP
  36506. + _irqL oldirql;
  36507. +#endif
  36508. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36509. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36510. +
  36511. +_func_enter_;
  36512. +
  36513. + if (poid_par_priv->type_of_oid != SET_OID) {
  36514. + status = NDIS_STATUS_NOT_ACCEPTED;
  36515. + return status;
  36516. + }
  36517. +
  36518. + _irqlevel_changed_(&oldirql, LOWER);
  36519. + ResetPhyRxPktCount(Adapter);
  36520. + _irqlevel_changed_(&oldirql, RAISE);
  36521. +
  36522. +_func_exit_;
  36523. +
  36524. + return status;
  36525. +}
  36526. +//------------------------------------------------------------------------------
  36527. +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
  36528. +{
  36529. +#ifdef PLATFORM_OS_XP
  36530. + _irqL oldirql;
  36531. +#endif
  36532. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36533. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36534. +
  36535. +_func_enter_;
  36536. +
  36537. + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_received_hdl\n"));
  36538. +
  36539. + if (poid_par_priv->type_of_oid != QUERY_OID)
  36540. + return NDIS_STATUS_NOT_ACCEPTED;
  36541. +
  36542. + if (poid_par_priv->information_buf_len != sizeof(ULONG))
  36543. + return NDIS_STATUS_INVALID_LENGTH;
  36544. +
  36545. + _irqlevel_changed_(&oldirql, LOWER);
  36546. + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter);
  36547. + _irqlevel_changed_(&oldirql, RAISE);
  36548. +
  36549. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36550. +
  36551. + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\n", *(ULONG*)poid_par_priv->information_buf));
  36552. +
  36553. +_func_exit_;
  36554. +
  36555. + return status;
  36556. +}
  36557. +//------------------------------------------------------------------------------
  36558. +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
  36559. +{
  36560. +#ifdef PLATFORM_OS_XP
  36561. + _irqL oldirql;
  36562. +#endif
  36563. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36564. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36565. +
  36566. +_func_enter_;
  36567. +
  36568. + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_crc32_error_hdl\n"));
  36569. +
  36570. + if (poid_par_priv->type_of_oid != QUERY_OID)
  36571. + return NDIS_STATUS_NOT_ACCEPTED;
  36572. +
  36573. +
  36574. + if (poid_par_priv->information_buf_len != sizeof(ULONG))
  36575. + return NDIS_STATUS_INVALID_LENGTH;
  36576. +
  36577. + _irqlevel_changed_(&oldirql, LOWER);
  36578. + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter);
  36579. + _irqlevel_changed_(&oldirql, RAISE);
  36580. +
  36581. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36582. +
  36583. + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\n", *(ULONG*)poid_par_priv->information_buf));
  36584. +
  36585. +_func_exit_;
  36586. +
  36587. + return status;
  36588. +}
  36589. +//**************** oid_rtl_seg_81_80_20 section end ****************
  36590. +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv)
  36591. +{
  36592. +#ifdef PLATFORM_OS_XP
  36593. + _irqL oldirql;
  36594. +#endif
  36595. + u32 bStartTest;
  36596. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36597. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36598. +
  36599. +_func_enter_;
  36600. +
  36601. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_continuous_tx_hdl\n"));
  36602. +
  36603. + if (poid_par_priv->type_of_oid != SET_OID)
  36604. + return NDIS_STATUS_NOT_ACCEPTED;
  36605. +
  36606. + bStartTest = *((u32*)poid_par_priv->information_buf);
  36607. +
  36608. + _irqlevel_changed_(&oldirql, LOWER);
  36609. + SetContinuousTx(Adapter,(u8)bStartTest);
  36610. + if (bStartTest) {
  36611. + struct mp_priv *pmp_priv = &Adapter->mppriv;
  36612. + if (pmp_priv->tx.stop == 0) {
  36613. + pmp_priv->tx.stop = 1;
  36614. + DBG_871X("%s: pkt tx is running...\n", __func__);
  36615. + rtw_msleep_os(5);
  36616. + }
  36617. + pmp_priv->tx.stop = 0;
  36618. + pmp_priv->tx.count = 1;
  36619. + SetPacketTx(Adapter);
  36620. + }
  36621. + _irqlevel_changed_(&oldirql, RAISE);
  36622. +
  36623. +_func_exit_;
  36624. +
  36625. + return status;
  36626. +}
  36627. +
  36628. +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv)
  36629. +{
  36630. +#ifdef PLATFORM_OS_XP
  36631. + _irqL oldirql;
  36632. +#endif
  36633. + u32 bStartTest;
  36634. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36635. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36636. +
  36637. +_func_enter_;
  36638. +
  36639. + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_carrier_tx_hdl\n"));
  36640. +
  36641. + if (poid_par_priv->type_of_oid != SET_OID)
  36642. + return NDIS_STATUS_NOT_ACCEPTED;
  36643. +
  36644. + bStartTest = *((u32*)poid_par_priv->information_buf);
  36645. +
  36646. + _irqlevel_changed_(&oldirql, LOWER);
  36647. + SetSingleCarrierTx(Adapter, (u8)bStartTest);
  36648. + if (bStartTest) {
  36649. + struct mp_priv *pmp_priv = &Adapter->mppriv;
  36650. + if (pmp_priv->tx.stop == 0) {
  36651. + pmp_priv->tx.stop = 1;
  36652. + DBG_871X("%s: pkt tx is running...\n", __func__);
  36653. + rtw_msleep_os(5);
  36654. + }
  36655. + pmp_priv->tx.stop = 0;
  36656. + pmp_priv->tx.count = 1;
  36657. + SetPacketTx(Adapter);
  36658. + }
  36659. + _irqlevel_changed_(&oldirql, RAISE);
  36660. +
  36661. +_func_exit_;
  36662. +
  36663. + return status;
  36664. +}
  36665. +
  36666. +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv)
  36667. +{
  36668. +#ifdef PLATFORM_OS_XP
  36669. + _irqL oldirql;
  36670. +#endif
  36671. + u32 bStartTest;
  36672. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36673. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36674. +
  36675. +_func_enter_;
  36676. +
  36677. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_carrier_suppression_tx_hdl\n"));
  36678. +
  36679. + if (poid_par_priv->type_of_oid != SET_OID)
  36680. + return NDIS_STATUS_NOT_ACCEPTED;
  36681. +
  36682. + bStartTest = *((u32*)poid_par_priv->information_buf);
  36683. +
  36684. + _irqlevel_changed_(&oldirql, LOWER);
  36685. + SetCarrierSuppressionTx(Adapter, (u8)bStartTest);
  36686. + if (bStartTest) {
  36687. + struct mp_priv *pmp_priv = &Adapter->mppriv;
  36688. + if (pmp_priv->tx.stop == 0) {
  36689. + pmp_priv->tx.stop = 1;
  36690. + DBG_871X("%s: pkt tx is running...\n", __func__);
  36691. + rtw_msleep_os(5);
  36692. + }
  36693. + pmp_priv->tx.stop = 0;
  36694. + pmp_priv->tx.count = 1;
  36695. + SetPacketTx(Adapter);
  36696. + }
  36697. + _irqlevel_changed_(&oldirql, RAISE);
  36698. +
  36699. +_func_exit_;
  36700. +
  36701. + return status;
  36702. +}
  36703. +
  36704. +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv)
  36705. +{
  36706. +#ifdef PLATFORM_OS_XP
  36707. + _irqL oldirql;
  36708. +#endif
  36709. + u32 bStartTest;
  36710. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36711. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36712. +
  36713. +_func_enter_;
  36714. +
  36715. + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_tone_tx_hdl\n"));
  36716. +
  36717. + if (poid_par_priv->type_of_oid != SET_OID)
  36718. + return NDIS_STATUS_NOT_ACCEPTED;
  36719. +
  36720. + bStartTest = *((u32*)poid_par_priv->information_buf);
  36721. +
  36722. + _irqlevel_changed_(&oldirql, LOWER);
  36723. + SetSingleToneTx(Adapter,(u8)bStartTest);
  36724. + _irqlevel_changed_(&oldirql, RAISE);
  36725. +
  36726. +_func_exit_;
  36727. +
  36728. + return status;
  36729. +}
  36730. +
  36731. +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv)
  36732. +{
  36733. + return 0;
  36734. +}
  36735. +
  36736. +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv)
  36737. +{
  36738. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36739. +
  36740. +#ifdef PLATFORM_OS_XP
  36741. + _irqL oldirql;
  36742. +#endif
  36743. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36744. +_func_enter_;
  36745. +
  36746. + if (poid_par_priv->type_of_oid != SET_OID)
  36747. + return NDIS_STATUS_NOT_ACCEPTED;
  36748. +
  36749. + _irqlevel_changed_(&oldirql, LOWER);
  36750. + rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, 0);
  36751. + _irqlevel_changed_(&oldirql, RAISE);
  36752. +
  36753. +_func_exit_;
  36754. +
  36755. + return status;
  36756. +}
  36757. +//**************** oid_rtl_seg_81_80_00 section end ****************
  36758. +//------------------------------------------------------------------------------
  36759. +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv)
  36760. +{
  36761. +#if 0
  36762. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36763. +
  36764. +#ifdef PLATFORM_OS_XP
  36765. + _irqL oldirql;
  36766. +#endif
  36767. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36768. +
  36769. + PNDIS_802_11_SSID pssid;
  36770. +
  36771. +_func_enter_;
  36772. +
  36773. + if (poid_par_priv->type_of_oid != SET_OID)
  36774. + return NDIS_STATUS_NOT_ACCEPTED;
  36775. +
  36776. + *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID);
  36777. + *poid_par_priv->bytes_rw = 0;
  36778. + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
  36779. + return NDIS_STATUS_INVALID_LENGTH;
  36780. +
  36781. + pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf;
  36782. +
  36783. + _irqlevel_changed_(&oldirql, LOWER);
  36784. +
  36785. + if (mp_start_joinbss(Adapter, pssid) == _FAIL)
  36786. + status = NDIS_STATUS_NOT_ACCEPTED;
  36787. +
  36788. + _irqlevel_changed_(&oldirql, RAISE);
  36789. +
  36790. + *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID);
  36791. +
  36792. +_func_exit_;
  36793. +
  36794. + return status;
  36795. +#else
  36796. + return 0;
  36797. +#endif
  36798. +}
  36799. +//------------------------------------------------------------------------------
  36800. +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv)
  36801. +{
  36802. +#ifdef PLATFORM_OS_XP
  36803. + _irqL oldirql;
  36804. +#endif
  36805. + pRW_Reg RegRWStruct;
  36806. + u32 offset, width;
  36807. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36808. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  36809. +
  36810. +_func_enter_;
  36811. +
  36812. + RT_TRACE(_module_mp_, _drv_info_,
  36813. + ("+oid_rt_pro_read_register_hdl\n"));
  36814. +
  36815. + if (poid_par_priv->type_of_oid != QUERY_OID)
  36816. + return NDIS_STATUS_NOT_ACCEPTED;
  36817. +
  36818. + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf;
  36819. + offset = RegRWStruct->offset;
  36820. + width = RegRWStruct->width;
  36821. +
  36822. + if (offset > 0xFFF)
  36823. + return NDIS_STATUS_NOT_ACCEPTED;
  36824. +
  36825. + _irqlevel_changed_(&oldirql, LOWER);
  36826. +
  36827. + switch (width) {
  36828. + case 1:
  36829. + RegRWStruct->value = rtw_read8(Adapter, offset);
  36830. + break;
  36831. + case 2:
  36832. + RegRWStruct->value = rtw_read16(Adapter, offset);
  36833. + break;
  36834. + default:
  36835. + width = 4;
  36836. + RegRWStruct->value = rtw_read32(Adapter, offset);
  36837. + break;
  36838. + }
  36839. + RT_TRACE(_module_mp_, _drv_notice_,
  36840. + ("oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\n",
  36841. + offset, RegRWStruct->value));
  36842. +
  36843. + _irqlevel_changed_(&oldirql, RAISE);
  36844. +
  36845. + *poid_par_priv->bytes_rw = width;
  36846. +
  36847. +_func_exit_;
  36848. +
  36849. + return status;
  36850. +}
  36851. +//------------------------------------------------------------------------------
  36852. +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv)
  36853. +{
  36854. +#ifdef PLATFORM_OS_XP
  36855. + _irqL oldirql;
  36856. +#endif
  36857. + pRW_Reg RegRWStruct;
  36858. + u32 offset, width, value;
  36859. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36860. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  36861. +
  36862. +_func_enter_;
  36863. +
  36864. + RT_TRACE(_module_mp_, _drv_info_,
  36865. + ("+oid_rt_pro_write_register_hdl\n"));
  36866. +
  36867. + if (poid_par_priv->type_of_oid != SET_OID)
  36868. + return NDIS_STATUS_NOT_ACCEPTED;
  36869. +
  36870. + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf;
  36871. + offset = RegRWStruct->offset;
  36872. + width = RegRWStruct->width;
  36873. + value = RegRWStruct->value;
  36874. +
  36875. + if (offset > 0xFFF)
  36876. + return NDIS_STATUS_NOT_ACCEPTED;
  36877. +
  36878. + _irqlevel_changed_(&oldirql, LOWER);
  36879. +
  36880. + switch (RegRWStruct->width)
  36881. + {
  36882. + case 1:
  36883. + if (value > 0xFF) {
  36884. + status = NDIS_STATUS_NOT_ACCEPTED;
  36885. + break;
  36886. + }
  36887. + rtw_write8(padapter, offset, (u8)value);
  36888. + break;
  36889. + case 2:
  36890. + if (value > 0xFFFF) {
  36891. + status = NDIS_STATUS_NOT_ACCEPTED;
  36892. + break;
  36893. + }
  36894. + rtw_write16(padapter, offset, (u16)value);
  36895. + break;
  36896. + case 4:
  36897. + rtw_write32(padapter, offset, value);
  36898. + break;
  36899. + default:
  36900. + status = NDIS_STATUS_NOT_ACCEPTED;
  36901. + break;
  36902. + }
  36903. +
  36904. + _irqlevel_changed_(&oldirql, RAISE);
  36905. +
  36906. + RT_TRACE(_module_mp_, _drv_info_,
  36907. + ("-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\n",
  36908. + offset, width, value));
  36909. +
  36910. +_func_exit_;
  36911. +
  36912. + return status;
  36913. +}
  36914. +//------------------------------------------------------------------------------
  36915. +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv)
  36916. +{
  36917. +#if 0
  36918. +#ifdef PLATFORM_OS_XP
  36919. + _irqL oldirql;
  36920. +#endif
  36921. + pBurst_RW_Reg pBstRwReg;
  36922. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36923. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  36924. +
  36925. +_func_enter_;
  36926. +
  36927. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_read_register_hdl\n"));
  36928. +
  36929. + if (poid_par_priv->type_of_oid != QUERY_OID)
  36930. + return NDIS_STATUS_NOT_ACCEPTED;
  36931. +
  36932. + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;
  36933. +
  36934. + _irqlevel_changed_(&oldirql, LOWER);
  36935. + rtw_read_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);
  36936. + _irqlevel_changed_(&oldirql, RAISE);
  36937. +
  36938. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  36939. +
  36940. + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_read_register_hdl\n"));
  36941. +
  36942. +_func_exit_;
  36943. +
  36944. + return status;
  36945. +#else
  36946. + return 0;
  36947. +#endif
  36948. +}
  36949. +//------------------------------------------------------------------------------
  36950. +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv)
  36951. +{
  36952. +#if 0
  36953. +#ifdef PLATFORM_OS_XP
  36954. + _irqL oldirql;
  36955. +#endif
  36956. + pBurst_RW_Reg pBstRwReg;
  36957. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36958. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  36959. +
  36960. +_func_enter_;
  36961. +
  36962. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_write_register_hdl\n"));
  36963. +
  36964. + if (poid_par_priv->type_of_oid != SET_OID)
  36965. + return NDIS_STATUS_NOT_ACCEPTED;
  36966. +
  36967. + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;
  36968. +
  36969. + _irqlevel_changed_(&oldirql, LOWER);
  36970. + rtw_write_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);
  36971. + _irqlevel_changed_(&oldirql, RAISE);
  36972. +
  36973. + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_write_register_hdl\n"));
  36974. +
  36975. +_func_exit_;
  36976. +
  36977. + return status;
  36978. +#else
  36979. + return 0;
  36980. +#endif
  36981. +}
  36982. +//------------------------------------------------------------------------------
  36983. +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv)
  36984. +{
  36985. +#if 0
  36986. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  36987. +
  36988. + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context);
  36989. +
  36990. +#ifdef PLATFORM_OS_XP
  36991. + _irqL oldirql;
  36992. +#endif
  36993. +
  36994. + TX_CMD_Desc *TxCmd_Info;
  36995. +
  36996. +_func_enter_;
  36997. +
  36998. + if (poid_par_priv->type_of_oid != SET_OID)
  36999. + return NDIS_STATUS_NOT_ACCEPTED;
  37000. +
  37001. + RT_TRACE(_module_mp_, _drv_info_, ("+Set OID_RT_PRO_WRITE_TXCMD\n"));
  37002. +
  37003. + TxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf;
  37004. +
  37005. + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:Addr=%.8X\n", TxCmd_Info->offset));
  37006. + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:1.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[0]));
  37007. + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:2.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[1]));
  37008. + RT_TRACE(_module_mp_, _drv_info_, (("WRITE_TXCMD:3.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[2]));
  37009. + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:4.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[3]));
  37010. +
  37011. + _irqlevel_changed_(&oldirql, LOWER);
  37012. +
  37013. + rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]);
  37014. + rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]);
  37015. +
  37016. + _irqlevel_changed_(&oldirql, RAISE);
  37017. +
  37018. + RT_TRACE(_module_mp_, _drv_notice_,
  37019. + ("-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\n", status));
  37020. +
  37021. +_func_exit_;
  37022. +
  37023. + return status;
  37024. +#else
  37025. + return 0;
  37026. +#endif
  37027. +}
  37028. +
  37029. +//------------------------------------------------------------------------------
  37030. +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
  37031. +{
  37032. +#if 0
  37033. +#ifdef PLATFORM_OS_XP
  37034. + _irqL oldirql;
  37035. +#endif
  37036. + pEEPROM_RWParam pEEPROM;
  37037. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37038. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  37039. +
  37040. +_func_enter_;
  37041. +
  37042. + RT_TRACE(_module_mp_, _drv_info_, ("+Query OID_RT_PRO_READ16_EEPROM\n"));
  37043. +
  37044. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37045. + return NDIS_STATUS_NOT_ACCEPTED;
  37046. +
  37047. + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;
  37048. +
  37049. + _irqlevel_changed_(&oldirql, LOWER);
  37050. + pEEPROM->value = eeprom_read16(padapter, (u16)(pEEPROM->offset >> 1));
  37051. + _irqlevel_changed_(&oldirql, RAISE);
  37052. +
  37053. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37054. +
  37055. + RT_TRACE(_module_mp_, _drv_notice_,
  37056. + ("-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\n",
  37057. + pEEPROM->offset, pEEPROM->value));
  37058. +
  37059. +_func_exit_;
  37060. +
  37061. + return status;
  37062. +#else
  37063. + return 0;
  37064. +#endif
  37065. +}
  37066. +
  37067. +//------------------------------------------------------------------------------
  37068. +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv)
  37069. +{
  37070. +#if 0
  37071. +#ifdef PLATFORM_OS_XP
  37072. + _irqL oldirql;
  37073. +#endif
  37074. + pEEPROM_RWParam pEEPROM;
  37075. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37076. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  37077. +
  37078. +_func_enter_;
  37079. +
  37080. + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_WRITE16_EEPROM\n"));
  37081. +
  37082. + if (poid_par_priv->type_of_oid != SET_OID)
  37083. + return NDIS_STATUS_NOT_ACCEPTED;
  37084. +
  37085. + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;
  37086. +
  37087. + _irqlevel_changed_(&oldirql, LOWER);
  37088. + eeprom_write16(padapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value);
  37089. + _irqlevel_changed_(&oldirql, RAISE);
  37090. +
  37091. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37092. +
  37093. +_func_exit_;
  37094. +
  37095. + return status;
  37096. +#else
  37097. + return 0;
  37098. +#endif
  37099. +}
  37100. +//------------------------------------------------------------------------------
  37101. +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv)
  37102. +{
  37103. +#if 0
  37104. + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context);
  37105. +
  37106. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37107. +
  37108. + struct mp_wiparam *pwi_param;
  37109. +
  37110. +_func_enter_;
  37111. +
  37112. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37113. + return NDIS_STATUS_NOT_ACCEPTED;
  37114. +
  37115. + if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam))
  37116. + return NDIS_STATUS_INVALID_LENGTH;
  37117. +
  37118. + if (Adapter->mppriv.workparam.bcompleted == _FALSE)
  37119. + return NDIS_STATUS_NOT_ACCEPTED;
  37120. +
  37121. + pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf;
  37122. +
  37123. + _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam));
  37124. + Adapter->mppriv.act_in_progress = _FALSE;
  37125. +// RT_TRACE(_module_mp_, _drv_info_, ("rf:%x\n", pwiparam->IoValue));
  37126. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37127. +
  37128. +_func_exit_;
  37129. +
  37130. + return status;
  37131. +#else
  37132. + return 0;
  37133. +#endif
  37134. +}
  37135. +//------------------------------------------------------------------------------
  37136. +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv)
  37137. +{
  37138. +#if 0
  37139. + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context);
  37140. +
  37141. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37142. +
  37143. +_func_enter_;
  37144. +
  37145. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro8711_pkt_loss_hdl\n"));
  37146. +
  37147. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37148. + return NDIS_STATUS_NOT_ACCEPTED;
  37149. +
  37150. + if (poid_par_priv->information_buf_len < sizeof(uint)*2) {
  37151. + RT_TRACE(_module_mp_, _drv_err_, ("-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\n", (int)poid_par_priv->information_buf_len));
  37152. + return NDIS_STATUS_INVALID_LENGTH;
  37153. + }
  37154. +
  37155. + if (*(uint*)poid_par_priv->information_buf == 1)//init==1
  37156. + Adapter->mppriv.rx_pktloss = 0;
  37157. +
  37158. + *((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss;
  37159. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37160. +
  37161. +_func_exit_;
  37162. +
  37163. + return status;
  37164. +#else
  37165. + return 0;
  37166. +#endif
  37167. +}
  37168. +//------------------------------------------------------------------------------
  37169. +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
  37170. +{
  37171. +#if 0
  37172. + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context);
  37173. + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;
  37174. + struct intf_hdl *pintfhdl = &pio_queue->intf;
  37175. +
  37176. +#ifdef PLATFORM_OS_XP
  37177. + _irqL oldirql;
  37178. +#endif
  37179. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37180. +
  37181. +#ifdef CONFIG_SDIO_HCI
  37182. + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  37183. +#endif
  37184. +
  37185. +_func_enter_;
  37186. +
  37187. + RT_TRACE(_module_mp_, _drv_notice_, ("+Query OID_RT_RD_ATTRIB_MEM\n"));
  37188. +
  37189. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37190. + return NDIS_STATUS_NOT_ACCEPTED;
  37191. +
  37192. +#ifdef CONFIG_SDIO_HCI
  37193. + _irqlevel_changed_(&oldirql, LOWER);
  37194. +{
  37195. + u32 *plmem = (u32*)poid_par_priv->information_buf+2;
  37196. + _attrib_read = pintfhdl->io_ops._attrib_read;
  37197. + _attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf),
  37198. + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem);
  37199. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37200. +}
  37201. + _irqlevel_changed_(&oldirql, RAISE);
  37202. +#endif
  37203. +
  37204. +_func_exit_;
  37205. +
  37206. + return status;
  37207. +#else
  37208. + return 0;
  37209. +#endif
  37210. +}
  37211. +//------------------------------------------------------------------------------
  37212. +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv)
  37213. +{
  37214. +#if 0
  37215. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37216. + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;
  37217. + struct intf_hdl *pintfhdl = &pio_queue->intf;
  37218. +
  37219. +#ifdef PLATFORM_OS_XP
  37220. + _irqL oldirql;
  37221. +#endif
  37222. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37223. +
  37224. +#ifdef CONFIG_SDIO_HCI
  37225. + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  37226. +#endif
  37227. +
  37228. +_func_enter_;
  37229. +
  37230. + if (poid_par_priv->type_of_oid != SET_OID)
  37231. + return NDIS_STATUS_NOT_ACCEPTED;
  37232. +
  37233. +#ifdef CONFIG_SDIO_HCI
  37234. + _irqlevel_changed_(&oldirql, LOWER);
  37235. +{
  37236. + u32 *plmem = (u32*)poid_par_priv->information_buf + 2;
  37237. + _attrib_write = pintfhdl->io_ops._attrib_write;
  37238. + _attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf,
  37239. + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem);
  37240. +}
  37241. + _irqlevel_changed_(&oldirql, RAISE);
  37242. +#endif
  37243. +
  37244. +_func_exit_;
  37245. +
  37246. + return status;
  37247. +#else
  37248. + return 0;
  37249. +#endif
  37250. +}
  37251. +//------------------------------------------------------------------------------
  37252. +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv)
  37253. +{
  37254. +#if 0
  37255. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37256. +
  37257. +#ifdef PLATFORM_OS_XP
  37258. + _irqL oldirql;
  37259. +#endif
  37260. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37261. +
  37262. +_func_enter_;
  37263. +
  37264. + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_RF_INTFS\n"));
  37265. +
  37266. + if (poid_par_priv->type_of_oid != SET_OID)
  37267. + return NDIS_STATUS_NOT_ACCEPTED;
  37268. +
  37269. + _irqlevel_changed_(&oldirql, LOWER);
  37270. +
  37271. + if (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL)
  37272. + status = NDIS_STATUS_NOT_ACCEPTED;
  37273. +
  37274. + _irqlevel_changed_(&oldirql, RAISE);
  37275. +
  37276. +_func_exit_;
  37277. +
  37278. + return status;
  37279. +#else
  37280. + return 0;
  37281. +#endif
  37282. +}
  37283. +//------------------------------------------------------------------------------
  37284. +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv)
  37285. +{
  37286. +#if 0
  37287. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37288. +
  37289. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37290. +
  37291. +_func_enter_;
  37292. +
  37293. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37294. + return NDIS_STATUS_NOT_ACCEPTED;
  37295. +
  37296. + _rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat));
  37297. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37298. +
  37299. +_func_exit_;
  37300. +
  37301. + return status;
  37302. +#else
  37303. + return 0;
  37304. +#endif
  37305. +}
  37306. +//------------------------------------------------------------------------------
  37307. +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv)
  37308. +{
  37309. +#if 0
  37310. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37311. +
  37312. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37313. +
  37314. + PCFG_DBG_MSG_STRUCT pdbg_msg;
  37315. +
  37316. +_func_enter_;
  37317. +
  37318. +// RT_TRACE(0xffffffffff,_drv_alert_,("===> oid_rt_pro_cfg_debug_message_hdl.\n"));
  37319. +
  37320. +#if 0//#ifdef CONFIG_DEBUG_RTL871X
  37321. +
  37322. + pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf);
  37323. +
  37324. + if (poid_par_priv->type_of_oid == SET_OID) {
  37325. + RT_TRACE(0xffffffffff, _drv_alert_,
  37326. + ("===>Set level :0x%08x, H32:0x%08x L32:0x%08x\n",
  37327. + pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32));
  37328. +
  37329. + GlobalDebugLevel = pdbg_msg->DebugLevel;
  37330. + GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32;
  37331. + RT_TRACE(0xffffffffff, _drv_alert_,
  37332. + ("===> Set level :0x%08x, component:0x%016x\n",
  37333. + GlobalDebugLevel, (u32)GlobalDebugComponents));
  37334. + } else {
  37335. + pdbg_msg->DebugLevel = GlobalDebugLevel;
  37336. + pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32);
  37337. + pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents;
  37338. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37339. +
  37340. + RT_TRACE(0xffffffffff, _drv_alert_,
  37341. + ("===>Query level:0x%08x H32:0x%08x L32:0x%08x\n",
  37342. + (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32));
  37343. + }
  37344. +
  37345. +#endif
  37346. +
  37347. +_func_exit_;
  37348. +
  37349. + return status;
  37350. +#else
  37351. + return 0;
  37352. +#endif
  37353. +}
  37354. +//------------------------------------------------------------------------------
  37355. +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv)
  37356. +{
  37357. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37358. +
  37359. +#ifdef PLATFORM_OS_XP
  37360. + _irqL oldirql;
  37361. +#endif
  37362. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37363. +
  37364. +_func_enter_;
  37365. +
  37366. + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_DATA_RATE_EX\n"));
  37367. +
  37368. + if (poid_par_priv->type_of_oid != SET_OID)
  37369. + return NDIS_STATUS_NOT_ACCEPTED;
  37370. +
  37371. + _irqlevel_changed_(&oldirql, LOWER);
  37372. +
  37373. + if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS)
  37374. + status = NDIS_STATUS_NOT_ACCEPTED;
  37375. +
  37376. + _irqlevel_changed_(&oldirql, RAISE);
  37377. +
  37378. +_func_exit_;
  37379. +
  37380. + return status;
  37381. +}
  37382. +//-----------------------------------------------------------------------------
  37383. +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv)
  37384. +{
  37385. +#ifdef PLATFORM_OS_XP
  37386. + _irqL oldirql;
  37387. +#endif
  37388. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37389. + u8 thermal = 0;
  37390. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37391. +
  37392. +_func_enter_;
  37393. +
  37394. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_get_thermal_meter_hdl\n"));
  37395. +
  37396. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37397. + return NDIS_STATUS_NOT_ACCEPTED;
  37398. +
  37399. + if (poid_par_priv->information_buf_len < sizeof(u32))
  37400. + return NDIS_STATUS_INVALID_LENGTH;
  37401. +
  37402. + _irqlevel_changed_(&oldirql, LOWER);
  37403. + GetThermalMeter(Adapter, &thermal);
  37404. + _irqlevel_changed_(&oldirql, RAISE);
  37405. +
  37406. + *(u32*)poid_par_priv->information_buf = (u32)thermal;
  37407. + *poid_par_priv->bytes_rw = sizeof(u32);
  37408. +
  37409. +_func_exit_;
  37410. +
  37411. + return status;
  37412. +}
  37413. +//-----------------------------------------------------------------------------
  37414. +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv)
  37415. +{
  37416. +#if 0
  37417. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37418. +
  37419. +#ifdef PLATFORM_OS_XP
  37420. + _irqL oldirql;
  37421. +#endif
  37422. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37423. +
  37424. +_func_enter_;
  37425. +
  37426. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_tssi_hdl\n"));
  37427. +
  37428. + if (poid_par_priv->type_of_oid != SET_OID)
  37429. + return NDIS_STATUS_NOT_ACCEPTED;
  37430. +
  37431. + if (Adapter->mppriv.act_in_progress == _TRUE)
  37432. + return NDIS_STATUS_NOT_ACCEPTED;
  37433. +
  37434. + if (poid_par_priv->information_buf_len < sizeof(u8))
  37435. + return NDIS_STATUS_INVALID_LENGTH;
  37436. +
  37437. + //init workparam
  37438. + Adapter->mppriv.act_in_progress = _TRUE;
  37439. + Adapter->mppriv.workparam.bcompleted = _FALSE;
  37440. + Adapter->mppriv.workparam.act_type = MPT_READ_TSSI;
  37441. + Adapter->mppriv.workparam.io_offset = 0;
  37442. + Adapter->mppriv.workparam.io_value = 0xFFFFFFFF;
  37443. +
  37444. + _irqlevel_changed_(&oldirql, LOWER);
  37445. +
  37446. + if (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value))
  37447. + status = NDIS_STATUS_NOT_ACCEPTED;
  37448. +
  37449. + _irqlevel_changed_(&oldirql, RAISE);
  37450. +
  37451. +_func_exit_;
  37452. +
  37453. + return status;
  37454. +#else
  37455. + return 0;
  37456. +#endif
  37457. +}
  37458. +//------------------------------------------------------------------------------
  37459. +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv)
  37460. +{
  37461. +#ifdef PLATFORM_OS_XP
  37462. + _irqL oldirql;
  37463. +#endif
  37464. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37465. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37466. +
  37467. +
  37468. +_func_enter_;
  37469. +
  37470. +// if (poid_par_priv->type_of_oid != SET_OID)
  37471. +// return NDIS_STATUS_NOT_ACCEPTED;
  37472. +
  37473. + if (poid_par_priv->information_buf_len < sizeof(u8))
  37474. + return NDIS_STATUS_INVALID_LENGTH;
  37475. +
  37476. + _irqlevel_changed_(&oldirql, LOWER);
  37477. + if (poid_par_priv->type_of_oid == SET_OID) {
  37478. + u8 enable;
  37479. +
  37480. + enable = *(u8*)poid_par_priv->information_buf;
  37481. + RT_TRACE(_module_mp_, _drv_notice_,
  37482. + ("+oid_rt_pro_set_power_tracking_hdl: enable=%d\n", enable));
  37483. +
  37484. + SetPowerTracking(Adapter, enable);
  37485. + } else {
  37486. + GetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf);
  37487. + }
  37488. + _irqlevel_changed_(&oldirql, RAISE);
  37489. +
  37490. +_func_exit_;
  37491. +
  37492. + return status;
  37493. +}
  37494. +//-----------------------------------------------------------------------------
  37495. +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv)
  37496. +{
  37497. +#if 0
  37498. +#ifdef PLATFORM_OS_XP
  37499. + _irqL oldirql;
  37500. +#endif
  37501. + u32 ratevalue;
  37502. + u8 datarates[NumRates];
  37503. + int i;
  37504. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37505. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  37506. +
  37507. +_func_enter_;
  37508. +
  37509. + RT_TRACE(_module_mp_, _drv_info_, ("+OID_RT_PRO_SET_BASIC_RATE\n"));
  37510. +
  37511. + if (poid_par_priv->type_of_oid != SET_OID)
  37512. + return NDIS_STATUS_NOT_ACCEPTED;
  37513. +#if 0
  37514. + ratevalue = *((u32*)poid_par_priv->information_buf);
  37515. +
  37516. + for (i = 0; i < NumRates; i++) {
  37517. + if (ratevalue == mpdatarate[i])
  37518. + datarates[i] = mpdatarate[i];
  37519. + else
  37520. + datarates[i] = 0xff;
  37521. + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, ("basicrate_inx=%d\n", datarates[i]));
  37522. + }
  37523. +
  37524. + _irqlevel_changed_(&oldirql, LOWER);
  37525. +
  37526. + if (rtw_setbasicrate_cmd(padapter, datarates) != _SUCCESS)
  37527. + status = NDIS_STATUS_NOT_ACCEPTED;
  37528. +
  37529. + _irqlevel_changed_(&oldirql, RAISE);
  37530. +#endif
  37531. + RT_TRACE(_module_mp_, _drv_notice_,
  37532. + ("-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\n", status));
  37533. +
  37534. +_func_exit_;
  37535. +
  37536. + return status;
  37537. +#else
  37538. + return 0;
  37539. +#endif
  37540. +}
  37541. +//------------------------------------------------------------------------------
  37542. +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
  37543. +{
  37544. +#if 0
  37545. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37546. +
  37547. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37548. +
  37549. +_func_enter_;
  37550. +
  37551. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37552. + return NDIS_STATUS_NOT_ACCEPTED;
  37553. +
  37554. + if (poid_par_priv->information_buf_len < 8)
  37555. + return NDIS_STATUS_INVALID_LENGTH;
  37556. +
  37557. + *poid_par_priv->bytes_rw = 8;
  37558. + _rtw_memcpy(poid_par_priv->information_buf, &(Adapter->pwrctrlpriv.pwr_mode), 8);
  37559. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37560. +
  37561. + RT_TRACE(_module_mp_, _drv_notice_,
  37562. + ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n",
  37563. + Adapter->pwrctrlpriv.pwr_mode, Adapter->pwrctrlpriv.smart_ps));
  37564. +
  37565. +_func_exit_;
  37566. +
  37567. + return status;
  37568. +#else
  37569. + return 0;
  37570. +#endif
  37571. +}
  37572. +//------------------------------------------------------------------------------
  37573. +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
  37574. +{
  37575. +#if 0
  37576. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37577. +
  37578. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37579. +
  37580. + uint pwr_mode, smart_ps;
  37581. +
  37582. +_func_enter_;
  37583. +
  37584. + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_SET_PWRSTATE\n"));
  37585. +
  37586. + if (poid_par_priv->type_of_oid != SET_OID)
  37587. + return NDIS_STATUS_NOT_ACCEPTED;
  37588. +
  37589. + *poid_par_priv->bytes_rw = 0;
  37590. + *poid_par_priv->bytes_needed = 8;
  37591. +
  37592. + if (poid_par_priv->information_buf_len < 8)
  37593. + return NDIS_STATUS_INVALID_LENGTH;
  37594. +
  37595. + pwr_mode = *(uint *)(poid_par_priv->information_buf);
  37596. + smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4);
  37597. +
  37598. + *poid_par_priv->bytes_rw = 8;
  37599. +
  37600. +_func_exit_;
  37601. +
  37602. + return status;
  37603. +#else
  37604. + return 0;
  37605. +#endif
  37606. +}
  37607. +//------------------------------------------------------------------------------
  37608. +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv)
  37609. +{
  37610. +#if 0
  37611. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37612. +
  37613. +#ifdef PLATFORM_OS_XP
  37614. + _irqL oldirql;
  37615. +#endif
  37616. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37617. +
  37618. + struct setratable_parm *prate_table;
  37619. + u8 res;
  37620. +
  37621. +_func_enter_;
  37622. +
  37623. + if (poid_par_priv->type_of_oid != SET_OID)
  37624. + return NDIS_STATUS_NOT_ACCEPTED;
  37625. +
  37626. + *poid_par_priv->bytes_needed = sizeof(struct setratable_parm);
  37627. + if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm))
  37628. + return NDIS_STATUS_INVALID_LENGTH;
  37629. +
  37630. + prate_table = (struct setratable_parm*)poid_par_priv->information_buf;
  37631. +
  37632. + _irqlevel_changed_(&oldirql, LOWER);
  37633. + res = rtw_setrttbl_cmd(Adapter, prate_table);
  37634. + _irqlevel_changed_(&oldirql, RAISE);
  37635. +
  37636. + if (res == _FAIL)
  37637. + status = NDIS_STATUS_FAILURE;
  37638. +
  37639. +_func_exit_;
  37640. +
  37641. + return status;
  37642. +#else
  37643. + return 0;
  37644. +#endif
  37645. +}
  37646. +//------------------------------------------------------------------------------
  37647. +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv)
  37648. +{
  37649. +#if 0
  37650. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37651. +
  37652. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37653. +
  37654. +_func_enter_;
  37655. +
  37656. + if (poid_par_priv->type_of_oid != QUERY_OID)
  37657. + return NDIS_STATUS_NOT_ACCEPTED;
  37658. +
  37659. + #if 0
  37660. + struct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx);
  37661. + u8 res=_SUCCESS;
  37662. + DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n"));
  37663. +
  37664. + if(pmp_wi_cntx->bmp_wi_progress ==_TRUE){
  37665. + DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n"));
  37666. + Status = NDIS_STATUS_NOT_ACCEPTED;
  37667. + break;
  37668. + }
  37669. + else{
  37670. + pmp_wi_cntx->bmp_wi_progress=_TRUE;
  37671. + pmp_wi_cntx->param.bcompleted=_FALSE;
  37672. + pmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE;
  37673. + pmp_wi_cntx->param.io_offset=0x0;
  37674. + pmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp);
  37675. + pmp_wi_cntx->param.io_value=0xffffffff;
  37676. +
  37677. + res=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data);
  37678. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37679. + if(res != _SUCCESS)
  37680. + {
  37681. + Status = NDIS_STATUS_NOT_ACCEPTED;
  37682. + }
  37683. + }
  37684. + DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n"));
  37685. + #endif
  37686. +
  37687. +_func_exit_;
  37688. +
  37689. + return status;
  37690. +#else
  37691. + return 0;
  37692. +#endif
  37693. +}
  37694. +
  37695. +//**************** oid_rtl_seg_87_12_00 section start ****************
  37696. +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv)
  37697. +{
  37698. +#if 0
  37699. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37700. + struct security_priv *psecuritypriv = &Adapter->securitypriv;
  37701. +
  37702. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37703. +
  37704. + ENCRY_CTRL_STATE encry_mode;
  37705. +
  37706. +
  37707. + *poid_par_priv->bytes_needed = sizeof(u8);
  37708. + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
  37709. + return NDIS_STATUS_INVALID_LENGTH;
  37710. +
  37711. + if (poid_par_priv->type_of_oid == SET_OID)
  37712. + {
  37713. + encry_mode = *((u8*)poid_par_priv->information_buf);
  37714. + switch (encry_mode)
  37715. + {
  37716. + case HW_CONTROL:
  37717. + #if 0
  37718. + Adapter->registrypriv.software_decrypt=_FALSE;
  37719. + Adapter->registrypriv.software_encrypt=_FALSE;
  37720. + #else
  37721. + psecuritypriv->sw_decrypt = _FALSE;
  37722. + psecuritypriv->sw_encrypt = _FALSE;
  37723. + #endif
  37724. + break;
  37725. + case SW_CONTROL:
  37726. + #if 0
  37727. + Adapter->registrypriv.software_decrypt=_TRUE;
  37728. + Adapter->registrypriv.software_encrypt=_TRUE;
  37729. + #else
  37730. + psecuritypriv->sw_decrypt = _TRUE;
  37731. + psecuritypriv->sw_encrypt = _TRUE;
  37732. + #endif
  37733. + break;
  37734. + case HW_ENCRY_SW_DECRY:
  37735. + #if 0
  37736. + Adapter->registrypriv.software_decrypt=_TRUE;
  37737. + Adapter->registrypriv.software_encrypt=_FALSE;
  37738. + #else
  37739. + psecuritypriv->sw_decrypt = _TRUE;
  37740. + psecuritypriv->sw_encrypt = _FALSE;
  37741. + #endif
  37742. + break;
  37743. + case SW_ENCRY_HW_DECRY:
  37744. + #if 0
  37745. + Adapter->registrypriv.software_decrypt=_FALSE;
  37746. + Adapter->registrypriv.software_encrypt=_TRUE;
  37747. + #else
  37748. + psecuritypriv->sw_decrypt = _FALSE;
  37749. + psecuritypriv->sw_encrypt = _TRUE;
  37750. + #endif
  37751. + break;
  37752. + }
  37753. +
  37754. + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_,
  37755. + ("-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\n",
  37756. + encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt));
  37757. + }
  37758. + else {
  37759. + #if 0
  37760. + if (Adapter->registrypriv.software_encrypt == _FALSE) {
  37761. + if (Adapter->registrypriv.software_decrypt == _FALSE)
  37762. + encry_mode = HW_CONTROL;
  37763. + else
  37764. + encry_mode = HW_ENCRY_SW_DECRY;
  37765. + }
  37766. + else {
  37767. + if (Adapter->registrypriv.software_decrypt == _FALSE)
  37768. + encry_mode = SW_ENCRY_HW_DECRY;
  37769. + else
  37770. + encry_mode = SW_CONTROL;
  37771. + }
  37772. + #else
  37773. +
  37774. + if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE))
  37775. + encry_mode = HW_CONTROL;
  37776. + else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE))
  37777. + encry_mode = HW_ENCRY_SW_DECRY;
  37778. + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE))
  37779. + encry_mode = SW_ENCRY_HW_DECRY;
  37780. + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE))
  37781. + encry_mode = SW_CONTROL;
  37782. +
  37783. + #endif
  37784. +
  37785. + *(u8*)poid_par_priv->information_buf = encry_mode;
  37786. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  37787. +
  37788. + RT_TRACE(_module_mp_, _drv_notice_,
  37789. + ("-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\n",
  37790. + encry_mode));
  37791. + }
  37792. +
  37793. + return status;
  37794. +#else
  37795. + return 0;
  37796. +#endif
  37797. +}
  37798. +//------------------------------------------------------------------------------
  37799. +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv)
  37800. +{
  37801. +#if 0
  37802. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37803. +
  37804. +#ifdef PLATFORM_OS_XP
  37805. + _irqL oldirql;
  37806. +#endif
  37807. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37808. +
  37809. + struct sta_info *psta = NULL;
  37810. + UCHAR *macaddr;
  37811. +
  37812. +
  37813. + if (poid_par_priv->type_of_oid != SET_OID)
  37814. + return NDIS_STATUS_NOT_ACCEPTED;
  37815. +
  37816. + *poid_par_priv->bytes_needed = ETH_ALEN;
  37817. + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
  37818. + return NDIS_STATUS_INVALID_LENGTH;
  37819. +
  37820. + macaddr = (UCHAR *) poid_par_priv->information_buf ;
  37821. +
  37822. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_,
  37823. + ("OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) ));
  37824. +
  37825. + _irqlevel_changed_(&oldirql, LOWER);
  37826. +
  37827. + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
  37828. +
  37829. + if (psta == NULL) { // the sta have been in sta_info_queue => do nothing
  37830. + psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr);
  37831. +
  37832. + if (psta == NULL) {
  37833. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\n"));
  37834. + status = NDIS_STATUS_FAILURE;
  37835. + }
  37836. + } else { //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY)
  37837. + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_,
  37838. + ("Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \n"));
  37839. + }
  37840. +
  37841. + _irqlevel_changed_(&oldirql, RAISE);
  37842. +
  37843. + return status;
  37844. +#else
  37845. + return 0;
  37846. +#endif
  37847. +}
  37848. +//------------------------------------------------------------------------------
  37849. +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
  37850. +{
  37851. +#if 0
  37852. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  37853. +
  37854. +#ifdef PLATFORM_OS_XP
  37855. + _irqL oldirql;
  37856. +#endif
  37857. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  37858. +
  37859. + struct sta_info *psta = NULL;
  37860. + UCHAR *macaddr;
  37861. +
  37862. +
  37863. + if (poid_par_priv->type_of_oid != SET_OID)
  37864. + return NDIS_STATUS_NOT_ACCEPTED;
  37865. +
  37866. + *poid_par_priv->bytes_needed = ETH_ALEN;
  37867. + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
  37868. + return NDIS_STATUS_INVALID_LENGTH;
  37869. +
  37870. + macaddr = (UCHAR *) poid_par_priv->information_buf ;
  37871. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_,
  37872. + ("+OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) ));
  37873. +
  37874. + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
  37875. + if (psta != NULL) {
  37876. + _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
  37877. + rtw_free_stainfo(Adapter, psta);
  37878. + _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
  37879. + }
  37880. +
  37881. + return status;
  37882. +#else
  37883. + return 0;
  37884. +#endif
  37885. +}
  37886. +//------------------------------------------------------------------------------
  37887. +#if 0
  37888. +#include <sdio_osintf.h>
  37889. +static u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var)
  37890. +{
  37891. +#ifdef CONFIG_SDIO_HCI
  37892. +
  37893. + if (offset == 1) {
  37894. + u16 tmp_blk_num;
  37895. + tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM);
  37896. + RT_TRACE(_module_mp_, _drv_err_, ("Query Information, mp_query_drv_var SDIO_RX0_RDYBLK_NUM=0x%x adapter_to_dvobj(padapter)->rxblknum=0x%x\n", tmp_blk_num, adapter_to_dvobj(padapter)->rxblknum));
  37897. + if (adapter_to_dvobj(padapter)->rxblknum != tmp_blk_num) {
  37898. + RT_TRACE(_module_mp_,_drv_err_, ("Query Information, mp_query_drv_var call recv rx\n"));
  37899. + // sd_recv_rxfifo(padapter);
  37900. + }
  37901. + }
  37902. +
  37903. +#if 0
  37904. + if(offset <=100){ //For setting data rate and query data rate
  37905. + if(offset==100){ //For query data rate
  37906. + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): query rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate));
  37907. + var=padapter->registrypriv.tx_rate;
  37908. +
  37909. + }
  37910. + else if(offset<0x1d){ //For setting data rate
  37911. + padapter->registrypriv.tx_rate=offset;
  37912. + var=padapter->registrypriv.tx_rate;
  37913. + padapter->registrypriv.use_rate=_TRUE;
  37914. + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): set rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate));
  37915. + }
  37916. + else{ //not use the data rate
  37917. + padapter->registrypriv.use_rate=_FALSE;
  37918. + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) out of rate range\n",offset));
  37919. + }
  37920. + }
  37921. + else if (offset<=110){ //for setting debug level
  37922. + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d) for set debug level\n",offset));
  37923. + if(offset==110){ //For query data rate
  37924. + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \n",offset,padapter->registrypriv.dbg_level));
  37925. + padapter->registrypriv.dbg_level=GlobalDebugLevel;
  37926. + var=padapter->registrypriv.dbg_level;
  37927. + }
  37928. + else if(offset<110 && offset>100){
  37929. + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \n",offset,offset-100));
  37930. + padapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100;
  37931. + var=padapter->registrypriv.dbg_level;
  37932. + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37933. + RT_TRACE(_module_mp_, _drv_alert_, (" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37934. + RT_TRACE(_module_mp_, _drv_crit_, (" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37935. + RT_TRACE(_module_mp_, _drv_err_, (" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37936. + RT_TRACE(_module_mp_, _drv_warning_, (" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37937. + RT_TRACE(_module_mp_, _drv_notice_, (" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37938. + RT_TRACE(_module_mp_, _drv_info_, (" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37939. + RT_TRACE(_module_mp_, _drv_debug_, (" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel));
  37940. +
  37941. + }
  37942. + }
  37943. + else if(offset >110 &&offset <116){
  37944. + if(115==offset){
  37945. + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\n",\
  37946. + offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));
  37947. + }
  37948. + else {
  37949. + switch(offset){
  37950. + case 111:
  37951. + adapter_to_dvobj(padapter)->tx_block_mode=1;
  37952. + adapter_to_dvobj(padapter)->rx_block_mode=1;
  37953. + RT_TRACE(_module_mp_, _drv_emerg_, \
  37954. + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\
  37955. + offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));
  37956. + break;
  37957. + case 112:
  37958. + adapter_to_dvobj(padapter)->tx_block_mode=1;
  37959. + adapter_to_dvobj(padapter)->rx_block_mode=0;
  37960. + RT_TRACE(_module_mp_, _drv_emerg_, \
  37961. + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\
  37962. + offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));
  37963. + break;
  37964. + case 113:
  37965. + adapter_to_dvobj(padapter)->tx_block_mode=0;
  37966. + adapter_to_dvobj(padapter)->rx_block_mode=1;
  37967. + RT_TRACE(_module_mp_, _drv_emerg_, \
  37968. + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\
  37969. + offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));
  37970. + break;
  37971. + case 114:
  37972. + adapter_to_dvobj(padapter)->tx_block_mode=0;
  37973. + adapter_to_dvobj(padapter)->rx_block_mode=0;
  37974. + RT_TRACE(_module_mp_, _drv_emerg_, \
  37975. + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\
  37976. + offset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));
  37977. + break;
  37978. + default :
  37979. + break;
  37980. +
  37981. + }
  37982. +
  37983. + }
  37984. +
  37985. + }
  37986. + else if(offset>=127){
  37987. + u64 prnt_dbg_comp;
  37988. + u8 chg_idx;
  37989. + u64 tmp_dbg_comp;
  37990. + chg_idx=offset-0x80;
  37991. + tmp_dbg_comp=BIT(chg_idx);
  37992. + prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents;
  37993. + RT_TRACE(_module_mp_, _drv_emerg_, (" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\n",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component));
  37994. + if(offset==127){
  37995. + // prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents;
  37996. + var=(u32)(padapter->registrypriv.dbg_component);
  37997. + RT_TRACE(0xffffffff, _drv_emerg_, ("2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) \n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));
  37998. + prnt_dbg_comp=GlobalDebugComponents;
  37999. + RT_TRACE(0xffffffff, _drv_emerg_, ("2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));
  38000. + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component;
  38001. + RT_TRACE(0xffffffff, _drv_emerg_, ("2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));
  38002. +
  38003. + }
  38004. + else{
  38005. + RT_TRACE(0xffffffff, _drv_emerg_, ("3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));
  38006. + prnt_dbg_comp=GlobalDebugComponents;
  38007. + RT_TRACE(0xffffffff, _drv_emerg_,("3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// ("3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\n",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp)
  38008. + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component;
  38009. + RT_TRACE(0xffffffff, _drv_emerg_, ("3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));
  38010. +
  38011. + if(GlobalDebugComponents&tmp_dbg_comp){
  38012. + //this bit is already set, now clear it
  38013. + GlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp);
  38014. + }
  38015. + else{
  38016. + //this bit is not set, now set it.
  38017. + GlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp;
  38018. + }
  38019. + RT_TRACE(0xffffffff, _drv_emerg_, ("4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp));
  38020. + prnt_dbg_comp=GlobalDebugComponents;
  38021. + RT_TRACE(0xffffffff, _drv_emerg_, ("4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp));
  38022. +
  38023. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, ("0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,prnt_dbg_comp));
  38024. + RT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, ("1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38025. + RT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, ("2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38026. + RT_TRACE(_module_recv_osdep_c_, _drv_emerg_, ("3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38027. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, ("4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38028. + RT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38029. + RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, ("6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38030. + RT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, ("7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38031. + RT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, ("8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38032. + RT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, ("9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38033. + RT_TRACE(_module_io_osdep_c_, _drv_emerg_, ("10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38034. + RT_TRACE(_module_os_intfs_c_, _drv_emerg_, ("11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38035. + RT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, ("12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38036. + RT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, ("13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38037. + RT_TRACE(_module_hal_init_c_, _drv_emerg_, ("14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38038. + RT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, ("15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38039. + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, ("16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38040. + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, ("17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38041. + RT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, ("18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38042. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, ("19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38043. + RT_TRACE(_module_hci_intfs_c_, _drv_emerg_, ("20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38044. + RT_TRACE(_module_hci_ops_c_, _drv_emerg_, ("21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38045. + RT_TRACE(_module_osdep_service_c_, _drv_emerg_, ("22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38046. + RT_TRACE(_module_mp_, _drv_emerg_, ("23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38047. + RT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, ("24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38048. + var=(u32)(GlobalDebugComponents);
  38049. + //GlobalDebugComponents=padapter->registrypriv.dbg_component;
  38050. + RT_TRACE(0xffffffff, _drv_emerg_, (" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents));
  38051. +
  38052. + }
  38053. + }
  38054. + else{
  38055. + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) >110\n",offset));
  38056. + }
  38057. +#endif
  38058. +#endif
  38059. +
  38060. + return var;
  38061. +}
  38062. +#endif
  38063. +
  38064. +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv)
  38065. +{
  38066. +#if 0
  38067. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38068. +
  38069. +#ifdef PLATFORM_OS_XP
  38070. + _irqL oldirql;
  38071. +#endif
  38072. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38073. +
  38074. + DR_VARIABLE_STRUCT *pdrv_var;
  38075. +
  38076. +
  38077. + if (poid_par_priv->type_of_oid != QUERY_OID)
  38078. + return NDIS_STATUS_NOT_ACCEPTED;
  38079. +
  38080. + *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT);
  38081. + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
  38082. + return NDIS_STATUS_INVALID_LENGTH;
  38083. +
  38084. + RT_TRACE(_module_mp_, _drv_notice_, ("+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\n"));
  38085. +
  38086. + pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf;
  38087. +
  38088. + _irqlevel_changed_(&oldirql, LOWER);
  38089. + pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable);
  38090. + _irqlevel_changed_(&oldirql, RAISE);
  38091. +
  38092. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38093. +
  38094. + RT_TRACE(_module_mp_, _drv_notice_,
  38095. + ("-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\n",
  38096. + pdrv_var->offset, pdrv_var->variable));
  38097. +
  38098. + return status;
  38099. +#else
  38100. + return 0;
  38101. +#endif
  38102. +}
  38103. +//------------------------------------------------------------------------------
  38104. +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
  38105. +{
  38106. +#if 0
  38107. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38108. +
  38109. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38110. +
  38111. + RT_TRACE(_module_mp_, _drv_err_, ("oid_rt_pro_rx_packet_type_hdl...................\n"));
  38112. +
  38113. + if (poid_par_priv->information_buf_len < sizeof (UCHAR)) {
  38114. + status = NDIS_STATUS_INVALID_LENGTH;
  38115. + *poid_par_priv->bytes_needed = sizeof(UCHAR);
  38116. + return status;
  38117. + }
  38118. +
  38119. + if (poid_par_priv->type_of_oid == SET_OID) {
  38120. + Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf;
  38121. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\
  38122. + Adapter->mppriv.rx_with_status));
  38123. +
  38124. + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050);
  38125. + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054);
  38126. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n",
  38127. + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\
  38128. + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5]));
  38129. +
  38130. + }
  38131. + else {
  38132. + *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status;
  38133. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38134. +
  38135. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n", \
  38136. + Adapter->mppriv.rx_with_status));
  38137. +
  38138. + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050);
  38139. + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054);
  38140. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n",
  38141. + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\
  38142. + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5]));
  38143. + }
  38144. +#endif
  38145. +
  38146. + return NDIS_STATUS_SUCCESS;
  38147. +}
  38148. +//------------------------------------------------------------------------------
  38149. +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv)
  38150. +{
  38151. +#ifdef PLATFORM_OS_XP
  38152. + _irqL oldirql;
  38153. +#endif
  38154. + PEFUSE_ACCESS_STRUCT pefuse;
  38155. + u8 *data;
  38156. + u16 addr = 0, cnts = 0, max_available_size = 0;
  38157. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38158. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38159. +
  38160. +_func_enter_;
  38161. +
  38162. + if (poid_par_priv->type_of_oid != QUERY_OID)
  38163. + return NDIS_STATUS_NOT_ACCEPTED;
  38164. +
  38165. + if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT))
  38166. + return NDIS_STATUS_INVALID_LENGTH;
  38167. +
  38168. + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;
  38169. + addr = pefuse->start_addr;
  38170. + cnts = pefuse->cnts;
  38171. + data = pefuse->data;
  38172. +
  38173. + RT_TRACE(_module_mp_, _drv_notice_,
  38174. + ("+oid_rt_pro_read_efuse_hd: buf_len=%ld addr=%d cnts=%d\n",
  38175. + poid_par_priv->information_buf_len, addr, cnts));
  38176. +
  38177. + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  38178. +
  38179. + if ((addr + cnts) > max_available_size) {
  38180. + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: parameter error!\n"));
  38181. + return NDIS_STATUS_NOT_ACCEPTED;
  38182. + }
  38183. +
  38184. + _irqlevel_changed_(&oldirql, LOWER);
  38185. + if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) {
  38186. + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\n"));
  38187. + status = NDIS_STATUS_FAILURE;
  38188. + } else
  38189. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38190. + _irqlevel_changed_(&oldirql, RAISE);
  38191. +
  38192. +_func_exit_;
  38193. +
  38194. + return status;
  38195. +}
  38196. +//------------------------------------------------------------------------------
  38197. +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv)
  38198. +{
  38199. +#ifdef PLATFORM_OS_XP
  38200. + _irqL oldirql;
  38201. +#endif
  38202. + PEFUSE_ACCESS_STRUCT pefuse;
  38203. + u8 *data;
  38204. + u16 addr = 0, cnts = 0, max_available_size = 0;
  38205. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38206. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38207. +
  38208. +
  38209. +_func_enter_;
  38210. +
  38211. + if (poid_par_priv->type_of_oid != SET_OID)
  38212. + return NDIS_STATUS_NOT_ACCEPTED;
  38213. +
  38214. + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;
  38215. + addr = pefuse->start_addr;
  38216. + cnts = pefuse->cnts;
  38217. + data = pefuse->data;
  38218. +
  38219. + RT_TRACE(_module_mp_, _drv_notice_,
  38220. + ("+oid_rt_pro_write_efuse_hdl: buf_len=%ld addr=0x%04x cnts=%d\n",
  38221. + poid_par_priv->information_buf_len, addr, cnts));
  38222. +
  38223. + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  38224. +
  38225. + if ((addr + cnts) > max_available_size) {
  38226. + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_write_efuse_hdl: parameter error"));
  38227. + return NDIS_STATUS_NOT_ACCEPTED;
  38228. + }
  38229. +
  38230. + _irqlevel_changed_(&oldirql, LOWER);
  38231. + if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL)
  38232. + status = NDIS_STATUS_FAILURE;
  38233. + _irqlevel_changed_(&oldirql, RAISE);
  38234. +
  38235. +_func_exit_;
  38236. +
  38237. + return status;
  38238. +}
  38239. +//------------------------------------------------------------------------------
  38240. +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv)
  38241. +{
  38242. +#ifdef PLATFORM_OS_XP
  38243. + _irqL oldirql;
  38244. +#endif
  38245. + PPGPKT_STRUCT ppgpkt;
  38246. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38247. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38248. +
  38249. +_func_enter_;
  38250. +
  38251. +// RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_rw_efuse_pgpkt_hdl\n"));
  38252. +
  38253. + *poid_par_priv->bytes_rw = 0;
  38254. +
  38255. + if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT))
  38256. + return NDIS_STATUS_INVALID_LENGTH;
  38257. +
  38258. + ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf;
  38259. +
  38260. + _irqlevel_changed_(&oldirql, LOWER);
  38261. +
  38262. + if (poid_par_priv->type_of_oid == QUERY_OID)
  38263. + {
  38264. + RT_TRACE(_module_mp_, _drv_notice_,
  38265. + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\n",\
  38266. + ppgpkt->offset));
  38267. +
  38268. + Efuse_PowerSwitch(Adapter, _FALSE, _TRUE);
  38269. + if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE)
  38270. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38271. + else
  38272. + status = NDIS_STATUS_FAILURE;
  38273. + Efuse_PowerSwitch(Adapter, _FALSE, _FALSE);
  38274. + } else {
  38275. + RT_TRACE(_module_mp_, _drv_notice_,
  38276. + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\n",\
  38277. + ppgpkt->offset, ppgpkt->word_en));
  38278. +
  38279. + Efuse_PowerSwitch(Adapter, _TRUE, _TRUE);
  38280. + if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE)
  38281. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38282. + else
  38283. + status = NDIS_STATUS_FAILURE;
  38284. + Efuse_PowerSwitch(Adapter, _TRUE, _FALSE);
  38285. + }
  38286. +
  38287. + _irqlevel_changed_(&oldirql, RAISE);
  38288. +
  38289. + RT_TRACE(_module_mp_, _drv_info_,
  38290. + ("-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\n", status));
  38291. +
  38292. +_func_exit_;
  38293. +
  38294. + return status;
  38295. +}
  38296. +//------------------------------------------------------------------------------
  38297. +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv)
  38298. +{
  38299. +#ifdef PLATFORM_OS_XP
  38300. + _irqL oldirql;
  38301. +#endif
  38302. + u16 size;
  38303. + u8 ret;
  38304. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38305. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38306. +
  38307. +_func_enter_;
  38308. +
  38309. + if (poid_par_priv->type_of_oid != QUERY_OID)
  38310. + return NDIS_STATUS_NOT_ACCEPTED;
  38311. +
  38312. + if (poid_par_priv->information_buf_len <sizeof(u32))
  38313. + return NDIS_STATUS_INVALID_LENGTH;
  38314. +
  38315. + _irqlevel_changed_(&oldirql, LOWER);
  38316. + ret = efuse_GetCurrentSize(Adapter, &size);
  38317. + _irqlevel_changed_(&oldirql, RAISE);
  38318. + if (ret == _SUCCESS) {
  38319. + *(u32*)poid_par_priv->information_buf = size;
  38320. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38321. + } else
  38322. + status = NDIS_STATUS_FAILURE;
  38323. +
  38324. +_func_exit_;
  38325. +
  38326. + return status;
  38327. +}
  38328. +//------------------------------------------------------------------------------
  38329. +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv)
  38330. +{
  38331. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38332. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38333. +
  38334. +_func_enter_;
  38335. +
  38336. + if (poid_par_priv->type_of_oid != QUERY_OID)
  38337. + return NDIS_STATUS_NOT_ACCEPTED;
  38338. +
  38339. + if (poid_par_priv->information_buf_len < sizeof(u32))
  38340. + return NDIS_STATUS_INVALID_LENGTH;
  38341. +
  38342. + *(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter);
  38343. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38344. +
  38345. + RT_TRACE(_module_mp_, _drv_info_,
  38346. + ("-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\n",
  38347. + *(int*)poid_par_priv->information_buf, status));
  38348. +
  38349. +_func_exit_;
  38350. +
  38351. + return status;
  38352. +}
  38353. +//------------------------------------------------------------------------------
  38354. +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv)
  38355. +{
  38356. + NDIS_STATUS status;
  38357. +
  38358. +_func_enter_;
  38359. +
  38360. + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_efuse_hdl\n"));
  38361. +
  38362. + if (poid_par_priv->type_of_oid == QUERY_OID)
  38363. + status = oid_rt_pro_read_efuse_hdl(poid_par_priv);
  38364. + else
  38365. + status = oid_rt_pro_write_efuse_hdl(poid_par_priv);
  38366. +
  38367. + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_efuse_hdl: status=0x%08X\n", status));
  38368. +
  38369. +_func_exit_;
  38370. +
  38371. + return status;
  38372. +}
  38373. +//------------------------------------------------------------------------------
  38374. +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv)
  38375. +{
  38376. +#ifdef PLATFORM_OS_XP
  38377. + _irqL oldirql;
  38378. +#endif
  38379. + u8 *data;
  38380. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38381. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38382. + u16 mapLen=0;
  38383. +
  38384. +_func_enter_;
  38385. +
  38386. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_efuse_map_hdl\n"));
  38387. +
  38388. + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
  38389. +
  38390. + *poid_par_priv->bytes_rw = 0;
  38391. +
  38392. + if (poid_par_priv->information_buf_len < mapLen)
  38393. + return NDIS_STATUS_INVALID_LENGTH;
  38394. +
  38395. + data = (u8*)poid_par_priv->information_buf;
  38396. +
  38397. + _irqlevel_changed_(&oldirql, LOWER);
  38398. +
  38399. + if (poid_par_priv->type_of_oid == QUERY_OID)
  38400. + {
  38401. + RT_TRACE(_module_mp_, _drv_info_,
  38402. + ("oid_rt_pro_efuse_map_hdl: READ\n"));
  38403. +
  38404. + if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS)
  38405. + *poid_par_priv->bytes_rw = mapLen;
  38406. + else {
  38407. + RT_TRACE(_module_mp_, _drv_err_,
  38408. + ("oid_rt_pro_efuse_map_hdl: READ fail\n"));
  38409. + status = NDIS_STATUS_FAILURE;
  38410. + }
  38411. + } else {
  38412. + // SET_OID
  38413. + RT_TRACE(_module_mp_, _drv_info_,
  38414. + ("oid_rt_pro_efuse_map_hdl: WRITE\n"));
  38415. +
  38416. + if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS)
  38417. + *poid_par_priv->bytes_rw = mapLen;
  38418. + else {
  38419. + RT_TRACE(_module_mp_, _drv_err_,
  38420. + ("oid_rt_pro_efuse_map_hdl: WRITE fail\n"));
  38421. + status = NDIS_STATUS_FAILURE;
  38422. + }
  38423. + }
  38424. +
  38425. + _irqlevel_changed_(&oldirql, RAISE);
  38426. +
  38427. + RT_TRACE(_module_mp_, _drv_info_,
  38428. + ("-oid_rt_pro_efuse_map_hdl: status=0x%08X\n", status));
  38429. +
  38430. +_func_exit_;
  38431. +
  38432. + return status;
  38433. +}
  38434. +
  38435. +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv)
  38436. +{
  38437. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38438. +#if 0
  38439. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38440. +
  38441. +#ifdef PLATFORM_OS_XP
  38442. + _irqL oldirql;
  38443. +#endif
  38444. +
  38445. + u32 crystal_cap = 0;
  38446. +
  38447. +_func_enter_;
  38448. +
  38449. + if (poid_par_priv->type_of_oid != SET_OID)
  38450. + return NDIS_STATUS_NOT_ACCEPTED;
  38451. +
  38452. + if (poid_par_priv->information_buf_len <sizeof(u32))
  38453. + return NDIS_STATUS_INVALID_LENGTH;
  38454. +
  38455. + crystal_cap = *((u32*)poid_par_priv->information_buf);//4
  38456. + if (crystal_cap > 0xf)
  38457. + return NDIS_STATUS_NOT_ACCEPTED;
  38458. +
  38459. + Adapter->mppriv.curr_crystalcap = crystal_cap;
  38460. +
  38461. + _irqlevel_changed_(&oldirql,LOWER);
  38462. + SetCrystalCap(Adapter);
  38463. + _irqlevel_changed_(&oldirql,RAISE);
  38464. +
  38465. +_func_exit_;
  38466. +
  38467. +#endif
  38468. + return status;
  38469. +}
  38470. +
  38471. +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
  38472. +{
  38473. +#ifdef PLATFORM_OS_XP
  38474. + _irqL oldirql;
  38475. +#endif
  38476. + u8 rx_pkt_type;
  38477. +// u32 rcr_val32;
  38478. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38479. +// PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  38480. +
  38481. +_func_enter_;
  38482. +
  38483. + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_set_rx_packet_type_hdl\n"));
  38484. +
  38485. + if (poid_par_priv->type_of_oid != SET_OID)
  38486. + return NDIS_STATUS_NOT_ACCEPTED;
  38487. +
  38488. + if (poid_par_priv->information_buf_len < sizeof(u8))
  38489. + return NDIS_STATUS_INVALID_LENGTH;
  38490. +
  38491. + rx_pkt_type = *((u8*)poid_par_priv->information_buf);//4
  38492. +
  38493. + RT_TRACE(_module_mp_, _drv_info_, ("rx_pkt_type: %x\n",rx_pkt_type ));
  38494. +#if 0
  38495. + _irqlevel_changed_(&oldirql, LOWER);
  38496. +#if 0
  38497. + rcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR
  38498. + rcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP);
  38499. +
  38500. + if(rx_pkt_type == RX_PKT_BROADCAST){
  38501. + rcr_val8 |= (RCR_AB | RCR_ACRC32 );
  38502. + }
  38503. + else if(rx_pkt_type == RX_PKT_DEST_ADDR){
  38504. + rcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32);
  38505. + }
  38506. + else if(rx_pkt_type == RX_PKT_PHY_MATCH){
  38507. + rcr_val8 |= (RCR_APM|RCR_ACRC32);
  38508. + }
  38509. + else{
  38510. + rcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);
  38511. + }
  38512. + rtw_write8(padapter, 0x10250048,rcr_val8);
  38513. +#else
  38514. + rcr_val32 = rtw_read32(padapter, RCR);//RCR = 0x10250048
  38515. + rcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP);
  38516. +#if 0
  38517. + if(rx_pkt_type == RX_PKT_BROADCAST){
  38518. + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);
  38519. + }
  38520. + else if(rx_pkt_type == RX_PKT_DEST_ADDR){
  38521. + //rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32);
  38522. + rcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32);
  38523. + }
  38524. + else if(rx_pkt_type == RX_PKT_PHY_MATCH){
  38525. + rcr_val32 |= (RCR_APM|RCR_ACRC32);
  38526. + //rcr_val32 |= (RCR_AAP|RCR_ACRC32);
  38527. + }
  38528. + else{
  38529. + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);
  38530. + }
  38531. +#else
  38532. + switch (rx_pkt_type)
  38533. + {
  38534. + case RX_PKT_BROADCAST :
  38535. + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);
  38536. + break;
  38537. + case RX_PKT_DEST_ADDR :
  38538. + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);
  38539. + break;
  38540. + case RX_PKT_PHY_MATCH:
  38541. + rcr_val32 |= (RCR_APM|RCR_ACRC32);
  38542. + break;
  38543. + default:
  38544. + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);
  38545. + break;
  38546. + }
  38547. +
  38548. + if (rx_pkt_type == RX_PKT_DEST_ADDR) {
  38549. + padapter->mppriv.check_mp_pkt = 1;
  38550. + } else {
  38551. + padapter->mppriv.check_mp_pkt = 0;
  38552. + }
  38553. +#endif
  38554. + rtw_write32(padapter, RCR, rcr_val32);
  38555. +
  38556. +#endif
  38557. + _irqlevel_changed_(&oldirql, RAISE);
  38558. +#endif
  38559. +_func_exit_;
  38560. +
  38561. + return status;
  38562. +}
  38563. +
  38564. +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv)
  38565. +{
  38566. +#if 0
  38567. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38568. +
  38569. +#ifdef PLATFORM_OS_XP
  38570. + _irqL oldirql;
  38571. +#endif
  38572. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38573. +
  38574. + u32 txagc;
  38575. +
  38576. +_func_enter_;
  38577. +
  38578. + if (poid_par_priv->type_of_oid != SET_OID)
  38579. + return NDIS_STATUS_NOT_ACCEPTED;
  38580. +
  38581. + if (poid_par_priv->information_buf_len < sizeof(u32))
  38582. + return NDIS_STATUS_INVALID_LENGTH;
  38583. +
  38584. + txagc = *(u32*)poid_par_priv->information_buf;
  38585. + RT_TRACE(_module_mp_, _drv_info_,
  38586. + ("oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\n", txagc));
  38587. +
  38588. + _irqlevel_changed_(&oldirql, LOWER);
  38589. + SetTxAGCOffset(Adapter, txagc);
  38590. + _irqlevel_changed_(&oldirql, RAISE);
  38591. +
  38592. +_func_exit_;
  38593. +
  38594. + return status;
  38595. +#else
  38596. + return 0;
  38597. +#endif
  38598. +}
  38599. +
  38600. +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv)
  38601. +{
  38602. +#if 0
  38603. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38604. +
  38605. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38606. +
  38607. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  38608. + struct mp_priv *pmppriv = &Adapter->mppriv;
  38609. + u32 type;
  38610. +
  38611. +_func_enter_;
  38612. +
  38613. + if (poid_par_priv->type_of_oid != SET_OID)
  38614. + return NDIS_STATUS_NOT_ACCEPTED;
  38615. +
  38616. + if (poid_par_priv->information_buf_len <sizeof(u32))
  38617. + return NDIS_STATUS_INVALID_LENGTH;
  38618. +
  38619. + type = *(u32*)poid_par_priv->information_buf;
  38620. +
  38621. + if (_LOOPBOOK_MODE_ == type) {
  38622. + pmppriv->mode = type;
  38623. + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc
  38624. + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to loopback mode:0x%08x.\n", get_fwstate(pmlmepriv)));
  38625. + } else if (_2MAC_MODE_ == type){
  38626. + pmppriv->mode = type;
  38627. + _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE);
  38628. + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to 2mac mode:0x%08x.\n", get_fwstate(pmlmepriv)));
  38629. + } else
  38630. + status = NDIS_STATUS_NOT_ACCEPTED;
  38631. +
  38632. +_func_exit_;
  38633. +
  38634. + return status;
  38635. +#else
  38636. + return 0;
  38637. +#endif
  38638. +}
  38639. +
  38640. +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
  38641. +{
  38642. + PMP_XMIT_PARM pparm;
  38643. + PADAPTER padapter;
  38644. + struct mp_priv *pmp_priv;
  38645. + struct pkt_attrib *pattrib;
  38646. +
  38647. + RT_TRACE(_module_mp_, _drv_notice_, ("+%s\n", __func__));
  38648. +
  38649. + pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf;
  38650. + padapter = (PADAPTER)poid_par_priv->adapter_context;
  38651. + pmp_priv = &padapter->mppriv;
  38652. +
  38653. + if (poid_par_priv->type_of_oid == QUERY_OID) {
  38654. + pparm->enable = !pmp_priv->tx.stop;
  38655. + pparm->count = pmp_priv->tx.sended;
  38656. + } else {
  38657. + if (pparm->enable == 0) {
  38658. + pmp_priv->tx.stop = 1;
  38659. + } else if (pmp_priv->tx.stop == 1) {
  38660. + pmp_priv->tx.stop = 0;
  38661. + pmp_priv->tx.count = pparm->count;
  38662. + pmp_priv->tx.payload = pparm->payload_type;
  38663. + pattrib = &pmp_priv->tx.attrib;
  38664. + pattrib->pktlen = pparm->length;
  38665. + _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN);
  38666. + SetPacketTx(padapter);
  38667. + } else
  38668. + return NDIS_STATUS_FAILURE;
  38669. + }
  38670. +
  38671. + return NDIS_STATUS_SUCCESS;
  38672. +}
  38673. +
  38674. +#if 0
  38675. +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
  38676. +{
  38677. + unsigned char *pframe, *pmp_pkt;
  38678. + struct ethhdr *pethhdr;
  38679. + struct pkt_attrib *pattrib;
  38680. + struct rtw_ieee80211_hdr *pwlanhdr;
  38681. + unsigned short *fctrl;
  38682. + int llc_sz, payload_len;
  38683. + struct mp_xmit_frame *pxframe= NULL;
  38684. + struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param;
  38685. + u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55};
  38686. +
  38687. +// DBG_871X("+mp_ioctl_xmit_packet_hdl\n");
  38688. +
  38689. + pxframe = alloc_mp_xmitframe(&padapter->mppriv);
  38690. + if (pxframe == NULL)
  38691. + {
  38692. + DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__));
  38693. + return -1;
  38694. + }
  38695. +
  38696. + //mp_xmit_pkt
  38697. + payload_len = pmp_xmitpkt->len - 14;
  38698. + pmp_pkt = (unsigned char*)pmp_xmitpkt->mem;
  38699. + pethhdr = (struct ethhdr *)pmp_pkt;
  38700. +
  38701. + //DBG_871X("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem);
  38702. +
  38703. + //DBG_871X("pxframe=0x%x\n", (void*)pxframe);
  38704. + //DBG_871X("pxframe->mem=0x%x\n", (void*)pxframe->mem);
  38705. +
  38706. + //update attribute
  38707. + pattrib = &pxframe->attrib;
  38708. + memset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib));
  38709. + pattrib->pktlen = pmp_xmitpkt->len;
  38710. + pattrib->ether_type = ntohs(pethhdr->h_proto);
  38711. + pattrib->hdrlen = 24;
  38712. + pattrib->nr_frags = 1;
  38713. + pattrib->priority = 0;
  38714. +#ifndef CONFIG_MP_LINUX
  38715. + if(IS_MCAST(pethhdr->h_dest))
  38716. + pattrib->mac_id = 4;
  38717. + else
  38718. + pattrib->mac_id = 5;
  38719. +#else
  38720. + pattrib->mac_id = 5;
  38721. +#endif
  38722. +
  38723. + //
  38724. + memset(pxframe->mem, 0 , WLANHDR_OFFSET);
  38725. + pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET;
  38726. +
  38727. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  38728. +
  38729. + fctrl = &(pwlanhdr->frame_ctl);
  38730. + *(fctrl) = 0;
  38731. + SetFrameSubType(pframe, WIFI_DATA);
  38732. +
  38733. + _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN);
  38734. + _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN);
  38735. +
  38736. + _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN);
  38737. +
  38738. + pwlanhdr->seq_ctl = 0;
  38739. + pframe += pattrib->hdrlen;
  38740. +
  38741. + llc_sz= rtw_put_snap(pframe, pattrib->ether_type);
  38742. + pframe += llc_sz;
  38743. +
  38744. + _rtw_memcpy(pframe, (void*)(pmp_pkt+14), payload_len);
  38745. +
  38746. + pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len;
  38747. +
  38748. + DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type));
  38749. + xmit_mp_frame(padapter, pxframe);
  38750. +
  38751. + return _SUCCESS;
  38752. +}
  38753. +#endif
  38754. +//------------------------------------------------------------------------------
  38755. +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)
  38756. +{
  38757. +#ifdef PLATFORM_OS_XP
  38758. + _irqL oldirql;
  38759. +#endif
  38760. + u8 bpwrup;
  38761. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38762. +#ifdef PLATFORM_LINUX
  38763. +#ifdef CONFIG_SDIO_HCI
  38764. + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
  38765. +#endif
  38766. +#endif
  38767. +
  38768. +_func_enter_;
  38769. +
  38770. + if (poid_par_priv->type_of_oid != SET_OID) {
  38771. + status = NDIS_STATUS_NOT_ACCEPTED;
  38772. + return status;
  38773. + }
  38774. +
  38775. + RT_TRACE(_module_mp_, _drv_info_,
  38776. + ("\n ===> Setoid_rt_set_power_down_hdl.\n"));
  38777. +
  38778. + _irqlevel_changed_(&oldirql, LOWER);
  38779. +
  38780. + bpwrup = *(u8 *)poid_par_priv->information_buf;
  38781. + //CALL the power_down function
  38782. +#ifdef PLATFORM_LINUX
  38783. +#ifdef CONFIG_SDIO_HCI
  38784. + dev_power_down(padapter,bpwrup);
  38785. +#endif
  38786. +#endif
  38787. + _irqlevel_changed_(&oldirql, RAISE);
  38788. +
  38789. + //DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER.
  38790. + // Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value));
  38791. +
  38792. +_func_exit_;
  38793. +
  38794. + return status;
  38795. +}
  38796. +//------------------------------------------------------------------------------
  38797. +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv)
  38798. +{
  38799. +#if 0
  38800. + NDIS_STATUS status = NDIS_STATUS_SUCCESS;
  38801. + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
  38802. +//#ifdef PLATFORM_OS_XP
  38803. +// _irqL oldirql;
  38804. +//#endif
  38805. +
  38806. +_func_enter_;
  38807. +
  38808. + if (poid_par_priv->type_of_oid != QUERY_OID) {
  38809. + status = NDIS_STATUS_NOT_ACCEPTED;
  38810. + return status;
  38811. + }
  38812. + if (poid_par_priv->information_buf_len < sizeof(u32)) {
  38813. + status = NDIS_STATUS_INVALID_LENGTH;
  38814. + return status;
  38815. + }
  38816. +
  38817. + RT_TRACE(_module_mp_, _drv_info_,
  38818. + ("\n ===> oid_rt_get_power_mode_hdl.\n"));
  38819. +
  38820. +// _irqlevel_changed_(&oldirql, LOWER);
  38821. + *(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL;
  38822. + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  38823. +// _irqlevel_changed_(&oldirql, RAISE);
  38824. +
  38825. +_func_exit_;
  38826. +
  38827. + return status;
  38828. +#else
  38829. + return 0;
  38830. +#endif
  38831. +}
  38832. --- /dev/null
  38833. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_p2p.c
  38834. @@ -0,0 +1,5293 @@
  38835. +/******************************************************************************
  38836. + *
  38837. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  38838. + *
  38839. + * This program is free software; you can redistribute it and/or modify it
  38840. + * under the terms of version 2 of the GNU General Public License as
  38841. + * published by the Free Software Foundation.
  38842. + *
  38843. + * This program is distributed in the hope that it will be useful, but WITHOUT
  38844. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  38845. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  38846. + * more details.
  38847. + *
  38848. + * You should have received a copy of the GNU General Public License along with
  38849. + * this program; if not, write to the Free Software Foundation, Inc.,
  38850. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  38851. + *
  38852. + *
  38853. + ******************************************************************************/
  38854. +#define _RTW_P2P_C_
  38855. +
  38856. +#include <drv_types.h>
  38857. +#include <rtw_p2p.h>
  38858. +#include <wifi.h>
  38859. +
  38860. +#ifdef CONFIG_P2P
  38861. +
  38862. +int rtw_p2p_is_channel_list_ok( u8 desired_ch, u8* ch_list, u8 ch_cnt )
  38863. +{
  38864. + int found = 0, i = 0;
  38865. +
  38866. + for( i = 0; i < ch_cnt; i++ )
  38867. + {
  38868. + if ( ch_list[ i ] == desired_ch )
  38869. + {
  38870. + found = 1;
  38871. + break;
  38872. + }
  38873. + }
  38874. + return( found );
  38875. +}
  38876. +
  38877. +int is_any_client_associated(_adapter *padapter)
  38878. +{
  38879. + return padapter->stapriv.asoc_list_cnt ? _TRUE : _FALSE;
  38880. +}
  38881. +
  38882. +static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
  38883. +{
  38884. + _irqL irqL;
  38885. + _list *phead, *plist;
  38886. + u32 len=0;
  38887. + u16 attr_len = 0;
  38888. + u8 tmplen, *pdata_attr, *pstart, *pcur;
  38889. + struct sta_info *psta = NULL;
  38890. + _adapter *padapter = pwdinfo->padapter;
  38891. + struct sta_priv *pstapriv = &padapter->stapriv;
  38892. +
  38893. + DBG_871X("%s\n", __FUNCTION__);
  38894. +
  38895. + pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN);
  38896. +
  38897. + pstart = pdata_attr;
  38898. + pcur = pdata_attr;
  38899. +
  38900. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  38901. + phead = &pstapriv->asoc_list;
  38902. + plist = get_next(phead);
  38903. +
  38904. + //look up sta asoc_queue
  38905. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  38906. + {
  38907. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  38908. +
  38909. + plist = get_next(plist);
  38910. +
  38911. +
  38912. + if(psta->is_p2p_device)
  38913. + {
  38914. + tmplen = 0;
  38915. +
  38916. + pcur++;
  38917. +
  38918. + //P2P device address
  38919. + _rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN);
  38920. + pcur += ETH_ALEN;
  38921. +
  38922. + //P2P interface address
  38923. + _rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN);
  38924. + pcur += ETH_ALEN;
  38925. +
  38926. + *pcur = psta->dev_cap;
  38927. + pcur++;
  38928. +
  38929. + //*(u16*)(pcur) = cpu_to_be16(psta->config_methods);
  38930. + RTW_PUT_BE16(pcur, psta->config_methods);
  38931. + pcur += 2;
  38932. +
  38933. + _rtw_memcpy(pcur, psta->primary_dev_type, 8);
  38934. + pcur += 8;
  38935. +
  38936. + *pcur = psta->num_of_secdev_type;
  38937. + pcur++;
  38938. +
  38939. + _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8);
  38940. + pcur += psta->num_of_secdev_type*8;
  38941. +
  38942. + if(psta->dev_name_len>0)
  38943. + {
  38944. + //*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  38945. + RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME);
  38946. + pcur += 2;
  38947. +
  38948. + //*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len );
  38949. + RTW_PUT_BE16(pcur, psta->dev_name_len);
  38950. + pcur += 2;
  38951. +
  38952. + _rtw_memcpy(pcur, psta->dev_name, psta->dev_name_len);
  38953. + pcur += psta->dev_name_len;
  38954. + }
  38955. +
  38956. +
  38957. + tmplen = (u8)(pcur-pstart);
  38958. +
  38959. + *pstart = (tmplen-1);
  38960. +
  38961. + attr_len += tmplen;
  38962. +
  38963. + //pstart += tmplen;
  38964. + pstart = pcur;
  38965. +
  38966. + }
  38967. +
  38968. +
  38969. + }
  38970. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  38971. +
  38972. + if(attr_len>0)
  38973. + {
  38974. + len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr);
  38975. + }
  38976. +
  38977. + rtw_mfree(pdata_attr, MAX_P2P_IE_LEN);
  38978. +
  38979. + return len;
  38980. +
  38981. +}
  38982. +
  38983. +static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
  38984. +{
  38985. + struct xmit_frame *pmgntframe;
  38986. + struct pkt_attrib *pattrib;
  38987. + unsigned char *pframe;
  38988. + struct rtw_ieee80211_hdr *pwlanhdr;
  38989. + unsigned short *fctrl;
  38990. + _adapter *padapter = pwdinfo->padapter;
  38991. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  38992. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  38993. + unsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame
  38994. + u32 p2poui = cpu_to_be32(P2POUI);
  38995. + u8 oui_subtype = P2P_GO_DISC_REQUEST;
  38996. + u8 dialogToken=0;
  38997. +
  38998. + DBG_871X("[%s]\n", __FUNCTION__);
  38999. +
  39000. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  39001. + {
  39002. + return;
  39003. + }
  39004. +
  39005. + //update attribute
  39006. + pattrib = &pmgntframe->attrib;
  39007. + update_mgntframe_attrib(padapter, pattrib);
  39008. +
  39009. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  39010. +
  39011. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  39012. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  39013. +
  39014. + fctrl = &(pwlanhdr->frame_ctl);
  39015. + *(fctrl) = 0;
  39016. +
  39017. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  39018. + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
  39019. + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);
  39020. +
  39021. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  39022. + pmlmeext->mgnt_seq++;
  39023. + SetFrameSubType(pframe, WIFI_ACTION);
  39024. +
  39025. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  39026. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  39027. +
  39028. + //Build P2P action frame header
  39029. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  39030. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  39031. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  39032. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  39033. +
  39034. + //there is no IE in this P2P action frame
  39035. +
  39036. + pattrib->last_txcmdsz = pattrib->pktlen;
  39037. +
  39038. + dump_mgntframe(padapter, pmgntframe);
  39039. +
  39040. +}
  39041. +
  39042. +static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
  39043. +{
  39044. + struct xmit_frame *pmgntframe;
  39045. + struct pkt_attrib *pattrib;
  39046. + unsigned char *pframe;
  39047. + struct rtw_ieee80211_hdr *pwlanhdr;
  39048. + unsigned short *fctrl;
  39049. + _adapter *padapter = pwdinfo->padapter;
  39050. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  39051. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  39052. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  39053. + u8 action = P2P_PUB_ACTION_ACTION;
  39054. + u32 p2poui = cpu_to_be32(P2POUI);
  39055. + u8 oui_subtype = P2P_DEVDISC_RESP;
  39056. + u8 p2pie[8] = { 0x00 };
  39057. + u32 p2pielen = 0;
  39058. +
  39059. + DBG_871X("[%s]\n", __FUNCTION__);
  39060. +
  39061. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  39062. + {
  39063. + return;
  39064. + }
  39065. +
  39066. + //update attribute
  39067. + pattrib = &pmgntframe->attrib;
  39068. + update_mgntframe_attrib(padapter, pattrib);
  39069. +
  39070. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  39071. +
  39072. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  39073. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  39074. +
  39075. + fctrl = &(pwlanhdr->frame_ctl);
  39076. + *(fctrl) = 0;
  39077. +
  39078. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  39079. + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN);
  39080. + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN);
  39081. +
  39082. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  39083. + pmlmeext->mgnt_seq++;
  39084. + SetFrameSubType(pframe, WIFI_ACTION);
  39085. +
  39086. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  39087. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  39088. +
  39089. + //Build P2P public action frame header
  39090. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  39091. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  39092. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  39093. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  39094. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  39095. +
  39096. +
  39097. + //Build P2P IE
  39098. + // P2P OUI
  39099. + p2pielen = 0;
  39100. + p2pie[ p2pielen++ ] = 0x50;
  39101. + p2pie[ p2pielen++ ] = 0x6F;
  39102. + p2pie[ p2pielen++ ] = 0x9A;
  39103. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  39104. +
  39105. + // P2P_ATTR_STATUS
  39106. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
  39107. +
  39108. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen);
  39109. +
  39110. + pattrib->last_txcmdsz = pattrib->pktlen;
  39111. +
  39112. + dump_mgntframe(padapter, pmgntframe);
  39113. +
  39114. +}
  39115. +
  39116. +static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method)
  39117. +{
  39118. + _adapter *padapter = pwdinfo->padapter;
  39119. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  39120. + u8 action = P2P_PUB_ACTION_ACTION;
  39121. + u8 dialogToken = frame_body[7]; // The Dialog Token of provisioning discovery request frame.
  39122. + u32 p2poui = cpu_to_be32(P2POUI);
  39123. + u8 oui_subtype = P2P_PROVISION_DISC_RESP;
  39124. + u8 wpsie[ 100 ] = { 0x00 };
  39125. + u8 wpsielen = 0;
  39126. +#ifdef CONFIG_WFD
  39127. + u32 wfdielen = 0;
  39128. +#endif //CONFIG_WFD
  39129. +
  39130. + struct xmit_frame *pmgntframe;
  39131. + struct pkt_attrib *pattrib;
  39132. + unsigned char *pframe;
  39133. + struct rtw_ieee80211_hdr *pwlanhdr;
  39134. + unsigned short *fctrl;
  39135. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  39136. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  39137. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  39138. +
  39139. +
  39140. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  39141. + {
  39142. + return;
  39143. + }
  39144. +
  39145. + //update attribute
  39146. + pattrib = &pmgntframe->attrib;
  39147. + update_mgntframe_attrib(padapter, pattrib);
  39148. +
  39149. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  39150. +
  39151. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  39152. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  39153. +
  39154. + fctrl = &(pwlanhdr->frame_ctl);
  39155. + *(fctrl) = 0;
  39156. +
  39157. + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
  39158. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  39159. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  39160. +
  39161. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  39162. + pmlmeext->mgnt_seq++;
  39163. + SetFrameSubType(pframe, WIFI_ACTION);
  39164. +
  39165. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  39166. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  39167. +
  39168. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  39169. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  39170. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  39171. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  39172. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  39173. +
  39174. + wpsielen = 0;
  39175. + // WPS OUI
  39176. + //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  39177. + RTW_PUT_BE32(wpsie, WPSOUI);
  39178. + wpsielen += 4;
  39179. +
  39180. +#if 0
  39181. + // WPS version
  39182. + // Type:
  39183. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  39184. + wpsielen += 2;
  39185. +
  39186. + // Length:
  39187. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  39188. + wpsielen += 2;
  39189. +
  39190. + // Value:
  39191. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  39192. +#endif
  39193. +
  39194. + // Config Method
  39195. + // Type:
  39196. + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
  39197. + RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD);
  39198. + wpsielen += 2;
  39199. +
  39200. + // Length:
  39201. + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  39202. + RTW_PUT_BE16(wpsie + wpsielen, 0x0002);
  39203. + wpsielen += 2;
  39204. +
  39205. + // Value:
  39206. + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method );
  39207. + RTW_PUT_BE16(wpsie + wpsielen, config_method);
  39208. + wpsielen += 2;
  39209. +
  39210. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  39211. +
  39212. +#ifdef CONFIG_WFD
  39213. + wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);
  39214. + pframe += wfdielen;
  39215. + pattrib->pktlen += wfdielen;
  39216. +#endif //CONFIG_WFD
  39217. +
  39218. + pattrib->last_txcmdsz = pattrib->pktlen;
  39219. +
  39220. + dump_mgntframe(padapter, pmgntframe);
  39221. +
  39222. + return;
  39223. +
  39224. +}
  39225. +
  39226. +static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
  39227. +{
  39228. + struct xmit_frame *pmgntframe;
  39229. + struct pkt_attrib *pattrib;
  39230. + unsigned char *pframe;
  39231. + struct rtw_ieee80211_hdr *pwlanhdr;
  39232. + unsigned short *fctrl;
  39233. + _adapter *padapter = pwdinfo->padapter;
  39234. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  39235. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  39236. + unsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame
  39237. + u32 p2poui = cpu_to_be32(P2POUI);
  39238. + u8 oui_subtype = P2P_PRESENCE_RESPONSE;
  39239. + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
  39240. + u8 noa_attr_content[32] = { 0x00 };
  39241. + u32 p2pielen = 0;
  39242. +
  39243. + DBG_871X("[%s]\n", __FUNCTION__);
  39244. +
  39245. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  39246. + {
  39247. + return;
  39248. + }
  39249. +
  39250. + //update attribute
  39251. + pattrib = &pmgntframe->attrib;
  39252. + update_mgntframe_attrib(padapter, pattrib);
  39253. +
  39254. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  39255. +
  39256. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  39257. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  39258. +
  39259. + fctrl = &(pwlanhdr->frame_ctl);
  39260. + *(fctrl) = 0;
  39261. +
  39262. + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  39263. + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
  39264. + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);
  39265. +
  39266. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  39267. + pmlmeext->mgnt_seq++;
  39268. + SetFrameSubType(pframe, WIFI_ACTION);
  39269. +
  39270. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  39271. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  39272. +
  39273. + //Build P2P action frame header
  39274. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  39275. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  39276. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  39277. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  39278. +
  39279. +
  39280. + //Add P2P IE header
  39281. + // P2P OUI
  39282. + p2pielen = 0;
  39283. + p2pie[ p2pielen++ ] = 0x50;
  39284. + p2pie[ p2pielen++ ] = 0x6F;
  39285. + p2pie[ p2pielen++ ] = 0x9A;
  39286. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  39287. +
  39288. + //Add Status attribute in P2P IE
  39289. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
  39290. +
  39291. + //Add NoA attribute in P2P IE
  39292. + noa_attr_content[0] = 0x1;//index
  39293. + noa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters
  39294. +
  39295. + //todo: Notice of Absence Descriptor(s)
  39296. +
  39297. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content);
  39298. +
  39299. +
  39300. +
  39301. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen));
  39302. +
  39303. +
  39304. + pattrib->last_txcmdsz = pattrib->pktlen;
  39305. +
  39306. + dump_mgntframe(padapter, pmgntframe);
  39307. +
  39308. +}
  39309. +
  39310. +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39311. +{
  39312. + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
  39313. + u16 capability=0;
  39314. + u32 len=0, p2pielen = 0;
  39315. +
  39316. +
  39317. + // P2P OUI
  39318. + p2pielen = 0;
  39319. + p2pie[ p2pielen++ ] = 0x50;
  39320. + p2pie[ p2pielen++ ] = 0x6F;
  39321. + p2pie[ p2pielen++ ] = 0x9A;
  39322. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  39323. +
  39324. +
  39325. + // According to the P2P Specification, the beacon frame should contain 3 P2P attributes
  39326. + // 1. P2P Capability
  39327. + // 2. P2P Device ID
  39328. + // 3. Notice of Absence ( NOA )
  39329. +
  39330. + // P2P Capability ATTR
  39331. + // Type:
  39332. + // Length:
  39333. + // Value:
  39334. + // Device Capability Bitmap, 1 byte
  39335. + // Be able to participate in additional P2P Groups and
  39336. + // support the P2P Invitation Procedure
  39337. + // Group Capability Bitmap, 1 byte
  39338. + capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY;
  39339. + capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8);
  39340. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
  39341. + capability |= (P2P_GRPCAP_GROUP_FORMATION<<8);
  39342. +
  39343. + capability = cpu_to_le16(capability);
  39344. +
  39345. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability);
  39346. +
  39347. +
  39348. + // P2P Device ID ATTR
  39349. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr);
  39350. +
  39351. +
  39352. + // Notice of Absence ATTR
  39353. + // Type:
  39354. + // Length:
  39355. + // Value:
  39356. +
  39357. + //go_add_noa_attr(pwdinfo);
  39358. +
  39359. +
  39360. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
  39361. +
  39362. +
  39363. + return len;
  39364. +
  39365. +}
  39366. +
  39367. +#ifdef CONFIG_WFD
  39368. +u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39369. +{
  39370. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  39371. + u32 len=0, wfdielen = 0;
  39372. + _adapter *padapter = pwdinfo->padapter;
  39373. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  39374. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  39375. +
  39376. + // WFD OUI
  39377. + wfdielen = 0;
  39378. + wfdie[ wfdielen++ ] = 0x50;
  39379. + wfdie[ wfdielen++ ] = 0x6F;
  39380. + wfdie[ wfdielen++ ] = 0x9A;
  39381. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  39382. +
  39383. + // Commented by Albert 20110812
  39384. + // According to the WFD Specification, the beacon frame should contain 4 WFD attributes
  39385. + // 1. WFD Device Information
  39386. + // 2. Associated BSSID
  39387. + // 3. Coupled Sink Information
  39388. +
  39389. +
  39390. + // WFD Device Information ATTR
  39391. + // Type:
  39392. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  39393. +
  39394. + // Length:
  39395. + // Note: In the WFD specification, the size of length field is 2.
  39396. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39397. + wfdielen += 2;
  39398. +
  39399. + // Value1:
  39400. + // WFD device information
  39401. +
  39402. + if ( P2P_ROLE_GO == pwdinfo->role )
  39403. + {
  39404. + if ( is_any_client_associated( pwdinfo->padapter ) )
  39405. + {
  39406. + // WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery)
  39407. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD );
  39408. + }
  39409. + else
  39410. + {
  39411. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery)
  39412. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  39413. + }
  39414. +
  39415. + }
  39416. + else
  39417. + {
  39418. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39419. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  39420. + }
  39421. +
  39422. + wfdielen += 2;
  39423. +
  39424. + // Value2:
  39425. + // Session Management Control Port
  39426. + // Default TCP port for RTSP messages is 554
  39427. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  39428. + wfdielen += 2;
  39429. +
  39430. + // Value3:
  39431. + // WFD Device Maximum Throughput
  39432. + // 300Mbps is the maximum throughput
  39433. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  39434. + wfdielen += 2;
  39435. +
  39436. + // Associated BSSID ATTR
  39437. + // Type:
  39438. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  39439. +
  39440. + // Length:
  39441. + // Note: In the WFD specification, the size of length field is 2.
  39442. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39443. + wfdielen += 2;
  39444. +
  39445. + // Value:
  39446. + // Associated BSSID
  39447. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  39448. + {
  39449. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  39450. + }
  39451. + else
  39452. + {
  39453. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  39454. + }
  39455. +
  39456. + wfdielen += ETH_ALEN;
  39457. +
  39458. + // Coupled Sink Information ATTR
  39459. + // Type:
  39460. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  39461. +
  39462. + // Length:
  39463. + // Note: In the WFD specification, the size of length field is 2.
  39464. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  39465. + wfdielen += 2;
  39466. +
  39467. + // Value:
  39468. + // Coupled Sink Status bitmap
  39469. + // Not coupled/available for Coupling
  39470. + wfdie[ wfdielen++ ] = 0;
  39471. + // MAC Addr.
  39472. + wfdie[ wfdielen++ ] = 0;
  39473. + wfdie[ wfdielen++ ] = 0;
  39474. + wfdie[ wfdielen++ ] = 0;
  39475. + wfdie[ wfdielen++ ] = 0;
  39476. + wfdie[ wfdielen++ ] = 0;
  39477. + wfdie[ wfdielen++ ] = 0;
  39478. +
  39479. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  39480. +
  39481. + return len;
  39482. +
  39483. +}
  39484. +
  39485. +u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39486. +{
  39487. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  39488. + u32 len=0, wfdielen = 0;
  39489. + _adapter *padapter = pwdinfo->padapter;
  39490. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  39491. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  39492. +
  39493. + // WFD OUI
  39494. + wfdielen = 0;
  39495. + wfdie[ wfdielen++ ] = 0x50;
  39496. + wfdie[ wfdielen++ ] = 0x6F;
  39497. + wfdie[ wfdielen++ ] = 0x9A;
  39498. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  39499. +
  39500. + // Commented by Albert 20110812
  39501. + // According to the WFD Specification, the probe request frame should contain 4 WFD attributes
  39502. + // 1. WFD Device Information
  39503. + // 2. Associated BSSID
  39504. + // 3. Coupled Sink Information
  39505. +
  39506. +
  39507. + // WFD Device Information ATTR
  39508. + // Type:
  39509. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  39510. +
  39511. + // Length:
  39512. + // Note: In the WFD specification, the size of length field is 2.
  39513. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39514. + wfdielen += 2;
  39515. +
  39516. + // Value1:
  39517. + // WFD device information
  39518. +
  39519. + if ( 1 == pwdinfo->wfd_tdls_enable )
  39520. + {
  39521. + // WFD primary sink + available for WFD session + WiFi TDLS mode + WSC ( WFD Service Discovery )
  39522. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type |
  39523. + WFD_DEVINFO_SESSION_AVAIL |
  39524. + WFD_DEVINFO_WSD |
  39525. + WFD_DEVINFO_PC_TDLS );
  39526. + }
  39527. + else
  39528. + {
  39529. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSC ( WFD Service Discovery )
  39530. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type |
  39531. + WFD_DEVINFO_SESSION_AVAIL |
  39532. + WFD_DEVINFO_WSD );
  39533. + }
  39534. +
  39535. + wfdielen += 2;
  39536. +
  39537. + // Value2:
  39538. + // Session Management Control Port
  39539. + // Default TCP port for RTSP messages is 554
  39540. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  39541. + wfdielen += 2;
  39542. +
  39543. + // Value3:
  39544. + // WFD Device Maximum Throughput
  39545. + // 300Mbps is the maximum throughput
  39546. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  39547. + wfdielen += 2;
  39548. +
  39549. + // Associated BSSID ATTR
  39550. + // Type:
  39551. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  39552. +
  39553. + // Length:
  39554. + // Note: In the WFD specification, the size of length field is 2.
  39555. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39556. + wfdielen += 2;
  39557. +
  39558. + // Value:
  39559. + // Associated BSSID
  39560. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  39561. + {
  39562. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  39563. + }
  39564. + else
  39565. + {
  39566. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  39567. + }
  39568. +
  39569. + wfdielen += ETH_ALEN;
  39570. +
  39571. + // Coupled Sink Information ATTR
  39572. + // Type:
  39573. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  39574. +
  39575. + // Length:
  39576. + // Note: In the WFD specification, the size of length field is 2.
  39577. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  39578. + wfdielen += 2;
  39579. +
  39580. + // Value:
  39581. + // Coupled Sink Status bitmap
  39582. + // Not coupled/available for Coupling
  39583. + wfdie[ wfdielen++ ] = 0;
  39584. + // MAC Addr.
  39585. + wfdie[ wfdielen++ ] = 0;
  39586. + wfdie[ wfdielen++ ] = 0;
  39587. + wfdie[ wfdielen++ ] = 0;
  39588. + wfdie[ wfdielen++ ] = 0;
  39589. + wfdie[ wfdielen++ ] = 0;
  39590. + wfdie[ wfdielen++ ] = 0;
  39591. +
  39592. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  39593. +
  39594. + return len;
  39595. +
  39596. +}
  39597. +
  39598. +u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled)
  39599. +{
  39600. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  39601. + u32 len=0, wfdielen = 0;
  39602. + _adapter *padapter = pwdinfo->padapter;
  39603. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  39604. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  39605. +
  39606. + // WFD OUI
  39607. + wfdielen = 0;
  39608. + wfdie[ wfdielen++ ] = 0x50;
  39609. + wfdie[ wfdielen++ ] = 0x6F;
  39610. + wfdie[ wfdielen++ ] = 0x9A;
  39611. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  39612. +
  39613. + // Commented by Albert 20110812
  39614. + // According to the WFD Specification, the probe response frame should contain 4 WFD attributes
  39615. + // 1. WFD Device Information
  39616. + // 2. Associated BSSID
  39617. + // 3. Coupled Sink Information
  39618. + // 4. WFD Session Information
  39619. +
  39620. +
  39621. + // WFD Device Information ATTR
  39622. + // Type:
  39623. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  39624. +
  39625. + // Length:
  39626. + // Note: In the WFD specification, the size of length field is 2.
  39627. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39628. + wfdielen += 2;
  39629. +
  39630. + // Value1:
  39631. + // WFD device information
  39632. + // WFD primary sink + available for WFD session + WiFi Direct mode
  39633. +
  39634. + if ( _TRUE == pwdinfo->session_available )
  39635. + {
  39636. + if ( P2P_ROLE_GO == pwdinfo->role )
  39637. + {
  39638. + if ( is_any_client_associated( pwdinfo->padapter ) )
  39639. + {
  39640. + if ( pwdinfo->wfd_tdls_enable )
  39641. + {
  39642. + // TDLS mode + WSD ( WFD Service Discovery )
  39643. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);
  39644. + }
  39645. + else
  39646. + {
  39647. + // WiFi Direct mode + WSD ( WFD Service Discovery )
  39648. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);
  39649. + }
  39650. + }
  39651. + else
  39652. + {
  39653. + if ( pwdinfo->wfd_tdls_enable )
  39654. + {
  39655. + // available for WFD session + TDLS mode + WSD ( WFD Service Discovery )
  39656. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);
  39657. + }
  39658. + else
  39659. + {
  39660. + // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39661. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);
  39662. + }
  39663. + }
  39664. + }
  39665. + else
  39666. + {
  39667. + if ( pwdinfo->wfd_tdls_enable )
  39668. + {
  39669. + // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39670. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);
  39671. + }
  39672. + else
  39673. + {
  39674. +
  39675. + // available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39676. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);
  39677. + }
  39678. + }
  39679. + }
  39680. + else
  39681. + {
  39682. + if ( pwdinfo->wfd_tdls_enable )
  39683. + {
  39684. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD |WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);
  39685. + }
  39686. + else
  39687. + {
  39688. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);
  39689. + }
  39690. +
  39691. + }
  39692. +
  39693. + wfdielen += 2;
  39694. +
  39695. + // Value2:
  39696. + // Session Management Control Port
  39697. + // Default TCP port for RTSP messages is 554
  39698. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  39699. + wfdielen += 2;
  39700. +
  39701. + // Value3:
  39702. + // WFD Device Maximum Throughput
  39703. + // 300Mbps is the maximum throughput
  39704. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  39705. + wfdielen += 2;
  39706. +
  39707. + // Associated BSSID ATTR
  39708. + // Type:
  39709. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  39710. +
  39711. + // Length:
  39712. + // Note: In the WFD specification, the size of length field is 2.
  39713. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39714. + wfdielen += 2;
  39715. +
  39716. + // Value:
  39717. + // Associated BSSID
  39718. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  39719. + {
  39720. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  39721. + }
  39722. + else
  39723. + {
  39724. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  39725. + }
  39726. +
  39727. + wfdielen += ETH_ALEN;
  39728. +
  39729. + // Coupled Sink Information ATTR
  39730. + // Type:
  39731. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  39732. +
  39733. + // Length:
  39734. + // Note: In the WFD specification, the size of length field is 2.
  39735. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  39736. + wfdielen += 2;
  39737. +
  39738. + // Value:
  39739. + // Coupled Sink Status bitmap
  39740. + // Not coupled/available for Coupling
  39741. + wfdie[ wfdielen++ ] = 0;
  39742. + // MAC Addr.
  39743. + wfdie[ wfdielen++ ] = 0;
  39744. + wfdie[ wfdielen++ ] = 0;
  39745. + wfdie[ wfdielen++ ] = 0;
  39746. + wfdie[ wfdielen++ ] = 0;
  39747. + wfdie[ wfdielen++ ] = 0;
  39748. + wfdie[ wfdielen++ ] = 0;
  39749. +
  39750. + if ( P2P_ROLE_GO == pwdinfo->role )
  39751. + {
  39752. + // WFD Session Information ATTR
  39753. + // Type:
  39754. + wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
  39755. +
  39756. + // Length:
  39757. + // Note: In the WFD specification, the size of length field is 2.
  39758. + RTW_PUT_BE16(wfdie + wfdielen, 0x0000);
  39759. + wfdielen += 2;
  39760. +
  39761. + // Todo: to add the list of WFD device info descriptor in WFD group.
  39762. +
  39763. + }
  39764. +#ifdef CONFIG_CONCURRENT_MODE
  39765. +#ifdef CONFIG_TDLS
  39766. + if ( ( tunneled == 0 ) && ( padapter->pbuddy_adapter->wdinfo.wfd_tdls_enable == 1 ) )
  39767. + {
  39768. + // Alternative MAC Address ATTR
  39769. + // Type:
  39770. + wfdie[ wfdielen++ ] = WFD_ATTR_ALTER_MAC;
  39771. +
  39772. + // Length:
  39773. + // Note: In the WFD specification, the size of length field is 2.
  39774. + RTW_PUT_BE16(wfdie + wfdielen, ETH_ALEN );
  39775. + wfdielen += 2;
  39776. +
  39777. + // Value:
  39778. + // Alternative MAC Address
  39779. + _rtw_memcpy( wfdie + wfdielen, &padapter->pbuddy_adapter->eeprompriv.mac_addr[ 0 ], ETH_ALEN );
  39780. + // This mac address is used to make the WFD session when TDLS is enable.
  39781. +
  39782. + wfdielen += ETH_ALEN;
  39783. + }
  39784. +#endif // CONFIG_TDLS
  39785. +#endif // CONFIG_CONCURRENT_MODE
  39786. +
  39787. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  39788. +
  39789. + return len;
  39790. +
  39791. +}
  39792. +
  39793. +u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39794. +{
  39795. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  39796. + u32 len=0, wfdielen = 0;
  39797. + _adapter *padapter = NULL;
  39798. + struct mlme_priv *pmlmepriv = NULL;
  39799. + struct wifi_display_info *pwfd_info = NULL;
  39800. +
  39801. + // WFD OUI
  39802. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  39803. + {
  39804. + return 0;
  39805. + }
  39806. +
  39807. + padapter = pwdinfo->padapter;
  39808. + pmlmepriv = &padapter->mlmepriv;
  39809. + pwfd_info = padapter->wdinfo.wfd_info;
  39810. +
  39811. + wfdielen = 0;
  39812. + wfdie[ wfdielen++ ] = 0x50;
  39813. + wfdie[ wfdielen++ ] = 0x6F;
  39814. + wfdie[ wfdielen++ ] = 0x9A;
  39815. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  39816. +
  39817. + // Commented by Albert 20110812
  39818. + // According to the WFD Specification, the probe request frame should contain 4 WFD attributes
  39819. + // 1. WFD Device Information
  39820. + // 2. Associated BSSID
  39821. + // 3. Coupled Sink Information
  39822. +
  39823. +
  39824. + // WFD Device Information ATTR
  39825. + // Type:
  39826. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  39827. +
  39828. + // Length:
  39829. + // Note: In the WFD specification, the size of length field is 2.
  39830. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39831. + wfdielen += 2;
  39832. +
  39833. + // Value1:
  39834. + // WFD device information
  39835. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39836. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  39837. + wfdielen += 2;
  39838. +
  39839. + // Value2:
  39840. + // Session Management Control Port
  39841. + // Default TCP port for RTSP messages is 554
  39842. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  39843. + wfdielen += 2;
  39844. +
  39845. + // Value3:
  39846. + // WFD Device Maximum Throughput
  39847. + // 300Mbps is the maximum throughput
  39848. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  39849. + wfdielen += 2;
  39850. +
  39851. + // Associated BSSID ATTR
  39852. + // Type:
  39853. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  39854. +
  39855. + // Length:
  39856. + // Note: In the WFD specification, the size of length field is 2.
  39857. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39858. + wfdielen += 2;
  39859. +
  39860. + // Value:
  39861. + // Associated BSSID
  39862. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  39863. + {
  39864. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  39865. + }
  39866. + else
  39867. + {
  39868. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  39869. + }
  39870. +
  39871. + wfdielen += ETH_ALEN;
  39872. +
  39873. + // Coupled Sink Information ATTR
  39874. + // Type:
  39875. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  39876. +
  39877. + // Length:
  39878. + // Note: In the WFD specification, the size of length field is 2.
  39879. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  39880. + wfdielen += 2;
  39881. +
  39882. + // Value:
  39883. + // Coupled Sink Status bitmap
  39884. + // Not coupled/available for Coupling
  39885. + wfdie[ wfdielen++ ] = 0;
  39886. + // MAC Addr.
  39887. + wfdie[ wfdielen++ ] = 0;
  39888. + wfdie[ wfdielen++ ] = 0;
  39889. + wfdie[ wfdielen++ ] = 0;
  39890. + wfdie[ wfdielen++ ] = 0;
  39891. + wfdie[ wfdielen++ ] = 0;
  39892. + wfdie[ wfdielen++ ] = 0;
  39893. +
  39894. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  39895. +
  39896. + return len;
  39897. +
  39898. +}
  39899. +
  39900. +u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39901. +{
  39902. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  39903. + u32 len=0, wfdielen = 0;
  39904. + _adapter *padapter = pwdinfo->padapter;
  39905. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  39906. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  39907. +
  39908. + // WFD OUI
  39909. + wfdielen = 0;
  39910. + wfdie[ wfdielen++ ] = 0x50;
  39911. + wfdie[ wfdielen++ ] = 0x6F;
  39912. + wfdie[ wfdielen++ ] = 0x9A;
  39913. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  39914. +
  39915. + // Commented by Albert 20110812
  39916. + // According to the WFD Specification, the probe request frame should contain 4 WFD attributes
  39917. + // 1. WFD Device Information
  39918. + // 2. Associated BSSID
  39919. + // 3. Coupled Sink Information
  39920. +
  39921. +
  39922. + // WFD Device Information ATTR
  39923. + // Type:
  39924. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  39925. +
  39926. + // Length:
  39927. + // Note: In the WFD specification, the size of length field is 2.
  39928. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39929. + wfdielen += 2;
  39930. +
  39931. + // Value1:
  39932. + // WFD device information
  39933. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  39934. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  39935. + wfdielen += 2;
  39936. +
  39937. + // Value2:
  39938. + // Session Management Control Port
  39939. + // Default TCP port for RTSP messages is 554
  39940. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  39941. + wfdielen += 2;
  39942. +
  39943. + // Value3:
  39944. + // WFD Device Maximum Throughput
  39945. + // 300Mbps is the maximum throughput
  39946. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  39947. + wfdielen += 2;
  39948. +
  39949. + // Associated BSSID ATTR
  39950. + // Type:
  39951. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  39952. +
  39953. + // Length:
  39954. + // Note: In the WFD specification, the size of length field is 2.
  39955. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  39956. + wfdielen += 2;
  39957. +
  39958. + // Value:
  39959. + // Associated BSSID
  39960. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  39961. + {
  39962. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  39963. + }
  39964. + else
  39965. + {
  39966. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  39967. + }
  39968. +
  39969. + wfdielen += ETH_ALEN;
  39970. +
  39971. + // Coupled Sink Information ATTR
  39972. + // Type:
  39973. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  39974. +
  39975. + // Length:
  39976. + // Note: In the WFD specification, the size of length field is 2.
  39977. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  39978. + wfdielen += 2;
  39979. +
  39980. + // Value:
  39981. + // Coupled Sink Status bitmap
  39982. + // Not coupled/available for Coupling
  39983. + wfdie[ wfdielen++ ] = 0;
  39984. + // MAC Addr.
  39985. + wfdie[ wfdielen++ ] = 0;
  39986. + wfdie[ wfdielen++ ] = 0;
  39987. + wfdie[ wfdielen++ ] = 0;
  39988. + wfdie[ wfdielen++ ] = 0;
  39989. + wfdie[ wfdielen++ ] = 0;
  39990. + wfdie[ wfdielen++ ] = 0;
  39991. +
  39992. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  39993. +
  39994. + return len;
  39995. +
  39996. +}
  39997. +
  39998. +u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  39999. +{
  40000. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40001. + u32 len=0, wfdielen = 0;
  40002. + _adapter *padapter = pwdinfo->padapter;
  40003. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40004. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40005. +
  40006. + // WFD OUI
  40007. + wfdielen = 0;
  40008. + wfdie[ wfdielen++ ] = 0x50;
  40009. + wfdie[ wfdielen++ ] = 0x6F;
  40010. + wfdie[ wfdielen++ ] = 0x9A;
  40011. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40012. +
  40013. + // Commented by Albert 20110825
  40014. + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes
  40015. + // 1. WFD Device Information
  40016. + // 2. Associated BSSID ( Optional )
  40017. + // 3. Local IP Adress ( Optional )
  40018. +
  40019. +
  40020. + // WFD Device Information ATTR
  40021. + // Type:
  40022. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40023. +
  40024. + // Length:
  40025. + // Note: In the WFD specification, the size of length field is 2.
  40026. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40027. + wfdielen += 2;
  40028. +
  40029. + // Value1:
  40030. + // WFD device information
  40031. + // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
  40032. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
  40033. + wfdielen += 2;
  40034. +
  40035. + // Value2:
  40036. + // Session Management Control Port
  40037. + // Default TCP port for RTSP messages is 554
  40038. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40039. + wfdielen += 2;
  40040. +
  40041. + // Value3:
  40042. + // WFD Device Maximum Throughput
  40043. + // 300Mbps is the maximum throughput
  40044. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40045. + wfdielen += 2;
  40046. +
  40047. + // Associated BSSID ATTR
  40048. + // Type:
  40049. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40050. +
  40051. + // Length:
  40052. + // Note: In the WFD specification, the size of length field is 2.
  40053. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40054. + wfdielen += 2;
  40055. +
  40056. + // Value:
  40057. + // Associated BSSID
  40058. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40059. + {
  40060. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40061. + }
  40062. + else
  40063. + {
  40064. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40065. + }
  40066. +
  40067. + wfdielen += ETH_ALEN;
  40068. +
  40069. + // Coupled Sink Information ATTR
  40070. + // Type:
  40071. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40072. +
  40073. + // Length:
  40074. + // Note: In the WFD specification, the size of length field is 2.
  40075. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40076. + wfdielen += 2;
  40077. +
  40078. + // Value:
  40079. + // Coupled Sink Status bitmap
  40080. + // Not coupled/available for Coupling
  40081. + wfdie[ wfdielen++ ] = 0;
  40082. + // MAC Addr.
  40083. + wfdie[ wfdielen++ ] = 0;
  40084. + wfdie[ wfdielen++ ] = 0;
  40085. + wfdie[ wfdielen++ ] = 0;
  40086. + wfdie[ wfdielen++ ] = 0;
  40087. + wfdie[ wfdielen++ ] = 0;
  40088. + wfdie[ wfdielen++ ] = 0;
  40089. +
  40090. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40091. +
  40092. + return len;
  40093. +
  40094. +}
  40095. +
  40096. +u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40097. +{
  40098. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40099. + u32 len=0, wfdielen = 0;
  40100. + _adapter *padapter = pwdinfo->padapter;
  40101. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40102. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40103. +
  40104. + // WFD OUI
  40105. + wfdielen = 0;
  40106. + wfdie[ wfdielen++ ] = 0x50;
  40107. + wfdie[ wfdielen++ ] = 0x6F;
  40108. + wfdie[ wfdielen++ ] = 0x9A;
  40109. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40110. +
  40111. + // Commented by Albert 20110825
  40112. + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes
  40113. + // 1. WFD Device Information
  40114. + // 2. Associated BSSID ( Optional )
  40115. + // 3. Local IP Adress ( Optional )
  40116. +
  40117. +
  40118. + // WFD Device Information ATTR
  40119. + // Type:
  40120. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40121. +
  40122. + // Length:
  40123. + // Note: In the WFD specification, the size of length field is 2.
  40124. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40125. + wfdielen += 2;
  40126. +
  40127. + // Value1:
  40128. + // WFD device information
  40129. + // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
  40130. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
  40131. + wfdielen += 2;
  40132. +
  40133. + // Value2:
  40134. + // Session Management Control Port
  40135. + // Default TCP port for RTSP messages is 554
  40136. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40137. + wfdielen += 2;
  40138. +
  40139. + // Value3:
  40140. + // WFD Device Maximum Throughput
  40141. + // 300Mbps is the maximum throughput
  40142. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40143. + wfdielen += 2;
  40144. +
  40145. + // Associated BSSID ATTR
  40146. + // Type:
  40147. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40148. +
  40149. + // Length:
  40150. + // Note: In the WFD specification, the size of length field is 2.
  40151. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40152. + wfdielen += 2;
  40153. +
  40154. + // Value:
  40155. + // Associated BSSID
  40156. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40157. + {
  40158. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40159. + }
  40160. + else
  40161. + {
  40162. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40163. + }
  40164. +
  40165. + wfdielen += ETH_ALEN;
  40166. +
  40167. + // Coupled Sink Information ATTR
  40168. + // Type:
  40169. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40170. +
  40171. + // Length:
  40172. + // Note: In the WFD specification, the size of length field is 2.
  40173. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40174. + wfdielen += 2;
  40175. +
  40176. + // Value:
  40177. + // Coupled Sink Status bitmap
  40178. + // Not coupled/available for Coupling
  40179. + wfdie[ wfdielen++ ] = 0;
  40180. + // MAC Addr.
  40181. + wfdie[ wfdielen++ ] = 0;
  40182. + wfdie[ wfdielen++ ] = 0;
  40183. + wfdie[ wfdielen++ ] = 0;
  40184. + wfdie[ wfdielen++ ] = 0;
  40185. + wfdie[ wfdielen++ ] = 0;
  40186. + wfdie[ wfdielen++ ] = 0;
  40187. +
  40188. +
  40189. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40190. +
  40191. + return len;
  40192. +
  40193. +}
  40194. +
  40195. +u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40196. +{
  40197. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40198. + u32 len=0, wfdielen = 0;
  40199. + _adapter *padapter = pwdinfo->padapter;
  40200. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40201. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40202. +
  40203. + // WFD OUI
  40204. + wfdielen = 0;
  40205. + wfdie[ wfdielen++ ] = 0x50;
  40206. + wfdie[ wfdielen++ ] = 0x6F;
  40207. + wfdie[ wfdielen++ ] = 0x9A;
  40208. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40209. +
  40210. + // Commented by Albert 20110825
  40211. + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes
  40212. + // 1. WFD Device Information
  40213. + // 2. Associated BSSID ( Optional )
  40214. + // 3. Local IP Adress ( Optional )
  40215. +
  40216. +
  40217. + // WFD Device Information ATTR
  40218. + // Type:
  40219. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40220. +
  40221. + // Length:
  40222. + // Note: In the WFD specification, the size of length field is 2.
  40223. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40224. + wfdielen += 2;
  40225. +
  40226. + // Value1:
  40227. + // WFD device information
  40228. + // WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
  40229. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
  40230. + wfdielen += 2;
  40231. +
  40232. + // Value2:
  40233. + // Session Management Control Port
  40234. + // Default TCP port for RTSP messages is 554
  40235. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40236. + wfdielen += 2;
  40237. +
  40238. + // Value3:
  40239. + // WFD Device Maximum Throughput
  40240. + // 300Mbps is the maximum throughput
  40241. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40242. + wfdielen += 2;
  40243. +
  40244. + // Associated BSSID ATTR
  40245. + // Type:
  40246. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40247. +
  40248. + // Length:
  40249. + // Note: In the WFD specification, the size of length field is 2.
  40250. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40251. + wfdielen += 2;
  40252. +
  40253. + // Value:
  40254. + // Associated BSSID
  40255. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40256. + {
  40257. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40258. + }
  40259. + else
  40260. + {
  40261. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40262. + }
  40263. +
  40264. + wfdielen += ETH_ALEN;
  40265. +
  40266. + // Coupled Sink Information ATTR
  40267. + // Type:
  40268. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40269. +
  40270. + // Length:
  40271. + // Note: In the WFD specification, the size of length field is 2.
  40272. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40273. + wfdielen += 2;
  40274. +
  40275. + // Value:
  40276. + // Coupled Sink Status bitmap
  40277. + // Not coupled/available for Coupling
  40278. + wfdie[ wfdielen++ ] = 0;
  40279. + // MAC Addr.
  40280. + wfdie[ wfdielen++ ] = 0;
  40281. + wfdie[ wfdielen++ ] = 0;
  40282. + wfdie[ wfdielen++ ] = 0;
  40283. + wfdie[ wfdielen++ ] = 0;
  40284. + wfdie[ wfdielen++ ] = 0;
  40285. + wfdie[ wfdielen++ ] = 0;
  40286. +
  40287. +
  40288. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40289. +
  40290. + return len;
  40291. +
  40292. +}
  40293. +
  40294. +u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40295. +{
  40296. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40297. + u32 len=0, wfdielen = 0;
  40298. + _adapter *padapter = pwdinfo->padapter;
  40299. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40300. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40301. +
  40302. + // WFD OUI
  40303. + wfdielen = 0;
  40304. + wfdie[ wfdielen++ ] = 0x50;
  40305. + wfdie[ wfdielen++ ] = 0x6F;
  40306. + wfdie[ wfdielen++ ] = 0x9A;
  40307. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40308. +
  40309. + // Commented by Albert 20110825
  40310. + // According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes
  40311. + // 1. WFD Device Information
  40312. + // 2. Associated BSSID ( Optional )
  40313. + // 3. Local IP Adress ( Optional )
  40314. +
  40315. +
  40316. + // WFD Device Information ATTR
  40317. + // Type:
  40318. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40319. +
  40320. + // Length:
  40321. + // Note: In the WFD specification, the size of length field is 2.
  40322. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40323. + wfdielen += 2;
  40324. +
  40325. + // Value1:
  40326. + // WFD device information
  40327. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  40328. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  40329. + wfdielen += 2;
  40330. +
  40331. + // Value2:
  40332. + // Session Management Control Port
  40333. + // Default TCP port for RTSP messages is 554
  40334. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40335. + wfdielen += 2;
  40336. +
  40337. + // Value3:
  40338. + // WFD Device Maximum Throughput
  40339. + // 300Mbps is the maximum throughput
  40340. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40341. + wfdielen += 2;
  40342. +
  40343. + // Associated BSSID ATTR
  40344. + // Type:
  40345. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40346. +
  40347. + // Length:
  40348. + // Note: In the WFD specification, the size of length field is 2.
  40349. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40350. + wfdielen += 2;
  40351. +
  40352. + // Value:
  40353. + // Associated BSSID
  40354. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40355. + {
  40356. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40357. + }
  40358. + else
  40359. + {
  40360. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40361. + }
  40362. +
  40363. + wfdielen += ETH_ALEN;
  40364. +
  40365. + // Coupled Sink Information ATTR
  40366. + // Type:
  40367. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40368. +
  40369. + // Length:
  40370. + // Note: In the WFD specification, the size of length field is 2.
  40371. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40372. + wfdielen += 2;
  40373. +
  40374. + // Value:
  40375. + // Coupled Sink Status bitmap
  40376. + // Not coupled/available for Coupling
  40377. + wfdie[ wfdielen++ ] = 0;
  40378. + // MAC Addr.
  40379. + wfdie[ wfdielen++ ] = 0;
  40380. + wfdie[ wfdielen++ ] = 0;
  40381. + wfdie[ wfdielen++ ] = 0;
  40382. + wfdie[ wfdielen++ ] = 0;
  40383. + wfdie[ wfdielen++ ] = 0;
  40384. + wfdie[ wfdielen++ ] = 0;
  40385. +
  40386. + if ( P2P_ROLE_GO == pwdinfo->role )
  40387. + {
  40388. + // WFD Session Information ATTR
  40389. + // Type:
  40390. + wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
  40391. +
  40392. + // Length:
  40393. + // Note: In the WFD specification, the size of length field is 2.
  40394. + RTW_PUT_BE16(wfdie + wfdielen, 0x0000);
  40395. + wfdielen += 2;
  40396. +
  40397. + // Todo: to add the list of WFD device info descriptor in WFD group.
  40398. +
  40399. + }
  40400. +
  40401. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40402. +
  40403. + return len;
  40404. +
  40405. +}
  40406. +
  40407. +u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40408. +{
  40409. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40410. + u32 len=0, wfdielen = 0;
  40411. + _adapter *padapter = pwdinfo->padapter;
  40412. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40413. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40414. +
  40415. + // WFD OUI
  40416. + wfdielen = 0;
  40417. + wfdie[ wfdielen++ ] = 0x50;
  40418. + wfdie[ wfdielen++ ] = 0x6F;
  40419. + wfdie[ wfdielen++ ] = 0x9A;
  40420. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40421. +
  40422. + // Commented by Albert 20110825
  40423. + // According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes
  40424. + // 1. WFD Device Information
  40425. + // 2. Associated BSSID ( Optional )
  40426. + // 3. Local IP Adress ( Optional )
  40427. +
  40428. +
  40429. + // WFD Device Information ATTR
  40430. + // Type:
  40431. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40432. +
  40433. + // Length:
  40434. + // Note: In the WFD specification, the size of length field is 2.
  40435. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40436. + wfdielen += 2;
  40437. +
  40438. + // Value1:
  40439. + // WFD device information
  40440. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  40441. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  40442. + wfdielen += 2;
  40443. +
  40444. + // Value2:
  40445. + // Session Management Control Port
  40446. + // Default TCP port for RTSP messages is 554
  40447. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40448. + wfdielen += 2;
  40449. +
  40450. + // Value3:
  40451. + // WFD Device Maximum Throughput
  40452. + // 300Mbps is the maximum throughput
  40453. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40454. + wfdielen += 2;
  40455. +
  40456. + // Associated BSSID ATTR
  40457. + // Type:
  40458. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40459. +
  40460. + // Length:
  40461. + // Note: In the WFD specification, the size of length field is 2.
  40462. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40463. + wfdielen += 2;
  40464. +
  40465. + // Value:
  40466. + // Associated BSSID
  40467. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40468. + {
  40469. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40470. + }
  40471. + else
  40472. + {
  40473. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40474. + }
  40475. +
  40476. + wfdielen += ETH_ALEN;
  40477. +
  40478. + // Coupled Sink Information ATTR
  40479. + // Type:
  40480. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40481. +
  40482. + // Length:
  40483. + // Note: In the WFD specification, the size of length field is 2.
  40484. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40485. + wfdielen += 2;
  40486. +
  40487. + // Value:
  40488. + // Coupled Sink Status bitmap
  40489. + // Not coupled/available for Coupling
  40490. + wfdie[ wfdielen++ ] = 0;
  40491. + // MAC Addr.
  40492. + wfdie[ wfdielen++ ] = 0;
  40493. + wfdie[ wfdielen++ ] = 0;
  40494. + wfdie[ wfdielen++ ] = 0;
  40495. + wfdie[ wfdielen++ ] = 0;
  40496. + wfdie[ wfdielen++ ] = 0;
  40497. + wfdie[ wfdielen++ ] = 0;
  40498. +
  40499. + if ( P2P_ROLE_GO == pwdinfo->role )
  40500. + {
  40501. + // WFD Session Information ATTR
  40502. + // Type:
  40503. + wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
  40504. +
  40505. + // Length:
  40506. + // Note: In the WFD specification, the size of length field is 2.
  40507. + RTW_PUT_BE16(wfdie + wfdielen, 0x0000);
  40508. + wfdielen += 2;
  40509. +
  40510. + // Todo: to add the list of WFD device info descriptor in WFD group.
  40511. +
  40512. + }
  40513. +
  40514. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40515. +
  40516. + return len;
  40517. +
  40518. +}
  40519. +
  40520. +u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40521. +{
  40522. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40523. + u32 len=0, wfdielen = 0;
  40524. + _adapter *padapter = pwdinfo->padapter;
  40525. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40526. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40527. +
  40528. + // WFD OUI
  40529. + wfdielen = 0;
  40530. + wfdie[ wfdielen++ ] = 0x50;
  40531. + wfdie[ wfdielen++ ] = 0x6F;
  40532. + wfdie[ wfdielen++ ] = 0x9A;
  40533. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40534. +
  40535. + // Commented by Albert 20110825
  40536. + // According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes
  40537. + // 1. WFD Device Information
  40538. + // 2. Associated BSSID ( Optional )
  40539. + // 3. Local IP Adress ( Optional )
  40540. +
  40541. +
  40542. + // WFD Device Information ATTR
  40543. + // Type:
  40544. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40545. +
  40546. + // Length:
  40547. + // Note: In the WFD specification, the size of length field is 2.
  40548. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40549. + wfdielen += 2;
  40550. +
  40551. + // Value1:
  40552. + // WFD device information
  40553. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  40554. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  40555. + wfdielen += 2;
  40556. +
  40557. + // Value2:
  40558. + // Session Management Control Port
  40559. + // Default TCP port for RTSP messages is 554
  40560. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40561. + wfdielen += 2;
  40562. +
  40563. + // Value3:
  40564. + // WFD Device Maximum Throughput
  40565. + // 300Mbps is the maximum throughput
  40566. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40567. + wfdielen += 2;
  40568. +
  40569. + // Associated BSSID ATTR
  40570. + // Type:
  40571. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40572. +
  40573. + // Length:
  40574. + // Note: In the WFD specification, the size of length field is 2.
  40575. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40576. + wfdielen += 2;
  40577. +
  40578. + // Value:
  40579. + // Associated BSSID
  40580. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40581. + {
  40582. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40583. + }
  40584. + else
  40585. + {
  40586. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40587. + }
  40588. +
  40589. + wfdielen += ETH_ALEN;
  40590. +
  40591. + // Coupled Sink Information ATTR
  40592. + // Type:
  40593. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40594. +
  40595. + // Length:
  40596. + // Note: In the WFD specification, the size of length field is 2.
  40597. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40598. + wfdielen += 2;
  40599. +
  40600. + // Value:
  40601. + // Coupled Sink Status bitmap
  40602. + // Not coupled/available for Coupling
  40603. + wfdie[ wfdielen++ ] = 0;
  40604. + // MAC Addr.
  40605. + wfdie[ wfdielen++ ] = 0;
  40606. + wfdie[ wfdielen++ ] = 0;
  40607. + wfdie[ wfdielen++ ] = 0;
  40608. + wfdie[ wfdielen++ ] = 0;
  40609. + wfdie[ wfdielen++ ] = 0;
  40610. + wfdie[ wfdielen++ ] = 0;
  40611. +
  40612. +
  40613. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40614. +
  40615. + return len;
  40616. +
  40617. +}
  40618. +
  40619. +u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40620. +{
  40621. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  40622. + u32 len=0, wfdielen = 0;
  40623. + _adapter *padapter = pwdinfo->padapter;
  40624. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  40625. + struct wifi_display_info* pwfd_info = padapter->wdinfo.wfd_info;
  40626. +
  40627. + // WFD OUI
  40628. + wfdielen = 0;
  40629. + wfdie[ wfdielen++ ] = 0x50;
  40630. + wfdie[ wfdielen++ ] = 0x6F;
  40631. + wfdie[ wfdielen++ ] = 0x9A;
  40632. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  40633. +
  40634. + // Commented by Albert 20110825
  40635. + // According to the WFD Specification, the provision discovery response frame should contain 3 WFD attributes
  40636. + // 1. WFD Device Information
  40637. + // 2. Associated BSSID ( Optional )
  40638. + // 3. Local IP Adress ( Optional )
  40639. +
  40640. +
  40641. + // WFD Device Information ATTR
  40642. + // Type:
  40643. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  40644. +
  40645. + // Length:
  40646. + // Note: In the WFD specification, the size of length field is 2.
  40647. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40648. + wfdielen += 2;
  40649. +
  40650. + // Value1:
  40651. + // WFD device information
  40652. + // WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
  40653. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
  40654. + wfdielen += 2;
  40655. +
  40656. + // Value2:
  40657. + // Session Management Control Port
  40658. + // Default TCP port for RTSP messages is 554
  40659. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  40660. + wfdielen += 2;
  40661. +
  40662. + // Value3:
  40663. + // WFD Device Maximum Throughput
  40664. + // 300Mbps is the maximum throughput
  40665. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  40666. + wfdielen += 2;
  40667. +
  40668. + // Associated BSSID ATTR
  40669. + // Type:
  40670. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  40671. +
  40672. + // Length:
  40673. + // Note: In the WFD specification, the size of length field is 2.
  40674. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  40675. + wfdielen += 2;
  40676. +
  40677. + // Value:
  40678. + // Associated BSSID
  40679. + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )
  40680. + {
  40681. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  40682. + }
  40683. + else
  40684. + {
  40685. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  40686. + }
  40687. +
  40688. + wfdielen += ETH_ALEN;
  40689. +
  40690. + // Coupled Sink Information ATTR
  40691. + // Type:
  40692. + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
  40693. +
  40694. + // Length:
  40695. + // Note: In the WFD specification, the size of length field is 2.
  40696. + RTW_PUT_BE16(wfdie + wfdielen, 0x0007);
  40697. + wfdielen += 2;
  40698. +
  40699. + // Value:
  40700. + // Coupled Sink Status bitmap
  40701. + // Not coupled/available for Coupling
  40702. + wfdie[ wfdielen++ ] = 0;
  40703. + // MAC Addr.
  40704. + wfdie[ wfdielen++ ] = 0;
  40705. + wfdie[ wfdielen++ ] = 0;
  40706. + wfdie[ wfdielen++ ] = 0;
  40707. + wfdie[ wfdielen++ ] = 0;
  40708. + wfdie[ wfdielen++ ] = 0;
  40709. + wfdie[ wfdielen++ ] = 0;
  40710. +
  40711. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
  40712. +
  40713. + return len;
  40714. +
  40715. +}
  40716. +
  40717. +#endif //CONFIG_WFD
  40718. +
  40719. +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  40720. +{
  40721. + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
  40722. + u32 len=0, p2pielen = 0;
  40723. +#ifdef CONFIG_INTEL_WIDI
  40724. + struct mlme_priv *pmlmepriv = &(pwdinfo->padapter->mlmepriv);
  40725. + u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };
  40726. + u8 widi_version = 0, i = 0;
  40727. +
  40728. + if( _rtw_memcmp( pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE )
  40729. + {
  40730. + widi_version = 35;
  40731. + }
  40732. + else if( pmlmepriv->num_p2p_sdt != 0 )
  40733. + {
  40734. + widi_version = 40;
  40735. + }
  40736. +#endif //CONFIG_INTEL_WIDI
  40737. +
  40738. + // P2P OUI
  40739. + p2pielen = 0;
  40740. + p2pie[ p2pielen++ ] = 0x50;
  40741. + p2pie[ p2pielen++ ] = 0x6F;
  40742. + p2pie[ p2pielen++ ] = 0x9A;
  40743. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  40744. +
  40745. + // Commented by Albert 20100907
  40746. + // According to the P2P Specification, the probe response frame should contain 5 P2P attributes
  40747. + // 1. P2P Capability
  40748. + // 2. Extended Listen Timing
  40749. + // 3. Notice of Absence ( NOA ) ( Only GO needs this )
  40750. + // 4. Device Info
  40751. + // 5. Group Info ( Only GO need this )
  40752. +
  40753. + // P2P Capability ATTR
  40754. + // Type:
  40755. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  40756. +
  40757. + // Length:
  40758. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  40759. + RTW_PUT_LE16(p2pie + p2pielen, 0x0002);
  40760. + p2pielen += 2;
  40761. +
  40762. + // Value:
  40763. + // Device Capability Bitmap, 1 byte
  40764. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  40765. +
  40766. + // Group Capability Bitmap, 1 byte
  40767. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  40768. + {
  40769. + p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS);
  40770. +
  40771. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
  40772. + p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION;
  40773. +
  40774. + p2pielen++;
  40775. + }
  40776. + else if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) )
  40777. + {
  40778. + // Group Capability Bitmap, 1 byte
  40779. + if ( pwdinfo->persistent_supported )
  40780. + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
  40781. + else
  40782. + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
  40783. +
  40784. + }
  40785. +
  40786. + // Extended Listen Timing ATTR
  40787. + // Type:
  40788. + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
  40789. +
  40790. + // Length:
  40791. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );
  40792. + RTW_PUT_LE16(p2pie + p2pielen, 0x0004);
  40793. + p2pielen += 2;
  40794. +
  40795. + // Value:
  40796. + // Availability Period
  40797. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  40798. + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF);
  40799. + p2pielen += 2;
  40800. +
  40801. + // Availability Interval
  40802. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );
  40803. + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF);
  40804. + p2pielen += 2;
  40805. +
  40806. +
  40807. + // Notice of Absence ATTR
  40808. + // Type:
  40809. + // Length:
  40810. + // Value:
  40811. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  40812. + {
  40813. + //go_add_noa_attr(pwdinfo);
  40814. + }
  40815. +
  40816. + // Device Info ATTR
  40817. + // Type:
  40818. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  40819. +
  40820. + // Length:
  40821. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  40822. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  40823. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  40824. +#ifdef CONFIG_INTEL_WIDI
  40825. + if( widi_version == 35 )
  40826. + {
  40827. + RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 + pwdinfo->device_name_len);
  40828. + }
  40829. + else if( widi_version == 40 )
  40830. + {
  40831. + RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 * pmlmepriv->num_p2p_sdt + pwdinfo->device_name_len);
  40832. + }
  40833. + else
  40834. +#endif //CONFIG_INTEL_WIDI
  40835. + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len);
  40836. + p2pielen += 2;
  40837. +
  40838. + // Value:
  40839. + // P2P Device Address
  40840. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );
  40841. + p2pielen += ETH_ALEN;
  40842. +
  40843. + // Config Method
  40844. + // This field should be big endian. Noted by P2P specification.
  40845. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
  40846. + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm);
  40847. + p2pielen += 2;
  40848. +
  40849. +#ifdef CONFIG_INTEL_WIDI
  40850. + if( widi_version == 40 )
  40851. + {
  40852. + // Primary Device Type
  40853. + // Category ID
  40854. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  40855. + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_cid );
  40856. + p2pielen += 2;
  40857. +
  40858. + // OUI
  40859. + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  40860. + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI);
  40861. + p2pielen += 4;
  40862. +
  40863. + // Sub Category ID
  40864. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  40865. + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_scid);
  40866. + p2pielen += 2;
  40867. + }
  40868. + else
  40869. +#endif //CONFIG_INTEL_WIDI
  40870. + {
  40871. + // Primary Device Type
  40872. + // Category ID
  40873. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  40874. + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA);
  40875. + p2pielen += 2;
  40876. +
  40877. + // OUI
  40878. + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  40879. + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI);
  40880. + p2pielen += 4;
  40881. +
  40882. + // Sub Category ID
  40883. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  40884. + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER);
  40885. + p2pielen += 2;
  40886. + }
  40887. +
  40888. + // Number of Secondary Device Types
  40889. +#ifdef CONFIG_INTEL_WIDI
  40890. + if( widi_version == 35 )
  40891. + {
  40892. + p2pie[ p2pielen++ ] = 0x01;
  40893. +
  40894. + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_DISPLAYS);
  40895. + p2pielen += 2;
  40896. +
  40897. + RTW_PUT_BE32(p2pie + p2pielen, INTEL_DEV_TYPE_OUI);
  40898. + p2pielen += 4;
  40899. +
  40900. + RTW_PUT_BE16(p2pie + p2pielen, P2P_SCID_WIDI_CONSUMER_SINK);
  40901. + p2pielen += 2;
  40902. + }
  40903. + else if( widi_version == 40 )
  40904. + {
  40905. + p2pie[ p2pielen++ ] = pmlmepriv->num_p2p_sdt;
  40906. + for( ; i < pmlmepriv->num_p2p_sdt; i++ )
  40907. + {
  40908. + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_cid[i]);
  40909. + p2pielen += 2;
  40910. +
  40911. + RTW_PUT_BE32(p2pie + p2pielen, INTEL_DEV_TYPE_OUI);
  40912. + p2pielen += 4;
  40913. +
  40914. + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_scid[i]);
  40915. + p2pielen += 2;
  40916. + }
  40917. + }
  40918. + else
  40919. +#endif //CONFIG_INTEL_WIDI
  40920. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  40921. +
  40922. + // Device Name
  40923. + // Type:
  40924. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  40925. + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME);
  40926. + p2pielen += 2;
  40927. +
  40928. + // Length:
  40929. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  40930. + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len);
  40931. + p2pielen += 2;
  40932. +
  40933. + // Value:
  40934. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );
  40935. + p2pielen += pwdinfo->device_name_len;
  40936. +
  40937. + // Group Info ATTR
  40938. + // Type:
  40939. + // Length:
  40940. + // Value:
  40941. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  40942. + {
  40943. + p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen);
  40944. + }
  40945. +
  40946. +
  40947. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
  40948. +
  40949. +
  40950. + return len;
  40951. +
  40952. +}
  40953. +
  40954. +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr )
  40955. +{
  40956. + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
  40957. + u32 len=0, p2pielen = 0;
  40958. +
  40959. + // P2P OUI
  40960. + p2pielen = 0;
  40961. + p2pie[ p2pielen++ ] = 0x50;
  40962. + p2pie[ p2pielen++ ] = 0x6F;
  40963. + p2pie[ p2pielen++ ] = 0x9A;
  40964. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  40965. +
  40966. + // Commented by Albert 20110301
  40967. + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes
  40968. + // 1. P2P Capability
  40969. + // 2. Device Info
  40970. + // 3. Group ID ( When joining an operating P2P Group )
  40971. +
  40972. + // P2P Capability ATTR
  40973. + // Type:
  40974. + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  40975. +
  40976. + // Length:
  40977. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  40978. + RTW_PUT_LE16(p2pie + p2pielen, 0x0002);
  40979. + p2pielen += 2;
  40980. +
  40981. + // Value:
  40982. + // Device Capability Bitmap, 1 byte
  40983. + p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
  40984. +
  40985. + // Group Capability Bitmap, 1 byte
  40986. + if ( pwdinfo->persistent_supported )
  40987. + p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
  40988. + else
  40989. + p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
  40990. +
  40991. +
  40992. + // Device Info ATTR
  40993. + // Type:
  40994. + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  40995. +
  40996. + // Length:
  40997. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  40998. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  40999. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  41000. + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len);
  41001. + p2pielen += 2;
  41002. +
  41003. + // Value:
  41004. + // P2P Device Address
  41005. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );
  41006. + p2pielen += ETH_ALEN;
  41007. +
  41008. + // Config Method
  41009. + // This field should be big endian. Noted by P2P specification.
  41010. + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC )
  41011. + {
  41012. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC );
  41013. + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC);
  41014. + }
  41015. + else
  41016. + {
  41017. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );
  41018. + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY);
  41019. + }
  41020. +
  41021. + p2pielen += 2;
  41022. +
  41023. + // Primary Device Type
  41024. + // Category ID
  41025. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
  41026. + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA);
  41027. + p2pielen += 2;
  41028. +
  41029. + // OUI
  41030. + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
  41031. + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI);
  41032. + p2pielen += 4;
  41033. +
  41034. + // Sub Category ID
  41035. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
  41036. + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER);
  41037. + p2pielen += 2;
  41038. +
  41039. + // Number of Secondary Device Types
  41040. + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List
  41041. +
  41042. + // Device Name
  41043. + // Type:
  41044. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
  41045. + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME);
  41046. + p2pielen += 2;
  41047. +
  41048. + // Length:
  41049. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
  41050. + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len);
  41051. + p2pielen += 2;
  41052. +
  41053. + // Value:
  41054. + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );
  41055. + p2pielen += pwdinfo->device_name_len;
  41056. +
  41057. + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
  41058. + {
  41059. + // Added by Albert 2011/05/19
  41060. + // In this case, the pdev_raddr is the device address of the group owner.
  41061. +
  41062. + // P2P Group ID ATTR
  41063. + // Type:
  41064. + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
  41065. +
  41066. + // Length:
  41067. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen );
  41068. + RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen);
  41069. + p2pielen += 2;
  41070. +
  41071. + // Value:
  41072. + _rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN );
  41073. + p2pielen += ETH_ALEN;
  41074. +
  41075. + _rtw_memcpy( p2pie + p2pielen, pssid, ussidlen );
  41076. + p2pielen += ussidlen;
  41077. +
  41078. + }
  41079. +
  41080. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
  41081. +
  41082. +
  41083. + return len;
  41084. +
  41085. +}
  41086. +
  41087. +
  41088. +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code)
  41089. +{
  41090. + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
  41091. + u32 len=0, p2pielen = 0;
  41092. +
  41093. + // P2P OUI
  41094. + p2pielen = 0;
  41095. + p2pie[ p2pielen++ ] = 0x50;
  41096. + p2pie[ p2pielen++ ] = 0x6F;
  41097. + p2pie[ p2pielen++ ] = 0x9A;
  41098. + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  41099. +
  41100. + // According to the P2P Specification, the Association response frame should contain 2 P2P attributes
  41101. + // 1. Status
  41102. + // 2. Extended Listen Timing (optional)
  41103. +
  41104. +
  41105. + // Status ATTR
  41106. + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code);
  41107. +
  41108. +
  41109. + // Extended Listen Timing ATTR
  41110. + // Type:
  41111. + // Length:
  41112. + // Value:
  41113. +
  41114. +
  41115. + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);
  41116. +
  41117. + return len;
  41118. +
  41119. +}
  41120. +
  41121. +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
  41122. +{
  41123. + u32 len=0;
  41124. +
  41125. + return len;
  41126. +}
  41127. +
  41128. +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
  41129. +{
  41130. + u8 *p;
  41131. + u32 ret=_FALSE;
  41132. + u8 *p2pie;
  41133. + u32 p2pielen = 0;
  41134. + int ssid_len=0, rate_cnt = 0;
  41135. +
  41136. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt,
  41137. + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);
  41138. +
  41139. + if ( rate_cnt <= 4 )
  41140. + {
  41141. + int i, g_rate =0;
  41142. +
  41143. + for( i = 0; i < rate_cnt; i++ )
  41144. + {
  41145. + if ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) &&
  41146. + ( ( *( p + 2 + i ) & 0xff ) != 0x04 ) &&
  41147. + ( ( *( p + 2 + i ) & 0xff ) != 0x0B ) &&
  41148. + ( ( *( p + 2 + i ) & 0xff ) != 0x16 ) )
  41149. + {
  41150. + g_rate = 1;
  41151. + }
  41152. + }
  41153. +
  41154. + if ( g_rate == 0 )
  41155. + {
  41156. + // There is no OFDM rate included in SupportedRates IE of this probe request frame
  41157. + // The driver should response this probe request.
  41158. + return ret;
  41159. + }
  41160. + }
  41161. + else
  41162. + {
  41163. + // rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4.
  41164. + // We should proceed the following check for this probe request.
  41165. + }
  41166. +
  41167. + // Added comments by Albert 20100906
  41168. + // There are several items we should check here.
  41169. + // 1. This probe request frame must contain the P2P IE. (Done)
  41170. + // 2. This probe request frame must contain the wildcard SSID. (Done)
  41171. + // 3. Wildcard BSSID. (Todo)
  41172. + // 4. Destination Address. ( Done in mgt_dispatcher function )
  41173. + // 5. Requested Device Type in WSC IE. (Todo)
  41174. + // 6. Device ID attribute in P2P IE. (Todo)
  41175. +
  41176. + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len,
  41177. + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);
  41178. +
  41179. + ssid_len &= 0xff; // Just last 1 byte is valid for ssid len of the probe request
  41180. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41181. + {
  41182. + if((p2pie=rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , NULL, &p2pielen)))
  41183. + {
  41184. + if ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 ))
  41185. + {
  41186. + //todo:
  41187. + //Check Requested Device Type attributes in WSC IE.
  41188. + //Check Device ID attribute in P2P IE
  41189. +
  41190. + ret = _TRUE;
  41191. + }
  41192. + else if ( (p != NULL) && ( ssid_len == 0 ) )
  41193. + {
  41194. + ret = _TRUE;
  41195. + }
  41196. + }
  41197. + else
  41198. + {
  41199. + //non -p2p device
  41200. + }
  41201. +
  41202. + }
  41203. +
  41204. +
  41205. + return ret;
  41206. +
  41207. +}
  41208. +
  41209. +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta)
  41210. +{
  41211. + u8 status_code = P2P_STATUS_SUCCESS;
  41212. + u8 *pbuf, *pattr_content=NULL;
  41213. + u32 attr_contentlen = 0;
  41214. + u16 cap_attr=0;
  41215. + unsigned short frame_type, ie_offset=0;
  41216. + u8 * ies;
  41217. + u32 ies_len;
  41218. + u8 * p2p_ie;
  41219. + u32 p2p_ielen = 0;
  41220. +
  41221. + if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41222. + return P2P_STATUS_FAIL_REQUEST_UNABLE;
  41223. +
  41224. + frame_type = GetFrameSubType(pframe);
  41225. + if (frame_type == WIFI_ASSOCREQ)
  41226. + {
  41227. + ie_offset = _ASOCREQ_IE_OFFSET_;
  41228. + }
  41229. + else // WIFI_REASSOCREQ
  41230. + {
  41231. + ie_offset = _REASOCREQ_IE_OFFSET_;
  41232. + }
  41233. +
  41234. + ies = pframe + WLAN_HDR_A3_LEN + ie_offset;
  41235. + ies_len = len - WLAN_HDR_A3_LEN - ie_offset;
  41236. +
  41237. + p2p_ie = rtw_get_p2p_ie(ies , ies_len , NULL, &p2p_ielen);
  41238. +
  41239. + if ( !p2p_ie )
  41240. + {
  41241. + DBG_8192C( "[%s] P2P IE not Found!!\n", __FUNCTION__ );
  41242. + status_code = P2P_STATUS_FAIL_INVALID_PARAM;
  41243. + }
  41244. + else
  41245. + {
  41246. + DBG_8192C( "[%s] P2P IE Found!!\n", __FUNCTION__ );
  41247. + }
  41248. +
  41249. + while ( p2p_ie )
  41250. + {
  41251. + //Check P2P Capability ATTR
  41252. + if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) )
  41253. + {
  41254. + DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ );
  41255. + cap_attr = le16_to_cpu(cap_attr);
  41256. + psta->dev_cap = cap_attr&0xff;
  41257. + }
  41258. +
  41259. + //Check Extended Listen Timing ATTR
  41260. +
  41261. +
  41262. + //Check P2P Device Info ATTR
  41263. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen))
  41264. + {
  41265. + DBG_8192C( "[%s] Got P2P DEVICE INFO Attr!!\n", __FUNCTION__ );
  41266. + pattr_content = pbuf = rtw_zmalloc(attr_contentlen);
  41267. + if(pattr_content)
  41268. + {
  41269. + u8 num_of_secdev_type;
  41270. + u16 dev_name_len;
  41271. +
  41272. +
  41273. + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen);
  41274. +
  41275. + _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);//P2P Device Address
  41276. +
  41277. + pattr_content += ETH_ALEN;
  41278. +
  41279. + _rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods
  41280. + psta->config_methods = be16_to_cpu(psta->config_methods);
  41281. +
  41282. + pattr_content += 2;
  41283. +
  41284. + _rtw_memcpy(psta->primary_dev_type, pattr_content, 8);
  41285. +
  41286. + pattr_content += 8;
  41287. +
  41288. + num_of_secdev_type = *pattr_content;
  41289. + pattr_content += 1;
  41290. +
  41291. + if(num_of_secdev_type==0)
  41292. + {
  41293. + psta->num_of_secdev_type = 0;
  41294. + }
  41295. + else
  41296. + {
  41297. + u32 len;
  41298. +
  41299. + psta->num_of_secdev_type = num_of_secdev_type;
  41300. +
  41301. + len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8);
  41302. +
  41303. + _rtw_memcpy(psta->secdev_types_list, pattr_content, len);
  41304. +
  41305. + pattr_content += (num_of_secdev_type*8);
  41306. + }
  41307. +
  41308. +
  41309. + //dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8);
  41310. + psta->dev_name_len=0;
  41311. + if(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content))
  41312. + {
  41313. + dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2));
  41314. +
  41315. + psta->dev_name_len = (sizeof(psta->dev_name)<dev_name_len) ? sizeof(psta->dev_name):dev_name_len;
  41316. +
  41317. + _rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len);
  41318. + }
  41319. +
  41320. + rtw_mfree(pbuf, attr_contentlen);
  41321. +
  41322. + }
  41323. +
  41324. + }
  41325. +
  41326. + //Get the next P2P IE
  41327. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  41328. +
  41329. + }
  41330. +
  41331. + return status_code;
  41332. +
  41333. +}
  41334. +
  41335. +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
  41336. +{
  41337. + u8 *frame_body;
  41338. + u8 status, dialogToken;
  41339. + struct sta_info *psta = NULL;
  41340. + _adapter *padapter = pwdinfo->padapter;
  41341. + struct sta_priv *pstapriv = &padapter->stapriv;
  41342. + u8 *p2p_ie;
  41343. + u32 p2p_ielen = 0;
  41344. +
  41345. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  41346. +
  41347. + dialogToken = frame_body[7];
  41348. + status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
  41349. +
  41350. + if ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )
  41351. + {
  41352. + u8 groupid[ 38 ] = { 0x00 };
  41353. + u8 dev_addr[ETH_ALEN] = { 0x00 };
  41354. + u32 attr_contentlen = 0;
  41355. +
  41356. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))
  41357. + {
  41358. + if(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) &&
  41359. + _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len))
  41360. + {
  41361. + attr_contentlen=0;
  41362. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen))
  41363. + {
  41364. + _irqL irqL;
  41365. + _list *phead, *plist;
  41366. +
  41367. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  41368. + phead = &pstapriv->asoc_list;
  41369. + plist = get_next(phead);
  41370. +
  41371. + //look up sta asoc_queue
  41372. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  41373. + {
  41374. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  41375. +
  41376. + plist = get_next(plist);
  41377. +
  41378. + if(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) &&
  41379. + _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN))
  41380. + {
  41381. +
  41382. + //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  41383. + //issue GO Discoverability Request
  41384. + issue_group_disc_req(pwdinfo, psta->hwaddr);
  41385. + //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  41386. +
  41387. + status = P2P_STATUS_SUCCESS;
  41388. +
  41389. + break;
  41390. + }
  41391. + else
  41392. + {
  41393. + status = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  41394. + }
  41395. +
  41396. + }
  41397. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  41398. +
  41399. + }
  41400. + else
  41401. + {
  41402. + status = P2P_STATUS_FAIL_INVALID_PARAM;
  41403. + }
  41404. +
  41405. + }
  41406. + else
  41407. + {
  41408. + status = P2P_STATUS_FAIL_INVALID_PARAM;
  41409. + }
  41410. +
  41411. + }
  41412. +
  41413. + }
  41414. +
  41415. +
  41416. + //issue Device Discoverability Response
  41417. + issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);
  41418. +
  41419. +
  41420. + return (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE;
  41421. +
  41422. +}
  41423. +
  41424. +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
  41425. +{
  41426. + return _TRUE;
  41427. +}
  41428. +
  41429. +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len )
  41430. +{
  41431. + u8 *frame_body;
  41432. + u8 *wpsie;
  41433. + uint wps_ielen = 0, attr_contentlen = 0;
  41434. + u16 uconfig_method = 0;
  41435. +
  41436. +
  41437. + frame_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  41438. +
  41439. + if ( (wpsie=rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) )
  41440. + {
  41441. + if ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) )
  41442. + {
  41443. + uconfig_method = be16_to_cpu( uconfig_method );
  41444. + switch( uconfig_method )
  41445. + {
  41446. + case WPS_CM_DISPLYA:
  41447. + {
  41448. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 );
  41449. + break;
  41450. + }
  41451. + case WPS_CM_LABEL:
  41452. + {
  41453. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3 );
  41454. + break;
  41455. + }
  41456. + case WPS_CM_PUSH_BUTTON:
  41457. + {
  41458. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 );
  41459. + break;
  41460. + }
  41461. + case WPS_CM_KEYPAD:
  41462. + {
  41463. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 );
  41464. + break;
  41465. + }
  41466. + }
  41467. + issue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method);
  41468. + }
  41469. + }
  41470. + DBG_871X( "[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req );
  41471. + return _TRUE;
  41472. +
  41473. +}
  41474. +
  41475. +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe)
  41476. +{
  41477. +
  41478. + return _TRUE;
  41479. +}
  41480. +
  41481. +u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list)
  41482. +{
  41483. + u8 i = 0, j = 0;
  41484. + u8 temp = 0;
  41485. + u8 ch_no = 0;
  41486. + ch_content += 3;
  41487. + ch_cnt -= 3;
  41488. +
  41489. + while( ch_cnt > 0)
  41490. + {
  41491. + ch_content += 1;
  41492. + ch_cnt -= 1;
  41493. + temp = *ch_content;
  41494. + for( i = 0 ; i < temp ; i++, j++ )
  41495. + {
  41496. + peer_ch_list[j] = *( ch_content + 1 + i );
  41497. + }
  41498. + ch_content += (temp + 1);
  41499. + ch_cnt -= (temp + 1);
  41500. + ch_no += temp ;
  41501. + }
  41502. +
  41503. + return ch_no;
  41504. +}
  41505. +
  41506. +u8 rtw_p2p_check_peer_oper_ch(struct mlme_ext_priv *pmlmeext, u8 ch)
  41507. +{
  41508. + u8 i = 0;
  41509. +
  41510. + for( i = 0; i < pmlmeext->max_chan_nums; i++ )
  41511. + {
  41512. + if ( pmlmeext->channel_set[ i ].ChannelNum == ch )
  41513. + {
  41514. + return _SUCCESS;
  41515. + }
  41516. + }
  41517. +
  41518. + return _FAIL;
  41519. +}
  41520. +
  41521. +u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)
  41522. +{
  41523. + int i = 0, j = 0, temp = 0;
  41524. + u8 ch_no = 0;
  41525. +
  41526. + for( i = 0; i < peer_ch_num; i++ )
  41527. + {
  41528. + for( j = temp; j < pmlmeext->max_chan_nums; j++ )
  41529. + {
  41530. + if( *( peer_ch_list + i ) == pmlmeext->channel_set[ j ].ChannelNum )
  41531. + {
  41532. + ch_list_inclusioned[ ch_no++ ] = *( peer_ch_list + i );
  41533. + temp = j;
  41534. + break;
  41535. + }
  41536. + }
  41537. + }
  41538. +
  41539. + return ch_no;
  41540. +}
  41541. +
  41542. +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )
  41543. +{
  41544. + _adapter *padapter = pwdinfo->padapter;
  41545. + u8 result = P2P_STATUS_SUCCESS;
  41546. + u32 p2p_ielen = 0, wps_ielen = 0;
  41547. + u8 * ies;
  41548. + u32 ies_len;
  41549. + u8 *p2p_ie;
  41550. + u8 *wpsie;
  41551. + u16 wps_devicepassword_id = 0x0000;
  41552. + uint wps_devicepassword_id_len = 0;
  41553. +#ifdef CONFIG_WFD
  41554. + u8 wfd_ie[ 128 ] = { 0x00 };
  41555. + u32 wfd_ielen = 0;
  41556. +#ifdef CONFIG_TDLS
  41557. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  41558. +#endif // CONFIG_TDLS
  41559. +#endif // CONFIG_WFD
  41560. +#ifdef CONFIG_CONCURRENT_MODE
  41561. + _adapter *pbuddy_adapter = pwdinfo->padapter->pbuddy_adapter;
  41562. + struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  41563. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  41564. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  41565. +#endif
  41566. +
  41567. + if ( (wpsie=rtw_get_wps_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) )
  41568. + {
  41569. + // Commented by Kurt 20120113
  41570. + // If some device wants to do p2p handshake without sending prov_disc_req
  41571. + // We have to get peer_req_cm from here.
  41572. + if(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3) )
  41573. + {
  41574. + rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);
  41575. + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );
  41576. +
  41577. + if ( wps_devicepassword_id == WPS_DPID_USER_SPEC )
  41578. + {
  41579. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 );
  41580. + }
  41581. + else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )
  41582. + {
  41583. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 );
  41584. + }
  41585. + else
  41586. + {
  41587. + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 );
  41588. + }
  41589. + }
  41590. + }
  41591. + else
  41592. + {
  41593. + DBG_871X( "[%s] WPS IE not Found!!\n", __FUNCTION__ );
  41594. + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
  41595. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41596. + return( result );
  41597. + }
  41598. +
  41599. + if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )
  41600. + {
  41601. + result = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
  41602. + rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INFOR_NOREADY);
  41603. + return( result );
  41604. + }
  41605. +
  41606. + ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
  41607. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  41608. +
  41609. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  41610. +
  41611. + if ( !p2p_ie )
  41612. + {
  41613. + DBG_871X( "[%s] P2P IE not Found!!\n", __FUNCTION__ );
  41614. + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
  41615. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41616. + }
  41617. +
  41618. + while ( p2p_ie )
  41619. + {
  41620. + u8 attr_content = 0x00;
  41621. + u32 attr_contentlen = 0;
  41622. + u8 ch_content[100] = { 0x00 };
  41623. + uint ch_cnt = 0;
  41624. + u8 peer_ch_list[100] = { 0x00 };
  41625. + u8 peer_ch_num = 0;
  41626. + u8 ch_list_inclusioned[100] = { 0x00 };
  41627. + u8 ch_num_inclusioned = 0;
  41628. + u16 cap_attr;
  41629. +
  41630. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);
  41631. +
  41632. + //Check P2P Capability ATTR
  41633. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) )
  41634. + {
  41635. + cap_attr = le16_to_cpu(cap_attr);
  41636. +
  41637. +#if defined(CONFIG_WFD) && defined(CONFIG_TDLS)
  41638. + if(!(cap_attr & P2P_GRPCAP_INTRABSS) )
  41639. + ptdlsinfo->ap_prohibited = _TRUE;
  41640. +#endif //defined(CONFIG_WFD) && defined(CONFIG_TDLS)
  41641. + }
  41642. +
  41643. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) )
  41644. + {
  41645. + DBG_871X( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 );
  41646. + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values.
  41647. +
  41648. + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) )
  41649. + {
  41650. + // Try to match the tie breaker value
  41651. + if ( pwdinfo->intent == P2P_MAX_INTENT )
  41652. + {
  41653. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  41654. + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
  41655. + }
  41656. + else
  41657. + {
  41658. + if ( attr_content & 0x01 )
  41659. + {
  41660. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  41661. + }
  41662. + else
  41663. + {
  41664. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  41665. + }
  41666. + }
  41667. + }
  41668. + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) )
  41669. + {
  41670. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  41671. + }
  41672. + else
  41673. + {
  41674. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  41675. + }
  41676. +
  41677. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41678. + {
  41679. + // Store the group id information.
  41680. + _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN );
  41681. + _rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
  41682. + }
  41683. + }
  41684. +
  41685. +
  41686. + attr_contentlen = 0;
  41687. + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) )
  41688. + {
  41689. + if ( attr_contentlen != ETH_ALEN )
  41690. + {
  41691. + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );
  41692. + }
  41693. + }
  41694. +
  41695. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) )
  41696. + {
  41697. + peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list);
  41698. + ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
  41699. +
  41700. + if( ch_num_inclusioned == 0)
  41701. + {
  41702. + DBG_871X( "[%s] No common channel in channel list!\n", __FUNCTION__ );
  41703. + result = P2P_STATUS_FAIL_NO_COMMON_CH;
  41704. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41705. + break;
  41706. + }
  41707. +
  41708. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41709. + {
  41710. + if ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel,
  41711. + ch_list_inclusioned, ch_num_inclusioned) )
  41712. + {
  41713. +#ifdef CONFIG_CONCURRENT_MODE
  41714. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  41715. + {
  41716. + DBG_871X( "[%s] desired channel NOT Found!\n", __FUNCTION__ );
  41717. + result = P2P_STATUS_FAIL_NO_COMMON_CH;
  41718. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41719. + break;
  41720. + }
  41721. + else
  41722. +#endif //CONFIG_CONCURRENT_MODE
  41723. + {
  41724. + u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
  41725. + attr_contentlen = 0;
  41726. +
  41727. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )
  41728. + {
  41729. + peer_operating_ch = operatingch_info[4];
  41730. + }
  41731. +
  41732. + if ( rtw_p2p_is_channel_list_ok( peer_operating_ch,
  41733. + ch_list_inclusioned, ch_num_inclusioned) )
  41734. + {
  41735. + /**
  41736. + * Change our operating channel as peer's for compatibility.
  41737. + */
  41738. + pwdinfo->operating_channel = peer_operating_ch;
  41739. + DBG_871X( "[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel);
  41740. + }
  41741. + else
  41742. + {
  41743. + // Take first channel of ch_list_inclusioned as operating channel
  41744. + pwdinfo->operating_channel = ch_list_inclusioned[0];
  41745. + DBG_871X( "[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel);
  41746. + }
  41747. + }
  41748. +
  41749. + }
  41750. + }
  41751. + }
  41752. +
  41753. + //Get the next P2P IE
  41754. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  41755. + }
  41756. +
  41757. +#ifdef CONFIG_WFD
  41758. + // Added by Albert 20110823
  41759. + // Try to get the TCP port information when receiving the negotiation request.
  41760. + if ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) )
  41761. + {
  41762. + u8 attr_content[ 10 ] = { 0x00 };
  41763. + u32 attr_contentlen = 0;
  41764. +
  41765. + DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ );
  41766. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
  41767. + if ( attr_contentlen )
  41768. + {
  41769. + pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
  41770. + DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
  41771. + }
  41772. + }
  41773. +#endif // CONFIG_WFD
  41774. +
  41775. + return( result );
  41776. +}
  41777. +
  41778. +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )
  41779. +{
  41780. + _adapter *padapter = pwdinfo->padapter;
  41781. + u8 result = P2P_STATUS_SUCCESS;
  41782. + u32 p2p_ielen, wps_ielen;
  41783. + u8 * ies;
  41784. + u32 ies_len;
  41785. + u8 * p2p_ie;
  41786. +#ifdef CONFIG_WFD
  41787. + u8 wfd_ie[ 128 ] = { 0x00 };
  41788. + u32 wfd_ielen = 0;
  41789. +#ifdef CONFIG_TDLS
  41790. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  41791. +#endif // CONFIG_TDLS
  41792. +#endif // CONFIG_WFD
  41793. +
  41794. + ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
  41795. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  41796. +
  41797. + // Be able to know which one is the P2P GO and which one is P2P client.
  41798. +
  41799. + if ( rtw_get_wps_ie( ies, ies_len, NULL, &wps_ielen) )
  41800. + {
  41801. +
  41802. + }
  41803. + else
  41804. + {
  41805. + DBG_871X( "[%s] WPS IE not Found!!\n", __FUNCTION__ );
  41806. + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
  41807. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41808. + }
  41809. +
  41810. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  41811. + if ( !p2p_ie )
  41812. + {
  41813. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  41814. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41815. + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
  41816. + }
  41817. + else
  41818. + {
  41819. +
  41820. + u8 attr_content = 0x00;
  41821. + u32 attr_contentlen = 0;
  41822. + u8 operatingch_info[5] = { 0x00 };
  41823. + uint ch_cnt = 0;
  41824. + u8 ch_content[100] = { 0x00 };
  41825. + u8 groupid[ 38 ];
  41826. + u16 cap_attr;
  41827. + u8 peer_ch_list[100] = { 0x00 };
  41828. + u8 peer_ch_num = 0;
  41829. + u8 ch_list_inclusioned[100] = { 0x00 };
  41830. + u8 ch_num_inclusioned = 0;
  41831. +
  41832. + while ( p2p_ie ) // Found the P2P IE.
  41833. + {
  41834. +
  41835. + //Check P2P Capability ATTR
  41836. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) )
  41837. + {
  41838. + cap_attr = le16_to_cpu(cap_attr);
  41839. +#if defined(CONFIG_WFD) && defined(CONFIG_TDLS)
  41840. + if(!(cap_attr & P2P_GRPCAP_INTRABSS) )
  41841. + ptdlsinfo->ap_prohibited = _TRUE;
  41842. +#endif //defined(CONFIG_WFD) && defined(CONFIG_TDLS)
  41843. + }
  41844. +
  41845. + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
  41846. + if ( attr_contentlen == 1 )
  41847. + {
  41848. + DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content );
  41849. + if ( attr_content == P2P_STATUS_SUCCESS )
  41850. + {
  41851. + // Do nothing.
  41852. + }
  41853. + else
  41854. + {
  41855. + if ( P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content ) {
  41856. + rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY);
  41857. + } else {
  41858. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41859. + }
  41860. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  41861. + result = attr_content;
  41862. + break;
  41863. + }
  41864. + }
  41865. +
  41866. + // Try to get the peer's interface address
  41867. + attr_contentlen = 0;
  41868. + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) )
  41869. + {
  41870. + if ( attr_contentlen != ETH_ALEN )
  41871. + {
  41872. + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );
  41873. + }
  41874. + }
  41875. +
  41876. + // Try to get the peer's intent and tie breaker value.
  41877. + attr_content = 0x00;
  41878. + attr_contentlen = 0;
  41879. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) )
  41880. + {
  41881. + DBG_871X( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 );
  41882. + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values.
  41883. +
  41884. + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) )
  41885. + {
  41886. + // Try to match the tie breaker value
  41887. + if ( pwdinfo->intent == P2P_MAX_INTENT )
  41888. + {
  41889. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  41890. + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
  41891. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41892. + }
  41893. + else
  41894. + {
  41895. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41896. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41897. + if ( attr_content & 0x01 )
  41898. + {
  41899. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  41900. + }
  41901. + else
  41902. + {
  41903. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  41904. + }
  41905. + }
  41906. + }
  41907. + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) )
  41908. + {
  41909. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41910. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41911. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  41912. + }
  41913. + else
  41914. + {
  41915. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41916. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  41917. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  41918. + }
  41919. +
  41920. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41921. + {
  41922. + // Store the group id information.
  41923. + _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN );
  41924. + _rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
  41925. +
  41926. + }
  41927. + }
  41928. +
  41929. + // Try to get the operation channel information
  41930. +
  41931. + attr_contentlen = 0;
  41932. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
  41933. + {
  41934. + DBG_871X( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] );
  41935. + pwdinfo->peer_operating_ch = operatingch_info[4];
  41936. + }
  41937. +
  41938. + // Try to get the channel list information
  41939. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len ) )
  41940. + {
  41941. + DBG_871X( "[%s] channel list attribute found, len = %d\n", __FUNCTION__, pwdinfo->channel_list_attr_len );
  41942. +
  41943. + peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list);
  41944. + ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
  41945. +
  41946. + if( ch_num_inclusioned == 0)
  41947. + {
  41948. + DBG_871X( "[%s] No common channel in channel list!\n", __FUNCTION__ );
  41949. + result = P2P_STATUS_FAIL_NO_COMMON_CH;
  41950. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41951. + break;
  41952. + }
  41953. +
  41954. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  41955. + {
  41956. + if ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel,
  41957. + ch_list_inclusioned, ch_num_inclusioned) )
  41958. + {
  41959. +#ifdef CONFIG_CONCURRENT_MODE
  41960. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  41961. + {
  41962. + DBG_871X( "[%s] desired channel NOT Found!\n", __FUNCTION__ );
  41963. + result = P2P_STATUS_FAIL_NO_COMMON_CH;
  41964. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  41965. + break;
  41966. + }
  41967. + else
  41968. +#endif //CONFIG_CONCURRENT_MODE
  41969. + {
  41970. + u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
  41971. + attr_contentlen = 0;
  41972. +
  41973. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )
  41974. + {
  41975. + peer_operating_ch = operatingch_info[4];
  41976. + }
  41977. +
  41978. + if ( rtw_p2p_is_channel_list_ok( peer_operating_ch,
  41979. + ch_list_inclusioned, ch_num_inclusioned) )
  41980. + {
  41981. + /**
  41982. + * Change our operating channel as peer's for compatibility.
  41983. + */
  41984. + pwdinfo->operating_channel = peer_operating_ch;
  41985. + DBG_871X( "[%s] Change op ch to %02x as peer's\n", __FUNCTION__, pwdinfo->operating_channel);
  41986. + }
  41987. + else
  41988. + {
  41989. + // Take first channel of ch_list_inclusioned as operating channel
  41990. + pwdinfo->operating_channel = ch_list_inclusioned[0];
  41991. + DBG_871X( "[%s] Change op ch to %02x\n", __FUNCTION__, pwdinfo->operating_channel);
  41992. + }
  41993. + }
  41994. +
  41995. + }
  41996. + }
  41997. +
  41998. + }
  41999. + else
  42000. + {
  42001. + DBG_871X( "[%s] channel list attribute not found!\n", __FUNCTION__);
  42002. + }
  42003. +
  42004. + // Try to get the group id information if peer is GO
  42005. + attr_contentlen = 0;
  42006. + _rtw_memset( groupid, 0x00, 38 );
  42007. + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) )
  42008. + {
  42009. + _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN );
  42010. + _rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN );
  42011. + }
  42012. +
  42013. + //Get the next P2P IE
  42014. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42015. + }
  42016. +
  42017. + }
  42018. +
  42019. +#ifdef CONFIG_WFD
  42020. + // Added by Albert 20111122
  42021. + // Try to get the TCP port information when receiving the negotiation response.
  42022. + if ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) )
  42023. + {
  42024. + u8 attr_content[ 10 ] = { 0x00 };
  42025. + u32 attr_contentlen = 0;
  42026. +
  42027. + DBG_8192C( "[%s] WFD IE Found!!\n", __FUNCTION__ );
  42028. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
  42029. + if ( attr_contentlen )
  42030. + {
  42031. + pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
  42032. + DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
  42033. + }
  42034. + }
  42035. +#endif // CONFIG_WFD
  42036. +
  42037. + return( result );
  42038. +
  42039. +}
  42040. +
  42041. +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )
  42042. +{
  42043. + u8 * ies;
  42044. + u32 ies_len;
  42045. + u8 * p2p_ie;
  42046. + u32 p2p_ielen = 0;
  42047. + u8 result = P2P_STATUS_SUCCESS;
  42048. + ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
  42049. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42050. +
  42051. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42052. + while ( p2p_ie ) // Found the P2P IE.
  42053. + {
  42054. + u8 attr_content = 0x00, operatingch_info[5] = { 0x00 };
  42055. + u8 groupid[ 38 ] = { 0x00 };
  42056. + u32 attr_contentlen = 0;
  42057. +
  42058. + pwdinfo->negotiation_dialog_token = 1;
  42059. + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
  42060. + if ( attr_contentlen == 1 )
  42061. + {
  42062. + DBG_871X( "[%s] Status = %d\n", __FUNCTION__, attr_content );
  42063. + result = attr_content;
  42064. +
  42065. + if ( attr_content == P2P_STATUS_SUCCESS )
  42066. + {
  42067. + u8 bcancelled = 0;
  42068. +
  42069. + _cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled );
  42070. +
  42071. + // Commented by Albert 20100911
  42072. + // Todo: Need to handle the case which both Intents are the same.
  42073. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  42074. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  42075. + if ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) )
  42076. + {
  42077. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  42078. + }
  42079. + else if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) )
  42080. + {
  42081. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  42082. + }
  42083. + else
  42084. + {
  42085. + // Have to compare the Tie Breaker
  42086. + if ( pwdinfo->peer_intent & 0x01 )
  42087. + {
  42088. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  42089. + }
  42090. + else
  42091. + {
  42092. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  42093. + }
  42094. + }
  42095. +
  42096. +#ifdef CONFIG_CONCURRENT_MODE
  42097. + if ( check_buddy_fwstate(pwdinfo->padapter , _FW_LINKED ) )
  42098. + {
  42099. + // Switch back to the AP channel soon.
  42100. + _set_timer( &pwdinfo->ap_p2p_switch_timer, 100 );
  42101. + }
  42102. +#endif
  42103. + }
  42104. + else
  42105. + {
  42106. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  42107. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
  42108. + break;
  42109. + }
  42110. + }
  42111. +
  42112. + // Try to get the group id information
  42113. + attr_contentlen = 0;
  42114. + _rtw_memset( groupid, 0x00, 38 );
  42115. + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) )
  42116. + {
  42117. + DBG_871X( "[%s] Ssid = %s, ssidlen = %d\n", __FUNCTION__, &groupid[ETH_ALEN], (u32)strlen(&groupid[ETH_ALEN]) );
  42118. + _rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN );
  42119. + _rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN );
  42120. + }
  42121. +
  42122. + attr_contentlen = 0;
  42123. + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )
  42124. + {
  42125. + DBG_871X( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] );
  42126. + pwdinfo->peer_operating_ch = operatingch_info[4];
  42127. + }
  42128. +
  42129. + //Get the next P2P IE
  42130. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42131. +
  42132. + }
  42133. +
  42134. + return( result );
  42135. +}
  42136. +
  42137. +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
  42138. +{
  42139. + u8 *frame_body;
  42140. + u8 dialogToken=0;
  42141. + u8 status = P2P_STATUS_SUCCESS;
  42142. +
  42143. + frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
  42144. +
  42145. + dialogToken = frame_body[6];
  42146. +
  42147. + //todo: check NoA attribute
  42148. +
  42149. + issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);
  42150. +
  42151. + return _TRUE;
  42152. +}
  42153. +
  42154. +void find_phase_handler( _adapter* padapter )
  42155. +{
  42156. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42157. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  42158. + NDIS_802_11_SSID ssid;
  42159. + _irqL irqL;
  42160. + u8 _status = 0;
  42161. +
  42162. +_func_enter_;
  42163. +
  42164. + _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID));
  42165. + _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN );
  42166. + ssid.SsidLength = P2P_WILDCARD_SSID_LEN;
  42167. +
  42168. + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
  42169. +
  42170. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  42171. + _status = rtw_sitesurvey_cmd(padapter, &ssid, 1, NULL, 0);
  42172. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  42173. +
  42174. +
  42175. +_func_exit_;
  42176. +}
  42177. +
  42178. +void p2p_concurrent_handler( _adapter* padapter );
  42179. +
  42180. +void restore_p2p_state_handler( _adapter* padapter )
  42181. +{
  42182. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42183. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  42184. +
  42185. +_func_enter_;
  42186. +
  42187. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
  42188. + {
  42189. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  42190. + }
  42191. +
  42192. +#ifdef CONFIG_CONCURRENT_MODE
  42193. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  42194. + {
  42195. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  42196. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  42197. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42198. +
  42199. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP))
  42200. + {
  42201. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  42202. +
  42203. + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
  42204. + }
  42205. + }
  42206. +#endif
  42207. +
  42208. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  42209. +
  42210. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))
  42211. + {
  42212. +#ifdef CONFIG_CONCURRENT_MODE
  42213. + p2p_concurrent_handler( padapter );
  42214. +#else
  42215. + // In the P2P client mode, the driver should not switch back to its listen channel
  42216. + // because this P2P client should stay at the operating channel of P2P GO.
  42217. + set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42218. +#endif
  42219. + }
  42220. +_func_exit_;
  42221. +}
  42222. +
  42223. +void pre_tx_invitereq_handler( _adapter* padapter )
  42224. +{
  42225. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42226. + u8 val8 = 1;
  42227. +_func_enter_;
  42228. +
  42229. + set_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42230. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42231. + issue_probereq_p2p(padapter, NULL);
  42232. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42233. +
  42234. +_func_exit_;
  42235. +}
  42236. +
  42237. +void pre_tx_provdisc_handler( _adapter* padapter )
  42238. +{
  42239. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42240. + u8 val8 = 1;
  42241. +_func_enter_;
  42242. +
  42243. + set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42244. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42245. + issue_probereq_p2p(padapter, NULL);
  42246. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42247. +
  42248. +_func_exit_;
  42249. +}
  42250. +
  42251. +void pre_tx_negoreq_handler( _adapter* padapter )
  42252. +{
  42253. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42254. + u8 val8 = 1;
  42255. +_func_enter_;
  42256. +
  42257. + set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42258. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42259. + issue_probereq_p2p(padapter, NULL);
  42260. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42261. +
  42262. +_func_exit_;
  42263. +}
  42264. +
  42265. +#ifdef CONFIG_CONCURRENT_MODE
  42266. +void p2p_concurrent_handler( _adapter* padapter )
  42267. +{
  42268. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42269. + //_adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  42270. + //struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  42271. + //struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  42272. + //struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42273. + u8 val8;
  42274. +_func_enter_;
  42275. +
  42276. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  42277. + {
  42278. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42279. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42280. +
  42281. + pwdinfo->operating_channel = pbuddy_mlmeext->cur_channel;
  42282. +
  42283. + if( pwdinfo->driver_interface == DRIVER_CFG80211 )
  42284. + {
  42285. + DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel);
  42286. +
  42287. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  42288. +
  42289. + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
  42290. + }
  42291. + else if( pwdinfo->driver_interface == DRIVER_WEXT )
  42292. + {
  42293. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  42294. + {
  42295. + // Now, the driver stays on the AP's channel.
  42296. + // If the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel.
  42297. + if ( pwdinfo->ext_listen_period > 0 )
  42298. + {
  42299. + DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period );
  42300. +
  42301. + if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )
  42302. + {
  42303. + // Will switch to listen channel so that need to send the NULL data with PW bit to AP.
  42304. + issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);
  42305. + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42306. + }
  42307. +
  42308. + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
  42309. + val8 = 1;
  42310. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42311. +
  42312. + // Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not.
  42313. + _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period );
  42314. + }
  42315. + }
  42316. + else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) ||
  42317. + rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) ||
  42318. + ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE ) ||
  42319. + rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ) )
  42320. + {
  42321. + // Now, the driver is in the listen state of P2P mode.
  42322. + DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_interval = %d\n", __FUNCTION__, pwdinfo->ext_listen_interval );
  42323. +
  42324. + // Commented by Albert 2012/11/01
  42325. + // If the AP's channel is the same as the listen channel, we should still be in the listen state
  42326. + // Other P2P device is still able to find this device out even this device is in the AP's channel.
  42327. + // So, configure this device to be able to receive the probe request frame and set it to listen state.
  42328. + if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )
  42329. + {
  42330. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  42331. + val8 = 0;
  42332. + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42333. + rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);
  42334. + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
  42335. + }
  42336. +
  42337. + // Todo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not.
  42338. + _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval );
  42339. + }
  42340. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK))
  42341. + {
  42342. + // The driver had finished the P2P handshake successfully.
  42343. + val8 = 0;
  42344. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42345. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  42346. + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
  42347. + }
  42348. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
  42349. + {
  42350. + val8 = 1;
  42351. + set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42352. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42353. + issue_probereq_p2p(padapter, NULL);
  42354. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42355. + }
  42356. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE)
  42357. + {
  42358. + val8 = 1;
  42359. + set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42360. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42361. + issue_probereq_p2p(padapter, NULL);
  42362. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42363. + }
  42364. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) && pwdinfo->invitereq_info.benable == _TRUE)
  42365. + {
  42366. + /*
  42367. + val8 = 1;
  42368. + set_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42369. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
  42370. + issue_probereq_p2p(padapter, NULL);
  42371. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  42372. + */
  42373. + }
  42374. + }
  42375. + }
  42376. + else
  42377. + {
  42378. + set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  42379. + }
  42380. +
  42381. +_func_exit_;
  42382. +}
  42383. +#endif
  42384. +
  42385. +#ifdef CONFIG_IOCTL_CFG80211
  42386. +static void ro_ch_handler(_adapter *padapter)
  42387. +{
  42388. + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
  42389. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  42390. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  42391. + u8 ch, bw, offset;
  42392. +_func_enter_;
  42393. +
  42394. + if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
  42395. + if (0)
  42396. + DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
  42397. + FUNC_ADPT_ARG(padapter), ch, bw, offset);
  42398. + }
  42399. + else if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->listen_channel) {
  42400. + ch = pwdinfo->listen_channel;
  42401. + bw = HT_CHANNEL_WIDTH_20;
  42402. + offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  42403. + if (0)
  42404. + DBG_871X(FUNC_ADPT_FMT" back to listen ch - ch:%u, bw:%u, offset:%u\n",
  42405. + FUNC_ADPT_ARG(padapter), ch, bw, offset);
  42406. + }
  42407. + else {
  42408. + ch = pcfg80211_wdinfo->restore_channel;
  42409. + bw = HT_CHANNEL_WIDTH_20;
  42410. + offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  42411. + if (0)
  42412. + DBG_871X(FUNC_ADPT_FMT" back to restore ch - ch:%u, bw:%u, offset:%u\n",
  42413. + FUNC_ADPT_ARG(padapter), ch, bw, offset);
  42414. + }
  42415. +
  42416. + set_channel_bwmode(padapter, ch, offset, bw);
  42417. +
  42418. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  42419. +#ifdef CONFIG_DEBUG_CFG80211
  42420. + DBG_871X("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
  42421. +#endif
  42422. +
  42423. + pcfg80211_wdinfo->is_ro_ch = _FALSE;
  42424. +
  42425. + DBG_871X("cfg80211_remain_on_channel_expired\n");
  42426. +
  42427. + rtw_cfg80211_remain_on_channel_expired(padapter,
  42428. + pcfg80211_wdinfo->remain_on_ch_cookie,
  42429. + &pcfg80211_wdinfo->remain_on_ch_channel,
  42430. + pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL);
  42431. +
  42432. +_func_exit_;
  42433. +}
  42434. +
  42435. +static void ro_ch_timer_process (void *FunctionContext)
  42436. +{
  42437. + _adapter *adapter = (_adapter *)FunctionContext;
  42438. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev);
  42439. +
  42440. + //printk("%s \n", __FUNCTION__);
  42441. +
  42442. +#ifdef CONFIG_CONCURRENT_MODE
  42443. + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);
  42444. +#endif
  42445. +
  42446. + p2p_protocol_wk_cmd( adapter, P2P_RO_CH_WK);
  42447. +}
  42448. +
  42449. +static void rtw_change_p2pie_op_ch(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch)
  42450. +{
  42451. + u8 *ies, *p2p_ie;
  42452. + u32 ies_len, p2p_ielen;
  42453. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42454. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42455. +
  42456. + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
  42457. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42458. +
  42459. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42460. +
  42461. + while ( p2p_ie ) {
  42462. + u32 attr_contentlen = 0;
  42463. + u8 *pattr = NULL;
  42464. +
  42465. + //Check P2P_ATTR_OPERATING_CH
  42466. + attr_contentlen = 0;
  42467. + pattr = NULL;
  42468. + if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL)
  42469. + {
  42470. + *(pattr+4) = ch;
  42471. + }
  42472. +
  42473. + //Get the next P2P IE
  42474. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42475. + }
  42476. +}
  42477. +
  42478. +static void rtw_change_p2pie_ch_list(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch)
  42479. +{
  42480. + u8 *ies, *p2p_ie;
  42481. + u32 ies_len, p2p_ielen;
  42482. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42483. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42484. +
  42485. + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
  42486. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42487. +
  42488. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42489. +
  42490. + while (p2p_ie) {
  42491. + u32 attr_contentlen = 0;
  42492. + u8 *pattr = NULL;
  42493. +
  42494. + //Check P2P_ATTR_CH_LIST
  42495. + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) {
  42496. + int i;
  42497. + u32 num_of_ch;
  42498. + u8 *pattr_temp = pattr + 3 ;
  42499. +
  42500. + attr_contentlen -= 3;
  42501. +
  42502. + while (attr_contentlen>0) {
  42503. + num_of_ch = *(pattr_temp+1);
  42504. +
  42505. + for(i=0; i<num_of_ch; i++)
  42506. + *(pattr_temp+2+i) = ch;
  42507. +
  42508. + pattr_temp += (2+num_of_ch);
  42509. + attr_contentlen -= (2+num_of_ch);
  42510. + }
  42511. + }
  42512. +
  42513. + //Get the next P2P IE
  42514. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42515. + }
  42516. +}
  42517. +
  42518. +static bool rtw_chk_p2pie_ch_list_with_buddy(_adapter *padapter, const u8 *frame_body, u32 len)
  42519. +{
  42520. + bool fit = _FALSE;
  42521. +#ifdef CONFIG_CONCURRENT_MODE
  42522. + u8 *ies, *p2p_ie;
  42523. + u32 ies_len, p2p_ielen;
  42524. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42525. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42526. + u8 buddy_ch = pbuddy_mlmeext->cur_channel;
  42527. +
  42528. + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
  42529. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42530. +
  42531. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42532. +
  42533. + while (p2p_ie) {
  42534. + u32 attr_contentlen = 0;
  42535. + u8 *pattr = NULL;
  42536. +
  42537. + //Check P2P_ATTR_CH_LIST
  42538. + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) {
  42539. + int i;
  42540. + u32 num_of_ch;
  42541. + u8 *pattr_temp = pattr + 3 ;
  42542. +
  42543. + attr_contentlen -= 3;
  42544. +
  42545. + while (attr_contentlen>0) {
  42546. + num_of_ch = *(pattr_temp+1);
  42547. +
  42548. + for(i=0; i<num_of_ch; i++) {
  42549. + if (*(pattr_temp+2+i) == buddy_ch) {
  42550. + DBG_871X(FUNC_ADPT_FMT" ch_list fit buddy_ch:%u\n", FUNC_ADPT_ARG(padapter), buddy_ch);
  42551. + fit = _TRUE;
  42552. + break;
  42553. + }
  42554. + }
  42555. +
  42556. + pattr_temp += (2+num_of_ch);
  42557. + attr_contentlen -= (2+num_of_ch);
  42558. + }
  42559. + }
  42560. +
  42561. + //Get the next P2P IE
  42562. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42563. + }
  42564. +#endif
  42565. + return fit;
  42566. +}
  42567. +
  42568. +static bool rtw_chk_p2pie_op_ch_with_buddy(_adapter *padapter, const u8 *frame_body, u32 len)
  42569. +{
  42570. + bool fit = _FALSE;
  42571. +#ifdef CONFIG_CONCURRENT_MODE
  42572. + u8 *ies, *p2p_ie;
  42573. + u32 ies_len, p2p_ielen;
  42574. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42575. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42576. + u8 buddy_ch = pbuddy_mlmeext->cur_channel;
  42577. +
  42578. + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
  42579. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42580. +
  42581. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42582. +
  42583. + while (p2p_ie) {
  42584. + u32 attr_contentlen = 0;
  42585. + u8 *pattr = NULL;
  42586. +
  42587. + //Check P2P_ATTR_OPERATING_CH
  42588. + attr_contentlen = 0;
  42589. + pattr = NULL;
  42590. + if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) {
  42591. + if (*(pattr+4) == buddy_ch) {
  42592. + DBG_871X(FUNC_ADPT_FMT" op_ch fit buddy_ch:%u\n", FUNC_ADPT_ARG(padapter), buddy_ch);
  42593. + fit = _TRUE;
  42594. + break;
  42595. + }
  42596. + }
  42597. +
  42598. + //Get the next P2P IE
  42599. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42600. + }
  42601. +#endif
  42602. + return fit;
  42603. +}
  42604. +
  42605. +static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *frame_body, u32 len)
  42606. +{
  42607. +#ifdef CONFIG_CONCURRENT_MODE
  42608. + u8 *ies, *p2p_ie;
  42609. + u32 ies_len, p2p_ielen;
  42610. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  42611. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  42612. +
  42613. + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);
  42614. + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
  42615. +
  42616. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );
  42617. +
  42618. + while ( p2p_ie )
  42619. + {
  42620. + u32 attr_contentlen = 0;
  42621. + u8 *pattr = NULL;
  42622. +
  42623. + //Check P2P_ATTR_CH_LIST
  42624. + if((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL)
  42625. + {
  42626. + int i;
  42627. + u32 num_of_ch;
  42628. + u8 *pattr_temp = pattr + 3 ;
  42629. +
  42630. + attr_contentlen -= 3;
  42631. +
  42632. + while(attr_contentlen>0)
  42633. + {
  42634. + num_of_ch = *(pattr_temp+1);
  42635. +
  42636. + for(i=0; i<num_of_ch; i++)
  42637. + *(pattr_temp+2+i) = pbuddy_mlmeext->cur_channel;//forcing to the same channel
  42638. +
  42639. + pattr_temp += (2+num_of_ch);
  42640. + attr_contentlen -= (2+num_of_ch);
  42641. + }
  42642. + }
  42643. +
  42644. + //Check P2P_ATTR_OPERATING_CH
  42645. + attr_contentlen = 0;
  42646. + pattr = NULL;
  42647. + if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL)
  42648. + {
  42649. + *(pattr+4) = pbuddy_mlmeext->cur_channel;//forcing to the same channel
  42650. + }
  42651. +
  42652. + //Get the next P2P IE
  42653. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  42654. +
  42655. + }
  42656. +
  42657. +#endif
  42658. +}
  42659. +
  42660. +#ifdef CONFIG_WFD
  42661. +void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32* len)
  42662. +{
  42663. + unsigned char *frame_body;
  42664. + u8 category, action, OUI_Subtype, dialogToken=0;
  42665. + u32 wfdielen = 0;
  42666. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  42667. +
  42668. + frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));
  42669. + category = frame_body[0];
  42670. +
  42671. + if(category == RTW_WLAN_CATEGORY_PUBLIC)
  42672. + {
  42673. + action = frame_body[1];
  42674. + if (action == ACT_PUBLIC_VENDOR
  42675. + && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE
  42676. + )
  42677. + {
  42678. + OUI_Subtype = frame_body[6];
  42679. + dialogToken = frame_body[7];
  42680. + switch( OUI_Subtype )//OUI Subtype
  42681. + {
  42682. + case P2P_GO_NEGO_REQ:
  42683. + {
  42684. + wfdielen = build_nego_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42685. + (*len) += wfdielen;
  42686. + break;
  42687. + }
  42688. + case P2P_GO_NEGO_RESP:
  42689. + {
  42690. + wfdielen = build_nego_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42691. + (*len) += wfdielen;
  42692. + break;
  42693. + }
  42694. + case P2P_GO_NEGO_CONF:
  42695. + {
  42696. + wfdielen = build_nego_confirm_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42697. + (*len) += wfdielen;
  42698. + break;
  42699. + }
  42700. + case P2P_INVIT_REQ:
  42701. + {
  42702. + wfdielen = build_invitation_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42703. + (*len) += wfdielen;
  42704. + break;
  42705. + }
  42706. + case P2P_INVIT_RESP:
  42707. + {
  42708. + wfdielen = build_invitation_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42709. + (*len) += wfdielen;
  42710. + break;
  42711. + }
  42712. + case P2P_DEVDISC_REQ:
  42713. + break;
  42714. + case P2P_DEVDISC_RESP:
  42715. +
  42716. + break;
  42717. + case P2P_PROVISION_DISC_REQ:
  42718. + {
  42719. + wfdielen = build_provdisc_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42720. + (*len) += wfdielen;
  42721. + break;
  42722. + }
  42723. + case P2P_PROVISION_DISC_RESP:
  42724. + {
  42725. + wfdielen = build_provdisc_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );
  42726. + (*len) += wfdielen;
  42727. + break;
  42728. + }
  42729. + default:
  42730. +
  42731. + break;
  42732. + }
  42733. +
  42734. + }
  42735. +
  42736. + }
  42737. + else if(category == RTW_WLAN_CATEGORY_P2P)
  42738. + {
  42739. + OUI_Subtype = frame_body[5];
  42740. + dialogToken = frame_body[6];
  42741. +
  42742. +#ifdef CONFIG_DEBUG_CFG80211
  42743. + DBG_871X("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n",
  42744. + cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken);
  42745. +#endif
  42746. +
  42747. + switch(OUI_Subtype)
  42748. + {
  42749. + case P2P_NOTICE_OF_ABSENCE:
  42750. +
  42751. + break;
  42752. + case P2P_PRESENCE_REQUEST:
  42753. +
  42754. + break;
  42755. + case P2P_PRESENCE_RESPONSE:
  42756. +
  42757. + break;
  42758. + case P2P_GO_DISC_REQUEST:
  42759. +
  42760. + break;
  42761. + default:
  42762. +
  42763. + break;
  42764. + }
  42765. +
  42766. + }
  42767. + else
  42768. + {
  42769. + DBG_871X("%s, action frame category=%d\n", __func__, category);
  42770. + //is_p2p_frame = (-1);
  42771. + }
  42772. +
  42773. + return;
  42774. +}
  42775. +#endif
  42776. +
  42777. +u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len)
  42778. +{
  42779. + uint attr_contentlen = 0;
  42780. + u8 *pattr = NULL;
  42781. + int w_sz = 0;
  42782. + u8 ch_cnt = 0;
  42783. + u8 ch_list[40];
  42784. + bool continuous = _FALSE;
  42785. +
  42786. + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, &attr_contentlen))!=NULL) {
  42787. + int i, j;
  42788. + u32 num_of_ch;
  42789. + u8 *pattr_temp = pattr + 3 ;
  42790. +
  42791. + attr_contentlen -= 3;
  42792. +
  42793. + _rtw_memset(ch_list, 0, 40);
  42794. +
  42795. + while (attr_contentlen>0) {
  42796. + num_of_ch = *(pattr_temp+1);
  42797. +
  42798. + for(i=0; i<num_of_ch; i++) {
  42799. + for (j=0;j<ch_cnt;j++) {
  42800. + if (ch_list[j] == *(pattr_temp+2+i))
  42801. + break;
  42802. + }
  42803. + if (j>=ch_cnt)
  42804. + ch_list[ch_cnt++] = *(pattr_temp+2+i);
  42805. +
  42806. + }
  42807. +
  42808. + pattr_temp += (2+num_of_ch);
  42809. + attr_contentlen -= (2+num_of_ch);
  42810. + }
  42811. +
  42812. + for (j=0;j<ch_cnt;j++) {
  42813. + if (j == 0) {
  42814. + w_sz += snprintf(buf+w_sz, buf_len-w_sz, "%u", ch_list[j]);
  42815. + } else if (ch_list[j] - ch_list[j-1] != 1) {
  42816. + w_sz += snprintf(buf+w_sz, buf_len-w_sz, ", %u", ch_list[j]);
  42817. + } else if (j != ch_cnt-1 && ch_list[j+1] - ch_list[j] == 1) {
  42818. + /* empty */
  42819. + } else {
  42820. + w_sz += snprintf(buf+w_sz, buf_len-w_sz, "-%u", ch_list[j]);
  42821. + }
  42822. + }
  42823. + }
  42824. + return buf;
  42825. +}
  42826. +
  42827. +/*
  42828. + * return _TRUE if requester is GO, _FALSE if responder is GO
  42829. + */
  42830. +bool rtw_p2p_nego_intent_compare(u8 req, u8 resp)
  42831. +{
  42832. + if (req>>1 == resp >>1)
  42833. + return req&0x01 ? _TRUE : _FALSE;
  42834. + else if (req>>1 > resp>>1)
  42835. + return _TRUE;
  42836. + else
  42837. + return _FALSE;
  42838. +}
  42839. +
  42840. +int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
  42841. +{
  42842. + int is_p2p_frame = (-1);
  42843. + unsigned char *frame_body;
  42844. + u8 category, action, OUI_Subtype, dialogToken=0;
  42845. + u8 *p2p_ie = NULL;
  42846. + uint p2p_ielen = 0;
  42847. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  42848. + int status = -1;
  42849. + u8 ch_list_buf[128] = {'\0'};
  42850. + int op_ch = -1;
  42851. + int listen_ch = -1;
  42852. + u8 intent = 0;
  42853. +
  42854. + frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));
  42855. + category = frame_body[0];
  42856. + //just for check
  42857. + if(category == RTW_WLAN_CATEGORY_PUBLIC)
  42858. + {
  42859. + action = frame_body[1];
  42860. + if (action == ACT_PUBLIC_VENDOR
  42861. + && _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE
  42862. + )
  42863. + {
  42864. + OUI_Subtype = frame_body[6];
  42865. + dialogToken = frame_body[7];
  42866. + is_p2p_frame = OUI_Subtype;
  42867. + #ifdef CONFIG_DEBUG_CFG80211
  42868. + DBG_871X("ACTION_CATEGORY_PUBLIC: ACT_PUBLIC_VENDOR, OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n",
  42869. + cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ), OUI_Subtype, dialogToken);
  42870. + #endif
  42871. +
  42872. + p2p_ie = rtw_get_p2p_ie(
  42873. + (u8 *)buf+sizeof(struct rtw_ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_,
  42874. + len-sizeof(struct rtw_ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_,
  42875. + NULL, &p2p_ielen);
  42876. +
  42877. + switch( OUI_Subtype )//OUI Subtype
  42878. + {
  42879. + u8 *cont;
  42880. + uint cont_len;
  42881. + case P2P_GO_NEGO_REQ:
  42882. + {
  42883. + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;
  42884. +
  42885. + if (tx) {
  42886. + #ifdef CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2
  42887. + if(pwdev_priv->provdisc_req_issued == _FALSE) {
  42888. + rtw_cfg80211_issue_p2p_provision_request(padapter, buf, len);
  42889. + pwdev_priv->provdisc_req_issued = _TRUE;
  42890. + rtw_msleep_os(200);
  42891. + }
  42892. + #endif //CONFIG_DRV_ISSUE_PROV_REQ
  42893. +
  42894. + #ifdef CONFIG_CONCURRENT_MODE
  42895. + if(check_buddy_fwstate(padapter, _FW_LINKED))
  42896. + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
  42897. + #endif
  42898. + }
  42899. +
  42900. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
  42901. + op_ch = *(cont+4);
  42902. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, NULL, &cont_len)))
  42903. + listen_ch = *(cont+4);
  42904. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len)))
  42905. + intent = *cont;
  42906. +
  42907. + if (nego_info->token != dialogToken)
  42908. + rtw_wdev_nego_info_init(nego_info);
  42909. +
  42910. + _rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN);
  42911. + nego_info->active = tx ? 1 : 0;
  42912. + nego_info->token = dialogToken;
  42913. + nego_info->req_op_ch = op_ch;
  42914. + nego_info->req_listen_ch = listen_ch;
  42915. + nego_info->req_intent = intent;
  42916. + nego_info->state = 0;
  42917. +
  42918. + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);
  42919. + DBG_871X("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d, intent:%u%s, listen_ch:%d, op_ch:%d, ch_list:%s\n",
  42920. + (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", listen_ch, op_ch, ch_list_buf);
  42921. +
  42922. + if (!tx) {
  42923. + #ifdef CONFIG_CONCURRENT_MODE
  42924. + if(check_buddy_fwstate(padapter, _FW_LINKED)
  42925. + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)
  42926. + {
  42927. + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter));
  42928. + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);
  42929. + }
  42930. + #endif
  42931. + }
  42932. +
  42933. + break;
  42934. + }
  42935. + case P2P_GO_NEGO_RESP:
  42936. + {
  42937. + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;
  42938. +
  42939. + if (tx) {
  42940. + #ifdef CONFIG_CONCURRENT_MODE
  42941. + if(check_buddy_fwstate(padapter, _FW_LINKED))
  42942. + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
  42943. + #endif
  42944. + }
  42945. +
  42946. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
  42947. + op_ch = *(cont+4);
  42948. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len)))
  42949. + intent = *cont;
  42950. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))
  42951. + status = *cont;
  42952. +
  42953. + if (nego_info->token == dialogToken && nego_info->state == 0
  42954. + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE
  42955. + ) {
  42956. + nego_info->status = (status==-1) ? 0xff : status;
  42957. + nego_info->rsp_op_ch= op_ch;
  42958. + nego_info->rsp_intent = intent;
  42959. + nego_info->state = 1;
  42960. + if (status != 0)
  42961. + nego_info->token = 0; /* init */
  42962. + }
  42963. +
  42964. + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);
  42965. + DBG_871X("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, intent:%u%s, status:%d, op_ch:%d, ch_list:%s\n",
  42966. + (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", status, op_ch, ch_list_buf);
  42967. +
  42968. + if (!tx) {
  42969. + pwdev_priv->provdisc_req_issued = _FALSE;
  42970. + #ifdef CONFIG_CONCURRENT_MODE
  42971. + if(check_buddy_fwstate(padapter, _FW_LINKED)
  42972. + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)
  42973. + {
  42974. + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter));
  42975. + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);
  42976. + }
  42977. + #endif
  42978. + }
  42979. +
  42980. + break;
  42981. + }
  42982. + case P2P_GO_NEGO_CONF:
  42983. + {
  42984. + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;
  42985. + bool is_go = _FALSE;
  42986. +
  42987. + if (tx) {
  42988. + #ifdef CONFIG_CONCURRENT_MODE
  42989. + if(check_buddy_fwstate(padapter, _FW_LINKED))
  42990. + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
  42991. + #endif
  42992. + }
  42993. +
  42994. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
  42995. + op_ch = *(cont+4);
  42996. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))
  42997. + status = *cont;
  42998. +
  42999. + if (nego_info->token == dialogToken && nego_info->state == 1
  43000. + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE
  43001. + ) {
  43002. + nego_info->status = (status==-1) ? 0xff : status;
  43003. + nego_info->conf_op_ch = (op_ch==-1) ? 0 : op_ch;
  43004. + nego_info->state = 2;
  43005. +
  43006. + if (status == 0) {
  43007. + if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) && tx)
  43008. + is_go = _TRUE;
  43009. + }
  43010. +
  43011. + nego_info->token = 0; /* init */
  43012. + }
  43013. +
  43014. + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);
  43015. + DBG_871X("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n",
  43016. + (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf);
  43017. +
  43018. + if (!tx) {
  43019. + }
  43020. +
  43021. + break;
  43022. + }
  43023. + case P2P_INVIT_REQ:
  43024. + {
  43025. + struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
  43026. + int flags = -1;
  43027. +
  43028. + if (tx) {
  43029. + #ifdef CONFIG_CONCURRENT_MODE
  43030. + if(check_buddy_fwstate(padapter, _FW_LINKED))
  43031. + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
  43032. + #endif
  43033. + }
  43034. +
  43035. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len)))
  43036. + flags = *cont;
  43037. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
  43038. + op_ch = *(cont+4);
  43039. +
  43040. + if (invit_info->token != dialogToken)
  43041. + rtw_wdev_invit_info_init(invit_info);
  43042. +
  43043. + _rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN);
  43044. + invit_info->active = tx ? 1 : 0;
  43045. + invit_info->token = dialogToken;
  43046. + invit_info->flags = (flags==-1) ? 0x0 : flags;
  43047. + invit_info->req_op_ch= op_ch;
  43048. + invit_info->state = 0;
  43049. +
  43050. + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);
  43051. + DBG_871X("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d, ch_list:%s\n",
  43052. + (tx==_TRUE)?"Tx":"Rx", dialogToken, flags, op_ch, ch_list_buf);
  43053. +
  43054. + if (!tx) {
  43055. + #ifdef CONFIG_CONCURRENT_MODE
  43056. + if(check_buddy_fwstate(padapter, _FW_LINKED)) {
  43057. + if (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) {
  43058. + DBG_871X(FUNC_ADPT_FMT" op_ch:%u has no intersect with buddy\n", FUNC_ADPT_ARG(padapter), op_ch);
  43059. + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);
  43060. + } else if (rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) {
  43061. + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter));
  43062. + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);
  43063. + }
  43064. + }
  43065. + #endif
  43066. + }
  43067. +
  43068. + break;
  43069. + }
  43070. + case P2P_INVIT_RESP:
  43071. + {
  43072. + struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
  43073. +
  43074. + if (tx) {
  43075. + #ifdef CONFIG_CONCURRENT_MODE
  43076. + if(check_buddy_fwstate(padapter, _FW_LINKED))
  43077. + rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
  43078. + #endif
  43079. + }
  43080. +
  43081. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))
  43082. + {
  43083. +#ifdef CONFIG_P2P_INVITE_IOT
  43084. + if(tx && *cont==7)
  43085. + {
  43086. + DBG_871X("TX_P2P_INVITE_RESP, status is no common channel, change to unknown group\n");
  43087. + *cont = 8; //unknow group status
  43088. + }
  43089. +#endif //CONFIG_P2P_INVITE_IOT
  43090. + status = *cont;
  43091. + }
  43092. + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
  43093. + op_ch = *(cont+4);
  43094. +
  43095. + if (invit_info->token == dialogToken && invit_info->state == 0
  43096. + && _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE
  43097. + ) {
  43098. + invit_info->status = (status==-1) ? 0xff : status;
  43099. + invit_info->rsp_op_ch= op_ch;
  43100. + invit_info->state = 1;
  43101. + invit_info->token = 0; /* init */
  43102. + }
  43103. +
  43104. + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);
  43105. + DBG_871X("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n",
  43106. + (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf);
  43107. +
  43108. + if (!tx) {
  43109. + }
  43110. +
  43111. + break;
  43112. + }
  43113. + case P2P_DEVDISC_REQ:
  43114. + DBG_871X("RTW_%s:P2P_DEVDISC_REQ, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken);
  43115. + break;
  43116. + case P2P_DEVDISC_RESP:
  43117. + cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
  43118. + DBG_871X("RTW_%s:P2P_DEVDISC_RESP, dialogToken=%d, status:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, cont?*cont:-1);
  43119. + break;
  43120. + case P2P_PROVISION_DISC_REQ:
  43121. + {
  43122. + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr);
  43123. + u8 *p2p_ie;
  43124. + uint p2p_ielen = 0;
  43125. + uint contentlen = 0;
  43126. +
  43127. + DBG_871X("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken);
  43128. +
  43129. + //if(tx)
  43130. + {
  43131. + pwdev_priv->provdisc_req_issued = _FALSE;
  43132. +
  43133. + if( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))
  43134. + {
  43135. +
  43136. + if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen))
  43137. + {
  43138. + pwdev_priv->provdisc_req_issued = _FALSE;//case: p2p_client join p2p GO
  43139. + }
  43140. + else
  43141. + {
  43142. + #ifdef CONFIG_DEBUG_CFG80211
  43143. + DBG_871X("provdisc_req_issued is _TRUE\n");
  43144. + #endif //CONFIG_DEBUG_CFG80211
  43145. + pwdev_priv->provdisc_req_issued = _TRUE;//case: p2p_devices connection before Nego req.
  43146. + }
  43147. +
  43148. + }
  43149. + }
  43150. + }
  43151. + break;
  43152. + case P2P_PROVISION_DISC_RESP:
  43153. + DBG_871X("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken);
  43154. + break;
  43155. + default:
  43156. + DBG_871X("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", OUI_Subtype, dialogToken);
  43157. + break;
  43158. + }
  43159. +
  43160. + }
  43161. +
  43162. + }
  43163. + else if(category == RTW_WLAN_CATEGORY_P2P)
  43164. + {
  43165. + OUI_Subtype = frame_body[5];
  43166. + dialogToken = frame_body[6];
  43167. +
  43168. + #ifdef CONFIG_DEBUG_CFG80211
  43169. + DBG_871X("ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\n",
  43170. + cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken);
  43171. + #endif
  43172. +
  43173. + is_p2p_frame = OUI_Subtype;
  43174. +
  43175. + switch(OUI_Subtype)
  43176. + {
  43177. + case P2P_NOTICE_OF_ABSENCE:
  43178. + DBG_871X("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken);
  43179. + break;
  43180. + case P2P_PRESENCE_REQUEST:
  43181. + DBG_871X("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken);
  43182. + break;
  43183. + case P2P_PRESENCE_RESPONSE:
  43184. + DBG_871X("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken);
  43185. + break;
  43186. + case P2P_GO_DISC_REQUEST:
  43187. + DBG_871X("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", dialogToken);
  43188. + break;
  43189. + default:
  43190. + DBG_871X("RTW_%s:OUI_Subtype=%d, dialogToken=%d\n", (tx==_TRUE)?"TX":"RX", OUI_Subtype, dialogToken);
  43191. + break;
  43192. + }
  43193. +
  43194. + }
  43195. + else
  43196. + {
  43197. + DBG_871X("RTW_%s:action frame category=%d\n", (tx==_TRUE)?"TX":"RX", category);
  43198. + }
  43199. +
  43200. + return is_p2p_frame;
  43201. +}
  43202. +
  43203. +void rtw_init_cfg80211_wifidirect_info( _adapter* padapter)
  43204. +{
  43205. + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
  43206. +
  43207. + _rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info) );
  43208. +
  43209. + _init_timer( &pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter );
  43210. +}
  43211. +#endif //CONFIG_IOCTL_CFG80211
  43212. +
  43213. +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType)
  43214. +{
  43215. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  43216. +
  43217. +_func_enter_;
  43218. +
  43219. + switch(intCmdType)
  43220. + {
  43221. + case P2P_FIND_PHASE_WK:
  43222. + {
  43223. + find_phase_handler( padapter );
  43224. + break;
  43225. + }
  43226. + case P2P_RESTORE_STATE_WK:
  43227. + {
  43228. + restore_p2p_state_handler( padapter );
  43229. + break;
  43230. + }
  43231. + case P2P_PRE_TX_PROVDISC_PROCESS_WK:
  43232. + {
  43233. +#ifdef CONFIG_CONCURRENT_MODE
  43234. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  43235. + {
  43236. + p2p_concurrent_handler( padapter );
  43237. + }
  43238. + else
  43239. + {
  43240. + pre_tx_provdisc_handler( padapter );
  43241. + }
  43242. +#else
  43243. + pre_tx_provdisc_handler( padapter );
  43244. +#endif
  43245. + break;
  43246. + }
  43247. + case P2P_PRE_TX_INVITEREQ_PROCESS_WK:
  43248. + {
  43249. +#ifdef CONFIG_CONCURRENT_MODE
  43250. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  43251. + {
  43252. + p2p_concurrent_handler( padapter );
  43253. + }
  43254. + else
  43255. + {
  43256. + pre_tx_invitereq_handler( padapter );
  43257. + }
  43258. +#else
  43259. + pre_tx_invitereq_handler( padapter );
  43260. +#endif
  43261. + break;
  43262. + }
  43263. + case P2P_PRE_TX_NEGOREQ_PROCESS_WK:
  43264. + {
  43265. +#ifdef CONFIG_CONCURRENT_MODE
  43266. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  43267. + {
  43268. + p2p_concurrent_handler( padapter );
  43269. + }
  43270. + else
  43271. + {
  43272. + pre_tx_negoreq_handler( padapter );
  43273. + }
  43274. +#else
  43275. + pre_tx_negoreq_handler( padapter );
  43276. +#endif
  43277. + break;
  43278. + }
  43279. +#ifdef CONFIG_P2P
  43280. +#ifdef CONFIG_CONCURRENT_MODE
  43281. + case P2P_AP_P2P_CH_SWITCH_PROCESS_WK:
  43282. + {
  43283. + p2p_concurrent_handler( padapter );
  43284. + break;
  43285. + }
  43286. +#endif
  43287. +#endif
  43288. +#ifdef CONFIG_IOCTL_CFG80211
  43289. + case P2P_RO_CH_WK:
  43290. + {
  43291. + ro_ch_handler( padapter );
  43292. + break;
  43293. + }
  43294. +#endif //CONFIG_IOCTL_CFG80211
  43295. +
  43296. + }
  43297. +
  43298. +_func_exit_;
  43299. +}
  43300. +
  43301. +#ifdef CONFIG_P2P_PS
  43302. +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength)
  43303. +{
  43304. + u8 * ies;
  43305. + u32 ies_len;
  43306. + u8 * p2p_ie;
  43307. + u32 p2p_ielen = 0;
  43308. + u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2
  43309. + u32 attr_contentlen = 0;
  43310. +
  43311. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  43312. + u8 find_p2p = _FALSE, find_p2p_ps = _FALSE;
  43313. + u8 noa_offset, noa_num, noa_index;
  43314. +
  43315. +_func_enter_;
  43316. +
  43317. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43318. + {
  43319. + return;
  43320. + }
  43321. +
  43322. +#ifdef CONFIG_CONCURRENT_MODE
  43323. + if(padapter->iface_type != IFACE_PORT0)
  43324. + return;
  43325. +#endif
  43326. + if(IELength <= _BEACON_IE_OFFSET_)
  43327. + return;
  43328. +
  43329. + ies = IEs + _BEACON_IE_OFFSET_;
  43330. + ies_len = IELength - _BEACON_IE_OFFSET_;
  43331. +
  43332. + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen);
  43333. +
  43334. + while(p2p_ie)
  43335. + {
  43336. + find_p2p = _TRUE;
  43337. + // Get Notice of Absence IE.
  43338. + if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen))
  43339. + {
  43340. + find_p2p_ps = _TRUE;
  43341. + noa_index = noa_attr[0];
  43342. +
  43343. + if( (pwdinfo->p2p_ps_mode == P2P_PS_NONE) ||
  43344. + (noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting.
  43345. + {
  43346. + pwdinfo->noa_index = noa_index;
  43347. + pwdinfo->opp_ps = noa_attr[1] >> 7;
  43348. + pwdinfo->ctwindow = noa_attr[1] & 0x7F;
  43349. +
  43350. + noa_offset = 2;
  43351. + noa_num = 0;
  43352. + // NoA length should be n*(13) + 2
  43353. + if(attr_contentlen > 2)
  43354. + {
  43355. + while(noa_offset < attr_contentlen)
  43356. + {
  43357. + //_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1);
  43358. + pwdinfo->noa_count[noa_num] = noa_attr[noa_offset];
  43359. + noa_offset += 1;
  43360. +
  43361. + _rtw_memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4);
  43362. + noa_offset += 4;
  43363. +
  43364. + _rtw_memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4);
  43365. + noa_offset += 4;
  43366. +
  43367. + _rtw_memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4);
  43368. + noa_offset += 4;
  43369. +
  43370. + noa_num++;
  43371. + }
  43372. + }
  43373. + pwdinfo->noa_num = noa_num;
  43374. +
  43375. + if( pwdinfo->opp_ps == 1 )
  43376. + {
  43377. + pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW;
  43378. + // driver should wait LPS for entering CTWindow
  43379. + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE)
  43380. + {
  43381. + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1);
  43382. + }
  43383. + }
  43384. + else if( pwdinfo->noa_num > 0 )
  43385. + {
  43386. + pwdinfo->p2p_ps_mode = P2P_PS_NOA;
  43387. + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1);
  43388. + }
  43389. + else if( pwdinfo->p2p_ps_mode > P2P_PS_NONE)
  43390. + {
  43391. + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);
  43392. + }
  43393. + }
  43394. +
  43395. + break; // find target, just break.
  43396. + }
  43397. +
  43398. + //Get the next P2P IE
  43399. + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
  43400. +
  43401. + }
  43402. +
  43403. + if(find_p2p == _TRUE)
  43404. + {
  43405. + if( (pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == _FALSE) )
  43406. + {
  43407. + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);
  43408. + }
  43409. + }
  43410. +
  43411. +_func_exit_;
  43412. +}
  43413. +
  43414. +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state)
  43415. +{
  43416. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  43417. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  43418. +
  43419. +_func_enter_;
  43420. +
  43421. + switch(p2p_ps_state)
  43422. + {
  43423. + case P2P_PS_DISABLE:
  43424. + pwdinfo->p2p_ps_state = p2p_ps_state;
  43425. +
  43426. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
  43427. +
  43428. + pwdinfo->noa_index = 0;
  43429. + pwdinfo->ctwindow = 0;
  43430. + pwdinfo->opp_ps = 0;
  43431. + pwdinfo->noa_num = 0;
  43432. + pwdinfo->p2p_ps_mode = P2P_PS_NONE;
  43433. + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE)
  43434. + {
  43435. + if(pwrpriv->smart_ps == 0)
  43436. + {
  43437. + pwrpriv->smart_ps = 2;
  43438. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode)));
  43439. + }
  43440. + }
  43441. + break;
  43442. + case P2P_PS_ENABLE:
  43443. + if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
  43444. + pwdinfo->p2p_ps_state = p2p_ps_state;
  43445. +
  43446. + if( pwdinfo->ctwindow > 0 )
  43447. + {
  43448. + if(pwrpriv->smart_ps != 0)
  43449. + {
  43450. + pwrpriv->smart_ps = 0;
  43451. + DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__);
  43452. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode)));
  43453. + }
  43454. + }
  43455. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
  43456. + }
  43457. + break;
  43458. + case P2P_PS_SCAN:
  43459. + case P2P_PS_SCAN_DONE:
  43460. + case P2P_PS_ALLSTASLEEP:
  43461. + if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
  43462. + pwdinfo->p2p_ps_state = p2p_ps_state;
  43463. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
  43464. + }
  43465. + break;
  43466. + default:
  43467. + break;
  43468. + }
  43469. +
  43470. +_func_exit_;
  43471. +}
  43472. +
  43473. +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue)
  43474. +{
  43475. + struct cmd_obj *ph2c;
  43476. + struct drvextra_cmd_parm *pdrvextra_cmd_parm;
  43477. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  43478. + struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
  43479. + u8 res = _SUCCESS;
  43480. +
  43481. +_func_enter_;
  43482. +
  43483. + if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
  43484. +#ifdef CONFIG_CONCURRENT_MODE
  43485. + || (padapter->iface_type != IFACE_PORT0)
  43486. +#endif
  43487. + )
  43488. + {
  43489. + return res;
  43490. + }
  43491. +
  43492. + if(enqueue)
  43493. + {
  43494. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  43495. + if(ph2c==NULL){
  43496. + res= _FAIL;
  43497. + goto exit;
  43498. + }
  43499. +
  43500. + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
  43501. + if(pdrvextra_cmd_parm==NULL){
  43502. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  43503. + res= _FAIL;
  43504. + goto exit;
  43505. + }
  43506. +
  43507. + pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID;
  43508. + pdrvextra_cmd_parm->type_size = p2p_ps_state;
  43509. + pdrvextra_cmd_parm->pbuf = NULL;
  43510. +
  43511. + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
  43512. +
  43513. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  43514. + }
  43515. + else
  43516. + {
  43517. + p2p_ps_wk_hdl(padapter, p2p_ps_state);
  43518. + }
  43519. +
  43520. +exit:
  43521. +
  43522. +_func_exit_;
  43523. +
  43524. + return res;
  43525. +
  43526. +}
  43527. +#endif // CONFIG_P2P_PS
  43528. +
  43529. +static void reset_ch_sitesurvey_timer_process (void *FunctionContext)
  43530. +{
  43531. + _adapter *adapter = (_adapter *)FunctionContext;
  43532. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43533. +
  43534. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43535. + return;
  43536. +
  43537. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  43538. + // Reset the operation channel information
  43539. + pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
  43540. +#ifdef P2P_OP_CHECK_SOCIAL_CH
  43541. + pwdinfo->rx_invitereq_info.operation_ch[1] = 0;
  43542. + pwdinfo->rx_invitereq_info.operation_ch[2] = 0;
  43543. + pwdinfo->rx_invitereq_info.operation_ch[3] = 0;
  43544. +#endif //P2P_OP_CHECK_SOCIAL_CH
  43545. + pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
  43546. +}
  43547. +
  43548. +static void reset_ch_sitesurvey_timer_process2 (void *FunctionContext)
  43549. +{
  43550. + _adapter *adapter = (_adapter *)FunctionContext;
  43551. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43552. +
  43553. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43554. + return;
  43555. +
  43556. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  43557. + // Reset the operation channel information
  43558. + pwdinfo->p2p_info.operation_ch[0] = 0;
  43559. +#ifdef P2P_OP_CHECK_SOCIAL_CH
  43560. + pwdinfo->p2p_info.operation_ch[1] = 0;
  43561. + pwdinfo->p2p_info.operation_ch[2] = 0;
  43562. + pwdinfo->p2p_info.operation_ch[3] = 0;
  43563. +#endif //P2P_OP_CHECK_SOCIAL_CH
  43564. + pwdinfo->p2p_info.scan_op_ch_only = 0;
  43565. +}
  43566. +
  43567. +static void restore_p2p_state_timer_process (void *FunctionContext)
  43568. +{
  43569. + _adapter *adapter = (_adapter *)FunctionContext;
  43570. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43571. +
  43572. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43573. + return;
  43574. +
  43575. + p2p_protocol_wk_cmd( adapter, P2P_RESTORE_STATE_WK );
  43576. +}
  43577. +
  43578. +static void pre_tx_scan_timer_process (void *FunctionContext)
  43579. +{
  43580. + _adapter *adapter = (_adapter *) FunctionContext;
  43581. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43582. + _irqL irqL;
  43583. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  43584. + u8 _status = 0;
  43585. +
  43586. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43587. + return;
  43588. +
  43589. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  43590. +
  43591. + // Commented by Albert 20110805
  43592. + // Todo: Use the issuing probe request directly instead of using the rtw_sitesurvey_cmd!!
  43593. +
  43594. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
  43595. + {
  43596. + if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) // the provision discovery request frame is trigger to send or not
  43597. + {
  43598. + p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK );
  43599. + //issue_probereq_p2p(adapter, NULL);
  43600. + //_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  43601. + }
  43602. + }
  43603. + else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
  43604. + {
  43605. + if ( _TRUE == pwdinfo->nego_req_info.benable )
  43606. + {
  43607. + p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK );
  43608. + //issue_probereq_p2p(adapter, NULL);
  43609. + //_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  43610. + }
  43611. + }
  43612. + else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) )
  43613. + {
  43614. + if ( _TRUE == pwdinfo->invitereq_info.benable )
  43615. + {
  43616. + p2p_protocol_wk_cmd( adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK );
  43617. + }
  43618. + }
  43619. + else
  43620. + {
  43621. + DBG_8192C( "[%s] p2p_state is %d, ignore!!\n", __FUNCTION__, rtw_p2p_state(pwdinfo) );
  43622. + }
  43623. +
  43624. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  43625. +}
  43626. +
  43627. +static void find_phase_timer_process (void *FunctionContext)
  43628. +{
  43629. + _adapter *adapter = (_adapter *)FunctionContext;
  43630. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43631. +
  43632. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43633. + return;
  43634. +
  43635. + adapter->wdinfo.find_phase_state_exchange_cnt++;
  43636. +
  43637. + p2p_protocol_wk_cmd( adapter, P2P_FIND_PHASE_WK );
  43638. +}
  43639. +
  43640. +#ifdef CONFIG_CONCURRENT_MODE
  43641. +void ap_p2p_switch_timer_process (void *FunctionContext)
  43642. +{
  43643. + _adapter *adapter = (_adapter *)FunctionContext;
  43644. + struct wifidirect_info *pwdinfo = &adapter->wdinfo;
  43645. +#ifdef CONFIG_IOCTL_CFG80211
  43646. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev);
  43647. +#endif
  43648. +
  43649. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  43650. + return;
  43651. +
  43652. +#ifdef CONFIG_IOCTL_CFG80211
  43653. + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1);
  43654. +#endif
  43655. +
  43656. + p2p_protocol_wk_cmd( adapter, P2P_AP_P2P_CH_SWITCH_PROCESS_WK );
  43657. +}
  43658. +#endif
  43659. +
  43660. +void reset_global_wifidirect_info( _adapter* padapter )
  43661. +{
  43662. + struct wifidirect_info *pwdinfo;
  43663. +
  43664. + pwdinfo = &padapter->wdinfo;
  43665. + pwdinfo->persistent_supported = 0;
  43666. + pwdinfo->session_available = _TRUE;
  43667. + pwdinfo->wfd_tdls_enable = 0;
  43668. + pwdinfo->wfd_tdls_weaksec = 0;
  43669. +}
  43670. +
  43671. +#ifdef CONFIG_WFD
  43672. +int rtw_init_wifi_display_info(_adapter* padapter)
  43673. +{
  43674. + int res = _SUCCESS;
  43675. + struct wifi_display_info *pwfd_info = &padapter->wfd_info;
  43676. +
  43677. + // Used in P2P and TDLS
  43678. + pwfd_info->rtsp_ctrlport = 554;
  43679. + pwfd_info->peer_rtsp_ctrlport = 0; // Reset to 0
  43680. + pwfd_info->wfd_enable = _FALSE;
  43681. + pwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;
  43682. + pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;
  43683. +
  43684. + // Used in P2P
  43685. + pwfd_info->peer_session_avail = _TRUE;
  43686. + pwfd_info->wfd_pc = _FALSE;
  43687. +
  43688. + // Used in TDLS
  43689. + _rtw_memset( pwfd_info->ip_address, 0x00, 4 );
  43690. + _rtw_memset( pwfd_info->peer_ip_address, 0x00, 4 );
  43691. + return res;
  43692. +
  43693. +}
  43694. +#endif //CONFIG_WFD
  43695. +
  43696. +void rtw_init_wifidirect_timers(_adapter* padapter)
  43697. +{
  43698. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  43699. +
  43700. + _init_timer( &pwdinfo->find_phase_timer, padapter->pnetdev, find_phase_timer_process, padapter );
  43701. + _init_timer( &pwdinfo->restore_p2p_state_timer, padapter->pnetdev, restore_p2p_state_timer_process, padapter );
  43702. + _init_timer( &pwdinfo->pre_tx_scan_timer, padapter->pnetdev, pre_tx_scan_timer_process, padapter );
  43703. + _init_timer( &pwdinfo->reset_ch_sitesurvey, padapter->pnetdev, reset_ch_sitesurvey_timer_process, padapter );
  43704. + _init_timer( &pwdinfo->reset_ch_sitesurvey2, padapter->pnetdev, reset_ch_sitesurvey_timer_process2, padapter );
  43705. +#ifdef CONFIG_CONCURRENT_MODE
  43706. + _init_timer( &pwdinfo->ap_p2p_switch_timer, padapter->pnetdev, ap_p2p_switch_timer_process, padapter );
  43707. +#endif
  43708. +}
  43709. +
  43710. +void rtw_init_wifidirect_addrs(_adapter* padapter, u8 *dev_addr, u8 *iface_addr)
  43711. +{
  43712. +#ifdef CONFIG_P2P
  43713. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  43714. +
  43715. + /*init device&interface address */
  43716. + if (dev_addr) {
  43717. + _rtw_memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN);
  43718. + }
  43719. + if (iface_addr) {
  43720. + _rtw_memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN);
  43721. + }
  43722. +#endif
  43723. +}
  43724. +
  43725. +void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role)
  43726. +{
  43727. + struct wifidirect_info *pwdinfo;
  43728. +#ifdef CONFIG_WFD
  43729. + struct wifi_display_info *pwfd_info = &padapter->wfd_info;
  43730. +#endif
  43731. +#ifdef CONFIG_CONCURRENT_MODE
  43732. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  43733. + struct wifidirect_info *pbuddy_wdinfo;
  43734. + struct mlme_priv *pbuddy_mlmepriv;
  43735. + struct mlme_ext_priv *pbuddy_mlmeext;
  43736. +#endif
  43737. +
  43738. + pwdinfo = &padapter->wdinfo;
  43739. +
  43740. + pwdinfo->padapter = padapter;
  43741. +
  43742. + // 1, 6, 11 are the social channel defined in the WiFi Direct specification.
  43743. + pwdinfo->social_chan[0] = 1;
  43744. + pwdinfo->social_chan[1] = 6;
  43745. + pwdinfo->social_chan[2] = 11;
  43746. + pwdinfo->social_chan[3] = 0; // channel 0 for scanning ending in site survey function.
  43747. +
  43748. +#ifdef CONFIG_CONCURRENT_MODE
  43749. + if (pbuddy_adapter) {
  43750. + pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  43751. + pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  43752. + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  43753. + }
  43754. +
  43755. + if ( ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE ) &&
  43756. + ( ( pbuddy_mlmeext->cur_channel == 1) || ( pbuddy_mlmeext->cur_channel == 6 ) || ( pbuddy_mlmeext->cur_channel == 11 ) )
  43757. + )
  43758. + {
  43759. + // Use the AP's channel as the listen channel
  43760. + // This will avoid the channel switch between AP's channel and listen channel.
  43761. + pwdinfo->listen_channel = pbuddy_mlmeext->cur_channel;
  43762. + }
  43763. + else
  43764. +#endif //CONFIG_CONCURRENT_MODE
  43765. + {
  43766. + // Use the channel 11 as the listen channel
  43767. + pwdinfo->listen_channel = 11;
  43768. + }
  43769. +
  43770. + if (role == P2P_ROLE_DEVICE)
  43771. + {
  43772. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  43773. + #ifdef CONFIG_CONCURRENT_MODE
  43774. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE )
  43775. + {
  43776. + rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);
  43777. + }
  43778. + else
  43779. + #endif
  43780. + {
  43781. + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
  43782. + }
  43783. + pwdinfo->intent = 1;
  43784. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN);
  43785. + }
  43786. + else if (role == P2P_ROLE_CLIENT)
  43787. + {
  43788. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  43789. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  43790. + pwdinfo->intent = 1;
  43791. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  43792. + }
  43793. + else if (role == P2P_ROLE_GO)
  43794. + {
  43795. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  43796. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  43797. + pwdinfo->intent = 15;
  43798. + rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
  43799. + }
  43800. +
  43801. +// Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )
  43802. + pwdinfo->support_rate[0] = 0x8c; // 6(B)
  43803. + pwdinfo->support_rate[1] = 0x92; // 9(B)
  43804. + pwdinfo->support_rate[2] = 0x18; // 12
  43805. + pwdinfo->support_rate[3] = 0x24; // 18
  43806. + pwdinfo->support_rate[4] = 0x30; // 24
  43807. + pwdinfo->support_rate[5] = 0x48; // 36
  43808. + pwdinfo->support_rate[6] = 0x60; // 48
  43809. + pwdinfo->support_rate[7] = 0x6c; // 54
  43810. +
  43811. + _rtw_memcpy( ( void* ) pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7 );
  43812. +
  43813. + _rtw_memset( pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN );
  43814. + pwdinfo->device_name_len = 0;
  43815. +
  43816. + _rtw_memset( &pwdinfo->invitereq_info, 0x00, sizeof( struct tx_invite_req_info ) );
  43817. + pwdinfo->invitereq_info.token = 3; // Token used for P2P invitation request frame.
  43818. +
  43819. + _rtw_memset( &pwdinfo->inviteresp_info, 0x00, sizeof( struct tx_invite_resp_info ) );
  43820. + pwdinfo->inviteresp_info.token = 0;
  43821. +
  43822. + pwdinfo->profileindex = 0;
  43823. + _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
  43824. +
  43825. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
  43826. +
  43827. + pwdinfo->listen_dwell = ( u8 ) (( rtw_get_current_time() % 3 ) + 1);
  43828. + //DBG_8192C( "[%s] listen_dwell time is %d00ms\n", __FUNCTION__, pwdinfo->listen_dwell );
  43829. +
  43830. + _rtw_memset( &pwdinfo->tx_prov_disc_info, 0x00, sizeof( struct tx_provdisc_req_info ) );
  43831. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE;
  43832. +
  43833. + _rtw_memset( &pwdinfo->nego_req_info, 0x00, sizeof( struct tx_nego_req_info ) );
  43834. +
  43835. + pwdinfo->device_password_id_for_nego = WPS_DPID_PBC;
  43836. + pwdinfo->negotiation_dialog_token = 1;
  43837. +
  43838. + _rtw_memset( pwdinfo->nego_ssid, 0x00, WLAN_SSID_MAXLEN );
  43839. + pwdinfo->nego_ssidlen = 0;
  43840. +
  43841. + pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;
  43842. +#ifdef CONFIG_WFD
  43843. + pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC;
  43844. + pwdinfo->wfd_info = pwfd_info;
  43845. +#else
  43846. + pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD;
  43847. +#endif //CONFIG_WFD
  43848. + pwdinfo->channel_list_attr_len = 0;
  43849. + _rtw_memset( pwdinfo->channel_list_attr, 0x00, 100 );
  43850. +
  43851. + _rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4 );
  43852. + _rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3 );
  43853. + _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );
  43854. +#ifdef CONFIG_CONCURRENT_MODE
  43855. +#ifdef CONFIG_IOCTL_CFG80211
  43856. + pwdinfo->ext_listen_interval = 1000; //The interval to be available with legacy AP during p2p0-find/scan
  43857. + pwdinfo->ext_listen_period = 3000; //The time period to be available for P2P during nego
  43858. +#else //!CONFIG_IOCTL_CFG80211
  43859. + //pwdinfo->ext_listen_interval = 3000;
  43860. + //pwdinfo->ext_listen_period = 400;
  43861. + pwdinfo->ext_listen_interval = 1000;
  43862. + pwdinfo->ext_listen_period = 1000;
  43863. +#endif //!CONFIG_IOCTL_CFG80211
  43864. +#endif
  43865. +
  43866. +// Commented by Kurt 20130319
  43867. +// For WiDi purpose: Use CFG80211 interface but controled WFD/RDS frame by driver itself.
  43868. +#ifdef CONFIG_IOCTL_CFG80211
  43869. + pwdinfo->driver_interface = DRIVER_CFG80211;
  43870. +#else
  43871. + pwdinfo->driver_interface = DRIVER_WEXT;
  43872. +#endif //CONFIG_IOCTL_CFG80211
  43873. +
  43874. + pwdinfo->wfd_tdls_enable = 0;
  43875. + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );
  43876. + _rtw_memset( pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN );
  43877. +
  43878. + pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
  43879. + pwdinfo->rx_invitereq_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function
  43880. +#ifdef P2P_OP_CHECK_SOCIAL_CH
  43881. + pwdinfo->rx_invitereq_info.operation_ch[2] = 0;
  43882. + pwdinfo->rx_invitereq_info.operation_ch[3] = 0;
  43883. + pwdinfo->rx_invitereq_info.operation_ch[4] = 0;
  43884. +#endif //P2P_OP_CHECK_SOCIAL_CH
  43885. + pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
  43886. + pwdinfo->p2p_info.operation_ch[0] = 0;
  43887. + pwdinfo->p2p_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function
  43888. +#ifdef P2P_OP_CHECK_SOCIAL_CH
  43889. + pwdinfo->p2p_info.operation_ch[2] = 0;
  43890. + pwdinfo->p2p_info.operation_ch[3] = 0;
  43891. + pwdinfo->p2p_info.operation_ch[4] = 0;
  43892. +#endif //P2P_OP_CHECK_SOCIAL_CH
  43893. + pwdinfo->p2p_info.scan_op_ch_only = 0;
  43894. +}
  43895. +
  43896. +#ifdef CONFIG_DBG_P2P
  43897. +
  43898. +/**
  43899. + * rtw_p2p_role_txt - Get the p2p role name as a text string
  43900. + * @role: P2P role
  43901. + * Returns: The state name as a printable text string
  43902. + */
  43903. +const char * rtw_p2p_role_txt(enum P2P_ROLE role)
  43904. +{
  43905. + switch (role) {
  43906. + case P2P_ROLE_DISABLE:
  43907. + return "P2P_ROLE_DISABLE";
  43908. + case P2P_ROLE_DEVICE:
  43909. + return "P2P_ROLE_DEVICE";
  43910. + case P2P_ROLE_CLIENT:
  43911. + return "P2P_ROLE_CLIENT";
  43912. + case P2P_ROLE_GO:
  43913. + return "P2P_ROLE_GO";
  43914. + default:
  43915. + return "UNKNOWN";
  43916. + }
  43917. +}
  43918. +
  43919. +/**
  43920. + * rtw_p2p_state_txt - Get the p2p state name as a text string
  43921. + * @state: P2P state
  43922. + * Returns: The state name as a printable text string
  43923. + */
  43924. +const char * rtw_p2p_state_txt(enum P2P_STATE state)
  43925. +{
  43926. + switch (state) {
  43927. + case P2P_STATE_NONE:
  43928. + return "P2P_STATE_NONE";
  43929. + case P2P_STATE_IDLE:
  43930. + return "P2P_STATE_IDLE";
  43931. + case P2P_STATE_LISTEN:
  43932. + return "P2P_STATE_LISTEN";
  43933. + case P2P_STATE_SCAN:
  43934. + return "P2P_STATE_SCAN";
  43935. + case P2P_STATE_FIND_PHASE_LISTEN:
  43936. + return "P2P_STATE_FIND_PHASE_LISTEN";
  43937. + case P2P_STATE_FIND_PHASE_SEARCH:
  43938. + return "P2P_STATE_FIND_PHASE_SEARCH";
  43939. + case P2P_STATE_TX_PROVISION_DIS_REQ:
  43940. + return "P2P_STATE_TX_PROVISION_DIS_REQ";
  43941. + case P2P_STATE_RX_PROVISION_DIS_RSP:
  43942. + return "P2P_STATE_RX_PROVISION_DIS_RSP";
  43943. + case P2P_STATE_RX_PROVISION_DIS_REQ:
  43944. + return "P2P_STATE_RX_PROVISION_DIS_REQ";
  43945. + case P2P_STATE_GONEGO_ING:
  43946. + return "P2P_STATE_GONEGO_ING";
  43947. + case P2P_STATE_GONEGO_OK:
  43948. + return "P2P_STATE_GONEGO_OK";
  43949. + case P2P_STATE_GONEGO_FAIL:
  43950. + return "P2P_STATE_GONEGO_FAIL";
  43951. + case P2P_STATE_RECV_INVITE_REQ_MATCH:
  43952. + return "P2P_STATE_RECV_INVITE_REQ_MATCH";
  43953. + case P2P_STATE_PROVISIONING_ING:
  43954. + return "P2P_STATE_PROVISIONING_ING";
  43955. + case P2P_STATE_PROVISIONING_DONE:
  43956. + return "P2P_STATE_PROVISIONING_DONE";
  43957. + case P2P_STATE_TX_INVITE_REQ:
  43958. + return "P2P_STATE_TX_INVITE_REQ";
  43959. + case P2P_STATE_RX_INVITE_RESP_OK:
  43960. + return "P2P_STATE_RX_INVITE_RESP_OK";
  43961. + case P2P_STATE_RECV_INVITE_REQ_DISMATCH:
  43962. + return "P2P_STATE_RECV_INVITE_REQ_DISMATCH";
  43963. + case P2P_STATE_RECV_INVITE_REQ_GO:
  43964. + return "P2P_STATE_RECV_INVITE_REQ_GO";
  43965. + case P2P_STATE_RECV_INVITE_REQ_JOIN:
  43966. + return "P2P_STATE_RECV_INVITE_REQ_JOIN";
  43967. + case P2P_STATE_RX_INVITE_RESP_FAIL:
  43968. + return "P2P_STATE_RX_INVITE_RESP_FAIL";
  43969. + case P2P_STATE_RX_INFOR_NOREADY:
  43970. + return "P2P_STATE_RX_INFOR_NOREADY";
  43971. + case P2P_STATE_TX_INFOR_NOREADY:
  43972. + return "P2P_STATE_TX_INFOR_NOREADY";
  43973. + default:
  43974. + return "UNKNOWN";
  43975. + }
  43976. +}
  43977. +
  43978. +void dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line)
  43979. +{
  43980. + if(!_rtw_p2p_chk_state(wdinfo, state)) {
  43981. + enum P2P_STATE old_state = _rtw_p2p_state(wdinfo);
  43982. + _rtw_p2p_set_state(wdinfo, state);
  43983. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state from %s to %s\n", caller, line
  43984. + , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_state(wdinfo))
  43985. + );
  43986. + } else {
  43987. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state to same state %s\n", caller, line
  43988. + , rtw_p2p_state_txt(_rtw_p2p_state(wdinfo))
  43989. + );
  43990. + }
  43991. +}
  43992. +void dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line)
  43993. +{
  43994. + if(_rtw_p2p_pre_state(wdinfo) != state) {
  43995. + enum P2P_STATE old_state = _rtw_p2p_pre_state(wdinfo);
  43996. + _rtw_p2p_set_pre_state(wdinfo, state);
  43997. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state from %s to %s\n", caller, line
  43998. + , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo))
  43999. + );
  44000. + } else {
  44001. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state to same state %s\n", caller, line
  44002. + , rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo))
  44003. + );
  44004. + }
  44005. +}
  44006. +#if 0
  44007. +void dbg_rtw_p2p_restore_state(struct wifidirect_info *wdinfo, const char *caller, int line)
  44008. +{
  44009. + if(wdinfo->pre_p2p_state != -1) {
  44010. + DBG_871X("[CONFIG_DBG_P2P]%s:%d restore from %s to %s\n", caller, line
  44011. + , p2p_state_str[wdinfo->p2p_state], p2p_state_str[wdinfo->pre_p2p_state]
  44012. + );
  44013. + _rtw_p2p_restore_state(wdinfo);
  44014. + } else {
  44015. + DBG_871X("[CONFIG_DBG_P2P]%s:%d restore no pre state, cur state %s\n", caller, line
  44016. + , p2p_state_str[wdinfo->p2p_state]
  44017. + );
  44018. + }
  44019. +}
  44020. +#endif
  44021. +void dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, const char *caller, int line)
  44022. +{
  44023. + if(wdinfo->role != role) {
  44024. + enum P2P_ROLE old_role = wdinfo->role;
  44025. + _rtw_p2p_set_role(wdinfo, role);
  44026. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role from %s to %s\n", caller, line
  44027. + , rtw_p2p_role_txt(old_role), rtw_p2p_role_txt(wdinfo->role)
  44028. + );
  44029. + } else {
  44030. + DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role to same role %s\n", caller, line
  44031. + , rtw_p2p_role_txt(wdinfo->role)
  44032. + );
  44033. + }
  44034. +}
  44035. +#endif //CONFIG_DBG_P2P
  44036. +
  44037. +
  44038. +int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
  44039. +{
  44040. + int ret = _SUCCESS;
  44041. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  44042. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44043. +
  44044. + if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT|| role == P2P_ROLE_GO)
  44045. + {
  44046. + u8 channel, ch_offset;
  44047. + u16 bwmode;
  44048. +
  44049. +#ifdef CONFIG_CONCURRENT_MODE
  44050. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  44051. + struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  44052. + // Commented by Albert 2011/12/30
  44053. + // The driver just supports 1 P2P group operation.
  44054. + // So, this function will do nothing if the buddy adapter had enabled the P2P function.
  44055. + if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE))
  44056. + {
  44057. + // The buddy adapter had enabled the P2P function.
  44058. + return ret;
  44059. + }
  44060. +#endif //CONFIG_CONCURRENT_MODE
  44061. +
  44062. + //leave IPS/Autosuspend
  44063. + if (_FAIL == rtw_pwr_wakeup(padapter)) {
  44064. + ret = _FAIL;
  44065. + goto exit;
  44066. + }
  44067. +
  44068. +
  44069. + // Added by Albert 2011/03/22
  44070. + // In the P2P mode, the driver should not support the b mode.
  44071. + // So, the Tx packet shouldn't use the CCK rate
  44072. + update_tx_basic_rate(padapter, WIRELESS_11AGN);
  44073. +
  44074. + //Enable P2P function
  44075. + init_wifidirect_info(padapter, role);
  44076. + }
  44077. + else if (role == P2P_ROLE_DISABLE)
  44078. + {
  44079. +#ifdef CONFIG_INTEL_WIDI
  44080. + if( padapter->mlmepriv.p2p_reject_disable == _TRUE )
  44081. + return ret;
  44082. +#endif //CONFIG_INTEL_WIDI
  44083. +
  44084. + if (_FAIL == rtw_pwr_wakeup(padapter)) {
  44085. + ret = _FAIL;
  44086. + goto exit;
  44087. + }
  44088. +
  44089. + //Disable P2P function
  44090. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  44091. + {
  44092. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  44093. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  44094. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  44095. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey);
  44096. + _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey2);
  44097. + reset_ch_sitesurvey_timer_process( padapter );
  44098. + reset_ch_sitesurvey_timer_process2( padapter );
  44099. + #ifdef CONFIG_CONCURRENT_MODE
  44100. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer);
  44101. + #endif
  44102. + rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
  44103. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
  44104. + _rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
  44105. + }
  44106. +
  44107. + //Restore to initial setting.
  44108. + update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
  44109. +
  44110. +#ifdef CONFIG_INTEL_WIDI
  44111. + rtw_reset_widi_info(padapter);
  44112. +#endif //CONFIG_INTEL_WIDI
  44113. +
  44114. + //For WiDi purpose.
  44115. +#ifdef CONFIG_IOCTL_CFG80211
  44116. + pwdinfo->driver_interface = DRIVER_CFG80211;
  44117. +#else
  44118. + pwdinfo->driver_interface = DRIVER_WEXT;
  44119. +#endif //CONFIG_IOCTL_CFG80211
  44120. +
  44121. + }
  44122. +
  44123. +exit:
  44124. + return ret;
  44125. +}
  44126. +
  44127. +#endif //CONFIG_P2P
  44128. --- /dev/null
  44129. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c
  44130. @@ -0,0 +1,1538 @@
  44131. +/******************************************************************************
  44132. + *
  44133. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  44134. + *
  44135. + * This program is free software; you can redistribute it and/or modify it
  44136. + * under the terms of version 2 of the GNU General Public License as
  44137. + * published by the Free Software Foundation.
  44138. + *
  44139. + * This program is distributed in the hope that it will be useful, but WITHOUT
  44140. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  44141. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  44142. + * more details.
  44143. + *
  44144. + * You should have received a copy of the GNU General Public License along with
  44145. + * this program; if not, write to the Free Software Foundation, Inc.,
  44146. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  44147. + *
  44148. + *
  44149. + ******************************************************************************/
  44150. +#define _RTW_PWRCTRL_C_
  44151. +
  44152. +#include <drv_conf.h>
  44153. +#include <osdep_service.h>
  44154. +#include <drv_types.h>
  44155. +#include <osdep_intf.h>
  44156. +
  44157. +
  44158. +#ifdef CONFIG_IPS
  44159. +void _ips_enter(_adapter * padapter)
  44160. +{
  44161. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44162. +
  44163. + pwrpriv->bips_processing = _TRUE;
  44164. +
  44165. + // syn ips_mode with request
  44166. + pwrpriv->ips_mode = pwrpriv->ips_mode_req;
  44167. +
  44168. + pwrpriv->ips_enter_cnts++;
  44169. + DBG_871X("==>ips_enter cnts:%d\n",pwrpriv->ips_enter_cnts);
  44170. +
  44171. + if(rf_off == pwrpriv->change_rfpwrstate)
  44172. + {
  44173. + if(pwrpriv->ips_mode == IPS_LEVEL_2)
  44174. + pwrpriv->bkeepfwalive = _TRUE;
  44175. +
  44176. + rtw_ips_pwr_down(padapter);
  44177. + pwrpriv->rf_pwrstate = rf_off;
  44178. + }
  44179. + pwrpriv->bips_processing = _FALSE;
  44180. +
  44181. +}
  44182. +
  44183. +void ips_enter(_adapter * padapter)
  44184. +{
  44185. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44186. +
  44187. + _enter_pwrlock(&pwrpriv->lock);
  44188. + _ips_enter(padapter);
  44189. + _exit_pwrlock(&pwrpriv->lock);
  44190. +}
  44191. +
  44192. +int _ips_leave(_adapter * padapter)
  44193. +{
  44194. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44195. + int result = _SUCCESS;
  44196. +
  44197. + if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing))
  44198. + {
  44199. + pwrpriv->bips_processing = _TRUE;
  44200. + pwrpriv->change_rfpwrstate = rf_on;
  44201. + pwrpriv->ips_leave_cnts++;
  44202. + DBG_871X("==>ips_leave cnts:%d\n",pwrpriv->ips_leave_cnts);
  44203. +
  44204. + if ((result = rtw_ips_pwr_up(padapter)) == _SUCCESS) {
  44205. + pwrpriv->rf_pwrstate = rf_on;
  44206. + }
  44207. +
  44208. + DBG_871X("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c));
  44209. + pwrpriv->bips_processing = _FALSE;
  44210. +
  44211. + pwrpriv->bkeepfwalive = _FALSE;
  44212. + }
  44213. +
  44214. + return result;
  44215. +}
  44216. +
  44217. +int ips_leave(_adapter * padapter)
  44218. +{
  44219. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44220. + int ret;
  44221. +
  44222. + _enter_pwrlock(&pwrpriv->lock);
  44223. + ret = _ips_leave(padapter);
  44224. + _exit_pwrlock(&pwrpriv->lock);
  44225. +
  44226. + return ret;
  44227. +}
  44228. +#endif /* CONFIG_IPS */
  44229. +
  44230. +#ifdef CONFIG_AUTOSUSPEND
  44231. +extern void autosuspend_enter(_adapter* padapter);
  44232. +extern int autoresume_enter(_adapter* padapter);
  44233. +#endif
  44234. +
  44235. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  44236. +int rtw_hw_suspend(_adapter *padapter );
  44237. +int rtw_hw_resume(_adapter *padapter);
  44238. +#endif
  44239. +
  44240. +bool rtw_pwr_unassociated_idle(_adapter *adapter)
  44241. +{
  44242. + _adapter *buddy = adapter->pbuddy_adapter;
  44243. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  44244. +#ifdef CONFIG_P2P
  44245. + struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
  44246. +#ifdef CONFIG_IOCTL_CFG80211
  44247. + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &adapter->cfg80211_wdinfo;
  44248. +#endif
  44249. +#endif
  44250. +
  44251. + bool ret = _FALSE;
  44252. +
  44253. + if (adapter->pwrctrlpriv.ips_deny_time >= rtw_get_current_time()) {
  44254. + //DBG_871X("%s ips_deny_time\n", __func__);
  44255. + goto exit;
  44256. + }
  44257. +
  44258. + if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
  44259. + || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
  44260. + || check_fwstate(pmlmepriv, WIFI_AP_STATE)
  44261. + || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
  44262. + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)
  44263. + || pcfg80211_wdinfo->is_ro_ch
  44264. + #elif defined(CONFIG_P2P)
  44265. + || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
  44266. + #endif
  44267. + ) {
  44268. + goto exit;
  44269. + }
  44270. +
  44271. + /* consider buddy, if exist */
  44272. + if (buddy) {
  44273. + struct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv);
  44274. + #ifdef CONFIG_P2P
  44275. + struct wifidirect_info *b_pwdinfo = &(buddy->wdinfo);
  44276. + #ifdef CONFIG_IOCTL_CFG80211
  44277. + struct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo;
  44278. + #endif
  44279. + #endif
  44280. +
  44281. + if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
  44282. + || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
  44283. + || check_fwstate(b_pmlmepriv, WIFI_AP_STATE)
  44284. + || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
  44285. + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)
  44286. + || b_pcfg80211_wdinfo->is_ro_ch
  44287. + #elif defined(CONFIG_P2P)
  44288. + || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)
  44289. + #endif
  44290. + ) {
  44291. + goto exit;
  44292. + }
  44293. + }
  44294. +
  44295. +#ifdef CONFIG_INTEL_PROXIM
  44296. + if(adapter->proximity.proxim_on==_TRUE){
  44297. + return;
  44298. + }
  44299. +#endif
  44300. +
  44301. + ret = _TRUE;
  44302. +
  44303. +exit:
  44304. + return ret;
  44305. +}
  44306. +
  44307. +#if defined (PLATFORM_LINUX)||defined (PLATFORM_FREEBSD)
  44308. +void rtw_ps_processor(_adapter*padapter)
  44309. +{
  44310. +#ifdef CONFIG_P2P
  44311. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  44312. +#endif //CONFIG_P2P
  44313. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44314. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  44315. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  44316. + rt_rf_power_state rfpwrstate;
  44317. +#endif //SUPPORT_HW_RFOFF_DETECTED
  44318. +
  44319. + pwrpriv->ps_processing = _TRUE;
  44320. +
  44321. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  44322. + if(pwrpriv->bips_processing == _TRUE)
  44323. + goto exit;
  44324. +
  44325. + //DBG_871X("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca));
  44326. + if(padapter->pwrctrlpriv.bHWPwrPindetect)
  44327. + {
  44328. + #ifdef CONFIG_AUTOSUSPEND
  44329. + if(padapter->registrypriv.usbss_enable)
  44330. + {
  44331. + if(pwrpriv->rf_pwrstate == rf_on)
  44332. + {
  44333. + if(padapter->net_closed == _TRUE)
  44334. + pwrpriv->ps_flag = _TRUE;
  44335. +
  44336. + rfpwrstate = RfOnOffDetect(padapter);
  44337. + DBG_871X("@@@@- #1 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off");
  44338. + if(rfpwrstate!= pwrpriv->rf_pwrstate)
  44339. + {
  44340. + if(rfpwrstate == rf_off)
  44341. + {
  44342. + pwrpriv->change_rfpwrstate = rf_off;
  44343. +
  44344. + pwrpriv->bkeepfwalive = _TRUE;
  44345. + pwrpriv->brfoffbyhw = _TRUE;
  44346. +
  44347. + autosuspend_enter(padapter);
  44348. + }
  44349. + }
  44350. + }
  44351. + }
  44352. + else
  44353. + #endif //CONFIG_AUTOSUSPEND
  44354. + {
  44355. + rfpwrstate = RfOnOffDetect(padapter);
  44356. + DBG_871X("@@@@- #2 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off");
  44357. +
  44358. + if(rfpwrstate!= pwrpriv->rf_pwrstate)
  44359. + {
  44360. + if(rfpwrstate == rf_off)
  44361. + {
  44362. + pwrpriv->change_rfpwrstate = rf_off;
  44363. + pwrpriv->brfoffbyhw = _TRUE;
  44364. + padapter->bCardDisableWOHSM = _TRUE;
  44365. + rtw_hw_suspend(padapter );
  44366. + }
  44367. + else
  44368. + {
  44369. + pwrpriv->change_rfpwrstate = rf_on;
  44370. + rtw_hw_resume(padapter );
  44371. + }
  44372. + DBG_871X("current rf_pwrstate(%s)\n",(pwrpriv->rf_pwrstate == rf_off)?"rf_off":"rf_on");
  44373. + }
  44374. + }
  44375. + pwrpriv->pwr_state_check_cnts ++;
  44376. + }
  44377. +#endif //SUPPORT_HW_RFOFF_DETECTED
  44378. +
  44379. + if (pwrpriv->ips_mode_req == IPS_NONE
  44380. + #ifdef CONFIG_CONCURRENT_MODE
  44381. + || padapter->pbuddy_adapter->pwrctrlpriv.ips_mode_req == IPS_NONE
  44382. + #endif
  44383. + )
  44384. + goto exit;
  44385. +
  44386. + if (rtw_pwr_unassociated_idle(padapter) == _FALSE)
  44387. + goto exit;
  44388. +
  44389. + if((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0))
  44390. + {
  44391. + DBG_871X("==>%s .fw_state(%x)\n",__FUNCTION__,get_fwstate(pmlmepriv));
  44392. + pwrpriv->change_rfpwrstate = rf_off;
  44393. +
  44394. + #ifdef CONFIG_AUTOSUSPEND
  44395. + if(padapter->registrypriv.usbss_enable)
  44396. + {
  44397. + if(pwrpriv->bHWPwrPindetect)
  44398. + pwrpriv->bkeepfwalive = _TRUE;
  44399. +
  44400. + if(padapter->net_closed == _TRUE)
  44401. + pwrpriv->ps_flag = _TRUE;
  44402. +
  44403. + padapter->bCardDisableWOHSM = _TRUE;
  44404. + autosuspend_enter(padapter);
  44405. + }
  44406. + else if(pwrpriv->bHWPwrPindetect)
  44407. + {
  44408. + }
  44409. + else
  44410. + #endif //CONFIG_AUTOSUSPEND
  44411. + {
  44412. + #ifdef CONFIG_IPS
  44413. + ips_enter(padapter);
  44414. + #endif
  44415. + }
  44416. + }
  44417. +exit:
  44418. + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
  44419. + pwrpriv->ps_processing = _FALSE;
  44420. + return;
  44421. +}
  44422. +
  44423. +void pwr_state_check_handler(void *FunctionContext);
  44424. +void pwr_state_check_handler(void *FunctionContext)
  44425. +{
  44426. + _adapter *padapter = (_adapter *)FunctionContext;
  44427. + rtw_ps_cmd(padapter);
  44428. +}
  44429. +#endif
  44430. +
  44431. +
  44432. +#ifdef CONFIG_LPS
  44433. +/*
  44434. + *
  44435. + * Parameters
  44436. + * padapter
  44437. + * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4
  44438. + *
  44439. + */
  44440. +void rtw_set_rpwm(PADAPTER padapter, u8 pslv)
  44441. +{
  44442. + u8 rpwm;
  44443. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44444. +
  44445. +_func_enter_;
  44446. +
  44447. + pslv = PS_STATE(pslv);
  44448. +
  44449. + if (pwrpriv->rpwm == pslv) {
  44450. + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,
  44451. + ("%s: Already set rpwm[0x%02x]!\n", __FUNCTION__, pslv));
  44452. + return;
  44453. + }
  44454. +
  44455. + if ((padapter->bDriverStopped == _TRUE) ||
  44456. + (padapter->bSurpriseRemoved == _TRUE)) {
  44457. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,
  44458. + ("%s: bDriverStopped(%d) bSurpriseRemoved(%d)\n",
  44459. + __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved));
  44460. + return;
  44461. + }
  44462. +
  44463. + rpwm = pslv | pwrpriv->tog;
  44464. +#ifdef CONFIG_LPS_LCLK
  44465. + if ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2))
  44466. + rpwm |= PS_ACK;
  44467. +#endif
  44468. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  44469. + ("rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\n", rpwm, pwrpriv->cpwm));
  44470. +
  44471. + pwrpriv->rpwm = pslv;
  44472. +
  44473. + rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm));
  44474. +
  44475. + pwrpriv->tog += 0x80;
  44476. +
  44477. + if (!(rpwm & PS_ACK)) pwrpriv->cpwm = pslv;
  44478. +
  44479. +_func_exit_;
  44480. +}
  44481. +
  44482. +u8 PS_RDY_CHECK(_adapter * padapter);
  44483. +u8 PS_RDY_CHECK(_adapter * padapter)
  44484. +{
  44485. + u32 curr_time, delta_time;
  44486. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44487. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  44488. +
  44489. + curr_time = rtw_get_current_time();
  44490. +
  44491. + delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp;
  44492. +
  44493. + if(delta_time < LPS_DELAY_TIME)
  44494. + {
  44495. + return _FALSE;
  44496. + }
  44497. +
  44498. + if ((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) ||
  44499. + (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) ||
  44500. + (check_fwstate(pmlmepriv, WIFI_UNDER_WPS) == _TRUE) ||
  44501. + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ||
  44502. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
  44503. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) )
  44504. + return _FALSE;
  44505. +
  44506. + if(_TRUE == pwrpriv->bInSuspend )
  44507. + return _FALSE;
  44508. +
  44509. + if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) )
  44510. + {
  44511. + DBG_871X("Group handshake still in progress !!!\n");
  44512. + return _FALSE;
  44513. + }
  44514. +
  44515. +#ifdef CONFIG_IOCTL_CFG80211
  44516. + if (!rtw_cfg80211_pwr_mgmt(padapter))
  44517. + return _FALSE;
  44518. +#endif
  44519. +
  44520. + return _TRUE;
  44521. +}
  44522. +
  44523. +void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps)
  44524. +{
  44525. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44526. +#ifdef CONFIG_P2P
  44527. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  44528. +#endif //CONFIG_P2P
  44529. +#ifdef CONFIG_TDLS
  44530. + struct sta_priv *pstapriv = &padapter->stapriv;
  44531. + _irqL irqL;
  44532. + int i, j;
  44533. + _list *plist, *phead;
  44534. + struct sta_info *ptdls_sta;
  44535. +#endif //CONFIG_TDLS
  44536. +
  44537. +_func_enter_;
  44538. +
  44539. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  44540. + ("%s: PowerMode=%d Smart_PS=%d\n",
  44541. + __FUNCTION__, ps_mode, smart_ps));
  44542. +
  44543. + if(ps_mode > PM_Card_Disable) {
  44544. + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode));
  44545. + return;
  44546. + }
  44547. +
  44548. + if((pwrpriv->pwr_mode == ps_mode) &&
  44549. + (pwrpriv->smart_ps == smart_ps)){
  44550. + return;
  44551. + }
  44552. +
  44553. + //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE)
  44554. + if(ps_mode == PS_MODE_ACTIVE)
  44555. + {
  44556. +#ifdef CONFIG_P2P_PS
  44557. + if(pwdinfo->opp_ps == 0)
  44558. +#endif // CONFIG_P2P_PS
  44559. + {
  44560. +#ifdef CONFIG_LPS_LCLK
  44561. + _enter_pwrlock(&pwrpriv->lock);
  44562. +#endif
  44563. + DBG_871X("rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..\n");
  44564. +
  44565. +#ifdef CONFIG_TDLS
  44566. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  44567. +
  44568. + for(i=0; i< NUM_STA; i++)
  44569. + {
  44570. + phead = &(pstapriv->sta_hash[i]);
  44571. + plist = get_next(phead);
  44572. +
  44573. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  44574. + {
  44575. + ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  44576. +
  44577. + if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )
  44578. + issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0);
  44579. + plist = get_next(plist);
  44580. + }
  44581. + }
  44582. +
  44583. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  44584. +#endif //CONFIG_TDLS
  44585. +
  44586. + pwrpriv->smart_ps = smart_ps;
  44587. + pwrpriv->pwr_mode = ps_mode;
  44588. +
  44589. + rtw_set_rpwm(padapter, PS_STATE_S4);
  44590. +#ifdef CONFIG_LPS_LCLK
  44591. +{
  44592. + u32 n = 0;
  44593. + while (pwrpriv->cpwm != PS_STATE_S4) {
  44594. + n++;
  44595. + if (n == 10000) break;
  44596. + if (padapter->bSurpriseRemoved == _TRUE) break;
  44597. + rtw_msleep_os(1);
  44598. + }
  44599. + if (n == 10000)
  44600. + printk(KERN_ERR "%s: wait CPWM to S4 too long! cpwm=0x%02x\n", __func__, pwrpriv->cpwm);
  44601. +}
  44602. +#endif
  44603. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
  44604. + pwrpriv->bFwCurrentInPSMode = _FALSE;
  44605. +#ifdef CONFIG_LPS_LCLK
  44606. + _exit_pwrlock(&pwrpriv->lock);
  44607. +#endif
  44608. + }
  44609. + }
  44610. + else
  44611. + {
  44612. + if(PS_RDY_CHECK(padapter))
  44613. + {
  44614. +#ifdef CONFIG_LPS_LCLK
  44615. + _enter_pwrlock(&pwrpriv->lock);
  44616. +#endif
  44617. + DBG_871X("rtw_set_ps_mode(): Enter 802.11 power save mode...\n");
  44618. +
  44619. +#ifdef CONFIG_TDLS
  44620. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  44621. +
  44622. + for(i=0; i< NUM_STA; i++)
  44623. + {
  44624. + phead = &(pstapriv->sta_hash[i]);
  44625. + plist = get_next(phead);
  44626. +
  44627. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  44628. + {
  44629. + ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  44630. +
  44631. + if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )
  44632. + issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 1);
  44633. + plist = get_next(plist);
  44634. + }
  44635. + }
  44636. +
  44637. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  44638. +#endif //CONFIG_TDLS
  44639. +
  44640. + pwrpriv->smart_ps = smart_ps;
  44641. + pwrpriv->pwr_mode = ps_mode;
  44642. + pwrpriv->bFwCurrentInPSMode = _TRUE;
  44643. + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
  44644. +#ifdef CONFIG_P2P_PS
  44645. + // Set CTWindow after LPS
  44646. + if(pwdinfo->opp_ps == 1)
  44647. + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0);
  44648. +#endif // CONFIG_P2P_PS
  44649. +#ifdef CONFIG_LPS_LCLK
  44650. + if (pwrpriv->alives == 0)
  44651. + rtw_set_rpwm(padapter, PS_STATE_S0);
  44652. +#else
  44653. + rtw_set_rpwm(padapter, PS_STATE_S2);
  44654. +#endif
  44655. +#ifdef CONFIG_LPS_LCLK
  44656. + _exit_pwrlock(&pwrpriv->lock);
  44657. +#endif
  44658. + }
  44659. + //else
  44660. + //{
  44661. + // pwrpriv->pwr_mode = PS_MODE_ACTIVE;
  44662. + //}
  44663. + }
  44664. +
  44665. +_func_exit_;
  44666. +}
  44667. +
  44668. +
  44669. +//
  44670. +// Description:
  44671. +// Enter the leisure power save mode.
  44672. +//
  44673. +void LPS_Enter(PADAPTER padapter)
  44674. +{
  44675. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44676. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  44677. + _adapter *buddy = padapter->pbuddy_adapter;
  44678. +
  44679. +_func_enter_;
  44680. +
  44681. +// DBG_871X("+LeisurePSEnter\n");
  44682. +
  44683. +#ifdef CONFIG_CONCURRENT_MODE
  44684. + if (padapter->iface_type != IFACE_PORT0)
  44685. + return; /* Skip power saving for concurrent mode port 1*/
  44686. +
  44687. + /* consider buddy, if exist */
  44688. + if (buddy) {
  44689. + struct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv);
  44690. + #ifdef CONFIG_P2P
  44691. + struct wifidirect_info *b_pwdinfo = &(buddy->wdinfo);
  44692. + #ifdef CONFIG_IOCTL_CFG80211
  44693. + struct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo;
  44694. + #endif
  44695. + #endif
  44696. +
  44697. + if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
  44698. + || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
  44699. + || check_fwstate(b_pmlmepriv, WIFI_AP_STATE)
  44700. + || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
  44701. + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)
  44702. + || b_pcfg80211_wdinfo->is_ro_ch
  44703. + #elif defined(CONFIG_P2P)
  44704. + || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)
  44705. + #endif
  44706. + || rtw_is_scan_deny(buddy)
  44707. + ) {
  44708. + return;
  44709. + }
  44710. + }
  44711. +#endif
  44712. +
  44713. +#ifdef CONFIG_INTEL_PROXIM
  44714. + if(padapter->proximity.proxim_on==_TRUE){
  44715. + return;
  44716. + }
  44717. +#endif
  44718. + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) ||
  44719. + (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) ||
  44720. + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ||
  44721. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
  44722. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) )
  44723. + return;
  44724. +
  44725. + if(_TRUE == pwrpriv->bInSuspend )
  44726. + return ;
  44727. +
  44728. + if (pwrpriv->bLeisurePs)
  44729. + {
  44730. + // Idle for a while if we connect to AP a while ago.
  44731. + if(pwrpriv->LpsIdleCount >= 2) // 4 Sec
  44732. + {
  44733. + if(pwrpriv->pwr_mode == PS_MODE_ACTIVE)
  44734. + {
  44735. + rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, 2);
  44736. + }
  44737. + }
  44738. + else
  44739. + pwrpriv->LpsIdleCount++;
  44740. + }
  44741. +
  44742. +// DBG_871X("-LeisurePSEnter\n");
  44743. +
  44744. +_func_exit_;
  44745. +}
  44746. +
  44747. +
  44748. +//
  44749. +// Description:
  44750. +// Leave the leisure power save mode.
  44751. +//
  44752. +void LPS_Leave(PADAPTER padapter)
  44753. +{
  44754. +#define LPS_LEAVE_TIMEOUT_MS 100
  44755. +
  44756. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  44757. + u32 start_time;
  44758. + BOOLEAN bAwake = _FALSE;
  44759. +
  44760. +_func_enter_;
  44761. +
  44762. +// DBG_871X("+LeisurePSLeave\n");
  44763. +
  44764. +#ifdef CONFIG_CONCURRENT_MODE
  44765. + if (padapter->iface_type != IFACE_PORT0)
  44766. + return; /* Skip power saving for concurrent mode port 1*/
  44767. +#endif
  44768. +
  44769. + if (pwrpriv->bLeisurePs)
  44770. + {
  44771. + if(pwrpriv->pwr_mode != PS_MODE_ACTIVE)
  44772. + {
  44773. + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0);
  44774. +
  44775. + if(pwrpriv->pwr_mode == PS_MODE_ACTIVE)
  44776. + {
  44777. + start_time = rtw_get_current_time();
  44778. + while(1)
  44779. + {
  44780. + rtw_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake));
  44781. +
  44782. + if(bAwake || padapter->bSurpriseRemoved)
  44783. + break;
  44784. +
  44785. + if(rtw_get_passing_time_ms(start_time)>LPS_LEAVE_TIMEOUT_MS)
  44786. + {
  44787. + DBG_871X("Wait for FW LPS leave more than %u ms!!!\n", LPS_LEAVE_TIMEOUT_MS);
  44788. + break;
  44789. + }
  44790. + rtw_usleep_os(100);
  44791. + }
  44792. + }
  44793. + }
  44794. + }
  44795. +
  44796. +
  44797. +// DBG_871X("-LeisurePSLeave\n");
  44798. +
  44799. +_func_exit_;
  44800. +}
  44801. +
  44802. +#endif
  44803. +
  44804. +//
  44805. +// Description: Leave all power save mode: LPS, FwLPS, IPS if needed.
  44806. +// Move code to function by tynli. 2010.03.26.
  44807. +//
  44808. +void LeaveAllPowerSaveMode(IN PADAPTER Adapter)
  44809. +{
  44810. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  44811. +
  44812. +_func_enter_;
  44813. +
  44814. + //DBG_871X("%s.....\n",__FUNCTION__);
  44815. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  44816. + { //connect
  44817. +#ifdef CONFIG_P2P_PS
  44818. + p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, 0);
  44819. +#endif // CONFIG_P2P_PS
  44820. +#ifdef CONFIG_LPS
  44821. + //DBG_871X("==> leave LPS.......\n");
  44822. + LPS_Leave(Adapter);
  44823. +#endif
  44824. + }
  44825. + else
  44826. + {
  44827. + if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off)
  44828. + {
  44829. + #ifdef CONFIG_AUTOSUSPEND
  44830. + if(Adapter->registrypriv.usbss_enable)
  44831. + {
  44832. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  44833. + usb_disable_autosuspend(adapter_to_dvobj(Adapter)->pusbdev);
  44834. + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))
  44835. + adapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user
  44836. + #endif
  44837. + }
  44838. + else
  44839. + #endif
  44840. + {
  44841. + /*
  44842. + #ifdef CONFIG_IPS
  44843. + if(_FALSE == ips_leave(Adapter))
  44844. + {
  44845. + DBG_871X("======> ips_leave fail.............\n");
  44846. + }
  44847. + #endif
  44848. + */
  44849. + }
  44850. + }
  44851. + }
  44852. +
  44853. +_func_exit_;
  44854. +}
  44855. +
  44856. +#ifdef CONFIG_LPS_LCLK
  44857. +/*
  44858. + * Caller:ISR handler...
  44859. + *
  44860. + * This will be called when CPWM interrupt is up.
  44861. + *
  44862. + * using to update cpwn of drv; and drv willl make a decision to up or down pwr level
  44863. + */
  44864. +void cpwm_int_hdl(
  44865. + PADAPTER padapter,
  44866. + struct reportpwrstate_parm *preportpwrstate)
  44867. +{
  44868. + struct pwrctrl_priv *pwrpriv;
  44869. +
  44870. +
  44871. +_func_enter_;
  44872. +
  44873. + pwrpriv = &padapter->pwrctrlpriv;
  44874. +#if 0
  44875. + if (pwrpriv->cpwm_tog == (preportpwrstate->state & PS_TOGGLE)) {
  44876. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,
  44877. + ("cpwm_int_hdl: tog(old)=0x%02x cpwm(new)=0x%02x toggle bit didn't change!?\n",
  44878. + pwrpriv->cpwm_tog, preportpwrstate->state));
  44879. + goto exit;
  44880. + }
  44881. +#endif
  44882. +// _enter_pwrlock(&pwrpriv->lock);
  44883. +
  44884. + pwrpriv->cpwm = PS_STATE(preportpwrstate->state);
  44885. + pwrpriv->cpwm_tog = preportpwrstate->state & PS_TOGGLE;
  44886. +
  44887. + if (pwrpriv->cpwm >= PS_STATE_S2) {
  44888. + if (pwrpriv->alives & CMD_ALIVE)
  44889. + _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema);
  44890. +
  44891. + if (pwrpriv->alives & XMIT_ALIVE)
  44892. + _rtw_up_sema(&padapter->xmitpriv.xmit_sema);
  44893. + }
  44894. +
  44895. +// _exit_pwrlock(&pwrpriv->lock);
  44896. +
  44897. +exit:
  44898. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  44899. + ("cpwm_int_hdl: cpwm=0x%02x\n", pwrpriv->cpwm));
  44900. +
  44901. +_func_exit_;
  44902. +}
  44903. +
  44904. +__inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag)
  44905. +{
  44906. + pwrctrl->alives |= tag;
  44907. +}
  44908. +
  44909. +__inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag)
  44910. +{
  44911. + pwrctrl->alives &= ~tag;
  44912. +}
  44913. +
  44914. +/*
  44915. + * Caller: rtw_xmit_thread
  44916. + *
  44917. + * Check if the fw_pwrstate is okay for xmit.
  44918. + * If not (cpwm is less than S3), then the sub-routine
  44919. + * will raise the cpwm to be greater than or equal to S3.
  44920. + *
  44921. + * Calling Context: Passive
  44922. + *
  44923. + * Return Value:
  44924. + * _SUCCESS rtw_xmit_thread can write fifo/txcmd afterwards.
  44925. + * _FAIL rtw_xmit_thread can not do anything.
  44926. + */
  44927. +s32 rtw_register_tx_alive(PADAPTER padapter)
  44928. +{
  44929. + s32 res;
  44930. + struct pwrctrl_priv *pwrctrl;
  44931. +
  44932. +_func_enter_;
  44933. +
  44934. + res = _SUCCESS;
  44935. + pwrctrl = &padapter->pwrctrlpriv;
  44936. +
  44937. + _enter_pwrlock(&pwrctrl->lock);
  44938. +
  44939. + register_task_alive(pwrctrl, XMIT_ALIVE);
  44940. +
  44941. + if (pwrctrl->bFwCurrentInPSMode == _TRUE)
  44942. + {
  44943. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,
  44944. + ("rtw_register_tx_alive: cpwm=0x%02x alives=0x%08x\n",
  44945. + pwrctrl->cpwm, pwrctrl->alives));
  44946. +
  44947. + if (pwrctrl->cpwm < PS_STATE_S2) {
  44948. + if (pwrctrl->rpwm < PS_STATE_S2)
  44949. + rtw_set_rpwm(padapter, PS_STATE_S2);
  44950. + res = _FAIL;
  44951. + }
  44952. + }
  44953. +
  44954. + _exit_pwrlock(&pwrctrl->lock);
  44955. +
  44956. +_func_exit_;
  44957. +
  44958. + return res;
  44959. +}
  44960. +
  44961. +/*
  44962. + * Caller: rtw_cmd_thread
  44963. + *
  44964. + * Check if the fw_pwrstate is okay for issuing cmd.
  44965. + * If not (cpwm should be is less than S2), then the sub-routine
  44966. + * will raise the cpwm to be greater than or equal to S2.
  44967. + *
  44968. + * Calling Context: Passive
  44969. + *
  44970. + * Return Value:
  44971. + * _SUCCESS rtw_cmd_thread can issue cmds to firmware afterwards.
  44972. + * _FAIL rtw_cmd_thread can not do anything.
  44973. + */
  44974. +s32 rtw_register_cmd_alive(PADAPTER padapter)
  44975. +{
  44976. + s32 res;
  44977. + struct pwrctrl_priv *pwrctrl;
  44978. +
  44979. +_func_enter_;
  44980. +
  44981. + res = _SUCCESS;
  44982. + pwrctrl = &padapter->pwrctrlpriv;
  44983. +
  44984. + _enter_pwrlock(&pwrctrl->lock);
  44985. +
  44986. + register_task_alive(pwrctrl, CMD_ALIVE);
  44987. +
  44988. + if (pwrctrl->bFwCurrentInPSMode == _TRUE)
  44989. + {
  44990. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  44991. + ("rtw_register_cmd_alive: cpwm=0x%02x alives=0x%08x\n",
  44992. + pwrctrl->cpwm, pwrctrl->alives));
  44993. +
  44994. + if (pwrctrl->cpwm < PS_STATE_S2) {
  44995. + if (pwrctrl->rpwm < PS_STATE_S2)
  44996. + rtw_set_rpwm(padapter, PS_STATE_S2);
  44997. + res = _FAIL;
  44998. + }
  44999. + }
  45000. +
  45001. + _exit_pwrlock(&pwrctrl->lock);
  45002. +
  45003. +_func_exit_;
  45004. +
  45005. + return res;
  45006. +}
  45007. +
  45008. +/*
  45009. + * Caller: rx_isr
  45010. + *
  45011. + * Calling Context: Dispatch/ISR
  45012. + *
  45013. + * Return Value:
  45014. + * _SUCCESS
  45015. + * _FAIL
  45016. + */
  45017. +s32 rtw_register_rx_alive(PADAPTER padapter)
  45018. +{
  45019. + struct pwrctrl_priv *pwrctrl;
  45020. +
  45021. +_func_enter_;
  45022. +
  45023. + pwrctrl = &padapter->pwrctrlpriv;
  45024. +
  45025. + _enter_pwrlock(&pwrctrl->lock);
  45026. +
  45027. + register_task_alive(pwrctrl, RECV_ALIVE);
  45028. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45029. + ("rtw_register_rx_alive: cpwm=0x%02x alives=0x%08x\n",
  45030. + pwrctrl->cpwm, pwrctrl->alives));
  45031. +
  45032. + _exit_pwrlock(&pwrctrl->lock);
  45033. +
  45034. +_func_exit_;
  45035. +
  45036. + return _SUCCESS;
  45037. +}
  45038. +
  45039. +/*
  45040. + * Caller: evt_isr or evt_thread
  45041. + *
  45042. + * Calling Context: Dispatch/ISR or Passive
  45043. + *
  45044. + * Return Value:
  45045. + * _SUCCESS
  45046. + * _FAIL
  45047. + */
  45048. +s32 rtw_register_evt_alive(PADAPTER padapter)
  45049. +{
  45050. + struct pwrctrl_priv *pwrctrl;
  45051. +
  45052. +_func_enter_;
  45053. +
  45054. + pwrctrl = &padapter->pwrctrlpriv;
  45055. +
  45056. + _enter_pwrlock(&pwrctrl->lock);
  45057. +
  45058. + register_task_alive(pwrctrl, EVT_ALIVE);
  45059. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45060. + ("rtw_register_evt_alive: cpwm=0x%02x alives=0x%08x\n",
  45061. + pwrctrl->cpwm, pwrctrl->alives));
  45062. +
  45063. + _exit_pwrlock(&pwrctrl->lock);
  45064. +
  45065. +_func_exit_;
  45066. +
  45067. + return _SUCCESS;
  45068. +}
  45069. +
  45070. +/*
  45071. + * Caller: ISR
  45072. + *
  45073. + * If ISR's txdone,
  45074. + * No more pkts for TX,
  45075. + * Then driver shall call this fun. to power down firmware again.
  45076. + */
  45077. +void rtw_unregister_tx_alive(PADAPTER padapter)
  45078. +{
  45079. + struct pwrctrl_priv *pwrctrl;
  45080. +
  45081. +_func_enter_;
  45082. +
  45083. + pwrctrl = &padapter->pwrctrlpriv;
  45084. +
  45085. + _enter_pwrlock(&pwrctrl->lock);
  45086. +
  45087. + unregister_task_alive(pwrctrl, XMIT_ALIVE);
  45088. +
  45089. + if ((pwrctrl->pwr_mode != PS_MODE_ACTIVE) &&
  45090. + (pwrctrl->bFwCurrentInPSMode == _TRUE))
  45091. + {
  45092. + if ((pwrctrl->alives == 0) &&
  45093. + (pwrctrl->cpwm > PS_STATE_S0))
  45094. + {
  45095. + rtw_set_rpwm(padapter, PS_STATE_S0);
  45096. + }
  45097. +
  45098. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45099. + ("rtw_unregister_tx_alive: cpwm=0x%02x alives=0x%08x\n",
  45100. + pwrctrl->cpwm, pwrctrl->alives));
  45101. + }
  45102. +
  45103. + _exit_pwrlock(&pwrctrl->lock);
  45104. +
  45105. +_func_exit_;
  45106. +}
  45107. +
  45108. +/*
  45109. + * Caller: ISR
  45110. + *
  45111. + * If all commands have been done,
  45112. + * and no more command to do,
  45113. + * then driver shall call this fun. to power down firmware again.
  45114. + */
  45115. +void rtw_unregister_cmd_alive(PADAPTER padapter)
  45116. +{
  45117. + struct pwrctrl_priv *pwrctrl;
  45118. +
  45119. +_func_enter_;
  45120. +
  45121. + pwrctrl = &padapter->pwrctrlpriv;
  45122. +
  45123. + _enter_pwrlock(&pwrctrl->lock);
  45124. +
  45125. + unregister_task_alive(pwrctrl, CMD_ALIVE);
  45126. +
  45127. + if ((pwrctrl->pwr_mode != PS_MODE_ACTIVE) &&
  45128. + (pwrctrl->bFwCurrentInPSMode == _TRUE))
  45129. + {
  45130. + if ((pwrctrl->alives == 0) &&
  45131. + (pwrctrl->cpwm > PS_STATE_S0))
  45132. + {
  45133. + rtw_set_rpwm(padapter, PS_STATE_S0);
  45134. + }
  45135. +
  45136. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45137. + ("rtw_unregister_cmd_alive: cpwm=0x%02x alives=0x%08x\n",
  45138. + pwrctrl->cpwm, pwrctrl->alives));
  45139. + }
  45140. +
  45141. + _exit_pwrlock(&pwrctrl->lock);
  45142. +
  45143. +_func_exit_;
  45144. +}
  45145. +
  45146. +/*
  45147. + * Caller: ISR
  45148. + */
  45149. +void rtw_unregister_rx_alive(PADAPTER padapter)
  45150. +{
  45151. + struct pwrctrl_priv *pwrctrl;
  45152. +
  45153. +_func_enter_;
  45154. +
  45155. + pwrctrl = &padapter->pwrctrlpriv;
  45156. +
  45157. + _enter_pwrlock(&pwrctrl->lock);
  45158. +
  45159. + unregister_task_alive(pwrctrl, RECV_ALIVE);
  45160. +
  45161. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45162. + ("rtw_unregister_rx_alive: cpwm=0x%02x alives=0x%08x\n",
  45163. + pwrctrl->cpwm, pwrctrl->alives));
  45164. +
  45165. + _exit_pwrlock(&pwrctrl->lock);
  45166. +
  45167. +_func_exit_;
  45168. +}
  45169. +
  45170. +void rtw_unregister_evt_alive(PADAPTER padapter)
  45171. +{
  45172. + struct pwrctrl_priv *pwrctrl;
  45173. +
  45174. +_func_enter_;
  45175. +
  45176. + pwrctrl = &padapter->pwrctrlpriv;
  45177. +
  45178. + unregister_task_alive(pwrctrl, EVT_ALIVE);
  45179. +
  45180. + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
  45181. + ("rtw_unregister_evt_alive: cpwm=0x%02x alives=0x%08x\n",
  45182. + pwrctrl->cpwm, pwrctrl->alives));
  45183. +
  45184. + _exit_pwrlock(&pwrctrl->lock);
  45185. +
  45186. +_func_exit_;
  45187. +}
  45188. +#endif /* CONFIG_LPS_LCLK */
  45189. +
  45190. +#ifdef CONFIG_RESUME_IN_WORKQUEUE
  45191. +static void resume_workitem_callback(struct work_struct *work);
  45192. +#endif //CONFIG_RESUME_IN_WORKQUEUE
  45193. +
  45194. +void rtw_init_pwrctrl_priv(PADAPTER padapter)
  45195. +{
  45196. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  45197. +
  45198. +_func_enter_;
  45199. +
  45200. +#ifdef PLATFORM_WINDOWS
  45201. + pwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0;
  45202. +#endif
  45203. +
  45204. + _init_pwrlock(&pwrctrlpriv->lock);
  45205. + pwrctrlpriv->rf_pwrstate = rf_on;
  45206. + pwrctrlpriv->ips_enter_cnts=0;
  45207. + pwrctrlpriv->ips_leave_cnts=0;
  45208. +
  45209. + pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode;
  45210. + pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode;
  45211. +
  45212. + pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL;
  45213. + pwrctrlpriv->pwr_state_check_cnts = 0;
  45214. + pwrctrlpriv->bInternalAutoSuspend = _FALSE;
  45215. + pwrctrlpriv->bInSuspend = _FALSE;
  45216. + pwrctrlpriv->bkeepfwalive = _FALSE;
  45217. +
  45218. +#ifdef CONFIG_AUTOSUSPEND
  45219. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  45220. + pwrctrlpriv->pwr_state_check_interval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000;
  45221. +#endif
  45222. +#endif
  45223. +
  45224. + pwrctrlpriv->LpsIdleCount = 0;
  45225. + //pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN;
  45226. + pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN;
  45227. + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE;
  45228. +
  45229. + pwrctrlpriv->bFwCurrentInPSMode = _FALSE;
  45230. +
  45231. + pwrctrlpriv->cpwm = PS_STATE_S4;
  45232. +
  45233. + pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE;
  45234. +
  45235. +
  45236. + pwrctrlpriv->smart_ps = 0;
  45237. +
  45238. + pwrctrlpriv->tog = 0x80;
  45239. +
  45240. +#ifdef PLATFORM_LINUX
  45241. + _init_timer(&(pwrctrlpriv->pwr_state_check_timer), padapter->pnetdev, pwr_state_check_handler, (u8 *)padapter);
  45242. +#endif
  45243. +
  45244. + #ifdef CONFIG_RESUME_IN_WORKQUEUE
  45245. + _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL);
  45246. + pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue");
  45247. + #endif //CONFIG_RESUME_IN_WORKQUEUE
  45248. +
  45249. + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
  45250. + pwrctrlpriv->early_suspend.suspend = NULL;
  45251. + rtw_register_early_suspend(pwrctrlpriv);
  45252. + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER
  45253. +
  45254. +
  45255. +_func_exit_;
  45256. +
  45257. +}
  45258. +
  45259. +
  45260. +void rtw_free_pwrctrl_priv(PADAPTER adapter)
  45261. +{
  45262. + struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv;
  45263. +
  45264. +_func_enter_;
  45265. +
  45266. + //_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv));
  45267. +
  45268. +
  45269. + #ifdef CONFIG_RESUME_IN_WORKQUEUE
  45270. + if (pwrctrlpriv->rtw_workqueue) {
  45271. + flush_workqueue(pwrctrlpriv->rtw_workqueue);
  45272. + destroy_workqueue(pwrctrlpriv->rtw_workqueue);
  45273. + }
  45274. + #endif
  45275. +
  45276. +
  45277. + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
  45278. + rtw_unregister_early_suspend(pwrctrlpriv);
  45279. + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER
  45280. +
  45281. + _free_pwrlock(&pwrctrlpriv->lock);
  45282. +
  45283. +_func_exit_;
  45284. +}
  45285. +
  45286. +#ifdef CONFIG_RESUME_IN_WORKQUEUE
  45287. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45288. +extern int rtw_resume_process(_adapter *padapter);
  45289. +#endif
  45290. +static void resume_workitem_callback(struct work_struct *work)
  45291. +{
  45292. + struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work);
  45293. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45294. +
  45295. + DBG_871X("%s\n",__FUNCTION__);
  45296. +
  45297. + #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45298. + rtw_resume_process(adapter);
  45299. + #endif
  45300. +
  45301. +}
  45302. +
  45303. +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv)
  45304. +{
  45305. + // accquire system's suspend lock preventing from falliing asleep while resume in workqueue
  45306. + rtw_lock_suspend();
  45307. +
  45308. + #if 1
  45309. + queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work);
  45310. + #else
  45311. + _set_workitem(&pwrpriv->resume_work);
  45312. + #endif
  45313. +}
  45314. +#endif //CONFIG_RESUME_IN_WORKQUEUE
  45315. +
  45316. +#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
  45317. +inline bool rtw_is_earlysuspend_registered(struct pwrctrl_priv *pwrpriv)
  45318. +{
  45319. + return (pwrpriv->early_suspend.suspend) ? _TRUE : _FALSE;
  45320. +}
  45321. +
  45322. +inline bool rtw_is_do_late_resume(struct pwrctrl_priv *pwrpriv)
  45323. +{
  45324. + return (pwrpriv->do_late_resume) ? _TRUE : _FALSE;
  45325. +}
  45326. +
  45327. +inline void rtw_set_do_late_resume(struct pwrctrl_priv *pwrpriv, bool enable)
  45328. +{
  45329. + pwrpriv->do_late_resume = enable;
  45330. +}
  45331. +#endif
  45332. +
  45333. +#ifdef CONFIG_HAS_EARLYSUSPEND
  45334. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45335. +extern int rtw_resume_process(_adapter *padapter);
  45336. +#endif
  45337. +static void rtw_early_suspend(struct early_suspend *h)
  45338. +{
  45339. + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);
  45340. + DBG_871X("%s\n",__FUNCTION__);
  45341. +
  45342. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45343. +}
  45344. +
  45345. +static void rtw_late_resume(struct early_suspend *h)
  45346. +{
  45347. + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);
  45348. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45349. +
  45350. + DBG_871X("%s\n",__FUNCTION__);
  45351. + if(pwrpriv->do_late_resume) {
  45352. + #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45353. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45354. + rtw_resume_process(adapter);
  45355. + #endif
  45356. + }
  45357. +}
  45358. +
  45359. +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv)
  45360. +{
  45361. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45362. +
  45363. +#if defined(CONFIG_CONCURRENT_MODE)
  45364. + if (adapter->adapter_type != PRIMARY_ADAPTER)
  45365. + return;
  45366. +#endif
  45367. +
  45368. + DBG_871X("%s\n", __FUNCTION__);
  45369. +
  45370. + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit
  45371. + pwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20;
  45372. + pwrpriv->early_suspend.suspend = rtw_early_suspend;
  45373. + pwrpriv->early_suspend.resume = rtw_late_resume;
  45374. + register_early_suspend(&pwrpriv->early_suspend);
  45375. +
  45376. +
  45377. +}
  45378. +
  45379. +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv)
  45380. +{
  45381. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45382. +
  45383. +#if defined(CONFIG_CONCURRENT_MODE)
  45384. + if (adapter->adapter_type != PRIMARY_ADAPTER)
  45385. + return;
  45386. +#endif
  45387. +
  45388. + DBG_871X("%s\n", __FUNCTION__);
  45389. +
  45390. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45391. +
  45392. + if (pwrpriv->early_suspend.suspend)
  45393. + unregister_early_suspend(&pwrpriv->early_suspend);
  45394. +
  45395. + pwrpriv->early_suspend.suspend = NULL;
  45396. + pwrpriv->early_suspend.resume = NULL;
  45397. +}
  45398. +#endif //CONFIG_HAS_EARLYSUSPEND
  45399. +
  45400. +#ifdef CONFIG_ANDROID_POWER
  45401. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45402. +extern int rtw_resume_process(PADAPTER padapter);
  45403. +#endif
  45404. +static void rtw_early_suspend(android_early_suspend_t *h)
  45405. +{
  45406. + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);
  45407. + DBG_871X("%s\n",__FUNCTION__);
  45408. +
  45409. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45410. +}
  45411. +
  45412. +static void rtw_late_resume(android_early_suspend_t *h)
  45413. +{
  45414. + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);
  45415. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45416. +
  45417. + DBG_871X("%s\n",__FUNCTION__);
  45418. + if(pwrpriv->do_late_resume) {
  45419. + #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  45420. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45421. + rtw_resume_process(adapter);
  45422. + #endif
  45423. + }
  45424. +}
  45425. +
  45426. +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv)
  45427. +{
  45428. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45429. +
  45430. +#if defined(CONFIG_CONCURRENT_MODE)
  45431. + if (adapter->adapter_type != PRIMARY_ADAPTER)
  45432. + return;
  45433. +#endif
  45434. +
  45435. + DBG_871X("%s\n", __FUNCTION__);
  45436. +
  45437. + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit
  45438. + pwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20;
  45439. + pwrpriv->early_suspend.suspend = rtw_early_suspend;
  45440. + pwrpriv->early_suspend.resume = rtw_late_resume;
  45441. + android_register_early_suspend(&pwrpriv->early_suspend);
  45442. +}
  45443. +
  45444. +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv)
  45445. +{
  45446. + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv);
  45447. +
  45448. +#if defined(CONFIG_CONCURRENT_MODE)
  45449. + if (adapter->adapter_type != PRIMARY_ADAPTER)
  45450. + return;
  45451. +#endif
  45452. +
  45453. + DBG_871X("%s\n", __FUNCTION__);
  45454. +
  45455. + rtw_set_do_late_resume(pwrpriv, _FALSE);
  45456. +
  45457. + if (pwrpriv->early_suspend.suspend)
  45458. + android_unregister_early_suspend(&pwrpriv->early_suspend);
  45459. +
  45460. + pwrpriv->early_suspend.suspend = NULL;
  45461. + pwrpriv->early_suspend.resume = NULL;
  45462. +}
  45463. +#endif //CONFIG_ANDROID_POWER
  45464. +
  45465. +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val)
  45466. +{
  45467. + u8 bResult = _TRUE;
  45468. +
  45469. + rtw_hal_intf_ps_func(padapter,efunc_id,val);
  45470. +
  45471. + return bResult;
  45472. +}
  45473. +
  45474. +
  45475. +inline void rtw_set_ips_deny(_adapter *padapter, u32 ms)
  45476. +{
  45477. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  45478. + pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ms);
  45479. +}
  45480. +
  45481. +/*
  45482. +* rtw_pwr_wakeup - Wake the NIC up from: 1)IPS. 2)USB autosuspend
  45483. +* @adapter: pointer to _adapter structure
  45484. +* @ips_deffer_ms: the ms wiil prevent from falling into IPS after wakeup
  45485. +* Return _SUCCESS or _FAIL
  45486. +*/
  45487. +int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
  45488. +{
  45489. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  45490. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  45491. + int ret = _SUCCESS;
  45492. + u32 start = rtw_get_current_time();
  45493. +
  45494. +#ifdef CONFIG_CONCURRENT_MODE
  45495. + if (padapter->pbuddy_adapter)
  45496. + LeaveAllPowerSaveMode(padapter->pbuddy_adapter);
  45497. +
  45498. + if ((padapter->isprimary == _FALSE) && padapter->pbuddy_adapter){
  45499. + padapter = padapter->pbuddy_adapter;
  45500. + pwrpriv = &padapter->pwrctrlpriv;
  45501. + pmlmepriv = &padapter->mlmepriv;
  45502. + }
  45503. +#endif
  45504. +
  45505. + if (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))
  45506. + pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);
  45507. +
  45508. + if (pwrpriv->ps_processing) {
  45509. + DBG_871X("%s wait ps_processing...\n", __func__);
  45510. + while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000)
  45511. + rtw_msleep_os(10);
  45512. + if (pwrpriv->ps_processing)
  45513. + DBG_871X("%s wait ps_processing timeout\n", __func__);
  45514. + else
  45515. + DBG_871X("%s wait ps_processing done\n", __func__);
  45516. + }
  45517. +
  45518. +#ifdef DBG_CONFIG_ERROR_DETECT
  45519. + if (rtw_hal_sreset_inprogress(padapter)) {
  45520. + DBG_871X("%s wait sreset_inprogress...\n", __func__);
  45521. + while (rtw_hal_sreset_inprogress(padapter) && rtw_get_passing_time_ms(start) <= 4000)
  45522. + rtw_msleep_os(10);
  45523. + if (rtw_hal_sreset_inprogress(padapter))
  45524. + DBG_871X("%s wait sreset_inprogress timeout\n", __func__);
  45525. + else
  45526. + DBG_871X("%s wait sreset_inprogress done\n", __func__);
  45527. + }
  45528. +#endif
  45529. +
  45530. + if (pwrpriv->bInternalAutoSuspend == _FALSE && pwrpriv->bInSuspend) {
  45531. + DBG_871X("%s wait bInSuspend...\n", __func__);
  45532. + while (pwrpriv->bInSuspend
  45533. + && ((rtw_get_passing_time_ms(start) <= 3000 && !rtw_is_do_late_resume(pwrpriv))
  45534. + || (rtw_get_passing_time_ms(start) <= 500 && rtw_is_do_late_resume(pwrpriv)))
  45535. + ) {
  45536. + rtw_msleep_os(10);
  45537. + }
  45538. + if (pwrpriv->bInSuspend)
  45539. + DBG_871X("%s wait bInSuspend timeout\n", __func__);
  45540. + else
  45541. + DBG_871X("%s wait bInSuspend done\n", __func__);
  45542. + }
  45543. +
  45544. + //System suspend is not allowed to wakeup
  45545. + if((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend )){
  45546. + ret = _FAIL;
  45547. + goto exit;
  45548. + }
  45549. +
  45550. + //block???
  45551. + if((pwrpriv->bInternalAutoSuspend == _TRUE) && (padapter->net_closed == _TRUE)) {
  45552. + ret = _FAIL;
  45553. + goto exit;
  45554. + }
  45555. +
  45556. + //I think this should be check in IPS, LPS, autosuspend functions...
  45557. + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  45558. + {
  45559. + ret = _SUCCESS;
  45560. + goto exit;
  45561. + }
  45562. +
  45563. + if(rf_off == pwrpriv->rf_pwrstate )
  45564. + {
  45565. +#ifdef CONFIG_USB_HCI
  45566. +#ifdef CONFIG_AUTOSUSPEND
  45567. + if(pwrpriv->brfoffbyhw==_TRUE)
  45568. + {
  45569. + DBG_8192C("hw still in rf_off state ...........\n");
  45570. + ret = _FAIL;
  45571. + goto exit;
  45572. + }
  45573. + else if(padapter->registrypriv.usbss_enable)
  45574. + {
  45575. + DBG_8192C("%s call autoresume_enter....\n",__FUNCTION__);
  45576. + if(_FAIL == autoresume_enter(padapter))
  45577. + {
  45578. + DBG_8192C("======> autoresume fail.............\n");
  45579. + ret = _FAIL;
  45580. + goto exit;
  45581. + }
  45582. + }
  45583. + else
  45584. +#endif
  45585. +#endif
  45586. + {
  45587. +#ifdef CONFIG_IPS
  45588. + DBG_8192C("%s call ips_leave....\n",__FUNCTION__);
  45589. + if(_FAIL == ips_leave(padapter))
  45590. + {
  45591. + DBG_8192C("======> ips_leave fail.............\n");
  45592. + ret = _FAIL;
  45593. + goto exit;
  45594. + }
  45595. +#endif
  45596. + }
  45597. + }
  45598. +
  45599. + //TODO: the following checking need to be merged...
  45600. + if(padapter->bDriverStopped
  45601. + || !padapter->bup
  45602. + || !padapter->hw_init_completed
  45603. + ){
  45604. + DBG_8192C("%s: bDriverStopped=%d, bup=%d, hw_init_completed=%u\n"
  45605. + , caller
  45606. + , padapter->bDriverStopped
  45607. + , padapter->bup
  45608. + , padapter->hw_init_completed);
  45609. + ret= _FALSE;
  45610. + goto exit;
  45611. + }
  45612. +
  45613. +exit:
  45614. + if (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))
  45615. + pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);
  45616. + return ret;
  45617. +
  45618. +}
  45619. +
  45620. +int rtw_pm_set_lps(_adapter *padapter, u8 mode)
  45621. +{
  45622. + int ret = 0;
  45623. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  45624. +
  45625. + if ( mode < PS_MODE_NUM )
  45626. + {
  45627. + if(pwrctrlpriv->power_mgnt !=mode)
  45628. + {
  45629. + if(PS_MODE_ACTIVE == mode)
  45630. + {
  45631. + LeaveAllPowerSaveMode(padapter);
  45632. + }
  45633. + else
  45634. + {
  45635. + pwrctrlpriv->LpsIdleCount = 2;
  45636. + }
  45637. + pwrctrlpriv->power_mgnt = mode;
  45638. + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE;
  45639. + }
  45640. + }
  45641. + else
  45642. + {
  45643. + ret = -EINVAL;
  45644. + }
  45645. +
  45646. + return ret;
  45647. +}
  45648. +
  45649. +int rtw_pm_set_ips(_adapter *padapter, u8 mode)
  45650. +{
  45651. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  45652. +
  45653. + if( mode == IPS_NORMAL || mode == IPS_LEVEL_2 ) {
  45654. + rtw_ips_mode_req(pwrctrlpriv, mode);
  45655. + DBG_871X("%s %s\n", __FUNCTION__, mode == IPS_NORMAL?"IPS_NORMAL":"IPS_LEVEL_2");
  45656. + return 0;
  45657. + }
  45658. + else if(mode ==IPS_NONE){
  45659. + rtw_ips_mode_req(pwrctrlpriv, mode);
  45660. + DBG_871X("%s %s\n", __FUNCTION__, "IPS_NONE");
  45661. + if((padapter->bSurpriseRemoved ==0)&&(_FAIL == rtw_pwr_wakeup(padapter)) )
  45662. + return -EFAULT;
  45663. + }
  45664. + else {
  45665. + return -EINVAL;
  45666. + }
  45667. + return 0;
  45668. +}
  45669. --- /dev/null
  45670. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_recv.c
  45671. @@ -0,0 +1,4286 @@
  45672. +/******************************************************************************
  45673. + *
  45674. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  45675. + *
  45676. + * This program is free software; you can redistribute it and/or modify it
  45677. + * under the terms of version 2 of the GNU General Public License as
  45678. + * published by the Free Software Foundation.
  45679. + *
  45680. + * This program is distributed in the hope that it will be useful, but WITHOUT
  45681. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  45682. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  45683. + * more details.
  45684. + *
  45685. + * You should have received a copy of the GNU General Public License along with
  45686. + * this program; if not, write to the Free Software Foundation, Inc.,
  45687. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  45688. + *
  45689. + *
  45690. + ******************************************************************************/
  45691. +#define _RTW_RECV_C_
  45692. +#include <drv_conf.h>
  45693. +#include <osdep_service.h>
  45694. +#include <drv_types.h>
  45695. +#include <recv_osdep.h>
  45696. +#include <mlme_osdep.h>
  45697. +#include <ip.h>
  45698. +#include <if_ether.h>
  45699. +#include <ethernet.h>
  45700. +
  45701. +#ifdef CONFIG_USB_HCI
  45702. +#include <usb_ops.h>
  45703. +#endif
  45704. +
  45705. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  45706. +
  45707. +#error "Shall be Linux or Windows, but not both!\n"
  45708. +
  45709. +#endif
  45710. +
  45711. +#include <wifi.h>
  45712. +#include <circ_buf.h>
  45713. +
  45714. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  45715. +void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS);
  45716. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  45717. +
  45718. +
  45719. +void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv)
  45720. +{
  45721. +
  45722. +
  45723. +_func_enter_;
  45724. +
  45725. + _rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv));
  45726. +
  45727. + _rtw_spinlock_init(&psta_recvpriv->lock);
  45728. +
  45729. + //for(i=0; i<MAX_RX_NUMBLKS; i++)
  45730. + // _rtw_init_queue(&psta_recvpriv->blk_strms[i]);
  45731. +
  45732. + _rtw_init_queue(&psta_recvpriv->defrag_q);
  45733. +
  45734. +_func_exit_;
  45735. +
  45736. +}
  45737. +
  45738. +sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter)
  45739. +{
  45740. + sint i;
  45741. +
  45742. + union recv_frame *precvframe;
  45743. +
  45744. + sint res=_SUCCESS;
  45745. +
  45746. +_func_enter_;
  45747. +
  45748. + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
  45749. + //_rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv));
  45750. +
  45751. + _rtw_spinlock_init(&precvpriv->lock);
  45752. +
  45753. + _rtw_init_queue(&precvpriv->free_recv_queue);
  45754. + _rtw_init_queue(&precvpriv->recv_pending_queue);
  45755. + _rtw_init_queue(&precvpriv->uc_swdec_pending_queue);
  45756. +
  45757. + precvpriv->adapter = padapter;
  45758. +
  45759. + precvpriv->free_recvframe_cnt = NR_RECVFRAME;
  45760. +
  45761. + rtw_os_recv_resource_init(precvpriv, padapter);
  45762. +
  45763. + precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
  45764. +
  45765. + if(precvpriv->pallocated_frame_buf==NULL){
  45766. + res= _FAIL;
  45767. + goto exit;
  45768. + }
  45769. + //_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
  45770. +
  45771. + precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ);
  45772. + //precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ -
  45773. + // ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1));
  45774. +
  45775. + precvframe = (union recv_frame*) precvpriv->precv_frame_buf;
  45776. +
  45777. +
  45778. + for(i=0; i < NR_RECVFRAME ; i++)
  45779. + {
  45780. + _rtw_init_listhead(&(precvframe->u.list));
  45781. +
  45782. + rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue));
  45783. +
  45784. + res = rtw_os_recv_resource_alloc(padapter, precvframe);
  45785. +
  45786. + precvframe->u.hdr.adapter =padapter;
  45787. + precvframe++;
  45788. +
  45789. + }
  45790. +
  45791. +#ifdef CONFIG_USB_HCI
  45792. +
  45793. + precvpriv->rx_pending_cnt=1;
  45794. +
  45795. + _rtw_init_sema(&precvpriv->allrxreturnevt, 0);
  45796. +
  45797. +#endif
  45798. +
  45799. + res = rtw_hal_init_recv_priv(padapter);
  45800. +
  45801. + precvpriv->recvbuf_skb_alloc_fail_cnt = 0;
  45802. + precvpriv->recvbuf_null_cnt = 0;
  45803. + precvpriv->read_port_complete_EINPROGRESS_cnt = 0;
  45804. + precvpriv->read_port_complete_other_urb_err_cnt = 0;
  45805. +
  45806. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  45807. + #ifdef PLATFORM_LINUX
  45808. + _init_timer(&precvpriv->signal_stat_timer, padapter->pnetdev, RTW_TIMER_HDL_NAME(signal_stat), padapter);
  45809. + #elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS)
  45810. + _init_timer(&precvpriv->signal_stat_timer, padapter->hndis_adapter, RTW_TIMER_HDL_NAME(signal_stat), padapter);
  45811. + #endif
  45812. +
  45813. + precvpriv->signal_stat_sampling_interval = 1000; //ms
  45814. + //precvpriv->signal_stat_converging_constant = 5000; //ms
  45815. +
  45816. + rtw_set_signal_stat_timer(precvpriv);
  45817. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  45818. +
  45819. +exit:
  45820. +
  45821. +_func_exit_;
  45822. +
  45823. + return res;
  45824. +
  45825. +}
  45826. +
  45827. +void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv);
  45828. +void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv)
  45829. +{
  45830. + _rtw_spinlock_free(&precvpriv->lock);
  45831. +#ifdef CONFIG_RECV_THREAD_MODE
  45832. + _rtw_free_sema(&precvpriv->recv_sema);
  45833. + _rtw_free_sema(&precvpriv->terminate_recvthread_sema);
  45834. +#endif
  45835. +
  45836. + _rtw_spinlock_free(&precvpriv->free_recv_queue.lock);
  45837. + _rtw_spinlock_free(&precvpriv->recv_pending_queue.lock);
  45838. +
  45839. + _rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock);
  45840. +
  45841. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  45842. + _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock);
  45843. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
  45844. +}
  45845. +
  45846. +void _rtw_free_recv_priv (struct recv_priv *precvpriv)
  45847. +{
  45848. + _adapter *padapter = precvpriv->adapter;
  45849. +
  45850. +_func_enter_;
  45851. +
  45852. + rtw_free_uc_swdec_pending_queue(padapter);
  45853. +
  45854. + rtw_mfree_recv_priv_lock(precvpriv);
  45855. +
  45856. + rtw_os_recv_resource_free(precvpriv);
  45857. +
  45858. + if(precvpriv->pallocated_frame_buf) {
  45859. + rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
  45860. + }
  45861. +
  45862. + rtw_hal_free_recv_priv(padapter);
  45863. +
  45864. +_func_exit_;
  45865. +
  45866. +}
  45867. +
  45868. +union recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue)
  45869. +{
  45870. +
  45871. + union recv_frame *precvframe;
  45872. + _list *plist, *phead;
  45873. + _adapter *padapter;
  45874. + struct recv_priv *precvpriv;
  45875. +_func_enter_;
  45876. +
  45877. + if(_rtw_queue_empty(pfree_recv_queue) == _TRUE)
  45878. + {
  45879. + precvframe = NULL;
  45880. + }
  45881. + else
  45882. + {
  45883. + phead = get_list_head(pfree_recv_queue);
  45884. +
  45885. + plist = get_next(phead);
  45886. +
  45887. + precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
  45888. +
  45889. + rtw_list_delete(&precvframe->u.hdr.list);
  45890. + padapter=precvframe->u.hdr.adapter;
  45891. + if(padapter !=NULL){
  45892. + precvpriv=&padapter->recvpriv;
  45893. + if(pfree_recv_queue == &precvpriv->free_recv_queue)
  45894. + precvpriv->free_recvframe_cnt--;
  45895. + }
  45896. + }
  45897. +
  45898. +_func_exit_;
  45899. +
  45900. + return precvframe;
  45901. +
  45902. +}
  45903. +
  45904. +union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue)
  45905. +{
  45906. + _irqL irqL;
  45907. + union recv_frame *precvframe;
  45908. +
  45909. + _enter_critical_bh(&pfree_recv_queue->lock, &irqL);
  45910. +
  45911. + precvframe = _rtw_alloc_recvframe(pfree_recv_queue);
  45912. +
  45913. + _exit_critical_bh(&pfree_recv_queue->lock, &irqL);
  45914. +
  45915. + return precvframe;
  45916. +}
  45917. +
  45918. +void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv)
  45919. +{
  45920. + /* Perry: This can be removed */
  45921. + _rtw_init_listhead(&precvframe->u.hdr.list);
  45922. +
  45923. + precvframe->u.hdr.len=0;
  45924. +}
  45925. +
  45926. +int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue)
  45927. +{
  45928. + _irqL irqL;
  45929. + _adapter *padapter=precvframe->u.hdr.adapter;
  45930. + struct recv_priv *precvpriv = &padapter->recvpriv;
  45931. +
  45932. +_func_enter_;
  45933. +
  45934. +#ifdef CONFIG_CONCURRENT_MODE
  45935. + if(padapter->adapter_type > PRIMARY_ADAPTER)
  45936. + {
  45937. + padapter = padapter->pbuddy_adapter;//get primary_padapter
  45938. + precvpriv = &padapter->recvpriv;
  45939. + pfree_recv_queue = &precvpriv->free_recv_queue;
  45940. + precvframe->u.hdr.adapter = padapter;
  45941. + }
  45942. +#endif
  45943. +
  45944. +
  45945. +#ifdef PLATFORM_WINDOWS
  45946. + rtw_os_read_port(padapter, precvframe->u.hdr.precvbuf);
  45947. +#endif
  45948. +
  45949. +#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
  45950. +
  45951. + if(precvframe->u.hdr.pkt)
  45952. + {
  45953. +#ifdef CONFIG_BSD_RX_USE_MBUF
  45954. + m_freem(precvframe->u.hdr.pkt);
  45955. +#else // CONFIG_BSD_RX_USE_MBUF
  45956. + rtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver
  45957. +#endif // CONFIG_BSD_RX_USE_MBUF
  45958. + precvframe->u.hdr.pkt = NULL;
  45959. + }
  45960. +
  45961. +#endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
  45962. +
  45963. + _enter_critical_bh(&pfree_recv_queue->lock, &irqL);
  45964. +
  45965. + rtw_list_delete(&(precvframe->u.hdr.list));
  45966. +
  45967. + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue));
  45968. +
  45969. + if(padapter !=NULL){
  45970. + if(pfree_recv_queue == &precvpriv->free_recv_queue)
  45971. + precvpriv->free_recvframe_cnt++;
  45972. + }
  45973. +
  45974. + _exit_critical_bh(&pfree_recv_queue->lock, &irqL);
  45975. +
  45976. +_func_exit_;
  45977. +
  45978. + return _SUCCESS;
  45979. +
  45980. +}
  45981. +
  45982. +
  45983. +
  45984. +
  45985. +sint _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  45986. +{
  45987. +
  45988. + _adapter *padapter=precvframe->u.hdr.adapter;
  45989. + struct recv_priv *precvpriv = &padapter->recvpriv;
  45990. +
  45991. +_func_enter_;
  45992. +
  45993. + //_rtw_init_listhead(&(precvframe->u.hdr.list));
  45994. + rtw_list_delete(&(precvframe->u.hdr.list));
  45995. +
  45996. +
  45997. + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue));
  45998. +
  45999. + if (padapter != NULL) {
  46000. + if (queue == &precvpriv->free_recv_queue)
  46001. + precvpriv->free_recvframe_cnt++;
  46002. + }
  46003. +
  46004. +_func_exit_;
  46005. +
  46006. + return _SUCCESS;
  46007. +}
  46008. +
  46009. +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  46010. +{
  46011. + sint ret;
  46012. + _irqL irqL;
  46013. +
  46014. + //_spinlock(&pfree_recv_queue->lock);
  46015. + _enter_critical_bh(&queue->lock, &irqL);
  46016. + ret = _rtw_enqueue_recvframe(precvframe, queue);
  46017. + //_rtw_spinunlock(&pfree_recv_queue->lock);
  46018. + _exit_critical_bh(&queue->lock, &irqL);
  46019. +
  46020. + return ret;
  46021. +}
  46022. +
  46023. +/*
  46024. +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  46025. +{
  46026. + return rtw_free_recvframe(precvframe, queue);
  46027. +}
  46028. +*/
  46029. +
  46030. +
  46031. +
  46032. +
  46033. +/*
  46034. +caller : defrag ; recvframe_chk_defrag in recv_thread (passive)
  46035. +pframequeue: defrag_queue : will be accessed in recv_thread (passive)
  46036. +
  46037. +using spinlock to protect
  46038. +
  46039. +*/
  46040. +
  46041. +void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue)
  46042. +{
  46043. + union recv_frame *precvframe;
  46044. + _list *plist, *phead;
  46045. +
  46046. +_func_enter_;
  46047. + _rtw_spinlock(&pframequeue->lock);
  46048. +
  46049. + phead = get_list_head(pframequeue);
  46050. + plist = get_next(phead);
  46051. +
  46052. + while(rtw_end_of_queue_search(phead, plist) == _FALSE)
  46053. + {
  46054. + precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
  46055. +
  46056. + plist = get_next(plist);
  46057. +
  46058. + //rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe()
  46059. +
  46060. + rtw_free_recvframe(precvframe, pfree_recv_queue);
  46061. + }
  46062. +
  46063. + _rtw_spinunlock(&pframequeue->lock);
  46064. +
  46065. +_func_exit_;
  46066. +
  46067. +}
  46068. +
  46069. +u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter)
  46070. +{
  46071. + u32 cnt = 0;
  46072. + union recv_frame *pending_frame;
  46073. + while((pending_frame=rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) {
  46074. + rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue);
  46075. + DBG_871X("%s: dequeue uc_swdec_pending_queue\n", __func__);
  46076. + cnt++;
  46077. + }
  46078. +
  46079. + return cnt;
  46080. +}
  46081. +
  46082. +
  46083. +sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue)
  46084. +{
  46085. + _irqL irqL;
  46086. +
  46087. + _enter_critical(&queue->lock, &irqL);
  46088. +
  46089. + rtw_list_delete(&precvbuf->list);
  46090. + rtw_list_insert_head(&precvbuf->list, get_list_head(queue));
  46091. +
  46092. + _exit_critical(&queue->lock, &irqL);
  46093. +
  46094. + return _SUCCESS;
  46095. +}
  46096. +
  46097. +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue)
  46098. +{
  46099. + _irqL irqL;
  46100. +
  46101. + _enter_critical(&queue->lock, &irqL);
  46102. +
  46103. + rtw_list_delete(&precvbuf->list);
  46104. +
  46105. + rtw_list_insert_tail(&precvbuf->list, get_list_head(queue));
  46106. +
  46107. + _exit_critical(&queue->lock, &irqL);
  46108. +
  46109. +
  46110. + return _SUCCESS;
  46111. +
  46112. +}
  46113. +
  46114. +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue)
  46115. +{
  46116. + _irqL irqL;
  46117. + struct recv_buf *precvbuf;
  46118. + _list *plist, *phead;
  46119. +
  46120. + _enter_critical(&queue->lock, &irqL);
  46121. +
  46122. + if(_rtw_queue_empty(queue) == _TRUE)
  46123. + {
  46124. + precvbuf = NULL;
  46125. + }
  46126. + else
  46127. + {
  46128. + phead = get_list_head(queue);
  46129. +
  46130. + plist = get_next(phead);
  46131. +
  46132. + precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list);
  46133. +
  46134. + rtw_list_delete(&precvbuf->list);
  46135. +
  46136. + }
  46137. +
  46138. + _exit_critical(&queue->lock, &irqL);
  46139. +
  46140. +
  46141. + return precvbuf;
  46142. +
  46143. +}
  46144. +
  46145. +sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe);
  46146. +sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe){
  46147. +
  46148. + sint i,res=_SUCCESS;
  46149. + u32 datalen;
  46150. + u8 miccode[8];
  46151. + u8 bmic_err=_FALSE,brpt_micerror = _TRUE;
  46152. + u8 *pframe, *payload,*pframemic;
  46153. + u8 *mickey;
  46154. + //u8 *iv,rxdata_key_idx=0;
  46155. + struct sta_info *stainfo;
  46156. + struct rx_pkt_attrib *prxattrib=&precvframe->u.hdr.attrib;
  46157. + struct security_priv *psecuritypriv=&adapter->securitypriv;
  46158. +
  46159. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  46160. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  46161. +_func_enter_;
  46162. +
  46163. + stainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]);
  46164. +
  46165. + if(prxattrib->encrypt ==_TKIP_)
  46166. + {
  46167. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\n"));
  46168. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  46169. + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5]));
  46170. +
  46171. + //calculate mic code
  46172. + if(stainfo!= NULL)
  46173. + {
  46174. + if(IS_MCAST(prxattrib->ra))
  46175. + {
  46176. + //mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0];
  46177. + //iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen;
  46178. + //rxdata_key_idx =( ((iv[3])>>6)&0x3) ;
  46179. + mickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];
  46180. +
  46181. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic: bcmc key \n"));
  46182. + //DBG_871X("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n",
  46183. + // psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx);
  46184. +
  46185. + if(psecuritypriv->binstallGrpkey==_FALSE)
  46186. + {
  46187. + res=_FAIL;
  46188. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"));
  46189. + DBG_871X("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n");
  46190. + goto exit;
  46191. + }
  46192. + }
  46193. + else{
  46194. + mickey=&stainfo->dot11tkiprxmickey.skey[0];
  46195. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic: unicast key \n"));
  46196. + }
  46197. +
  46198. + datalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code
  46199. + pframe=precvframe->u.hdr.rx_data;
  46200. + payload=pframe+prxattrib->hdrlen+prxattrib->iv_len;
  46201. +
  46202. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n",prxattrib->iv_len,prxattrib->icv_len));
  46203. +
  46204. + //rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data
  46205. +
  46206. + rtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data
  46207. +
  46208. + pframemic=payload+datalen;
  46209. +
  46210. + bmic_err=_FALSE;
  46211. +
  46212. + for(i=0;i<8;i++){
  46213. + if(miccode[i] != *(pframemic+i)){
  46214. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) ",i,miccode[i],i,*(pframemic+i)));
  46215. + bmic_err=_TRUE;
  46216. + }
  46217. + }
  46218. +
  46219. +
  46220. + if(bmic_err==_TRUE){
  46221. +
  46222. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  46223. + *(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1)));
  46224. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  46225. + *(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9)));
  46226. +
  46227. + {
  46228. + uint i;
  46229. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet (len=%d)======\n",precvframe->u.hdr.len));
  46230. + for(i=0;i<precvframe->u.hdr.len;i=i+8){
  46231. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x",
  46232. + *(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1),
  46233. + *(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3),
  46234. + *(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5),
  46235. + *(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7)));
  46236. + }
  46237. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet end [len=%d]======\n",precvframe->u.hdr.len));
  46238. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n hrdlen=%d, \n",prxattrib->hdrlen));
  46239. + }
  46240. +
  46241. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ",
  46242. + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],
  46243. + prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey));
  46244. +
  46245. + // double check key_index for some timing issue ,
  46246. + // cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue
  46247. + if((IS_MCAST(prxattrib->ra)==_TRUE) && (prxattrib->key_index != pmlmeinfo->key_index ))
  46248. + brpt_micerror = _FALSE;
  46249. +
  46250. + if(brpt_micerror == _TRUE)
  46251. + {
  46252. + rtw_handle_tkip_mic_err(adapter,(u8)IS_MCAST(prxattrib->ra));
  46253. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d \n", brpt_micerror));
  46254. + DBG_871X(" mic error :brpt_micerror=%d\n", brpt_micerror);
  46255. + }
  46256. +
  46257. + res=_FAIL;
  46258. +
  46259. + }
  46260. + else{
  46261. + //mic checked ok
  46262. + if((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){
  46263. + psecuritypriv->bcheck_grpkey =_TRUE;
  46264. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->bcheck_grpkey =_TRUE"));
  46265. + }
  46266. + }
  46267. +
  46268. + }
  46269. + else
  46270. + {
  46271. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic: rtw_get_stainfo==NULL!!!\n"));
  46272. + }
  46273. +
  46274. + recvframe_pull_tail(precvframe, 8);
  46275. +
  46276. + }
  46277. +
  46278. +exit:
  46279. +
  46280. +_func_exit_;
  46281. +
  46282. + return res;
  46283. +
  46284. +}
  46285. +
  46286. +//decrypt and set the ivlen,icvlen of the recv_frame
  46287. +union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame);
  46288. +union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame)
  46289. +{
  46290. +
  46291. + struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;
  46292. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  46293. + union recv_frame *return_packet=precv_frame;
  46294. + u32 res=_SUCCESS;
  46295. +_func_enter_;
  46296. +
  46297. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt));
  46298. +
  46299. + if(prxattrib->encrypt>0)
  46300. + {
  46301. + u8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen;
  46302. + prxattrib->key_index = ( ((iv[3])>>6)&0x3) ;
  46303. +
  46304. + if(prxattrib->key_index > WEP_KEYS)
  46305. + {
  46306. + DBG_871X("prxattrib->key_index(%d) > WEP_KEYS \n", prxattrib->key_index);
  46307. +
  46308. + switch(prxattrib->encrypt){
  46309. + case _WEP40_:
  46310. + case _WEP104_:
  46311. + prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex;
  46312. + break;
  46313. + case _TKIP_:
  46314. + case _AES_:
  46315. + default:
  46316. + prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid;
  46317. + break;
  46318. + }
  46319. + }
  46320. + }
  46321. +
  46322. + if((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE)))
  46323. + {
  46324. +
  46325. +#ifdef CONFIG_CONCURRENT_MODE
  46326. + if(!IS_MCAST(prxattrib->ra))//bc/mc packets use sw decryption for concurrent mode
  46327. +#endif
  46328. + psecuritypriv->hw_decrypted=_FALSE;
  46329. +
  46330. + #ifdef DBG_RX_DECRYPTOR
  46331. + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n"
  46332. + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
  46333. + #endif
  46334. +
  46335. + switch(prxattrib->encrypt){
  46336. + case _WEP40_:
  46337. + case _WEP104_:
  46338. + rtw_wep_decrypt(padapter, (u8 *)precv_frame);
  46339. + break;
  46340. + case _TKIP_:
  46341. + res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);
  46342. + break;
  46343. + case _AES_:
  46344. + res = rtw_aes_decrypt(padapter, (u8 * )precv_frame);
  46345. + break;
  46346. + default:
  46347. + break;
  46348. + }
  46349. + }
  46350. + else if(prxattrib->bdecrypted==1
  46351. + && prxattrib->encrypt >0
  46352. + && (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ )
  46353. + )
  46354. + {
  46355. +#if 0
  46356. + if((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_))
  46357. + {
  46358. + psecuritypriv->hw_decrypted=_FALSE;
  46359. +
  46360. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->hw_decrypted=_FALSE"));
  46361. +
  46362. + rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue);
  46363. +
  46364. + return_packet=NULL;
  46365. +
  46366. + }
  46367. + else
  46368. +#endif
  46369. + {
  46370. + psecuritypriv->hw_decrypted=_TRUE;
  46371. + #ifdef DBG_RX_DECRYPTOR
  46372. + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n"
  46373. + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
  46374. + #endif
  46375. +
  46376. + }
  46377. + }
  46378. + else {
  46379. + #ifdef DBG_RX_DECRYPTOR
  46380. + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, psecuritypriv->hw_decrypted:%d\n"
  46381. + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
  46382. + #endif
  46383. + }
  46384. +
  46385. + if(res == _FAIL)
  46386. + {
  46387. + rtw_free_recvframe(return_packet,&padapter->recvpriv.free_recv_queue);
  46388. + return_packet = NULL;
  46389. +
  46390. + }
  46391. + //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function
  46392. +
  46393. +_func_exit_;
  46394. +
  46395. + return return_packet;
  46396. +
  46397. +}
  46398. +//###set the security information in the recv_frame
  46399. +union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame);
  46400. +union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame)
  46401. +{
  46402. + u8 *psta_addr,*ptr;
  46403. + uint auth_alg;
  46404. + struct recv_frame_hdr *pfhdr;
  46405. + struct sta_info * psta;
  46406. + struct sta_priv *pstapriv ;
  46407. + union recv_frame * prtnframe;
  46408. + u16 ether_type=0;
  46409. + u16 eapol_type = 0x888e;//for Funia BD's WPA issue
  46410. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  46411. +
  46412. +_func_enter_;
  46413. +
  46414. + pstapriv = &adapter->stapriv;
  46415. + ptr = get_recvframe_data(precv_frame);
  46416. + pfhdr = &precv_frame->u.hdr;
  46417. + psta_addr = pfhdr->attrib.ta;
  46418. + psta = rtw_get_stainfo(pstapriv, psta_addr);
  46419. +
  46420. + auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
  46421. +
  46422. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm= 0x%d\n",adapter->securitypriv.dot11AuthAlgrthm));
  46423. +
  46424. + if(auth_alg==2)
  46425. + {
  46426. + if ((psta!=NULL) && (psta->ieee8021x_blocked))
  46427. + {
  46428. + //blocked
  46429. + //only accept EAPOL frame
  46430. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==1\n"));
  46431. +
  46432. + prtnframe=precv_frame;
  46433. +
  46434. + //get ether_type
  46435. + ptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE;
  46436. + _rtw_memcpy(&ether_type,ptr, 2);
  46437. + ether_type= ntohs((unsigned short )ether_type);
  46438. +
  46439. + if (ether_type == eapol_type) {
  46440. + prtnframe=precv_frame;
  46441. + }
  46442. + else {
  46443. + //free this frame
  46444. + rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue);
  46445. + prtnframe=NULL;
  46446. + }
  46447. + }
  46448. + else
  46449. + {
  46450. + //allowed
  46451. + //check decryption status, and decrypt the frame if needed
  46452. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==0\n"));
  46453. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:precv_frame->hdr.attrib.privacy=%x\n",precv_frame->u.hdr.attrib.privacy));
  46454. +
  46455. + if(pattrib->bdecrypted==0)
  46456. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:prxstat->decrypted=%x\n", pattrib->bdecrypted));
  46457. +
  46458. + prtnframe=precv_frame;
  46459. + //check is the EAPOL frame or not (Rekey)
  46460. + if(ether_type == eapol_type){
  46461. +
  46462. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type == 0x888e\n"));
  46463. + //check Rekey
  46464. +
  46465. + prtnframe=precv_frame;
  46466. + }
  46467. + else{
  46468. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type = 0x%.4x\n",ether_type));
  46469. + }
  46470. + }
  46471. + }
  46472. + else
  46473. + {
  46474. + prtnframe=precv_frame;
  46475. + }
  46476. +
  46477. +_func_exit_;
  46478. +
  46479. + return prtnframe;
  46480. +
  46481. +}
  46482. +
  46483. +sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache);
  46484. +sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache)
  46485. +{
  46486. + sint tid = precv_frame->u.hdr.attrib.priority;
  46487. +
  46488. + u16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) |
  46489. + (precv_frame->u.hdr.attrib.frag_num & 0xf);
  46490. +
  46491. +_func_enter_;
  46492. +
  46493. + if(tid>15)
  46494. + {
  46495. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\n", seq_ctrl, tid));
  46496. +
  46497. + return _FAIL;
  46498. + }
  46499. +
  46500. + if(1)//if(bretry)
  46501. + {
  46502. + if(seq_ctrl == prxcache->tid_rxseq[tid])
  46503. + {
  46504. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\n", seq_ctrl, tid, prxcache->tid_rxseq[tid]));
  46505. +
  46506. + return _FAIL;
  46507. + }
  46508. + }
  46509. +
  46510. + prxcache->tid_rxseq[tid] = seq_ctrl;
  46511. +
  46512. +_func_exit_;
  46513. +
  46514. + return _SUCCESS;
  46515. +
  46516. +}
  46517. +
  46518. +void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame);
  46519. +void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame)
  46520. +{
  46521. +#ifdef CONFIG_AP_MODE
  46522. + unsigned char pwrbit;
  46523. + u8 *ptr = precv_frame->u.hdr.rx_data;
  46524. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  46525. + struct sta_priv *pstapriv = &padapter->stapriv;
  46526. + struct sta_info *psta=NULL;
  46527. +
  46528. + psta = rtw_get_stainfo(pstapriv, pattrib->src);
  46529. +
  46530. + pwrbit = GetPwrMgt(ptr);
  46531. +
  46532. + if(psta)
  46533. + {
  46534. + if(pwrbit)
  46535. + {
  46536. + if(!(psta->state & WIFI_SLEEP_STATE))
  46537. + {
  46538. + //psta->state |= WIFI_SLEEP_STATE;
  46539. + //pstapriv->sta_dz_bitmap |= BIT(psta->aid);
  46540. +
  46541. + stop_sta_xmit(padapter, psta);
  46542. +
  46543. + //DBG_871X("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap);
  46544. + }
  46545. + }
  46546. + else
  46547. + {
  46548. + if(psta->state & WIFI_SLEEP_STATE)
  46549. + {
  46550. + //psta->state ^= WIFI_SLEEP_STATE;
  46551. + //pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
  46552. +
  46553. + wakeup_sta_to_xmit(padapter, psta);
  46554. +
  46555. + //DBG_871X("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap);
  46556. + }
  46557. + }
  46558. +
  46559. + }
  46560. +
  46561. +#endif
  46562. +}
  46563. +
  46564. +void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);
  46565. +void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame)
  46566. +{
  46567. +#ifdef CONFIG_AP_MODE
  46568. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  46569. + struct sta_priv *pstapriv = &padapter->stapriv;
  46570. + struct sta_info *psta=NULL;
  46571. +
  46572. + psta = rtw_get_stainfo(pstapriv, pattrib->src);
  46573. +
  46574. + if(!psta) return;
  46575. +
  46576. +#ifdef CONFIG_TDLS
  46577. + if( !(psta->tdls_sta_state & TDLS_LINKED_STATE ) )
  46578. + {
  46579. +#endif //CONFIG_TDLS
  46580. +
  46581. + if(!psta->qos_option)
  46582. + return;
  46583. +
  46584. + if(!(psta->qos_info&0xf))
  46585. + return;
  46586. +
  46587. +#ifdef CONFIG_TDLS
  46588. + }
  46589. +#endif //CONFIG_TDLS
  46590. +
  46591. + if(psta->state&WIFI_SLEEP_STATE)
  46592. + {
  46593. + u8 wmmps_ac=0;
  46594. +
  46595. + switch(pattrib->priority)
  46596. + {
  46597. + case 1:
  46598. + case 2:
  46599. + wmmps_ac = psta->uapsd_bk&BIT(1);
  46600. + break;
  46601. + case 4:
  46602. + case 5:
  46603. + wmmps_ac = psta->uapsd_vi&BIT(1);
  46604. + break;
  46605. + case 6:
  46606. + case 7:
  46607. + wmmps_ac = psta->uapsd_vo&BIT(1);
  46608. + break;
  46609. + case 0:
  46610. + case 3:
  46611. + default:
  46612. + wmmps_ac = psta->uapsd_be&BIT(1);
  46613. + break;
  46614. + }
  46615. +
  46616. + if(wmmps_ac)
  46617. + {
  46618. + if(psta->sleepq_ac_len>0)
  46619. + {
  46620. + //process received triggered frame
  46621. + xmit_delivery_enabled_frames(padapter, psta);
  46622. + }
  46623. + else
  46624. + {
  46625. + //issue one qos null frame with More data bit = 0 and the EOSP bit set (=1)
  46626. + issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority, 0, 0);
  46627. + }
  46628. + }
  46629. +
  46630. + }
  46631. +
  46632. +
  46633. +#endif
  46634. +
  46635. +}
  46636. +
  46637. +#ifdef CONFIG_TDLS
  46638. +sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)
  46639. +{
  46640. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  46641. + sint ret = _SUCCESS;
  46642. + u8 *paction = get_recvframe_data(precv_frame);
  46643. + u8 category_field = 1;
  46644. +#ifdef CONFIG_WFD
  46645. + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a };
  46646. +#endif //CONFIG_WFD
  46647. + struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo);
  46648. +
  46649. + //point to action field
  46650. + paction+=pattrib->hdrlen
  46651. + + pattrib->iv_len
  46652. + + SNAP_SIZE
  46653. + + ETH_TYPE_LEN
  46654. + + PAYLOAD_TYPE_LEN
  46655. + + category_field;
  46656. +
  46657. + if(ptdlsinfo->enable == 0)
  46658. + {
  46659. + DBG_871X("recv tdls frame, "
  46660. + "but tdls haven't enabled\n");
  46661. + ret = _FAIL;
  46662. + return ret;
  46663. + }
  46664. +
  46665. + switch(*paction){
  46666. + case TDLS_SETUP_REQUEST:
  46667. + DBG_871X("recv tdls setup request frame\n");
  46668. + ret=On_TDLS_Setup_Req(adapter, precv_frame);
  46669. + break;
  46670. + case TDLS_SETUP_RESPONSE:
  46671. + DBG_871X("recv tdls setup response frame\n");
  46672. + ret=On_TDLS_Setup_Rsp(adapter, precv_frame);
  46673. + break;
  46674. + case TDLS_SETUP_CONFIRM:
  46675. + DBG_871X("recv tdls setup confirm frame\n");
  46676. + ret=On_TDLS_Setup_Cfm(adapter, precv_frame);
  46677. + break;
  46678. + case TDLS_TEARDOWN:
  46679. + DBG_871X("recv tdls teardown, free sta_info\n");
  46680. + ret=On_TDLS_Teardown(adapter, precv_frame);
  46681. + break;
  46682. + case TDLS_DISCOVERY_REQUEST:
  46683. + DBG_871X("recv tdls discovery request frame\n");
  46684. + ret=On_TDLS_Dis_Req(adapter, precv_frame);
  46685. + break;
  46686. + case TDLS_PEER_TRAFFIC_RESPONSE:
  46687. + DBG_871X("recv tdls peer traffic response frame\n");
  46688. + ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);
  46689. + break;
  46690. + case TDLS_CHANNEL_SWITCH_REQUEST:
  46691. + DBG_871X("recv tdls channel switch request frame\n");
  46692. + ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame);
  46693. + break;
  46694. + case TDLS_CHANNEL_SWITCH_RESPONSE:
  46695. + DBG_871X("recv tdls channel switch response frame\n");
  46696. + ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame);
  46697. + break;
  46698. +#ifdef CONFIG_WFD
  46699. + case 0x50: //First byte of WFA OUI
  46700. + if( _rtw_memcmp(WFA_OUI, (paction), 3) )
  46701. + {
  46702. + if( *(paction + 3) == 0x04) //Probe request frame
  46703. + {
  46704. + //WFDTDLS: for sigma test, do not setup direct link automatically
  46705. + ptdlsinfo->dev_discovered = 1;
  46706. + DBG_871X("recv tunneled probe request frame\n");
  46707. + issue_tunneled_probe_rsp(adapter, precv_frame);
  46708. + }
  46709. + if( *(paction + 3) == 0x05) //Probe response frame
  46710. + {
  46711. + //WFDTDLS: for sigma test, do not setup direct link automatically
  46712. + ptdlsinfo->dev_discovered = 1;
  46713. + DBG_871X("recv tunneled probe response frame\n");
  46714. + }
  46715. + }
  46716. + break;
  46717. +#endif //CONFIG_WFD
  46718. + default:
  46719. + DBG_871X("receive TDLS frame but not supported\n");
  46720. + ret=_FAIL;
  46721. + break;
  46722. + }
  46723. +
  46724. +exit:
  46725. + return ret;
  46726. +
  46727. +}
  46728. +#endif //CONFIG_TDLS
  46729. +
  46730. +void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta);
  46731. +void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta)
  46732. +{
  46733. + int sz;
  46734. + struct sta_info *psta = NULL;
  46735. + struct stainfo_stats *pstats = NULL;
  46736. + struct rx_pkt_attrib *pattrib = & prframe->u.hdr.attrib;
  46737. + struct recv_priv *precvpriv = &padapter->recvpriv;
  46738. +
  46739. + sz = get_recvframe_len(prframe);
  46740. + precvpriv->rx_bytes += sz;
  46741. +
  46742. + padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;
  46743. +
  46744. + if( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){
  46745. + padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;
  46746. + }
  46747. +
  46748. + if(sta)
  46749. + psta = sta;
  46750. + else
  46751. + psta = prframe->u.hdr.psta;
  46752. +
  46753. + if(psta)
  46754. + {
  46755. + pstats = &psta->sta_stats;
  46756. +
  46757. + pstats->rx_data_pkts++;
  46758. + pstats->rx_bytes += sz;
  46759. + }
  46760. +
  46761. +}
  46762. +
  46763. +sint sta2sta_data_frame(
  46764. + _adapter *adapter,
  46765. + union recv_frame *precv_frame,
  46766. + struct sta_info**psta
  46767. +);
  46768. +sint sta2sta_data_frame(
  46769. + _adapter *adapter,
  46770. + union recv_frame *precv_frame,
  46771. + struct sta_info**psta
  46772. +)
  46773. +{
  46774. + u8 *ptr = precv_frame->u.hdr.rx_data;
  46775. + sint ret = _SUCCESS;
  46776. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  46777. + struct sta_priv *pstapriv = &adapter->stapriv;
  46778. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  46779. + u8 *mybssid = get_bssid(pmlmepriv);
  46780. + u8 *myhwaddr = myid(&adapter->eeprompriv);
  46781. + u8 * sta_addr = NULL;
  46782. + sint bmcast = IS_MCAST(pattrib->dst);
  46783. +
  46784. +#ifdef CONFIG_TDLS
  46785. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  46786. + struct sta_info *ptdls_sta=NULL;
  46787. + u8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
  46788. + u8 *pframe_body = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  46789. +#endif //CONFIG_TDLS
  46790. +
  46791. +_func_enter_;
  46792. +
  46793. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  46794. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
  46795. + {
  46796. +
  46797. + // filter packets that SA is myself or multicast or broadcast
  46798. + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){
  46799. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n"));
  46800. + ret= _FAIL;
  46801. + goto exit;
  46802. + }
  46803. +
  46804. + if( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast) ){
  46805. + ret= _FAIL;
  46806. + goto exit;
  46807. + }
  46808. +
  46809. + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  46810. + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  46811. + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) {
  46812. + ret= _FAIL;
  46813. + goto exit;
  46814. + }
  46815. +
  46816. + sta_addr = pattrib->src;
  46817. +
  46818. + }
  46819. + else if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  46820. + {
  46821. +#ifdef CONFIG_TDLS
  46822. + //direct link data transfer
  46823. + if(ptdlsinfo->setup_state == TDLS_LINKED_STATE){
  46824. + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);
  46825. + if(ptdls_sta==NULL)
  46826. + {
  46827. + ret=_FAIL;
  46828. + goto exit;
  46829. + }
  46830. + else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE)
  46831. + {
  46832. + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data
  46833. + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE)
  46834. + {
  46835. + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6)))
  46836. + {
  46837. + DBG_871X("drop QoS-Sybtype Data\n");
  46838. + ret= _FAIL;
  46839. + goto exit;
  46840. + }
  46841. + }
  46842. + // filter packets that SA is myself or multicast or broadcast
  46843. + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){
  46844. + ret= _FAIL;
  46845. + goto exit;
  46846. + }
  46847. + // da should be for me
  46848. + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast))
  46849. + {
  46850. + ret= _FAIL;
  46851. + goto exit;
  46852. + }
  46853. + // check BSSID
  46854. + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  46855. + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  46856. + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) )
  46857. + {
  46858. + ret= _FAIL;
  46859. + goto exit;
  46860. + }
  46861. +
  46862. + //process UAPSD tdls sta
  46863. + process_pwrbit_data(adapter, precv_frame);
  46864. +
  46865. + // if NULL-frame, check pwrbit
  46866. + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL)
  46867. + {
  46868. + //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA
  46869. + if(GetPwrMgt(ptr))
  46870. + {
  46871. + DBG_871X("TDLS: recv peer null frame with pwr bit 1\n");
  46872. + ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE;
  46873. + }
  46874. + // it would be triggered when we are off channel and receiving NULL DATA
  46875. + // we can confirm that peer STA is at off channel
  46876. + else if(ptdls_sta->tdls_sta_state&TDLS_CH_SWITCH_ON_STATE)
  46877. + {
  46878. + if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE)
  46879. + {
  46880. + issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta, 0);
  46881. + ptdls_sta->tdls_sta_state |= TDLS_PEER_AT_OFF_STATE;
  46882. + On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);
  46883. + }
  46884. + }
  46885. +
  46886. + ret= _FAIL;
  46887. + goto exit;
  46888. + }
  46889. + //receive some of all TDLS management frames, process it at ON_TDLS
  46890. + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){
  46891. + ret= OnTDLS(adapter, precv_frame);
  46892. + goto exit;
  46893. + }
  46894. +
  46895. + }
  46896. +
  46897. + sta_addr = pattrib->src;
  46898. +
  46899. + }
  46900. + else
  46901. +#endif //CONFIG_TDLS
  46902. + {
  46903. + // For Station mode, sa and bssid should always be BSSID, and DA is my mac-address
  46904. + if(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) )
  46905. + {
  46906. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("bssid != TA under STATION_MODE; drop pkt\n"));
  46907. + ret= _FAIL;
  46908. + goto exit;
  46909. + }
  46910. +
  46911. + sta_addr = pattrib->bssid;
  46912. + }
  46913. + }
  46914. + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  46915. + {
  46916. + if (bmcast)
  46917. + {
  46918. + // For AP mode, if DA == MCAST, then BSSID should be also MCAST
  46919. + if (!IS_MCAST(pattrib->bssid)){
  46920. + ret= _FAIL;
  46921. + goto exit;
  46922. + }
  46923. + }
  46924. + else // not mc-frame
  46925. + {
  46926. + // For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID
  46927. + if(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) {
  46928. + ret= _FAIL;
  46929. + goto exit;
  46930. + }
  46931. +
  46932. + sta_addr = pattrib->src;
  46933. + }
  46934. +
  46935. + }
  46936. + else if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  46937. + {
  46938. + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
  46939. + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);
  46940. + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
  46941. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  46942. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  46943. +
  46944. + sta_addr = mybssid;
  46945. + }
  46946. + else
  46947. + {
  46948. + ret = _FAIL;
  46949. + }
  46950. +
  46951. +
  46952. +
  46953. + if(bmcast)
  46954. + *psta = rtw_get_bcmc_stainfo(adapter);
  46955. + else
  46956. + *psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info
  46957. +
  46958. +#ifdef CONFIG_TDLS
  46959. + if(ptdls_sta != NULL)
  46960. + *psta = ptdls_sta;
  46961. +#endif //CONFIG_TDLS
  46962. +
  46963. +
  46964. + if (*psta == NULL) {
  46965. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under sta2sta_data_frame ; drop pkt\n"));
  46966. +#ifdef CONFIG_MP_INCLUDED
  46967. + if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  46968. + adapter->mppriv.rx_pktloss++;
  46969. +#endif
  46970. + ret= _FAIL;
  46971. + goto exit;
  46972. + }
  46973. +
  46974. +exit:
  46975. +_func_exit_;
  46976. + return ret;
  46977. +
  46978. +}
  46979. +
  46980. +sint ap2sta_data_frame(
  46981. + _adapter *adapter,
  46982. + union recv_frame *precv_frame,
  46983. + struct sta_info**psta );
  46984. +sint ap2sta_data_frame(
  46985. + _adapter *adapter,
  46986. + union recv_frame *precv_frame,
  46987. + struct sta_info**psta )
  46988. +{
  46989. + u8 *ptr = precv_frame->u.hdr.rx_data;
  46990. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  46991. + sint ret = _SUCCESS;
  46992. + struct sta_priv *pstapriv = &adapter->stapriv;
  46993. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  46994. + u8 *mybssid = get_bssid(pmlmepriv);
  46995. + u8 *myhwaddr = myid(&adapter->eeprompriv);
  46996. + sint bmcast = IS_MCAST(pattrib->dst);
  46997. +
  46998. +_func_enter_;
  46999. +
  47000. + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  47001. + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE
  47002. + || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE )
  47003. + )
  47004. + {
  47005. +
  47006. + // filter packets that SA is myself or multicast or broadcast
  47007. + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){
  47008. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n"));
  47009. + #ifdef DBG_RX_DROP_FRAME
  47010. + DBG_871X("DBG_RX_DROP_FRAME %s SA=%x:%x:%x:%x:%x:%x, myhwaddr= %x:%x:%x:%x:%x:%x\n", __FUNCTION__,
  47011. + pattrib->src[0], pattrib->src[1], pattrib->src[2],
  47012. + pattrib->src[3], pattrib->src[4], pattrib->src[5],
  47013. + *(myhwaddr), *(myhwaddr+1), *(myhwaddr+2),
  47014. + *(myhwaddr+3), *(myhwaddr+4), *(myhwaddr+5));
  47015. + #endif
  47016. + ret= _FAIL;
  47017. + goto exit;
  47018. + }
  47019. +
  47020. + // da should be for me
  47021. + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast))
  47022. + {
  47023. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,
  47024. + (" ap2sta_data_frame: compare DA fail; DA="MAC_FMT"\n", MAC_ARG(pattrib->dst)));
  47025. + #ifdef DBG_RX_DROP_FRAME
  47026. + DBG_871X("DBG_RX_DROP_FRAME %s DA="MAC_FMT"\n", __func__, MAC_ARG(pattrib->dst));
  47027. + #endif
  47028. + ret= _FAIL;
  47029. + goto exit;
  47030. + }
  47031. +
  47032. +
  47033. + // check BSSID
  47034. + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  47035. + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  47036. + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) )
  47037. + {
  47038. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,
  47039. + (" ap2sta_data_frame: compare BSSID fail ; BSSID="MAC_FMT"\n", MAC_ARG(pattrib->bssid)));
  47040. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("mybssid="MAC_FMT"\n", MAC_ARG(mybssid)));
  47041. + #ifdef DBG_RX_DROP_FRAME
  47042. + DBG_871X("DBG_RX_DROP_FRAME %s BSSID="MAC_FMT", mybssid="MAC_FMT"\n",
  47043. + __FUNCTION__, MAC_ARG(pattrib->bssid), MAC_ARG(mybssid));
  47044. + DBG_871X( "this adapter = %d, buddy adapter = %d\n", adapter->adapter_type, adapter->pbuddy_adapter->adapter_type );
  47045. + #endif
  47046. +
  47047. + if(!bmcast)
  47048. + {
  47049. + DBG_871X("issue_deauth to the nonassociated ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
  47050. + issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  47051. + }
  47052. +
  47053. + ret= _FAIL;
  47054. + goto exit;
  47055. + }
  47056. +
  47057. + if(bmcast)
  47058. + *psta = rtw_get_bcmc_stainfo(adapter);
  47059. + else
  47060. + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info
  47061. +
  47062. + if (*psta == NULL) {
  47063. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ap2sta: can't get psta under STATION_MODE ; drop pkt\n"));
  47064. + #ifdef DBG_RX_DROP_FRAME
  47065. + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__);
  47066. + #endif
  47067. + ret= _FAIL;
  47068. + goto exit;
  47069. + }
  47070. +
  47071. + if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {
  47072. + }
  47073. +
  47074. + if (GetFrameSubType(ptr) & BIT(6)) {
  47075. + /* No data, will not indicate to upper layer, temporily count it here */
  47076. + count_rx_stats(adapter, precv_frame, *psta);
  47077. + ret = RTW_RX_HANDLED;
  47078. + goto exit;
  47079. + }
  47080. +
  47081. + }
  47082. + else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&
  47083. + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )
  47084. + {
  47085. + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
  47086. + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);
  47087. + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
  47088. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  47089. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  47090. +
  47091. + //
  47092. + _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN);
  47093. +
  47094. +
  47095. + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
  47096. + if (*psta == NULL) {
  47097. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n"));
  47098. + #ifdef DBG_RX_DROP_FRAME
  47099. + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__);
  47100. + #endif
  47101. + ret= _FAIL;
  47102. + goto exit;
  47103. + }
  47104. +
  47105. +
  47106. + }
  47107. + else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  47108. + {
  47109. + /* Special case */
  47110. + ret = RTW_RX_HANDLED;
  47111. + goto exit;
  47112. + }
  47113. + else
  47114. + {
  47115. + if(_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)&& (!bmcast))
  47116. + {
  47117. + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
  47118. + if (*psta == NULL)
  47119. + {
  47120. + DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
  47121. +
  47122. + issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  47123. + }
  47124. + }
  47125. +
  47126. + ret = _FAIL;
  47127. + #ifdef DBG_RX_DROP_FRAME
  47128. + DBG_871X("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv));
  47129. + #endif
  47130. + }
  47131. +
  47132. +exit:
  47133. +
  47134. +_func_exit_;
  47135. +
  47136. + return ret;
  47137. +
  47138. +}
  47139. +
  47140. +sint sta2ap_data_frame(
  47141. + _adapter *adapter,
  47142. + union recv_frame *precv_frame,
  47143. + struct sta_info**psta );
  47144. +sint sta2ap_data_frame(
  47145. + _adapter *adapter,
  47146. + union recv_frame *precv_frame,
  47147. + struct sta_info**psta )
  47148. +{
  47149. + u8 *ptr = precv_frame->u.hdr.rx_data;
  47150. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  47151. + struct sta_priv *pstapriv = &adapter->stapriv;
  47152. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  47153. + unsigned char *mybssid = get_bssid(pmlmepriv);
  47154. + sint ret=_SUCCESS;
  47155. +
  47156. +_func_enter_;
  47157. +
  47158. + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  47159. + {
  47160. + //For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR
  47161. + if(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))
  47162. + {
  47163. + ret= _FAIL;
  47164. + goto exit;
  47165. + }
  47166. +
  47167. + *psta = rtw_get_stainfo(pstapriv, pattrib->src);
  47168. + if (*psta == NULL)
  47169. + {
  47170. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under AP_MODE; drop pkt\n"));
  47171. + DBG_871X("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src));
  47172. +
  47173. + issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  47174. +
  47175. + ret = RTW_RX_HANDLED;
  47176. + goto exit;
  47177. + }
  47178. +
  47179. + process_pwrbit_data(adapter, precv_frame);
  47180. +
  47181. + if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {
  47182. + process_wmmps_data(adapter, precv_frame);
  47183. + }
  47184. +
  47185. + if (GetFrameSubType(ptr) & BIT(6)) {
  47186. + /* No data, will not indicate to upper layer, temporily count it here */
  47187. + count_rx_stats(adapter, precv_frame, *psta);
  47188. + ret = RTW_RX_HANDLED;
  47189. + goto exit;
  47190. + }
  47191. + }
  47192. + else {
  47193. + u8 *myhwaddr = myid(&adapter->eeprompriv);
  47194. + if (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) {
  47195. + ret = RTW_RX_HANDLED;
  47196. + goto exit;
  47197. + }
  47198. + DBG_871X("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src));
  47199. + issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  47200. + ret = RTW_RX_HANDLED;
  47201. + goto exit;
  47202. + }
  47203. +
  47204. +exit:
  47205. +
  47206. +_func_exit_;
  47207. +
  47208. + return ret;
  47209. +
  47210. +}
  47211. +
  47212. +sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame);
  47213. +sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
  47214. +{
  47215. +#ifdef CONFIG_AP_MODE
  47216. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  47217. + struct sta_priv *pstapriv = &padapter->stapriv;
  47218. + u8 *pframe = precv_frame->u.hdr.rx_data;
  47219. + //uint len = precv_frame->u.hdr.len;
  47220. +
  47221. + //DBG_871X("+validate_recv_ctrl_frame\n");
  47222. +
  47223. + if (GetFrameType(pframe) != WIFI_CTRL_TYPE)
  47224. + {
  47225. + return _FAIL;
  47226. + }
  47227. +
  47228. + //receive the frames that ra(a1) is my address
  47229. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN))
  47230. + {
  47231. + return _FAIL;
  47232. + }
  47233. +
  47234. + //only handle ps-poll
  47235. + if(GetFrameSubType(pframe) == WIFI_PSPOLL)
  47236. + {
  47237. + u16 aid;
  47238. + u8 wmmps_ac=0;
  47239. + struct sta_info *psta=NULL;
  47240. +
  47241. + aid = GetAid(pframe);
  47242. + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
  47243. +
  47244. + if((psta==NULL) || (psta->aid!=aid))
  47245. + {
  47246. + return _FAIL;
  47247. + }
  47248. +
  47249. + //for rx pkt statistics
  47250. + psta->sta_stats.rx_ctrl_pkts++;
  47251. +
  47252. + switch(pattrib->priority)
  47253. + {
  47254. + case 1:
  47255. + case 2:
  47256. + wmmps_ac = psta->uapsd_bk&BIT(0);
  47257. + break;
  47258. + case 4:
  47259. + case 5:
  47260. + wmmps_ac = psta->uapsd_vi&BIT(0);
  47261. + break;
  47262. + case 6:
  47263. + case 7:
  47264. + wmmps_ac = psta->uapsd_vo&BIT(0);
  47265. + break;
  47266. + case 0:
  47267. + case 3:
  47268. + default:
  47269. + wmmps_ac = psta->uapsd_be&BIT(0);
  47270. + break;
  47271. + }
  47272. +
  47273. + if(wmmps_ac)
  47274. + return _FAIL;
  47275. +
  47276. + if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
  47277. + {
  47278. + DBG_871X("%s alive check-rx ps-poll\n", __func__);
  47279. + psta->expire_to = pstapriv->expire_to;
  47280. + psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
  47281. + }
  47282. +
  47283. + if((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid)))
  47284. + {
  47285. + _irqL irqL;
  47286. + _list *xmitframe_plist, *xmitframe_phead;
  47287. + struct xmit_frame *pxmitframe=NULL;
  47288. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  47289. +
  47290. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  47291. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  47292. +
  47293. + xmitframe_phead = get_list_head(&psta->sleep_q);
  47294. + xmitframe_plist = get_next(xmitframe_phead);
  47295. +
  47296. + if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  47297. + {
  47298. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  47299. +
  47300. + xmitframe_plist = get_next(xmitframe_plist);
  47301. +
  47302. + rtw_list_delete(&pxmitframe->list);
  47303. +
  47304. + psta->sleepq_len--;
  47305. +
  47306. + if(psta->sleepq_len>0)
  47307. + pxmitframe->attrib.mdata = 1;
  47308. + else
  47309. + pxmitframe->attrib.mdata = 0;
  47310. +
  47311. + pxmitframe->attrib.triggered = 1;
  47312. +
  47313. + //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
  47314. +
  47315. +#if 0
  47316. + _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  47317. + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  47318. + {
  47319. + rtw_os_xmit_complete(padapter, pxmitframe);
  47320. + }
  47321. + _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  47322. +#endif
  47323. + rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  47324. +
  47325. + if(psta->sleepq_len==0)
  47326. + {
  47327. + pstapriv->tim_bitmap &= ~BIT(psta->aid);
  47328. +
  47329. + //DBG_871X("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap);
  47330. +
  47331. + //upate BCN for TIM IE
  47332. + //update_BCNTIM(padapter);
  47333. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  47334. + }
  47335. +
  47336. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  47337. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  47338. +
  47339. + }
  47340. + else
  47341. + {
  47342. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  47343. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  47344. +
  47345. + //DBG_871X("no buffered packets to xmit\n");
  47346. + if(pstapriv->tim_bitmap&BIT(psta->aid))
  47347. + {
  47348. + if(psta->sleepq_len==0)
  47349. + {
  47350. + DBG_871X("no buffered packets to xmit\n");
  47351. +
  47352. + //issue nulldata with More data bit = 0 to indicate we have no buffered packets
  47353. + issue_nulldata(padapter, psta->hwaddr, 0, 0, 0);
  47354. + }
  47355. + else
  47356. + {
  47357. + DBG_871X("error!psta->sleepq_len=%d\n", psta->sleepq_len);
  47358. + psta->sleepq_len=0;
  47359. + }
  47360. +
  47361. + pstapriv->tim_bitmap &= ~BIT(psta->aid);
  47362. +
  47363. + //upate BCN for TIM IE
  47364. + //update_BCNTIM(padapter);
  47365. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  47366. + }
  47367. +
  47368. + }
  47369. +
  47370. + }
  47371. +
  47372. + }
  47373. +
  47374. +#endif
  47375. +
  47376. + return _FAIL;
  47377. +
  47378. +}
  47379. +
  47380. +union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame);
  47381. +sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame);
  47382. +sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame)
  47383. +{
  47384. + //struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  47385. +
  47386. + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n"));
  47387. +
  47388. +#if 0
  47389. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  47390. + {
  47391. +#ifdef CONFIG_NATIVEAP_MLME
  47392. + mgt_dispatcher(padapter, precv_frame);
  47393. +#else
  47394. + rtw_hostapd_mlme_rx(padapter, precv_frame);
  47395. +#endif
  47396. + }
  47397. + else
  47398. + {
  47399. + mgt_dispatcher(padapter, precv_frame);
  47400. + }
  47401. +#endif
  47402. +
  47403. + precv_frame = recvframe_chk_defrag(padapter, precv_frame);
  47404. + if (precv_frame == NULL) {
  47405. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,("%s: fragment packet\n",__FUNCTION__));
  47406. + return _SUCCESS;
  47407. + }
  47408. +
  47409. + {
  47410. + //for rx pkt statistics
  47411. + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data));
  47412. + if (psta) {
  47413. + psta->sta_stats.rx_mgnt_pkts++;
  47414. + if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_BEACON)
  47415. + psta->sta_stats.rx_beacon_pkts++;
  47416. + else if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBEREQ)
  47417. + psta->sta_stats.rx_probereq_pkts++;
  47418. + else if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBERSP) {
  47419. + if (_rtw_memcmp(padapter->eeprompriv.mac_addr, GetAddr1Ptr(precv_frame->u.hdr.rx_data), ETH_ALEN) == _TRUE)
  47420. + psta->sta_stats.rx_probersp_pkts++;
  47421. + else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data))
  47422. + || is_multicast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data)))
  47423. + psta->sta_stats.rx_probersp_bm_pkts++;
  47424. + else
  47425. + psta->sta_stats.rx_probersp_uo_pkts++;
  47426. + }
  47427. + }
  47428. + }
  47429. +
  47430. +#ifdef CONFIG_INTEL_PROXIM
  47431. + if(padapter->proximity.proxim_on==_TRUE)
  47432. + {
  47433. + struct rx_pkt_attrib * pattrib=&precv_frame->u.hdr.attrib;
  47434. + struct recv_stat* prxstat=( struct recv_stat * ) precv_frame->u.hdr.rx_head ;
  47435. + u8 * pda,*psa,*pbssid,*ptr;
  47436. + ptr=precv_frame->u.hdr.rx_data;
  47437. + pda = get_da(ptr);
  47438. + psa = get_sa(ptr);
  47439. + pbssid = get_hdr_bssid(ptr);
  47440. +
  47441. +
  47442. + _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
  47443. + _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
  47444. +
  47445. + _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
  47446. +
  47447. + switch(pattrib->to_fr_ds)
  47448. + {
  47449. + case 0:
  47450. + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  47451. + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  47452. + break;
  47453. +
  47454. + case 1:
  47455. + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  47456. + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
  47457. + break;
  47458. +
  47459. + case 2:
  47460. + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
  47461. + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  47462. + break;
  47463. +
  47464. + case 3:
  47465. + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  47466. + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
  47467. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n"));
  47468. + break;
  47469. +
  47470. + default:
  47471. + break;
  47472. +
  47473. + }
  47474. + pattrib->priority=0;
  47475. + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24;
  47476. +
  47477. + padapter->proximity.proxim_rx(padapter,precv_frame);
  47478. + }
  47479. +#endif
  47480. + mgt_dispatcher(padapter, precv_frame);
  47481. +
  47482. + return _SUCCESS;
  47483. +
  47484. +}
  47485. +
  47486. +sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame);
  47487. +sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame)
  47488. +{
  47489. + u8 bretry;
  47490. + u8 *psa, *pda, *pbssid;
  47491. + struct sta_info *psta = NULL;
  47492. + u8 *ptr = precv_frame->u.hdr.rx_data;
  47493. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  47494. + struct security_priv *psecuritypriv = &adapter->securitypriv;
  47495. + sint ret = _SUCCESS;
  47496. +#ifdef CONFIG_TDLS
  47497. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  47498. +#endif //CONFIG_TDLS
  47499. +
  47500. +_func_enter_;
  47501. +
  47502. + bretry = GetRetry(ptr);
  47503. + pda = get_da(ptr);
  47504. + psa = get_sa(ptr);
  47505. + pbssid = get_hdr_bssid(ptr);
  47506. +
  47507. + if(pbssid == NULL){
  47508. + ret= _FAIL;
  47509. + goto exit;
  47510. + }
  47511. +
  47512. + _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
  47513. + _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
  47514. +
  47515. + _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
  47516. +
  47517. + switch(pattrib->to_fr_ds)
  47518. + {
  47519. + case 0:
  47520. + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  47521. + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  47522. + ret = sta2sta_data_frame(adapter, precv_frame, &psta);
  47523. + break;
  47524. +
  47525. + case 1:
  47526. + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  47527. + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
  47528. + ret = ap2sta_data_frame(adapter, precv_frame, &psta);
  47529. + break;
  47530. +
  47531. + case 2:
  47532. + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
  47533. + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  47534. + ret = sta2ap_data_frame(adapter, precv_frame, &psta);
  47535. + break;
  47536. +
  47537. + case 3:
  47538. + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  47539. + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
  47540. + ret =_FAIL;
  47541. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n"));
  47542. + break;
  47543. +
  47544. + default:
  47545. + ret =_FAIL;
  47546. + break;
  47547. +
  47548. + }
  47549. +
  47550. + if(ret ==_FAIL){
  47551. + #ifdef DBG_RX_DROP_FRAME
  47552. + DBG_871X("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, ret);
  47553. + #endif
  47554. + goto exit;
  47555. + } else if (ret == RTW_RX_HANDLED) {
  47556. + goto exit;
  47557. + }
  47558. +
  47559. +
  47560. + if(psta==NULL){
  47561. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" after to_fr_ds_chk; psta==NULL \n"));
  47562. + ret= _FAIL;
  47563. + goto exit;
  47564. + }
  47565. +
  47566. + //psta->rssi = prxcmd->rssi;
  47567. + //psta->signal_quality= prxcmd->sq;
  47568. + precv_frame->u.hdr.psta = psta;
  47569. +
  47570. +
  47571. + pattrib->amsdu=0;
  47572. + pattrib->ack_policy = 0;
  47573. + //parsing QC field
  47574. + if(pattrib->qos == 1)
  47575. + {
  47576. + pattrib->priority = GetPriority((ptr + 24));
  47577. + pattrib->ack_policy = GetAckpolicy((ptr + 24));
  47578. + pattrib->amsdu = GetAMsdu((ptr + 24));
  47579. + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26;
  47580. +
  47581. + if(pattrib->priority!=0 && pattrib->priority!=3)
  47582. + {
  47583. + adapter->recvpriv.bIsAnyNonBEPkts = _TRUE;
  47584. + }
  47585. + }
  47586. + else
  47587. + {
  47588. + pattrib->priority=0;
  47589. + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24;
  47590. + }
  47591. +
  47592. +
  47593. + if(pattrib->order)//HT-CTRL 11n
  47594. + {
  47595. + pattrib->hdrlen += 4;
  47596. + }
  47597. +
  47598. + precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
  47599. +
  47600. + // decache, drop duplicate recv packets
  47601. + if(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL)
  47602. + {
  47603. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n"));
  47604. + ret= _FAIL;
  47605. + goto exit;
  47606. + }
  47607. +
  47608. +#if 0
  47609. + if(psta->tdls_sta_state & TDLS_LINKED_STATE )
  47610. + {
  47611. + if(psta->dot118021XPrivacy==_AES_)
  47612. + pattrib->encrypt=psta->dot118021XPrivacy;
  47613. + }
  47614. +#endif //CONFIG_TDLS
  47615. +
  47616. + if(pattrib->privacy){
  47617. +
  47618. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy));
  47619. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0],IS_MCAST(pattrib->ra)));
  47620. +
  47621. +#ifdef CONFIG_TDLS
  47622. + if((psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta->dot118021XPrivacy==_AES_))
  47623. + {
  47624. + pattrib->encrypt=psta->dot118021XPrivacy;
  47625. + }
  47626. + else
  47627. +#endif //CONFIG_TDLS
  47628. + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra));
  47629. +
  47630. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n pattrib->encrypt=%d\n",pattrib->encrypt));
  47631. +
  47632. + SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);
  47633. + }
  47634. + else
  47635. + {
  47636. + pattrib->encrypt = 0;
  47637. + pattrib->iv_len = pattrib->icv_len = 0;
  47638. + }
  47639. +
  47640. +exit:
  47641. +
  47642. +_func_exit_;
  47643. +
  47644. + return ret;
  47645. +}
  47646. +
  47647. +#ifdef CONFIG_IEEE80211W
  47648. +static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_frame)
  47649. +{
  47650. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  47651. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  47652. + u8 *ptr = precv_frame->u.hdr.rx_data;
  47653. + u8 type;
  47654. + u8 subtype;
  47655. +
  47656. + type = GetFrameType(ptr);
  47657. + subtype = GetFrameSubType(ptr); //bit(7)~bit(2)
  47658. +
  47659. + //only support station mode
  47660. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)
  47661. + && adapter->securitypriv.binstallBIPkey == _TRUE)
  47662. + {
  47663. + //unicast management frame decrypt
  47664. + if(pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) &&
  47665. + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION))
  47666. + {
  47667. + u8 *ppp, *mgmt_DATA;
  47668. + u32 data_len=0;
  47669. + ppp = GetAddr2Ptr(ptr);
  47670. +
  47671. + pattrib->bdecrypted = 0;
  47672. + pattrib->encrypt = _AES_;
  47673. + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  47674. + //set iv and icv length
  47675. + SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);
  47676. + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  47677. + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
  47678. + //actual management data frame body
  47679. + data_len = pattrib->pkt_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;
  47680. + mgmt_DATA = rtw_zmalloc(data_len);
  47681. + if(mgmt_DATA == NULL)
  47682. + {
  47683. + DBG_871X("%s mgmt allocate fail !!!!!!!!!\n", __FUNCTION__);
  47684. + goto validate_80211w_fail;
  47685. + }
  47686. + /*//dump the packet content before decrypt
  47687. + {
  47688. + int pp;
  47689. + printk("pattrib->pktlen = %d =>", pattrib->pkt_len);
  47690. + for(pp=0;pp< pattrib->pkt_len; pp++)
  47691. + printk(" %02x ", ptr[pp]);
  47692. + printk("\n");
  47693. + }*/
  47694. +
  47695. + precv_frame = decryptor(adapter, precv_frame);
  47696. + //save actual management data frame body
  47697. + _rtw_memcpy(mgmt_DATA, ptr+pattrib->hdrlen+pattrib->iv_len, data_len);
  47698. + //overwrite the iv field
  47699. + _rtw_memcpy(ptr+pattrib->hdrlen, mgmt_DATA, data_len);
  47700. + //remove the iv and icv length
  47701. + pattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len;
  47702. + rtw_mfree(mgmt_DATA, data_len);
  47703. + /*//print packet content after decryption
  47704. + {
  47705. + int pp;
  47706. + printk("after decryption pattrib->pktlen = %d @@=>", pattrib->pkt_len);
  47707. + for(pp=0;pp< pattrib->pkt_len; pp++)
  47708. + printk(" %02x ", ptr[pp]);
  47709. + printk("\n");
  47710. + }*/
  47711. + if(!precv_frame)
  47712. + {
  47713. + DBG_871X("%s mgmt descrypt fail !!!!!!!!!\n", __FUNCTION__);
  47714. + goto validate_80211w_fail;
  47715. + }
  47716. + }
  47717. + else if(IS_MCAST(GetAddr1Ptr(ptr)) &&
  47718. + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC))
  47719. + {
  47720. + sint BIP_ret = _SUCCESS;
  47721. + //verify BIP MME IE of broadcast/multicast de-auth/disassoc packet
  47722. + BIP_ret = rtw_BIP_verify(adapter, (u8 * )precv_frame);
  47723. + if(BIP_ret == _FAIL)
  47724. + {
  47725. + //DBG_871X("802.11w BIP verify fail\n");
  47726. + goto validate_80211w_fail;
  47727. + }
  47728. + else if(BIP_ret == RTW_RX_HANDLED)
  47729. + {
  47730. + //DBG_871X("802.11w recv none protected packet\n");
  47731. + //issue sa query request
  47732. + issue_action_SA_Query(adapter, NULL, 0, 0);
  47733. + goto validate_80211w_fail;
  47734. + }
  47735. + }//802.11w protect
  47736. + else
  47737. + {
  47738. + if(subtype == WIFI_ACTION)
  47739. + {
  47740. + //according 802.11-2012 standard, these five types are not robust types
  47741. + if( ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC &&
  47742. + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT &&
  47743. + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM &&
  47744. + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED &&
  47745. + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P)
  47746. + {
  47747. + DBG_871X("action frame category=%d should robust\n", ptr[WLAN_HDR_A3_LEN]);
  47748. + goto validate_80211w_fail;
  47749. + }
  47750. + }
  47751. + else if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)
  47752. + {
  47753. + DBG_871X("802.11w recv none protected packet\n");
  47754. + //issue sa query request
  47755. + issue_action_SA_Query(adapter, NULL, 0, 0);
  47756. + goto validate_80211w_fail;
  47757. + }
  47758. + }
  47759. + }
  47760. + return _SUCCESS;
  47761. +
  47762. +validate_80211w_fail:
  47763. + return _FAIL;
  47764. +
  47765. +}
  47766. +#endif //CONFIG_IEEE80211W
  47767. +
  47768. +sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);
  47769. +sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
  47770. +{
  47771. + //shall check frame subtype, to / from ds, da, bssid
  47772. +
  47773. + //then call check if rx seq/frag. duplicated.
  47774. +
  47775. + u8 type;
  47776. + u8 subtype;
  47777. + sint retval = _SUCCESS;
  47778. +
  47779. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  47780. +
  47781. + u8 *ptr = precv_frame->u.hdr.rx_data;
  47782. + u8 ver =(unsigned char) (*ptr)&0x3 ;
  47783. +#ifdef CONFIG_FIND_BEST_CHANNEL
  47784. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  47785. +#endif
  47786. +
  47787. +#ifdef CONFIG_TDLS
  47788. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  47789. +#endif //CONFIG_TDLS
  47790. +
  47791. +_func_enter_;
  47792. +
  47793. +
  47794. +#ifdef CONFIG_FIND_BEST_CHANNEL
  47795. + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
  47796. + int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));
  47797. + if (ch_set_idx >= 0)
  47798. + pmlmeext->channel_set[ch_set_idx].rx_count++;
  47799. + }
  47800. +#endif
  47801. +
  47802. +#ifdef CONFIG_TDLS
  47803. + if(ptdlsinfo->ch_sensing==1 && ptdlsinfo->cur_channel !=0){
  47804. + ptdlsinfo->collect_pkt_num[ptdlsinfo->cur_channel-1]++;
  47805. + }
  47806. +#endif //CONFIG_TDLS
  47807. +
  47808. +#ifdef RTK_DMP_PLATFORM
  47809. + if ( 0 )
  47810. + {
  47811. + DBG_871X("++\n");
  47812. + {
  47813. + int i;
  47814. + for(i=0; i<64;i=i+8)
  47815. + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i),
  47816. + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
  47817. +
  47818. + }
  47819. + DBG_871X("--\n");
  47820. + }
  47821. +#endif //RTK_DMP_PLATFORM
  47822. +
  47823. + //add version chk
  47824. + if(ver!=0){
  47825. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n"));
  47826. + retval= _FAIL;
  47827. + goto exit;
  47828. + }
  47829. +
  47830. + type = GetFrameType(ptr);
  47831. + subtype = GetFrameSubType(ptr); //bit(7)~bit(2)
  47832. +
  47833. + pattrib->to_fr_ds = get_tofr_ds(ptr);
  47834. +
  47835. + pattrib->frag_num = GetFragNum(ptr);
  47836. + pattrib->seq_num = GetSequence(ptr);
  47837. +
  47838. + pattrib->pw_save = GetPwrMgt(ptr);
  47839. + pattrib->mfrag = GetMFrag(ptr);
  47840. + pattrib->mdata = GetMData(ptr);
  47841. + pattrib->privacy = GetPrivacy(ptr);
  47842. + pattrib->order = GetOrder(ptr);
  47843. +#if 0 //for debug
  47844. +
  47845. +if(pHalData->bDumpRxPkt ==1){
  47846. + int i;
  47847. + DBG_871X("############################# \n");
  47848. +
  47849. + for(i=0; i<64;i=i+8)
  47850. + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
  47851. + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
  47852. + DBG_871X("############################# \n");
  47853. +}
  47854. +else if(pHalData->bDumpRxPkt ==2){
  47855. + if(type== WIFI_MGT_TYPE){
  47856. + int i;
  47857. + DBG_871X("############################# \n");
  47858. +
  47859. + for(i=0; i<64;i=i+8)
  47860. + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
  47861. + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
  47862. + DBG_871X("############################# \n");
  47863. + }
  47864. +}
  47865. +else if(pHalData->bDumpRxPkt ==3){
  47866. + if(type== WIFI_DATA_TYPE){
  47867. + int i;
  47868. + DBG_871X("############################# \n");
  47869. +
  47870. + for(i=0; i<64;i=i+8)
  47871. + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
  47872. + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
  47873. + DBG_871X("############################# \n");
  47874. + }
  47875. +}
  47876. +
  47877. +#endif
  47878. + switch (type)
  47879. + {
  47880. + case WIFI_MGT_TYPE: //mgnt
  47881. +#ifdef CONFIG_IEEE80211W
  47882. + if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL)
  47883. + {
  47884. + retval = _FAIL;
  47885. + break;
  47886. + }
  47887. +#endif //CONFIG_IEEE80211W
  47888. +
  47889. + retval = validate_recv_mgnt_frame(adapter, precv_frame);
  47890. + if (retval == _FAIL)
  47891. + {
  47892. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n"));
  47893. + }
  47894. + retval = _FAIL; // only data frame return _SUCCESS
  47895. + break;
  47896. + case WIFI_CTRL_TYPE: //ctrl
  47897. + retval = validate_recv_ctrl_frame(adapter, precv_frame);
  47898. + if (retval == _FAIL)
  47899. + {
  47900. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n"));
  47901. + }
  47902. + retval = _FAIL; // only data frame return _SUCCESS
  47903. + break;
  47904. + case WIFI_DATA_TYPE: //data
  47905. + rtw_led_control(adapter, LED_CTL_RX);
  47906. + pattrib->qos = (subtype & BIT(7))? 1:0;
  47907. + retval = validate_recv_data_frame(adapter, precv_frame);
  47908. + if (retval == _FAIL)
  47909. + {
  47910. + struct recv_priv *precvpriv = &adapter->recvpriv;
  47911. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n"));
  47912. + precvpriv->rx_drop++;
  47913. + }
  47914. + break;
  47915. + default:
  47916. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type));
  47917. + #ifdef DBG_RX_DROP_FRAME
  47918. + DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type);
  47919. + #endif
  47920. + retval = _FAIL;
  47921. + break;
  47922. + }
  47923. +
  47924. +exit:
  47925. +
  47926. +_func_exit_;
  47927. +
  47928. + return retval;
  47929. +}
  47930. +
  47931. +
  47932. +//remove the wlanhdr and add the eth_hdr
  47933. +#if 1
  47934. +
  47935. +sint wlanhdr_to_ethhdr ( union recv_frame *precvframe);
  47936. +sint wlanhdr_to_ethhdr ( union recv_frame *precvframe)
  47937. +{
  47938. + sint rmv_len;
  47939. + u16 eth_type, len;
  47940. + u8 bsnaphdr;
  47941. + u8 *psnap_type;
  47942. + struct ieee80211_snap_hdr *psnap;
  47943. +
  47944. + sint ret=_SUCCESS;
  47945. + _adapter *adapter =precvframe->u.hdr.adapter;
  47946. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  47947. +
  47948. + u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field
  47949. + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;
  47950. +
  47951. +_func_enter_;
  47952. +
  47953. + if(pattrib->encrypt){
  47954. + recvframe_pull_tail(precvframe, pattrib->icv_len);
  47955. + }
  47956. +
  47957. + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len);
  47958. + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
  47959. + /* convert hdr + possible LLC headers into Ethernet header */
  47960. + //eth_type = (psnap_type[0] << 8) | psnap_type[1];
  47961. + if((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&
  47962. + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) &&
  47963. + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )||
  47964. + //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
  47965. + _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){
  47966. + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
  47967. + bsnaphdr = _TRUE;
  47968. + }
  47969. + else {
  47970. + /* Leave Ethernet header part of hdr and full payload */
  47971. + bsnaphdr = _FALSE;
  47972. + }
  47973. +
  47974. + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);
  47975. + len = precvframe->u.hdr.len - rmv_len;
  47976. +
  47977. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len));
  47978. +
  47979. + _rtw_memcpy(&eth_type, ptr+rmv_len, 2);
  47980. + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type
  47981. + pattrib->eth_type = eth_type;
  47982. +
  47983. + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))
  47984. + {
  47985. + ptr += rmv_len ;
  47986. + *ptr = 0x87;
  47987. + *(ptr+1) = 0x12;
  47988. +
  47989. + eth_type = 0x8712;
  47990. + // append rx status for mp test packets
  47991. + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24);
  47992. + _rtw_memcpy(ptr, get_rxmem(precvframe), 24);
  47993. + ptr+=24;
  47994. + }
  47995. + else {
  47996. + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0)));
  47997. + }
  47998. +
  47999. + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
  48000. + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
  48001. +
  48002. + if(!bsnaphdr) {
  48003. + len = htons(len);
  48004. + _rtw_memcpy(ptr+12, &len, 2);
  48005. + }
  48006. +
  48007. +_func_exit_;
  48008. + return ret;
  48009. +
  48010. +}
  48011. +
  48012. +#else
  48013. +
  48014. +sint wlanhdr_to_ethhdr ( union recv_frame *precvframe)
  48015. +{
  48016. + sint rmv_len;
  48017. + u16 eth_type;
  48018. + u8 bsnaphdr;
  48019. + u8 *psnap_type;
  48020. + struct ieee80211_snap_hdr *psnap;
  48021. +
  48022. + sint ret=_SUCCESS;
  48023. + _adapter *adapter =precvframe->u.hdr.adapter;
  48024. + struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  48025. +
  48026. + u8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field
  48027. + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;
  48028. + struct _vlan *pvlan = NULL;
  48029. +
  48030. +_func_enter_;
  48031. +
  48032. + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len);
  48033. + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
  48034. + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03)
  48035. + {
  48036. + if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN))
  48037. + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042;
  48038. + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) &&
  48039. + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) )
  48040. + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK;
  48041. + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN))
  48042. + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL;
  48043. + else {
  48044. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n"));
  48045. + ret= _FAIL;
  48046. + goto exit;
  48047. + }
  48048. +
  48049. + } else
  48050. + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS;
  48051. +
  48052. + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);
  48053. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n", pattrib->hdrlen, pattrib->iv_len));
  48054. +
  48055. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  48056. + {
  48057. + ptr += rmv_len ;
  48058. + *ptr = 0x87;
  48059. + *(ptr+1) = 0x12;
  48060. +
  48061. + //back to original pointer
  48062. + ptr -= rmv_len;
  48063. + }
  48064. +
  48065. + ptr += rmv_len ;
  48066. +
  48067. + _rtw_memcpy(&eth_type, ptr, 2);
  48068. + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type
  48069. + ptr +=2;
  48070. +
  48071. + if(pattrib->encrypt){
  48072. + recvframe_pull_tail(precvframe, pattrib->icv_len);
  48073. + }
  48074. +
  48075. + if(eth_type == 0x8100) //vlan
  48076. + {
  48077. + pvlan = (struct _vlan *) ptr;
  48078. +
  48079. + //eth_type = get_vlan_encap_proto(pvlan);
  48080. + //eth_type = pvlan->h_vlan_encapsulated_proto;//?
  48081. + rmv_len += 4;
  48082. + ptr+=4;
  48083. + }
  48084. +
  48085. + if(eth_type==0x0800)//ip
  48086. + {
  48087. + //struct iphdr* piphdr = (struct iphdr*) ptr;
  48088. + //__u8 tos = (unsigned char)(pattrib->priority & 0xff);
  48089. +
  48090. + //piphdr->tos = tos;
  48091. +
  48092. + //if (piphdr->protocol == 0x06)
  48093. + //{
  48094. + // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", precvframe->u.hdr.len));
  48095. + //}
  48096. + }
  48097. + else if(eth_type==0x8712)// append rx status for mp test packets
  48098. + {
  48099. + //ptr -= 16;
  48100. + //_rtw_memcpy(ptr, get_rxmem(precvframe), 16);
  48101. + }
  48102. + else
  48103. + {
  48104. +#ifdef PLATFORM_OS_XP
  48105. + NDIS_PACKET_8021Q_INFO VlanPriInfo;
  48106. + UINT32 UserPriority = precvframe->u.hdr.attrib.priority;
  48107. + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 );
  48108. +
  48109. + VlanPriInfo.Value = // Get current value.
  48110. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo);
  48111. +
  48112. + VlanPriInfo.TagHeader.UserPriority = UserPriority;
  48113. + VlanPriInfo.TagHeader.VlanId = VlanID ;
  48114. +
  48115. + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero.
  48116. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero.
  48117. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value;
  48118. +#endif
  48119. + }
  48120. +
  48121. + if(eth_type==0x8712)// append rx status for mp test packets
  48122. + {
  48123. + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24);
  48124. + _rtw_memcpy(ptr, get_rxmem(precvframe), 24);
  48125. + ptr+=24;
  48126. + }
  48127. + else
  48128. + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2));
  48129. +
  48130. + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
  48131. + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
  48132. +
  48133. + eth_type = htons((unsigned short)eth_type) ;
  48134. + _rtw_memcpy(ptr+12, &eth_type, 2);
  48135. +
  48136. +exit:
  48137. +
  48138. +_func_exit_;
  48139. +
  48140. + return ret;
  48141. +}
  48142. +#endif
  48143. +
  48144. +
  48145. +#ifdef CONFIG_SDIO_HCI
  48146. +#ifdef PLATFORM_LINUX
  48147. +static void recvframe_expand_pkt(
  48148. + PADAPTER padapter,
  48149. + union recv_frame *prframe)
  48150. +{
  48151. + struct recv_frame_hdr *pfhdr;
  48152. + _pkt *ppkt;
  48153. + u8 shift_sz;
  48154. + u32 alloc_sz;
  48155. +
  48156. +
  48157. + pfhdr = &prframe->u.hdr;
  48158. +
  48159. + // 6 is for IP header 8 bytes alignment in QoS packet case.
  48160. + if (pfhdr->attrib.qos)
  48161. + shift_sz = 6;
  48162. + else
  48163. + shift_sz = 0;
  48164. +
  48165. + // for first fragment packet, need to allocate
  48166. + // (1536 + RXDESC_SIZE + drvinfo_sz) to reassemble packet
  48167. + // 8 is for skb->data 8 bytes alignment.
  48168. +// alloc_sz = _RND(1536 + RXDESC_SIZE + pfhdr->attrib.drvinfosize + shift_sz + 8, 128);
  48169. + alloc_sz = 1664; // round (1536 + 24 + 32 + shift_sz + 8) to 128 bytes alignment
  48170. +
  48171. + //3 1. alloc new skb
  48172. + // prepare extra space for 4 bytes alignment
  48173. + ppkt = rtw_skb_alloc(alloc_sz);
  48174. +
  48175. + if (!ppkt) return; // no way to expand
  48176. +
  48177. + //3 2. Prepare new skb to replace & release old skb
  48178. + // force ppkt->data at 8-byte alignment address
  48179. + skb_reserve(ppkt, 8 - ((SIZE_PTR)ppkt->data & 7));
  48180. + // force ip_hdr at 8-byte alignment address according to shift_sz
  48181. + skb_reserve(ppkt, shift_sz);
  48182. +
  48183. + // copy data to new pkt
  48184. + _rtw_memcpy(skb_put(ppkt, pfhdr->len), pfhdr->rx_data, pfhdr->len);
  48185. +
  48186. + rtw_skb_free(pfhdr->pkt);
  48187. +
  48188. + // attach new pkt to recvframe
  48189. + pfhdr->pkt = ppkt;
  48190. + pfhdr->rx_head = ppkt->head;
  48191. + pfhdr->rx_data = ppkt->data;
  48192. + pfhdr->rx_tail = skb_tail_pointer(ppkt);
  48193. + pfhdr->rx_end = skb_end_pointer(ppkt);
  48194. +}
  48195. +#else
  48196. +#warning "recvframe_expand_pkt not implement, defrag may crash system"
  48197. +#endif
  48198. +#endif
  48199. +
  48200. +//perform defrag
  48201. +union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q);
  48202. +union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q)
  48203. +{
  48204. + _list *plist, *phead;
  48205. + u8 *data,wlanhdr_offset;
  48206. + u8 curfragnum;
  48207. + struct recv_frame_hdr *pfhdr,*pnfhdr;
  48208. + union recv_frame* prframe, *pnextrframe;
  48209. + _queue *pfree_recv_queue;
  48210. +
  48211. +_func_enter_;
  48212. +
  48213. + curfragnum=0;
  48214. + pfree_recv_queue=&adapter->recvpriv.free_recv_queue;
  48215. +
  48216. + phead = get_list_head(defrag_q);
  48217. + plist = get_next(phead);
  48218. + prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  48219. + pfhdr=&prframe->u.hdr;
  48220. + rtw_list_delete(&(prframe->u.list));
  48221. +
  48222. + if(curfragnum!=pfhdr->attrib.frag_num)
  48223. + {
  48224. + //the first fragment number must be 0
  48225. + //free the whole queue
  48226. + rtw_free_recvframe(prframe, pfree_recv_queue);
  48227. + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  48228. +
  48229. + return NULL;
  48230. + }
  48231. +
  48232. +#ifdef CONFIG_SDIO_HCI
  48233. + recvframe_expand_pkt(adapter, prframe);
  48234. +#endif
  48235. +
  48236. + curfragnum++;
  48237. +
  48238. + plist= get_list_head(defrag_q);
  48239. +
  48240. + plist = get_next(plist);
  48241. +
  48242. + data=get_recvframe_data(prframe);
  48243. +
  48244. + while(rtw_end_of_queue_search(phead, plist) == _FALSE)
  48245. + {
  48246. + pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u);
  48247. + pnfhdr=&pnextrframe->u.hdr;
  48248. +
  48249. +
  48250. + //check the fragment sequence (2nd ~n fragment frame)
  48251. +
  48252. + if(curfragnum!=pnfhdr->attrib.frag_num)
  48253. + {
  48254. + //the fragment number must be increasing (after decache)
  48255. + //release the defrag_q & prframe
  48256. + rtw_free_recvframe(prframe, pfree_recv_queue);
  48257. + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  48258. + return NULL;
  48259. + }
  48260. +
  48261. + curfragnum++;
  48262. +
  48263. + //copy the 2nd~n fragment frame's payload to the first fragment
  48264. + //get the 2nd~last fragment frame's payload
  48265. +
  48266. + wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
  48267. +
  48268. + recvframe_pull(pnextrframe, wlanhdr_offset);
  48269. +
  48270. + //append to first fragment frame's tail (if privacy frame, pull the ICV)
  48271. + recvframe_pull_tail(prframe, pfhdr->attrib.icv_len);
  48272. +
  48273. + //memcpy
  48274. + _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len);
  48275. +
  48276. + recvframe_put(prframe, pnfhdr->len);
  48277. +
  48278. + pfhdr->attrib.icv_len=pnfhdr->attrib.icv_len;
  48279. + plist = get_next(plist);
  48280. +
  48281. + };
  48282. +
  48283. + //free the defrag_q queue and return the prframe
  48284. + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  48285. +
  48286. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Performance defrag!!!!!\n"));
  48287. +
  48288. +_func_exit_;
  48289. +
  48290. + return prframe;
  48291. +}
  48292. +
  48293. +//check if need to defrag, if needed queue the frame to defrag_q
  48294. +union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame)
  48295. +{
  48296. + u8 ismfrag;
  48297. + u8 fragnum;
  48298. + u8 *psta_addr;
  48299. + struct recv_frame_hdr *pfhdr;
  48300. + struct sta_info *psta;
  48301. + struct sta_priv *pstapriv;
  48302. + _list *phead;
  48303. + union recv_frame *prtnframe = NULL;
  48304. + _queue *pfree_recv_queue, *pdefrag_q;
  48305. +
  48306. +_func_enter_;
  48307. +
  48308. + pstapriv = &padapter->stapriv;
  48309. +
  48310. + pfhdr = &precv_frame->u.hdr;
  48311. +
  48312. + pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  48313. +
  48314. + //need to define struct of wlan header frame ctrl
  48315. + ismfrag = pfhdr->attrib.mfrag;
  48316. + fragnum = pfhdr->attrib.frag_num;
  48317. +
  48318. + psta_addr = pfhdr->attrib.ta;
  48319. + psta = rtw_get_stainfo(pstapriv, psta_addr);
  48320. + if (psta == NULL)
  48321. + {
  48322. + u8 type = GetFrameType(pfhdr->rx_data);
  48323. + if (type != WIFI_DATA_TYPE) {
  48324. + psta = rtw_get_bcmc_stainfo(padapter);
  48325. + pdefrag_q = &psta->sta_recvpriv.defrag_q;
  48326. + } else
  48327. + pdefrag_q = NULL;
  48328. + }
  48329. + else
  48330. + pdefrag_q = &psta->sta_recvpriv.defrag_q;
  48331. +
  48332. + if ((ismfrag==0) && (fragnum==0))
  48333. + {
  48334. + prtnframe = precv_frame;//isn't a fragment frame
  48335. + }
  48336. +
  48337. + if (ismfrag==1)
  48338. + {
  48339. + //0~(n-1) fragment frame
  48340. + //enqueue to defraf_g
  48341. + if(pdefrag_q != NULL)
  48342. + {
  48343. + if(fragnum==0)
  48344. + {
  48345. + //the first fragment
  48346. + if(_rtw_queue_empty(pdefrag_q) == _FALSE)
  48347. + {
  48348. + //free current defrag_q
  48349. + rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue);
  48350. + }
  48351. + }
  48352. +
  48353. +
  48354. + //Then enqueue the 0~(n-1) fragment into the defrag_q
  48355. +
  48356. + //_rtw_spinlock(&pdefrag_q->lock);
  48357. + phead = get_list_head(pdefrag_q);
  48358. + rtw_list_insert_tail(&pfhdr->list, phead);
  48359. + //_rtw_spinunlock(&pdefrag_q->lock);
  48360. +
  48361. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Enqueuq: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum));
  48362. +
  48363. + prtnframe=NULL;
  48364. +
  48365. + }
  48366. + else
  48367. + {
  48368. + //can't find this ta's defrag_queue, so free this recv_frame
  48369. + rtw_free_recvframe(precv_frame, pfree_recv_queue);
  48370. + prtnframe=NULL;
  48371. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum));
  48372. + }
  48373. +
  48374. + }
  48375. +
  48376. + if((ismfrag==0)&&(fragnum!=0))
  48377. + {
  48378. + //the last fragment frame
  48379. + //enqueue the last fragment
  48380. + if(pdefrag_q != NULL)
  48381. + {
  48382. + //_rtw_spinlock(&pdefrag_q->lock);
  48383. + phead = get_list_head(pdefrag_q);
  48384. + rtw_list_insert_tail(&pfhdr->list,phead);
  48385. + //_rtw_spinunlock(&pdefrag_q->lock);
  48386. +
  48387. + //call recvframe_defrag to defrag
  48388. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("defrag: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum));
  48389. + precv_frame = recvframe_defrag(padapter, pdefrag_q);
  48390. + prtnframe=precv_frame;
  48391. +
  48392. + }
  48393. + else
  48394. + {
  48395. + //can't find this ta's defrag_queue, so free this recv_frame
  48396. + rtw_free_recvframe(precv_frame, pfree_recv_queue);
  48397. + prtnframe=NULL;
  48398. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum));
  48399. + }
  48400. +
  48401. + }
  48402. +
  48403. +
  48404. + if((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy))
  48405. + {
  48406. + //after defrag we must check tkip mic code
  48407. + if(recvframe_chkmic(padapter, prtnframe)==_FAIL)
  48408. + {
  48409. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic(padapter, prtnframe)==_FAIL\n"));
  48410. + rtw_free_recvframe(prtnframe,pfree_recv_queue);
  48411. + prtnframe=NULL;
  48412. + }
  48413. + }
  48414. +
  48415. +_func_exit_;
  48416. +
  48417. + return prtnframe;
  48418. +
  48419. +}
  48420. +
  48421. +#define ENDIAN_FREE 1
  48422. +
  48423. +int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe);
  48424. +int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe)
  48425. +{
  48426. +#if defined (PLATFORM_LINUX) || defined (PLATFORM_FREEBSD) //for amsdu TP improvement,Creator: Thomas
  48427. + int a_len, padding_len;
  48428. + u16 eth_type, nSubframe_Length;
  48429. + u8 nr_subframes, i;
  48430. + unsigned char *pdata;
  48431. + struct rx_pkt_attrib *pattrib;
  48432. +#ifndef PLATFORM_FREEBSD
  48433. + unsigned char *data_ptr;
  48434. + _pkt *sub_skb,*subframes[MAX_SUBFRAME_COUNT];
  48435. +#endif //PLATFORM_FREEBSD
  48436. + struct recv_priv *precvpriv = &padapter->recvpriv;
  48437. + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue);
  48438. + int ret = _SUCCESS;
  48439. +#ifdef PLATFORM_FREEBSD
  48440. + struct mbuf *sub_m=NULL, *subframes[MAX_SUBFRAME_COUNT];
  48441. + u8 *ptr,offset;
  48442. +#endif //PLATFORM_FREEBSD
  48443. + nr_subframes = 0;
  48444. +
  48445. + pattrib = &prframe->u.hdr.attrib;
  48446. +
  48447. + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen);
  48448. +
  48449. + if(prframe->u.hdr.attrib.iv_len >0)
  48450. + {
  48451. + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len);
  48452. + }
  48453. +
  48454. + a_len = prframe->u.hdr.len;
  48455. +
  48456. + pdata = prframe->u.hdr.rx_data;
  48457. +
  48458. + while(a_len > ETH_HLEN) {
  48459. +
  48460. + /* Offset 12 denote 2 mac address */
  48461. +#ifdef ENDIAN_FREE
  48462. + //nSubframe_Length = ntohs(*((u16*)(pdata + 12)));
  48463. + nSubframe_Length = RTW_GET_BE16(pdata + 12);
  48464. +#else // ENDIAN_FREE
  48465. + nSubframe_Length = *((u16*)(pdata + 12));
  48466. + //==m==>change the length order
  48467. + nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8);
  48468. + //ntohs(nSubframe_Length);
  48469. +#endif // ENDIAN_FREE
  48470. +
  48471. + if( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) {
  48472. + DBG_871X("nRemain_Length is %d and nSubframe_Length is : %d\n",a_len,nSubframe_Length);
  48473. + goto exit;
  48474. + }
  48475. +
  48476. +#ifndef PLATFORM_FREEBSD
  48477. + /* move the data point to data content */
  48478. + pdata += ETH_HLEN;
  48479. + a_len -= ETH_HLEN;
  48480. +
  48481. + /* Allocate new skb for releasing to upper layer */
  48482. +#ifdef CONFIG_SKB_COPY
  48483. + sub_skb = rtw_skb_alloc(nSubframe_Length + 12);
  48484. + if(sub_skb)
  48485. + {
  48486. + skb_reserve(sub_skb, 12);
  48487. + data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);
  48488. + _rtw_memcpy(data_ptr, pdata, nSubframe_Length);
  48489. + }
  48490. + else
  48491. +#endif // CONFIG_SKB_COPY
  48492. + {
  48493. + sub_skb = rtw_skb_clone(prframe->u.hdr.pkt);
  48494. + if(sub_skb)
  48495. + {
  48496. + sub_skb->data = pdata;
  48497. + sub_skb->len = nSubframe_Length;
  48498. + skb_set_tail_pointer(sub_skb, nSubframe_Length);
  48499. + }
  48500. + else
  48501. + {
  48502. + DBG_871X("rtw_skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes);
  48503. + break;
  48504. + }
  48505. + }
  48506. +
  48507. +#else // PLATFORM_FREEBSD
  48508. +
  48509. + //PLATFORM_FREEBSD
  48510. + //Allocate a mbuff,
  48511. + //sub_m =m_devget(pdata, nSubframe_Length+12, 12, padapter->pifp,NULL);
  48512. + sub_m =m_devget(pdata, nSubframe_Length+ETH_HLEN, ETHER_ALIGN, padapter->pifp,NULL);
  48513. +
  48514. + pdata += ETH_HLEN;
  48515. + a_len -= ETH_HLEN;
  48516. +#endif // PLATFORM_FREEBSD
  48517. +
  48518. +#ifndef PLATFORM_FREEBSD
  48519. + //sub_skb->dev = padapter->pnetdev;
  48520. + subframes[nr_subframes++] = sub_skb;
  48521. +#else //PLATFORM_FREEBSD
  48522. + //PLATFORM_FREEBSD
  48523. + subframes[nr_subframes++] = sub_m;
  48524. +#endif //PLATFORM_FREEBSD
  48525. +
  48526. + if(nr_subframes >= MAX_SUBFRAME_COUNT) {
  48527. + DBG_871X("ParseSubframe(): Too many Subframes! Packets dropped!\n");
  48528. + break;
  48529. + }
  48530. +
  48531. + pdata += nSubframe_Length;
  48532. + a_len -= nSubframe_Length;
  48533. + if(a_len != 0) {
  48534. + padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1));
  48535. + if(padding_len == 4) {
  48536. + padding_len = 0;
  48537. + }
  48538. +
  48539. + if(a_len < padding_len) {
  48540. + goto exit;
  48541. + }
  48542. + pdata += padding_len;
  48543. + a_len -= padding_len;
  48544. + }
  48545. + }
  48546. +
  48547. + for(i=0; i<nr_subframes; i++){
  48548. +#ifndef PLATFORM_FREEBSD
  48549. + sub_skb = subframes[i];
  48550. + /* convert hdr + possible LLC headers into Ethernet header */
  48551. +#ifdef ENDIAN_FREE
  48552. + //eth_type = ntohs(*(u16*)&sub_skb->data[6]);
  48553. + eth_type = RTW_GET_BE16(&sub_skb->data[6]);
  48554. +#else // ENDIAN_FREE
  48555. + eth_type = (sub_skb->data[6] << 8) | sub_skb->data[7];
  48556. +#endif // ENDIAN_FREE
  48557. + if (sub_skb->len >= 8 &&
  48558. + ((_rtw_memcmp(sub_skb->data, rtw_rfc1042_header, SNAP_SIZE) &&
  48559. + eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
  48560. + _rtw_memcmp(sub_skb->data, rtw_bridge_tunnel_header, SNAP_SIZE) )) {
  48561. + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
  48562. + skb_pull(sub_skb, SNAP_SIZE);
  48563. + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);
  48564. + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);
  48565. + } else {
  48566. + u16 len;
  48567. + /* Leave Ethernet header part of hdr and full payload */
  48568. + len = htons(sub_skb->len);
  48569. + _rtw_memcpy(skb_push(sub_skb, 2), &len, 2);
  48570. + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);
  48571. + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);
  48572. + }
  48573. +
  48574. + /* Indicat the packets to upper layer */
  48575. + if (sub_skb) {
  48576. + //memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
  48577. +
  48578. +#ifdef CONFIG_BR_EXT
  48579. + // Insert NAT2.5 RX here!
  48580. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  48581. + void *br_port = NULL;
  48582. +
  48583. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  48584. + br_port = padapter->pnetdev->br_port;
  48585. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  48586. + rcu_read_lock();
  48587. + br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  48588. + rcu_read_unlock();
  48589. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  48590. +
  48591. +
  48592. + if( br_port && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )
  48593. + {
  48594. + int nat25_handle_frame(_adapter *priv, struct sk_buff *skb);
  48595. + if (nat25_handle_frame(padapter, sub_skb) == -1) {
  48596. + //priv->ext_stats.rx_data_drops++;
  48597. + //DEBUG_ERR("RX DROP: nat25_handle_frame fail!\n");
  48598. + //return FAIL;
  48599. +
  48600. +#if 1
  48601. + // bypass this frame to upper layer!!
  48602. +#else
  48603. + rtw_skb_free(sub_skb);
  48604. + continue;
  48605. +#endif
  48606. + }
  48607. + }
  48608. +#endif // CONFIG_BR_EXT
  48609. +
  48610. + sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
  48611. + sub_skb->dev = padapter->pnetdev;
  48612. +
  48613. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  48614. + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) {
  48615. + sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
  48616. + } else {
  48617. + sub_skb->ip_summed = CHECKSUM_NONE;
  48618. + }
  48619. +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */
  48620. + sub_skb->ip_summed = CHECKSUM_NONE;
  48621. +#endif //CONFIG_TCP_CSUM_OFFLOAD_RX
  48622. +
  48623. + rtw_netif_rx(padapter->pnetdev, sub_skb);
  48624. + }
  48625. +#else //PLATFORM_FREEBSD
  48626. +
  48627. + //PLATFORM_FREEBSD
  48628. + sub_m = subframes[i];
  48629. + ptr=mtod(sub_m, u8 *);
  48630. + offset=ETH_HLEN;
  48631. + /* convert hdr + possible LLC headers into Ethernet header */
  48632. +#ifdef ENDIAN_FREE
  48633. + eth_type = ntohs(*(u16*)&ptr[offset+6]);
  48634. +#else // ENDIAN_FREE
  48635. + eth_type = ( ptr[offset+6] << 8) | ptr[offset+7];
  48636. +#endif // ENDIAN_FREE
  48637. + if (sub_m->m_pkthdr.len >= ETH_HLEN+8 &&
  48638. + ((_rtw_memcmp(ptr+ETH_HLEN, rtw_rfc1042_header, SNAP_SIZE) &&
  48639. + eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
  48640. + _rtw_memcmp(ptr+ETH_HLEN, rtw_bridge_tunnel_header, SNAP_SIZE) )) {
  48641. + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
  48642. + offset+=SNAP_SIZE;
  48643. + _rtw_memcpy(&ptr[offset-ETH_ALEN], pattrib->src, ETH_ALEN);
  48644. + offset-=ETH_ALEN;
  48645. + _rtw_memcpy(&ptr[offset-ETH_ALEN], pattrib->dst, ETH_ALEN);
  48646. + offset-=ETH_ALEN;
  48647. + } else {
  48648. + u16 len;
  48649. + /* Leave Ethernet header part of hdr and full payload */
  48650. + len = htons(sub_m->m_pkthdr.len-offset);
  48651. + _rtw_memcpy(&ptr[offset- 2], &len, 2);
  48652. + offset-=2;
  48653. + _rtw_memcpy(&ptr[offset-ETH_ALEN], pattrib->src, ETH_ALEN);
  48654. + offset-=ETH_ALEN;
  48655. + _rtw_memcpy(&ptr[offset-ETH_ALEN], pattrib->dst, ETH_ALEN);
  48656. + offset-=ETH_ALEN;
  48657. + }
  48658. +
  48659. + m_adj(sub_m,offset);
  48660. +
  48661. + /* Indicat the packets to upper layer */
  48662. + if (sub_m) {
  48663. +
  48664. +#if 0
  48665. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  48666. + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) {
  48667. + sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
  48668. + } else {
  48669. + sub_skb->ip_summed = CHECKSUM_NONE;
  48670. + }
  48671. +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */
  48672. + sub_skb->ip_summed = CHECKSUM_NONE;
  48673. +#endif //CONFIG_TCP_CSUM_OFFLOAD_RX
  48674. +#endif //0
  48675. +
  48676. + if ( ((u32)(mtod(sub_m, caddr_t) + 14) % 4) != 0)
  48677. + printf("%s()-%d: mtod(sub_m) = %p\n", __FUNCTION__, __LINE__, mtod(sub_m, caddr_t));
  48678. +#ifdef CONFIG_RX_INDICATE_QUEUE
  48679. + IF_ENQUEUE(&precvpriv->rx_indicate_queue, sub_m);
  48680. + if (_IF_QLEN(&precvpriv->rx_indicate_queue) <= 1) {
  48681. + taskqueue_enqueue(taskqueue_thread, &precvpriv->rx_indicate_tasklet);
  48682. + }
  48683. +#else // CONFIG_RX_INDICATE_QUEUE
  48684. + (*padapter->pifp->if_input)(padapter->pifp, sub_m);
  48685. +#endif // CONFIG_RX_INDICATE_QUEUE
  48686. + }
  48687. +
  48688. +#endif //PLATFORM_FREEBSD
  48689. + }
  48690. +
  48691. +exit:
  48692. +
  48693. + prframe->u.hdr.len=0;
  48694. + rtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame
  48695. +
  48696. + return ret;
  48697. +#else // || defined (PLATFORM_LINUX) || defined (PLATFORM_FREEBSD)
  48698. +#ifdef PLATFORM_WINDOWS
  48699. + _irqL irql;
  48700. +#endif //PLATFORM_WINDOWS
  48701. + unsigned char *ptr, *pdata, *pbuf, *psnap_type;
  48702. + union recv_frame *pnrframe, *pnrframe_new;
  48703. + int a_len, mv_len, padding_len;
  48704. + u16 eth_type, type_len;
  48705. + u8 bsnaphdr;
  48706. + struct ieee80211_snap_hdr *psnap;
  48707. + struct _vlan *pvlan;
  48708. + struct recv_priv *precvpriv = &padapter->recvpriv;
  48709. + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue);
  48710. + int ret = _SUCCESS;
  48711. +#ifdef PLATFORM_WINDOWS
  48712. + struct recv_buf *precvbuf = prframe->u.hdr.precvbuf;
  48713. +#endif //PLATFORM_WINDOWS
  48714. + a_len = prframe->u.hdr.len - prframe->u.hdr.attrib.hdrlen;
  48715. +
  48716. + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen);
  48717. +
  48718. + if(prframe->u.hdr.attrib.iv_len >0)
  48719. + {
  48720. + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len);
  48721. + }
  48722. +
  48723. + pdata = prframe->u.hdr.rx_data;
  48724. +
  48725. + prframe->u.hdr.len=0;
  48726. +
  48727. + pnrframe = prframe;
  48728. +
  48729. +
  48730. + do{
  48731. +
  48732. + mv_len=0;
  48733. + pnrframe->u.hdr.rx_data = pnrframe->u.hdr.rx_tail = pdata;
  48734. + ptr = pdata;
  48735. +
  48736. +
  48737. + _rtw_memcpy(pnrframe->u.hdr.attrib.dst, ptr, ETH_ALEN);
  48738. + ptr+=ETH_ALEN;
  48739. + _rtw_memcpy(pnrframe->u.hdr.attrib.src, ptr, ETH_ALEN);
  48740. + ptr+=ETH_ALEN;
  48741. +
  48742. + _rtw_memcpy(&type_len, ptr, 2);
  48743. + type_len= ntohs((unsigned short )type_len);
  48744. + ptr +=2;
  48745. + mv_len += ETH_HLEN;
  48746. +
  48747. + recvframe_put(pnrframe, type_len+ETH_HLEN);//update tail;
  48748. +
  48749. + if(pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8)
  48750. + {
  48751. + //panic("pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8\n");
  48752. +
  48753. + rtw_free_recvframe(pnrframe, pfree_recv_queue);
  48754. +
  48755. + goto exit;
  48756. + }
  48757. +
  48758. + psnap=(struct ieee80211_snap_hdr *)(ptr);
  48759. + psnap_type=ptr+SNAP_SIZE;
  48760. + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03)
  48761. + {
  48762. + if ( _rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN))
  48763. + {
  48764. + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042;
  48765. + }
  48766. + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) &&
  48767. + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) )
  48768. + {
  48769. + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK;
  48770. + }
  48771. + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN))
  48772. + {
  48773. + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL;
  48774. + }
  48775. + else
  48776. + {
  48777. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n"));
  48778. +
  48779. + //KeBugCheckEx(0x87123333, 0xe0, 0x4c, 0x87, 0xdd);
  48780. +
  48781. + //panic("0x87123333, 0xe0, 0x4c, 0x87, 0xdd\n");
  48782. +
  48783. + rtw_free_recvframe(pnrframe, pfree_recv_queue);
  48784. +
  48785. + goto exit;
  48786. + }
  48787. +
  48788. + }
  48789. + else
  48790. + {
  48791. + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS;
  48792. + }
  48793. +
  48794. + ptr += (bsnaphdr?SNAP_SIZE:0);
  48795. + _rtw_memcpy(&eth_type, ptr, 2);
  48796. + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type
  48797. +
  48798. + mv_len+= 2+(bsnaphdr?SNAP_SIZE:0);
  48799. + ptr += 2;//now move to iphdr;
  48800. +
  48801. + pvlan = NULL;
  48802. + if(eth_type == 0x8100) //vlan
  48803. + {
  48804. + pvlan = (struct _vlan *)ptr;
  48805. + ptr+=4;
  48806. + mv_len+=4;
  48807. + }
  48808. +
  48809. + if(eth_type==0x0800)//ip
  48810. + {
  48811. + struct iphdr* piphdr = (struct iphdr*)ptr;
  48812. +
  48813. +
  48814. + if (piphdr->protocol == 0x06)
  48815. + {
  48816. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", pnrframe->u.hdr.len));
  48817. + }
  48818. + }
  48819. +#ifdef PLATFORM_OS_XP
  48820. + else
  48821. + {
  48822. + NDIS_PACKET_8021Q_INFO VlanPriInfo;
  48823. + UINT32 UserPriority = pnrframe->u.hdr.attrib.priority;
  48824. + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 );
  48825. +
  48826. + VlanPriInfo.Value = // Get current value.
  48827. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo);
  48828. +
  48829. + VlanPriInfo.TagHeader.UserPriority = UserPriority;
  48830. + VlanPriInfo.TagHeader.VlanId = VlanID;
  48831. +
  48832. + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero.
  48833. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero.
  48834. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value;
  48835. +
  48836. + }
  48837. +#endif //PLATFORM_OS_XP
  48838. +
  48839. + pbuf = recvframe_pull(pnrframe, (mv_len-sizeof(struct ethhdr)));
  48840. +
  48841. + _rtw_memcpy(pbuf, pnrframe->u.hdr.attrib.dst, ETH_ALEN);
  48842. + _rtw_memcpy(pbuf+ETH_ALEN, pnrframe->u.hdr.attrib.src, ETH_ALEN);
  48843. +
  48844. + eth_type = htons((unsigned short)eth_type) ;
  48845. + _rtw_memcpy(pbuf+12, &eth_type, 2);
  48846. +
  48847. + padding_len = (4) - ((type_len + ETH_HLEN)&(4-1));
  48848. +
  48849. + a_len -= (type_len + ETH_HLEN + padding_len) ;
  48850. +
  48851. +
  48852. +#if 0
  48853. +
  48854. + if(a_len > ETH_HLEN)
  48855. + {
  48856. + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue);
  48857. + if(pnrframe_new)
  48858. + {
  48859. + _pkt *pskb_copy;
  48860. + unsigned int copy_len = pnrframe->u.hdr.len;
  48861. +
  48862. + _rtw_init_listhead(&pnrframe_new->u.hdr.list);
  48863. +
  48864. + pskb_copy = rtw_skb_alloc(copy_len+64);
  48865. +
  48866. + if(pskb_copy==NULL)
  48867. + {
  48868. + DBG_871X("amsdu_to_msdu:can not all(ocate memory for skb copy\n");
  48869. + }
  48870. +
  48871. + pnrframe_new->u.hdr.pkt = pskb_copy;
  48872. +
  48873. + _rtw_memcpy(pskb_copy->data, pnrframe->u.hdr.rx_data, copy_len);
  48874. +
  48875. + pnrframe_new->u.hdr.rx_data = pnrframe->u.hdr.rx_data;
  48876. + pnrframe_new->u.hdr.rx_tail = pnrframe->u.hdr.rx_data + copy_len;
  48877. +
  48878. +
  48879. + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE))
  48880. + {
  48881. + rtw_recv_indicatepkt(padapter, pnrframe_new);//indicate this recv_frame
  48882. + }
  48883. + else
  48884. + {
  48885. + rtw_free_recvframe(pnrframe_new, pfree_recv_queue);//free this recv_frame
  48886. + }
  48887. +
  48888. + }
  48889. + else
  48890. + {
  48891. + DBG_871X("amsdu_to_msdu:can not allocate memory for pnrframe_new\n");
  48892. + }
  48893. +
  48894. + }
  48895. + else
  48896. + {
  48897. + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE))
  48898. + {
  48899. + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame
  48900. + }
  48901. + else
  48902. + {
  48903. + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame
  48904. + }
  48905. +
  48906. + pnrframe = NULL;
  48907. +
  48908. + }
  48909. +
  48910. +#else // 0
  48911. +
  48912. + //padding_len = (4) - ((type_len + ETH_HLEN)&(4-1));
  48913. +
  48914. + //a_len -= (type_len + ETH_HLEN + padding_len) ;
  48915. +
  48916. + pnrframe_new = NULL;
  48917. +
  48918. +
  48919. + if(a_len > ETH_HLEN)
  48920. + {
  48921. + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue);
  48922. +
  48923. + if(pnrframe_new)
  48924. + {
  48925. +
  48926. +
  48927. + //pnrframe_new->u.hdr.precvbuf = precvbuf;//precvbuf is assigned before call rtw_init_recvframe()
  48928. + //rtw_init_recvframe(pnrframe_new, precvpriv);
  48929. + {
  48930. +#ifdef PLATFORM_LINUX
  48931. + _pkt *pskb = pnrframe->u.hdr.pkt;
  48932. +#endif //PLATFORM_LINUX
  48933. + _rtw_init_listhead(&pnrframe_new->u.hdr.list);
  48934. +
  48935. + pnrframe_new->u.hdr.len=0;
  48936. +
  48937. +#ifdef PLATFORM_LINUX
  48938. + if(pskb)
  48939. + {
  48940. + pnrframe_new->u.hdr.pkt = rtw_skb_clone(pskb);
  48941. + }
  48942. +#endif //PLATFORM_LINUX
  48943. +
  48944. + }
  48945. +
  48946. + pdata += (type_len + ETH_HLEN + padding_len);
  48947. + pnrframe_new->u.hdr.rx_head = pnrframe_new->u.hdr.rx_data = pnrframe_new->u.hdr.rx_tail = pdata;
  48948. + pnrframe_new->u.hdr.rx_end = pdata + a_len + padding_len;//
  48949. +
  48950. +#ifdef PLATFORM_WINDOWS
  48951. + pnrframe_new->u.hdr.precvbuf=precvbuf;
  48952. + _enter_critical_bh(&precvbuf->recvbuf_lock, &irql);
  48953. + precvbuf->ref_cnt++;
  48954. + _exit_critical_bh(&precvbuf->recvbuf_lock, &irql);
  48955. +#endif //PLATFORM_WINDOWS
  48956. +
  48957. + }
  48958. + else
  48959. + {
  48960. + //panic("pnrframe_new=%x\n", pnrframe_new);
  48961. + }
  48962. + }
  48963. +
  48964. +
  48965. + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE) )
  48966. + {
  48967. + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame
  48968. + }
  48969. + else
  48970. + {
  48971. + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame
  48972. + }
  48973. +
  48974. +
  48975. + pnrframe = NULL;
  48976. + if(pnrframe_new)
  48977. + {
  48978. + pnrframe = pnrframe_new;
  48979. + }
  48980. +
  48981. +
  48982. +#endif // end defined (PLATFORM_LINUX) || defined (PLATFORM_FREEBSD)
  48983. +
  48984. + }while(pnrframe);
  48985. +
  48986. +exit:
  48987. +
  48988. + return ret;
  48989. +#endif
  48990. +}
  48991. +
  48992. +int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
  48993. +int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
  48994. +{
  48995. + u8 wsize = preorder_ctrl->wsize_b;
  48996. + u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096;
  48997. +
  48998. + // Rx Reorder initialize condition.
  48999. + if (preorder_ctrl->indicate_seq == 0xFFFF)
  49000. + {
  49001. + preorder_ctrl->indicate_seq = seq_num;
  49002. + #ifdef DBG_RX_SEQ
  49003. + DBG_871X("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49004. + preorder_ctrl->indicate_seq, seq_num);
  49005. + #endif
  49006. +
  49007. + //DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq);
  49008. + }
  49009. +
  49010. + //DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num);
  49011. +
  49012. + // Drop out the packet which SeqNum is smaller than WinStart
  49013. + if( SN_LESS(seq_num, preorder_ctrl->indicate_seq) )
  49014. + {
  49015. + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum));
  49016. + //DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num);
  49017. +
  49018. + #ifdef DBG_RX_DROP_FRAME
  49019. + DBG_871X("%s IndicateSeq: %d > NewSeq: %d\n", __FUNCTION__,
  49020. + preorder_ctrl->indicate_seq, seq_num);
  49021. + #endif
  49022. +
  49023. +
  49024. + return _FALSE;
  49025. + }
  49026. +
  49027. + //
  49028. + // Sliding window manipulation. Conditions includes:
  49029. + // 1. Incoming SeqNum is equal to WinStart =>Window shift 1
  49030. + // 2. Incoming SeqNum is larger than the WinEnd => Window shift N
  49031. + //
  49032. + if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) )
  49033. + {
  49034. + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
  49035. + #ifdef DBG_RX_SEQ
  49036. + DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49037. + preorder_ctrl->indicate_seq, seq_num);
  49038. + #endif
  49039. + }
  49040. + else if(SN_LESS(wend, seq_num))
  49041. + {
  49042. + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum));
  49043. + //DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num);
  49044. +
  49045. + // boundary situation, when seq_num cross 0xFFF
  49046. + if(seq_num >= (wsize - 1))
  49047. + preorder_ctrl->indicate_seq = seq_num + 1 -wsize;
  49048. + else
  49049. + preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
  49050. +
  49051. + #ifdef DBG_RX_SEQ
  49052. + DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49053. + preorder_ctrl->indicate_seq, seq_num);
  49054. + #endif
  49055. + }
  49056. +
  49057. + //DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num);
  49058. +
  49059. + return _TRUE;
  49060. +}
  49061. +
  49062. +int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe);
  49063. +int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe)
  49064. +{
  49065. + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  49066. + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  49067. + _list *phead, *plist;
  49068. + union recv_frame *pnextrframe;
  49069. + struct rx_pkt_attrib *pnextattrib;
  49070. +
  49071. + //DbgPrint("+enqueue_reorder_recvframe()\n");
  49072. +
  49073. + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49074. + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock);
  49075. +
  49076. +
  49077. + phead = get_list_head(ppending_recvframe_queue);
  49078. + plist = get_next(phead);
  49079. +
  49080. + while(rtw_end_of_queue_search(phead, plist) == _FALSE)
  49081. + {
  49082. + pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u);
  49083. + pnextattrib = &pnextrframe->u.hdr.attrib;
  49084. +
  49085. + if(SN_LESS(pnextattrib->seq_num, pattrib->seq_num))
  49086. + {
  49087. + plist = get_next(plist);
  49088. + }
  49089. + else if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num))
  49090. + {
  49091. + //Duplicate entry is found!! Do not insert current entry.
  49092. + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum));
  49093. +
  49094. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49095. +
  49096. + return _FALSE;
  49097. + }
  49098. + else
  49099. + {
  49100. + break;
  49101. + }
  49102. +
  49103. + //DbgPrint("enqueue_reorder_recvframe():while\n");
  49104. +
  49105. + }
  49106. +
  49107. +
  49108. + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49109. + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock);
  49110. +
  49111. + rtw_list_delete(&(prframe->u.hdr.list));
  49112. +
  49113. + rtw_list_insert_tail(&(prframe->u.hdr.list), plist);
  49114. +
  49115. + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);
  49116. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49117. +
  49118. +
  49119. + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum));
  49120. + return _TRUE;
  49121. +
  49122. +}
  49123. +
  49124. +int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced);
  49125. +int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced)
  49126. +{
  49127. + //_irqL irql;
  49128. + //u8 bcancelled;
  49129. + _list *phead, *plist;
  49130. + union recv_frame *prframe;
  49131. + struct rx_pkt_attrib *pattrib;
  49132. + //u8 index = 0;
  49133. + int bPktInBuf = _FALSE;
  49134. + struct recv_priv *precvpriv = &padapter->recvpriv;
  49135. + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  49136. +
  49137. + //DbgPrint("+recv_indicatepkts_in_order\n");
  49138. +
  49139. + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49140. + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock);
  49141. +
  49142. + phead = get_list_head(ppending_recvframe_queue);
  49143. + plist = get_next(phead);
  49144. +
  49145. +#if 0
  49146. + // Check if there is any other indication thread running.
  49147. + if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING)
  49148. + return;
  49149. +#endif
  49150. +
  49151. + // Handling some condition for forced indicate case.
  49152. + if(bforced==_TRUE)
  49153. + {
  49154. + if(rtw_is_list_empty(phead))
  49155. + {
  49156. + // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49157. + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);
  49158. + return _TRUE;
  49159. + }
  49160. +
  49161. + prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  49162. + pattrib = &prframe->u.hdr.attrib;
  49163. + preorder_ctrl->indicate_seq = pattrib->seq_num;
  49164. + #ifdef DBG_RX_SEQ
  49165. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49166. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49167. + #endif
  49168. + }
  49169. +
  49170. + // Prepare indication list and indication.
  49171. + // Check if there is any packet need indicate.
  49172. + while(!rtw_is_list_empty(phead))
  49173. + {
  49174. +
  49175. + prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  49176. + pattrib = &prframe->u.hdr.attrib;
  49177. +
  49178. + if(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num))
  49179. + {
  49180. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  49181. + ("recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\n",
  49182. + preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu));
  49183. +
  49184. +#if 0
  49185. + // This protect buffer from overflow.
  49186. + if(index >= REORDER_WIN_SIZE)
  49187. + {
  49188. + RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n"));
  49189. + bPktInBuf = TRUE;
  49190. + break;
  49191. + }
  49192. +#endif
  49193. +
  49194. + plist = get_next(plist);
  49195. + rtw_list_delete(&(prframe->u.hdr.list));
  49196. +
  49197. + if(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num))
  49198. + {
  49199. + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
  49200. + #ifdef DBG_RX_SEQ
  49201. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49202. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49203. + #endif
  49204. + }
  49205. +
  49206. +#if 0
  49207. + index++;
  49208. + if(index==1)
  49209. + {
  49210. + //Cancel previous pending timer.
  49211. + //PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer);
  49212. + if(bforced!=_TRUE)
  49213. + {
  49214. + //DBG_871X("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n");
  49215. + _cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);
  49216. + }
  49217. + }
  49218. +#endif
  49219. +
  49220. + //Set this as a lock to make sure that only one thread is indicating packet.
  49221. + //pTS->RxIndicateState = RXTS_INDICATE_PROCESSING;
  49222. +
  49223. + // Indicate packets
  49224. + //RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n"));
  49225. +
  49226. +
  49227. + //indicate this recv_frame
  49228. + //DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num);
  49229. + if(!pattrib->amsdu)
  49230. + {
  49231. + //DBG_871X("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num);
  49232. +
  49233. + if ((padapter->bDriverStopped == _FALSE) &&
  49234. + (padapter->bSurpriseRemoved == _FALSE))
  49235. + {
  49236. +
  49237. + rtw_recv_indicatepkt(padapter, prframe);//indicate this recv_frame
  49238. +
  49239. + }
  49240. + }
  49241. + else if(pattrib->amsdu==1)
  49242. + {
  49243. + if(amsdu_to_msdu(padapter, prframe)!=_SUCCESS)
  49244. + {
  49245. + rtw_free_recvframe(prframe, &precvpriv->free_recv_queue);
  49246. + }
  49247. + }
  49248. + else
  49249. + {
  49250. + //error condition;
  49251. + }
  49252. +
  49253. +
  49254. + //Update local variables.
  49255. + bPktInBuf = _FALSE;
  49256. +
  49257. + }
  49258. + else
  49259. + {
  49260. + bPktInBuf = _TRUE;
  49261. + break;
  49262. + }
  49263. +
  49264. + //DbgPrint("recv_indicatepkts_in_order():while\n");
  49265. +
  49266. + }
  49267. +
  49268. + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);
  49269. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49270. +
  49271. +/*
  49272. + //Release the indication lock and set to new indication step.
  49273. + if(bPktInBuf)
  49274. + {
  49275. + // Set new pending timer.
  49276. + //pTS->RxIndicateState = RXTS_INDICATE_REORDER;
  49277. + //PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime);
  49278. + //DBG_871X("_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\n");
  49279. + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  49280. + }
  49281. + else
  49282. + {
  49283. + //pTS->RxIndicateState = RXTS_INDICATE_IDLE;
  49284. + }
  49285. +*/
  49286. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49287. +
  49288. + //return _TRUE;
  49289. + return bPktInBuf;
  49290. +
  49291. +}
  49292. +
  49293. +int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe);
  49294. +int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
  49295. +{
  49296. + _irqL irql;
  49297. + int retval = _SUCCESS;
  49298. + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  49299. + struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl;
  49300. + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  49301. +
  49302. + if(!pattrib->amsdu)
  49303. + {
  49304. + //s1.
  49305. + wlanhdr_to_ethhdr(prframe);
  49306. +
  49307. + //if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/
  49308. + // || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0))
  49309. + if (pattrib->qos!=1)
  49310. + {
  49311. + if ((padapter->bDriverStopped == _FALSE) &&
  49312. + (padapter->bSurpriseRemoved == _FALSE))
  49313. + {
  49314. + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n" ));
  49315. +
  49316. + rtw_recv_indicatepkt(padapter, prframe);
  49317. + return _SUCCESS;
  49318. +
  49319. + }
  49320. +
  49321. + #ifdef DBG_RX_DROP_FRAME
  49322. + DBG_871X("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__);
  49323. + #endif
  49324. +
  49325. + return _FAIL;
  49326. +
  49327. + }
  49328. +
  49329. + if (preorder_ctrl->enable == _FALSE)
  49330. + {
  49331. + //indicate this recv_frame
  49332. + preorder_ctrl->indicate_seq = pattrib->seq_num;
  49333. + #ifdef DBG_RX_SEQ
  49334. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49335. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49336. + #endif
  49337. +
  49338. + rtw_recv_indicatepkt(padapter, prframe);
  49339. +
  49340. + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096;
  49341. + #ifdef DBG_RX_SEQ
  49342. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49343. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49344. + #endif
  49345. +
  49346. + return _SUCCESS;
  49347. + }
  49348. +
  49349. +#ifndef CONFIG_RECV_REORDERING_CTRL
  49350. + //indicate this recv_frame
  49351. + rtw_recv_indicatepkt(padapter, prframe);
  49352. + return _SUCCESS;
  49353. +#endif
  49354. +
  49355. + }
  49356. + else if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU
  49357. + {
  49358. + if (preorder_ctrl->enable == _FALSE)
  49359. + {
  49360. + preorder_ctrl->indicate_seq = pattrib->seq_num;
  49361. + #ifdef DBG_RX_SEQ
  49362. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49363. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49364. + #endif
  49365. +
  49366. + retval = amsdu_to_msdu(padapter, prframe);
  49367. +
  49368. + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096;
  49369. + #ifdef DBG_RX_SEQ
  49370. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  49371. + preorder_ctrl->indicate_seq, pattrib->seq_num);
  49372. + #endif
  49373. +
  49374. + if(retval != _SUCCESS){
  49375. + #ifdef DBG_RX_DROP_FRAME
  49376. + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__);
  49377. + #endif
  49378. + }
  49379. +
  49380. + return retval;
  49381. + }
  49382. + }
  49383. + else
  49384. + {
  49385. +
  49386. + }
  49387. +
  49388. + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49389. +
  49390. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  49391. + ("recv_indicatepkt_reorder: indicate=%d seq=%d\n",
  49392. + preorder_ctrl->indicate_seq, pattrib->seq_num));
  49393. +
  49394. + //s2. check if winstart_b(indicate_seq) needs to been updated
  49395. + if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num))
  49396. + {
  49397. + //pHTInfo->RxReorderDropCounter++;
  49398. + //ReturnRFDList(Adapter, pRfd);
  49399. + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n"));
  49400. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49401. + //return _FAIL;
  49402. +
  49403. + #ifdef DBG_RX_DROP_FRAME
  49404. + DBG_871X("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__);
  49405. + #endif
  49406. +#if 0
  49407. + rtw_recv_indicatepkt(padapter, prframe);
  49408. +
  49409. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49410. +
  49411. + goto _success_exit;
  49412. +#else
  49413. + goto _err_exit;
  49414. +#endif
  49415. + }
  49416. +
  49417. +
  49418. + //s3. Insert all packet into Reorder Queue to maintain its ordering.
  49419. + if(!enqueue_reorder_recvframe(preorder_ctrl, prframe))
  49420. + {
  49421. + //DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n");
  49422. + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
  49423. + //return _FAIL;
  49424. + #ifdef DBG_RX_DROP_FRAME
  49425. + DBG_871X("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__);
  49426. + #endif
  49427. + goto _err_exit;
  49428. + }
  49429. +
  49430. +
  49431. + //s4.
  49432. + // Indication process.
  49433. + // After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets
  49434. + // with the SeqNum smaller than latest WinStart and buffer other packets.
  49435. + //
  49436. + // For Rx Reorder condition:
  49437. + // 1. All packets with SeqNum smaller than WinStart => Indicate
  49438. + // 2. All packets with SeqNum larger than or equal to WinStart => Buffer it.
  49439. + //
  49440. +
  49441. + //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE);
  49442. + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE)
  49443. + {
  49444. + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  49445. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49446. + }
  49447. + else
  49448. + {
  49449. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49450. + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
  49451. + }
  49452. +
  49453. +
  49454. +_success_exit:
  49455. +
  49456. + return _SUCCESS;
  49457. +
  49458. +_err_exit:
  49459. +
  49460. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49461. +
  49462. + return _FAIL;
  49463. +}
  49464. +
  49465. +
  49466. +void rtw_reordering_ctrl_timeout_handler(void *pcontext)
  49467. +{
  49468. + _irqL irql;
  49469. + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext;
  49470. + _adapter *padapter = preorder_ctrl->padapter;
  49471. + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  49472. +
  49473. +
  49474. + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved)
  49475. + {
  49476. + return;
  49477. + }
  49478. +
  49479. + //DBG_871X("+rtw_reordering_ctrl_timeout_handler()=>\n");
  49480. +
  49481. + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49482. +
  49483. + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE)
  49484. + {
  49485. + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  49486. + }
  49487. +
  49488. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  49489. +
  49490. +}
  49491. +
  49492. +int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe);
  49493. +int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)
  49494. +{
  49495. + int retval = _SUCCESS;
  49496. + //struct recv_priv *precvpriv = &padapter->recvpriv;
  49497. + //struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  49498. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  49499. +#ifdef CONFIG_TDLS
  49500. + struct sta_info *psta = prframe->u.hdr.psta;
  49501. +#endif //CONFIG_TDLS
  49502. +
  49503. +#ifdef CONFIG_80211N_HT
  49504. +
  49505. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  49506. +
  49507. +#ifdef CONFIG_TDLS
  49508. + if( (phtpriv->ht_option==_TRUE) ||
  49509. + ((psta->tdls_sta_state & TDLS_LINKED_STATE) &&
  49510. + (psta->htpriv.ht_option==_TRUE) &&
  49511. + (psta->htpriv.ampdu_enable==_TRUE))) //B/G/N Mode
  49512. +#else
  49513. + if(phtpriv->ht_option==_TRUE) //B/G/N Mode
  49514. +#endif //CONFIG_TDLS
  49515. + {
  49516. + //prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority];
  49517. +
  49518. + if(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control
  49519. + {
  49520. + #ifdef DBG_RX_DROP_FRAME
  49521. + DBG_871X("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__);
  49522. + #endif
  49523. +
  49524. + if ((padapter->bDriverStopped == _FALSE) &&
  49525. + (padapter->bSurpriseRemoved == _FALSE))
  49526. + {
  49527. + retval = _FAIL;
  49528. + return retval;
  49529. + }
  49530. + }
  49531. + }
  49532. + else //B/G mode
  49533. +#endif
  49534. + {
  49535. + retval=wlanhdr_to_ethhdr (prframe);
  49536. + if(retval != _SUCCESS)
  49537. + {
  49538. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n"));
  49539. + #ifdef DBG_RX_DROP_FRAME
  49540. + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__);
  49541. + #endif
  49542. + return retval;
  49543. + }
  49544. +
  49545. + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE))
  49546. + {
  49547. + //indicate this recv_frame
  49548. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n" ));
  49549. + rtw_recv_indicatepkt(padapter, prframe);
  49550. +
  49551. +
  49552. + }
  49553. + else
  49554. + {
  49555. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n" ));
  49556. +
  49557. + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  49558. + retval = _FAIL;
  49559. + return retval;
  49560. + }
  49561. +
  49562. + }
  49563. +
  49564. + return retval;
  49565. +
  49566. +}
  49567. +
  49568. +int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
  49569. +{
  49570. + int ret = _SUCCESS;
  49571. + struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
  49572. + struct recv_priv *precvpriv = &padapter->recvpriv;
  49573. + _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  49574. +
  49575. +#ifdef CONFIG_MP_INCLUDED
  49576. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  49577. +#endif //CONFIG_MP_INCLUDED
  49578. +
  49579. +#ifdef CONFIG_MP_INCLUDED
  49580. + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
  49581. + {
  49582. + if (pattrib->crc_err == 1)
  49583. + padapter->mppriv.rx_crcerrpktcount++;
  49584. + else
  49585. + padapter->mppriv.rx_pktcount++;
  49586. +
  49587. + if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) {
  49588. + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n"));
  49589. + ret = _FAIL;
  49590. + rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
  49591. + goto exit;
  49592. + }
  49593. + }
  49594. +#endif
  49595. +
  49596. + //check the frame crtl field and decache
  49597. + ret = validate_recv_frame(padapter, rframe);
  49598. + if (ret != _SUCCESS)
  49599. + {
  49600. + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n"));
  49601. + rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
  49602. + goto exit;
  49603. + }
  49604. +
  49605. +exit:
  49606. + return ret;
  49607. +}
  49608. +
  49609. +int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
  49610. +{
  49611. + int ret = _SUCCESS;
  49612. + union recv_frame *orig_prframe = prframe;
  49613. + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  49614. + struct recv_priv *precvpriv = &padapter->recvpriv;
  49615. + _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  49616. +
  49617. +#ifdef CONFIG_MP_INCLUDED
  49618. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  49619. +#endif //CONFIG_MP_INCLUDED
  49620. +
  49621. +#ifdef CONFIG_TDLS
  49622. + u8 *psnap_type, *pcategory;
  49623. + struct sta_info *ptdls_sta = NULL;
  49624. +#endif //CONFIG_TDLS
  49625. +
  49626. +
  49627. + // DATA FRAME
  49628. + rtw_led_control(padapter, LED_CTL_RX);
  49629. +
  49630. + prframe = decryptor(padapter, prframe);
  49631. + if (prframe == NULL) {
  49632. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decryptor: drop pkt\n"));
  49633. + #ifdef DBG_RX_DROP_FRAME
  49634. + DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__);
  49635. + #endif
  49636. + ret = _FAIL;
  49637. + goto _recv_data_drop;
  49638. + }
  49639. +
  49640. +#if 0
  49641. + if ( padapter->adapter_type == PRIMARY_ADAPTER )
  49642. + {
  49643. + DBG_871X("+++\n");
  49644. + {
  49645. + int i;
  49646. + u8 *ptr = get_recvframe_data(prframe);
  49647. + for(i=0; i<140;i=i+8)
  49648. + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i),
  49649. + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
  49650. +
  49651. + }
  49652. + DBG_871X("---\n");
  49653. + }
  49654. +#endif //RTK_DMP_PLATFORM
  49655. +
  49656. +#ifdef CONFIG_TDLS
  49657. + //check TDLS frame
  49658. + psnap_type = get_recvframe_data(orig_prframe);
  49659. + psnap_type+=pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
  49660. + pcategory = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  49661. +
  49662. + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) &&
  49663. + ((*pcategory==RTW_WLAN_CATEGORY_TDLS) || (*pcategory==RTW_WLAN_CATEGORY_P2P))){
  49664. + ret = OnTDLS(padapter, prframe); //all of functions will return _FAIL
  49665. + goto _exit_recv_func;
  49666. + }
  49667. +#endif //CONFIG_TDLS
  49668. +
  49669. + prframe = recvframe_chk_defrag(padapter, prframe);
  49670. + if(prframe==NULL) {
  49671. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chk_defrag: drop pkt\n"));
  49672. + #ifdef DBG_RX_DROP_FRAME
  49673. + DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__);
  49674. + #endif
  49675. + goto _recv_data_drop;
  49676. + }
  49677. +
  49678. + prframe=portctrl(padapter, prframe);
  49679. + if (prframe == NULL) {
  49680. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("portctrl: drop pkt \n"));
  49681. + #ifdef DBG_RX_DROP_FRAME
  49682. + DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__);
  49683. + #endif
  49684. + ret = _FAIL;
  49685. + goto _recv_data_drop;
  49686. + }
  49687. +
  49688. +#ifdef CONFIG_TDLS
  49689. + if(padapter->tdlsinfo.setup_state == TDLS_LINKED_STATE)
  49690. + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->src);
  49691. + count_rx_stats(padapter, prframe, ptdls_sta);
  49692. +#else
  49693. + count_rx_stats(padapter, prframe, NULL);
  49694. +#endif //CONFIG_TDLS
  49695. +
  49696. +#ifdef CONFIG_80211N_HT
  49697. +
  49698. + ret = process_recv_indicatepkts(padapter, prframe);
  49699. + if (ret != _SUCCESS)
  49700. + {
  49701. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recv_func: process_recv_indicatepkts fail! \n"));
  49702. + #ifdef DBG_RX_DROP_FRAME
  49703. + DBG_871X("DBG_RX_DROP_FRAME %s recv_func: process_recv_indicatepkts fail!\n", __FUNCTION__);
  49704. + #endif
  49705. + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame
  49706. + goto _recv_data_drop;
  49707. + }
  49708. +
  49709. +#else // CONFIG_80211N_HT
  49710. +
  49711. + if (!pattrib->amsdu)
  49712. + {
  49713. + ret = wlanhdr_to_ethhdr (prframe);
  49714. + if (ret != _SUCCESS)
  49715. + {
  49716. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n"));
  49717. + #ifdef DBG_RX_DROP_FRAME
  49718. + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__);
  49719. + #endif
  49720. + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame
  49721. + goto _recv_data_drop;
  49722. + }
  49723. +
  49724. + if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE))
  49725. + {
  49726. + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" ));
  49727. + //indicate this recv_frame
  49728. + ret = rtw_recv_indicatepkt(padapter, prframe);
  49729. + if (ret != _SUCCESS)
  49730. + {
  49731. + #ifdef DBG_RX_DROP_FRAME
  49732. + DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__);
  49733. + #endif
  49734. + goto _recv_data_drop;
  49735. + }
  49736. + }
  49737. + else
  49738. + {
  49739. + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: rtw_free_recvframe\n" ));
  49740. + RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  49741. + #ifdef DBG_RX_DROP_FRAME
  49742. + DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", __FUNCTION__,
  49743. + padapter->bDriverStopped, padapter->bSurpriseRemoved);
  49744. + #endif
  49745. + ret = _FAIL;
  49746. + rtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame
  49747. + }
  49748. +
  49749. + }
  49750. + else if(pattrib->amsdu==1)
  49751. + {
  49752. +
  49753. + ret = amsdu_to_msdu(padapter, prframe);
  49754. + if(ret != _SUCCESS)
  49755. + {
  49756. + #ifdef DBG_RX_DROP_FRAME
  49757. + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__);
  49758. + #endif
  49759. + rtw_free_recvframe(orig_prframe, pfree_recv_queue);
  49760. + goto _recv_data_drop;
  49761. + }
  49762. + }
  49763. + else
  49764. + {
  49765. + #ifdef DBG_RX_DROP_FRAME
  49766. + DBG_871X("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__);
  49767. + #endif
  49768. + goto _recv_data_drop;
  49769. + }
  49770. +#endif // CONFIG_80211N_HT
  49771. +
  49772. +_exit_recv_func:
  49773. + return ret;
  49774. +
  49775. +_recv_data_drop:
  49776. + precvpriv->rx_drop++;
  49777. + return ret;
  49778. +}
  49779. +
  49780. +
  49781. +int recv_func(_adapter *padapter, union recv_frame *rframe);
  49782. +int recv_func(_adapter *padapter, union recv_frame *rframe)
  49783. +{
  49784. + int ret;
  49785. + struct rx_pkt_attrib *prxattrib = &rframe->u.hdr.attrib;
  49786. + struct recv_priv *recvpriv = &padapter->recvpriv;
  49787. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  49788. + struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  49789. +
  49790. + /* check if need to handle uc_swdec_pending_queue*/
  49791. + if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey)
  49792. + {
  49793. + union recv_frame *pending_frame;
  49794. + _irqL irqL;
  49795. +
  49796. + while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
  49797. + if (recv_func_posthandle(padapter, pending_frame) == _SUCCESS)
  49798. + DBG_871X("%s: dequeue uc_swdec_pending_queue\n", __func__);
  49799. + }
  49800. + }
  49801. +
  49802. + ret = recv_func_prehandle(padapter, rframe);
  49803. +
  49804. + if(ret == _SUCCESS) {
  49805. +
  49806. + /* check if need to enqueue into uc_swdec_pending_queue*/
  49807. + if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
  49808. + !IS_MCAST(prxattrib->ra) && prxattrib->encrypt>0 &&
  49809. + (prxattrib->bdecrypted == 0 ||psecuritypriv->sw_decrypt == _TRUE) &&
  49810. + !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
  49811. + !psecuritypriv->busetkipkey) {
  49812. + rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
  49813. + DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
  49814. + goto exit;
  49815. + }
  49816. +
  49817. + ret = recv_func_posthandle(padapter, rframe);
  49818. + }
  49819. +
  49820. +exit:
  49821. + return ret;
  49822. +}
  49823. +
  49824. +
  49825. +s32 rtw_recv_entry(union recv_frame *precvframe)
  49826. +{
  49827. + _adapter *padapter;
  49828. + struct recv_priv *precvpriv;
  49829. + s32 ret=_SUCCESS;
  49830. +
  49831. +_func_enter_;
  49832. +
  49833. +// RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("+rtw_recv_entry\n"));
  49834. +
  49835. + padapter = precvframe->u.hdr.adapter;
  49836. +
  49837. + precvpriv = &padapter->recvpriv;
  49838. +
  49839. +
  49840. + if ((ret = recv_func(padapter, precvframe)) == _FAIL)
  49841. + {
  49842. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("rtw_recv_entry: recv_func return fail!!!\n"));
  49843. + goto _recv_entry_drop;
  49844. + }
  49845. +
  49846. +
  49847. + precvpriv->rx_pkts++;
  49848. +
  49849. +_func_exit_;
  49850. +
  49851. + return ret;
  49852. +
  49853. +_recv_entry_drop:
  49854. +
  49855. +#ifdef CONFIG_MP_INCLUDED
  49856. + padapter->mppriv.rx_pktloss = precvpriv->rx_drop;
  49857. +#endif
  49858. +
  49859. + //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("_recv_entry_drop\n"));
  49860. +
  49861. +_func_exit_;
  49862. +
  49863. + return ret;
  49864. +}
  49865. +
  49866. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  49867. +void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){
  49868. + _adapter *adapter = (_adapter *)FunctionContext;
  49869. + struct recv_priv *recvpriv = &adapter->recvpriv;
  49870. +
  49871. + u32 tmp_s, tmp_q;
  49872. + u8 avg_signal_strength = 0;
  49873. + u8 avg_signal_qual = 0;
  49874. + u32 num_signal_strength = 0;
  49875. + u32 num_signal_qual = 0;
  49876. + u8 _alpha = 3; // this value is based on converging_constant = 5000 and sampling_interval = 1000
  49877. +
  49878. + if(adapter->recvpriv.is_signal_dbg) {
  49879. + //update the user specific value, signal_strength_dbg, to signal_strength, rssi
  49880. + adapter->recvpriv.signal_strength= adapter->recvpriv.signal_strength_dbg;
  49881. + adapter->recvpriv.rssi=(s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg);
  49882. + } else {
  49883. +
  49884. + if(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx
  49885. + avg_signal_strength = recvpriv->signal_strength_data.avg_val;
  49886. + num_signal_strength = recvpriv->signal_strength_data.total_num;
  49887. + // after avg_vals are accquired, we can re-stat the signal values
  49888. + recvpriv->signal_strength_data.update_req = 1;
  49889. + }
  49890. +
  49891. + if(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx
  49892. + avg_signal_qual = recvpriv->signal_qual_data.avg_val;
  49893. + num_signal_qual = recvpriv->signal_qual_data.total_num;
  49894. + // after avg_vals are accquired, we can re-stat the signal values
  49895. + recvpriv->signal_qual_data.update_req = 1;
  49896. + }
  49897. +
  49898. + if (num_signal_strength == 0) {
  49899. + if (rtw_get_on_cur_ch_time(adapter) == 0
  49900. + || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval
  49901. + ) {
  49902. + goto set_timer;
  49903. + }
  49904. + }
  49905. +
  49906. + if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE
  49907. + || check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE
  49908. + ) {
  49909. + goto set_timer;
  49910. + }
  49911. +
  49912. + #ifdef CONFIG_CONCURRENT_MODE
  49913. + if (check_buddy_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE)
  49914. + goto set_timer;
  49915. + #endif
  49916. +
  49917. + //update value of signal_strength, rssi, signal_qual
  49918. + tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength);
  49919. + if(tmp_s %_alpha)
  49920. + tmp_s = tmp_s/_alpha + 1;
  49921. + else
  49922. + tmp_s = tmp_s/_alpha;
  49923. + if(tmp_s>100)
  49924. + tmp_s = 100;
  49925. +
  49926. + tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual);
  49927. + if(tmp_q %_alpha)
  49928. + tmp_q = tmp_q/_alpha + 1;
  49929. + else
  49930. + tmp_q = tmp_q/_alpha;
  49931. + if(tmp_q>100)
  49932. + tmp_q = 100;
  49933. +
  49934. + recvpriv->signal_strength = tmp_s;
  49935. + recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s);
  49936. + recvpriv->signal_qual = tmp_q;
  49937. +
  49938. + #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
  49939. + DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u"
  49940. + ", num_signal_strength:%u, num_signal_qual:%u"
  49941. + ", on_cur_ch_ms:%d"
  49942. + "\n"
  49943. + , FUNC_ADPT_ARG(adapter)
  49944. + , recvpriv->signal_strength
  49945. + , recvpriv->rssi
  49946. + , recvpriv->signal_qual
  49947. + , num_signal_strength, num_signal_qual
  49948. + , rtw_get_on_cur_ch_time(adapter) ? rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) : 0
  49949. + );
  49950. + #endif
  49951. + }
  49952. +
  49953. +set_timer:
  49954. + rtw_set_signal_stat_timer(recvpriv);
  49955. +
  49956. +}
  49957. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  49958. --- /dev/null
  49959. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_rf.c
  49960. @@ -0,0 +1,94 @@
  49961. +/******************************************************************************
  49962. + *
  49963. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  49964. + *
  49965. + * This program is free software; you can redistribute it and/or modify it
  49966. + * under the terms of version 2 of the GNU General Public License as
  49967. + * published by the Free Software Foundation.
  49968. + *
  49969. + * This program is distributed in the hope that it will be useful, but WITHOUT
  49970. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  49971. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  49972. + * more details.
  49973. + *
  49974. + * You should have received a copy of the GNU General Public License along with
  49975. + * this program; if not, write to the Free Software Foundation, Inc.,
  49976. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  49977. + *
  49978. + *
  49979. + ******************************************************************************/
  49980. +#define _RTW_RF_C_
  49981. +
  49982. +#include <drv_conf.h>
  49983. +#include <osdep_service.h>
  49984. +#include <drv_types.h>
  49985. +#include <recv_osdep.h>
  49986. +#include <xmit_osdep.h>
  49987. +
  49988. +
  49989. +struct ch_freq {
  49990. + u32 channel;
  49991. + u32 frequency;
  49992. +};
  49993. +
  49994. +struct ch_freq ch_freq_map[] = {
  49995. + {1, 2412},{2, 2417},{3, 2422},{4, 2427},{5, 2432},
  49996. + {6, 2437},{7, 2442},{8, 2447},{9, 2452},{10, 2457},
  49997. + {11, 2462},{12, 2467},{13, 2472},{14, 2484},
  49998. + /* UNII */
  49999. + {36, 5180},{40, 5200},{44, 5220},{48, 5240},{52, 5260},
  50000. + {56, 5280},{60, 5300},{64, 5320},{149, 5745},{153, 5765},
  50001. + {157, 5785},{161, 5805},{165, 5825},{167, 5835},{169, 5845},
  50002. + {171, 5855},{173, 5865},
  50003. + /* HiperLAN2 */
  50004. + {100, 5500},{104, 5520},{108, 5540},{112, 5560},{116, 5580},
  50005. + {120, 5600},{124, 5620},{128, 5640},{132, 5660},{136, 5680},
  50006. + {140, 5700},
  50007. + /* Japan MMAC */
  50008. + {34, 5170},{38, 5190},{42, 5210},{46, 5230},
  50009. + /* Japan */
  50010. + {184, 4920},{188, 4940},{192, 4960},{196, 4980},
  50011. + {208, 5040},/* Japan, means J08 */
  50012. + {212, 5060},/* Japan, means J12 */
  50013. + {216, 5080},/* Japan, means J16 */
  50014. +};
  50015. +
  50016. +int ch_freq_map_num = (sizeof(ch_freq_map) / sizeof(struct ch_freq));
  50017. +
  50018. +u32 rtw_ch2freq(u32 channel)
  50019. +{
  50020. + u8 i;
  50021. + u32 freq = 0;
  50022. +
  50023. + for (i = 0; i < ch_freq_map_num; i++)
  50024. + {
  50025. + if (channel == ch_freq_map[i].channel)
  50026. + {
  50027. + freq = ch_freq_map[i].frequency;
  50028. + break;
  50029. + }
  50030. + }
  50031. + if (i == ch_freq_map_num)
  50032. + freq = 2412;
  50033. +
  50034. + return freq;
  50035. +}
  50036. +
  50037. +u32 rtw_freq2ch(u32 freq)
  50038. +{
  50039. + u8 i;
  50040. + u32 ch = 0;
  50041. +
  50042. + for (i = 0; i < ch_freq_map_num; i++)
  50043. + {
  50044. + if (freq == ch_freq_map[i].frequency)
  50045. + {
  50046. + ch = ch_freq_map[i].channel;
  50047. + break;
  50048. + }
  50049. + }
  50050. + if (i == ch_freq_map_num)
  50051. + ch = 1;
  50052. +
  50053. + return ch;
  50054. +}
  50055. --- /dev/null
  50056. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_security.c
  50057. @@ -0,0 +1,3114 @@
  50058. +/******************************************************************************
  50059. + *
  50060. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  50061. + *
  50062. + * This program is free software; you can redistribute it and/or modify it
  50063. + * under the terms of version 2 of the GNU General Public License as
  50064. + * published by the Free Software Foundation.
  50065. + *
  50066. + * This program is distributed in the hope that it will be useful, but WITHOUT
  50067. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  50068. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  50069. + * more details.
  50070. + *
  50071. + * You should have received a copy of the GNU General Public License along with
  50072. + * this program; if not, write to the Free Software Foundation, Inc.,
  50073. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  50074. + *
  50075. + *
  50076. + ******************************************************************************/
  50077. +#define _RTW_SECURITY_C_
  50078. +
  50079. +#include <drv_conf.h>
  50080. +#include <osdep_service.h>
  50081. +#include <drv_types.h>
  50082. +#include <wifi.h>
  50083. +#include <osdep_intf.h>
  50084. +
  50085. +
  50086. +//=====WEP related=====
  50087. +
  50088. +#define CRC32_POLY 0x04c11db7
  50089. +
  50090. +struct arc4context
  50091. +{
  50092. + u32 x;
  50093. + u32 y;
  50094. + u8 state[256];
  50095. +};
  50096. +
  50097. +
  50098. +static void arcfour_init(struct arc4context *parc4ctx, u8 * key,u32 key_len)
  50099. +{
  50100. + u32 t, u;
  50101. + u32 keyindex;
  50102. + u32 stateindex;
  50103. + u8 * state;
  50104. + u32 counter;
  50105. +_func_enter_;
  50106. + state = parc4ctx->state;
  50107. + parc4ctx->x = 0;
  50108. + parc4ctx->y = 0;
  50109. + for (counter = 0; counter < 256; counter++)
  50110. + state[counter] = (u8)counter;
  50111. + keyindex = 0;
  50112. + stateindex = 0;
  50113. + for (counter = 0; counter < 256; counter++)
  50114. + {
  50115. + t = state[counter];
  50116. + stateindex = (stateindex + key[keyindex] + t) & 0xff;
  50117. + u = state[stateindex];
  50118. + state[stateindex] = (u8)t;
  50119. + state[counter] = (u8)u;
  50120. + if (++keyindex >= key_len)
  50121. + keyindex = 0;
  50122. + }
  50123. +_func_exit_;
  50124. +}
  50125. +static u32 arcfour_byte( struct arc4context *parc4ctx)
  50126. +{
  50127. + u32 x;
  50128. + u32 y;
  50129. + u32 sx, sy;
  50130. + u8 * state;
  50131. +_func_enter_;
  50132. + state = parc4ctx->state;
  50133. + x = (parc4ctx->x + 1) & 0xff;
  50134. + sx = state[x];
  50135. + y = (sx + parc4ctx->y) & 0xff;
  50136. + sy = state[y];
  50137. + parc4ctx->x = x;
  50138. + parc4ctx->y = y;
  50139. + state[y] = (u8)sx;
  50140. + state[x] = (u8)sy;
  50141. +_func_exit_;
  50142. + return state[(sx + sy) & 0xff];
  50143. +}
  50144. +
  50145. +
  50146. +static void arcfour_encrypt( struct arc4context *parc4ctx,
  50147. + u8 * dest,
  50148. + u8 * src,
  50149. + u32 len)
  50150. +{
  50151. + u32 i;
  50152. +_func_enter_;
  50153. + for (i = 0; i < len; i++)
  50154. + dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);
  50155. +_func_exit_;
  50156. +}
  50157. +
  50158. +static sint bcrc32initialized = 0;
  50159. +static u32 crc32_table[256];
  50160. +
  50161. +
  50162. +static u8 crc32_reverseBit( u8 data)
  50163. +{
  50164. + return( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) );
  50165. +}
  50166. +
  50167. +static void crc32_init(void)
  50168. +{
  50169. +_func_enter_;
  50170. + if (bcrc32initialized == 1)
  50171. + goto exit;
  50172. + else{
  50173. + sint i, j;
  50174. + u32 c;
  50175. + u8 *p=(u8 *)&c, *p1;
  50176. + u8 k;
  50177. +
  50178. + c = 0x12340000;
  50179. +
  50180. + for (i = 0; i < 256; ++i)
  50181. + {
  50182. + k = crc32_reverseBit((u8)i);
  50183. + for (c = ((u32)k) << 24, j = 8; j > 0; --j){
  50184. + c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
  50185. + }
  50186. + p1 = (u8 *)&crc32_table[i];
  50187. +
  50188. + p1[0] = crc32_reverseBit(p[3]);
  50189. + p1[1] = crc32_reverseBit(p[2]);
  50190. + p1[2] = crc32_reverseBit(p[1]);
  50191. + p1[3] = crc32_reverseBit(p[0]);
  50192. + }
  50193. + bcrc32initialized= 1;
  50194. + }
  50195. +exit:
  50196. +_func_exit_;
  50197. +}
  50198. +
  50199. +static u32 getcrc32(u8 *buf, sint len)
  50200. +{
  50201. + u8 *p;
  50202. + u32 crc;
  50203. +_func_enter_;
  50204. + if (bcrc32initialized == 0) crc32_init();
  50205. +
  50206. + crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
  50207. +
  50208. + for (p = buf; len > 0; ++p, --len)
  50209. + {
  50210. + crc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8);
  50211. + }
  50212. +_func_exit_;
  50213. + return ~crc; /* transmit complement, per CRC-32 spec */
  50214. +}
  50215. +
  50216. +
  50217. +/*
  50218. + Need to consider the fragment situation
  50219. +*/
  50220. +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe)
  50221. +{ // exclude ICV
  50222. +
  50223. + unsigned char crc[4];
  50224. + struct arc4context mycontext;
  50225. +
  50226. + sint curfragnum,length;
  50227. + u32 keylength;
  50228. +
  50229. + u8 *pframe, *payload,*iv; //,*wepkey
  50230. + u8 wepkey[16];
  50231. + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;
  50232. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  50233. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  50234. +
  50235. +_func_enter_;
  50236. +
  50237. +
  50238. + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)
  50239. + return;
  50240. +
  50241. +#ifdef CONFIG_USB_TX_AGGREGATION
  50242. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE +
  50243. + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
  50244. +#else
  50245. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET;
  50246. +#endif
  50247. +
  50248. + //start to encrypt each fragment
  50249. + if((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_))
  50250. + {
  50251. + keylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex];
  50252. +
  50253. + for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++)
  50254. + {
  50255. + iv=pframe+pattrib->hdrlen;
  50256. + _rtw_memcpy(&wepkey[0], iv, 3);
  50257. + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength);
  50258. + payload=pframe+pattrib->iv_len+pattrib->hdrlen;
  50259. +
  50260. + if((curfragnum+1)==pattrib->nr_frags)
  50261. + { //the last fragment
  50262. +
  50263. + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;
  50264. +
  50265. + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));
  50266. +
  50267. + arcfour_init(&mycontext, wepkey,3+keylength);
  50268. + arcfour_encrypt(&mycontext, payload, payload, length);
  50269. + arcfour_encrypt(&mycontext, payload+length, crc, 4);
  50270. +
  50271. + }
  50272. + else
  50273. + {
  50274. + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;
  50275. + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));
  50276. + arcfour_init(&mycontext, wepkey,3+keylength);
  50277. + arcfour_encrypt(&mycontext, payload, payload, length);
  50278. + arcfour_encrypt(&mycontext, payload+length, crc, 4);
  50279. +
  50280. + pframe+=pxmitpriv->frag_len;
  50281. + pframe=(u8 *)RND4((SIZE_PTR)(pframe));
  50282. +
  50283. + }
  50284. +
  50285. + }
  50286. +
  50287. + }
  50288. +
  50289. +_func_exit_;
  50290. +
  50291. +}
  50292. +
  50293. +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe)
  50294. +{
  50295. + // exclude ICV
  50296. + u8 crc[4];
  50297. + struct arc4context mycontext;
  50298. + sint length;
  50299. + u32 keylength;
  50300. + u8 *pframe, *payload,*iv,wepkey[16];
  50301. + u8 keyindex;
  50302. + struct rx_pkt_attrib *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib);
  50303. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  50304. +
  50305. +_func_enter_;
  50306. +
  50307. + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;
  50308. +
  50309. + //start to decrypt recvframe
  50310. + if((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_))
  50311. + {
  50312. + iv=pframe+prxattrib->hdrlen;
  50313. + //keyindex=(iv[3]&0x3);
  50314. + keyindex = prxattrib->key_index;
  50315. + keylength=psecuritypriv->dot11DefKeylen[keyindex];
  50316. + _rtw_memcpy(&wepkey[0], iv, 3);
  50317. + //_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength);
  50318. + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength);
  50319. + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
  50320. +
  50321. + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen;
  50322. +
  50323. + //decrypt payload include icv
  50324. + arcfour_init(&mycontext, wepkey,3+keylength);
  50325. + arcfour_encrypt(&mycontext, payload, payload, length);
  50326. +
  50327. + //calculate icv and compare the icv
  50328. + *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4));
  50329. +
  50330. + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4])
  50331. + {
  50332. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
  50333. + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
  50334. + }
  50335. +
  50336. + }
  50337. +
  50338. +_func_exit_;
  50339. +
  50340. + return;
  50341. +
  50342. +}
  50343. +
  50344. +//3 =====TKIP related=====
  50345. +
  50346. +static u32 secmicgetuint32( u8 * p )
  50347. +// Convert from Byte[] to Us4Byte32 in a portable way
  50348. +{
  50349. + s32 i;
  50350. + u32 res = 0;
  50351. +_func_enter_;
  50352. + for( i=0; i<4; i++ )
  50353. + {
  50354. + res |= ((u32)(*p++)) << (8*i);
  50355. + }
  50356. +_func_exit_;
  50357. + return res;
  50358. +}
  50359. +
  50360. +static void secmicputuint32( u8 * p, u32 val )
  50361. +// Convert from Us4Byte32 to Byte[] in a portable way
  50362. +{
  50363. + long i;
  50364. +_func_enter_;
  50365. + for( i=0; i<4; i++ )
  50366. + {
  50367. + *p++ = (u8) (val & 0xff);
  50368. + val >>= 8;
  50369. + }
  50370. +_func_exit_;
  50371. +}
  50372. +
  50373. +static void secmicclear(struct mic_data *pmicdata)
  50374. +{
  50375. +// Reset the state to the empty message.
  50376. +_func_enter_;
  50377. + pmicdata->L = pmicdata->K0;
  50378. + pmicdata->R = pmicdata->K1;
  50379. + pmicdata->nBytesInM = 0;
  50380. + pmicdata->M = 0;
  50381. +_func_exit_;
  50382. +}
  50383. +
  50384. +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key )
  50385. +{
  50386. + // Set the key
  50387. +_func_enter_;
  50388. + pmicdata->K0 = secmicgetuint32( key );
  50389. + pmicdata->K1 = secmicgetuint32( key + 4 );
  50390. + // and reset the message
  50391. + secmicclear(pmicdata);
  50392. +_func_exit_;
  50393. +}
  50394. +
  50395. +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b )
  50396. +{
  50397. +_func_enter_;
  50398. + // Append the byte to our word-sized buffer
  50399. + pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM);
  50400. + pmicdata->nBytesInM++;
  50401. + // Process the word if it is full.
  50402. + if( pmicdata->nBytesInM >= 4 )
  50403. + {
  50404. + pmicdata->L ^= pmicdata->M;
  50405. + pmicdata->R ^= ROL32( pmicdata->L, 17 );
  50406. + pmicdata->L += pmicdata->R;
  50407. + pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8);
  50408. + pmicdata->L += pmicdata->R;
  50409. + pmicdata->R ^= ROL32( pmicdata->L, 3 );
  50410. + pmicdata->L += pmicdata->R;
  50411. + pmicdata->R ^= ROR32( pmicdata->L, 2 );
  50412. + pmicdata->L += pmicdata->R;
  50413. + // Clear the buffer
  50414. + pmicdata->M = 0;
  50415. + pmicdata->nBytesInM = 0;
  50416. + }
  50417. +_func_exit_;
  50418. +}
  50419. +
  50420. +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes )
  50421. +{
  50422. +_func_enter_;
  50423. + // This is simple
  50424. + while( nbytes > 0 )
  50425. + {
  50426. + rtw_secmicappendbyte(pmicdata, *src++ );
  50427. + nbytes--;
  50428. + }
  50429. +_func_exit_;
  50430. +}
  50431. +
  50432. +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst )
  50433. +{
  50434. +_func_enter_;
  50435. + // Append the minimum padding
  50436. + rtw_secmicappendbyte(pmicdata, 0x5a );
  50437. + rtw_secmicappendbyte(pmicdata, 0 );
  50438. + rtw_secmicappendbyte(pmicdata, 0 );
  50439. + rtw_secmicappendbyte(pmicdata, 0 );
  50440. + rtw_secmicappendbyte(pmicdata, 0 );
  50441. + // and then zeroes until the length is a multiple of 4
  50442. + while( pmicdata->nBytesInM != 0 )
  50443. + {
  50444. + rtw_secmicappendbyte(pmicdata, 0 );
  50445. + }
  50446. + // The appendByte function has already computed the result.
  50447. + secmicputuint32( dst, pmicdata->L );
  50448. + secmicputuint32( dst+4, pmicdata->R );
  50449. + // Reset to the empty message.
  50450. + secmicclear(pmicdata);
  50451. +_func_exit_;
  50452. +}
  50453. +
  50454. +
  50455. +void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri)
  50456. +{
  50457. +
  50458. + struct mic_data micdata;
  50459. + u8 priority[4]={0x0,0x0,0x0,0x0};
  50460. +_func_enter_;
  50461. + rtw_secmicsetkey(&micdata, key);
  50462. + priority[0]=pri;
  50463. +
  50464. + /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */
  50465. + if(header[1]&1){ //ToDS==1
  50466. + rtw_secmicappend(&micdata, &header[16], 6); //DA
  50467. + if(header[1]&2) //From Ds==1
  50468. + rtw_secmicappend(&micdata, &header[24], 6);
  50469. + else
  50470. + rtw_secmicappend(&micdata, &header[10], 6);
  50471. + }
  50472. + else{ //ToDS==0
  50473. + rtw_secmicappend(&micdata, &header[4], 6); //DA
  50474. + if(header[1]&2) //From Ds==1
  50475. + rtw_secmicappend(&micdata, &header[16], 6);
  50476. + else
  50477. + rtw_secmicappend(&micdata, &header[10], 6);
  50478. +
  50479. + }
  50480. + rtw_secmicappend(&micdata, &priority[0], 4);
  50481. +
  50482. +
  50483. + rtw_secmicappend(&micdata, data, data_len);
  50484. +
  50485. + rtw_secgetmic(&micdata,mic_code);
  50486. +_func_exit_;
  50487. +}
  50488. +
  50489. +
  50490. +
  50491. +
  50492. +/* macros for extraction/creation of unsigned char/unsigned short values */
  50493. +#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))
  50494. +#define Lo8(v16) ((u8)( (v16) & 0x00FF))
  50495. +#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF))
  50496. +#define Lo16(v32) ((u16)( (v32) & 0xFFFF))
  50497. +#define Hi16(v32) ((u16)(((v32) >>16) & 0xFFFF))
  50498. +#define Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8))
  50499. +
  50500. +/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */
  50501. +#define TK16(N) Mk16(tk[2*(N)+1],tk[2*(N)])
  50502. +
  50503. +/* S-box lookup: 16 bits --> 16 bits */
  50504. +#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])
  50505. +
  50506. +/* fixed algorithm "parameters" */
  50507. +#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */
  50508. +#define TA_SIZE 6 /* 48-bit transmitter address */
  50509. +#define TK_SIZE 16 /* 128-bit temporal key */
  50510. +#define P1K_SIZE 10 /* 80-bit Phase1 key */
  50511. +#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */
  50512. +
  50513. +
  50514. +/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */
  50515. +static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM) */
  50516. +{ {
  50517. + 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154,
  50518. + 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A,
  50519. + 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B,
  50520. + 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B,
  50521. + 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F,
  50522. + 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F,
  50523. + 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5,
  50524. + 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F,
  50525. + 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB,
  50526. + 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397,
  50527. + 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED,
  50528. + 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A,
  50529. + 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194,
  50530. + 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3,
  50531. + 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104,
  50532. + 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D,
  50533. + 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39,
  50534. + 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695,
  50535. + 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83,
  50536. + 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76,
  50537. + 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4,
  50538. + 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B,
  50539. + 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0,
  50540. + 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018,
  50541. + 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751,
  50542. + 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85,
  50543. + 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12,
  50544. + 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9,
  50545. + 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7,
  50546. + 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A,
  50547. + 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8,
  50548. + 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A,
  50549. + },
  50550. +
  50551. +
  50552. + { /* second half of table is unsigned char-reversed version of first! */
  50553. + 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491,
  50554. + 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC,
  50555. + 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB,
  50556. + 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B,
  50557. + 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83,
  50558. + 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A,
  50559. + 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F,
  50560. + 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA,
  50561. + 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B,
  50562. + 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713,
  50563. + 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6,
  50564. + 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85,
  50565. + 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411,
  50566. + 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B,
  50567. + 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1,
  50568. + 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF,
  50569. + 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E,
  50570. + 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6,
  50571. + 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B,
  50572. + 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD,
  50573. + 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8,
  50574. + 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2,
  50575. + 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049,
  50576. + 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810,
  50577. + 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197,
  50578. + 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F,
  50579. + 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C,
  50580. + 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927,
  50581. + 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733,
  50582. + 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5,
  50583. + 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0,
  50584. + 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C,
  50585. + }
  50586. +};
  50587. +
  50588. + /*
  50589. +**********************************************************************
  50590. +* Routine: Phase 1 -- generate P1K, given TA, TK, IV32
  50591. +*
  50592. +* Inputs:
  50593. +* tk[] = temporal key [128 bits]
  50594. +* ta[] = transmitter's MAC address [ 48 bits]
  50595. +* iv32 = upper 32 bits of IV [ 32 bits]
  50596. +* Output:
  50597. +* p1k[] = Phase 1 key [ 80 bits]
  50598. +*
  50599. +* Note:
  50600. +* This function only needs to be called every 2**16 packets,
  50601. +* although in theory it could be called every packet.
  50602. +*
  50603. +**********************************************************************
  50604. +*/
  50605. +static void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32)
  50606. +{
  50607. + sint i;
  50608. +_func_enter_;
  50609. + /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */
  50610. + p1k[0] = Lo16(iv32);
  50611. + p1k[1] = Hi16(iv32);
  50612. + p1k[2] = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */
  50613. + p1k[3] = Mk16(ta[3],ta[2]);
  50614. + p1k[4] = Mk16(ta[5],ta[4]);
  50615. +
  50616. + /* Now compute an unbalanced Feistel cipher with 80-bit block */
  50617. + /* size on the 80-bit block P1K[], using the 128-bit key TK[] */
  50618. + for (i=0; i < PHASE1_LOOP_CNT ;i++)
  50619. + { /* Each add operation here is mod 2**16 */
  50620. + p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0));
  50621. + p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2));
  50622. + p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4));
  50623. + p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6));
  50624. + p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0));
  50625. + p1k[4] += (unsigned short)i; /* avoid "slide attacks" */
  50626. + }
  50627. +_func_exit_;
  50628. +}
  50629. +
  50630. +
  50631. +/*
  50632. +**********************************************************************
  50633. +* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16
  50634. +*
  50635. +* Inputs:
  50636. +* tk[] = Temporal key [128 bits]
  50637. +* p1k[] = Phase 1 output key [ 80 bits]
  50638. +* iv16 = low 16 bits of IV counter [ 16 bits]
  50639. +* Output:
  50640. +* rc4key[] = the key used to encrypt the packet [128 bits]
  50641. +*
  50642. +* Note:
  50643. +* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique
  50644. +* across all packets using the same key TK value. Then, for a
  50645. +* given value of TK[], this TKIP48 construction guarantees that
  50646. +* the final RC4KEY value is unique across all packets.
  50647. +*
  50648. +* Suggested implementation optimization: if PPK[] is "overlaid"
  50649. +* appropriately on RC4KEY[], there is no need for the final
  50650. +* for loop below that copies the PPK[] result into RC4KEY[].
  50651. +*
  50652. +**********************************************************************
  50653. +*/
  50654. +static void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16)
  50655. +{
  50656. + sint i;
  50657. + u16 PPK[6]; /* temporary key for mixing */
  50658. +_func_enter_;
  50659. + /* Note: all adds in the PPK[] equations below are mod 2**16 */
  50660. + for (i=0;i<5;i++) PPK[i]=p1k[i]; /* first, copy P1K to PPK */
  50661. + PPK[5] = p1k[4] +iv16; /* next, add in IV16 */
  50662. +
  50663. + /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */
  50664. + PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */
  50665. + PPK[1] += _S_(PPK[0] ^ TK16(1));
  50666. + PPK[2] += _S_(PPK[1] ^ TK16(2));
  50667. + PPK[3] += _S_(PPK[2] ^ TK16(3));
  50668. + PPK[4] += _S_(PPK[3] ^ TK16(4));
  50669. + PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */
  50670. +
  50671. + /* Final sweep: bijective, "linear". Rotates kill LSB correlations */
  50672. + PPK[0] += RotR1(PPK[5] ^ TK16(6));
  50673. + PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */
  50674. + PPK[2] += RotR1(PPK[1]);
  50675. + PPK[3] += RotR1(PPK[2]);
  50676. + PPK[4] += RotR1(PPK[3]);
  50677. + PPK[5] += RotR1(PPK[4]);
  50678. + /* Note: At this point, for a given key TK[0..15], the 96-bit output */
  50679. + /* value PPK[0..5] is guaranteed to be unique, as a function */
  50680. + /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */
  50681. + /* is now a keyed permutation of {TA,IV32,IV16}. */
  50682. +
  50683. + /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */
  50684. + rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */
  50685. + rc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */
  50686. + rc4key[2] = Lo8(iv16);
  50687. + rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);
  50688. +
  50689. +
  50690. + /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */
  50691. + for (i=0;i<6;i++)
  50692. + {
  50693. + rc4key[4+2*i] = Lo8(PPK[i]);
  50694. + rc4key[5+2*i] = Hi8(PPK[i]);
  50695. + }
  50696. +_func_exit_;
  50697. +}
  50698. +
  50699. +
  50700. +//The hlen isn't include the IV
  50701. +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe)
  50702. +{ // exclude ICV
  50703. + u16 pnl;
  50704. + u32 pnh;
  50705. + u8 rc4key[16];
  50706. + u8 ttkey[16];
  50707. + u8 crc[4];
  50708. + struct arc4context mycontext;
  50709. + sint curfragnum,length;
  50710. + u32 prwskeylen;
  50711. +
  50712. + u8 *pframe, *payload,*iv,*prwskey;
  50713. + union pn48 dot11txpn;
  50714. + struct sta_info *stainfo;
  50715. + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
  50716. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  50717. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  50718. + u32 res=_SUCCESS;
  50719. +_func_enter_;
  50720. +
  50721. + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)
  50722. + return _FAIL;
  50723. +
  50724. +#ifdef CONFIG_USB_TX_AGGREGATION
  50725. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE +
  50726. + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
  50727. +#else
  50728. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET;
  50729. +#endif
  50730. +
  50731. + //4 start to encrypt each fragment
  50732. + if(pattrib->encrypt==_TKIP_){
  50733. +
  50734. + if(pattrib->psta)
  50735. + {
  50736. + stainfo = pattrib->psta;
  50737. + }
  50738. + else
  50739. + {
  50740. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  50741. + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
  50742. + }
  50743. +
  50744. + if (stainfo!=NULL){
  50745. +
  50746. + if(!(stainfo->state &_FW_LINKED))
  50747. + {
  50748. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
  50749. + return _FAIL;
  50750. + }
  50751. +
  50752. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo!=NULL!!!\n"));
  50753. +
  50754. + if(IS_MCAST(pattrib->ra))
  50755. + {
  50756. + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
  50757. + }
  50758. + else
  50759. + {
  50760. + prwskey=&stainfo->dot118021x_UncstKey.skey[0];
  50761. + }
  50762. +
  50763. + prwskeylen=16;
  50764. +
  50765. + for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
  50766. + iv=pframe+pattrib->hdrlen;
  50767. + payload=pframe+pattrib->iv_len+pattrib->hdrlen;
  50768. +
  50769. + GET_TKIP_PN(iv, dot11txpn);
  50770. +
  50771. + pnl=(u16)(dot11txpn.val);
  50772. + pnh=(u32)(dot11txpn.val>>16);
  50773. +
  50774. + phase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh);
  50775. +
  50776. + phase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl);
  50777. +
  50778. + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment
  50779. + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;
  50780. + RT_TRACE(_module_rtl871x_security_c_,_drv_info_,("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len,pattrib->icv_len));
  50781. + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/
  50782. +
  50783. + arcfour_init(&mycontext, rc4key,16);
  50784. + arcfour_encrypt(&mycontext, payload, payload, length);
  50785. + arcfour_encrypt(&mycontext, payload+length, crc, 4);
  50786. +
  50787. + }
  50788. + else{
  50789. + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;
  50790. + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/
  50791. + arcfour_init(&mycontext,rc4key,16);
  50792. + arcfour_encrypt(&mycontext, payload, payload, length);
  50793. + arcfour_encrypt(&mycontext, payload+length, crc, 4);
  50794. +
  50795. + pframe+=pxmitpriv->frag_len;
  50796. + pframe=(u8 *)RND4((SIZE_PTR)(pframe));
  50797. +
  50798. + }
  50799. + }
  50800. +
  50801. +
  50802. + }
  50803. + else{
  50804. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n"));
  50805. + DBG_871X("%s, psta==NUL\n", __func__);
  50806. + res=_FAIL;
  50807. + }
  50808. +
  50809. + }
  50810. +_func_exit_;
  50811. + return res;
  50812. +
  50813. +}
  50814. +
  50815. +
  50816. +//The hlen isn't include the IV
  50817. +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe)
  50818. +{ // exclude ICV
  50819. + u16 pnl;
  50820. + u32 pnh;
  50821. + u8 rc4key[16];
  50822. + u8 ttkey[16];
  50823. + u8 crc[4];
  50824. + struct arc4context mycontext;
  50825. + sint length;
  50826. + u32 prwskeylen;
  50827. +
  50828. + u8 *pframe, *payload,*iv,*prwskey;
  50829. + union pn48 dot11txpn;
  50830. + struct sta_info *stainfo;
  50831. + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
  50832. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  50833. +// struct recv_priv *precvpriv=&padapter->recvpriv;
  50834. + u32 res=_SUCCESS;
  50835. +
  50836. +_func_enter_;
  50837. +
  50838. + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;
  50839. +
  50840. + //4 start to decrypt recvframe
  50841. + if(prxattrib->encrypt==_TKIP_){
  50842. +
  50843. + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] );
  50844. + if (stainfo!=NULL){
  50845. +
  50846. + if(IS_MCAST(prxattrib->ra))
  50847. + {
  50848. + static u32 start = 0;
  50849. + static u32 no_gkey_bc_cnt = 0;
  50850. + static u32 no_gkey_mc_cnt = 0;
  50851. +
  50852. + if(psecuritypriv->binstallGrpkey==_FALSE)
  50853. + {
  50854. + res=_FAIL;
  50855. +
  50856. + if (start == 0)
  50857. + start = rtw_get_current_time();
  50858. +
  50859. + if (is_broadcast_mac_addr(prxattrib->ra))
  50860. + no_gkey_bc_cnt++;
  50861. + else
  50862. + no_gkey_mc_cnt++;
  50863. +
  50864. + if (rtw_get_passing_time_ms(start) > 1000) {
  50865. + if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
  50866. + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
  50867. + FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
  50868. + }
  50869. + start = rtw_get_current_time();
  50870. + no_gkey_bc_cnt = 0;
  50871. + no_gkey_mc_cnt = 0;
  50872. + }
  50873. + goto exit;
  50874. + }
  50875. +
  50876. + if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
  50877. + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
  50878. + FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
  50879. + }
  50880. + start = 0;
  50881. + no_gkey_bc_cnt = 0;
  50882. + no_gkey_mc_cnt = 0;
  50883. +
  50884. + //DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n");
  50885. + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
  50886. + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
  50887. + prwskeylen=16;
  50888. + }
  50889. + else
  50890. + {
  50891. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n"));
  50892. + prwskey=&stainfo->dot118021x_UncstKey.skey[0];
  50893. + prwskeylen=16;
  50894. + }
  50895. +
  50896. + iv=pframe+prxattrib->hdrlen;
  50897. + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen;
  50898. + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
  50899. +
  50900. + GET_TKIP_PN(iv, dot11txpn);
  50901. +
  50902. + pnl=(u16)(dot11txpn.val);
  50903. + pnh=(u32)(dot11txpn.val>>16);
  50904. +
  50905. + phase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh);
  50906. + phase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl);
  50907. +
  50908. + //4 decrypt payload include icv
  50909. +
  50910. + arcfour_init(&mycontext, rc4key,16);
  50911. + arcfour_encrypt(&mycontext, payload, payload, length);
  50912. +
  50913. + *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4));
  50914. +
  50915. + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4])
  50916. + {
  50917. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
  50918. + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
  50919. + res=_FAIL;
  50920. + }
  50921. +
  50922. +
  50923. + }
  50924. + else{
  50925. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n"));
  50926. + res=_FAIL;
  50927. + }
  50928. +
  50929. + }
  50930. +_func_exit_;
  50931. +exit:
  50932. + return res;
  50933. +
  50934. +}
  50935. +
  50936. +
  50937. +//3 =====AES related=====
  50938. +
  50939. +
  50940. +
  50941. +#define MAX_MSG_SIZE 2048
  50942. +/*****************************/
  50943. +/******** SBOX Table *********/
  50944. +/*****************************/
  50945. +
  50946. + static u8 sbox_table[256] =
  50947. + {
  50948. + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
  50949. + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
  50950. + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
  50951. + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
  50952. + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
  50953. + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
  50954. + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
  50955. + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
  50956. + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
  50957. + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
  50958. + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
  50959. + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
  50960. + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
  50961. + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
  50962. + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
  50963. + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
  50964. + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
  50965. + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
  50966. + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
  50967. + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
  50968. + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
  50969. + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
  50970. + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
  50971. + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
  50972. + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
  50973. + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
  50974. + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
  50975. + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
  50976. + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
  50977. + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
  50978. + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
  50979. + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
  50980. + };
  50981. +
  50982. +/*****************************/
  50983. +/**** Function Prototypes ****/
  50984. +/*****************************/
  50985. +
  50986. +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out);
  50987. +static void construct_mic_iv(
  50988. + u8 *mic_header1,
  50989. + sint qc_exists,
  50990. + sint a4_exists,
  50991. + u8 *mpdu,
  50992. + uint payload_length,
  50993. + u8 * pn_vector,
  50994. + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use
  50995. +static void construct_mic_header1(
  50996. + u8 *mic_header1,
  50997. + sint header_length,
  50998. + u8 *mpdu,
  50999. + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use
  51000. +static void construct_mic_header2(
  51001. + u8 *mic_header2,
  51002. + u8 *mpdu,
  51003. + sint a4_exists,
  51004. + sint qc_exists);
  51005. +static void construct_ctr_preload(
  51006. + u8 *ctr_preload,
  51007. + sint a4_exists,
  51008. + sint qc_exists,
  51009. + u8 *mpdu,
  51010. + u8 *pn_vector,
  51011. + sint c,
  51012. + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use
  51013. +static void xor_128(u8 *a, u8 *b, u8 *out);
  51014. +static void xor_32(u8 *a, u8 *b, u8 *out);
  51015. +static u8 sbox(u8 a);
  51016. +static void next_key(u8 *key, sint round);
  51017. +static void byte_sub(u8 *in, u8 *out);
  51018. +static void shift_row(u8 *in, u8 *out);
  51019. +static void mix_column(u8 *in, u8 *out);
  51020. +#ifndef PLATFORM_FREEBSD
  51021. +static void add_round_key( u8 *shiftrow_in,
  51022. + u8 *mcol_in,
  51023. + u8 *block_in,
  51024. + sint round,
  51025. + u8 *out);
  51026. +#endif //PLATFORM_FREEBSD
  51027. +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext);
  51028. +
  51029. +
  51030. +/****************************************/
  51031. +/* aes128k128d() */
  51032. +/* Performs a 128 bit AES encrypt with */
  51033. +/* 128 bit data. */
  51034. +/****************************************/
  51035. +static void xor_128(u8 *a, u8 *b, u8 *out)
  51036. +{
  51037. + sint i;
  51038. +_func_enter_;
  51039. + for (i=0;i<16; i++)
  51040. + {
  51041. + out[i] = a[i] ^ b[i];
  51042. + }
  51043. +_func_exit_;
  51044. +}
  51045. +
  51046. +
  51047. +static void xor_32(u8 *a, u8 *b, u8 *out)
  51048. +{
  51049. + sint i;
  51050. +_func_enter_;
  51051. + for (i=0;i<4; i++)
  51052. + {
  51053. + out[i] = a[i] ^ b[i];
  51054. + }
  51055. +_func_exit_;
  51056. +}
  51057. +
  51058. +
  51059. +static u8 sbox(u8 a)
  51060. +{
  51061. + return sbox_table[(sint)a];
  51062. +}
  51063. +
  51064. +
  51065. +static void next_key(u8 *key, sint round)
  51066. +{
  51067. + u8 rcon;
  51068. + u8 sbox_key[4];
  51069. + u8 rcon_table[12] =
  51070. + {
  51071. + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
  51072. + 0x1b, 0x36, 0x36, 0x36
  51073. + };
  51074. +_func_enter_;
  51075. + sbox_key[0] = sbox(key[13]);
  51076. + sbox_key[1] = sbox(key[14]);
  51077. + sbox_key[2] = sbox(key[15]);
  51078. + sbox_key[3] = sbox(key[12]);
  51079. +
  51080. + rcon = rcon_table[round];
  51081. +
  51082. + xor_32(&key[0], sbox_key, &key[0]);
  51083. + key[0] = key[0] ^ rcon;
  51084. +
  51085. + xor_32(&key[4], &key[0], &key[4]);
  51086. + xor_32(&key[8], &key[4], &key[8]);
  51087. + xor_32(&key[12], &key[8], &key[12]);
  51088. +_func_exit_;
  51089. +}
  51090. +
  51091. +
  51092. +static void byte_sub(u8 *in, u8 *out)
  51093. +{
  51094. + sint i;
  51095. +_func_enter_;
  51096. + for (i=0; i< 16; i++)
  51097. + {
  51098. + out[i] = sbox(in[i]);
  51099. + }
  51100. +_func_exit_;
  51101. +}
  51102. +
  51103. +
  51104. +static void shift_row(u8 *in, u8 *out)
  51105. +{
  51106. +_func_enter_;
  51107. + out[0] = in[0];
  51108. + out[1] = in[5];
  51109. + out[2] = in[10];
  51110. + out[3] = in[15];
  51111. + out[4] = in[4];
  51112. + out[5] = in[9];
  51113. + out[6] = in[14];
  51114. + out[7] = in[3];
  51115. + out[8] = in[8];
  51116. + out[9] = in[13];
  51117. + out[10] = in[2];
  51118. + out[11] = in[7];
  51119. + out[12] = in[12];
  51120. + out[13] = in[1];
  51121. + out[14] = in[6];
  51122. + out[15] = in[11];
  51123. +_func_exit_;
  51124. +}
  51125. +
  51126. +
  51127. +static void mix_column(u8 *in, u8 *out)
  51128. +{
  51129. + sint i;
  51130. + u8 add1b[4];
  51131. + u8 add1bf7[4];
  51132. + u8 rotl[4];
  51133. + u8 swap_halfs[4];
  51134. + u8 andf7[4];
  51135. + u8 rotr[4];
  51136. + u8 temp[4];
  51137. + u8 tempb[4];
  51138. +_func_enter_;
  51139. + for (i=0 ; i<4; i++)
  51140. + {
  51141. + if ((in[i] & 0x80)== 0x80)
  51142. + add1b[i] = 0x1b;
  51143. + else
  51144. + add1b[i] = 0x00;
  51145. + }
  51146. +
  51147. + swap_halfs[0] = in[2]; /* Swap halfs */
  51148. + swap_halfs[1] = in[3];
  51149. + swap_halfs[2] = in[0];
  51150. + swap_halfs[3] = in[1];
  51151. +
  51152. + rotl[0] = in[3]; /* Rotate left 8 bits */
  51153. + rotl[1] = in[0];
  51154. + rotl[2] = in[1];
  51155. + rotl[3] = in[2];
  51156. +
  51157. + andf7[0] = in[0] & 0x7f;
  51158. + andf7[1] = in[1] & 0x7f;
  51159. + andf7[2] = in[2] & 0x7f;
  51160. + andf7[3] = in[3] & 0x7f;
  51161. +
  51162. + for (i = 3; i>0; i--) /* logical shift left 1 bit */
  51163. + {
  51164. + andf7[i] = andf7[i] << 1;
  51165. + if ((andf7[i-1] & 0x80) == 0x80)
  51166. + {
  51167. + andf7[i] = (andf7[i] | 0x01);
  51168. + }
  51169. + }
  51170. + andf7[0] = andf7[0] << 1;
  51171. + andf7[0] = andf7[0] & 0xfe;
  51172. +
  51173. + xor_32(add1b, andf7, add1bf7);
  51174. +
  51175. + xor_32(in, add1bf7, rotr);
  51176. +
  51177. + temp[0] = rotr[0]; /* Rotate right 8 bits */
  51178. + rotr[0] = rotr[1];
  51179. + rotr[1] = rotr[2];
  51180. + rotr[2] = rotr[3];
  51181. + rotr[3] = temp[0];
  51182. +
  51183. + xor_32(add1bf7, rotr, temp);
  51184. + xor_32(swap_halfs, rotl,tempb);
  51185. + xor_32(temp, tempb, out);
  51186. +_func_exit_;
  51187. +}
  51188. +
  51189. +
  51190. +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)
  51191. +{
  51192. + sint round;
  51193. + sint i;
  51194. + u8 intermediatea[16];
  51195. + u8 intermediateb[16];
  51196. + u8 round_key[16];
  51197. +_func_enter_;
  51198. + for(i=0; i<16; i++) round_key[i] = key[i];
  51199. +
  51200. + for (round = 0; round < 11; round++)
  51201. + {
  51202. + if (round == 0)
  51203. + {
  51204. + xor_128(round_key, data, ciphertext);
  51205. + next_key(round_key, round);
  51206. + }
  51207. + else if (round == 10)
  51208. + {
  51209. + byte_sub(ciphertext, intermediatea);
  51210. + shift_row(intermediatea, intermediateb);
  51211. + xor_128(intermediateb, round_key, ciphertext);
  51212. + }
  51213. + else /* 1 - 9 */
  51214. + {
  51215. + byte_sub(ciphertext, intermediatea);
  51216. + shift_row(intermediatea, intermediateb);
  51217. + mix_column(&intermediateb[0], &intermediatea[0]);
  51218. + mix_column(&intermediateb[4], &intermediatea[4]);
  51219. + mix_column(&intermediateb[8], &intermediatea[8]);
  51220. + mix_column(&intermediateb[12], &intermediatea[12]);
  51221. + xor_128(intermediatea, round_key, ciphertext);
  51222. + next_key(round_key, round);
  51223. + }
  51224. + }
  51225. +_func_exit_;
  51226. +}
  51227. +
  51228. +
  51229. +/************************************************/
  51230. +/* construct_mic_iv() */
  51231. +/* Builds the MIC IV from header fields and PN */
  51232. +/* Baron think the function is construct CCM */
  51233. +/* nonce */
  51234. +/************************************************/
  51235. +static void construct_mic_iv(
  51236. + u8 *mic_iv,
  51237. + sint qc_exists,
  51238. + sint a4_exists,
  51239. + u8 *mpdu,
  51240. + uint payload_length,
  51241. + u8 *pn_vector,
  51242. + uint frtype// add for CONFIG_IEEE80211W, none 11w also can use
  51243. + )
  51244. +{
  51245. + sint i;
  51246. +_func_enter_;
  51247. + mic_iv[0] = 0x59;
  51248. + if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */
  51249. + if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */
  51250. + if (!qc_exists) mic_iv[1] = 0x00;
  51251. +#ifdef CONFIG_IEEE80211W
  51252. + //802.11w management frame should set management bit(4)
  51253. + if(frtype == WIFI_MGT_TYPE)
  51254. + mic_iv[1] |= BIT(4);
  51255. +#endif //CONFIG_IEEE80211W
  51256. + for (i = 2; i < 8; i++)
  51257. + mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */
  51258. + #ifdef CONSISTENT_PN_ORDER
  51259. + for (i = 8; i < 14; i++)
  51260. + mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */
  51261. + #else
  51262. + for (i = 8; i < 14; i++)
  51263. + mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
  51264. + #endif
  51265. + mic_iv[14] = (unsigned char) (payload_length / 256);
  51266. + mic_iv[15] = (unsigned char) (payload_length % 256);
  51267. +_func_exit_;
  51268. +}
  51269. +
  51270. +
  51271. +/************************************************/
  51272. +/* construct_mic_header1() */
  51273. +/* Builds the first MIC header block from */
  51274. +/* header fields. */
  51275. +/* Build AAD SC,A1,A2 */
  51276. +/************************************************/
  51277. +static void construct_mic_header1(
  51278. + u8 *mic_header1,
  51279. + sint header_length,
  51280. + u8 *mpdu,
  51281. + uint frtype// add for CONFIG_IEEE80211W, none 11w also can use
  51282. + )
  51283. +{
  51284. +_func_enter_;
  51285. + mic_header1[0] = (u8)((header_length - 2) / 256);
  51286. + mic_header1[1] = (u8)((header_length - 2) % 256);
  51287. +#ifdef CONFIG_IEEE80211W
  51288. + //802.11w management frame don't AND subtype bits 4,5,6 of frame control field
  51289. + if(frtype == WIFI_MGT_TYPE)
  51290. + mic_header1[2] = mpdu[0];
  51291. + else
  51292. +#endif //CONFIG_IEEE80211W
  51293. + mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */
  51294. +
  51295. + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */
  51296. + mic_header1[4] = mpdu[4]; /* A1 */
  51297. + mic_header1[5] = mpdu[5];
  51298. + mic_header1[6] = mpdu[6];
  51299. + mic_header1[7] = mpdu[7];
  51300. + mic_header1[8] = mpdu[8];
  51301. + mic_header1[9] = mpdu[9];
  51302. + mic_header1[10] = mpdu[10]; /* A2 */
  51303. + mic_header1[11] = mpdu[11];
  51304. + mic_header1[12] = mpdu[12];
  51305. + mic_header1[13] = mpdu[13];
  51306. + mic_header1[14] = mpdu[14];
  51307. + mic_header1[15] = mpdu[15];
  51308. +_func_exit_;
  51309. +}
  51310. +
  51311. +
  51312. +/************************************************/
  51313. +/* construct_mic_header2() */
  51314. +/* Builds the last MIC header block from */
  51315. +/* header fields. */
  51316. +/************************************************/
  51317. +static void construct_mic_header2(
  51318. + u8 *mic_header2,
  51319. + u8 *mpdu,
  51320. + sint a4_exists,
  51321. + sint qc_exists
  51322. + )
  51323. +{
  51324. + sint i;
  51325. +_func_enter_;
  51326. + for (i = 0; i<16; i++) mic_header2[i]=0x00;
  51327. +
  51328. + mic_header2[0] = mpdu[16]; /* A3 */
  51329. + mic_header2[1] = mpdu[17];
  51330. + mic_header2[2] = mpdu[18];
  51331. + mic_header2[3] = mpdu[19];
  51332. + mic_header2[4] = mpdu[20];
  51333. + mic_header2[5] = mpdu[21];
  51334. +
  51335. + //mic_header2[6] = mpdu[22] & 0xf0; /* SC */
  51336. + mic_header2[6] = 0x00;
  51337. + mic_header2[7] = 0x00; /* mpdu[23]; */
  51338. +
  51339. +
  51340. + if (!qc_exists && a4_exists)
  51341. + {
  51342. + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */
  51343. +
  51344. + }
  51345. +
  51346. + if (qc_exists && !a4_exists)
  51347. + {
  51348. + mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
  51349. + mic_header2[9] = mpdu[25] & 0x00;
  51350. + }
  51351. +
  51352. + if (qc_exists && a4_exists)
  51353. + {
  51354. + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */
  51355. +
  51356. + mic_header2[14] = mpdu[30] & 0x0f;
  51357. + mic_header2[15] = mpdu[31] & 0x00;
  51358. + }
  51359. +
  51360. +_func_exit_;
  51361. +}
  51362. +
  51363. +
  51364. +/************************************************/
  51365. +/* construct_mic_header2() */
  51366. +/* Builds the last MIC header block from */
  51367. +/* header fields. */
  51368. +/* Baron think the function is construct CCM */
  51369. +/* nonce */
  51370. +/************************************************/
  51371. +static void construct_ctr_preload(
  51372. + u8 *ctr_preload,
  51373. + sint a4_exists,
  51374. + sint qc_exists,
  51375. + u8 *mpdu,
  51376. + u8 *pn_vector,
  51377. + sint c,
  51378. + uint frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51379. + )
  51380. +{
  51381. + sint i = 0;
  51382. +_func_enter_;
  51383. + for (i=0; i<16; i++) ctr_preload[i] = 0x00;
  51384. + i = 0;
  51385. +
  51386. + ctr_preload[0] = 0x01; /* flag */
  51387. + if (qc_exists && a4_exists)
  51388. + ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */
  51389. + if (qc_exists && !a4_exists)
  51390. + ctr_preload[1] = mpdu[24] & 0x0f;
  51391. +#ifdef CONFIG_IEEE80211W
  51392. + //802.11w management frame should set management bit(4)
  51393. + if(frtype == WIFI_MGT_TYPE)
  51394. + ctr_preload[1] |= BIT(4);
  51395. +#endif //CONFIG_IEEE80211W
  51396. + for (i = 2; i < 8; i++)
  51397. + ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */
  51398. + #ifdef CONSISTENT_PN_ORDER
  51399. + for (i = 8; i < 14; i++)
  51400. + ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */
  51401. + #else
  51402. + for (i = 8; i < 14; i++)
  51403. + ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */
  51404. + #endif
  51405. + ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */
  51406. + ctr_preload[15] = (unsigned char) (c % 256);
  51407. +_func_exit_;
  51408. +}
  51409. +
  51410. +
  51411. +/************************************/
  51412. +/* bitwise_xor() */
  51413. +/* A 128 bit, bitwise exclusive or */
  51414. +/************************************/
  51415. +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out)
  51416. +{
  51417. + sint i;
  51418. +_func_enter_;
  51419. + for (i=0; i<16; i++)
  51420. + {
  51421. + out[i] = ina[i] ^ inb[i];
  51422. + }
  51423. +_func_exit_;
  51424. +}
  51425. +
  51426. +
  51427. +static sint aes_cipher(u8 *key, uint hdrlen,
  51428. + u8 *pframe, uint plen)
  51429. +{
  51430. +// /*static*/ unsigned char message[MAX_MSG_SIZE];
  51431. + uint qc_exists, a4_exists, i, j, payload_remainder,
  51432. + num_blocks, payload_index;
  51433. +
  51434. + u8 pn_vector[6];
  51435. + u8 mic_iv[16];
  51436. + u8 mic_header1[16];
  51437. + u8 mic_header2[16];
  51438. + u8 ctr_preload[16];
  51439. +
  51440. + /* Intermediate Buffers */
  51441. + u8 chain_buffer[16];
  51442. + u8 aes_out[16];
  51443. + u8 padded_buffer[16];
  51444. + u8 mic[8];
  51445. +// uint offset = 0;
  51446. + uint frtype = GetFrameType(pframe);
  51447. + uint frsubtype = GetFrameSubType(pframe);
  51448. +
  51449. +_func_enter_;
  51450. + frsubtype=frsubtype>>4;
  51451. +
  51452. +
  51453. + _rtw_memset((void *)mic_iv, 0, 16);
  51454. + _rtw_memset((void *)mic_header1, 0, 16);
  51455. + _rtw_memset((void *)mic_header2, 0, 16);
  51456. + _rtw_memset((void *)ctr_preload, 0, 16);
  51457. + _rtw_memset((void *)chain_buffer, 0, 16);
  51458. + _rtw_memset((void *)aes_out, 0, 16);
  51459. + _rtw_memset((void *)padded_buffer, 0, 16);
  51460. +
  51461. + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN))
  51462. + a4_exists = 0;
  51463. + else
  51464. + a4_exists = 1;
  51465. +
  51466. + if (
  51467. + ((frtype|frsubtype) == WIFI_DATA_CFACK) ||
  51468. + ((frtype|frsubtype) == WIFI_DATA_CFPOLL)||
  51469. + ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL))
  51470. + {
  51471. + qc_exists = 1;
  51472. + if(hdrlen != WLAN_HDR_A3_QOS_LEN){
  51473. +
  51474. + hdrlen += 2;
  51475. + }
  51476. + }
  51477. + // add for CONFIG_IEEE80211W, none 11w also can use
  51478. + else if ((frtype == WIFI_DATA) &&
  51479. + ((frsubtype == 0x08) ||
  51480. + (frsubtype == 0x09)||
  51481. + (frsubtype == 0x0a)||
  51482. + (frsubtype == 0x0b)))
  51483. + {
  51484. + if(hdrlen != WLAN_HDR_A3_QOS_LEN){
  51485. +
  51486. + hdrlen += 2;
  51487. + }
  51488. + qc_exists = 1;
  51489. + }
  51490. + else
  51491. + qc_exists = 0;
  51492. +
  51493. + pn_vector[0]=pframe[hdrlen];
  51494. + pn_vector[1]=pframe[hdrlen+1];
  51495. + pn_vector[2]=pframe[hdrlen+4];
  51496. + pn_vector[3]=pframe[hdrlen+5];
  51497. + pn_vector[4]=pframe[hdrlen+6];
  51498. + pn_vector[5]=pframe[hdrlen+7];
  51499. +
  51500. + construct_mic_iv(
  51501. + mic_iv,
  51502. + qc_exists,
  51503. + a4_exists,
  51504. + pframe, //message,
  51505. + plen,
  51506. + pn_vector,
  51507. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51508. + );
  51509. +
  51510. + construct_mic_header1(
  51511. + mic_header1,
  51512. + hdrlen,
  51513. + pframe, //message
  51514. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51515. + );
  51516. + construct_mic_header2(
  51517. + mic_header2,
  51518. + pframe, //message,
  51519. + a4_exists,
  51520. + qc_exists
  51521. + );
  51522. +
  51523. +
  51524. + payload_remainder = plen % 16;
  51525. + num_blocks = plen / 16;
  51526. +
  51527. + /* Find start of payload */
  51528. + payload_index = (hdrlen + 8);
  51529. +
  51530. + /* Calculate MIC */
  51531. + aes128k128d(key, mic_iv, aes_out);
  51532. + bitwise_xor(aes_out, mic_header1, chain_buffer);
  51533. + aes128k128d(key, chain_buffer, aes_out);
  51534. + bitwise_xor(aes_out, mic_header2, chain_buffer);
  51535. + aes128k128d(key, chain_buffer, aes_out);
  51536. +
  51537. + for (i = 0; i < num_blocks; i++)
  51538. + {
  51539. + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer);
  51540. +
  51541. + payload_index += 16;
  51542. + aes128k128d(key, chain_buffer, aes_out);
  51543. + }
  51544. +
  51545. + /* Add on the final payload block if it needs padding */
  51546. + if (payload_remainder > 0)
  51547. + {
  51548. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51549. + for (j = 0; j < payload_remainder; j++)
  51550. + {
  51551. + padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++];
  51552. + }
  51553. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51554. + aes128k128d(key, chain_buffer, aes_out);
  51555. +
  51556. + }
  51557. +
  51558. + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j];
  51559. +
  51560. + /* Insert MIC into payload */
  51561. + for (j = 0; j < 8; j++)
  51562. + pframe[payload_index+j] = mic[j]; //message[payload_index+j] = mic[j];
  51563. +
  51564. + payload_index = hdrlen + 8;
  51565. + for (i=0; i< num_blocks; i++)
  51566. + {
  51567. + construct_ctr_preload(
  51568. + ctr_preload,
  51569. + a4_exists,
  51570. + qc_exists,
  51571. + pframe, //message,
  51572. + pn_vector,
  51573. + i+1,
  51574. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51575. + aes128k128d(key, ctr_preload, aes_out);
  51576. + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer);
  51577. + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j];
  51578. + }
  51579. +
  51580. + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/
  51581. + { /* encrypt it and copy the unpadded part back */
  51582. + construct_ctr_preload(
  51583. + ctr_preload,
  51584. + a4_exists,
  51585. + qc_exists,
  51586. + pframe, //message,
  51587. + pn_vector,
  51588. + num_blocks+1,
  51589. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51590. +
  51591. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51592. + for (j = 0; j < payload_remainder; j++)
  51593. + {
  51594. + padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j];
  51595. + }
  51596. + aes128k128d(key, ctr_preload, aes_out);
  51597. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51598. + for (j=0; j<payload_remainder;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j];
  51599. + }
  51600. +
  51601. + /* Encrypt the MIC */
  51602. + construct_ctr_preload(
  51603. + ctr_preload,
  51604. + a4_exists,
  51605. + qc_exists,
  51606. + pframe, //message,
  51607. + pn_vector,
  51608. + 0,
  51609. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51610. +
  51611. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51612. + for (j = 0; j < 8; j++)
  51613. + {
  51614. + padded_buffer[j] = pframe[j+hdrlen+8+plen];//padded_buffer[j] = message[j+hdrlen+8+plen];
  51615. + }
  51616. +
  51617. + aes128k128d(key, ctr_preload, aes_out);
  51618. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51619. + for (j=0; j<8;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<8;j++) message[payload_index++] = chain_buffer[j];
  51620. +_func_exit_;
  51621. + return _SUCCESS;
  51622. +}
  51623. +
  51624. +
  51625. +
  51626. +
  51627. +u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe)
  51628. +{ // exclude ICV
  51629. +
  51630. +
  51631. + /*static*/
  51632. +// unsigned char message[MAX_MSG_SIZE];
  51633. +
  51634. + /* Intermediate Buffers */
  51635. + sint curfragnum,length;
  51636. + u32 prwskeylen;
  51637. + u8 *pframe,*prwskey; //, *payload,*iv
  51638. + struct sta_info *stainfo=NULL;
  51639. + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;
  51640. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  51641. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  51642. +
  51643. +// uint offset = 0;
  51644. + u32 res=_SUCCESS;
  51645. +_func_enter_;
  51646. +
  51647. + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)
  51648. + return _FAIL;
  51649. +
  51650. +#ifdef CONFIG_USB_TX_AGGREGATION
  51651. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE +
  51652. + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);
  51653. +#else
  51654. + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET;
  51655. +#endif
  51656. +
  51657. + //4 start to encrypt each fragment
  51658. + if((pattrib->encrypt==_AES_)){
  51659. +
  51660. + if(pattrib->psta)
  51661. + {
  51662. + stainfo = pattrib->psta;
  51663. + }
  51664. + else
  51665. + {
  51666. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  51667. + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
  51668. + }
  51669. +
  51670. + if (stainfo!=NULL){
  51671. +
  51672. + if(!(stainfo->state &_FW_LINKED))
  51673. + {
  51674. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
  51675. + return _FAIL;
  51676. + }
  51677. +
  51678. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo!=NULL!!!\n"));
  51679. +
  51680. + if(IS_MCAST(pattrib->ra))
  51681. + {
  51682. + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
  51683. + }
  51684. + else
  51685. + {
  51686. + prwskey=&stainfo->dot118021x_UncstKey.skey[0];
  51687. + }
  51688. +
  51689. +#ifdef CONFIG_TDLS //swencryption
  51690. + {
  51691. + struct sta_info *ptdls_sta;
  51692. + ptdls_sta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->dst[0] );
  51693. + if((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) )
  51694. + {
  51695. + DBG_871X("[%s] for tdls link\n", __FUNCTION__);
  51696. + prwskey=&ptdls_sta->tpk.tk[0];
  51697. + }
  51698. + }
  51699. +#endif //CONFIG_TDLS
  51700. +
  51701. + prwskeylen=16;
  51702. +
  51703. + for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
  51704. +
  51705. + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment
  51706. + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;
  51707. +
  51708. + aes_cipher(prwskey,pattrib->hdrlen,pframe, length);
  51709. + }
  51710. + else{
  51711. + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;
  51712. +
  51713. + aes_cipher(prwskey,pattrib->hdrlen,pframe, length);
  51714. + pframe+=pxmitpriv->frag_len;
  51715. + pframe=(u8*)RND4((SIZE_PTR)(pframe));
  51716. +
  51717. + }
  51718. + }
  51719. +
  51720. +
  51721. + }
  51722. + else{
  51723. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
  51724. + DBG_871X("%s, psta==NUL\n", __func__);
  51725. + res=_FAIL;
  51726. + }
  51727. +
  51728. + }
  51729. +
  51730. +
  51731. +
  51732. +_func_exit_;
  51733. + return res;
  51734. +}
  51735. +
  51736. +static sint aes_decipher(u8 *key, uint hdrlen,
  51737. + u8 *pframe, uint plen)
  51738. +{
  51739. + static u8 message[MAX_MSG_SIZE];
  51740. + uint qc_exists, a4_exists, i, j, payload_remainder,
  51741. + num_blocks, payload_index;
  51742. + sint res = _SUCCESS;
  51743. + u8 pn_vector[6];
  51744. + u8 mic_iv[16];
  51745. + u8 mic_header1[16];
  51746. + u8 mic_header2[16];
  51747. + u8 ctr_preload[16];
  51748. +
  51749. + /* Intermediate Buffers */
  51750. + u8 chain_buffer[16];
  51751. + u8 aes_out[16];
  51752. + u8 padded_buffer[16];
  51753. + u8 mic[8];
  51754. +
  51755. +
  51756. +// uint offset = 0;
  51757. + uint frtype = GetFrameType(pframe);
  51758. + uint frsubtype = GetFrameSubType(pframe);
  51759. +_func_enter_;
  51760. + frsubtype=frsubtype>>4;
  51761. +
  51762. +
  51763. + _rtw_memset((void *)mic_iv, 0, 16);
  51764. + _rtw_memset((void *)mic_header1, 0, 16);
  51765. + _rtw_memset((void *)mic_header2, 0, 16);
  51766. + _rtw_memset((void *)ctr_preload, 0, 16);
  51767. + _rtw_memset((void *)chain_buffer, 0, 16);
  51768. + _rtw_memset((void *)aes_out, 0, 16);
  51769. + _rtw_memset((void *)padded_buffer, 0, 16);
  51770. +
  51771. + //start to decrypt the payload
  51772. +
  51773. + num_blocks = (plen-8) / 16; //(plen including LLC, payload_length and mic )
  51774. +
  51775. + payload_remainder = (plen-8) % 16;
  51776. +
  51777. + pn_vector[0] = pframe[hdrlen];
  51778. + pn_vector[1] = pframe[hdrlen+1];
  51779. + pn_vector[2] = pframe[hdrlen+4];
  51780. + pn_vector[3] = pframe[hdrlen+5];
  51781. + pn_vector[4] = pframe[hdrlen+6];
  51782. + pn_vector[5] = pframe[hdrlen+7];
  51783. +
  51784. + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN))
  51785. + a4_exists = 0;
  51786. + else
  51787. + a4_exists = 1;
  51788. +
  51789. + if (
  51790. + ((frtype|frsubtype) == WIFI_DATA_CFACK) ||
  51791. + ((frtype|frsubtype) == WIFI_DATA_CFPOLL)||
  51792. + ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL))
  51793. + {
  51794. + qc_exists = 1;
  51795. + if(hdrlen != WLAN_HDR_A3_QOS_LEN){
  51796. +
  51797. + hdrlen += 2;
  51798. + }
  51799. + }//only for data packet . add for CONFIG_IEEE80211W, none 11w also can use
  51800. + else if ((frtype == WIFI_DATA) &&
  51801. + ((frsubtype == 0x08) ||
  51802. + (frsubtype == 0x09)||
  51803. + (frsubtype == 0x0a)||
  51804. + (frsubtype == 0x0b)))
  51805. + {
  51806. + if(hdrlen != WLAN_HDR_A3_QOS_LEN){
  51807. +
  51808. + hdrlen += 2;
  51809. + }
  51810. + qc_exists = 1;
  51811. + }
  51812. + else
  51813. + qc_exists = 0;
  51814. +
  51815. +
  51816. + // now, decrypt pframe with hdrlen offset and plen long
  51817. +
  51818. + payload_index = hdrlen + 8; // 8 is for extiv
  51819. +
  51820. + for (i=0; i< num_blocks; i++)
  51821. + {
  51822. + construct_ctr_preload(
  51823. + ctr_preload,
  51824. + a4_exists,
  51825. + qc_exists,
  51826. + pframe,
  51827. + pn_vector,
  51828. + i+1,
  51829. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51830. + );
  51831. +
  51832. + aes128k128d(key, ctr_preload, aes_out);
  51833. + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);
  51834. +
  51835. + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];
  51836. + }
  51837. +
  51838. + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/
  51839. + { /* encrypt it and copy the unpadded part back */
  51840. + construct_ctr_preload(
  51841. + ctr_preload,
  51842. + a4_exists,
  51843. + qc_exists,
  51844. + pframe,
  51845. + pn_vector,
  51846. + num_blocks+1,
  51847. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51848. + );
  51849. +
  51850. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51851. + for (j = 0; j < payload_remainder; j++)
  51852. + {
  51853. + padded_buffer[j] = pframe[payload_index+j];
  51854. + }
  51855. + aes128k128d(key, ctr_preload, aes_out);
  51856. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51857. + for (j=0; j<payload_remainder;j++) pframe[payload_index++] = chain_buffer[j];
  51858. + }
  51859. +
  51860. + //start to calculate the mic
  51861. +
  51862. + _rtw_memcpy((void *)message, pframe, (hdrlen +plen+8)); //8 is for ext iv len
  51863. +
  51864. +
  51865. + pn_vector[0]=pframe[hdrlen];
  51866. + pn_vector[1]=pframe[hdrlen+1];
  51867. + pn_vector[2]=pframe[hdrlen+4];
  51868. + pn_vector[3]=pframe[hdrlen+5];
  51869. + pn_vector[4]=pframe[hdrlen+6];
  51870. + pn_vector[5]=pframe[hdrlen+7];
  51871. +
  51872. +
  51873. +
  51874. + construct_mic_iv(
  51875. + mic_iv,
  51876. + qc_exists,
  51877. + a4_exists,
  51878. + message,
  51879. + plen-8,
  51880. + pn_vector,
  51881. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51882. + );
  51883. +
  51884. + construct_mic_header1(
  51885. + mic_header1,
  51886. + hdrlen,
  51887. + message,
  51888. + frtype // add for CONFIG_IEEE80211W, none 11w also can use
  51889. + );
  51890. + construct_mic_header2(
  51891. + mic_header2,
  51892. + message,
  51893. + a4_exists,
  51894. + qc_exists
  51895. + );
  51896. +
  51897. +
  51898. + payload_remainder = (plen-8) % 16;
  51899. + num_blocks = (plen-8) / 16;
  51900. +
  51901. + /* Find start of payload */
  51902. + payload_index = (hdrlen + 8);
  51903. +
  51904. + /* Calculate MIC */
  51905. + aes128k128d(key, mic_iv, aes_out);
  51906. + bitwise_xor(aes_out, mic_header1, chain_buffer);
  51907. + aes128k128d(key, chain_buffer, aes_out);
  51908. + bitwise_xor(aes_out, mic_header2, chain_buffer);
  51909. + aes128k128d(key, chain_buffer, aes_out);
  51910. +
  51911. + for (i = 0; i < num_blocks; i++)
  51912. + {
  51913. + bitwise_xor(aes_out, &message[payload_index], chain_buffer);
  51914. +
  51915. + payload_index += 16;
  51916. + aes128k128d(key, chain_buffer, aes_out);
  51917. + }
  51918. +
  51919. + /* Add on the final payload block if it needs padding */
  51920. + if (payload_remainder > 0)
  51921. + {
  51922. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51923. + for (j = 0; j < payload_remainder; j++)
  51924. + {
  51925. + padded_buffer[j] = message[payload_index++];
  51926. + }
  51927. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51928. + aes128k128d(key, chain_buffer, aes_out);
  51929. +
  51930. + }
  51931. +
  51932. + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j];
  51933. +
  51934. + /* Insert MIC into payload */
  51935. + for (j = 0; j < 8; j++)
  51936. + message[payload_index+j] = mic[j];
  51937. +
  51938. + payload_index = hdrlen + 8;
  51939. + for (i=0; i< num_blocks; i++)
  51940. + {
  51941. + construct_ctr_preload(
  51942. + ctr_preload,
  51943. + a4_exists,
  51944. + qc_exists,
  51945. + message,
  51946. + pn_vector,
  51947. + i+1,
  51948. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51949. + aes128k128d(key, ctr_preload, aes_out);
  51950. + bitwise_xor(aes_out, &message[payload_index], chain_buffer);
  51951. + for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j];
  51952. + }
  51953. +
  51954. + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/
  51955. + { /* encrypt it and copy the unpadded part back */
  51956. + construct_ctr_preload(
  51957. + ctr_preload,
  51958. + a4_exists,
  51959. + qc_exists,
  51960. + message,
  51961. + pn_vector,
  51962. + num_blocks+1,
  51963. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51964. +
  51965. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51966. + for (j = 0; j < payload_remainder; j++)
  51967. + {
  51968. + padded_buffer[j] = message[payload_index+j];
  51969. + }
  51970. + aes128k128d(key, ctr_preload, aes_out);
  51971. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51972. + for (j=0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j];
  51973. + }
  51974. +
  51975. + /* Encrypt the MIC */
  51976. + construct_ctr_preload(
  51977. + ctr_preload,
  51978. + a4_exists,
  51979. + qc_exists,
  51980. + message,
  51981. + pn_vector,
  51982. + 0,
  51983. + frtype); // add for CONFIG_IEEE80211W, none 11w also can use
  51984. +
  51985. + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;
  51986. + for (j = 0; j < 8; j++)
  51987. + {
  51988. + padded_buffer[j] = message[j+hdrlen+8+plen-8];
  51989. + }
  51990. +
  51991. + aes128k128d(key, ctr_preload, aes_out);
  51992. + bitwise_xor(aes_out, padded_buffer, chain_buffer);
  51993. + for (j=0; j<8;j++) message[payload_index++] = chain_buffer[j];
  51994. +
  51995. + //compare the mic
  51996. + for(i=0;i<8;i++){
  51997. + if(pframe[hdrlen+8+plen-8+i] != message[hdrlen+8+plen-8+i])
  51998. + {
  51999. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x) \n",
  52000. + i,pframe[hdrlen+8+plen-8+i],message[hdrlen+8+plen-8+i]));
  52001. + DBG_871X("aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x) \n",
  52002. + i,pframe[hdrlen+8+plen-8+i],message[hdrlen+8+plen-8+i]);
  52003. + res = _FAIL;
  52004. + }
  52005. + }
  52006. +
  52007. + if(res == _FAIL)
  52008. + {
  52009. + int gg=0;
  52010. + for(gg=0; gg < 32; gg++)
  52011. + DBG_871X(" [%d]=%02x ", gg, pframe[gg]);
  52012. + DBG_871X("error packet header \n");
  52013. + }
  52014. +
  52015. +_func_exit_;
  52016. + return res;
  52017. +}
  52018. +
  52019. +u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe)
  52020. +{ // exclude ICV
  52021. +
  52022. +
  52023. + /*static*/
  52024. +// unsigned char message[MAX_MSG_SIZE];
  52025. +
  52026. +
  52027. + /* Intermediate Buffers */
  52028. +
  52029. +
  52030. + sint length;
  52031. + u8 *pframe,*prwskey; //, *payload,*iv
  52032. + struct sta_info *stainfo;
  52033. + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
  52034. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  52035. +// struct recv_priv *precvpriv=&padapter->recvpriv;
  52036. + u32 res=_SUCCESS;
  52037. +_func_enter_;
  52038. + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;
  52039. + //4 start to encrypt each fragment
  52040. + if((prxattrib->encrypt==_AES_)){
  52041. +
  52042. + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] );
  52043. + if (stainfo!=NULL){
  52044. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo!=NULL!!!\n"));
  52045. +
  52046. + if(IS_MCAST(prxattrib->ra))
  52047. + {
  52048. + //in concurrent we should use sw descrypt in group key, so we remove this message
  52049. + //DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
  52050. + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
  52051. + if(psecuritypriv->binstallGrpkey==_FALSE)
  52052. + {
  52053. + res=_FAIL;
  52054. + DBG_8192C("%s:rx bc/mc packets,but didn't install group key!!!!!!!!!!\n",__FUNCTION__);
  52055. + goto exit;
  52056. + }
  52057. + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
  52058. +
  52059. + if(psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index)
  52060. + {
  52061. + DBG_871X("not match packet_index=%d, install_index=%d \n"
  52062. + , prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid);
  52063. + res=_FAIL;
  52064. + goto exit;
  52065. + }
  52066. + }
  52067. + else
  52068. + {
  52069. + prwskey=&stainfo->dot118021x_UncstKey.skey[0];
  52070. + }
  52071. +
  52072. + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;
  52073. + /*// add for CONFIG_IEEE80211W, debug
  52074. + if(0)
  52075. + printk("@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d \n"
  52076. + , length, prxattrib->hdrlen, prxattrib->pkt_len);
  52077. + if(0)
  52078. + {
  52079. + int no;
  52080. + //test print PSK
  52081. + printk("PSK key below:\n");
  52082. + for(no=0;no<16;no++)
  52083. + printk(" %02x ", prwskey[no]);
  52084. + printk("\n");
  52085. + }
  52086. + if(0)
  52087. + {
  52088. + int no;
  52089. + //test print PSK
  52090. + printk("frame:\n");
  52091. + for(no=0;no<prxattrib->pkt_len;no++)
  52092. + printk(" %02x ", pframe[no]);
  52093. + printk("\n");
  52094. + }*/
  52095. +
  52096. + res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);
  52097. + }
  52098. + else{
  52099. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
  52100. + res=_FAIL;
  52101. + }
  52102. +
  52103. + }
  52104. +_func_exit_;
  52105. +exit:
  52106. + return res;
  52107. +}
  52108. +
  52109. +#ifdef CONFIG_IEEE80211W
  52110. +u32 rtw_BIP_verify(_adapter *padapter, u8 *precvframe)
  52111. +{
  52112. + struct rx_pkt_attrib *pattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;
  52113. + u8 *pframe;
  52114. + u8 *BIP_AAD, *p;
  52115. + u32 res=_FAIL;
  52116. + uint len, ori_len;
  52117. + struct rtw_ieee80211_hdr *pwlanhdr;
  52118. + u8 mic[16];
  52119. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  52120. + ori_len = pattrib->pkt_len-WLAN_HDR_A3_LEN+BIP_AAD_SIZE;
  52121. + BIP_AAD = rtw_zmalloc(ori_len);
  52122. +
  52123. + if(BIP_AAD == NULL)
  52124. + {
  52125. + DBG_871X("BIP AAD allocate fail\n");
  52126. + return _FAIL;
  52127. + }
  52128. + //PKT start
  52129. + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;
  52130. + //mapping to wlan header
  52131. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  52132. + //save the frame body + MME
  52133. + _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, pframe+WLAN_HDR_A3_LEN, pattrib->pkt_len-WLAN_HDR_A3_LEN);
  52134. + //find MME IE pointer
  52135. + p = rtw_get_ie(BIP_AAD+BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len-WLAN_HDR_A3_LEN);
  52136. + //Baron
  52137. + if(p)
  52138. + {
  52139. + u16 keyid=0;
  52140. + u64 temp_ipn=0;
  52141. + //save packet number
  52142. + _rtw_memcpy(&temp_ipn, p+4, 6);
  52143. + temp_ipn = le64_to_cpu(temp_ipn);
  52144. + //BIP packet number should bigger than previous BIP packet
  52145. + if(temp_ipn <= pmlmeext->mgnt_80211w_IPN_rx)
  52146. + {
  52147. + DBG_871X("replay BIP packet\n");
  52148. + goto BIP_exit;
  52149. + }
  52150. + //copy key index
  52151. + _rtw_memcpy(&keyid, p+2, 2);
  52152. + keyid = le16_to_cpu(keyid);
  52153. + if(keyid != padapter->securitypriv.dot11wBIPKeyid)
  52154. + {
  52155. + DBG_871X("BIP key index error!\n");
  52156. + goto BIP_exit;
  52157. + }
  52158. + //clear the MIC field of MME to zero
  52159. + _rtw_memset(p+2+len-8, 0, 8);
  52160. +
  52161. + //conscruct AAD, copy frame control field
  52162. + _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
  52163. + ClearRetry(BIP_AAD);
  52164. + ClearPwrMgt(BIP_AAD);
  52165. + ClearMData(BIP_AAD);
  52166. + //conscruct AAD, copy address 1 to address 3
  52167. + _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
  52168. +
  52169. + if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
  52170. + , BIP_AAD, ori_len, mic))
  52171. + goto BIP_exit;
  52172. +
  52173. + /*//management packet content
  52174. + {
  52175. + int pp;
  52176. + DBG_871X("pkt: ");
  52177. + for(pp=0;pp< pattrib->pkt_len; pp++)
  52178. + printk(" %02x ", pframe[pp]);
  52179. + DBG_871X("\n");
  52180. + //BIP AAD + management frame body + MME(MIC is zero)
  52181. + DBG_871X("AAD+PKT: ");
  52182. + for(pp=0;pp< ori_len; pp++)
  52183. + DBG_871X(" %02x ", BIP_AAD[pp]);
  52184. + DBG_871X("\n");
  52185. + //show the MIC result
  52186. + DBG_871X("mic: ");
  52187. + for(pp=0;pp<16; pp++)
  52188. + DBG_871X(" %02x ", mic[pp]);
  52189. + DBG_871X("\n");
  52190. + }
  52191. + */
  52192. + //MIC field should be last 8 bytes of packet (packet without FCS)
  52193. + if(_rtw_memcmp(mic, pframe+pattrib->pkt_len-8, 8))
  52194. + {
  52195. + pmlmeext->mgnt_80211w_IPN_rx = temp_ipn;
  52196. + res=_SUCCESS;
  52197. + }
  52198. + else
  52199. + DBG_871X("BIP MIC error!\n");
  52200. +
  52201. + }
  52202. + else
  52203. + res = RTW_RX_HANDLED;
  52204. +BIP_exit:
  52205. +
  52206. + rtw_mfree(BIP_AAD, ori_len);
  52207. + return res;
  52208. +}
  52209. +#endif //CONFIG_IEEE80211W
  52210. +
  52211. +#ifndef PLATFORM_FREEBSD
  52212. +/* compress 512-bits */
  52213. +static int sha256_compress(struct sha256_state *md, unsigned char *buf)
  52214. +{
  52215. + u32 S[8], W[64], t0, t1;
  52216. + u32 t;
  52217. + int i;
  52218. +
  52219. + /* copy state into S */
  52220. + for (i = 0; i < 8; i++) {
  52221. + S[i] = md->state[i];
  52222. + }
  52223. +
  52224. + /* copy the state into 512-bits into W[0..15] */
  52225. + for (i = 0; i < 16; i++)
  52226. + W[i] = WPA_GET_BE32(buf + (4 * i));
  52227. +
  52228. + /* fill W[16..63] */
  52229. + for (i = 16; i < 64; i++) {
  52230. + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +
  52231. + W[i - 16];
  52232. + }
  52233. +
  52234. + /* Compress */
  52235. +#define RND(a,b,c,d,e,f,g,h,i) \
  52236. + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
  52237. + t1 = Sigma0(a) + Maj(a, b, c); \
  52238. + d += t0; \
  52239. + h = t0 + t1;
  52240. +
  52241. + for (i = 0; i < 64; ++i) {
  52242. + RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);
  52243. + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
  52244. + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
  52245. + }
  52246. +
  52247. + /* feedback */
  52248. + for (i = 0; i < 8; i++) {
  52249. + md->state[i] = md->state[i] + S[i];
  52250. + }
  52251. + return 0;
  52252. +}
  52253. +
  52254. +/* Initialize the hash state */
  52255. +static void sha256_init(struct sha256_state *md)
  52256. +{
  52257. + md->curlen = 0;
  52258. + md->length = 0;
  52259. + md->state[0] = 0x6A09E667UL;
  52260. + md->state[1] = 0xBB67AE85UL;
  52261. + md->state[2] = 0x3C6EF372UL;
  52262. + md->state[3] = 0xA54FF53AUL;
  52263. + md->state[4] = 0x510E527FUL;
  52264. + md->state[5] = 0x9B05688CUL;
  52265. + md->state[6] = 0x1F83D9ABUL;
  52266. + md->state[7] = 0x5BE0CD19UL;
  52267. +}
  52268. +
  52269. +/**
  52270. + Process a block of memory though the hash
  52271. + @param md The hash state
  52272. + @param in The data to hash
  52273. + @param inlen The length of the data (octets)
  52274. + @return CRYPT_OK if successful
  52275. +*/
  52276. +static int sha256_process(struct sha256_state *md, unsigned char *in,
  52277. + unsigned long inlen)
  52278. +{
  52279. + unsigned long n;
  52280. +#define block_size 64
  52281. +
  52282. + if (md->curlen > sizeof(md->buf))
  52283. + return -1;
  52284. +
  52285. + while (inlen > 0) {
  52286. + if (md->curlen == 0 && inlen >= block_size) {
  52287. + if (sha256_compress(md, (unsigned char *) in) < 0)
  52288. + return -1;
  52289. + md->length += block_size * 8;
  52290. + in += block_size;
  52291. + inlen -= block_size;
  52292. + } else {
  52293. + n = MIN(inlen, (block_size - md->curlen));
  52294. + _rtw_memcpy(md->buf + md->curlen, in, n);
  52295. + md->curlen += n;
  52296. + in += n;
  52297. + inlen -= n;
  52298. + if (md->curlen == block_size) {
  52299. + if (sha256_compress(md, md->buf) < 0)
  52300. + return -1;
  52301. + md->length += 8 * block_size;
  52302. + md->curlen = 0;
  52303. + }
  52304. + }
  52305. + }
  52306. +
  52307. + return 0;
  52308. +}
  52309. +
  52310. +
  52311. +/**
  52312. + Terminate the hash to get the digest
  52313. + @param md The hash state
  52314. + @param out [out] The destination of the hash (32 bytes)
  52315. + @return CRYPT_OK if successful
  52316. +*/
  52317. +static int sha256_done(struct sha256_state *md, unsigned char *out)
  52318. +{
  52319. + int i;
  52320. +
  52321. + if (md->curlen >= sizeof(md->buf))
  52322. + return -1;
  52323. +
  52324. + /* increase the length of the message */
  52325. + md->length += md->curlen * 8;
  52326. +
  52327. + /* append the '1' bit */
  52328. + md->buf[md->curlen++] = (unsigned char) 0x80;
  52329. +
  52330. + /* if the length is currently above 56 bytes we append zeros
  52331. + * then compress. Then we can fall back to padding zeros and length
  52332. + * encoding like normal.
  52333. + */
  52334. + if (md->curlen > 56) {
  52335. + while (md->curlen < 64) {
  52336. + md->buf[md->curlen++] = (unsigned char) 0;
  52337. + }
  52338. + sha256_compress(md, md->buf);
  52339. + md->curlen = 0;
  52340. + }
  52341. +
  52342. + /* pad upto 56 bytes of zeroes */
  52343. + while (md->curlen < 56) {
  52344. + md->buf[md->curlen++] = (unsigned char) 0;
  52345. + }
  52346. +
  52347. + /* store length */
  52348. + WPA_PUT_BE64(md->buf + 56, md->length);
  52349. + sha256_compress(md, md->buf);
  52350. +
  52351. + /* copy output */
  52352. + for (i = 0; i < 8; i++)
  52353. + WPA_PUT_BE32(out + (4 * i), md->state[i]);
  52354. +
  52355. + return 0;
  52356. +}
  52357. +
  52358. +/**
  52359. + * sha256_vector - SHA256 hash for data vector
  52360. + * @num_elem: Number of elements in the data vector
  52361. + * @addr: Pointers to the data areas
  52362. + * @len: Lengths of the data blocks
  52363. + * @mac: Buffer for the hash
  52364. + * Returns: 0 on success, -1 of failure
  52365. + */
  52366. +static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,
  52367. + u8 *mac)
  52368. +{
  52369. + struct sha256_state ctx;
  52370. + size_t i;
  52371. +
  52372. + sha256_init(&ctx);
  52373. + for (i = 0; i < num_elem; i++)
  52374. + if (sha256_process(&ctx, addr[i], len[i]))
  52375. + return -1;
  52376. + if (sha256_done(&ctx, mac))
  52377. + return -1;
  52378. + return 0;
  52379. +}
  52380. +
  52381. +static u8 os_strlen(const char *s)
  52382. +{
  52383. + const char *p = s;
  52384. + while (*p)
  52385. + p++;
  52386. + return p - s;
  52387. +}
  52388. +
  52389. +static int os_memcmp(void *s1, void *s2, u8 n)
  52390. +{
  52391. + unsigned char *p1 = s1, *p2 = s2;
  52392. +
  52393. + if (n == 0)
  52394. + return 0;
  52395. +
  52396. + while (*p1 == *p2) {
  52397. + p1++;
  52398. + p2++;
  52399. + n--;
  52400. + if (n == 0)
  52401. + return 0;
  52402. + }
  52403. +
  52404. + return *p1 - *p2;
  52405. +}
  52406. +
  52407. +/**
  52408. + * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104)
  52409. + * @key: Key for HMAC operations
  52410. + * @key_len: Length of the key in bytes
  52411. + * @num_elem: Number of elements in the data vector
  52412. + * @addr: Pointers to the data areas
  52413. + * @len: Lengths of the data blocks
  52414. + * @mac: Buffer for the hash (32 bytes)
  52415. + */
  52416. +static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem,
  52417. + u8 *addr[], size_t *len, u8 *mac)
  52418. +{
  52419. + unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */
  52420. + unsigned char tk[32];
  52421. + u8 *_addr[6];
  52422. + size_t _len[6], i;
  52423. +
  52424. + if (num_elem > 5) {
  52425. + /*
  52426. + * Fixed limit on the number of fragments to avoid having to
  52427. + * allocate memory (which could fail).
  52428. + */
  52429. + return;
  52430. + }
  52431. +
  52432. + /* if key is longer than 64 bytes reset it to key = SHA256(key) */
  52433. + if (key_len > 64) {
  52434. + sha256_vector(1, &key, &key_len, tk);
  52435. + key = tk;
  52436. + key_len = 32;
  52437. + }
  52438. +
  52439. + /* the HMAC_SHA256 transform looks like:
  52440. + *
  52441. + * SHA256(K XOR opad, SHA256(K XOR ipad, text))
  52442. + *
  52443. + * where K is an n byte key
  52444. + * ipad is the byte 0x36 repeated 64 times
  52445. + * opad is the byte 0x5c repeated 64 times
  52446. + * and text is the data being protected */
  52447. +
  52448. + /* start out by storing key in ipad */
  52449. + _rtw_memset(k_pad, 0, sizeof(k_pad));
  52450. + _rtw_memcpy(k_pad, key, key_len);
  52451. + /* XOR key with ipad values */
  52452. + for (i = 0; i < 64; i++)
  52453. + k_pad[i] ^= 0x36;
  52454. +
  52455. + /* perform inner SHA256 */
  52456. + _addr[0] = k_pad;
  52457. + _len[0] = 64;
  52458. + for (i = 0; i < num_elem; i++) {
  52459. + _addr[i + 1] = addr[i];
  52460. + _len[i + 1] = len[i];
  52461. + }
  52462. + sha256_vector(1 + num_elem, _addr, _len, mac);
  52463. +
  52464. + _rtw_memset(k_pad, 0, sizeof(k_pad));
  52465. + _rtw_memcpy(k_pad, key, key_len);
  52466. + /* XOR key with opad values */
  52467. + for (i = 0; i < 64; i++)
  52468. + k_pad[i] ^= 0x5c;
  52469. +
  52470. + /* perform outer SHA256 */
  52471. + _addr[0] = k_pad;
  52472. + _len[0] = 64;
  52473. + _addr[1] = mac;
  52474. + _len[1] = 32;
  52475. + sha256_vector(2, _addr, _len, mac);
  52476. +}
  52477. +#endif //PLATFORM_FREEBSD
  52478. +/**
  52479. + * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2)
  52480. + * @key: Key for PRF
  52481. + * @key_len: Length of the key in bytes
  52482. + * @label: A unique label for each purpose of the PRF
  52483. + * @data: Extra data to bind into the key
  52484. + * @data_len: Length of the data
  52485. + * @buf: Buffer for the generated pseudo-random key
  52486. + * @buf_len: Number of bytes of key to generate
  52487. + *
  52488. + * This function is used to derive new, cryptographically separate keys from a
  52489. + * given key.
  52490. + */
  52491. +#ifndef PLATFORM_FREEBSD //Baron
  52492. +static void sha256_prf(u8 *key, size_t key_len, char *label,
  52493. + u8 *data, size_t data_len, u8 *buf, size_t buf_len)
  52494. +{
  52495. + u16 counter = 1;
  52496. + size_t pos, plen;
  52497. + u8 hash[SHA256_MAC_LEN];
  52498. + u8 *addr[4];
  52499. + size_t len[4];
  52500. + u8 counter_le[2], length_le[2];
  52501. +
  52502. + addr[0] = counter_le;
  52503. + len[0] = 2;
  52504. + addr[1] = (u8 *) label;
  52505. + len[1] = os_strlen(label);
  52506. + addr[2] = data;
  52507. + len[2] = data_len;
  52508. + addr[3] = length_le;
  52509. + len[3] = sizeof(length_le);
  52510. +
  52511. + WPA_PUT_LE16(length_le, buf_len * 8);
  52512. + pos = 0;
  52513. + while (pos < buf_len) {
  52514. + plen = buf_len - pos;
  52515. + WPA_PUT_LE16(counter_le, counter);
  52516. + if (plen >= SHA256_MAC_LEN) {
  52517. + hmac_sha256_vector(key, key_len, 4, addr, len,
  52518. + &buf[pos]);
  52519. + pos += SHA256_MAC_LEN;
  52520. + } else {
  52521. + hmac_sha256_vector(key, key_len, 4, addr, len, hash);
  52522. + _rtw_memcpy(&buf[pos], hash, plen);
  52523. + break;
  52524. + }
  52525. + counter++;
  52526. + }
  52527. +}
  52528. +#endif //PLATFORM_FREEBSD Baron
  52529. +
  52530. +/* AES tables*/
  52531. +const u32 Te0[256] = {
  52532. + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
  52533. + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
  52534. + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
  52535. + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
  52536. + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
  52537. + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
  52538. + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
  52539. + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
  52540. + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
  52541. + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
  52542. + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
  52543. + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
  52544. + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
  52545. + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
  52546. + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
  52547. + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
  52548. + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
  52549. + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
  52550. + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
  52551. + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
  52552. + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
  52553. + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
  52554. + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
  52555. + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
  52556. + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
  52557. + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
  52558. + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
  52559. + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
  52560. + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
  52561. + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
  52562. + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
  52563. + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
  52564. + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
  52565. + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
  52566. + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
  52567. + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
  52568. + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
  52569. + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
  52570. + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
  52571. + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
  52572. + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
  52573. + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
  52574. + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
  52575. + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
  52576. + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
  52577. + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
  52578. + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
  52579. + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
  52580. + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
  52581. + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
  52582. + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
  52583. + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
  52584. + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
  52585. + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
  52586. + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
  52587. + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
  52588. + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
  52589. + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
  52590. + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
  52591. + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
  52592. + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
  52593. + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
  52594. + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
  52595. + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
  52596. +};
  52597. +const u32 Td0[256] = {
  52598. + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
  52599. + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
  52600. + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
  52601. + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
  52602. + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
  52603. + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
  52604. + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
  52605. + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
  52606. + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
  52607. + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
  52608. + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
  52609. + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
  52610. + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
  52611. + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
  52612. + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
  52613. + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
  52614. + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
  52615. + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
  52616. + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
  52617. + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
  52618. + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
  52619. + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
  52620. + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
  52621. + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
  52622. + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
  52623. + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
  52624. + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
  52625. + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
  52626. + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
  52627. + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
  52628. + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
  52629. + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
  52630. + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
  52631. + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
  52632. + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
  52633. + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
  52634. + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
  52635. + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
  52636. + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
  52637. + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
  52638. + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
  52639. + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
  52640. + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
  52641. + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
  52642. + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
  52643. + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
  52644. + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
  52645. + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
  52646. + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
  52647. + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
  52648. + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
  52649. + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
  52650. + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
  52651. + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
  52652. + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
  52653. + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
  52654. + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
  52655. + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
  52656. + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
  52657. + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
  52658. + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
  52659. + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
  52660. + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
  52661. + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
  52662. +};
  52663. +const u8 Td4s[256] = {
  52664. + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
  52665. + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
  52666. + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
  52667. + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
  52668. + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
  52669. + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
  52670. + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
  52671. + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
  52672. + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
  52673. + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
  52674. + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
  52675. + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
  52676. + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
  52677. + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
  52678. + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
  52679. + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
  52680. + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
  52681. + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
  52682. + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
  52683. + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
  52684. + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
  52685. + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
  52686. + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
  52687. + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
  52688. + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
  52689. + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
  52690. + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
  52691. + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
  52692. + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
  52693. + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
  52694. + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
  52695. + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
  52696. +};
  52697. +const u8 rcons[] = {
  52698. + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36
  52699. + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
  52700. +};
  52701. +
  52702. +/**
  52703. + * Expand the cipher key into the encryption key schedule.
  52704. + *
  52705. + * @return the number of rounds for the given cipher key size.
  52706. + */
  52707. +#ifndef PLATFORM_FREEBSD //Baron
  52708. +static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[])
  52709. +{
  52710. + int i;
  52711. + u32 temp;
  52712. +
  52713. + rk[0] = GETU32(cipherKey );
  52714. + rk[1] = GETU32(cipherKey + 4);
  52715. + rk[2] = GETU32(cipherKey + 8);
  52716. + rk[3] = GETU32(cipherKey + 12);
  52717. + for (i = 0; i < 10; i++) {
  52718. + temp = rk[3];
  52719. + rk[4] = rk[0] ^
  52720. + TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^
  52721. + RCON(i);
  52722. + rk[5] = rk[1] ^ rk[4];
  52723. + rk[6] = rk[2] ^ rk[5];
  52724. + rk[7] = rk[3] ^ rk[6];
  52725. + rk += 4;
  52726. + }
  52727. +}
  52728. +
  52729. +static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16])
  52730. +{
  52731. + u32 s0, s1, s2, s3, t0, t1, t2, t3;
  52732. + int Nr = 10;
  52733. +#ifndef FULL_UNROLL
  52734. + int r;
  52735. +#endif /* ?FULL_UNROLL */
  52736. +
  52737. + /*
  52738. + * map byte array block to cipher state
  52739. + * and add initial round key:
  52740. + */
  52741. + s0 = GETU32(pt ) ^ rk[0];
  52742. + s1 = GETU32(pt + 4) ^ rk[1];
  52743. + s2 = GETU32(pt + 8) ^ rk[2];
  52744. + s3 = GETU32(pt + 12) ^ rk[3];
  52745. +
  52746. +#define ROUND(i,d,s) \
  52747. +d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
  52748. +d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
  52749. +d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
  52750. +d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
  52751. +
  52752. +#ifdef FULL_UNROLL
  52753. +
  52754. + ROUND(1,t,s);
  52755. + ROUND(2,s,t);
  52756. + ROUND(3,t,s);
  52757. + ROUND(4,s,t);
  52758. + ROUND(5,t,s);
  52759. + ROUND(6,s,t);
  52760. + ROUND(7,t,s);
  52761. + ROUND(8,s,t);
  52762. + ROUND(9,t,s);
  52763. +
  52764. + rk += Nr << 2;
  52765. +
  52766. +#else /* !FULL_UNROLL */
  52767. +
  52768. + /* Nr - 1 full rounds: */
  52769. + r = Nr >> 1;
  52770. + for (;;) {
  52771. + ROUND(1,t,s);
  52772. + rk += 8;
  52773. + if (--r == 0)
  52774. + break;
  52775. + ROUND(0,s,t);
  52776. + }
  52777. +
  52778. +#endif /* ?FULL_UNROLL */
  52779. +
  52780. +#undef ROUND
  52781. +
  52782. + /*
  52783. + * apply last round and
  52784. + * map cipher state to byte array block:
  52785. + */
  52786. + s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
  52787. + PUTU32(ct , s0);
  52788. + s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
  52789. + PUTU32(ct + 4, s1);
  52790. + s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
  52791. + PUTU32(ct + 8, s2);
  52792. + s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
  52793. + PUTU32(ct + 12, s3);
  52794. +}
  52795. +
  52796. +static void * aes_encrypt_init(u8 *key, size_t len)
  52797. +{
  52798. + u32 *rk;
  52799. + if (len != 16)
  52800. + return NULL;
  52801. + rk = (u32*)rtw_malloc(AES_PRIV_SIZE);
  52802. + if (rk == NULL)
  52803. + return NULL;
  52804. + rijndaelKeySetupEnc(rk, key);
  52805. + return rk;
  52806. +}
  52807. +
  52808. +static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt)
  52809. +{
  52810. + rijndaelEncrypt(ctx, plain, crypt);
  52811. +}
  52812. +
  52813. +
  52814. +static void gf_mulx(u8 *pad)
  52815. +{
  52816. + int i, carry;
  52817. +
  52818. + carry = pad[0] & 0x80;
  52819. + for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
  52820. + pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
  52821. + pad[AES_BLOCK_SIZE - 1] <<= 1;
  52822. + if (carry)
  52823. + pad[AES_BLOCK_SIZE - 1] ^= 0x87;
  52824. +}
  52825. +
  52826. +static void aes_encrypt_deinit(void *ctx)
  52827. +{
  52828. + _rtw_memset(ctx, 0, AES_PRIV_SIZE);
  52829. + rtw_mfree(ctx, AES_PRIV_SIZE);
  52830. +}
  52831. +
  52832. +
  52833. +/**
  52834. + * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128
  52835. + * @key: 128-bit key for the hash operation
  52836. + * @num_elem: Number of elements in the data vector
  52837. + * @addr: Pointers to the data areas
  52838. + * @len: Lengths of the data blocks
  52839. + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
  52840. + * Returns: 0 on success, -1 on failure
  52841. + *
  52842. + * This is a mode for using block cipher (AES in this case) for authentication.
  52843. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication
  52844. + * (SP) 800-38B.
  52845. + */
  52846. +static int omac1_aes_128_vector(u8 *key, size_t num_elem,
  52847. + u8 *addr[], size_t *len, u8 *mac)
  52848. +{
  52849. + void *ctx;
  52850. + u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
  52851. + u8 *pos, *end;
  52852. + size_t i, e, left, total_len;
  52853. +
  52854. + ctx = aes_encrypt_init(key, 16);
  52855. + if (ctx == NULL)
  52856. + return -1;
  52857. + _rtw_memset(cbc, 0, AES_BLOCK_SIZE);
  52858. +
  52859. + total_len = 0;
  52860. + for (e = 0; e < num_elem; e++)
  52861. + total_len += len[e];
  52862. + left = total_len;
  52863. +
  52864. + e = 0;
  52865. + pos = addr[0];
  52866. + end = pos + len[0];
  52867. +
  52868. + while (left >= AES_BLOCK_SIZE) {
  52869. + for (i = 0; i < AES_BLOCK_SIZE; i++) {
  52870. + cbc[i] ^= *pos++;
  52871. + if (pos >= end) {
  52872. + e++;
  52873. + pos = addr[e];
  52874. + end = pos + len[e];
  52875. + }
  52876. + }
  52877. + if (left > AES_BLOCK_SIZE)
  52878. + aes_128_encrypt(ctx, cbc, cbc);
  52879. + left -= AES_BLOCK_SIZE;
  52880. + }
  52881. +
  52882. + _rtw_memset(pad, 0, AES_BLOCK_SIZE);
  52883. + aes_128_encrypt(ctx, pad, pad);
  52884. + gf_mulx(pad);
  52885. +
  52886. + if (left || total_len == 0) {
  52887. + for (i = 0; i < left; i++) {
  52888. + cbc[i] ^= *pos++;
  52889. + if (pos >= end) {
  52890. + e++;
  52891. + pos = addr[e];
  52892. + end = pos + len[e];
  52893. + }
  52894. + }
  52895. + cbc[left] ^= 0x80;
  52896. + gf_mulx(pad);
  52897. + }
  52898. +
  52899. + for (i = 0; i < AES_BLOCK_SIZE; i++)
  52900. + pad[i] ^= cbc[i];
  52901. + aes_128_encrypt(ctx, pad, mac);
  52902. + aes_encrypt_deinit(ctx);
  52903. + return 0;
  52904. +}
  52905. +
  52906. +
  52907. +/**
  52908. + * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC)
  52909. + * @key: 128-bit key for the hash operation
  52910. + * @data: Data buffer for which a MAC is determined
  52911. + * @data_len: Length of data buffer in bytes
  52912. + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)
  52913. + * Returns: 0 on success, -1 on failure
  52914. + *
  52915. + * This is a mode for using block cipher (AES in this case) for authentication.
  52916. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication
  52917. + * (SP) 800-38B.
  52918. + */ //modify for CONFIG_IEEE80211W
  52919. +int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac)
  52920. +{
  52921. + return omac1_aes_128_vector(key, 1, &data, &data_len, mac);
  52922. +}
  52923. +#endif //PLATFORM_FREEBSD Baron
  52924. +
  52925. +#ifdef CONFIG_TDLS
  52926. +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta)
  52927. +{
  52928. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  52929. + u8 *SNonce = psta->SNonce;
  52930. + u8 *ANonce = psta->ANonce;
  52931. +
  52932. + u8 key_input[SHA256_MAC_LEN];
  52933. + u8 *nonce[2];
  52934. + size_t len[2];
  52935. + u8 data[3 * ETH_ALEN];
  52936. +
  52937. + /* IEEE Std 802.11z-2010 8.5.9.1:
  52938. + * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce))
  52939. + */
  52940. + len[0] = 32;
  52941. + len[1] = 32;
  52942. + if (os_memcmp(SNonce, ANonce, 32) < 0) {
  52943. + nonce[0] = SNonce;
  52944. + nonce[1] = ANonce;
  52945. + } else {
  52946. + nonce[0] = ANonce;
  52947. + nonce[1] = SNonce;
  52948. + }
  52949. +
  52950. + sha256_vector(2, nonce, len, key_input);
  52951. +
  52952. + /*
  52953. + * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK",
  52954. + * min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY)
  52955. + * TODO: is N_KEY really included in KDF Context and if so, in which
  52956. + * presentation format (little endian 16-bit?) is it used? It gets
  52957. + * added by the KDF anyway..
  52958. + */
  52959. +
  52960. + if (os_memcmp(myid(&(padapter->eeprompriv)), psta->hwaddr, ETH_ALEN) < 0) {
  52961. + _rtw_memcpy(data, myid(&(padapter->eeprompriv)), ETH_ALEN);
  52962. + _rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN);
  52963. + } else {
  52964. + _rtw_memcpy(data, psta->hwaddr, ETH_ALEN);
  52965. + _rtw_memcpy(data + ETH_ALEN, myid(&(padapter->eeprompriv)), ETH_ALEN);
  52966. + }
  52967. + _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN);
  52968. +
  52969. + sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk));
  52970. +
  52971. +
  52972. +}
  52973. +
  52974. +/**
  52975. + * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC
  52976. + * @kck: TPK-KCK
  52977. + * @lnkid: Pointer to the beginning of Link Identifier IE
  52978. + * @rsnie: Pointer to the beginning of RSN IE used for handshake
  52979. + * @timeoutie: Pointer to the beginning of Timeout IE used for handshake
  52980. + * @ftie: Pointer to the beginning of FT IE
  52981. + * @mic: Pointer for writing MIC
  52982. + *
  52983. + * Calculate MIC for TDLS frame.
  52984. + */
  52985. +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq,
  52986. + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,
  52987. + u8 *mic)
  52988. +{
  52989. + u8 *buf, *pos;
  52990. + struct wpa_tdls_ftie *_ftie;
  52991. + struct wpa_tdls_lnkid *_lnkid;
  52992. + int ret;
  52993. + int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] +
  52994. + 2 + timeoutie[1] + 2 + ftie[1];
  52995. + buf = rtw_zmalloc(len);
  52996. + if (!buf) {
  52997. + DBG_871X("TDLS: No memory for MIC calculation\n");
  52998. + return -1;
  52999. + }
  53000. +
  53001. + pos = buf;
  53002. + _lnkid = (struct wpa_tdls_lnkid *) lnkid;
  53003. + /* 1) TDLS initiator STA MAC address */
  53004. + _rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN);
  53005. + pos += ETH_ALEN;
  53006. + /* 2) TDLS responder STA MAC address */
  53007. + _rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN);
  53008. + pos += ETH_ALEN;
  53009. + /* 3) Transaction Sequence number */
  53010. + *pos++ = trans_seq;
  53011. + /* 4) Link Identifier IE */
  53012. + _rtw_memcpy(pos, lnkid, 2 + lnkid[1]);
  53013. + pos += 2 + lnkid[1];
  53014. + /* 5) RSN IE */
  53015. + _rtw_memcpy(pos, rsnie, 2 + rsnie[1]);
  53016. + pos += 2 + rsnie[1];
  53017. + /* 6) Timeout Interval IE */
  53018. + _rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]);
  53019. + pos += 2 + timeoutie[1];
  53020. + /* 7) FTIE, with the MIC field of the FTIE set to 0 */
  53021. + _rtw_memcpy(pos, ftie, 2 + ftie[1]);
  53022. + _ftie = (struct wpa_tdls_ftie *) pos;
  53023. + _rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN);
  53024. + pos += 2 + ftie[1];
  53025. +
  53026. + ret = omac1_aes_128(kck, buf, pos - buf, mic);
  53027. + rtw_mfree(buf, len);
  53028. + return ret;
  53029. +
  53030. +}
  53031. +
  53032. +int tdls_verify_mic(u8 *kck, u8 trans_seq,
  53033. + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie)
  53034. +{
  53035. + u8 *buf, *pos;
  53036. + int len;
  53037. + u8 mic[16];
  53038. + int ret;
  53039. + u8 *rx_ftie, *tmp_ftie;
  53040. +
  53041. + if (lnkid == NULL || rsnie == NULL ||
  53042. + timeoutie == NULL || ftie == NULL){
  53043. + return 0;
  53044. + }
  53045. +
  53046. + len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1);
  53047. +
  53048. + buf = rtw_zmalloc(len);
  53049. + if (buf == NULL)
  53050. + return 0;
  53051. +
  53052. + pos = buf;
  53053. + /* 1) TDLS initiator STA MAC address */
  53054. + _rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN);
  53055. + pos += ETH_ALEN;
  53056. + /* 2) TDLS responder STA MAC address */
  53057. + _rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN);
  53058. + pos += ETH_ALEN;
  53059. + /* 3) Transaction Sequence number */
  53060. + *pos++ = trans_seq;
  53061. + /* 4) Link Identifier IE */
  53062. + _rtw_memcpy(pos, lnkid, 2 + 18);
  53063. + pos += 2 + 18;
  53064. + /* 5) RSN IE */
  53065. + _rtw_memcpy(pos, rsnie, 2 + *(rsnie+1));
  53066. + pos += 2 + *(rsnie+1);
  53067. + /* 6) Timeout Interval IE */
  53068. + _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1));
  53069. + pos += 2 + *(timeoutie+1);
  53070. + /* 7) FTIE, with the MIC field of the FTIE set to 0 */
  53071. + _rtw_memcpy(pos, ftie, 2 + *(ftie+1));
  53072. + pos += 2;
  53073. + tmp_ftie = (u8 *) (pos+2);
  53074. + _rtw_memset(tmp_ftie, 0, 16);
  53075. + pos += *(ftie+1);
  53076. +
  53077. + ret = omac1_aes_128(kck, buf, pos - buf, mic);
  53078. + rtw_mfree(buf, len);
  53079. + if (ret)
  53080. + return 0;
  53081. + rx_ftie = ftie+4;
  53082. +
  53083. + if (os_memcmp(mic, rx_ftie, 16) == 0) {
  53084. + //Valid MIC
  53085. + return 1;
  53086. + }
  53087. +
  53088. + //Invalid MIC
  53089. + DBG_871X( "[%s] Invalid MIC\n", __FUNCTION__);
  53090. + return 0;
  53091. +
  53092. +}
  53093. +#endif //CONFIG_TDLS
  53094. +
  53095. +#ifdef PLATFORM_WINDOWS
  53096. +void rtw_use_tkipkey_handler (
  53097. + IN PVOID SystemSpecific1,
  53098. + IN PVOID FunctionContext,
  53099. + IN PVOID SystemSpecific2,
  53100. + IN PVOID SystemSpecific3
  53101. + )
  53102. +#endif
  53103. +#ifdef PLATFORM_LINUX
  53104. +void rtw_use_tkipkey_handler(void *FunctionContext)
  53105. +#endif
  53106. +#ifdef PLATFORM_FREEBSD
  53107. +void rtw_use_tkipkey_handler(void *FunctionContext)
  53108. +#endif
  53109. +{
  53110. + _adapter *padapter = (_adapter *)FunctionContext;
  53111. +
  53112. +
  53113. +_func_enter_;
  53114. +
  53115. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler ^^^\n"));
  53116. +
  53117. +/*
  53118. + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved){
  53119. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %d)(padapter->bSurpriseRemoved %d)^^^\n",padapter->bDriverStopped,padapter->bSurpriseRemoved));
  53120. +
  53121. + return;
  53122. + }
  53123. + */
  53124. +
  53125. + padapter->securitypriv.busetkipkey=_TRUE;
  53126. +
  53127. + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\n",padapter->securitypriv.busetkipkey));
  53128. +
  53129. +_func_exit_;
  53130. +
  53131. +}
  53132. +
  53133. +/* Restore HW wep key setting according to key_mask */
  53134. +void rtw_sec_restore_wep_key(_adapter *adapter)
  53135. +{
  53136. + struct security_priv* securitypriv=&(adapter->securitypriv);
  53137. + sint keyid;
  53138. +
  53139. + if((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) {
  53140. + for(keyid=0;keyid<4;keyid++){
  53141. + if(securitypriv->key_mask & BIT(keyid)){
  53142. + if(keyid == securitypriv->dot11PrivacyKeyIndex)
  53143. + rtw_set_key(adapter,securitypriv, keyid, 1);
  53144. + else
  53145. + rtw_set_key(adapter,securitypriv, keyid, 0);
  53146. + }
  53147. + }
  53148. + }
  53149. +}
  53150. +
  53151. +u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller)
  53152. +{
  53153. + struct security_priv* securitypriv=&(adapter->securitypriv);
  53154. + u8 status = _SUCCESS;
  53155. +
  53156. + if (securitypriv->btkip_countermeasure == _TRUE) {
  53157. + u32 passing_ms = rtw_get_passing_time_ms(securitypriv->btkip_countermeasure_time);
  53158. + if (passing_ms > 60*1000) {
  53159. + LOG_LEVEL(_drv_info_, "%s("ADPT_FMT") countermeasure time:%ds > 60s \n",
  53160. + caller, ADPT_ARG(adapter), passing_ms/1000);
  53161. + securitypriv->btkip_countermeasure = _FALSE;
  53162. + securitypriv->btkip_countermeasure_time = 0;
  53163. + } else {
  53164. + LOG_LEVEL(_drv_warning_, "%s("ADPT_FMT") countermeasure time:%ds < 60s \n",
  53165. + caller, ADPT_ARG(adapter), passing_ms/1000);
  53166. + status = _FAIL;
  53167. + }
  53168. + }
  53169. +
  53170. + return status;
  53171. +}
  53172. --- /dev/null
  53173. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_sreset.c
  53174. @@ -0,0 +1,351 @@
  53175. +/******************************************************************************
  53176. + *
  53177. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  53178. + *
  53179. + * This program is free software; you can redistribute it and/or modify it
  53180. + * under the terms of version 2 of the GNU General Public License as
  53181. + * published by the Free Software Foundation.
  53182. + *
  53183. + * This program is distributed in the hope that it will be useful, but WITHOUT
  53184. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  53185. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  53186. + * more details.
  53187. + *
  53188. + * You should have received a copy of the GNU General Public License along with
  53189. + * this program; if not, write to the Free Software Foundation, Inc.,
  53190. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  53191. + *
  53192. + *
  53193. + ******************************************************************************/
  53194. +
  53195. +#include<rtw_sreset.h>
  53196. +
  53197. +void sreset_init_value(_adapter *padapter)
  53198. +{
  53199. +#if defined(DBG_CONFIG_ERROR_DETECT)
  53200. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53201. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  53202. +
  53203. + _rtw_mutex_init(&psrtpriv->silentreset_mutex);
  53204. + psrtpriv->silent_reset_inprogress = _FALSE;
  53205. + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  53206. + psrtpriv->last_tx_time =0;
  53207. + psrtpriv->last_tx_complete_time =0;
  53208. +#endif
  53209. +}
  53210. +void sreset_reset_value(_adapter *padapter)
  53211. +{
  53212. +#if defined(DBG_CONFIG_ERROR_DETECT)
  53213. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53214. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  53215. +
  53216. + psrtpriv->silent_reset_inprogress = _FALSE;
  53217. + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  53218. + psrtpriv->last_tx_time =0;
  53219. + psrtpriv->last_tx_complete_time =0;
  53220. +#endif
  53221. +}
  53222. +
  53223. +u8 sreset_get_wifi_status(_adapter *padapter)
  53224. +{
  53225. +#if defined(DBG_CONFIG_ERROR_DETECT)
  53226. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53227. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  53228. +
  53229. + u8 status = WIFI_STATUS_SUCCESS;
  53230. + u32 val32 = 0;
  53231. + _irqL irqL;
  53232. + if(psrtpriv->silent_reset_inprogress == _TRUE)
  53233. + {
  53234. + return status;
  53235. + }
  53236. + val32 =rtw_read32(padapter,REG_TXDMA_STATUS);
  53237. + if(val32==0xeaeaeaea){
  53238. + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST;
  53239. + }
  53240. + else if(val32!=0){
  53241. + DBG_8192C("txdmastatu(%x)\n",val32);
  53242. + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR;
  53243. + }
  53244. +
  53245. + if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status)
  53246. + {
  53247. + DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status);
  53248. + status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL)));
  53249. + }
  53250. + DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status);
  53251. +
  53252. + //status restore
  53253. + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  53254. +
  53255. + return status;
  53256. +#else
  53257. + return WIFI_STATUS_SUCCESS;
  53258. +#endif
  53259. +}
  53260. +
  53261. +void sreset_set_wifi_error_status(_adapter *padapter, u32 status)
  53262. +{
  53263. +#if defined(DBG_CONFIG_ERROR_DETECT)
  53264. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53265. + pHalData->srestpriv.Wifi_Error_Status = status;
  53266. +#endif
  53267. +}
  53268. +
  53269. +void sreset_set_trigger_point(_adapter *padapter, s32 tgp)
  53270. +{
  53271. +#if defined(DBG_CONFIG_ERROR_DETECT)
  53272. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53273. + pHalData->srestpriv.dbg_trigger_point = tgp;
  53274. +#endif
  53275. +}
  53276. +
  53277. +bool sreset_inprogress(_adapter *padapter)
  53278. +{
  53279. +#if defined(DBG_CONFIG_ERROR_RESET)
  53280. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53281. + return pHalData->srestpriv.silent_reset_inprogress;
  53282. +#else
  53283. + return _FALSE;
  53284. +#endif
  53285. +}
  53286. +
  53287. +void sreset_restore_security_station(_adapter *padapter)
  53288. +{
  53289. + u8 EntryId = 0;
  53290. + struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  53291. + struct sta_priv * pstapriv = &padapter->stapriv;
  53292. + struct sta_info *psta;
  53293. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  53294. + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
  53295. +
  53296. + {
  53297. + u8 val8;
  53298. +
  53299. + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) {
  53300. + val8 = 0xcc;
  53301. + #ifdef CONFIG_WAPI_SUPPORT
  53302. + } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) {
  53303. + //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey.
  53304. + val8 = 0x4c;
  53305. + #endif
  53306. + } else {
  53307. + val8 = 0xcf;
  53308. + }
  53309. + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));
  53310. + }
  53311. +
  53312. + #if 0
  53313. + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) ||
  53314. + ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ ))
  53315. + {
  53316. +
  53317. + for(EntryId=0; EntryId<4; EntryId++)
  53318. + {
  53319. + if(EntryId == psecuritypriv->dot11PrivacyKeyIndex)
  53320. + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1);
  53321. + else
  53322. + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0);
  53323. + }
  53324. +
  53325. + }
  53326. + else
  53327. + #endif
  53328. + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
  53329. + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))
  53330. + {
  53331. + psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv));
  53332. + if (psta == NULL) {
  53333. + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n"));
  53334. + }
  53335. + else
  53336. + {
  53337. + //pairwise key
  53338. + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE);
  53339. + //group key
  53340. + rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0);
  53341. + }
  53342. + }
  53343. +}
  53344. +
  53345. +void sreset_restore_network_station(_adapter *padapter)
  53346. +{
  53347. + struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  53348. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  53349. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  53350. +
  53351. + #if 0
  53352. + {
  53353. + //=======================================================
  53354. + // reset related register of Beacon control
  53355. +
  53356. + //set MSR to nolink
  53357. + Set_MSR(padapter, _HW_STATE_NOLINK_);
  53358. + // reject all data frame
  53359. + rtw_write16(padapter, REG_RXFLTMAP2,0x00);
  53360. + //reset TSF
  53361. + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));
  53362. +
  53363. + // disable update TSF
  53364. + SetBcnCtrlReg(padapter, BIT(4), 0);
  53365. +
  53366. + //=======================================================
  53367. + }
  53368. + #endif
  53369. +
  53370. + rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure);
  53371. +
  53372. + {
  53373. + u8 threshold;
  53374. + #ifdef CONFIG_USB_HCI
  53375. + // TH=1 => means that invalidate usb rx aggregation
  53376. + // TH=0 => means that validate usb rx aggregation, use init value.
  53377. + if(mlmepriv->htpriv.ht_option) {
  53378. + if(padapter->registrypriv.wifi_spec==1)
  53379. + threshold = 1;
  53380. + else
  53381. + threshold = 0;
  53382. + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  53383. + } else {
  53384. + threshold = 1;
  53385. + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
  53386. + }
  53387. + #endif
  53388. + }
  53389. +
  53390. + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  53391. +
  53392. + //disable dynamic functions, such as high power, DIG
  53393. + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  53394. +
  53395. + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
  53396. +
  53397. + {
  53398. + u8 join_type = 0;
  53399. + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
  53400. + }
  53401. +
  53402. + Set_MSR(padapter, (pmlmeinfo->state & 0x3));
  53403. +
  53404. + mlmeext_joinbss_event_callback(padapter, 1);
  53405. + //restore Sequence No.
  53406. + rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn);
  53407. +
  53408. + sreset_restore_security_station(padapter);
  53409. +}
  53410. +
  53411. +void sreset_restore_network_status(_adapter *padapter)
  53412. +{
  53413. + struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  53414. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  53415. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  53416. +
  53417. + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {
  53418. + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  53419. + sreset_restore_network_station(padapter);
  53420. + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) {
  53421. + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  53422. + rtw_ap_restore_network(padapter);
  53423. + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) {
  53424. + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  53425. + } else {
  53426. + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
  53427. + }
  53428. +}
  53429. +
  53430. +void sreset_stop_adapter(_adapter *padapter)
  53431. +{
  53432. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  53433. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  53434. +
  53435. + if (padapter == NULL)
  53436. + return;
  53437. +
  53438. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  53439. +
  53440. + if (!rtw_netif_queue_stopped(padapter->pnetdev))
  53441. + rtw_netif_stop_queue(padapter->pnetdev);
  53442. +
  53443. + rtw_cancel_all_timer(padapter);
  53444. +
  53445. + /* TODO: OS and HCI independent */
  53446. + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
  53447. + tasklet_kill(&pxmitpriv->xmit_tasklet);
  53448. + #endif
  53449. +
  53450. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
  53451. + rtw_scan_abort(padapter);
  53452. +
  53453. + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
  53454. + _rtw_join_timeout_handler(padapter);
  53455. +
  53456. +}
  53457. +
  53458. +void sreset_start_adapter(_adapter *padapter)
  53459. +{
  53460. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  53461. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  53462. +
  53463. + if (padapter == NULL)
  53464. + return;
  53465. +
  53466. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  53467. +
  53468. + if (check_fwstate(pmlmepriv, _FW_LINKED)) {
  53469. + sreset_restore_network_status(padapter);
  53470. + }
  53471. +
  53472. + /* TODO: OS and HCI independent */
  53473. + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)
  53474. + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
  53475. + #endif
  53476. +
  53477. + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
  53478. +
  53479. + if (rtw_netif_queue_stopped(padapter->pnetdev))
  53480. + rtw_netif_wake_queue(padapter->pnetdev);
  53481. +
  53482. +}
  53483. +
  53484. +void sreset_reset(_adapter *padapter)
  53485. +{
  53486. +#ifdef DBG_CONFIG_ERROR_RESET
  53487. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  53488. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  53489. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  53490. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  53491. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  53492. + _irqL irqL;
  53493. + u32 start = rtw_get_current_time();
  53494. +
  53495. + DBG_871X("%s\n", __FUNCTION__);
  53496. +
  53497. + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
  53498. +
  53499. + _enter_pwrlock(&pwrpriv->lock);
  53500. +
  53501. + psrtpriv->silent_reset_inprogress = _TRUE;
  53502. + pwrpriv->change_rfpwrstate = rf_off;
  53503. +
  53504. + sreset_stop_adapter(padapter);
  53505. + #ifdef CONFIG_CONCURRENT_MODE
  53506. + sreset_stop_adapter(padapter->pbuddy_adapter);
  53507. + #endif
  53508. +
  53509. + #ifdef CONFIG_IPS
  53510. + _ips_enter(padapter);
  53511. + _ips_leave(padapter);
  53512. + #endif
  53513. +
  53514. + sreset_start_adapter(padapter);
  53515. + #ifdef CONFIG_CONCURRENT_MODE
  53516. + sreset_start_adapter(padapter->pbuddy_adapter);
  53517. + #endif
  53518. +
  53519. + psrtpriv->silent_reset_inprogress = _FALSE;
  53520. +
  53521. + _exit_pwrlock(&pwrpriv->lock);
  53522. +
  53523. + DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start));
  53524. +#endif
  53525. +}
  53526. --- /dev/null
  53527. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c
  53528. @@ -0,0 +1,847 @@
  53529. +/******************************************************************************
  53530. + *
  53531. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  53532. + *
  53533. + * This program is free software; you can redistribute it and/or modify it
  53534. + * under the terms of version 2 of the GNU General Public License as
  53535. + * published by the Free Software Foundation.
  53536. + *
  53537. + * This program is distributed in the hope that it will be useful, but WITHOUT
  53538. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  53539. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  53540. + * more details.
  53541. + *
  53542. + * You should have received a copy of the GNU General Public License along with
  53543. + * this program; if not, write to the Free Software Foundation, Inc.,
  53544. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  53545. + *
  53546. + *
  53547. + ******************************************************************************/
  53548. +#define _RTW_STA_MGT_C_
  53549. +
  53550. +#include <drv_conf.h>
  53551. +#include <osdep_service.h>
  53552. +#include <drv_types.h>
  53553. +#include <recv_osdep.h>
  53554. +#include <xmit_osdep.h>
  53555. +#include <mlme_osdep.h>
  53556. +
  53557. +
  53558. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  53559. +
  53560. +#error "Shall be Linux or Windows, but not both!\n"
  53561. +
  53562. +#endif
  53563. +
  53564. +#include <sta_info.h>
  53565. +
  53566. +void _rtw_init_stainfo(struct sta_info *psta);
  53567. +void _rtw_init_stainfo(struct sta_info *psta)
  53568. +{
  53569. +
  53570. +_func_enter_;
  53571. +
  53572. + _rtw_memset((u8 *)psta, 0, sizeof (struct sta_info));
  53573. +
  53574. + _rtw_spinlock_init(&psta->lock);
  53575. + _rtw_init_listhead(&psta->list);
  53576. + _rtw_init_listhead(&psta->hash_list);
  53577. + //_rtw_init_listhead(&psta->asoc_list);
  53578. + //_rtw_init_listhead(&psta->sleep_list);
  53579. + //_rtw_init_listhead(&psta->wakeup_list);
  53580. +
  53581. + _rtw_init_queue(&psta->sleep_q);
  53582. + psta->sleepq_len = 0;
  53583. +
  53584. + _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);
  53585. + _rtw_init_sta_recv_priv(&psta->sta_recvpriv);
  53586. +
  53587. +#ifdef CONFIG_AP_MODE
  53588. +
  53589. + _rtw_init_listhead(&psta->asoc_list);
  53590. +
  53591. + _rtw_init_listhead(&psta->auth_list);
  53592. +
  53593. + psta->expire_to = 0;
  53594. +
  53595. + psta->flags = 0;
  53596. +
  53597. + psta->capability = 0;
  53598. +
  53599. + psta->bpairwise_key_installed = _FALSE;
  53600. +
  53601. +
  53602. +#ifdef CONFIG_NATIVEAP_MLME
  53603. + psta->nonerp_set = 0;
  53604. + psta->no_short_slot_time_set = 0;
  53605. + psta->no_short_preamble_set = 0;
  53606. + psta->no_ht_gf_set = 0;
  53607. + psta->no_ht_set = 0;
  53608. + psta->ht_20mhz_set = 0;
  53609. +#endif
  53610. +
  53611. +#ifdef CONFIG_TX_MCAST2UNI
  53612. + psta->under_exist_checking = 0;
  53613. +#endif // CONFIG_TX_MCAST2UNI
  53614. +
  53615. + psta->keep_alive_trycnt = 0;
  53616. +
  53617. +#endif // CONFIG_AP_MODE
  53618. +
  53619. +_func_exit_;
  53620. +
  53621. +}
  53622. +
  53623. +u32 _rtw_init_sta_priv(struct sta_priv *pstapriv)
  53624. +{
  53625. + struct sta_info *psta;
  53626. + s32 i;
  53627. +
  53628. +_func_enter_;
  53629. +
  53630. + pstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4);
  53631. +
  53632. + if(!pstapriv->pallocated_stainfo_buf)
  53633. + return _FAIL;
  53634. +
  53635. + pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 -
  53636. + ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3);
  53637. +
  53638. + _rtw_init_queue(&pstapriv->free_sta_queue);
  53639. +
  53640. + _rtw_spinlock_init(&pstapriv->sta_hash_lock);
  53641. +
  53642. + //_rtw_init_queue(&pstapriv->asoc_q);
  53643. + pstapriv->asoc_sta_count = 0;
  53644. + _rtw_init_queue(&pstapriv->sleep_q);
  53645. + _rtw_init_queue(&pstapriv->wakeup_q);
  53646. +
  53647. + psta = (struct sta_info *)(pstapriv->pstainfo_buf);
  53648. +
  53649. +
  53650. + for(i = 0; i < NUM_STA; i++)
  53651. + {
  53652. + _rtw_init_stainfo(psta);
  53653. +
  53654. + _rtw_init_listhead(&(pstapriv->sta_hash[i]));
  53655. +
  53656. + rtw_list_insert_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue));
  53657. +
  53658. + psta++;
  53659. + }
  53660. +
  53661. +
  53662. +
  53663. +#ifdef CONFIG_AP_MODE
  53664. +
  53665. + pstapriv->sta_dz_bitmap = 0;
  53666. + pstapriv->tim_bitmap = 0;
  53667. +
  53668. + _rtw_init_listhead(&pstapriv->asoc_list);
  53669. + _rtw_init_listhead(&pstapriv->auth_list);
  53670. + _rtw_spinlock_init(&pstapriv->asoc_list_lock);
  53671. + _rtw_spinlock_init(&pstapriv->auth_list_lock);
  53672. + pstapriv->asoc_list_cnt = 0;
  53673. + pstapriv->auth_list_cnt = 0;
  53674. +
  53675. + pstapriv->auth_to = 3; // 3*2 = 6 sec
  53676. + pstapriv->assoc_to = 3;
  53677. + //pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic.
  53678. + //pstapriv->expire_to = 30;// 30*2 = 60 sec = 1 min, expire after no any traffic.
  53679. +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  53680. + pstapriv->expire_to = 3; // 3*2 = 6 sec
  53681. +#else
  53682. + pstapriv->expire_to = 60;// 60*2 = 120 sec = 2 min, expire after no any traffic.
  53683. +#endif
  53684. + pstapriv->max_num_sta = NUM_STA;
  53685. +
  53686. +#endif
  53687. +
  53688. +_func_exit_;
  53689. +
  53690. + return _SUCCESS;
  53691. +
  53692. +}
  53693. +
  53694. +inline int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta)
  53695. +{
  53696. + int offset = (((u8 *)sta) - stapriv->pstainfo_buf)/sizeof(struct sta_info);
  53697. +
  53698. + if (!stainfo_offset_valid(offset))
  53699. + DBG_871X("%s invalid offset(%d), out of range!!!", __func__, offset);
  53700. +
  53701. + return offset;
  53702. +}
  53703. +
  53704. +inline struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset)
  53705. +{
  53706. + if (!stainfo_offset_valid(offset))
  53707. + DBG_871X("%s invalid offset(%d), out of range!!!", __func__, offset);
  53708. +
  53709. + return (struct sta_info *)(stapriv->pstainfo_buf + offset * sizeof(struct sta_info));
  53710. +}
  53711. +
  53712. +void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv);
  53713. +void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv)
  53714. +{
  53715. +_func_enter_;
  53716. +
  53717. + _rtw_spinlock_free(&psta_xmitpriv->lock);
  53718. +
  53719. + _rtw_spinlock_free(&(psta_xmitpriv->be_q.sta_pending.lock));
  53720. + _rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock));
  53721. + _rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock));
  53722. + _rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock));
  53723. +_func_exit_;
  53724. +}
  53725. +
  53726. +static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv)
  53727. +{
  53728. +_func_enter_;
  53729. +
  53730. + _rtw_spinlock_free(&psta_recvpriv->lock);
  53731. +
  53732. + _rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock));
  53733. +
  53734. +_func_exit_;
  53735. +
  53736. +}
  53737. +
  53738. +void rtw_mfree_stainfo(struct sta_info *psta);
  53739. +void rtw_mfree_stainfo(struct sta_info *psta)
  53740. +{
  53741. +_func_enter_;
  53742. +
  53743. + if(&psta->lock != NULL)
  53744. + _rtw_spinlock_free(&psta->lock);
  53745. +
  53746. + _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv);
  53747. + _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv);
  53748. +
  53749. +_func_exit_;
  53750. +}
  53751. +
  53752. +
  53753. +// this function is used to free the memory of lock || sema for all stainfos
  53754. +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv );
  53755. +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv )
  53756. +{
  53757. + _irqL irqL;
  53758. + _list *plist, *phead;
  53759. + struct sta_info *psta = NULL;
  53760. +
  53761. +_func_enter_;
  53762. +
  53763. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  53764. +
  53765. + phead = get_list_head(&pstapriv->free_sta_queue);
  53766. + plist = get_next(phead);
  53767. +
  53768. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  53769. + {
  53770. + psta = LIST_CONTAINOR(plist, struct sta_info ,list);
  53771. + plist = get_next(plist);
  53772. +
  53773. + rtw_mfree_stainfo(psta);
  53774. + }
  53775. +
  53776. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  53777. +
  53778. +_func_exit_;
  53779. +
  53780. +}
  53781. +
  53782. +void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv);
  53783. +void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv)
  53784. +{
  53785. +#ifdef CONFIG_AP_MODE
  53786. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  53787. +#endif
  53788. +
  53789. + rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock
  53790. +
  53791. + _rtw_spinlock_free(&pstapriv->free_sta_queue.lock);
  53792. +
  53793. + _rtw_spinlock_free(&pstapriv->sta_hash_lock);
  53794. + _rtw_spinlock_free(&pstapriv->wakeup_q.lock);
  53795. + _rtw_spinlock_free(&pstapriv->sleep_q.lock);
  53796. +
  53797. +#ifdef CONFIG_AP_MODE
  53798. + _rtw_spinlock_free(&pstapriv->asoc_list_lock);
  53799. + _rtw_spinlock_free(&pstapriv->auth_list_lock);
  53800. + _rtw_spinlock_free(&pacl_list->acl_node_q.lock);
  53801. +#endif
  53802. +
  53803. +}
  53804. +
  53805. +u32 _rtw_free_sta_priv(struct sta_priv *pstapriv)
  53806. +{
  53807. + _irqL irqL;
  53808. + _list *phead, *plist;
  53809. + struct sta_info *psta = NULL;
  53810. + struct recv_reorder_ctrl *preorder_ctrl;
  53811. + int index;
  53812. +
  53813. +_func_enter_;
  53814. + if(pstapriv){
  53815. +
  53816. + /* delete all reordering_ctrl_timer */
  53817. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  53818. + for(index = 0; index < NUM_STA; index++)
  53819. + {
  53820. + phead = &(pstapriv->sta_hash[index]);
  53821. + plist = get_next(phead);
  53822. +
  53823. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  53824. + {
  53825. + int i;
  53826. + psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);
  53827. + plist = get_next(plist);
  53828. +
  53829. + for(i=0; i < 16 ; i++)
  53830. + {
  53831. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  53832. + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
  53833. + }
  53834. + }
  53835. + }
  53836. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  53837. + /*===============================*/
  53838. +
  53839. + rtw_mfree_sta_priv_lock(pstapriv);
  53840. +
  53841. + if(pstapriv->pallocated_stainfo_buf) {
  53842. + rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4);
  53843. + }
  53844. + }
  53845. +
  53846. +_func_exit_;
  53847. + return _SUCCESS;
  53848. +}
  53849. +
  53850. +
  53851. +//struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr)
  53852. +struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
  53853. +{
  53854. + _irqL irqL, irqL2;
  53855. + uint tmp_aid;
  53856. + s32 index;
  53857. + _list *phash_list;
  53858. + struct sta_info *psta;
  53859. + _queue *pfree_sta_queue;
  53860. + struct recv_reorder_ctrl *preorder_ctrl;
  53861. + int i = 0;
  53862. + u16 wRxSeqInitialValue = 0xffff;
  53863. +
  53864. +_func_enter_;
  53865. +
  53866. + pfree_sta_queue = &pstapriv->free_sta_queue;
  53867. +
  53868. + //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL);
  53869. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  53870. +
  53871. + if (_rtw_queue_empty(pfree_sta_queue) == _TRUE)
  53872. + {
  53873. + //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL);
  53874. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  53875. + psta = NULL;
  53876. + }
  53877. + else
  53878. + {
  53879. + psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list);
  53880. +
  53881. + rtw_list_delete(&(psta->list));
  53882. +
  53883. + //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL);
  53884. +
  53885. + tmp_aid = psta->aid;
  53886. +
  53887. + _rtw_init_stainfo(psta);
  53888. +
  53889. + _rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN);
  53890. +
  53891. + index = wifi_mac_hash(hwaddr);
  53892. +
  53893. + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("rtw_alloc_stainfo: index = %x", index));
  53894. +
  53895. + if(index >= NUM_STA){
  53896. + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("ERROR=> rtw_alloc_stainfo: index >= NUM_STA"));
  53897. + psta= NULL;
  53898. + goto exit;
  53899. + }
  53900. + phash_list = &(pstapriv->sta_hash[index]);
  53901. +
  53902. + //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  53903. +
  53904. + rtw_list_insert_tail(&psta->hash_list, phash_list);
  53905. +
  53906. + pstapriv->asoc_sta_count ++ ;
  53907. +
  53908. + //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  53909. +
  53910. +// Commented by Albert 2009/08/13
  53911. +// For the SMC router, the sequence number of first packet of WPS handshake will be 0.
  53912. +// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable.
  53913. +// So, we initialize the tid_rxseq variable as the 0xffff.
  53914. +
  53915. + for( i = 0; i < 16; i++ )
  53916. + {
  53917. + _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 );
  53918. + }
  53919. +
  53920. + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("alloc number_%d stainfo with hwaddr = %x %x %x %x %x %x \n",
  53921. + pstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5]));
  53922. +
  53923. + init_addba_retry_timer(pstapriv->padapter, psta);
  53924. +
  53925. +#ifdef CONFIG_TDLS
  53926. + psta->padapter = pstapriv->padapter;
  53927. + init_TPK_timer(pstapriv->padapter, psta);
  53928. + init_ch_switch_timer(pstapriv->padapter, psta);
  53929. + init_base_ch_timer(pstapriv->padapter, psta);
  53930. + init_off_ch_timer(pstapriv->padapter, psta);
  53931. + init_handshake_timer(pstapriv->padapter, psta);
  53932. + init_tdls_alive_timer(pstapriv->padapter, psta);
  53933. +#endif //CONFIG_TDLS
  53934. +
  53935. + //for A-MPDU Rx reordering buffer control
  53936. + for(i=0; i < 16 ; i++)
  53937. + {
  53938. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  53939. +
  53940. + preorder_ctrl->padapter = pstapriv->padapter;
  53941. +
  53942. + preorder_ctrl->enable = _FALSE;
  53943. +
  53944. + preorder_ctrl->indicate_seq = 0xffff;
  53945. + #ifdef DBG_RX_SEQ
  53946. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__,
  53947. + preorder_ctrl->indicate_seq);
  53948. + #endif
  53949. + preorder_ctrl->wend_b= 0xffff;
  53950. + //preorder_ctrl->wsize_b = (NR_RECVBUFF-2);
  53951. + preorder_ctrl->wsize_b = 64;//64;
  53952. +
  53953. + _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue);
  53954. +
  53955. + rtw_init_recv_timer(preorder_ctrl);
  53956. + }
  53957. +
  53958. +
  53959. + //init for DM
  53960. + psta->rssi_stat.UndecoratedSmoothedPWDB = 0;
  53961. + psta->rssi_stat.UndecoratedSmoothedCCK = (-1);
  53962. +
  53963. + /* init for the sequence number of received management frame */
  53964. + psta->RxMgmtFrameSeqNum = 0xffff;
  53965. + }
  53966. +
  53967. +exit:
  53968. +
  53969. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
  53970. +
  53971. +_func_exit_;
  53972. +
  53973. + return psta;
  53974. +
  53975. +
  53976. +}
  53977. +
  53978. +
  53979. +// using pstapriv->sta_hash_lock to protect
  53980. +u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
  53981. +{
  53982. + int i;
  53983. + _irqL irqL0;
  53984. + _queue *pfree_sta_queue;
  53985. + struct recv_reorder_ctrl *preorder_ctrl;
  53986. + struct sta_xmit_priv *pstaxmitpriv;
  53987. + struct xmit_priv *pxmitpriv= &padapter->xmitpriv;
  53988. + struct sta_priv *pstapriv = &padapter->stapriv;
  53989. + struct hw_xmit *phwxmit;
  53990. +
  53991. +
  53992. +_func_enter_;
  53993. +
  53994. + if (psta == NULL)
  53995. + goto exit;
  53996. +
  53997. +
  53998. + _enter_critical_bh(&psta->lock, &irqL0);
  53999. + psta->state &= ~_FW_LINKED;
  54000. + _exit_critical_bh(&psta->lock, &irqL0);
  54001. +
  54002. + pfree_sta_queue = &pstapriv->free_sta_queue;
  54003. +
  54004. +
  54005. + pstaxmitpriv = &psta->sta_xmitpriv;
  54006. +
  54007. + //rtw_list_delete(&psta->sleep_list);
  54008. +
  54009. + //rtw_list_delete(&psta->wakeup_list);
  54010. +
  54011. + _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  54012. +
  54013. + rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q);
  54014. + psta->sleepq_len = 0;
  54015. +
  54016. + //vo
  54017. + //_enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0);
  54018. + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending);
  54019. + rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
  54020. + phwxmit = pxmitpriv->hwxmits;
  54021. + phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt;
  54022. + pstaxmitpriv->vo_q.qcnt = 0;
  54023. + //_exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0);
  54024. +
  54025. + //vi
  54026. + //_enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0);
  54027. + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending);
  54028. + rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
  54029. + phwxmit = pxmitpriv->hwxmits+1;
  54030. + phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt;
  54031. + pstaxmitpriv->vi_q.qcnt = 0;
  54032. + //_exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0);
  54033. +
  54034. + //be
  54035. + //_enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0);
  54036. + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending);
  54037. + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
  54038. + phwxmit = pxmitpriv->hwxmits+2;
  54039. + phwxmit->accnt -= pstaxmitpriv->be_q.qcnt;
  54040. + pstaxmitpriv->be_q.qcnt = 0;
  54041. + //_exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0);
  54042. +
  54043. + //bk
  54044. + //_enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0);
  54045. + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending);
  54046. + rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
  54047. + phwxmit = pxmitpriv->hwxmits+3;
  54048. + phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt;
  54049. + pstaxmitpriv->bk_q.qcnt = 0;
  54050. + //_exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0);
  54051. +
  54052. + _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  54053. +
  54054. + rtw_list_delete(&psta->hash_list);
  54055. + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));
  54056. + pstapriv->asoc_sta_count --;
  54057. +
  54058. +
  54059. + // re-init sta_info; 20061114 // will be init in alloc_stainfo
  54060. + //_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);
  54061. + //_rtw_init_sta_recv_priv(&psta->sta_recvpriv);
  54062. +
  54063. + _cancel_timer_ex(&psta->addba_retry_timer);
  54064. +
  54065. +#ifdef CONFIG_TDLS
  54066. + _cancel_timer_ex(&psta->TPK_timer);
  54067. + _cancel_timer_ex(&psta->option_timer);
  54068. + _cancel_timer_ex(&psta->base_ch_timer);
  54069. + _cancel_timer_ex(&psta->off_ch_timer);
  54070. + _cancel_timer_ex(&psta->alive_timer1);
  54071. + _cancel_timer_ex(&psta->alive_timer2);
  54072. +#endif //CONFIG_TDLS
  54073. +
  54074. + //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer
  54075. + for(i=0; i < 16 ; i++)
  54076. + {
  54077. + _irqL irqL;
  54078. + _list *phead, *plist;
  54079. + union recv_frame *prframe;
  54080. + _queue *ppending_recvframe_queue;
  54081. + _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  54082. +
  54083. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  54084. +
  54085. + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
  54086. +
  54087. +
  54088. + ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  54089. +
  54090. + _enter_critical_bh(&ppending_recvframe_queue->lock, &irqL);
  54091. +
  54092. + phead = get_list_head(ppending_recvframe_queue);
  54093. + plist = get_next(phead);
  54094. +
  54095. + while(!rtw_is_list_empty(phead))
  54096. + {
  54097. + prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  54098. +
  54099. + plist = get_next(plist);
  54100. +
  54101. + rtw_list_delete(&(prframe->u.hdr.list));
  54102. +
  54103. + rtw_free_recvframe(prframe, pfree_recv_queue);
  54104. + }
  54105. +
  54106. + _exit_critical_bh(&ppending_recvframe_queue->lock, &irqL);
  54107. +
  54108. + }
  54109. +
  54110. +
  54111. +#ifdef CONFIG_AP_MODE
  54112. +
  54113. +/*
  54114. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL0);
  54115. + rtw_list_delete(&psta->asoc_list);
  54116. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL0);
  54117. +*/
  54118. + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL0);
  54119. + if (!rtw_is_list_empty(&psta->auth_list)) {
  54120. + rtw_list_delete(&psta->auth_list);
  54121. + pstapriv->auth_list_cnt--;
  54122. + }
  54123. + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL0);
  54124. +
  54125. + psta->expire_to = 0;
  54126. +
  54127. + psta->sleepq_ac_len = 0;
  54128. + psta->qos_info = 0;
  54129. +
  54130. + psta->max_sp_len = 0;
  54131. + psta->uapsd_bk = 0;
  54132. + psta->uapsd_be = 0;
  54133. + psta->uapsd_vi = 0;
  54134. + psta->uapsd_vo = 0;
  54135. +
  54136. + psta->has_legacy_ac = 0;
  54137. +
  54138. +#ifdef CONFIG_NATIVEAP_MLME
  54139. +
  54140. + pstapriv->sta_dz_bitmap &=~BIT(psta->aid);
  54141. + pstapriv->tim_bitmap &=~BIT(psta->aid);
  54142. +
  54143. + //rtw_indicate_sta_disassoc_event(padapter, psta);
  54144. +
  54145. + if ((psta->aid >0)&&(pstapriv->sta_aid[psta->aid - 1] == psta))
  54146. + {
  54147. + pstapriv->sta_aid[psta->aid - 1] = NULL;
  54148. + psta->aid = 0;
  54149. + }
  54150. +
  54151. +#endif // CONFIG_NATIVEAP_MLME
  54152. +
  54153. +#ifdef CONFIG_TX_MCAST2UNI
  54154. + psta->under_exist_checking = 0;
  54155. +#endif // CONFIG_TX_MCAST2UNI
  54156. +
  54157. +#endif // CONFIG_AP_MODE
  54158. +
  54159. + _rtw_spinlock_free(&psta->lock);
  54160. +
  54161. + //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL0);
  54162. + rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue));
  54163. + //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL0);
  54164. +
  54165. +exit:
  54166. +
  54167. +_func_exit_;
  54168. +
  54169. + return _SUCCESS;
  54170. +
  54171. +}
  54172. +
  54173. +// free all stainfo which in sta_hash[all]
  54174. +void rtw_free_all_stainfo(_adapter *padapter)
  54175. +{
  54176. + _irqL irqL;
  54177. + _list *plist, *phead;
  54178. + s32 index;
  54179. + struct sta_info *psta = NULL;
  54180. + struct sta_priv *pstapriv = &padapter->stapriv;
  54181. + struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter);
  54182. +
  54183. +_func_enter_;
  54184. +
  54185. + if(pstapriv->asoc_sta_count==1)
  54186. + goto exit;
  54187. +
  54188. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  54189. +
  54190. + for(index=0; index< NUM_STA; index++)
  54191. + {
  54192. + phead = &(pstapriv->sta_hash[index]);
  54193. + plist = get_next(phead);
  54194. +
  54195. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  54196. + {
  54197. + psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);
  54198. +
  54199. + plist = get_next(plist);
  54200. +
  54201. + if(pbcmc_stainfo!=psta)
  54202. + rtw_free_stainfo(padapter , psta);
  54203. +
  54204. + }
  54205. + }
  54206. +
  54207. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  54208. +
  54209. +exit:
  54210. +
  54211. +_func_exit_;
  54212. +
  54213. +}
  54214. +
  54215. +/* any station allocated can be searched by hash list */
  54216. +struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)
  54217. +{
  54218. +
  54219. + _irqL irqL;
  54220. +
  54221. + _list *plist, *phead;
  54222. +
  54223. + struct sta_info *psta = NULL;
  54224. +
  54225. + u32 index;
  54226. +
  54227. + u8 *addr;
  54228. +
  54229. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  54230. +
  54231. +_func_enter_;
  54232. +
  54233. + if(hwaddr==NULL)
  54234. + return NULL;
  54235. +
  54236. + if(IS_MCAST(hwaddr))
  54237. + {
  54238. + addr = bc_addr;
  54239. + }
  54240. + else
  54241. + {
  54242. + addr = hwaddr;
  54243. + }
  54244. +
  54245. + index = wifi_mac_hash(addr);
  54246. +
  54247. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  54248. +
  54249. + phead = &(pstapriv->sta_hash[index]);
  54250. + plist = get_next(phead);
  54251. +
  54252. +
  54253. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  54254. + {
  54255. +
  54256. + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  54257. +
  54258. + if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE)
  54259. + { // if found the matched address
  54260. + break;
  54261. + }
  54262. + psta=NULL;
  54263. + plist = get_next(plist);
  54264. + }
  54265. +
  54266. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  54267. +_func_exit_;
  54268. + return psta;
  54269. +
  54270. +}
  54271. +
  54272. +u32 rtw_init_bcmc_stainfo(_adapter* padapter)
  54273. +{
  54274. +
  54275. + struct sta_info *psta;
  54276. + struct tx_servq *ptxservq;
  54277. + u32 res=_SUCCESS;
  54278. + NDIS_802_11_MAC_ADDRESS bcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff};
  54279. +
  54280. + struct sta_priv *pstapriv = &padapter->stapriv;
  54281. + //_queue *pstapending = &padapter->xmitpriv.bm_pending;
  54282. +
  54283. +_func_enter_;
  54284. +
  54285. + psta = rtw_alloc_stainfo(pstapriv, bcast_addr);
  54286. +
  54287. + if(psta==NULL){
  54288. + res=_FAIL;
  54289. + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("rtw_alloc_stainfo fail"));
  54290. + goto exit;
  54291. + }
  54292. +
  54293. + // default broadcast & multicast use macid 1
  54294. + psta->mac_id = 1;
  54295. +
  54296. + ptxservq= &(psta->sta_xmitpriv.be_q);
  54297. +
  54298. +/*
  54299. + _enter_critical(&pstapending->lock, &irqL0);
  54300. +
  54301. + if (rtw_is_list_empty(&ptxservq->tx_pending))
  54302. + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending));
  54303. +
  54304. + _exit_critical(&pstapending->lock, &irqL0);
  54305. +*/
  54306. +
  54307. +exit:
  54308. +_func_exit_;
  54309. + return _SUCCESS;
  54310. +
  54311. +}
  54312. +
  54313. +
  54314. +struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter)
  54315. +{
  54316. + struct sta_info *psta;
  54317. + struct sta_priv *pstapriv = &padapter->stapriv;
  54318. + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
  54319. +_func_enter_;
  54320. + psta = rtw_get_stainfo(pstapriv, bc_addr);
  54321. +_func_exit_;
  54322. + return psta;
  54323. +
  54324. +}
  54325. +
  54326. +u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr)
  54327. +{
  54328. + u8 res = _TRUE;
  54329. +#ifdef CONFIG_AP_MODE
  54330. + _irqL irqL;
  54331. + _list *plist, *phead;
  54332. + struct rtw_wlan_acl_node *paclnode;
  54333. + u8 match = _FALSE;
  54334. + struct sta_priv *pstapriv = &padapter->stapriv;
  54335. + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list;
  54336. + _queue *pacl_node_q =&pacl_list->acl_node_q;
  54337. +
  54338. + _enter_critical_bh(&(pacl_node_q->lock), &irqL);
  54339. + phead = get_list_head(pacl_node_q);
  54340. + plist = get_next(phead);
  54341. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  54342. + {
  54343. + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);
  54344. + plist = get_next(plist);
  54345. +
  54346. + if(_rtw_memcmp(paclnode->addr, mac_addr, ETH_ALEN))
  54347. + {
  54348. + if(paclnode->valid == _TRUE)
  54349. + {
  54350. + match = _TRUE;
  54351. + break;
  54352. + }
  54353. + }
  54354. + }
  54355. + _exit_critical_bh(&(pacl_node_q->lock), &irqL);
  54356. +
  54357. +
  54358. + if(pacl_list->mode == 1)//accept unless in deny list
  54359. + {
  54360. + res = (match == _TRUE) ? _FALSE:_TRUE;
  54361. + }
  54362. + else if(pacl_list->mode == 2)//deny unless in accept list
  54363. + {
  54364. + res = (match == _TRUE) ? _TRUE:_FALSE;
  54365. + }
  54366. + else
  54367. + {
  54368. + res = _TRUE;
  54369. + }
  54370. +
  54371. +#endif
  54372. +
  54373. + return res;
  54374. +
  54375. +}
  54376. --- /dev/null
  54377. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_tdls.c
  54378. @@ -0,0 +1,2940 @@
  54379. +/******************************************************************************
  54380. + *
  54381. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  54382. + *
  54383. + * This program is free software; you can redistribute it and/or modify it
  54384. + * under the terms of version 2 of the GNU General Public License as
  54385. + * published by the Free Software Foundation.
  54386. + *
  54387. + * This program is distributed in the hope that it will be useful, but WITHOUT
  54388. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  54389. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  54390. + * more details.
  54391. + *
  54392. + * You should have received a copy of the GNU General Public License along with
  54393. + * this program; if not, write to the Free Software Foundation, Inc.,
  54394. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  54395. + *
  54396. + *
  54397. + ******************************************************************************/
  54398. +#define _RTW_TDLS_C_
  54399. +
  54400. +#include <drv_types.h>
  54401. +#include <ethernet.h>
  54402. +#include <rtw_tdls.h>
  54403. +#include <wifi.h>
  54404. +
  54405. +#ifdef CONFIG_TDLS
  54406. +extern unsigned char MCS_rate_2R[16];
  54407. +extern unsigned char MCS_rate_1R[16];
  54408. +extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);
  54409. +extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe);
  54410. +
  54411. +void rtw_reset_tdls_info(_adapter* padapter)
  54412. +{
  54413. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  54414. +
  54415. + ptdlsinfo->ap_prohibited = _FALSE;
  54416. + ptdlsinfo->setup_state = TDLS_STATE_NONE;
  54417. + ptdlsinfo->sta_cnt = 0;
  54418. + ptdlsinfo->sta_maximum = _FALSE;
  54419. + ptdlsinfo->macid_index= 6;
  54420. + ptdlsinfo->clear_cam= 0;
  54421. + ptdlsinfo->ch_sensing = 0;
  54422. + ptdlsinfo->cur_channel = 0;
  54423. + ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1
  54424. + ptdlsinfo->watchdog_count = 0;
  54425. + ptdlsinfo->dev_discovered = 0;
  54426. +
  54427. +#ifdef CONFIG_WFD
  54428. + ptdlsinfo->wfd_info = &padapter->wfd_info;
  54429. +#endif //CONFIG_WFD
  54430. +}
  54431. +
  54432. +int rtw_init_tdls_info(_adapter* padapter)
  54433. +{
  54434. + int res = _SUCCESS;
  54435. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  54436. +
  54437. + ptdlsinfo->enable = 1;
  54438. + rtw_reset_tdls_info(padapter);
  54439. +
  54440. + _rtw_spinlock_init(&ptdlsinfo->cmd_lock);
  54441. + _rtw_spinlock_init(&ptdlsinfo->hdl_lock);
  54442. +
  54443. + return res;
  54444. +
  54445. +}
  54446. +
  54447. +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo)
  54448. +{
  54449. + _rtw_spinlock_free(&ptdlsinfo->cmd_lock);
  54450. + _rtw_spinlock_free(&ptdlsinfo->hdl_lock);
  54451. +
  54452. + _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) );
  54453. +
  54454. +}
  54455. +
  54456. +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode)
  54457. +{
  54458. + struct xmit_frame *pmgntframe;
  54459. + struct pkt_attrib *pattrib;
  54460. + unsigned char *pframe;
  54461. + struct rtw_ieee80211_hdr *pwlanhdr;
  54462. + unsigned short *fctrl;
  54463. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  54464. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  54465. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  54466. +
  54467. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  54468. + {
  54469. + return;
  54470. + }
  54471. +
  54472. + //update attribute
  54473. + pattrib = &pmgntframe->attrib;
  54474. + update_mgntframe_attrib(padapter, pattrib);
  54475. +
  54476. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  54477. +
  54478. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  54479. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  54480. +
  54481. + fctrl = &(pwlanhdr->frame_ctl);
  54482. + *(fctrl) = 0;
  54483. +// SetToDs(fctrl);
  54484. + if (power_mode)
  54485. + {
  54486. + SetPwrMgt(fctrl);
  54487. + }
  54488. +
  54489. + _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN);
  54490. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  54491. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  54492. +
  54493. + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  54494. + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  54495. + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
  54496. + SetSeqNum(pwlanhdr, pattrib->seqnum);
  54497. +
  54498. + SetFrameSubType(pframe, WIFI_DATA_NULL);
  54499. +
  54500. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  54501. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  54502. +
  54503. + pattrib->last_txcmdsz = pattrib->pktlen;
  54504. + dump_mgntframe(padapter, pmgntframe);
  54505. +
  54506. + return;
  54507. +}
  54508. +
  54509. +s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
  54510. +{
  54511. +
  54512. + struct sta_info *psta = NULL;
  54513. + struct sta_priv *pstapriv = &padapter->stapriv;
  54514. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  54515. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  54516. + struct qos_priv *pqospriv= &pmlmepriv->qospriv;
  54517. +
  54518. + s32 res=_SUCCESS;
  54519. + sint bmcast;
  54520. +
  54521. + bmcast = IS_MCAST(pattrib->ra);
  54522. +
  54523. + psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  54524. + if (psta == NULL) {
  54525. + res =_FAIL;
  54526. + goto exit;
  54527. + }
  54528. +
  54529. + pattrib->mac_id = psta->mac_id;
  54530. +
  54531. + pattrib->psta = psta;
  54532. +
  54533. + pattrib->ack_policy = 0;
  54534. + // get ether_hdr_len
  54535. + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag
  54536. +
  54537. + if (pqospriv->qos_option && psta->qos_option) {
  54538. + pattrib->priority = 1; //tdls management frame should be AC_BK
  54539. + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
  54540. + pattrib->subtype = WIFI_QOS_DATA_TYPE;
  54541. + } else {
  54542. + pattrib->hdrlen = WLAN_HDR_A3_LEN;
  54543. + pattrib->subtype = WIFI_DATA_TYPE;
  54544. + pattrib->priority = 0;
  54545. + }
  54546. +
  54547. + if (psta->ieee8021x_blocked == _TRUE)
  54548. + {
  54549. + pattrib->encrypt = 0;
  54550. + }
  54551. + else
  54552. + {
  54553. + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
  54554. +
  54555. + switch(psecuritypriv->dot11AuthAlgrthm)
  54556. + {
  54557. + case dot11AuthAlgrthm_Open:
  54558. + case dot11AuthAlgrthm_Shared:
  54559. + case dot11AuthAlgrthm_Auto:
  54560. + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
  54561. + break;
  54562. + case dot11AuthAlgrthm_8021X:
  54563. + pattrib->key_idx = 0;
  54564. + break;
  54565. + default:
  54566. + pattrib->key_idx = 0;
  54567. + break;
  54568. + }
  54569. + }
  54570. +
  54571. + switch (pattrib->encrypt)
  54572. + {
  54573. + case _WEP40_:
  54574. + case _WEP104_:
  54575. + pattrib->iv_len = 4;
  54576. + pattrib->icv_len = 4;
  54577. + break;
  54578. + case _TKIP_:
  54579. + pattrib->iv_len = 8;
  54580. + pattrib->icv_len = 4;
  54581. + if(padapter->securitypriv.busetkipkey==_FAIL)
  54582. + {
  54583. + res =_FAIL;
  54584. + goto exit;
  54585. + }
  54586. + break;
  54587. + case _AES_:
  54588. + pattrib->iv_len = 8;
  54589. + pattrib->icv_len = 8;
  54590. + break;
  54591. + default:
  54592. + pattrib->iv_len = 0;
  54593. + pattrib->icv_len = 0;
  54594. + break;
  54595. + }
  54596. +
  54597. + if (pattrib->encrypt &&
  54598. + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))
  54599. + {
  54600. + pattrib->bswenc = _TRUE;
  54601. + } else {
  54602. + pattrib->bswenc = _FALSE;
  54603. + }
  54604. +
  54605. + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
  54606. + pattrib->qos_en = psta->qos_option;
  54607. + pattrib->ht_en = psta->htpriv.ht_option;
  54608. + pattrib->raid = psta->raid;
  54609. + pattrib->bwmode = psta->htpriv.bwmode;
  54610. + pattrib->ch_offset = psta->htpriv.ch_offset;
  54611. + pattrib->sgi= psta->htpriv.sgi;
  54612. + pattrib->ampdu_en = _FALSE;
  54613. +
  54614. + //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
  54615. + //{
  54616. + // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
  54617. + // pattrib->ampdu_en = _TRUE;
  54618. + //}
  54619. +
  54620. +exit:
  54621. +
  54622. + return res;
  54623. +}
  54624. +
  54625. +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)
  54626. +{
  54627. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  54628. + struct sta_priv *pstapriv = &padapter->stapriv;
  54629. + _irqL irqL;
  54630. +
  54631. + //free peer sta_info
  54632. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  54633. + if(ptdlsinfo->sta_cnt != 0)
  54634. + ptdlsinfo->sta_cnt--;
  54635. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  54636. + if( ptdlsinfo->sta_cnt < (NUM_STA - 2) ) // -2: AP + BC/MC sta
  54637. + {
  54638. + ptdlsinfo->sta_maximum = _FALSE;
  54639. + _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) );
  54640. + }
  54641. + //ready to clear cam
  54642. + if(ptdls_sta->mac_id!=0){
  54643. + ptdlsinfo->clear_cam=ptdls_sta->mac_id;
  54644. + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE);
  54645. + }
  54646. +
  54647. + if(ptdlsinfo->sta_cnt==0){
  54648. + rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);
  54649. + ptdlsinfo->setup_state=TDLS_STATE_NONE;
  54650. + }
  54651. + else
  54652. + DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt);
  54653. +
  54654. + rtw_free_stainfo(padapter, ptdls_sta);
  54655. +
  54656. +}
  54657. +
  54658. +// cam entry will be the same as mac_id
  54659. +void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta)
  54660. +{
  54661. + if(ptdls_sta->mac_id==0)
  54662. + {
  54663. + ptdls_sta->mac_id = ptdlsinfo->macid_index;
  54664. + if( (++ptdlsinfo->macid_index) > (NUM_STA -2) )
  54665. + ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY;
  54666. + }
  54667. +}
  54668. +
  54669. +//TDLS encryption(if needed) will always be CCMP
  54670. +void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta)
  54671. +{
  54672. + if(prx_pkt_attrib->encrypt)
  54673. + {
  54674. + ptdls_sta->dot118021XPrivacy=_AES_;
  54675. + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE);
  54676. + }
  54677. +}
  54678. +
  54679. +void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)
  54680. +{
  54681. + /* save HT capabilities in the sta object */
  54682. + _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));
  54683. + if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) )
  54684. + {
  54685. + ptdls_sta->flags |= WLAN_STA_HT;
  54686. +
  54687. + ptdls_sta->flags |= WLAN_STA_WME;
  54688. +
  54689. + _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap));
  54690. +
  54691. + } else
  54692. + ptdls_sta->flags &= ~WLAN_STA_HT;
  54693. +
  54694. + if(ptdls_sta->flags & WLAN_STA_HT)
  54695. + {
  54696. + if(adapter->registrypriv.ht_enable == _TRUE)
  54697. + {
  54698. + ptdls_sta->htpriv.ht_option = _TRUE;
  54699. + }
  54700. + else
  54701. + {
  54702. + ptdls_sta->htpriv.ht_option = _FALSE;
  54703. + ptdls_sta->stat_code = _STATS_FAILURE_;
  54704. + }
  54705. + }
  54706. +
  54707. + //HT related cap
  54708. + if(ptdls_sta->htpriv.ht_option)
  54709. + {
  54710. + //check if sta supports rx ampdu
  54711. + if(adapter->registrypriv.ampdu_enable==1)
  54712. + ptdls_sta->htpriv.ampdu_enable = _TRUE;
  54713. +
  54714. + //check if sta support s Short GI
  54715. + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40))
  54716. + {
  54717. + ptdls_sta->htpriv.sgi = _TRUE;
  54718. + }
  54719. +
  54720. + // bwmode would still followed AP's setting
  54721. + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))
  54722. + {
  54723. + ptdls_sta->htpriv.bwmode = adapter->mlmeextpriv.cur_bwmode;
  54724. + ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset;
  54725. + }
  54726. + }
  54727. +}
  54728. +
  54729. +u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  54730. +{
  54731. + struct rtw_ieee80211_ht_cap ht_capie;
  54732. + u8 rf_type;
  54733. +
  54734. + //HT capabilities
  54735. + _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));
  54736. +
  54737. + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS |
  54738. + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40;
  54739. +
  54740. + {
  54741. + u32 rx_packet_offset, max_recvbuf_sz;
  54742. + rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);
  54743. + rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);
  54744. + if(max_recvbuf_sz-rx_packet_offset>(8191-256))
  54745. + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;
  54746. + }
  54747. +
  54748. + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);
  54749. +
  54750. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  54751. + switch(rf_type)
  54752. + {
  54753. + case RF_1T1R:
  54754. + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream
  54755. + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16);
  54756. + break;
  54757. +
  54758. + case RF_2T2R:
  54759. + case RF_1T2R:
  54760. + default:
  54761. + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream
  54762. + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
  54763. + break;
  54764. + }
  54765. +
  54766. + return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_,
  54767. + sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)));
  54768. +}
  54769. +
  54770. +u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib)
  54771. +{
  54772. + u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel
  54773. + do{
  54774. + if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 )
  54775. + {
  54776. + sup_ch[0] = 1; //First channel number
  54777. + sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel
  54778. + }
  54779. + else
  54780. + {
  54781. + sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;
  54782. + sup_ch[idx_5g++] = 1;
  54783. + }
  54784. +
  54785. + sup_ch_idx++;
  54786. + }
  54787. + while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 );
  54788. + return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen)));
  54789. +}
  54790. +
  54791. +#ifdef CONFIG_WFD
  54792. +void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length)
  54793. +{
  54794. + u8 wfd_ie[ 128 ] = { 0x00 };
  54795. + u32 wfd_ielen = 0;
  54796. + u32 wfd_offset = 0;
  54797. + // Try to get the TCP port information when receiving the negotiation response.
  54798. + //
  54799. +
  54800. + wfd_offset = 0;
  54801. + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen );
  54802. + while( wfd_offset )
  54803. + {
  54804. + u8 attr_content[ 10 ] = { 0x00 };
  54805. + u32 attr_contentlen = 0;
  54806. + int i;
  54807. +
  54808. + DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ );
  54809. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
  54810. + if ( attr_contentlen )
  54811. + {
  54812. + ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
  54813. + DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport );
  54814. + }
  54815. +
  54816. + _rtw_memset( attr_content, 0x00, 10);
  54817. + attr_contentlen = 0;
  54818. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen);
  54819. + if ( attr_contentlen )
  54820. + {
  54821. + _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4);
  54822. + DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__,
  54823. + ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1],
  54824. + ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3]
  54825. + );
  54826. + }
  54827. + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen );
  54828. + }
  54829. +}
  54830. +
  54831. +void issue_tunneled_probe_req(_adapter *padapter)
  54832. +{
  54833. + struct xmit_frame *pmgntframe;
  54834. + struct pkt_attrib *pattrib;
  54835. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  54836. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  54837. + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  54838. +
  54839. + DBG_871X("[%s]\n", __FUNCTION__);
  54840. +
  54841. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  54842. + {
  54843. + return;
  54844. + }
  54845. +
  54846. + //update attribute
  54847. + pattrib = &pmgntframe->attrib;
  54848. +
  54849. + pmgntframe->frame_tag = DATA_FRAMETAG;
  54850. + pattrib->ether_type = 0x890d;
  54851. + pattrib->pctrl =0;
  54852. +
  54853. + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);
  54854. +
  54855. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  54856. +
  54857. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  54858. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  54859. +
  54860. + update_tdls_attrib(padapter, pattrib);
  54861. + pattrib->qsel=pattrib->priority;
  54862. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) {
  54863. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  54864. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  54865. + goto exit;
  54866. + }
  54867. + rtw_dump_xframe(padapter, pmgntframe);
  54868. +
  54869. +exit:
  54870. +
  54871. + return;
  54872. +}
  54873. +
  54874. +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)
  54875. +{
  54876. + struct xmit_frame *pmgntframe;
  54877. + struct pkt_attrib *pattrib;
  54878. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  54879. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  54880. + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;
  54881. +
  54882. + DBG_871X("[%s]\n", __FUNCTION__);
  54883. +
  54884. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  54885. + {
  54886. + return;
  54887. + }
  54888. +
  54889. + //update attribute
  54890. + pattrib = &pmgntframe->attrib;
  54891. +
  54892. + pmgntframe->frame_tag = DATA_FRAMETAG;
  54893. + pattrib->ether_type = 0x890d;
  54894. + pattrib->pctrl =0;
  54895. +
  54896. + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);
  54897. +
  54898. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  54899. +
  54900. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  54901. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  54902. +
  54903. + update_tdls_attrib(padapter, pattrib);
  54904. + pattrib->qsel=pattrib->priority;
  54905. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) {
  54906. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  54907. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  54908. + goto exit;
  54909. + }
  54910. + rtw_dump_xframe(padapter, pmgntframe);
  54911. +
  54912. +exit:
  54913. +
  54914. + return;
  54915. +}
  54916. +#endif //CONFIG_WFD
  54917. +
  54918. +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr)
  54919. +{
  54920. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  54921. + struct xmit_frame *pmgntframe;
  54922. + struct pkt_attrib *pattrib;
  54923. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  54924. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  54925. + struct sta_priv *pstapriv = &padapter->stapriv;
  54926. + struct sta_info *ptdls_sta= NULL;
  54927. + _irqL irqL;
  54928. + static u8 dialogtoken = 0;
  54929. + u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times.
  54930. +
  54931. + if(ptdlsinfo->ap_prohibited == _TRUE)
  54932. + goto exit;
  54933. +
  54934. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  54935. + {
  54936. + return;
  54937. + }
  54938. +
  54939. + //update attribute
  54940. + pattrib = &pmgntframe->attrib;
  54941. +
  54942. + pmgntframe->frame_tag = DATA_FRAMETAG;
  54943. + pattrib->ether_type = 0x890d;
  54944. + pattrib->pctrl =0;
  54945. +
  54946. + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);
  54947. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  54948. +
  54949. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  54950. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  54951. +
  54952. + update_tdls_attrib(padapter, pattrib);
  54953. +
  54954. + //init peer sta_info
  54955. + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr);
  54956. + if(ptdls_sta==NULL)
  54957. + {
  54958. + ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr);
  54959. + if(ptdls_sta)
  54960. + {
  54961. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  54962. + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))
  54963. + ptdlsinfo->sta_cnt++;
  54964. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  54965. + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta
  54966. + {
  54967. + ptdlsinfo->sta_maximum = _TRUE;
  54968. + }
  54969. + }
  54970. + else
  54971. + {
  54972. + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);
  54973. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  54974. + goto exit;
  54975. + }
  54976. + }
  54977. +
  54978. + if(ptdls_sta){
  54979. + ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE;
  54980. + //for tdls; ptdls_sta->aid is used to fill dialogtoken
  54981. + ptdls_sta->dialog = dialogtoken;
  54982. + dialogtoken = (dialogtoken+1)%256;
  54983. + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;
  54984. + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME );
  54985. + }
  54986. +
  54987. + pattrib->qsel=pattrib->priority;
  54988. + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){
  54989. + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);
  54990. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  54991. + goto exit;
  54992. + }
  54993. + rtw_dump_xframe(padapter, pmgntframe);
  54994. +
  54995. +exit:
  54996. +
  54997. + return;
  54998. +}
  54999. +
  55000. +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr)
  55001. +{
  55002. + struct xmit_frame *pmgntframe;
  55003. + struct pkt_attrib *pattrib;
  55004. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  55005. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55006. + struct sta_priv *pstapriv = &padapter->stapriv;
  55007. + struct sta_info *ptdls_sta=NULL;
  55008. + _irqL irqL;
  55009. +
  55010. + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr);
  55011. + if(ptdls_sta==NULL){
  55012. + DBG_871X("issue tdls teardown unsuccessful\n");
  55013. + return;
  55014. + }else{
  55015. + ptdls_sta->tdls_sta_state=TDLS_STATE_NONE;
  55016. + }
  55017. +
  55018. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55019. + {
  55020. + return;
  55021. + }
  55022. +
  55023. + //update attribute
  55024. + pattrib = &pmgntframe->attrib;
  55025. +
  55026. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55027. + pattrib->ether_type = 0x890d;
  55028. + pattrib->pctrl =0;
  55029. +
  55030. + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);
  55031. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55032. +
  55033. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  55034. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55035. +
  55036. + update_tdls_attrib(padapter, pattrib);
  55037. + pattrib->qsel=pattrib->priority;
  55038. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) {
  55039. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  55040. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55041. + goto exit;
  55042. + }
  55043. + rtw_dump_xframe(padapter, pmgntframe);
  55044. +
  55045. + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){
  55046. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);
  55047. + }
  55048. +
  55049. + if( ptdls_sta->timer_flag == 1 )
  55050. + {
  55051. + _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);
  55052. + ptdls_sta->timer_flag = 2;
  55053. + _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);
  55054. + }
  55055. + else
  55056. + rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA );
  55057. +
  55058. +
  55059. +exit:
  55060. +
  55061. + return;
  55062. +}
  55063. +
  55064. +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr)
  55065. +{
  55066. + struct xmit_frame *pmgntframe;
  55067. + struct pkt_attrib *pattrib;
  55068. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  55069. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55070. + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  55071. +
  55072. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55073. + {
  55074. + return;
  55075. + }
  55076. +
  55077. + //update attribute
  55078. + pattrib = &pmgntframe->attrib;
  55079. +
  55080. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55081. + pattrib->ether_type = 0x890d;
  55082. + pattrib->pctrl =0;
  55083. +
  55084. + if(mac_addr == NULL)
  55085. + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);
  55086. + else
  55087. + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);
  55088. +
  55089. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55090. +
  55091. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  55092. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55093. +
  55094. + update_tdls_attrib(padapter, pattrib);
  55095. + pattrib->qsel=pattrib->priority;
  55096. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) {
  55097. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  55098. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55099. + goto exit;
  55100. + }
  55101. + rtw_dump_xframe(padapter, pmgntframe);
  55102. + DBG_871X("issue tdls dis req\n");
  55103. +
  55104. +exit:
  55105. +
  55106. + return;
  55107. +}
  55108. +
  55109. +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame)
  55110. +{
  55111. + struct xmit_frame *pmgntframe;
  55112. + struct pkt_attrib *pattrib;
  55113. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55114. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  55115. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  55116. + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;
  55117. + _irqL irqL;
  55118. +
  55119. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55120. + {
  55121. + return;
  55122. + }
  55123. +
  55124. + //update attribute
  55125. + pattrib = &pmgntframe->attrib;
  55126. +
  55127. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55128. + pattrib->ether_type = 0x890d;
  55129. + pattrib->pctrl =0;
  55130. +
  55131. + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);
  55132. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55133. +
  55134. + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN);
  55135. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55136. +
  55137. + update_tdls_attrib(padapter, pattrib);
  55138. + pattrib->qsel=pattrib->priority;
  55139. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) {
  55140. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  55141. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55142. + goto exit;
  55143. + }
  55144. + rtw_dump_xframe(padapter, pmgntframe);
  55145. +
  55146. +exit:
  55147. +
  55148. + return;
  55149. +
  55150. +}
  55151. +
  55152. +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame)
  55153. +{
  55154. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  55155. + struct xmit_frame *pmgntframe;
  55156. + struct pkt_attrib *pattrib;
  55157. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55158. + struct sta_info *ptdls_sta=NULL;
  55159. + _irqL irqL;
  55160. +
  55161. + struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib;
  55162. +
  55163. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55164. + {
  55165. + return;
  55166. + }
  55167. +
  55168. + //update attribute
  55169. + pattrib = &pmgntframe->attrib;
  55170. +
  55171. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55172. + pattrib->ether_type = 0x890d;
  55173. + pattrib->pctrl =0;
  55174. +
  55175. + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);
  55176. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55177. +
  55178. + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN);
  55179. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55180. +
  55181. + update_tdls_attrib(padapter, pattrib);
  55182. + pattrib->qsel=pattrib->priority;
  55183. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) {
  55184. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  55185. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55186. + goto exit;
  55187. + }
  55188. +
  55189. + rtw_dump_xframe(padapter, pmgntframe);
  55190. +
  55191. +exit:
  55192. +
  55193. + return;
  55194. +
  55195. +}
  55196. +
  55197. +//TDLS Discovery Response frame is a management action frame
  55198. +void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog)
  55199. +{
  55200. + struct xmit_frame *pmgntframe;
  55201. + struct pkt_attrib *pattrib;
  55202. + unsigned char *pframe;
  55203. + struct rtw_ieee80211_hdr *pwlanhdr;
  55204. + unsigned short *fctrl;
  55205. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55206. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  55207. +
  55208. + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;
  55209. +
  55210. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55211. + {
  55212. + return;
  55213. + }
  55214. +
  55215. + //update attribute
  55216. + pattrib = &pmgntframe->attrib;
  55217. + update_mgntframe_attrib(padapter, pattrib);
  55218. +
  55219. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  55220. +
  55221. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  55222. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  55223. +
  55224. + fctrl = &(pwlanhdr->frame_ctl);
  55225. + *(fctrl) = 0;
  55226. +
  55227. + // unicast probe request frame
  55228. + _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN);
  55229. + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN);
  55230. +
  55231. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55232. + _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN);
  55233. +
  55234. + _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN);
  55235. + _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN);
  55236. +
  55237. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  55238. + pmlmeext->mgnt_seq++;
  55239. + SetFrameSubType(pframe, WIFI_ACTION);
  55240. +
  55241. + pframe += sizeof (struct rtw_ieee80211_hdr_3addr);
  55242. + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
  55243. +
  55244. + rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog);
  55245. +
  55246. + pattrib->nr_frags = 1;
  55247. + pattrib->last_txcmdsz = pattrib->pktlen;
  55248. +
  55249. + dump_mgntframe(padapter, pmgntframe);
  55250. +
  55251. + return;
  55252. +}
  55253. +
  55254. +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta)
  55255. +{
  55256. + struct xmit_frame *pmgntframe;
  55257. + struct pkt_attrib *pattrib;
  55258. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  55259. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55260. +
  55261. + static u8 dialogtoken=0;
  55262. +
  55263. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55264. + {
  55265. + return;
  55266. + }
  55267. +
  55268. + //update attribute
  55269. + pattrib = &pmgntframe->attrib;
  55270. +
  55271. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55272. + pattrib->ether_type = 0x890d;
  55273. + pattrib->pctrl =0;
  55274. +
  55275. + _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);
  55276. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55277. +
  55278. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  55279. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55280. +
  55281. + //for tdls; pattrib->nr_frags is used to fill dialogtoken
  55282. + ptdls_sta->dialog = dialogtoken;
  55283. + dialogtoken = (dialogtoken+1)%256;
  55284. + //PTI frame's priority should be AC_VO
  55285. + pattrib->priority = 7;
  55286. +
  55287. + update_tdls_attrib(padapter, pattrib);
  55288. + pattrib->qsel=pattrib->priority;
  55289. + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) {
  55290. + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  55291. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55292. + goto exit;
  55293. + }
  55294. + rtw_dump_xframe(padapter, pmgntframe);
  55295. +
  55296. +exit:
  55297. +
  55298. + return;
  55299. +}
  55300. +
  55301. +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr)
  55302. +{
  55303. + struct xmit_frame *pmgntframe;
  55304. + struct pkt_attrib *pattrib;
  55305. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  55306. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55307. +
  55308. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55309. + {
  55310. + return;
  55311. + }
  55312. +
  55313. + //update attribute
  55314. + pattrib = &pmgntframe->attrib;
  55315. +
  55316. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55317. + pattrib->ether_type = 0x890d;
  55318. + pattrib->pctrl =0;
  55319. +
  55320. + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);
  55321. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55322. +
  55323. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  55324. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55325. +
  55326. + update_tdls_attrib(padapter, pattrib);
  55327. +
  55328. + pattrib->qsel=pattrib->priority;
  55329. + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){
  55330. + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);
  55331. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55332. + goto exit;
  55333. + }
  55334. + rtw_dump_xframe(padapter, pmgntframe);
  55335. +
  55336. +exit:
  55337. +
  55338. + return;
  55339. +}
  55340. +
  55341. +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr)
  55342. +{
  55343. + struct xmit_frame *pmgntframe;
  55344. + struct pkt_attrib *pattrib;
  55345. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  55346. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  55347. +
  55348. + _irqL irqL;
  55349. +
  55350. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  55351. + {
  55352. + return;
  55353. + }
  55354. +
  55355. + //update attribute
  55356. + pattrib = &pmgntframe->attrib;
  55357. +
  55358. + pmgntframe->frame_tag = DATA_FRAMETAG;
  55359. + pattrib->ether_type = 0x890d;
  55360. + pattrib->pctrl =0;
  55361. +
  55362. + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);
  55363. + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);
  55364. +
  55365. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  55366. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  55367. +
  55368. + update_tdls_attrib(padapter, pattrib);
  55369. +
  55370. + pattrib->qsel=pattrib->priority;
  55371. +/*
  55372. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  55373. + if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){
  55374. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  55375. + return _FALSE;
  55376. + }
  55377. +*/
  55378. + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){
  55379. + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);
  55380. + rtw_free_xmitframe(pxmitpriv, pmgntframe);
  55381. + goto exit;
  55382. + }
  55383. + rtw_dump_xframe(padapter, pmgntframe);
  55384. +
  55385. +exit:
  55386. +
  55387. + return;
  55388. +}
  55389. +
  55390. +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame)
  55391. +{
  55392. + struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv)));
  55393. + struct recv_priv *precvpriv = &(adapter->recvpriv);
  55394. + u8 *ptr = precv_frame->u.hdr.rx_data, *psa;
  55395. + struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib);
  55396. + struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo);
  55397. + u8 empty_addr[ETH_ALEN] = { 0x00 };
  55398. + int UndecoratedSmoothedPWDB;
  55399. +
  55400. +
  55401. + //WFDTDLS: for sigma test, not to setup direct link automatically
  55402. + ptdlsinfo->dev_discovered = 1;
  55403. +
  55404. +#ifdef CONFIG_TDLS_AUTOSETUP
  55405. + psa = get_sa(ptr);
  55406. + ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa);
  55407. +
  55408. + if(ptdls_sta != NULL)
  55409. + {
  55410. + ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE;
  55411. +
  55412. + //Record the tdls sta with lowest signal strength
  55413. + if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) )
  55414. + {
  55415. + if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) )
  55416. + {
  55417. + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);
  55418. + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll;
  55419. + }
  55420. + else
  55421. + {
  55422. + if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll )
  55423. + {
  55424. + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);
  55425. + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll;
  55426. + }
  55427. + }
  55428. + }
  55429. +
  55430. + }
  55431. + else
  55432. + {
  55433. + if( ptdlsinfo->sta_maximum == _TRUE)
  55434. + {
  55435. + if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) )
  55436. + {
  55437. + //All traffics are busy, do not set up another direct link.
  55438. + return _FAIL;
  55439. + }
  55440. + else
  55441. + {
  55442. + if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll )
  55443. + {
  55444. + issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr);
  55445. + }
  55446. + else
  55447. + {
  55448. + return _FAIL;
  55449. + }
  55450. + }
  55451. + }
  55452. +
  55453. + rtw_hal_get_def_var(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);
  55454. +
  55455. + if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB);
  55456. + {
  55457. + DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB);
  55458. + issue_tdls_setup_req(adapter, psa);
  55459. + }
  55460. + }
  55461. +#endif //CONFIG_TDLS_AUTOSETUP
  55462. +
  55463. + return _SUCCESS;
  55464. +}
  55465. +
  55466. +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
  55467. +{
  55468. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  55469. + u8 *psa, *pmyid;
  55470. + struct sta_info *ptdls_sta= NULL;
  55471. + struct sta_priv *pstapriv = &adapter->stapriv;
  55472. + u8 *ptr = precv_frame->u.hdr.rx_data;
  55473. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  55474. + struct security_priv *psecuritypriv = &adapter->securitypriv;
  55475. + _irqL irqL;
  55476. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  55477. + u8 *prsnie, *ppairwise_cipher;
  55478. + u8 i, k, pairwise_count;
  55479. + u8 ccmp_have=0, rsnie_have=0;
  55480. + u16 j;
  55481. + u8 SNonce[32];
  55482. + u32 *timeout_interval;
  55483. + sint parsing_length; //frame body length, without icv_len
  55484. + PNDIS_802_11_VARIABLE_IEs pIE;
  55485. + u8 FIXED_IE = 5;
  55486. + unsigned char supportRate[16];
  55487. + int supportRateNum = 0;
  55488. +
  55489. + psa = get_sa(ptr);
  55490. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  55491. +
  55492. + pmyid=myid(&(adapter->eeprompriv));
  55493. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;
  55494. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  55495. + -prx_pkt_attrib->hdrlen
  55496. + -prx_pkt_attrib->iv_len
  55497. + -prx_pkt_attrib->icv_len
  55498. + -LLC_HEADER_SIZE
  55499. + -ETH_TYPE_LEN
  55500. + -PAYLOAD_TYPE_LEN
  55501. + -FIXED_IE;
  55502. +
  55503. + if(ptdlsinfo->ap_prohibited == _TRUE)
  55504. + {
  55505. + goto exit;
  55506. + }
  55507. +
  55508. + if(ptdls_sta==NULL){
  55509. + ptdls_sta = rtw_alloc_stainfo(pstapriv, psa);
  55510. + }else{
  55511. + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){
  55512. + //If the direct link is already set up
  55513. + //Process as re-setup after tear down
  55514. + DBG_871X("re-setup a direct link\n");
  55515. + }
  55516. + //already receiving TDLS setup request
  55517. + else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){
  55518. + DBG_871X("receive duplicated TDLS setup request frame in handshaking\n");
  55519. + goto exit;
  55520. + }
  55521. + //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator
  55522. + //following is to check out MAC_addr
  55523. + else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){
  55524. + DBG_871X("receive setup_req after sending setup_req\n");
  55525. + for (i=0;i<6;i++){
  55526. + if(*(pmyid+i)==*(psa+i)){
  55527. + }
  55528. + else if(*(pmyid+i)>*(psa+i)){
  55529. + goto exit;
  55530. + }else if(*(pmyid+i)<*(psa+i)){
  55531. + ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE;
  55532. + break;
  55533. + }
  55534. + }
  55535. + }
  55536. + }
  55537. +
  55538. + if(ptdls_sta)
  55539. + {
  55540. + ptdls_sta->dialog = *(ptr+2); //copy dialog token
  55541. + ptdls_sta->stat_code = 0;
  55542. +
  55543. + //parsing information element
  55544. + for(j=FIXED_IE; j<parsing_length;){
  55545. +
  55546. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  55547. +
  55548. + switch (pIE->ElementID)
  55549. + {
  55550. + case _SUPPORTEDRATES_IE_:
  55551. + _rtw_memcpy(supportRate, pIE->data, pIE->Length);
  55552. + supportRateNum = pIE->Length;
  55553. + break;
  55554. + case _COUNTRY_IE_:
  55555. + break;
  55556. + case _EXT_SUPPORTEDRATES_IE_:
  55557. + if(supportRateNum<=sizeof(supportRate))
  55558. + {
  55559. + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length);
  55560. + supportRateNum += pIE->Length;
  55561. + }
  55562. + break;
  55563. + case _SUPPORTED_CH_IE_:
  55564. + break;
  55565. + case _RSN_IE_2_:
  55566. + rsnie_have=1;
  55567. + if(prx_pkt_attrib->encrypt){
  55568. + prsnie=(u8*)pIE;
  55569. + //check whether initiator STA has CCMP pairwise_cipher.
  55570. + ppairwise_cipher=prsnie+10;
  55571. + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1);
  55572. + for(k=0;k<pairwise_count;k++){
  55573. + if(_rtw_memcmp( ppairwise_cipher+4*k, RSN_CIPHER_SUITE_CCMP, 4)==_TRUE)
  55574. + ccmp_have=1;
  55575. + }
  55576. + if(ccmp_have==0){
  55577. + //invalid contents of RSNIE
  55578. + ptdls_sta->stat_code=72;
  55579. + }
  55580. + }
  55581. + break;
  55582. + case _EXT_CAP_IE_:
  55583. + break;
  55584. + case _VENDOR_SPECIFIC_IE_:
  55585. + break;
  55586. + case _FTIE_:
  55587. + if(prx_pkt_attrib->encrypt)
  55588. + _rtw_memcpy(SNonce, (ptr+j+52), 32);
  55589. + break;
  55590. + case _TIMEOUT_ITVL_IE_:
  55591. + if(prx_pkt_attrib->encrypt)
  55592. + timeout_interval = (u32 *)(ptr+j+3);
  55593. + break;
  55594. + case _RIC_Descriptor_IE_:
  55595. + break;
  55596. + case _HT_CAPABILITY_IE_:
  55597. + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length);
  55598. + break;
  55599. + case EID_BSSCoexistence:
  55600. + break;
  55601. + case _LINK_ID_IE_:
  55602. + if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE)
  55603. + {
  55604. + //not in the same BSS
  55605. + ptdls_sta->stat_code=7;
  55606. + }
  55607. + break;
  55608. + default:
  55609. + break;
  55610. + }
  55611. +
  55612. + j += (pIE->Length + 2);
  55613. +
  55614. + }
  55615. +
  55616. + //update station supportRate
  55617. + ptdls_sta->bssratelen = supportRateNum;
  55618. + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);
  55619. +
  55620. + //check status code
  55621. + //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject
  55622. + if(ptdls_sta->stat_code == 0 )
  55623. + {
  55624. + if(rsnie_have && (prx_pkt_attrib->encrypt==0)){
  55625. + //security disabled
  55626. + ptdls_sta->stat_code = 5;
  55627. + }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){
  55628. + //request haven't RSNIE
  55629. + ptdls_sta->stat_code = 38;
  55630. + }
  55631. +
  55632. +#ifdef CONFIG_WFD
  55633. + //WFD test plan version 0.18.2 test item 5.1.5
  55634. + //SoUT does not use TDLS if AP uses weak security
  55635. + if ( adapter->wdinfo.wfd_tdls_enable )
  55636. + {
  55637. + if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_))
  55638. + {
  55639. + ptdls_sta->stat_code = 5;
  55640. + }
  55641. + }
  55642. +#endif //CONFIG_WFD
  55643. + }
  55644. +
  55645. + ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE;
  55646. + if(prx_pkt_attrib->encrypt){
  55647. + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32);
  55648. + _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4);
  55649. + }
  55650. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  55651. + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))
  55652. + ptdlsinfo->sta_cnt++;
  55653. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  55654. + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta
  55655. + {
  55656. + ptdlsinfo->sta_maximum = _TRUE;
  55657. + }
  55658. +
  55659. +#ifdef CONFIG_WFD
  55660. + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);
  55661. +#endif // CONFIG_WFD
  55662. +
  55663. + }
  55664. + else
  55665. + {
  55666. + goto exit;
  55667. + }
  55668. +
  55669. + issue_tdls_setup_rsp(adapter, precv_frame);
  55670. +
  55671. + if(ptdls_sta->stat_code==0)
  55672. + {
  55673. + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME);
  55674. + }
  55675. + else //status code!=0 ; setup unsuccess
  55676. + {
  55677. + free_tdls_sta(adapter, ptdls_sta);
  55678. + }
  55679. +
  55680. +exit:
  55681. +
  55682. + return _FAIL;
  55683. +}
  55684. +
  55685. +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
  55686. +{
  55687. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  55688. + struct sta_info *ptdls_sta= NULL;
  55689. + struct sta_priv *pstapriv = &adapter->stapriv;
  55690. + u8 *ptr = precv_frame->u.hdr.rx_data;
  55691. + _irqL irqL;
  55692. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  55693. + u8 *psa;
  55694. + u16 stat_code;
  55695. + sint parsing_length; //frame body length, without icv_len
  55696. + PNDIS_802_11_VARIABLE_IEs pIE;
  55697. + u8 FIXED_IE =7;
  55698. + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher;
  55699. + u16 pairwise_count, j, k;
  55700. + u8 verify_ccmp=0;
  55701. + unsigned char supportRate[16];
  55702. + int supportRateNum = 0;
  55703. +
  55704. + psa = get_sa(ptr);
  55705. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  55706. +
  55707. + if ( NULL == ptdls_sta )
  55708. + {
  55709. + return _FAIL;
  55710. + }
  55711. +
  55712. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;
  55713. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  55714. + -prx_pkt_attrib->hdrlen
  55715. + -prx_pkt_attrib->iv_len
  55716. + -prx_pkt_attrib->icv_len
  55717. + -LLC_HEADER_SIZE
  55718. + -TYPE_LENGTH_FIELD_SIZE
  55719. + -1
  55720. + -FIXED_IE;
  55721. +
  55722. + _rtw_memcpy(&stat_code, ptr+2, 2);
  55723. +
  55724. + if(stat_code!=0)
  55725. + {
  55726. + DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code );
  55727. + free_tdls_sta(adapter, ptdls_sta);
  55728. + return _FAIL;
  55729. + }
  55730. +
  55731. + stat_code = 0;
  55732. +
  55733. + //parsing information element
  55734. + for(j=FIXED_IE; j<parsing_length;)
  55735. + {
  55736. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  55737. +
  55738. + switch (pIE->ElementID)
  55739. + {
  55740. + case _SUPPORTEDRATES_IE_:
  55741. + _rtw_memcpy(supportRate, pIE->data, pIE->Length);
  55742. + supportRateNum = pIE->Length;
  55743. + break;
  55744. + case _COUNTRY_IE_:
  55745. + break;
  55746. + case _EXT_SUPPORTEDRATES_IE_:
  55747. + if(supportRateNum<=sizeof(supportRate))
  55748. + {
  55749. + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length);
  55750. + supportRateNum += pIE->Length;
  55751. + }
  55752. + break;
  55753. + case _SUPPORTED_CH_IE_:
  55754. + break;
  55755. + case _RSN_IE_2_:
  55756. + prsnie=(u8*)pIE;
  55757. + //check whether responder STA has CCMP pairwise_cipher.
  55758. + ppairwise_cipher=prsnie+10;
  55759. + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2);
  55760. + for(k=0;k<pairwise_count;k++){
  55761. + if(_rtw_memcmp( ppairwise_cipher+4*k, RSN_CIPHER_SUITE_CCMP, 4)==_TRUE)
  55762. + verify_ccmp=1;
  55763. + }
  55764. + case _EXT_CAP_IE_:
  55765. + break;
  55766. + case _VENDOR_SPECIFIC_IE_:
  55767. + break;
  55768. + case _FTIE_:
  55769. + pftie=(u8*)pIE;
  55770. + _rtw_memcpy(ptdls_sta->ANonce, (ptr+j+20), 32);
  55771. + break;
  55772. + case _TIMEOUT_ITVL_IE_:
  55773. + ptimeout_ie=(u8*)pIE;
  55774. + break;
  55775. + case _RIC_Descriptor_IE_:
  55776. + break;
  55777. + case _HT_CAPABILITY_IE_:
  55778. + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length);
  55779. + break;
  55780. + case EID_BSSCoexistence:
  55781. + break;
  55782. + case _LINK_ID_IE_:
  55783. + plinkid_ie=(u8*)pIE;
  55784. + break;
  55785. + default:
  55786. + break;
  55787. + }
  55788. +
  55789. + j += (pIE->Length + 2);
  55790. +
  55791. + }
  55792. +
  55793. + //update station supportRate
  55794. + ptdls_sta->bssratelen = supportRateNum;
  55795. + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);
  55796. +
  55797. +#ifdef CONFIG_WFD
  55798. + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);
  55799. +#endif // CONFIG_WFD
  55800. +
  55801. + if(stat_code != 0)
  55802. + {
  55803. + ptdls_sta->stat_code = stat_code;
  55804. + }
  55805. + else
  55806. + {
  55807. + if(prx_pkt_attrib->encrypt)
  55808. + {
  55809. + if(verify_ccmp==1)
  55810. + {
  55811. + wpa_tdls_generate_tpk(adapter, ptdls_sta);
  55812. + ptdls_sta->stat_code=0;
  55813. + if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid
  55814. + {
  55815. + free_tdls_sta(adapter, ptdls_sta);
  55816. + return _FAIL;
  55817. + }
  55818. + }
  55819. + else
  55820. + {
  55821. + ptdls_sta->stat_code=72; //invalide contents of RSNIE
  55822. + }
  55823. +
  55824. + }else{
  55825. + ptdls_sta->stat_code=0;
  55826. + }
  55827. + }
  55828. +
  55829. + DBG_871X("issue_tdls_setup_cfm\n");
  55830. + issue_tdls_setup_cfm(adapter, precv_frame);
  55831. +
  55832. + if(ptdls_sta->stat_code==0)
  55833. + {
  55834. + ptdlsinfo->setup_state = TDLS_LINKED_STATE;
  55835. +
  55836. + if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE )
  55837. + {
  55838. + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;
  55839. + _cancel_timer_ex( &ptdls_sta->handshake_timer);
  55840. +#ifdef CONFIG_TDLS_AUTOCHECKALIVE
  55841. + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);
  55842. +#endif //CONFIG_TDLS_AUTOSETUP
  55843. + }
  55844. +
  55845. + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta);
  55846. + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta);
  55847. +
  55848. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR);
  55849. +
  55850. + }
  55851. + else //status code!=0 ; setup unsuccessful
  55852. + {
  55853. + free_tdls_sta(adapter, ptdls_sta);
  55854. + }
  55855. +
  55856. + return _FAIL;
  55857. +
  55858. +}
  55859. +
  55860. +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame)
  55861. +{
  55862. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  55863. + struct sta_info *ptdls_sta= NULL;
  55864. + struct sta_priv *pstapriv = &adapter->stapriv;
  55865. + u8 *ptr = precv_frame->u.hdr.rx_data;
  55866. + _irqL irqL;
  55867. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  55868. + u8 *psa;
  55869. + u16 stat_code;
  55870. + sint parsing_length;
  55871. + PNDIS_802_11_VARIABLE_IEs pIE;
  55872. + u8 FIXED_IE =5;
  55873. + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher;
  55874. + u16 j, pairwise_count;
  55875. +
  55876. + psa = get_sa(ptr);
  55877. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  55878. +
  55879. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;
  55880. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  55881. + -prx_pkt_attrib->hdrlen
  55882. + -prx_pkt_attrib->iv_len
  55883. + -prx_pkt_attrib->icv_len
  55884. + -LLC_HEADER_SIZE
  55885. + -ETH_TYPE_LEN
  55886. + -PAYLOAD_TYPE_LEN
  55887. + -FIXED_IE;
  55888. + _rtw_memcpy(&stat_code, ptr+2, 2);
  55889. +
  55890. + if(stat_code!=0){
  55891. + DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code );
  55892. + free_tdls_sta(adapter, ptdls_sta);
  55893. + return _FAIL;
  55894. + }
  55895. +
  55896. + if(prx_pkt_attrib->encrypt){
  55897. + //parsing information element
  55898. + for(j=FIXED_IE; j<parsing_length;){
  55899. +
  55900. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  55901. +
  55902. + switch (pIE->ElementID)
  55903. + {
  55904. + case _RSN_IE_2_:
  55905. + prsnie=(u8*)pIE;
  55906. + break;
  55907. + case _VENDOR_SPECIFIC_IE_:
  55908. + break;
  55909. + case _FTIE_:
  55910. + pftie=(u8*)pIE;
  55911. + break;
  55912. + case _TIMEOUT_ITVL_IE_:
  55913. + ptimeout_ie=(u8*)pIE;
  55914. + break;
  55915. + case _HT_EXTRA_INFO_IE_:
  55916. + break;
  55917. + case _LINK_ID_IE_:
  55918. + plinkid_ie=(u8*)pIE;
  55919. + break;
  55920. + default:
  55921. + break;
  55922. + }
  55923. +
  55924. + j += (pIE->Length + 2);
  55925. +
  55926. + }
  55927. +
  55928. + //verify mic in FTIE MIC field
  55929. + if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid
  55930. + free_tdls_sta(adapter, ptdls_sta);
  55931. + return _FAIL;
  55932. + }
  55933. +
  55934. + }
  55935. +
  55936. + ptdlsinfo->setup_state = TDLS_LINKED_STATE;
  55937. + if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE )
  55938. + {
  55939. + ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE;
  55940. + _cancel_timer_ex( &ptdls_sta->handshake_timer);
  55941. +#ifdef CONFIG_TDLS_AUTOCHECKALIVE
  55942. + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);
  55943. +#endif //CONFIG_TDLS_AUTOCHECKALIVE
  55944. + }
  55945. +
  55946. + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta);
  55947. + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta);
  55948. +
  55949. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR);
  55950. +
  55951. + return _FAIL;
  55952. +
  55953. +}
  55954. +
  55955. +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame)
  55956. +{
  55957. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  55958. + struct sta_priv *pstapriv = &adapter->stapriv;
  55959. + struct sta_info *psta_ap;
  55960. + u8 *ptr = precv_frame->u.hdr.rx_data;
  55961. + sint parsing_length; //frame body length, without icv_len
  55962. + PNDIS_802_11_VARIABLE_IEs pIE;
  55963. + u8 FIXED_IE = 3, *dst, *pdialog = NULL;
  55964. + u16 j;
  55965. +
  55966. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1;
  55967. + pdialog=ptr+2;
  55968. +
  55969. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  55970. + -prx_pkt_attrib->hdrlen
  55971. + -prx_pkt_attrib->iv_len
  55972. + -prx_pkt_attrib->icv_len
  55973. + -LLC_HEADER_SIZE
  55974. + -TYPE_LENGTH_FIELD_SIZE
  55975. + -1
  55976. + -FIXED_IE;
  55977. +
  55978. + //parsing information element
  55979. + for(j=FIXED_IE; j<parsing_length;){
  55980. +
  55981. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  55982. +
  55983. + switch (pIE->ElementID)
  55984. + {
  55985. + case _LINK_ID_IE_:
  55986. + psta_ap = rtw_get_stainfo(pstapriv, pIE->data);
  55987. + if(psta_ap == NULL)
  55988. + {
  55989. + goto exit;
  55990. + }
  55991. + dst = pIE->data + 12;
  55992. + if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) )
  55993. + {
  55994. + goto exit;
  55995. + }
  55996. + break;
  55997. + default:
  55998. + break;
  55999. + }
  56000. +
  56001. + j += (pIE->Length + 2);
  56002. +
  56003. + }
  56004. +
  56005. + //check frame contents
  56006. +
  56007. + issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) );
  56008. +
  56009. +exit:
  56010. +
  56011. + return _FAIL;
  56012. +
  56013. +}
  56014. +
  56015. +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame)
  56016. +{
  56017. + u8 *psa;
  56018. + u8 *ptr = precv_frame->u.hdr.rx_data;
  56019. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  56020. + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
  56021. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  56022. + struct sta_priv *pstapriv = &adapter->stapriv;
  56023. + struct sta_info *ptdls_sta= NULL;
  56024. + _irqL irqL;
  56025. +
  56026. + psa = get_sa(ptr);
  56027. +
  56028. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  56029. + if(ptdls_sta!=NULL){
  56030. + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){
  56031. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);
  56032. + }
  56033. + free_tdls_sta(adapter, ptdls_sta);
  56034. + }
  56035. +
  56036. + return _FAIL;
  56037. +
  56038. +}
  56039. +
  56040. +u8 TDLS_check_ch_state(uint state){
  56041. + if( (state & TDLS_CH_SWITCH_ON_STATE) &&
  56042. + (state & TDLS_AT_OFF_CH_STATE) &&
  56043. + (state & TDLS_PEER_AT_OFF_STATE) ){
  56044. +
  56045. + if(state & TDLS_PEER_SLEEP_STATE)
  56046. + return 2; //U-APSD + ch. switch
  56047. + else
  56048. + return 1; //ch. switch
  56049. + }else
  56050. + return 0;
  56051. +}
  56052. +
  56053. +//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here
  56054. +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
  56055. +{
  56056. + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  56057. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  56058. + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;
  56059. + struct sta_priv *pstapriv = &adapter->stapriv;
  56060. + //get peer sta infomation
  56061. + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);
  56062. + u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state);
  56063. + int i;
  56064. +
  56065. + ptdls_sta->sta_stats.rx_data_pkts++;
  56066. +
  56067. + //receive peer traffic response frame, sleeping STA wakes up
  56068. + //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE);
  56069. + process_wmmps_data( adapter, precv_frame);
  56070. +
  56071. + // if noticed peer STA wakes up by receiving peer traffic response
  56072. + // and we want to do channel swtiching, then we will transmit channel switch request first
  56073. + if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){
  56074. + issue_tdls_ch_switch_req(adapter, pattrib->src);
  56075. + ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE);
  56076. + return _FAIL;
  56077. + }
  56078. +
  56079. + //check 4-AC queue bit
  56080. + if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk)
  56081. + wmmps_ac=1;
  56082. +
  56083. + //if it's a direct link and have buffered frame
  56084. + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){
  56085. + if(wmmps_ac && state)
  56086. + {
  56087. + _irqL irqL;
  56088. + _list *xmitframe_plist, *xmitframe_phead;
  56089. + struct xmit_frame *pxmitframe=NULL;
  56090. +
  56091. + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  56092. +
  56093. + xmitframe_phead = get_list_head(&ptdls_sta->sleep_q);
  56094. + xmitframe_plist = get_next(xmitframe_phead);
  56095. +
  56096. + //transmit buffered frames
  56097. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  56098. + {
  56099. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  56100. + xmitframe_plist = get_next(xmitframe_plist);
  56101. + rtw_list_delete(&pxmitframe->list);
  56102. +
  56103. + ptdls_sta->sleepq_len--;
  56104. + if(ptdls_sta->sleepq_len>0){
  56105. + pxmitframe->attrib.mdata = 1;
  56106. + pxmitframe->attrib.eosp = 0;
  56107. + }else{
  56108. + pxmitframe->attrib.mdata = 0;
  56109. + pxmitframe->attrib.eosp = 1;
  56110. + }
  56111. + //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS
  56112. + if(rtw_hal_xmit(adapter, pxmitframe) == _TRUE)
  56113. + {
  56114. + rtw_os_xmit_complete(adapter, pxmitframe);
  56115. + }
  56116. +
  56117. + }
  56118. +
  56119. + if(ptdls_sta->sleepq_len==0)
  56120. + {
  56121. + DBG_871X("no buffered packets for tdls to xmit\n");
  56122. + //on U-APSD + CH. switch state, when there is no buffered date to xmit,
  56123. + // we should go back to base channel
  56124. + if(state==2){
  56125. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);
  56126. + }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){
  56127. + ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE);
  56128. + ptdlsinfo->candidate_ch= pmlmeext->cur_channel;
  56129. + issue_tdls_ch_switch_req(adapter, pattrib->src);
  56130. + DBG_871X("issue tdls ch switch req back to base channel\n");
  56131. + }
  56132. +
  56133. + }
  56134. + else
  56135. + {
  56136. + DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len);
  56137. + ptdls_sta->sleepq_len=0;
  56138. + }
  56139. +
  56140. + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  56141. +
  56142. + }
  56143. +
  56144. + }
  56145. +
  56146. + return _FAIL;
  56147. +}
  56148. +
  56149. +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame)
  56150. +{
  56151. + struct sta_info *ptdls_sta= NULL;
  56152. + struct sta_priv *pstapriv = &adapter->stapriv;
  56153. + u8 *ptr = precv_frame->u.hdr.rx_data;
  56154. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  56155. + u8 *psa;
  56156. + sint parsing_length;
  56157. + PNDIS_802_11_VARIABLE_IEs pIE;
  56158. + u8 FIXED_IE =3;
  56159. + u16 j;
  56160. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  56161. +
  56162. + psa = get_sa(ptr);
  56163. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  56164. +
  56165. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;
  56166. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  56167. + -prx_pkt_attrib->hdrlen
  56168. + -prx_pkt_attrib->iv_len
  56169. + -prx_pkt_attrib->icv_len
  56170. + -LLC_HEADER_SIZE
  56171. + -ETH_TYPE_LEN
  56172. + -PAYLOAD_TYPE_LEN
  56173. + -FIXED_IE;
  56174. +
  56175. + ptdls_sta->off_ch = *(ptr+2);
  56176. +
  56177. + //parsing information element
  56178. + for(j=FIXED_IE; j<parsing_length;){
  56179. +
  56180. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  56181. +
  56182. + switch (pIE->ElementID)
  56183. + {
  56184. + case _COUNTRY_IE_:
  56185. + break;
  56186. + case _CH_SWTICH_ANNOUNCE_:
  56187. + break;
  56188. + case _LINK_ID_IE_:
  56189. + break;
  56190. + case _CH_SWITCH_TIMING_:
  56191. + _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2);
  56192. + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2);
  56193. + default:
  56194. + break;
  56195. + }
  56196. +
  56197. + j += (pIE->Length + 2);
  56198. +
  56199. + }
  56200. +
  56201. + //todo: check status
  56202. + ptdls_sta->stat_code=0;
  56203. + ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE;
  56204. +
  56205. + issue_nulldata(adapter, NULL, 1, 0, 0);
  56206. +
  56207. + issue_tdls_ch_switch_rsp(adapter, psa);
  56208. +
  56209. + DBG_871X("issue tdls channel switch response\n");
  56210. +
  56211. + if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){
  56212. + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel);
  56213. + ptdls_sta->option=7;
  56214. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH);
  56215. + }else{
  56216. + ptdls_sta->option=6;
  56217. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);
  56218. + }
  56219. + return _FAIL;
  56220. +}
  56221. +
  56222. +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)
  56223. +{
  56224. + struct sta_info *ptdls_sta= NULL;
  56225. + struct sta_priv *pstapriv = &adapter->stapriv;
  56226. + u8 *ptr = precv_frame->u.hdr.rx_data;
  56227. + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  56228. + u8 *psa;
  56229. + sint parsing_length;
  56230. + PNDIS_802_11_VARIABLE_IEs pIE;
  56231. + u8 FIXED_IE =4;
  56232. + u16 stat_code, j, switch_time, switch_timeout;
  56233. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  56234. +
  56235. + psa = get_sa(ptr);
  56236. + ptdls_sta = rtw_get_stainfo(pstapriv, psa);
  56237. +
  56238. + //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response,
  56239. + //it will go back to base channel and terminate this channel switch procedure
  56240. + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){
  56241. + if(pmlmeext->cur_channel==ptdls_sta->off_ch){
  56242. + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel);
  56243. + ptdls_sta->option=7;
  56244. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);
  56245. + }else{
  56246. + DBG_871X("receive unsolicited channel switch response \n");
  56247. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);
  56248. + }
  56249. + return _FAIL;
  56250. + }
  56251. +
  56252. + //avoiding duplicated or unconditional ch. switch. rsp
  56253. + if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE)
  56254. + return _FAIL;
  56255. +
  56256. + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;
  56257. + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len
  56258. + -prx_pkt_attrib->hdrlen
  56259. + -prx_pkt_attrib->iv_len
  56260. + -prx_pkt_attrib->icv_len
  56261. + -LLC_HEADER_SIZE
  56262. + -ETH_TYPE_LEN
  56263. + -PAYLOAD_TYPE_LEN
  56264. + -FIXED_IE;
  56265. +
  56266. + _rtw_memcpy(&stat_code, ptr+2, 2);
  56267. +
  56268. + if(stat_code!=0){
  56269. + return _FAIL;
  56270. + }
  56271. +
  56272. + //parsing information element
  56273. + for(j=FIXED_IE; j<parsing_length;){
  56274. +
  56275. + pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);
  56276. +
  56277. + switch (pIE->ElementID)
  56278. + {
  56279. + case _LINK_ID_IE_:
  56280. + break;
  56281. + case _CH_SWITCH_TIMING_:
  56282. + _rtw_memcpy(&switch_time, pIE->data, 2);
  56283. + if(switch_time > ptdls_sta->ch_switch_time)
  56284. + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2);
  56285. +
  56286. + _rtw_memcpy(&switch_timeout, pIE->data+2, 2);
  56287. + if(switch_timeout > ptdls_sta->ch_switch_timeout)
  56288. + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2);
  56289. +
  56290. + default:
  56291. + break;
  56292. + }
  56293. +
  56294. + j += (pIE->Length + 2);
  56295. +
  56296. + }
  56297. +
  56298. + ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE);
  56299. + ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE;
  56300. +
  56301. + //goto set_channel_workitem_callback()
  56302. + ptdls_sta->option=6;
  56303. + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);
  56304. +
  56305. + return _FAIL;
  56306. +}
  56307. +
  56308. +#ifdef CONFIG_WFD
  56309. +void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen )
  56310. +{
  56311. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  56312. + struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info;
  56313. + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
  56314. + u32 wfdielen = 0;
  56315. +
  56316. + // WFD OUI
  56317. + wfdielen = 0;
  56318. + wfdie[ wfdielen++ ] = 0x50;
  56319. + wfdie[ wfdielen++ ] = 0x6F;
  56320. + wfdie[ wfdielen++ ] = 0x9A;
  56321. + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0
  56322. +
  56323. + // Commented by Albert 20110825
  56324. + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes
  56325. + // 1. WFD Device Information
  56326. + // 2. Associated BSSID ( Optional )
  56327. + // 3. Local IP Adress ( Optional )
  56328. +
  56329. + // WFD Device Information ATTR
  56330. + // Type:
  56331. + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
  56332. +
  56333. + // Length:
  56334. + // Note: In the WFD specification, the size of length field is 2.
  56335. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  56336. + wfdielen += 2;
  56337. +
  56338. + // Value1:
  56339. + // WFD device information
  56340. + // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery )
  56341. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL
  56342. + | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD);
  56343. + wfdielen += 2;
  56344. +
  56345. + // Value2:
  56346. + // Session Management Control Port
  56347. + // Default TCP port for RTSP messages is 554
  56348. + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );
  56349. + wfdielen += 2;
  56350. +
  56351. + // Value3:
  56352. + // WFD Device Maximum Throughput
  56353. + // 300Mbps is the maximum throughput
  56354. + RTW_PUT_BE16(wfdie + wfdielen, 300);
  56355. + wfdielen += 2;
  56356. +
  56357. + // Associated BSSID ATTR
  56358. + // Type:
  56359. + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
  56360. +
  56361. + // Length:
  56362. + // Note: In the WFD specification, the size of length field is 2.
  56363. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  56364. + wfdielen += 2;
  56365. +
  56366. + // Value:
  56367. + // Associated BSSID
  56368. + if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE )
  56369. + {
  56370. + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  56371. + }
  56372. + else
  56373. + {
  56374. + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );
  56375. + }
  56376. +
  56377. + // Local IP Address ATTR
  56378. + wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR;
  56379. +
  56380. + // Length:
  56381. + // Note: In the WFD specification, the size of length field is 2.
  56382. + RTW_PUT_BE16(wfdie + wfdielen, 0x0005);
  56383. + wfdielen += 2;
  56384. +
  56385. + // Version:
  56386. + // 0x01: Version1;IPv4
  56387. + wfdie[ wfdielen++ ] = 0x01;
  56388. +
  56389. + // IPv4 Address
  56390. + _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 );
  56391. + wfdielen += 4;
  56392. +
  56393. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen);
  56394. +
  56395. +}
  56396. +#endif //CONFIG_WFD
  56397. +
  56398. +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56399. +{
  56400. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  56401. + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  56402. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56403. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  56404. + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst);
  56405. +
  56406. + u8 payload_type = 0x02;
  56407. + u8 category = RTW_WLAN_CATEGORY_TDLS;
  56408. + u8 action = TDLS_SETUP_REQUEST;
  56409. + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate
  56410. + int bssrate_len = 0, i = 0 ;
  56411. + u8 more_supportedrates = 0;
  56412. + unsigned int ie_len;
  56413. + u8 *p;
  56414. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  56415. + u8 link_id_addr[18] = {0};
  56416. + u8 iedata=0;
  56417. + u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel
  56418. + u8 timeout_itvl[5]; //set timeout interval to maximum value
  56419. + u32 time;
  56420. +
  56421. + //SNonce
  56422. + if(pattrib->encrypt){
  56423. + for(i=0;i<8;i++){
  56424. + time=rtw_get_current_time();
  56425. + _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4);
  56426. + }
  56427. + }
  56428. +
  56429. + //payload type
  56430. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56431. + //category, action, dialog token
  56432. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56433. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56434. + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen));
  56435. +
  56436. + //capability
  56437. + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  56438. +
  56439. + if(pattrib->encrypt)
  56440. + *pframe =*pframe | BIT(4);
  56441. + pframe += 2;
  56442. + pattrib->pktlen += 2;
  56443. +
  56444. + //supported rates
  56445. + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);
  56446. + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;
  56447. +
  56448. + if (bssrate_len > 8)
  56449. + {
  56450. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  56451. + more_supportedrates = 1;
  56452. + }
  56453. + else
  56454. + {
  56455. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  56456. + }
  56457. +
  56458. + //country(optional)
  56459. + //extended supported rates
  56460. + if(more_supportedrates==1){
  56461. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  56462. + }
  56463. +
  56464. + //supported channels
  56465. + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);
  56466. +
  56467. + // SRC IE
  56468. + pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen));
  56469. +
  56470. + //RSNIE
  56471. + if(pattrib->encrypt)
  56472. + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));
  56473. +
  56474. + //extended capabilities
  56475. + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));
  56476. +
  56477. + //QoS capability(WMM_IE)
  56478. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen));
  56479. +
  56480. +
  56481. + if(pattrib->encrypt){
  56482. + //FTIE
  56483. + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0
  56484. + _rtw_memset(pframe, _FTIE_, 1); //version
  56485. + _rtw_memset((pframe+1), 82, 1); //length
  56486. + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32);
  56487. + pframe += 84;
  56488. + pattrib->pktlen += 84;
  56489. +
  56490. + //Timeout interval
  56491. + timeout_itvl[0]=0x02;
  56492. + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4);
  56493. + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));
  56494. + }
  56495. +
  56496. + //Sup_reg_classes(optional)
  56497. + //HT capabilities
  56498. + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);
  56499. +
  56500. + //20/40 BSS coexistence
  56501. + if(pmlmepriv->num_FortyMHzIntolerant>0)
  56502. + iedata |= BIT(2);//20 MHz BSS Width Request
  56503. + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));
  56504. +
  56505. + //Link identifier
  56506. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56507. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56508. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56509. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56510. +
  56511. +#ifdef CONFIG_WFD
  56512. + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) );
  56513. +#endif //CONFIG_WFD
  56514. +
  56515. +}
  56516. +
  56517. +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56518. +{
  56519. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  56520. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  56521. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56522. + struct sta_info *ptdls_sta;
  56523. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  56524. +
  56525. + u8 payload_type = 0x02;
  56526. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56527. + unsigned char action = TDLS_SETUP_RESPONSE;
  56528. + unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX];
  56529. + int bssrate_len = 0;
  56530. + u8 more_supportedrates = 0;
  56531. + unsigned int ie_len;
  56532. + unsigned char *p;
  56533. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  56534. + u8 link_id_addr[18] = {0};
  56535. + u8 iedata=0;
  56536. + u8 timeout_itvl[5]; //setup response timeout interval will copy from request
  56537. + u8 ANonce[32]; //maybe it can put in ontdls_req
  56538. + u8 k; //for random ANonce
  56539. + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic;
  56540. + u32 time;
  56541. +
  56542. + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);
  56543. +
  56544. + if(ptdls_sta == NULL )
  56545. + {
  56546. + DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__);
  56547. + return;
  56548. + }
  56549. +
  56550. + if(pattrib->encrypt){
  56551. + for(k=0;k<8;k++){
  56552. + time=rtw_get_current_time();
  56553. + _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4);
  56554. + }
  56555. + }
  56556. +
  56557. + //payload type
  56558. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56559. + //category, action, status code
  56560. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56561. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56562. + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));
  56563. +
  56564. + if(ptdls_sta->stat_code!=0) //invalid setup request
  56565. + {
  56566. + DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code);
  56567. + return;
  56568. + }
  56569. +
  56570. + //dialog token
  56571. + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen));
  56572. +
  56573. + //capability
  56574. + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  56575. +
  56576. + if(pattrib->encrypt )
  56577. + *pframe =*pframe | BIT(4);
  56578. + pframe += 2;
  56579. + pattrib->pktlen += 2;
  56580. +
  56581. + //supported rates
  56582. + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);
  56583. + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;
  56584. +
  56585. + if (bssrate_len > 8)
  56586. + {
  56587. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  56588. + more_supportedrates = 1;
  56589. + }
  56590. + else
  56591. + {
  56592. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  56593. + }
  56594. +
  56595. + //country(optional)
  56596. + //extended supported rates
  56597. + if(more_supportedrates==1){
  56598. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  56599. + }
  56600. +
  56601. + //supported channels
  56602. + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);
  56603. +
  56604. + // SRC IE
  56605. + pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen));
  56606. +
  56607. + //RSNIE
  56608. + if(pattrib->encrypt){
  56609. + prsnie = pframe;
  56610. + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));
  56611. + }
  56612. +
  56613. + //extended capabilities
  56614. + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));
  56615. +
  56616. + //QoS capability(WMM_IE)
  56617. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen));
  56618. +
  56619. + if(pattrib->encrypt){
  56620. + wpa_tdls_generate_tpk(padapter, ptdls_sta);
  56621. +
  56622. + //FTIE
  56623. + pftie = pframe;
  56624. + pftie_mic = pframe+4;
  56625. + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0
  56626. + _rtw_memset(pframe, _FTIE_, 1); //version
  56627. + _rtw_memset((pframe+1), 82, 1); //length
  56628. + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32);
  56629. + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32);
  56630. + pframe += 84;
  56631. + pattrib->pktlen += 84;
  56632. +
  56633. + //Timeout interval
  56634. + ptimeout_ie = pframe;
  56635. + timeout_itvl[0]=0x02;
  56636. + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4);
  56637. + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));
  56638. + }
  56639. +
  56640. + //Sup_reg_classes(optional)
  56641. + //HT capabilities
  56642. + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);
  56643. +
  56644. + //20/40 BSS coexistence
  56645. + if(pmlmepriv->num_FortyMHzIntolerant>0)
  56646. + iedata |= BIT(2);//20 MHz BSS Width Request
  56647. + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));
  56648. +
  56649. + //Link identifier
  56650. + plinkid_ie = pframe;
  56651. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56652. + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);
  56653. + _rtw_memcpy((link_id_addr+12), pattrib->src, 6);
  56654. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56655. +
  56656. + //fill FTIE mic
  56657. + if(pattrib->encrypt)
  56658. + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);
  56659. +
  56660. +#ifdef CONFIG_WFD
  56661. + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) );
  56662. +#endif //CONFIG_WFD
  56663. +
  56664. +}
  56665. +
  56666. +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56667. +{
  56668. +
  56669. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  56670. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  56671. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56672. + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst);
  56673. +
  56674. + u8 payload_type = 0x02;
  56675. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56676. + unsigned char action = TDLS_SETUP_CONFIRM;
  56677. + u8 more_supportedrates = 0;
  56678. + unsigned int ie_len;
  56679. + unsigned char *p;
  56680. + u8 timeout_itvl[5]; //set timeout interval to maximum value
  56681. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  56682. + u8 link_id_addr[18] = {0};
  56683. + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic;
  56684. +
  56685. + //payload type
  56686. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56687. + //category, action, status code, dialog token
  56688. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56689. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56690. + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));
  56691. + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen));
  56692. +
  56693. + if(ptdls_sta->stat_code!=0) //invalid setup request
  56694. + return;
  56695. +
  56696. + //RSNIE
  56697. + if(pattrib->encrypt){
  56698. + prsnie = pframe;
  56699. + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));
  56700. + }
  56701. +
  56702. + //EDCA param set; WMM param ele.
  56703. + if(pattrib->encrypt){
  56704. + //FTIE
  56705. + pftie = pframe;
  56706. + pftie_mic = pframe+4;
  56707. + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0
  56708. + _rtw_memset(pframe, _FTIE_, 1); //version
  56709. + _rtw_memset((pframe+1), 82, 1); //length
  56710. + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32);
  56711. + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32);
  56712. + pframe += 84;
  56713. + pattrib->pktlen += 84;
  56714. +
  56715. + //Timeout interval
  56716. + ptimeout_ie = pframe;
  56717. + timeout_itvl[0]=0x02;
  56718. + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4);
  56719. + ptdls_sta->TPK_count=0;
  56720. + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT);
  56721. + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));
  56722. + }
  56723. +
  56724. + //HT operation; todo
  56725. + //Link identifier
  56726. + plinkid_ie = pframe;
  56727. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56728. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56729. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56730. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56731. +
  56732. + //fill FTIE mic
  56733. + if(pattrib->encrypt)
  56734. + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);
  56735. +
  56736. +}
  56737. +
  56738. +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56739. +{
  56740. +
  56741. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56742. + u8 payload_type = 0x02;
  56743. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56744. + unsigned char action = TDLS_TEARDOWN;
  56745. + u8 link_id_addr[18] = {0};
  56746. +
  56747. + struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);
  56748. + struct sta_priv *pstapriv = &padapter->stapriv;
  56749. +
  56750. + //payload type
  56751. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56752. + //category, action, reason code
  56753. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56754. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56755. + pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));
  56756. +
  56757. + //Link identifier
  56758. + if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){
  56759. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56760. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56761. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56762. + }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){
  56763. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56764. + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);
  56765. + _rtw_memcpy((link_id_addr+12), pattrib->src, 6);
  56766. + }
  56767. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56768. +
  56769. +}
  56770. +
  56771. +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56772. +{
  56773. +
  56774. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56775. + u8 payload_type = 0x02;
  56776. + u8 category = RTW_WLAN_CATEGORY_TDLS;
  56777. + u8 action = TDLS_DISCOVERY_REQUEST;
  56778. + u8 link_id_addr[18] = {0};
  56779. + static u8 dialogtoken=0;
  56780. +
  56781. + //payload type
  56782. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56783. + //category, action, reason code
  56784. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56785. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56786. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen));
  56787. + dialogtoken = (dialogtoken+1)%256;
  56788. +
  56789. + //Link identifier
  56790. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56791. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56792. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56793. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56794. +
  56795. +}
  56796. +
  56797. +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog)
  56798. +{
  56799. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  56800. + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  56801. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56802. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  56803. +
  56804. + u8 category = RTW_WLAN_CATEGORY_PUBLIC;
  56805. + u8 action = TDLS_DISCOVERY_RESPONSE;
  56806. + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX];
  56807. + int bssrate_len = 0;
  56808. + u8 more_supportedrates = 0;
  56809. + u8 *p;
  56810. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  56811. + u8 link_id_addr[18] = {0};
  56812. + u8 iedata=0;
  56813. + u8 timeout_itvl[5]; //set timeout interval to maximum value
  56814. + u32 timeout_interval= TPK_RESEND_COUNT * 1000;
  56815. +
  56816. + //category, action, dialog token
  56817. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56818. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56819. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialog), &(pattrib->pktlen));
  56820. +
  56821. + //capability
  56822. + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  56823. +
  56824. + if(pattrib->encrypt)
  56825. + *pframe =*pframe | BIT(4);
  56826. + pframe += 2;
  56827. + pattrib->pktlen += 2;
  56828. +
  56829. + //supported rates
  56830. + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);
  56831. + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;
  56832. +
  56833. + if (bssrate_len > 8)
  56834. + {
  56835. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  56836. + more_supportedrates = 1;
  56837. + }
  56838. + else
  56839. + {
  56840. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  56841. + }
  56842. +
  56843. + //extended supported rates
  56844. + if(more_supportedrates==1){
  56845. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  56846. + }
  56847. +
  56848. + //supported channels
  56849. + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);
  56850. +
  56851. + //RSNIE
  56852. + if(pattrib->encrypt)
  56853. + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));
  56854. +
  56855. + //extended capability
  56856. + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));
  56857. +
  56858. + if(pattrib->encrypt){
  56859. + //FTIE
  56860. + _rtw_memset(pframe, 0, 84); //All fields shall be set to 0
  56861. + _rtw_memset(pframe, _FTIE_, 1); //version
  56862. + _rtw_memset((pframe+1), 82, 1); //length
  56863. + pframe += 84;
  56864. + pattrib->pktlen += 84;
  56865. +
  56866. + //Timeout interval
  56867. + timeout_itvl[0]=0x02;
  56868. + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4);
  56869. + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));
  56870. + }
  56871. +
  56872. + //Sup_reg_classes(optional)
  56873. + //HT capabilities
  56874. + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);
  56875. +
  56876. + //20/40 BSS coexistence
  56877. + if(pmlmepriv->num_FortyMHzIntolerant>0)
  56878. + iedata |= BIT(2);//20 MHz BSS Width Request
  56879. + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));
  56880. +
  56881. + //Link identifier
  56882. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56883. + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);
  56884. + _rtw_memcpy((link_id_addr+12), pattrib->src, 6);
  56885. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56886. +
  56887. +}
  56888. +
  56889. +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56890. +{
  56891. +
  56892. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56893. + u8 payload_type = 0x02;
  56894. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56895. + unsigned char action = TDLS_PEER_TRAFFIC_INDICATION;
  56896. +
  56897. + u8 link_id_addr[18] = {0};
  56898. + u8 AC_queue=0;
  56899. + struct sta_priv *pstapriv = &padapter->stapriv;
  56900. + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  56901. +
  56902. + //payload type
  56903. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56904. + //category, action, reason code
  56905. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56906. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56907. + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen));
  56908. +
  56909. + //Link identifier
  56910. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56911. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56912. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56913. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56914. +
  56915. + //PTI control
  56916. + //PU buffer status
  56917. + if(ptdls_sta->uapsd_bk&BIT(1))
  56918. + AC_queue=BIT(0);
  56919. + if(ptdls_sta->uapsd_be&BIT(1))
  56920. + AC_queue=BIT(1);
  56921. + if(ptdls_sta->uapsd_vi&BIT(1))
  56922. + AC_queue=BIT(2);
  56923. + if(ptdls_sta->uapsd_vo&BIT(1))
  56924. + AC_queue=BIT(3);
  56925. + pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen));
  56926. +
  56927. +}
  56928. +
  56929. +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56930. +{
  56931. +
  56932. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56933. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  56934. + u8 payload_type = 0x02;
  56935. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56936. + unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST;
  56937. + u8 link_id_addr[18] = {0};
  56938. + struct sta_priv *pstapriv = &padapter->stapriv;
  56939. + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  56940. + u8 ch_switch_timing[4] = {0};
  56941. + u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT;
  56942. +
  56943. + //payload type
  56944. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56945. + //category, action, target_ch
  56946. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56947. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56948. + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen));
  56949. +
  56950. + //Link identifier
  56951. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56952. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56953. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56954. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56955. +
  56956. + //ch switch timing
  56957. + _rtw_memcpy(ch_switch_timing, &switch_time, 2);
  56958. + _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2);
  56959. + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen));
  56960. +
  56961. + //update ch switch attrib to sta_info
  56962. + ptdls_sta->off_ch=ptdlsinfo->candidate_ch;
  56963. + ptdls_sta->ch_switch_time=switch_time;
  56964. + ptdls_sta->ch_switch_timeout=switch_timeout;
  56965. +
  56966. +}
  56967. +
  56968. +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  56969. +{
  56970. +
  56971. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  56972. + u8 payload_type = 0x02;
  56973. + unsigned char category = RTW_WLAN_CATEGORY_TDLS;
  56974. + unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE;
  56975. + u8 link_id_addr[18] = {0};
  56976. + struct sta_priv *pstapriv = &padapter->stapriv;
  56977. + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  56978. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  56979. + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  56980. + u8 ch_switch_timing[4] = {0};
  56981. +
  56982. + //payload type
  56983. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  56984. + //category, action, status_code
  56985. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  56986. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  56987. + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));
  56988. +
  56989. + //Link identifier
  56990. + _rtw_memcpy(link_id_addr, pattrib->ra, 6);
  56991. + _rtw_memcpy((link_id_addr+6), pattrib->src, 6);
  56992. + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);
  56993. + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  56994. +
  56995. + //ch switch timing
  56996. + _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2);
  56997. + _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2);
  56998. + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen));
  56999. +
  57000. +}
  57001. +
  57002. +#ifdef CONFIG_WFD
  57003. +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  57004. +{
  57005. +
  57006. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  57007. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  57008. + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo;
  57009. + u8 payload_type = 0x02;
  57010. + u8 category = RTW_WLAN_CATEGORY_P2P;
  57011. + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};
  57012. + u8 probe_req = 4;
  57013. + u8 wfdielen = 0;
  57014. +
  57015. + //payload type
  57016. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  57017. + //category, OUI, frame_body_type
  57018. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  57019. + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));
  57020. + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen));
  57021. +
  57022. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  57023. + {
  57024. + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);
  57025. + pframe += wfdielen;
  57026. + pattrib->pktlen += wfdielen;
  57027. + }
  57028. + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE))
  57029. + {
  57030. + wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe);
  57031. + pframe += wfdielen;
  57032. + pattrib->pktlen += wfdielen;
  57033. + }
  57034. +
  57035. +}
  57036. +
  57037. +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)
  57038. +{
  57039. +
  57040. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  57041. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  57042. + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo;
  57043. + u8 payload_type = 0x02;
  57044. + u8 category = RTW_WLAN_CATEGORY_P2P;
  57045. + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};
  57046. + u8 probe_rsp = 5;
  57047. + u8 wfdielen = 0;
  57048. +
  57049. + //payload type
  57050. + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  57051. + //category, OUI, frame_body_type
  57052. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  57053. + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));
  57054. + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen));
  57055. +
  57056. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  57057. + {
  57058. + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1);
  57059. + pframe += wfdielen;
  57060. + pattrib->pktlen += wfdielen;
  57061. + }
  57062. + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE))
  57063. + {
  57064. + wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1);
  57065. + pframe += wfdielen;
  57066. + pattrib->pktlen += wfdielen;
  57067. + }
  57068. +
  57069. +}
  57070. +#endif //CONFIG_WFD
  57071. +
  57072. +void _TPK_timer_hdl(void *FunctionContext)
  57073. +{
  57074. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57075. +
  57076. + ptdls_sta->TPK_count++;
  57077. + //TPK_timer set 1000 as default
  57078. + //retry timer should set at least 301 sec.
  57079. + if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){
  57080. + ptdls_sta->TPK_count=0;
  57081. + issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr);
  57082. + }
  57083. +
  57084. + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT);
  57085. +}
  57086. +
  57087. +void init_TPK_timer(_adapter *padapter, struct sta_info *psta)
  57088. +{
  57089. + psta->padapter=padapter;
  57090. +
  57091. + _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta);
  57092. +}
  57093. +
  57094. +// TDLS_DONE_CH_SEN: channel sensing and report candidate channel
  57095. +// TDLS_OFF_CH: first time set channel to off channel
  57096. +// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication
  57097. +void _ch_switch_timer_hdl(void *FunctionContext)
  57098. +{
  57099. +
  57100. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57101. + _adapter *padapter = ptdls_sta->padapter;
  57102. +
  57103. + if( ptdls_sta->option == TDLS_DONE_CH_SEN ){
  57104. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN);
  57105. + }else if( ptdls_sta->option == TDLS_OFF_CH ){
  57106. + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0);
  57107. + _set_timer(&ptdls_sta->base_ch_timer, 500);
  57108. + }else if( ptdls_sta->option == TDLS_BASE_CH){
  57109. + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0);
  57110. + }
  57111. +}
  57112. +
  57113. +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta)
  57114. +{
  57115. + psta->padapter=padapter;
  57116. + _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta);
  57117. +}
  57118. +
  57119. +void _base_ch_timer_hdl(void *FunctionContext)
  57120. +{
  57121. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57122. + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH);
  57123. +}
  57124. +
  57125. +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta)
  57126. +{
  57127. + psta->padapter=padapter;
  57128. + _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta);
  57129. +}
  57130. +
  57131. +void _off_ch_timer_hdl(void *FunctionContext)
  57132. +{
  57133. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57134. + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH );
  57135. +}
  57136. +
  57137. +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta)
  57138. +{
  57139. + psta->padapter=padapter;
  57140. + _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta);
  57141. +}
  57142. +
  57143. +void _tdls_handshake_timer_hdl(void *FunctionContext)
  57144. +{
  57145. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57146. +
  57147. + if(ptdls_sta != NULL)
  57148. + {
  57149. + if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) )
  57150. + {
  57151. + DBG_871X("tdls handshake time out\n");
  57152. + free_tdls_sta(ptdls_sta->padapter, ptdls_sta);
  57153. + }
  57154. + }
  57155. +}
  57156. +
  57157. +void init_handshake_timer(_adapter *padapter, struct sta_info *psta)
  57158. +{
  57159. + psta->padapter=padapter;
  57160. + _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta);
  57161. +}
  57162. +
  57163. +//Check tdls peer sta alive.
  57164. +void _tdls_alive_timer_phase1_hdl(void *FunctionContext)
  57165. +{
  57166. + _irqL irqL;
  57167. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57168. + _adapter *padapter = ptdls_sta->padapter;
  57169. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  57170. +
  57171. + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57172. + ptdls_sta->timer_flag = 1;
  57173. + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57174. +
  57175. + ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE);
  57176. +
  57177. + DBG_871X("issue_tdls_dis_req to check alive\n");
  57178. + issue_tdls_dis_req( padapter, ptdls_sta->hwaddr);
  57179. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1);
  57180. + sta_update_last_rx_pkts(ptdls_sta);
  57181. +
  57182. + if ( ptdls_sta->timer_flag == 2 )
  57183. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA);
  57184. + else
  57185. + {
  57186. + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57187. + ptdls_sta->timer_flag = 0;
  57188. + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57189. + }
  57190. +
  57191. +}
  57192. +
  57193. +void _tdls_alive_timer_phase2_hdl(void *FunctionContext)
  57194. +{
  57195. + _irqL irqL;
  57196. + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  57197. + _adapter *padapter = ptdls_sta->padapter;
  57198. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  57199. +
  57200. + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);
  57201. + ptdls_sta->timer_flag = 1;
  57202. + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57203. +
  57204. + if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) &&
  57205. + (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) )
  57206. + {
  57207. + DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n",
  57208. + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta));
  57209. +
  57210. + ptdls_sta->alive_count = 0;
  57211. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2);
  57212. + }
  57213. + else
  57214. + {
  57215. + if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) )
  57216. + DBG_871X("TDLS STA TOO FAR\n");
  57217. + if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)))
  57218. + DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n",
  57219. + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta));
  57220. +
  57221. + ptdls_sta->alive_count++;
  57222. + if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT )
  57223. + {
  57224. + ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_;
  57225. + issue_tdls_teardown(padapter, ptdls_sta->hwaddr);
  57226. + }
  57227. + else
  57228. + {
  57229. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2);
  57230. + }
  57231. + }
  57232. +
  57233. + if ( ptdls_sta->timer_flag == 2 )
  57234. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA);
  57235. + else
  57236. + {
  57237. + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);
  57238. + ptdls_sta->timer_flag = 0;
  57239. + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);
  57240. +}
  57241. +
  57242. +}
  57243. +
  57244. +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta)
  57245. +{
  57246. + psta->padapter=padapter;
  57247. + _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta);
  57248. + _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta);
  57249. +}
  57250. +
  57251. +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta)
  57252. +{
  57253. + struct ht_priv *psta_ht = NULL;
  57254. + psta_ht = &psta->htpriv;
  57255. +
  57256. + if(psta_ht->ht_option)
  57257. + {
  57258. + return psta_ht->sgi;
  57259. + }
  57260. + else
  57261. + return _FALSE;
  57262. +}
  57263. +
  57264. +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta)
  57265. +{
  57266. + int i;
  57267. + u8 rf_type, id;
  57268. + unsigned char sta_band = 0;
  57269. + unsigned char limit;
  57270. + unsigned int tx_ra_bitmap=0;
  57271. + struct ht_priv *psta_ht = NULL;
  57272. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  57273. + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
  57274. +
  57275. + psta_ht = &psta->htpriv;
  57276. + //b/g mode ra_bitmap
  57277. + for (i=0; i<sizeof(psta->bssrateset); i++)
  57278. + {
  57279. + if (psta->bssrateset[i])
  57280. + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
  57281. + }
  57282. +
  57283. + //n mode ra_bitmap
  57284. + if(psta_ht->ht_option)
  57285. + {
  57286. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  57287. + if(rf_type == RF_2T2R)
  57288. + limit=16;// 2R
  57289. + else
  57290. + limit=8;// 1R
  57291. +
  57292. + for (i=0; i<limit; i++) {
  57293. + if (psta_ht->ht_cap.supp_mcs_set[i/8] & BIT(i%8))
  57294. + tx_ra_bitmap |= BIT(i+12);
  57295. + }
  57296. + }
  57297. +
  57298. + if ( pcur_network->Configuration.DSConfig > 14 ) {
  57299. + // 5G band
  57300. + if (tx_ra_bitmap & 0xffff000)
  57301. + sta_band |= WIRELESS_11_5N | WIRELESS_11A;
  57302. + else
  57303. + sta_band |= WIRELESS_11A;
  57304. + } else {
  57305. + if (tx_ra_bitmap & 0xffff000)
  57306. + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B;
  57307. + else if (tx_ra_bitmap & 0xff0)
  57308. + sta_band |= WIRELESS_11G |WIRELESS_11B;
  57309. + else
  57310. + sta_band |= WIRELESS_11B;
  57311. + }
  57312. +
  57313. + id = networktype_to_raid(sta_band);
  57314. + tx_ra_bitmap |= ((id<<28)&0xf0000000);
  57315. + return tx_ra_bitmap;
  57316. +}
  57317. +
  57318. +#endif //CONFIG_TDLS
  57319. --- /dev/null
  57320. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c
  57321. @@ -0,0 +1,2304 @@
  57322. +/******************************************************************************
  57323. + *
  57324. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  57325. + *
  57326. + * This program is free software; you can redistribute it and/or modify it
  57327. + * under the terms of version 2 of the GNU General Public License as
  57328. + * published by the Free Software Foundation.
  57329. + *
  57330. + * This program is distributed in the hope that it will be useful, but WITHOUT
  57331. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  57332. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  57333. + * more details.
  57334. + *
  57335. + * You should have received a copy of the GNU General Public License along with
  57336. + * this program; if not, write to the Free Software Foundation, Inc.,
  57337. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  57338. + *
  57339. + *
  57340. + ******************************************************************************/
  57341. +#define _RTW_WLAN_UTIL_C_
  57342. +
  57343. +#include <drv_conf.h>
  57344. +#include <osdep_service.h>
  57345. +#include <drv_types.h>
  57346. +#include <wifi.h>
  57347. +
  57348. +
  57349. +unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f};
  57350. +unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74};
  57351. +
  57352. +unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18};
  57353. +unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7};
  57354. +unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5};
  57355. +
  57356. +unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96};
  57357. +unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43};
  57358. +unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43};
  57359. +unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c};
  57360. +unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5};
  57361. +
  57362. +unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
  57363. +
  57364. +extern unsigned char MCS_rate_2R[16];
  57365. +#ifdef CONFIG_DISABLE_MCS13TO15
  57366. +extern unsigned char MCS_rate_2R_MCS13TO15_OFF[16];
  57367. +#endif //CONFIG_DISABLE_MCS13TO15
  57368. +extern unsigned char MCS_rate_1R[16];
  57369. +extern unsigned char RTW_WPA_OUI[];
  57370. +extern unsigned char WPA_TKIP_CIPHER[4];
  57371. +extern unsigned char RSN_TKIP_CIPHER[4];
  57372. +
  57373. +#define R2T_PHY_DELAY (0)
  57374. +
  57375. +//#define WAIT_FOR_BCN_TO_MIN (3000)
  57376. +#define WAIT_FOR_BCN_TO_MIN (6000)
  57377. +#define WAIT_FOR_BCN_TO_MAX (20000)
  57378. +
  57379. +static u8 rtw_basic_rate_cck[4] = {
  57380. + IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
  57381. + IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK
  57382. +};
  57383. +
  57384. +static u8 rtw_basic_rate_ofdm[3] = {
  57385. + IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,
  57386. + IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK
  57387. +};
  57388. +
  57389. +static u8 rtw_basic_rate_mix[7] = {
  57390. + IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
  57391. + IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK,
  57392. + IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,
  57393. + IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK
  57394. +};
  57395. +
  57396. +
  57397. +int cckrates_included(unsigned char *rate, int ratelen)
  57398. +{
  57399. + int i;
  57400. +
  57401. + for(i = 0; i < ratelen; i++)
  57402. + {
  57403. + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) ||
  57404. + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) )
  57405. + return _TRUE;
  57406. + }
  57407. +
  57408. + return _FALSE;
  57409. +
  57410. +}
  57411. +
  57412. +int cckratesonly_included(unsigned char *rate, int ratelen)
  57413. +{
  57414. + int i;
  57415. +
  57416. + for(i = 0; i < ratelen; i++)
  57417. + {
  57418. + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
  57419. + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) )
  57420. + return _FALSE;
  57421. + }
  57422. +
  57423. + return _TRUE;
  57424. +}
  57425. +
  57426. +unsigned char networktype_to_raid(unsigned char network_type)
  57427. +{
  57428. + unsigned char raid;
  57429. +
  57430. + switch(network_type)
  57431. + {
  57432. + case WIRELESS_11B:
  57433. + raid = 6;
  57434. + break;
  57435. + case WIRELESS_11A:
  57436. + case WIRELESS_11G:
  57437. + raid = 5;
  57438. + break;
  57439. + case WIRELESS_11BG:
  57440. + raid = 4;
  57441. + break;
  57442. + case WIRELESS_11_24N:
  57443. + case WIRELESS_11_5N:
  57444. + raid = 3;
  57445. + break;
  57446. + case WIRELESS_11A_5N:
  57447. + case WIRELESS_11G_24N:
  57448. + raid = 1;
  57449. + break;
  57450. + case WIRELESS_11BG_24N:
  57451. + raid = 0;
  57452. + break;
  57453. + default:
  57454. + raid = 4;
  57455. + break;
  57456. +
  57457. + }
  57458. +
  57459. + return raid;
  57460. +
  57461. +}
  57462. +
  57463. +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen)
  57464. +{
  57465. + int network_type = 0;
  57466. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57467. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  57468. +
  57469. +
  57470. + if(pmlmeext->cur_channel > 14)
  57471. + {
  57472. + if (pmlmeinfo->HT_enable)
  57473. + {
  57474. + network_type = WIRELESS_11_5N;
  57475. + }
  57476. +
  57477. + network_type |= WIRELESS_11A;
  57478. + }
  57479. + else
  57480. + {
  57481. + if (pmlmeinfo->HT_enable)
  57482. + {
  57483. + network_type = WIRELESS_11_24N;
  57484. + }
  57485. +
  57486. + if ((cckratesonly_included(rate, ratelen)) == _TRUE)
  57487. + {
  57488. + network_type |= WIRELESS_11B;
  57489. + }
  57490. + else if((cckrates_included(rate, ratelen)) == _TRUE)
  57491. + {
  57492. + network_type |= WIRELESS_11BG;
  57493. + }
  57494. + else
  57495. + {
  57496. + network_type |= WIRELESS_11G;
  57497. + }
  57498. + }
  57499. +
  57500. + return network_type;
  57501. +}
  57502. +
  57503. +unsigned char ratetbl_val_2wifirate(unsigned char rate);
  57504. +unsigned char ratetbl_val_2wifirate(unsigned char rate)
  57505. +{
  57506. + unsigned char val = 0;
  57507. +
  57508. + switch (rate & 0x7f)
  57509. + {
  57510. + case 0:
  57511. + val = IEEE80211_CCK_RATE_1MB;
  57512. + break;
  57513. +
  57514. + case 1:
  57515. + val = IEEE80211_CCK_RATE_2MB;
  57516. + break;
  57517. +
  57518. + case 2:
  57519. + val = IEEE80211_CCK_RATE_5MB;
  57520. + break;
  57521. +
  57522. + case 3:
  57523. + val = IEEE80211_CCK_RATE_11MB;
  57524. + break;
  57525. +
  57526. + case 4:
  57527. + val = IEEE80211_OFDM_RATE_6MB;
  57528. + break;
  57529. +
  57530. + case 5:
  57531. + val = IEEE80211_OFDM_RATE_9MB;
  57532. + break;
  57533. +
  57534. + case 6:
  57535. + val = IEEE80211_OFDM_RATE_12MB;
  57536. + break;
  57537. +
  57538. + case 7:
  57539. + val = IEEE80211_OFDM_RATE_18MB;
  57540. + break;
  57541. +
  57542. + case 8:
  57543. + val = IEEE80211_OFDM_RATE_24MB;
  57544. + break;
  57545. +
  57546. + case 9:
  57547. + val = IEEE80211_OFDM_RATE_36MB;
  57548. + break;
  57549. +
  57550. + case 10:
  57551. + val = IEEE80211_OFDM_RATE_48MB;
  57552. + break;
  57553. +
  57554. + case 11:
  57555. + val = IEEE80211_OFDM_RATE_54MB;
  57556. + break;
  57557. +
  57558. + }
  57559. +
  57560. + return val;
  57561. +
  57562. +}
  57563. +
  57564. +int is_basicrate(_adapter *padapter, unsigned char rate);
  57565. +int is_basicrate(_adapter *padapter, unsigned char rate)
  57566. +{
  57567. + int i;
  57568. + unsigned char val;
  57569. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57570. +
  57571. + for(i = 0; i < NumRates; i++)
  57572. + {
  57573. + val = pmlmeext->basicrate[i];
  57574. +
  57575. + if ((val != 0xff) && (val != 0xfe))
  57576. + {
  57577. + if (rate == ratetbl_val_2wifirate(val))
  57578. + {
  57579. + return _TRUE;
  57580. + }
  57581. + }
  57582. + }
  57583. +
  57584. + return _FALSE;
  57585. +}
  57586. +
  57587. +unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset);
  57588. +unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset)
  57589. +{
  57590. + int i;
  57591. + unsigned char rate;
  57592. + unsigned int len = 0;
  57593. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57594. +
  57595. + for (i = 0; i < NumRates; i++)
  57596. + {
  57597. + rate = pmlmeext->datarate[i];
  57598. +
  57599. + switch (rate)
  57600. + {
  57601. + case 0xff:
  57602. + return len;
  57603. +
  57604. + case 0xfe:
  57605. + continue;
  57606. +
  57607. + default:
  57608. + rate = ratetbl_val_2wifirate(rate);
  57609. +
  57610. + if (is_basicrate(padapter, rate) == _TRUE)
  57611. + {
  57612. + rate |= IEEE80211_BASIC_RATE_MASK;
  57613. + }
  57614. +
  57615. + rateset[len] = rate;
  57616. + len++;
  57617. + break;
  57618. + }
  57619. + }
  57620. + return len;
  57621. +}
  57622. +
  57623. +
  57624. +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)
  57625. +{
  57626. + unsigned char supportedrates[NumRates];
  57627. +
  57628. + _rtw_memset(supportedrates, 0, NumRates);
  57629. + *bssrate_len = ratetbl2rateset(padapter, supportedrates);
  57630. + _rtw_memcpy(pbssrate, supportedrates, *bssrate_len);
  57631. +}
  57632. +
  57633. +void UpdateBrateTbl(
  57634. + IN PADAPTER Adapter,
  57635. + IN u8 *mBratesOS
  57636. +)
  57637. +{
  57638. + u8 i;
  57639. + u8 rate;
  57640. +
  57641. + // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory.
  57642. + for(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)
  57643. + {
  57644. + rate = mBratesOS[i] & 0x7f;
  57645. + switch(rate)
  57646. + {
  57647. + case IEEE80211_CCK_RATE_1MB:
  57648. + case IEEE80211_CCK_RATE_2MB:
  57649. + case IEEE80211_CCK_RATE_5MB:
  57650. + case IEEE80211_CCK_RATE_11MB:
  57651. + case IEEE80211_OFDM_RATE_6MB:
  57652. + case IEEE80211_OFDM_RATE_12MB:
  57653. + case IEEE80211_OFDM_RATE_24MB:
  57654. + mBratesOS[i] |= IEEE80211_BASIC_RATE_MASK;
  57655. + break;
  57656. + }
  57657. + }
  57658. +
  57659. +}
  57660. +
  57661. +void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen)
  57662. +{
  57663. + u8 i;
  57664. + u8 rate;
  57665. +
  57666. + for(i=0;i<bssratelen;i++)
  57667. + {
  57668. + rate = bssrateset[i] & 0x7f;
  57669. + switch(rate)
  57670. + {
  57671. + case IEEE80211_CCK_RATE_1MB:
  57672. + case IEEE80211_CCK_RATE_2MB:
  57673. + case IEEE80211_CCK_RATE_5MB:
  57674. + case IEEE80211_CCK_RATE_11MB:
  57675. + bssrateset[i] |= IEEE80211_BASIC_RATE_MASK;
  57676. + break;
  57677. + }
  57678. + }
  57679. +
  57680. +}
  57681. +
  57682. +void Save_DM_Func_Flag(_adapter *padapter)
  57683. +{
  57684. + u8 bSaveFlag = _TRUE;
  57685. +
  57686. +#ifdef CONFIG_CONCURRENT_MODE
  57687. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  57688. + if(pbuddy_adapter)
  57689. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
  57690. +#endif
  57691. +
  57692. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
  57693. +
  57694. +}
  57695. +
  57696. +void Restore_DM_Func_Flag(_adapter *padapter)
  57697. +{
  57698. + u8 bSaveFlag = _FALSE;
  57699. +#ifdef CONFIG_CONCURRENT_MODE
  57700. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  57701. + if(pbuddy_adapter)
  57702. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
  57703. +#endif
  57704. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag));
  57705. +}
  57706. +
  57707. +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable)
  57708. +{
  57709. +#ifdef CONFIG_CONCURRENT_MODE
  57710. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  57711. +#endif
  57712. +
  57713. + if(enable == _TRUE)
  57714. + {
  57715. +#ifdef CONFIG_CONCURRENT_MODE
  57716. + if(pbuddy_adapter)
  57717. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
  57718. +#endif
  57719. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
  57720. + }
  57721. + else
  57722. + {
  57723. +#ifdef CONFIG_CONCURRENT_MODE
  57724. + if(pbuddy_adapter)
  57725. + rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
  57726. +#endif
  57727. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
  57728. + }
  57729. +
  57730. +#if 0
  57731. + u8 val8;
  57732. +
  57733. + val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH);
  57734. +
  57735. + if(enable == _TRUE)
  57736. + {
  57737. + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode));
  57738. + }
  57739. + else
  57740. + {
  57741. + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode));
  57742. + }
  57743. +#endif
  57744. +
  57745. +}
  57746. +
  57747. +static void Set_NETYPE1_MSR(_adapter *padapter, u8 type)
  57748. +{
  57749. + rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type));
  57750. +}
  57751. +
  57752. +static void Set_NETYPE0_MSR(_adapter *padapter, u8 type)
  57753. +{
  57754. + rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type));
  57755. +}
  57756. +
  57757. +void Set_MSR(_adapter *padapter, u8 type)
  57758. +{
  57759. +#ifdef CONFIG_CONCURRENT_MODE
  57760. + if(padapter->iface_type == IFACE_PORT1)
  57761. + {
  57762. + Set_NETYPE1_MSR(padapter, type);
  57763. + }
  57764. + else
  57765. +#endif
  57766. + {
  57767. + Set_NETYPE0_MSR(padapter, type);
  57768. + }
  57769. +}
  57770. +
  57771. +inline u8 rtw_get_oper_ch(_adapter *adapter)
  57772. +{
  57773. + return adapter_to_dvobj(adapter)->oper_channel;
  57774. +}
  57775. +
  57776. +inline void rtw_set_oper_ch(_adapter *adapter, u8 ch)
  57777. +{
  57778. + if (adapter_to_dvobj(adapter)->oper_channel != ch)
  57779. + adapter_to_dvobj(adapter)->on_oper_ch_time = rtw_get_current_time();
  57780. +
  57781. + adapter_to_dvobj(adapter)->oper_channel = ch;
  57782. +}
  57783. +
  57784. +inline u8 rtw_get_oper_bw(_adapter *adapter)
  57785. +{
  57786. + return adapter_to_dvobj(adapter)->oper_bwmode;
  57787. +}
  57788. +
  57789. +inline void rtw_set_oper_bw(_adapter *adapter, u8 bw)
  57790. +{
  57791. + adapter_to_dvobj(adapter)->oper_bwmode = bw;
  57792. +}
  57793. +
  57794. +inline u8 rtw_get_oper_choffset(_adapter *adapter)
  57795. +{
  57796. + return adapter_to_dvobj(adapter)->oper_ch_offset;
  57797. +}
  57798. +
  57799. +inline void rtw_set_oper_choffset(_adapter *adapter, u8 offset)
  57800. +{
  57801. + adapter_to_dvobj(adapter)->oper_ch_offset = offset;
  57802. +}
  57803. +
  57804. +inline u32 rtw_get_on_oper_ch_time(_adapter *adapter)
  57805. +{
  57806. + return adapter_to_dvobj(adapter)->on_oper_ch_time;
  57807. +}
  57808. +
  57809. +inline u32 rtw_get_on_cur_ch_time(_adapter *adapter)
  57810. +{
  57811. + if (adapter->mlmeextpriv.cur_channel == adapter_to_dvobj(adapter)->oper_channel)
  57812. + return adapter_to_dvobj(adapter)->on_oper_ch_time;
  57813. + else
  57814. + return 0;
  57815. +}
  57816. +
  57817. +void SelectChannel(_adapter *padapter, unsigned char channel)
  57818. +{
  57819. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57820. +
  57821. +#ifdef CONFIG_DUALMAC_CONCURRENT
  57822. + //saved channel info
  57823. + rtw_set_oper_ch(padapter, channel);
  57824. + dc_SelectChannel(padapter, channel);
  57825. +#else //CONFIG_DUALMAC_CONCURRENT
  57826. +
  57827. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  57828. +
  57829. + //saved channel info
  57830. + rtw_set_oper_ch(padapter, channel);
  57831. +
  57832. + rtw_hal_set_chan(padapter, channel);
  57833. +
  57834. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  57835. +
  57836. +#endif // CONFIG_DUALMAC_CONCURRENT
  57837. +}
  57838. +
  57839. +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset)
  57840. +{
  57841. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57842. +
  57843. +#ifdef CONFIG_DUALMAC_CONCURRENT
  57844. + //saved bw info
  57845. + rtw_set_oper_bw(padapter, bwmode);
  57846. + rtw_set_oper_choffset(padapter, channel_offset);
  57847. + dc_SetBWMode(padapter, bwmode, channel_offset);
  57848. +#else //CONFIG_DUALMAC_CONCURRENT
  57849. +
  57850. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);
  57851. +
  57852. + //saved bw info
  57853. + rtw_set_oper_bw(padapter, bwmode);
  57854. + rtw_set_oper_choffset(padapter, channel_offset);
  57855. +
  57856. + rtw_hal_set_bwmode(padapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset);
  57857. +
  57858. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);
  57859. +
  57860. +#endif // CONFIG_DUALMAC_CONCURRENT
  57861. +}
  57862. +
  57863. +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode)
  57864. +{
  57865. + u8 center_ch;
  57866. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57867. +
  57868. + if ( padapter->bNotifyChannelChange )
  57869. + {
  57870. + DBG_871X( "[%s] ch = %d, offset = %d, bwmode = %d\n", __FUNCTION__, channel, channel_offset, bwmode );
  57871. + }
  57872. +
  57873. + if((bwmode == HT_CHANNEL_WIDTH_20)||(channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE))
  57874. + {
  57875. + //SelectChannel(padapter, channel);
  57876. + center_ch = channel;
  57877. + }
  57878. + else
  57879. + {
  57880. + //switch to the proper channel
  57881. + if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
  57882. + {
  57883. + //SelectChannel(padapter, channel + 2);
  57884. + center_ch = channel + 2;
  57885. + }
  57886. + else
  57887. + {
  57888. + //SelectChannel(padapter, channel - 2);
  57889. + center_ch = channel - 2;
  57890. + }
  57891. + }
  57892. +
  57893. + //set Channel , must be independant for correct co_ch value/
  57894. +#ifdef CONFIG_DUALMAC_CONCURRENT
  57895. + //saved channel/bw info
  57896. + rtw_set_oper_ch(padapter, channel);
  57897. + rtw_set_oper_bw(padapter, bwmode);
  57898. + rtw_set_oper_choffset(padapter, channel_offset);
  57899. + dc_SelectChannel(padapter, center_ch);// set center channel
  57900. +#else //CONFIG_DUALMAC_CONCURRENT
  57901. +
  57902. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  57903. +
  57904. + //saved channel/bw info
  57905. + rtw_set_oper_ch(padapter, channel);
  57906. + rtw_set_oper_bw(padapter, bwmode);
  57907. + rtw_set_oper_choffset(padapter, channel_offset);
  57908. +
  57909. + rtw_hal_set_chan(padapter, center_ch);
  57910. +
  57911. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  57912. +
  57913. +#endif // CONFIG_DUALMAC_CONCURRENT
  57914. +
  57915. +
  57916. + //set BandWidth
  57917. + SetBWMode(padapter, bwmode, channel_offset);
  57918. +
  57919. +}
  57920. +
  57921. +int get_bsstype(unsigned short capability)
  57922. +{
  57923. + if (capability & BIT(0))
  57924. + {
  57925. + return WIFI_FW_AP_STATE;
  57926. + }
  57927. + else if (capability & BIT(1))
  57928. + {
  57929. + return WIFI_FW_ADHOC_STATE;
  57930. + }
  57931. + else
  57932. + {
  57933. + return 0;
  57934. + }
  57935. +}
  57936. +
  57937. +__inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork)
  57938. +{
  57939. + return (pnetwork->MacAddress);
  57940. +}
  57941. +
  57942. +u16 get_beacon_interval(WLAN_BSSID_EX *bss)
  57943. +{
  57944. + unsigned short val;
  57945. + _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2);
  57946. +
  57947. + return le16_to_cpu(val);
  57948. +
  57949. +}
  57950. +
  57951. +int is_client_associated_to_ap(_adapter *padapter)
  57952. +{
  57953. + struct mlme_ext_priv *pmlmeext;
  57954. + struct mlme_ext_info *pmlmeinfo;
  57955. +
  57956. + if(!padapter)
  57957. + return _FAIL;
  57958. +
  57959. + pmlmeext = &padapter->mlmeextpriv;
  57960. + pmlmeinfo = &(pmlmeext->mlmext_info);
  57961. +
  57962. + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE))
  57963. + {
  57964. + return _TRUE;
  57965. + }
  57966. + else
  57967. + {
  57968. + return _FAIL;
  57969. + }
  57970. +}
  57971. +
  57972. +int is_client_associated_to_ibss(_adapter *padapter)
  57973. +{
  57974. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57975. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  57976. +
  57977. + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))
  57978. + {
  57979. + return _TRUE;
  57980. + }
  57981. + else
  57982. + {
  57983. + return _FAIL;
  57984. + }
  57985. +}
  57986. +
  57987. +int is_IBSS_empty(_adapter *padapter)
  57988. +{
  57989. + unsigned int i;
  57990. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  57991. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  57992. +
  57993. + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++)
  57994. + {
  57995. + if (pmlmeinfo->FW_sta_info[i].status == 1)
  57996. + {
  57997. + return _FAIL;
  57998. + }
  57999. + }
  58000. +
  58001. + return _TRUE;
  58002. +
  58003. +}
  58004. +
  58005. +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval)
  58006. +{
  58007. + if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN)
  58008. + {
  58009. + return WAIT_FOR_BCN_TO_MIN;
  58010. + }
  58011. + else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX)
  58012. + {
  58013. + return WAIT_FOR_BCN_TO_MAX;
  58014. + }
  58015. + else
  58016. + {
  58017. + return ((bcn_interval << 2));
  58018. + }
  58019. +}
  58020. +
  58021. +void CAM_empty_entry(
  58022. + PADAPTER Adapter,
  58023. + u8 ucIndex
  58024. +)
  58025. +{
  58026. + rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));
  58027. +}
  58028. +
  58029. +void invalidate_cam_all(_adapter *padapter)
  58030. +{
  58031. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
  58032. +}
  58033. +#if 0
  58034. +static u32 _ReadCAM(_adapter *padapter ,u32 addr)
  58035. +{
  58036. + u32 count = 0, cmd;
  58037. + cmd = CAM_POLLINIG |addr ;
  58038. + rtw_write32(padapter, RWCAM, cmd);
  58039. +
  58040. + do{
  58041. + if(0 == (rtw_read32(padapter,REG_CAMCMD) & CAM_POLLINIG)){
  58042. + break;
  58043. + }
  58044. + }while(count++ < 100);
  58045. +
  58046. + return rtw_read32(padapter,REG_CAMREAD);
  58047. +}
  58048. +void read_cam(_adapter *padapter ,u8 entry)
  58049. +{
  58050. + u32 j,count = 0, addr, cmd;
  58051. + addr = entry << 3;
  58052. +
  58053. + printk("********* DUMP CAM Entry_#%02d***************\n",entry);
  58054. + for (j = 0; j < 6; j++)
  58055. + {
  58056. + cmd = _ReadCAM(padapter ,addr+j);
  58057. + printk("offset:0x%02x => 0x%08x \n",addr+j,cmd);
  58058. + }
  58059. + printk("*********************************\n");
  58060. +}
  58061. +#endif
  58062. +
  58063. +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
  58064. +{
  58065. + unsigned int i, val, addr;
  58066. + //unsigned int cmd;
  58067. + int j;
  58068. + u32 cam_val[2];
  58069. +
  58070. + addr = entry << 3;
  58071. +
  58072. + for (j = 5; j >= 0; j--)
  58073. + {
  58074. + switch (j)
  58075. + {
  58076. + case 0:
  58077. + val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
  58078. + break;
  58079. +
  58080. + case 1:
  58081. + val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
  58082. + break;
  58083. +
  58084. + default:
  58085. + i = (j - 2) << 2;
  58086. + val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
  58087. + break;
  58088. +
  58089. + }
  58090. +
  58091. + cam_val[0] = val;
  58092. + cam_val[1] = addr + (unsigned int)j;
  58093. +
  58094. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
  58095. +
  58096. + //rtw_write32(padapter, WCAMI, val);
  58097. +
  58098. + //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
  58099. + //rtw_write32(padapter, RWCAM, cmd);
  58100. +
  58101. + //DBG_871X("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val);
  58102. +
  58103. + }
  58104. +
  58105. +}
  58106. +
  58107. +void clear_cam_entry(_adapter *padapter, u8 entry)
  58108. +{
  58109. +#if 0
  58110. + u32 addr, val=0;
  58111. + u32 cam_val[2];
  58112. +
  58113. + addr = entry << 3;
  58114. +
  58115. +
  58116. + cam_val[0] = val;
  58117. + cam_val[1] = addr + (unsigned int)0;
  58118. +
  58119. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
  58120. +
  58121. +
  58122. +
  58123. + cam_val[0] = val;
  58124. + cam_val[1] = addr + (unsigned int)1;
  58125. +
  58126. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
  58127. +#else
  58128. +
  58129. + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  58130. +
  58131. + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
  58132. +
  58133. + write_cam(padapter, entry, 0, null_sta, null_key);
  58134. +
  58135. +#endif
  58136. +}
  58137. +
  58138. +int allocate_fw_sta_entry(_adapter *padapter)
  58139. +{
  58140. + unsigned int mac_id;
  58141. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58142. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58143. +
  58144. + for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++)
  58145. + {
  58146. + if (pmlmeinfo->FW_sta_info[mac_id].status == 0)
  58147. + {
  58148. + pmlmeinfo->FW_sta_info[mac_id].status = 1;
  58149. + pmlmeinfo->FW_sta_info[mac_id].retry = 0;
  58150. + break;
  58151. + }
  58152. + }
  58153. +
  58154. + return mac_id;
  58155. +}
  58156. +
  58157. +void flush_all_cam_entry(_adapter *padapter)
  58158. +{
  58159. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58160. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58161. +
  58162. +#ifdef CONFIG_CONCURRENT_MODE
  58163. +
  58164. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  58165. +
  58166. + //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))
  58167. + if(check_buddy_fwstate(padapter, _FW_LINKED) == _FALSE)
  58168. + {
  58169. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
  58170. + }
  58171. + else
  58172. + {
  58173. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
  58174. + {
  58175. + struct sta_priv *pstapriv = &padapter->stapriv;
  58176. + struct sta_info *psta;
  58177. + u8 cam_id;//cam_entry
  58178. +
  58179. + psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
  58180. + if(psta) {
  58181. + if(psta->state & WIFI_AP_STATE)
  58182. + {} //clear cam when ap free per sta_info
  58183. + else {
  58184. + if(psta->mac_id==2)
  58185. + cam_id = 5;
  58186. + else
  58187. + cam_id = 4;
  58188. + }
  58189. + //clear_cam_entry(padapter, cam_id);
  58190. + rtw_clearstakey_cmd(padapter, (u8*)psta, cam_id, _FALSE);
  58191. + }
  58192. + }
  58193. + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  58194. + {
  58195. + //clear cam when ap free per sta_info
  58196. + }
  58197. + }
  58198. +#else //CONFIG_CONCURRENT_MODE
  58199. +
  58200. + rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
  58201. +
  58202. +#endif //CONFIG_CONCURRENT_MODE
  58203. +
  58204. + _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
  58205. +
  58206. +}
  58207. +
  58208. +#if defined(CONFIG_P2P) && defined(CONFIG_WFD)
  58209. +int WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58210. +{
  58211. + struct registry_priv *pregpriv = &padapter->registrypriv;
  58212. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  58213. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58214. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58215. + struct wifidirect_info *pwdinfo;
  58216. + u8 wfd_ie[ 128 ] = { 0x00 };
  58217. + u32 wfd_ielen = 0;
  58218. +
  58219. +
  58220. + pwdinfo = &padapter->wdinfo;
  58221. + if ( rtw_get_wfd_ie( ( u8* ) pIE, pIE->Length, wfd_ie, &wfd_ielen ) )
  58222. + {
  58223. + u8 attr_content[ 10 ] = { 0x00 };
  58224. + u32 attr_contentlen = 0;
  58225. +
  58226. + printk( "[%s] Found WFD IE\n", __FUNCTION__ );
  58227. + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
  58228. + if ( attr_contentlen )
  58229. + {
  58230. + pwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );
  58231. + DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
  58232. + return( _TRUE );
  58233. + }
  58234. + }
  58235. + else
  58236. + {
  58237. + printk( "[%s] NO WFD IE\n", __FUNCTION__ );
  58238. +
  58239. + }
  58240. + return( _FAIL );
  58241. +}
  58242. +#endif
  58243. +
  58244. +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58245. +{
  58246. + //struct registry_priv *pregpriv = &padapter->registrypriv;
  58247. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  58248. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58249. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58250. +
  58251. + if(pmlmepriv->qospriv.qos_option==0)
  58252. + {
  58253. + pmlmeinfo->WMM_enable = 0;
  58254. + return _FAIL;
  58255. + }
  58256. +
  58257. + pmlmeinfo->WMM_enable = 1;
  58258. + _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
  58259. + return _TRUE;
  58260. +
  58261. + /*if (pregpriv->wifi_spec == 1)
  58262. + {
  58263. + if (pmlmeinfo->WMM_enable == 1)
  58264. + {
  58265. + //todo: compare the parameter set count & decide wheher to update or not
  58266. + return _FAIL;
  58267. + }
  58268. + else
  58269. + {
  58270. + pmlmeinfo->WMM_enable = 1;
  58271. + _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
  58272. + return _TRUE;
  58273. + }
  58274. + }
  58275. + else
  58276. + {
  58277. + pmlmeinfo->WMM_enable = 0;
  58278. + return _FAIL;
  58279. + }*/
  58280. +
  58281. +}
  58282. +
  58283. +void WMMOnAssocRsp(_adapter *padapter)
  58284. +{
  58285. + u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime;
  58286. + u8 acm_mask;
  58287. + u16 TXOP;
  58288. + u32 acParm, i;
  58289. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58290. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58291. +
  58292. + if (pmlmeinfo->WMM_enable == 0)
  58293. + {
  58294. + padapter->mlmepriv.acm_mask = 0;
  58295. + return;
  58296. + }
  58297. +
  58298. + acm_mask = 0;
  58299. +
  58300. + if( pmlmeext->cur_wireless_mode == WIRELESS_11B)
  58301. + aSifsTime = 10;
  58302. + else
  58303. + aSifsTime = 16;
  58304. +
  58305. + for (i = 0; i < 4; i++)
  58306. + {
  58307. + ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03;
  58308. + ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01;
  58309. +
  58310. + //AIFS = AIFSN * slot time + SIFS - r2t phy delay
  58311. + AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime;
  58312. +
  58313. + ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f);
  58314. + ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4;
  58315. + TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit);
  58316. +
  58317. + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);
  58318. +
  58319. + switch (ACI)
  58320. + {
  58321. + case 0x0:
  58322. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));
  58323. + acm_mask |= (ACM? BIT(1):0);
  58324. + break;
  58325. +
  58326. + case 0x1:
  58327. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));
  58328. + //acm_mask |= (ACM? BIT(0):0);
  58329. + break;
  58330. +
  58331. + case 0x2:
  58332. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));
  58333. + acm_mask |= (ACM? BIT(2):0);
  58334. + break;
  58335. +
  58336. + case 0x3:
  58337. + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));
  58338. + acm_mask |= (ACM? BIT(3):0);
  58339. + break;
  58340. + }
  58341. +
  58342. + DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm);
  58343. + }
  58344. +
  58345. + if(padapter->registrypriv.acm_method == 1)
  58346. + rtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));
  58347. + else
  58348. + padapter->mlmepriv.acm_mask = acm_mask;
  58349. +
  58350. + return;
  58351. +}
  58352. +
  58353. +static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58354. +{
  58355. + unsigned char new_bwmode;
  58356. + unsigned char new_ch_offset;
  58357. + struct HT_info_element *pHT_info;
  58358. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  58359. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58360. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58361. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  58362. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  58363. + u8 cbw40_enable=0;
  58364. +
  58365. + if(!pIE)
  58366. + return;
  58367. +
  58368. + if(phtpriv->ht_option == _FALSE) return;
  58369. +
  58370. + if(pIE->Length > sizeof(struct HT_info_element))
  58371. + return;
  58372. +
  58373. + pHT_info = (struct HT_info_element *)pIE->data;
  58374. +
  58375. + if (pmlmeext->cur_channel > 14) {
  58376. + if (pregistrypriv->cbw40_enable & BIT(1))
  58377. + cbw40_enable = 1;
  58378. + } else {
  58379. + if (pregistrypriv->cbw40_enable & BIT(0))
  58380. + cbw40_enable = 1;
  58381. + }
  58382. +
  58383. + if((pHT_info->infos[0] & BIT(2)) && cbw40_enable )
  58384. + {
  58385. + new_bwmode = HT_CHANNEL_WIDTH_40;
  58386. +
  58387. + switch (pHT_info->infos[0] & 0x3)
  58388. + {
  58389. + case 1:
  58390. + new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  58391. + break;
  58392. +
  58393. + case 3:
  58394. + new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  58395. + break;
  58396. +
  58397. + default:
  58398. + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  58399. + break;
  58400. + }
  58401. + }
  58402. + else
  58403. + {
  58404. + new_bwmode = HT_CHANNEL_WIDTH_20;
  58405. + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  58406. + }
  58407. +
  58408. +
  58409. + if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset))
  58410. + {
  58411. + pmlmeinfo->bwmode_updated = _TRUE;
  58412. +
  58413. + pmlmeext->cur_bwmode = new_bwmode;
  58414. + pmlmeext->cur_ch_offset = new_ch_offset;
  58415. +
  58416. + //update HT info also
  58417. + HT_info_handler(padapter, pIE);
  58418. + }
  58419. + else
  58420. + {
  58421. + pmlmeinfo->bwmode_updated = _FALSE;
  58422. + }
  58423. +
  58424. +
  58425. + if(_TRUE == pmlmeinfo->bwmode_updated)
  58426. + {
  58427. + struct sta_info *psta;
  58428. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  58429. + struct sta_priv *pstapriv = &padapter->stapriv;
  58430. +
  58431. + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  58432. +
  58433. +
  58434. + //update ap's stainfo
  58435. + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
  58436. + if(psta)
  58437. + {
  58438. + struct ht_priv *phtpriv_sta = &psta->htpriv;
  58439. +
  58440. + if(phtpriv_sta->ht_option)
  58441. + {
  58442. + // bwmode
  58443. + phtpriv_sta->bwmode = pmlmeext->cur_bwmode;
  58444. + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;
  58445. + }
  58446. + else
  58447. + {
  58448. + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20;
  58449. + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  58450. + }
  58451. +
  58452. + }
  58453. +
  58454. + //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it!
  58455. +
  58456. + }
  58457. +
  58458. +}
  58459. +
  58460. +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58461. +{
  58462. + unsigned int i;
  58463. + u8 rf_type;
  58464. + u8 max_AMPDU_len, min_MPDU_spacing;
  58465. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58466. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58467. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  58468. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  58469. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  58470. +
  58471. + if(pIE==NULL) return;
  58472. +
  58473. + if(phtpriv->ht_option == _FALSE) return;
  58474. +
  58475. + pmlmeinfo->HT_caps_enable = 1;
  58476. +
  58477. + for (i = 0; i < (pIE->Length); i++)
  58478. + {
  58479. + if (i != 2)
  58480. + {
  58481. + // Commented by Albert 2010/07/12
  58482. + // Got the endian issue here.
  58483. + pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]);
  58484. + }
  58485. + else
  58486. + {
  58487. + //modify from fw by Thomas 2010/11/17
  58488. + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3))
  58489. + {
  58490. + max_AMPDU_len = (pIE->data[i] & 0x3);
  58491. + }
  58492. + else
  58493. + {
  58494. + max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);
  58495. + }
  58496. +
  58497. + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c))
  58498. + {
  58499. + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);
  58500. + }
  58501. + else
  58502. + {
  58503. + min_MPDU_spacing = (pIE->data[i] & 0x1c);
  58504. + }
  58505. +
  58506. + pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing;
  58507. + }
  58508. + }
  58509. +
  58510. + // Commented by Albert 2010/07/12
  58511. + // Have to handle the endian issue after copying.
  58512. + // HT_ext_caps didn't be used yet.
  58513. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info );
  58514. + pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps );
  58515. +
  58516. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  58517. +
  58518. + //update the MCS rates
  58519. + for (i = 0; i < 16; i++)
  58520. + {
  58521. + if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
  58522. + {
  58523. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  58524. + }
  58525. + else
  58526. + {
  58527. + #ifdef CONFIG_DISABLE_MCS13TO15
  58528. + if(pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40 && (pregistrypriv->wifi_spec!=1))
  58529. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
  58530. + else
  58531. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
  58532. + #else
  58533. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
  58534. + #endif //CONFIG_DISABLE_MCS13TO15
  58535. + }
  58536. + #ifdef RTL8192C_RECONFIG_TO_1T1R
  58537. + {
  58538. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  58539. + }
  58540. + #endif
  58541. +
  58542. + if(pregistrypriv->special_rf_path)
  58543. + pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  58544. +
  58545. + }
  58546. +
  58547. + return;
  58548. +}
  58549. +
  58550. +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58551. +{
  58552. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58553. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58554. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  58555. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  58556. +
  58557. + if(pIE==NULL) return;
  58558. +
  58559. + if(phtpriv->ht_option == _FALSE) return;
  58560. +
  58561. +
  58562. + if(pIE->Length > sizeof(struct HT_info_element))
  58563. + return;
  58564. +
  58565. + pmlmeinfo->HT_info_enable = 1;
  58566. + _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length);
  58567. +
  58568. + return;
  58569. +}
  58570. +
  58571. +void HTOnAssocRsp(_adapter *padapter)
  58572. +{
  58573. + unsigned char max_AMPDU_len;
  58574. + unsigned char min_MPDU_spacing;
  58575. + //struct registry_priv *pregpriv = &padapter->registrypriv;
  58576. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58577. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58578. +
  58579. + DBG_871X("%s\n", __FUNCTION__);
  58580. +
  58581. + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))
  58582. + {
  58583. + pmlmeinfo->HT_enable = 1;
  58584. + }
  58585. + else
  58586. + {
  58587. + pmlmeinfo->HT_enable = 0;
  58588. + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  58589. + return;
  58590. + }
  58591. +
  58592. + //handle A-MPDU parameter field
  58593. + /*
  58594. + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
  58595. + AMPDU_para [4:2]:Min MPDU Start Spacing
  58596. + */
  58597. + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;
  58598. +
  58599. + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
  58600. +
  58601. + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
  58602. +
  58603. + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
  58604. +
  58605. +#if 0 //move to rtw_update_ht_cap()
  58606. + if ((pregpriv->cbw40_enable) &&
  58607. + (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) &&
  58608. + (pmlmeinfo->HT_info.infos[0] & BIT(2)))
  58609. + {
  58610. + //switch to the 40M Hz mode accoring to the AP
  58611. + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40;
  58612. + switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
  58613. + {
  58614. + case HT_EXTCHNL_OFFSET_UPPER:
  58615. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  58616. + break;
  58617. +
  58618. + case HT_EXTCHNL_OFFSET_LOWER:
  58619. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  58620. + break;
  58621. +
  58622. + default:
  58623. + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  58624. + break;
  58625. + }
  58626. +
  58627. + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);
  58628. + }
  58629. +#endif
  58630. +
  58631. + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
  58632. +
  58633. +#if 0 //move to rtw_update_ht_cap()
  58634. + //
  58635. + // Config SM Power Save setting
  58636. + //
  58637. + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;
  58638. + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)
  58639. + {
  58640. + /*u8 i;
  58641. + //update the MCS rates
  58642. + for (i = 0; i < 16; i++)
  58643. + {
  58644. + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
  58645. + }*/
  58646. + DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__);
  58647. + }
  58648. +
  58649. + //
  58650. + // Config current HT Protection mode.
  58651. + //
  58652. + pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;
  58653. +#endif
  58654. +
  58655. +}
  58656. +
  58657. +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  58658. +{
  58659. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58660. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58661. +
  58662. + if(pIE->Length>1)
  58663. + return;
  58664. +
  58665. + pmlmeinfo->ERP_enable = 1;
  58666. + _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length);
  58667. +}
  58668. +
  58669. +void VCS_update(_adapter *padapter, struct sta_info *psta)
  58670. +{
  58671. + struct registry_priv *pregpriv = &padapter->registrypriv;
  58672. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58673. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58674. +
  58675. + switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */
  58676. + {
  58677. + case 0: //off
  58678. + psta->rtsen = 0;
  58679. + psta->cts2self = 0;
  58680. + break;
  58681. +
  58682. + case 1: //on
  58683. + if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */
  58684. + {
  58685. + psta->rtsen = 1;
  58686. + psta->cts2self = 0;
  58687. + }
  58688. + else
  58689. + {
  58690. + psta->rtsen = 0;
  58691. + psta->cts2self = 1;
  58692. + }
  58693. + break;
  58694. +
  58695. + case 2: //auto
  58696. + default:
  58697. + if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1)))
  58698. + {
  58699. + if (pregpriv->vcs_type == 1)
  58700. + {
  58701. + psta->rtsen = 1;
  58702. + psta->cts2self = 0;
  58703. + }
  58704. + else
  58705. + {
  58706. + psta->rtsen = 0;
  58707. + psta->cts2self = 1;
  58708. + }
  58709. + }
  58710. + else
  58711. + {
  58712. + psta->rtsen = 0;
  58713. + psta->cts2self = 0;
  58714. + }
  58715. + break;
  58716. + }
  58717. +}
  58718. +
  58719. +#ifdef CONFIG_TDLS
  58720. +int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)
  58721. +{
  58722. + u8 tdls_prohibited_bit = 0x40; //bit(38); TDLS_prohibited
  58723. +
  58724. + if(pkt_len < 5)
  58725. + {
  58726. + return _FALSE;
  58727. + }
  58728. +
  58729. + pframe += 4;
  58730. + if( (*pframe) & tdls_prohibited_bit )
  58731. + return _TRUE;
  58732. +
  58733. + return _FALSE;
  58734. +}
  58735. +#endif //CONFIG_TDLS
  58736. +
  58737. +void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
  58738. +{
  58739. + unsigned int i;
  58740. + unsigned int len;
  58741. + PNDIS_802_11_VARIABLE_IEs pIE;
  58742. +
  58743. +#ifdef CONFIG_TDLS
  58744. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  58745. + u8 tdls_prohibited[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; //bit(38): TDLS_prohibited
  58746. +#endif //CONFIG_TDLS
  58747. +
  58748. + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);
  58749. +
  58750. + for (i = 0; i < len;)
  58751. + {
  58752. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);
  58753. +
  58754. + switch (pIE->ElementID)
  58755. + {
  58756. +#if 0
  58757. + case _VENDOR_SPECIFIC_IE_:
  58758. + //todo: to update WMM paramter set while receiving beacon
  58759. + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM
  58760. + {
  58761. + (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0;
  58762. + }
  58763. + break;
  58764. +#endif
  58765. +
  58766. + case _HT_EXTRA_INFO_IE_: //HT info
  58767. + //HT_info_handler(padapter, pIE);
  58768. + bwmode_update_check(padapter, pIE);
  58769. + break;
  58770. +
  58771. + case _ERPINFO_IE_:
  58772. + ERP_IE_handler(padapter, pIE);
  58773. + VCS_update(padapter, psta);
  58774. + break;
  58775. +
  58776. +#ifdef CONFIG_TDLS
  58777. + case _EXT_CAP_IE_:
  58778. + if( check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE )
  58779. + ptdlsinfo->ap_prohibited = _TRUE;
  58780. + break;
  58781. +#endif //CONFIG_TDLS
  58782. + default:
  58783. + break;
  58784. + }
  58785. +
  58786. + i += (pIE->Length + 2);
  58787. + }
  58788. +}
  58789. +
  58790. +#ifdef CONFIG_DFS
  58791. +void process_csa_ie(_adapter *padapter, u8 *pframe, uint pkt_len)
  58792. +{
  58793. + unsigned int i;
  58794. + unsigned int len;
  58795. + PNDIS_802_11_VARIABLE_IEs pIE;
  58796. + u8 new_ch_no = 0;
  58797. +
  58798. + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);
  58799. +
  58800. + for (i = 0; i < len;)
  58801. + {
  58802. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);
  58803. +
  58804. + switch (pIE->ElementID)
  58805. + {
  58806. + case _CH_SWTICH_ANNOUNCE_:
  58807. + _rtw_memcpy(&new_ch_no, pIE->data+1, 1);
  58808. + rtw_set_csa_cmd(padapter, new_ch_no);
  58809. + break;
  58810. +
  58811. + default:
  58812. + break;
  58813. + }
  58814. +
  58815. + i += (pIE->Length + 2);
  58816. + }
  58817. +}
  58818. +#endif //CONFIG_DFS
  58819. +
  58820. +unsigned int is_ap_in_tkip(_adapter *padapter)
  58821. +{
  58822. + u32 i;
  58823. + PNDIS_802_11_VARIABLE_IEs pIE;
  58824. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58825. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58826. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  58827. +
  58828. + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY)
  58829. + {
  58830. + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)
  58831. + {
  58832. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);
  58833. +
  58834. + switch (pIE->ElementID)
  58835. + {
  58836. + case _VENDOR_SPECIFIC_IE_:
  58837. + if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4)))
  58838. + {
  58839. + return _TRUE;
  58840. + }
  58841. + break;
  58842. +
  58843. + case _RSN_IE_2_:
  58844. + if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4))
  58845. + {
  58846. + return _TRUE;
  58847. + }
  58848. +
  58849. + default:
  58850. + break;
  58851. + }
  58852. +
  58853. + i += (pIE->Length + 2);
  58854. + }
  58855. +
  58856. + return _FALSE;
  58857. + }
  58858. + else
  58859. + {
  58860. + return _FALSE;
  58861. + }
  58862. +
  58863. +}
  58864. +
  58865. +int wifirate2_ratetbl_inx(unsigned char rate);
  58866. +int wifirate2_ratetbl_inx(unsigned char rate)
  58867. +{
  58868. + int inx = 0;
  58869. + rate = rate & 0x7f;
  58870. +
  58871. + switch (rate)
  58872. + {
  58873. + case 54*2:
  58874. + inx = 11;
  58875. + break;
  58876. +
  58877. + case 48*2:
  58878. + inx = 10;
  58879. + break;
  58880. +
  58881. + case 36*2:
  58882. + inx = 9;
  58883. + break;
  58884. +
  58885. + case 24*2:
  58886. + inx = 8;
  58887. + break;
  58888. +
  58889. + case 18*2:
  58890. + inx = 7;
  58891. + break;
  58892. +
  58893. + case 12*2:
  58894. + inx = 6;
  58895. + break;
  58896. +
  58897. + case 9*2:
  58898. + inx = 5;
  58899. + break;
  58900. +
  58901. + case 6*2:
  58902. + inx = 4;
  58903. + break;
  58904. +
  58905. + case 11*2:
  58906. + inx = 3;
  58907. + break;
  58908. + case 11:
  58909. + inx = 2;
  58910. + break;
  58911. +
  58912. + case 2*2:
  58913. + inx = 1;
  58914. + break;
  58915. +
  58916. + case 1*2:
  58917. + inx = 0;
  58918. + break;
  58919. +
  58920. + }
  58921. + return inx;
  58922. +}
  58923. +
  58924. +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz)
  58925. +{
  58926. + unsigned int i, num_of_rate;
  58927. + unsigned int mask = 0;
  58928. +
  58929. + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;
  58930. +
  58931. + for (i = 0; i < num_of_rate; i++)
  58932. + {
  58933. + if ((*(ptn + i)) & 0x80)
  58934. + {
  58935. + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));
  58936. + }
  58937. + }
  58938. + return mask;
  58939. +}
  58940. +
  58941. +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz)
  58942. +{
  58943. + unsigned int i, num_of_rate;
  58944. + unsigned int mask = 0;
  58945. +
  58946. + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;
  58947. +
  58948. + for (i = 0; i < num_of_rate; i++)
  58949. + {
  58950. + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));
  58951. + }
  58952. +
  58953. + return mask;
  58954. +}
  58955. +
  58956. +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps)
  58957. +{
  58958. + unsigned int mask = 0;
  58959. +
  58960. + mask = ((pHT_caps->u.HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 20));
  58961. +
  58962. + return mask;
  58963. +}
  58964. +
  58965. +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps)
  58966. +{
  58967. + unsigned char bit_offset;
  58968. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  58969. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  58970. +
  58971. + if (!(pmlmeinfo->HT_enable))
  58972. + return _FAIL;
  58973. +
  58974. + if ((pmlmeinfo->assoc_AP_vendor == ralinkAP))
  58975. + return _FAIL;
  58976. +
  58977. + bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40)? 6: 5;
  58978. +
  58979. + if (pHT_caps->u.HT_cap_element.HT_caps_info & (0x1 << bit_offset))
  58980. + {
  58981. + return _SUCCESS;
  58982. + }
  58983. + else
  58984. + {
  58985. + return _FAIL;
  58986. + }
  58987. +}
  58988. +
  58989. +unsigned char get_highest_rate_idx(u32 mask)
  58990. +{
  58991. + int i;
  58992. + unsigned char rate_idx=0;
  58993. +
  58994. + for(i=27; i>=0; i--)
  58995. + {
  58996. + if(mask & BIT(i))
  58997. + {
  58998. + rate_idx = i;
  58999. + break;
  59000. + }
  59001. + }
  59002. +
  59003. + return rate_idx;
  59004. +}
  59005. +
  59006. +unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps);
  59007. +unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps)
  59008. +{
  59009. + int i, mcs_rate;
  59010. +
  59011. + mcs_rate = (pHT_caps->u.HT_cap_element.MCS_rate[0] | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 8));
  59012. +
  59013. + for (i = 15; i >= 0; i--)
  59014. + {
  59015. + if (mcs_rate & (0x1 << i))
  59016. + {
  59017. + break;
  59018. + }
  59019. + }
  59020. +
  59021. + return i;
  59022. +}
  59023. +
  59024. +void Update_RA_Entry(_adapter *padapter, u32 mac_id)
  59025. +{
  59026. + rtw_hal_update_ra_mask(padapter, mac_id);
  59027. +}
  59028. +
  59029. +void enable_rate_adaptive(_adapter *padapter, u32 mac_id);
  59030. +void enable_rate_adaptive(_adapter *padapter, u32 mac_id)
  59031. +{
  59032. + Update_RA_Entry(padapter, mac_id);
  59033. +}
  59034. +
  59035. +void set_sta_rate(_adapter *padapter, struct sta_info *psta)
  59036. +{
  59037. + //rate adaptive
  59038. + enable_rate_adaptive(padapter, psta->mac_id);
  59039. +}
  59040. +
  59041. +// Update RRSR and Rate for USERATE
  59042. +void update_tx_basic_rate(_adapter *padapter, u8 wirelessmode)
  59043. +{
  59044. + NDIS_802_11_RATES_EX supported_rates;
  59045. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  59046. +#ifdef CONFIG_P2P
  59047. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  59048. +
  59049. + // Added by Albert 2011/03/22
  59050. + // In the P2P mode, the driver should not support the b mode.
  59051. + // So, the Tx packet shouldn't use the CCK rate
  59052. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  59053. + return;
  59054. +#endif //CONFIG_P2P
  59055. +#ifdef CONFIG_INTEL_WIDI
  59056. + if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE)
  59057. + return;
  59058. +#endif //CONFIG_INTEL_WIDI
  59059. +
  59060. + _rtw_memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);
  59061. +
  59062. + //clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band.
  59063. + if(pmlmeext->cur_channel > 14)
  59064. + wirelessmode &= ~(WIRELESS_11B);
  59065. +
  59066. + if ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) {
  59067. + _rtw_memcpy(supported_rates, rtw_basic_rate_cck, 4);
  59068. + } else if (wirelessmode & WIRELESS_11B) {
  59069. + _rtw_memcpy(supported_rates, rtw_basic_rate_mix, 7);
  59070. + } else {
  59071. + _rtw_memcpy(supported_rates, rtw_basic_rate_ofdm, 3);
  59072. + }
  59073. +
  59074. + if (wirelessmode & WIRELESS_11B)
  59075. + update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
  59076. + else
  59077. + update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);
  59078. +
  59079. + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, supported_rates);
  59080. +}
  59081. +
  59082. +unsigned char check_assoc_AP(u8 *pframe, uint len)
  59083. +{
  59084. + unsigned int i;
  59085. + PNDIS_802_11_VARIABLE_IEs pIE;
  59086. +
  59087. + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;)
  59088. + {
  59089. + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i);
  59090. +
  59091. + switch (pIE->ElementID)
  59092. + {
  59093. + case _VENDOR_SPECIFIC_IE_:
  59094. + if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3)))
  59095. + {
  59096. + DBG_871X("link to Artheros AP\n");
  59097. + return atherosAP;
  59098. + }
  59099. + else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3))
  59100. + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))
  59101. + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)))
  59102. + {
  59103. + DBG_871X("link to Broadcom AP\n");
  59104. + return broadcomAP;
  59105. + }
  59106. + else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3))
  59107. + {
  59108. + DBG_871X("link to Marvell AP\n");
  59109. + return marvellAP;
  59110. + }
  59111. + else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3))
  59112. + {
  59113. + DBG_871X("link to Ralink AP\n");
  59114. + return ralinkAP;
  59115. + }
  59116. + else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3))
  59117. + {
  59118. + DBG_871X("link to Cisco AP\n");
  59119. + return ciscoAP;
  59120. + }
  59121. + else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3))
  59122. + {
  59123. + DBG_871X("link to Realtek 96B\n");
  59124. + return realtekAP;
  59125. + }
  59126. + else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3))
  59127. + {
  59128. + DBG_871X("link to Airgo Cap\n");
  59129. + return airgocapAP;
  59130. + }
  59131. + else
  59132. + {
  59133. + break;
  59134. + }
  59135. +
  59136. + default:
  59137. + break;
  59138. + }
  59139. +
  59140. + i += (pIE->Length + 2);
  59141. + }
  59142. +
  59143. + DBG_871X("link to new AP\n");
  59144. + return unknownAP;
  59145. +}
  59146. +
  59147. +void update_IOT_info(_adapter *padapter)
  59148. +{
  59149. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  59150. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59151. +
  59152. + switch (pmlmeinfo->assoc_AP_vendor)
  59153. + {
  59154. + case marvellAP:
  59155. + pmlmeinfo->turboMode_cts2self = 1;
  59156. + pmlmeinfo->turboMode_rtsen = 0;
  59157. + break;
  59158. +
  59159. + case ralinkAP:
  59160. + pmlmeinfo->turboMode_cts2self = 0;
  59161. + pmlmeinfo->turboMode_rtsen = 1;
  59162. + //disable high power
  59163. + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE);
  59164. + break;
  59165. + case realtekAP:
  59166. + //rtw_write16(padapter, 0x4cc, 0xffff);
  59167. + //rtw_write16(padapter, 0x546, 0x01c0);
  59168. + //disable high power
  59169. + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE);
  59170. + break;
  59171. + default:
  59172. + pmlmeinfo->turboMode_cts2self = 0;
  59173. + pmlmeinfo->turboMode_rtsen = 1;
  59174. + break;
  59175. + }
  59176. +
  59177. +}
  59178. +
  59179. +void update_capinfo(PADAPTER Adapter, u16 updateCap)
  59180. +{
  59181. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  59182. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59183. + BOOLEAN ShortPreamble;
  59184. +
  59185. + // Check preamble mode, 2005.01.06, by rcnjko.
  59186. + // Mark to update preamble value forever, 2008.03.18 by lanhsin
  59187. + //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO )
  59188. + {
  59189. +
  59190. + if(updateCap & cShortPreamble)
  59191. + { // Short Preamble
  59192. + if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO
  59193. + {
  59194. + ShortPreamble = _TRUE;
  59195. + pmlmeinfo->preamble_mode = PREAMBLE_SHORT;
  59196. + rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );
  59197. + }
  59198. + }
  59199. + else
  59200. + { // Long Preamble
  59201. + if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO
  59202. + {
  59203. + ShortPreamble = _FALSE;
  59204. + pmlmeinfo->preamble_mode = PREAMBLE_LONG;
  59205. + rtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );
  59206. + }
  59207. + }
  59208. + }
  59209. +
  59210. + if ( updateCap & cIBSS ) {
  59211. + //Filen: See 802.11-2007 p.91
  59212. + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
  59213. + }
  59214. + else
  59215. + {
  59216. + //Filen: See 802.11-2007 p.90
  59217. + if( pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N))
  59218. + {
  59219. + if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */)
  59220. + { // Short Slot Time
  59221. + if(pmlmeinfo->slotTime != SHORT_SLOT_TIME)
  59222. + {
  59223. + pmlmeinfo->slotTime = SHORT_SLOT_TIME;
  59224. + }
  59225. + }
  59226. + else
  59227. + { // Long Slot Time
  59228. + if(pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME)
  59229. + {
  59230. + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
  59231. + }
  59232. + }
  59233. + }
  59234. + else if( pmlmeext->cur_wireless_mode & (WIRELESS_11A | WIRELESS_11_5N))
  59235. + {
  59236. + pmlmeinfo->slotTime = SHORT_SLOT_TIME;
  59237. + }
  59238. + else
  59239. + {
  59240. + //B Mode
  59241. + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;
  59242. + }
  59243. + }
  59244. +
  59245. + rtw_hal_set_hwreg( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime );
  59246. +
  59247. +}
  59248. +
  59249. +void update_wireless_mode(_adapter *padapter)
  59250. +{
  59251. + u8 init_rate=0;
  59252. + int ratelen, network_type = 0;
  59253. + u32 SIFS_Timer, mask;
  59254. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  59255. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59256. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  59257. + unsigned char *rate = cur_network->SupportedRates;
  59258. +#ifdef CONFIG_CONCURRENT_MODE
  59259. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  59260. +#endif //CONFIG_CONCURRENT_MODE
  59261. +
  59262. + ratelen = rtw_get_rateset_len(cur_network->SupportedRates);
  59263. +
  59264. + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))
  59265. + {
  59266. + pmlmeinfo->HT_enable = 1;
  59267. + }
  59268. +
  59269. + if(pmlmeext->cur_channel > 14)
  59270. + {
  59271. + if (pmlmeinfo->HT_enable)
  59272. + {
  59273. + network_type = WIRELESS_11_5N;
  59274. + }
  59275. +
  59276. + network_type |= WIRELESS_11A;
  59277. + }
  59278. + else
  59279. + {
  59280. + if (pmlmeinfo->HT_enable)
  59281. + {
  59282. + network_type = WIRELESS_11_24N;
  59283. + }
  59284. +
  59285. + if ((cckratesonly_included(rate, ratelen)) == _TRUE)
  59286. + {
  59287. + network_type |= WIRELESS_11B;
  59288. + }
  59289. + else if((cckrates_included(rate, ratelen)) == _TRUE)
  59290. + {
  59291. + network_type |= WIRELESS_11BG;
  59292. + }
  59293. + else
  59294. + {
  59295. + network_type |= WIRELESS_11G;
  59296. + }
  59297. + }
  59298. +
  59299. + pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode;
  59300. +
  59301. + //For STA mode, driver need to modify initial data rate, or MAC will use wrong tx rate.
  59302. + //Modified by Thomas 2012-12-3
  59303. + mask = update_supported_rate(cur_network->SupportedRates, ratelen);
  59304. + init_rate = get_highest_rate_idx(mask)&0x3f;
  59305. + rtw_hal_set_hwreg( padapter, HW_VAR_INIT_DATA_RATE, (u8 *)&init_rate);
  59306. +
  59307. +/*
  59308. + if((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||
  59309. + (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G)
  59310. + SIFS_Timer = 0x0a0a;//CCK
  59311. + else
  59312. + SIFS_Timer = 0x0e0e;//pHalData->SifsTime; //OFDM
  59313. +*/
  59314. +
  59315. + SIFS_Timer = 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM
  59316. + //change this value if having IOT issues.
  59317. +
  59318. + rtw_hal_set_hwreg( padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer);
  59319. +
  59320. + if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
  59321. + update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
  59322. + else
  59323. + {
  59324. + update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);
  59325. +#ifdef CONFIG_CONCURRENT_MODE
  59326. + if(pbuddy_adapter && (pmlmeext->cur_wireless_mode & WIRELESS_11A))
  59327. + update_mgnt_tx_rate(pbuddy_adapter, IEEE80211_OFDM_RATE_6MB);
  59328. +#endif //CONFIG_CONCURRENT_MODE
  59329. + }
  59330. +}
  59331. +
  59332. +void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value);
  59333. +void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value)
  59334. +{
  59335. +#if 0
  59336. + struct cmd_obj *ph2c;
  59337. + struct reg_rw_parm *pwriteMacPara;
  59338. + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
  59339. +
  59340. + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
  59341. + {
  59342. + return;
  59343. + }
  59344. +
  59345. + if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL)
  59346. + {
  59347. + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
  59348. + return;
  59349. + }
  59350. +
  59351. + pwriteMacPara->rw = 1;
  59352. + pwriteMacPara->addr = addr;
  59353. + pwriteMacPara->value = value;
  59354. +
  59355. + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG));
  59356. + rtw_enqueue_cmd(pcmdpriv, ph2c);
  59357. +#endif
  59358. +}
  59359. +
  59360. +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id)
  59361. +{
  59362. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  59363. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59364. +
  59365. + if(pmlmeext->cur_wireless_mode & WIRELESS_11B)
  59366. + {
  59367. + // Only B, B/G, and B/G/N AP could use CCK rate
  59368. + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_cck, 4);
  59369. + }
  59370. + else
  59371. + {
  59372. + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), rtw_basic_rate_ofdm, 3);
  59373. + }
  59374. +}
  59375. +
  59376. +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx)
  59377. +{
  59378. + unsigned int ie_len;
  59379. + PNDIS_802_11_VARIABLE_IEs pIE;
  59380. + int supportRateNum = 0;
  59381. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  59382. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59383. +
  59384. + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
  59385. + if (pIE == NULL)
  59386. + {
  59387. + return _FAIL;
  59388. + }
  59389. +
  59390. + _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len);
  59391. + supportRateNum = ie_len;
  59392. +
  59393. + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len);
  59394. + if (pIE)
  59395. + {
  59396. + _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len);
  59397. + }
  59398. +
  59399. + return _SUCCESS;
  59400. +
  59401. +}
  59402. +
  59403. +void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr)
  59404. +{
  59405. + struct sta_info *psta;
  59406. + u16 tid, start_seq, param;
  59407. + struct recv_reorder_ctrl *preorder_ctrl;
  59408. + struct sta_priv *pstapriv = &padapter->stapriv;
  59409. + struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req;
  59410. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  59411. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59412. +
  59413. + psta = rtw_get_stainfo(pstapriv, addr);
  59414. +
  59415. + if(psta)
  59416. + {
  59417. + start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4;
  59418. +
  59419. + param = le16_to_cpu(preq->BA_para_set);
  59420. + tid = (param>>2)&0x0f;
  59421. +
  59422. + preorder_ctrl = &psta->recvreorder_ctrl[tid];
  59423. +
  59424. + #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ
  59425. + preorder_ctrl->indicate_seq = start_seq;
  59426. + #ifdef DBG_RX_SEQ
  59427. + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__,
  59428. + preorder_ctrl->indicate_seq, start_seq);
  59429. + #endif
  59430. + #else
  59431. + preorder_ctrl->indicate_seq = 0xffff;
  59432. + #endif
  59433. +
  59434. + preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE;
  59435. + }
  59436. +
  59437. +}
  59438. +
  59439. +void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
  59440. +{
  59441. + u8* pIE;
  59442. + u32 *pbuf;
  59443. +
  59444. + pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  59445. + pbuf = (u32*)pIE;
  59446. +
  59447. + pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1));
  59448. +
  59449. + pmlmeext->TSFValue = pmlmeext->TSFValue << 32;
  59450. +
  59451. + pmlmeext->TSFValue |= le32_to_cpu(*pbuf);
  59452. +}
  59453. +
  59454. +void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext)
  59455. +{
  59456. + rtw_hal_set_hwreg(padapter, HW_VAR_CORRECT_TSF, 0);
  59457. +}
  59458. +
  59459. +void beacon_timing_control(_adapter *padapter)
  59460. +{
  59461. + rtw_hal_bcn_related_reg_setting(padapter);
  59462. +}
  59463. +
  59464. +#if 0
  59465. +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame)
  59466. +{
  59467. + unsigned short ATIMWindow;
  59468. + unsigned char *pframe;
  59469. + struct tx_desc *ptxdesc;
  59470. + struct rtw_ieee80211_hdr *pwlanhdr;
  59471. + unsigned short *fctrl;
  59472. + unsigned int rate_len, len = 0;
  59473. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  59474. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  59475. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  59476. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  59477. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  59478. +
  59479. + _rtw_memset(beacon_frame, 0, 256);
  59480. +
  59481. + pframe = beacon_frame + TXDESC_SIZE;
  59482. +
  59483. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  59484. +
  59485. + fctrl = &(pwlanhdr->frame_ctl);
  59486. + *(fctrl) = 0;
  59487. +
  59488. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  59489. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  59490. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
  59491. +
  59492. + SetFrameSubType(pframe, WIFI_BEACON);
  59493. +
  59494. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  59495. + len = sizeof(struct rtw_ieee80211_hdr_3addr);
  59496. +
  59497. + //timestamp will be inserted by hardware
  59498. + pframe += 8;
  59499. + len += 8;
  59500. +
  59501. + // beacon interval: 2 bytes
  59502. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
  59503. +
  59504. + pframe += 2;
  59505. + len += 2;
  59506. +
  59507. + // capability info: 2 bytes
  59508. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
  59509. +
  59510. + pframe += 2;
  59511. + len += 2;
  59512. +
  59513. + // SSID
  59514. + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len);
  59515. +
  59516. + // supported rates...
  59517. + rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
  59518. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len);
  59519. +
  59520. + // DS parameter set
  59521. + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len);
  59522. +
  59523. + // IBSS Parameter Set...
  59524. + //ATIMWindow = cur->Configuration.ATIMWindow;
  59525. + ATIMWindow = 0;
  59526. + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len);
  59527. +
  59528. + //todo: ERP IE
  59529. +
  59530. + // EXTERNDED SUPPORTED RATE
  59531. + if (rate_len > 8)
  59532. + {
  59533. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len);
  59534. + }
  59535. +
  59536. + if ((len + TXDESC_SIZE) > 256)
  59537. + {
  59538. + //DBG_871X("marc: beacon frame too large\n");
  59539. + return 0;
  59540. + }
  59541. +
  59542. + //fill the tx descriptor
  59543. + ptxdesc = (struct tx_desc *)beacon_frame;
  59544. +
  59545. + //offset 0
  59546. + ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff);
  59547. + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc
  59548. +
  59549. + //offset 4
  59550. + ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00);
  59551. +
  59552. + //offset 8
  59553. + ptxdesc->txdw2 |= cpu_to_le32(BMC);
  59554. + ptxdesc->txdw2 |= cpu_to_le32(BK);
  59555. +
  59556. + //offset 16
  59557. + ptxdesc->txdw4 = 0x80000000;
  59558. +
  59559. + //offset 20
  59560. + ptxdesc->txdw5 = 0x00000000; //1M
  59561. +
  59562. + return (len + TXDESC_SIZE);
  59563. +}
  59564. +#endif
  59565. +
  59566. +static _adapter *pbuddy_padapter = NULL;
  59567. +
  59568. +int rtw_handle_dualmac(_adapter *adapter, bool init)
  59569. +{
  59570. + int status = _SUCCESS;
  59571. + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  59572. +
  59573. + if (!IS_HARDWARE_TYPE_8192D(adapter))
  59574. + goto exit;
  59575. +
  59576. + if (init) {
  59577. + rtw_hal_get_def_var(adapter, HAL_DEF_DUAL_MAC_MODE, &dvobj->DualMacMode);
  59578. + if (dvobj->DualMacMode == _TRUE) {
  59579. + // temply disable IPS For 92D-VC
  59580. + adapter->registrypriv.ips_mode = IPS_NONE;
  59581. + }
  59582. +
  59583. + /* For SMSP on 92DU-VC, driver do not probe another Interface. */
  59584. + if ((dvobj->DualMacMode != _TRUE) && (dvobj->InterfaceNumber != 0)) {
  59585. + DBG_871X("%s(): Do not init another Interface because SMSP\n",__FUNCTION__);
  59586. + status = _FAIL;
  59587. + goto exit;
  59588. + }
  59589. +
  59590. +#ifndef CONFIG_CONCURRENT_MODE
  59591. + if (dvobj->DualMacMode == _TRUE) {
  59592. + if (pbuddy_padapter == NULL) {
  59593. + pbuddy_padapter = adapter;
  59594. + DBG_871X("%s(): pbuddy_padapter == NULL, Set pbuddy_padapter\n",__FUNCTION__);
  59595. + } else {
  59596. + adapter->pbuddy_adapter = pbuddy_padapter;
  59597. + pbuddy_padapter->pbuddy_adapter = adapter;
  59598. + // clear global value
  59599. + pbuddy_padapter = NULL;
  59600. + DBG_871X("%s(): pbuddy_padapter exist, Exchange Information\n",__FUNCTION__);
  59601. + }
  59602. + }
  59603. +
  59604. +#ifdef CONFIG_DUALMAC_CONCURRENT
  59605. + if (dvobj->InterfaceNumber == 0) {
  59606. + //set adapter_type/iface type
  59607. + adapter->isprimary = _TRUE;
  59608. + adapter->adapter_type = PRIMARY_ADAPTER;
  59609. + adapter->iface_type = IFACE_PORT0;
  59610. + DBG_871X("%s(): PRIMARY_ADAPTER\n",__FUNCTION__);
  59611. + } else {
  59612. + //set adapter_type/iface type
  59613. + adapter->isprimary = _FALSE;
  59614. + adapter->adapter_type = SECONDARY_ADAPTER;
  59615. + adapter->iface_type = IFACE_PORT1;
  59616. + DBG_871X("%s(): SECONDARY_ADAPTER\n",__FUNCTION__);
  59617. + }
  59618. +#endif
  59619. +#endif
  59620. + }else {
  59621. + pbuddy_padapter = NULL;
  59622. + }
  59623. +exit:
  59624. + return status;
  59625. +}
  59626. --- /dev/null
  59627. +++ b/drivers/net/wireless/rtl8192cu/core/rtw_xmit.c
  59628. @@ -0,0 +1,4155 @@
  59629. +/******************************************************************************
  59630. + *
  59631. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  59632. + *
  59633. + * This program is free software; you can redistribute it and/or modify it
  59634. + * under the terms of version 2 of the GNU General Public License as
  59635. + * published by the Free Software Foundation.
  59636. + *
  59637. + * This program is distributed in the hope that it will be useful, but WITHOUT
  59638. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  59639. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  59640. + * more details.
  59641. + *
  59642. + * You should have received a copy of the GNU General Public License along with
  59643. + * this program; if not, write to the Free Software Foundation, Inc.,
  59644. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  59645. + *
  59646. + *
  59647. + ******************************************************************************/
  59648. +#define _RTW_XMIT_C_
  59649. +
  59650. +#include <drv_conf.h>
  59651. +#include <osdep_service.h>
  59652. +#include <drv_types.h>
  59653. +#include <rtw_byteorder.h>
  59654. +#include <wifi.h>
  59655. +#include <osdep_intf.h>
  59656. +#include <circ_buf.h>
  59657. +#include <ip.h>
  59658. +
  59659. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  59660. +#error "Shall be Linux or Windows, but not both!\n"
  59661. +#endif
  59662. +
  59663. +#ifdef PLATFORM_WINDOWS
  59664. +#include <if_ether.h>
  59665. +#endif
  59666. +
  59667. +#ifdef CONFIG_USB_HCI
  59668. +#include <usb_ops.h>
  59669. +#endif
  59670. +
  59671. +
  59672. +static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
  59673. +static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
  59674. +
  59675. +static void _init_txservq(struct tx_servq *ptxservq)
  59676. +{
  59677. +_func_enter_;
  59678. + _rtw_init_listhead(&ptxservq->tx_pending);
  59679. + _rtw_init_queue(&ptxservq->sta_pending);
  59680. + ptxservq->qcnt = 0;
  59681. +_func_exit_;
  59682. +}
  59683. +
  59684. +
  59685. +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
  59686. +{
  59687. +
  59688. +_func_enter_;
  59689. +
  59690. + _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv));
  59691. +
  59692. + _rtw_spinlock_init(&psta_xmitpriv->lock);
  59693. +
  59694. + //for(i = 0 ; i < MAX_NUMBLKS; i++)
  59695. + // _init_txservq(&(psta_xmitpriv->blk_q[i]));
  59696. +
  59697. + _init_txservq(&psta_xmitpriv->be_q);
  59698. + _init_txservq(&psta_xmitpriv->bk_q);
  59699. + _init_txservq(&psta_xmitpriv->vi_q);
  59700. + _init_txservq(&psta_xmitpriv->vo_q);
  59701. + _rtw_init_listhead(&psta_xmitpriv->legacy_dz);
  59702. + _rtw_init_listhead(&psta_xmitpriv->apsd);
  59703. +
  59704. +_func_exit_;
  59705. +
  59706. +}
  59707. +
  59708. +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
  59709. +{
  59710. + int i;
  59711. + struct xmit_buf *pxmitbuf;
  59712. + struct xmit_frame *pxframe;
  59713. + sint res=_SUCCESS;
  59714. +
  59715. +_func_enter_;
  59716. +
  59717. + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
  59718. + //_rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));
  59719. +
  59720. + _rtw_spinlock_init(&pxmitpriv->lock);
  59721. + _rtw_spinlock_init(&pxmitpriv->lock_sctx);
  59722. + _rtw_init_sema(&pxmitpriv->xmit_sema, 0);
  59723. + _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0);
  59724. +
  59725. + /*
  59726. + Please insert all the queue initializaiton using _rtw_init_queue below
  59727. + */
  59728. +
  59729. + pxmitpriv->adapter = padapter;
  59730. +
  59731. + //for(i = 0 ; i < MAX_NUMBLKS; i++)
  59732. + // _rtw_init_queue(&pxmitpriv->blk_strms[i]);
  59733. +
  59734. + _rtw_init_queue(&pxmitpriv->be_pending);
  59735. + _rtw_init_queue(&pxmitpriv->bk_pending);
  59736. + _rtw_init_queue(&pxmitpriv->vi_pending);
  59737. + _rtw_init_queue(&pxmitpriv->vo_pending);
  59738. + _rtw_init_queue(&pxmitpriv->bm_pending);
  59739. +
  59740. + //_rtw_init_queue(&pxmitpriv->legacy_dz_queue);
  59741. + //_rtw_init_queue(&pxmitpriv->apsd_queue);
  59742. +
  59743. + _rtw_init_queue(&pxmitpriv->free_xmit_queue);
  59744. +
  59745. + /*
  59746. + Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
  59747. + and initialize free_xmit_frame below.
  59748. + Please also apply free_txobj to link_up all the xmit_frames...
  59749. + */
  59750. +
  59751. + pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
  59752. +
  59753. + if (pxmitpriv->pallocated_frame_buf == NULL){
  59754. + pxmitpriv->pxmit_frame_buf =NULL;
  59755. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n"));
  59756. + res= _FAIL;
  59757. + goto exit;
  59758. + }
  59759. + pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4);
  59760. + //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -
  59761. + // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3);
  59762. +
  59763. + pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
  59764. +
  59765. + for (i = 0; i < NR_XMITFRAME; i++)
  59766. + {
  59767. + _rtw_init_listhead(&(pxframe->list));
  59768. +
  59769. + pxframe->padapter = padapter;
  59770. + pxframe->frame_tag = NULL_FRAMETAG;
  59771. +
  59772. + pxframe->pkt = NULL;
  59773. +
  59774. + pxframe->buf_addr = NULL;
  59775. + pxframe->pxmitbuf = NULL;
  59776. +
  59777. + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));
  59778. +
  59779. + pxframe++;
  59780. + }
  59781. +
  59782. + pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
  59783. +
  59784. + pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
  59785. +
  59786. +
  59787. + //init xmit_buf
  59788. + _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);
  59789. + _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);
  59790. +
  59791. + pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
  59792. +
  59793. + if (pxmitpriv->pallocated_xmitbuf == NULL){
  59794. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n"));
  59795. + res= _FAIL;
  59796. + goto exit;
  59797. + }
  59798. +
  59799. + pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4);
  59800. + //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -
  59801. + // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3);
  59802. +
  59803. + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf;
  59804. +
  59805. + for (i = 0; i < NR_XMITBUFF; i++)
  59806. + {
  59807. + _rtw_init_listhead(&pxmitbuf->list);
  59808. +
  59809. + pxmitbuf->priv_data = NULL;
  59810. + pxmitbuf->padapter = padapter;
  59811. + pxmitbuf->ext_tag = _FALSE;
  59812. +
  59813. +/*
  59814. + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ);
  59815. + if (pxmitbuf->pallocated_buf == NULL)
  59816. + {
  59817. + res = _FAIL;
  59818. + goto exit;
  59819. + }
  59820. +
  59821. + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ);
  59822. + //pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -((SIZE_PTR) (pxmitbuf->pallocated_buf) &(XMITBUF_ALIGN_SZ-1));
  59823. +*/
  59824. +
  59825. + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ))) == _FAIL) {
  59826. + res= _FAIL;
  59827. + goto exit;
  59828. + }
  59829. +
  59830. +#ifdef CONFIG_SDIO_HCI
  59831. + pxmitbuf->phead = pxmitbuf->pbuf;
  59832. + pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ;
  59833. + pxmitbuf->len = 0;
  59834. + pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  59835. +#endif
  59836. +
  59837. + pxmitbuf->flags = XMIT_VO_QUEUE;
  59838. +
  59839. + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));
  59840. + #ifdef DBG_XMIT_BUF
  59841. + pxmitbuf->no=i;
  59842. + #endif
  59843. +
  59844. + pxmitbuf++;
  59845. +
  59846. + }
  59847. +
  59848. + pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
  59849. +
  59850. + /* init xframe_ext queue, the same count as extbuf */
  59851. + _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
  59852. +
  59853. + pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
  59854. +
  59855. + if (pxmitpriv->xframe_ext_alloc_addr == NULL){
  59856. + pxmitpriv->xframe_ext = NULL;
  59857. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xframe_ext fail!\n"));
  59858. + res= _FAIL;
  59859. + goto exit;
  59860. + }
  59861. + pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
  59862. + pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
  59863. +
  59864. + for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  59865. + _rtw_init_listhead(&(pxframe->list));
  59866. +
  59867. + pxframe->padapter = padapter;
  59868. + pxframe->frame_tag = NULL_FRAMETAG;
  59869. +
  59870. + pxframe->pkt = NULL;
  59871. +
  59872. + pxframe->buf_addr = NULL;
  59873. + pxframe->pxmitbuf = NULL;
  59874. +
  59875. + pxframe->ext_tag = 1;
  59876. +
  59877. + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue));
  59878. +
  59879. + pxframe++;
  59880. + }
  59881. + pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
  59882. +
  59883. + // Init xmit extension buff
  59884. + _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
  59885. +
  59886. + pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
  59887. +
  59888. + if (pxmitpriv->pallocated_xmit_extbuf == NULL){
  59889. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
  59890. + res= _FAIL;
  59891. + goto exit;
  59892. + }
  59893. +
  59894. + pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
  59895. +
  59896. + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
  59897. +
  59898. + for (i = 0; i < NR_XMIT_EXTBUFF; i++)
  59899. + {
  59900. + _rtw_init_listhead(&pxmitbuf->list);
  59901. +
  59902. + pxmitbuf->priv_data = NULL;
  59903. + pxmitbuf->padapter = padapter;
  59904. + pxmitbuf->ext_tag = _TRUE;
  59905. +
  59906. +/*
  59907. + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMIT_EXTBUF_SZ);
  59908. + if (pxmitbuf->pallocated_buf == NULL)
  59909. + {
  59910. + res = _FAIL;
  59911. + goto exit;
  59912. + }
  59913. +
  59914. + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), 4);
  59915. +*/
  59916. +
  59917. + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ)) == _FAIL) {
  59918. + res= _FAIL;
  59919. + goto exit;
  59920. + }
  59921. +
  59922. +#ifdef CONFIG_SDIO_HCI
  59923. + pxmitbuf->phead = pxmitbuf->pbuf;
  59924. + pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
  59925. + pxmitbuf->len = 0;
  59926. + pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  59927. +#endif
  59928. +
  59929. + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
  59930. + #ifdef DBG_XMIT_BUF
  59931. + pxmitbuf->no=i;
  59932. + #endif
  59933. + pxmitbuf++;
  59934. +
  59935. + }
  59936. +
  59937. + pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
  59938. +
  59939. + rtw_alloc_hwxmits(padapter);
  59940. + rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
  59941. +
  59942. +#ifdef CONFIG_USB_HCI
  59943. + pxmitpriv->txirp_cnt=1;
  59944. +
  59945. + _rtw_init_sema(&(pxmitpriv->tx_retevt), 0);
  59946. +
  59947. + //per AC pending irp
  59948. + pxmitpriv->beq_cnt = 0;
  59949. + pxmitpriv->bkq_cnt = 0;
  59950. + pxmitpriv->viq_cnt = 0;
  59951. + pxmitpriv->voq_cnt = 0;
  59952. +#endif
  59953. +
  59954. +
  59955. +#ifdef CONFIG_XMIT_ACK
  59956. + pxmitpriv->ack_tx = _FALSE;
  59957. + _rtw_mutex_init(&pxmitpriv->ack_tx_mutex);
  59958. + rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);
  59959. +#endif
  59960. +
  59961. + rtw_hal_init_xmit_priv(padapter);
  59962. +
  59963. +exit:
  59964. +
  59965. +_func_exit_;
  59966. +
  59967. + return res;
  59968. +}
  59969. +
  59970. +void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv);
  59971. +void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv)
  59972. +{
  59973. + _rtw_spinlock_free(&pxmitpriv->lock);
  59974. + _rtw_free_sema(&pxmitpriv->xmit_sema);
  59975. + _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema);
  59976. +
  59977. + _rtw_spinlock_free(&pxmitpriv->be_pending.lock);
  59978. + _rtw_spinlock_free(&pxmitpriv->bk_pending.lock);
  59979. + _rtw_spinlock_free(&pxmitpriv->vi_pending.lock);
  59980. + _rtw_spinlock_free(&pxmitpriv->vo_pending.lock);
  59981. + _rtw_spinlock_free(&pxmitpriv->bm_pending.lock);
  59982. +
  59983. + //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock);
  59984. + //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock);
  59985. +
  59986. + _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock);
  59987. + _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock);
  59988. + _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock);
  59989. +}
  59990. +
  59991. +
  59992. +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
  59993. +{
  59994. + int i;
  59995. + _adapter *padapter = pxmitpriv->adapter;
  59996. + struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
  59997. + struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
  59998. +
  59999. + _func_enter_;
  60000. +
  60001. + rtw_hal_free_xmit_priv(padapter);
  60002. +
  60003. + rtw_mfree_xmit_priv_lock(pxmitpriv);
  60004. +
  60005. + if(pxmitpriv->pxmit_frame_buf==NULL)
  60006. + goto out;
  60007. +
  60008. + for(i=0; i<NR_XMITFRAME; i++)
  60009. + {
  60010. + rtw_os_xmit_complete(padapter, pxmitframe);
  60011. +
  60012. + pxmitframe++;
  60013. + }
  60014. +
  60015. + for(i=0; i<NR_XMITBUFF; i++)
  60016. + {
  60017. + rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ));
  60018. +
  60019. + //if(pxmitbuf->pallocated_buf)
  60020. + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ);
  60021. +
  60022. + pxmitbuf++;
  60023. + }
  60024. +
  60025. + if(pxmitpriv->pallocated_frame_buf) {
  60026. + rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
  60027. + }
  60028. +
  60029. +
  60030. + if(pxmitpriv->pallocated_xmitbuf) {
  60031. + rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
  60032. + }
  60033. +
  60034. + /* free xframe_ext queue, the same count as extbuf */
  60035. + if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
  60036. + for (i=0; i<NR_XMIT_EXTBUFF; i++) {
  60037. + rtw_os_xmit_complete(padapter, pxmitframe);
  60038. + pxmitframe++;
  60039. + }
  60040. + }
  60041. + if (pxmitpriv->xframe_ext_alloc_addr)
  60042. + rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
  60043. + _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
  60044. +
  60045. + // free xmit extension buff
  60046. + _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
  60047. +
  60048. + pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
  60049. + for(i=0; i<NR_XMIT_EXTBUFF; i++)
  60050. + {
  60051. + rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ));
  60052. +
  60053. + //if(pxmitbuf->pallocated_buf)
  60054. + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMIT_EXTBUF_SZ);
  60055. +
  60056. + pxmitbuf++;
  60057. + }
  60058. +
  60059. + if(pxmitpriv->pallocated_xmit_extbuf) {
  60060. + rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
  60061. + }
  60062. +
  60063. + rtw_free_hwxmits(padapter);
  60064. +
  60065. +#ifdef CONFIG_XMIT_ACK
  60066. + _rtw_mutex_free(&pxmitpriv->ack_tx_mutex);
  60067. +#endif
  60068. +
  60069. +out:
  60070. +
  60071. +_func_exit_;
  60072. +
  60073. +}
  60074. +
  60075. +static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)
  60076. +{
  60077. + u32 sz;
  60078. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  60079. + struct sta_info *psta = pattrib->psta;
  60080. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  60081. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  60082. +
  60083. + if(pattrib->psta)
  60084. + {
  60085. + psta = pattrib->psta;
  60086. + }
  60087. + else
  60088. + {
  60089. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  60090. + psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
  60091. + }
  60092. +
  60093. + if(psta==NULL)
  60094. + {
  60095. + DBG_871X("%s, psta==NUL\n", __func__);
  60096. + return;
  60097. + }
  60098. +
  60099. + if(!(psta->state &_FW_LINKED))
  60100. + {
  60101. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  60102. + return;
  60103. + }
  60104. +
  60105. + if (pattrib->nr_frags != 1)
  60106. + {
  60107. + sz = padapter->xmitpriv.frag_len;
  60108. + }
  60109. + else //no frag
  60110. + {
  60111. + sz = pattrib->last_txcmdsz;
  60112. + }
  60113. +
  60114. + // (1) RTS_Threshold is compared to the MPDU, not MSDU.
  60115. + // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame.
  60116. + // Other fragments are protected by previous fragment.
  60117. + // So we only need to check the length of first fragment.
  60118. + if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec)
  60119. + {
  60120. + if(sz > padapter->registrypriv.rts_thresh)
  60121. + {
  60122. + pattrib->vcs_mode = RTS_CTS;
  60123. + }
  60124. + else
  60125. + {
  60126. + if(psta->rtsen)
  60127. + pattrib->vcs_mode = RTS_CTS;
  60128. + else if(psta->cts2self)
  60129. + pattrib->vcs_mode = CTS_TO_SELF;
  60130. + else
  60131. + pattrib->vcs_mode = NONE_VCS;
  60132. + }
  60133. + }
  60134. + else
  60135. + {
  60136. + while (_TRUE)
  60137. + {
  60138. +#if 0 //Todo
  60139. + //check IOT action
  60140. + if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
  60141. + {
  60142. + pattrib->vcs_mode = CTS_TO_SELF;
  60143. + pattrib->rts_rate = MGN_24M;
  60144. + break;
  60145. + }
  60146. + else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
  60147. + {
  60148. + pattrib->vcs_mode = RTS_CTS;
  60149. + pattrib->rts_rate = MGN_24M;
  60150. + break;
  60151. + }
  60152. +#endif
  60153. +
  60154. + //IOT action
  60155. + if((pmlmeinfo->assoc_AP_vendor == atherosAP) && (pattrib->ampdu_en==_TRUE) &&
  60156. + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
  60157. + {
  60158. + pattrib->vcs_mode = CTS_TO_SELF;
  60159. + break;
  60160. + }
  60161. +
  60162. +
  60163. + //check ERP protection
  60164. + if(psta->rtsen || psta->cts2self)
  60165. + {
  60166. + if(psta->rtsen)
  60167. + pattrib->vcs_mode = RTS_CTS;
  60168. + else if(psta->cts2self)
  60169. + pattrib->vcs_mode = CTS_TO_SELF;
  60170. +
  60171. + break;
  60172. + }
  60173. +
  60174. + //check HT op mode
  60175. + if(pattrib->ht_en)
  60176. + {
  60177. + u8 HTOpMode = pmlmeinfo->HT_protection;
  60178. + if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||
  60179. + (!pmlmeext->cur_bwmode && HTOpMode == 3) )
  60180. + {
  60181. + pattrib->vcs_mode = RTS_CTS;
  60182. + break;
  60183. + }
  60184. + }
  60185. +
  60186. + //check rts
  60187. + if(sz > padapter->registrypriv.rts_thresh)
  60188. + {
  60189. + pattrib->vcs_mode = RTS_CTS;
  60190. + break;
  60191. + }
  60192. +
  60193. + //to do list: check MIMO power save condition.
  60194. +
  60195. + //check AMPDU aggregation for TXOP
  60196. + if(pattrib->ampdu_en==_TRUE)
  60197. + {
  60198. + pattrib->vcs_mode = RTS_CTS;
  60199. + break;
  60200. + }
  60201. +
  60202. + pattrib->vcs_mode = NONE_VCS;
  60203. + break;
  60204. + }
  60205. + }
  60206. +}
  60207. +
  60208. +static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta)
  60209. +{
  60210. + /*if(psta->rtsen)
  60211. + pattrib->vcs_mode = RTS_CTS;
  60212. + else if(psta->cts2self)
  60213. + pattrib->vcs_mode = CTS_TO_SELF;
  60214. + else
  60215. + pattrib->vcs_mode = NONE_VCS;*/
  60216. +
  60217. + pattrib->mdata = 0;
  60218. + pattrib->eosp = 0;
  60219. + pattrib->triggered=0;
  60220. +
  60221. + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
  60222. + pattrib->qos_en = psta->qos_option;
  60223. + pattrib->ht_en = psta->htpriv.ht_option;
  60224. + pattrib->raid = psta->raid;
  60225. + pattrib->bwmode = psta->htpriv.bwmode;
  60226. + pattrib->ch_offset = psta->htpriv.ch_offset;
  60227. + pattrib->sgi= psta->htpriv.sgi;
  60228. + pattrib->ampdu_en = _FALSE;
  60229. +
  60230. + //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
  60231. + //{
  60232. + // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
  60233. + // pattrib->ampdu_en = _TRUE;
  60234. + //}
  60235. +
  60236. +
  60237. + pattrib->retry_ctrl = _FALSE;
  60238. +
  60239. +}
  60240. +
  60241. +u8 qos_acm(u8 acm_mask, u8 priority)
  60242. +{
  60243. + u8 change_priority = priority;
  60244. +
  60245. + switch (priority)
  60246. + {
  60247. + case 0:
  60248. + case 3:
  60249. + if(acm_mask & BIT(1))
  60250. + change_priority = 1;
  60251. + break;
  60252. + case 1:
  60253. + case 2:
  60254. + break;
  60255. + case 4:
  60256. + case 5:
  60257. + if(acm_mask & BIT(2))
  60258. + change_priority = 0;
  60259. + break;
  60260. + case 6:
  60261. + case 7:
  60262. + if(acm_mask & BIT(3))
  60263. + change_priority = 5;
  60264. + break;
  60265. + default:
  60266. + DBG_871X("qos_acm(): invalid pattrib->priority: %d!!!\n", priority);
  60267. + break;
  60268. + }
  60269. +
  60270. + return change_priority;
  60271. +}
  60272. +
  60273. +static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
  60274. +{
  60275. + struct ethhdr etherhdr;
  60276. + struct iphdr ip_hdr;
  60277. + s32 UserPriority = 0;
  60278. +
  60279. +
  60280. + _rtw_open_pktfile(ppktfile->pkt, ppktfile);
  60281. + _rtw_pktfile_read(ppktfile, (unsigned char*)&etherhdr, ETH_HLEN);
  60282. +
  60283. + // get UserPriority from IP hdr
  60284. + if (pattrib->ether_type == 0x0800) {
  60285. + _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
  60286. +// UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3;
  60287. + UserPriority = ip_hdr.tos >> 5;
  60288. + } else if (pattrib->ether_type == 0x888e) {
  60289. + // "When priority processing of data frames is supported,
  60290. + // a STA's SME should send EAPOL-Key frames at the highest priority."
  60291. + UserPriority = 7;
  60292. + }
  60293. +
  60294. + pattrib->priority = UserPriority;
  60295. + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
  60296. + pattrib->subtype = WIFI_QOS_DATA_TYPE;
  60297. +}
  60298. +
  60299. +static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
  60300. +{
  60301. + uint i;
  60302. + struct pkt_file pktfile;
  60303. + struct sta_info *psta = NULL;
  60304. + struct ethhdr etherhdr;
  60305. +
  60306. + sint bmcast;
  60307. + struct sta_priv *pstapriv = &padapter->stapriv;
  60308. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  60309. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  60310. + struct qos_priv *pqospriv= &pmlmepriv->qospriv;
  60311. + sint res = _SUCCESS;
  60312. +
  60313. + _func_enter_;
  60314. +
  60315. + _rtw_open_pktfile(pkt, &pktfile);
  60316. + i = _rtw_pktfile_read(&pktfile, (u8*)&etherhdr, ETH_HLEN);
  60317. +
  60318. + pattrib->ether_type = ntohs(etherhdr.h_proto);
  60319. +
  60320. +
  60321. + _rtw_memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
  60322. + _rtw_memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
  60323. +
  60324. + pattrib->pctrl = 0;
  60325. +
  60326. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  60327. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  60328. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  60329. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  60330. + }
  60331. + else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
  60332. + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  60333. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  60334. + }
  60335. + else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  60336. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  60337. + _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
  60338. + }
  60339. +
  60340. + pattrib->pktlen = pktfile.pkt_len;
  60341. +
  60342. + if (ETH_P_IP == pattrib->ether_type)
  60343. + {
  60344. + // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time
  60345. + // to prevent DHCP protocol fail
  60346. + u8 tmp[24];
  60347. + _rtw_pktfile_read(&pktfile, &tmp[0], 24);
  60348. + pattrib->dhcp_pkt = 0;
  60349. + if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) {
  60350. + if (ETH_P_IP == pattrib->ether_type) {// IP header
  60351. + if (((tmp[21] == 68) && (tmp[23] == 67)) ||
  60352. + ((tmp[21] == 67) && (tmp[23] == 68))) {
  60353. + // 68 : UDP BOOTP client
  60354. + // 67 : UDP BOOTP server
  60355. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n"));
  60356. + // Use low rate to send DHCP packet.
  60357. + //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
  60358. + //{
  60359. + // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m
  60360. + // tcb_desc->bTxDisableRateFallBack = false;
  60361. + //}
  60362. + //else
  60363. + // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate;
  60364. + //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate));
  60365. + pattrib->dhcp_pkt = 1;
  60366. + }
  60367. + }
  60368. + }
  60369. + }
  60370. +
  60371. + if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
  60372. + {
  60373. + rtw_set_scan_deny(padapter, 3000);
  60374. + }
  60375. +
  60376. +#ifdef CONFIG_LPS
  60377. + // If EAPOL , ARP , OR DHCP packet, driver must be in active mode.
  60378. + if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
  60379. + {
  60380. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
  60381. + }
  60382. +#endif
  60383. +
  60384. + bmcast = IS_MCAST(pattrib->ra);
  60385. +
  60386. + // get sta_info
  60387. + if (bmcast) {
  60388. + psta = rtw_get_bcmc_stainfo(padapter);
  60389. + } else {
  60390. + psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  60391. + if (psta == NULL) { // if we cannot get psta => drrp the pkt
  60392. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
  60393. + #ifdef DBG_TX_DROP_FRAME
  60394. + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
  60395. + #endif
  60396. + res =_FAIL;
  60397. + goto exit;
  60398. + }
  60399. + else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))
  60400. + {
  60401. + res =_FAIL;
  60402. + goto exit;
  60403. + }
  60404. + }
  60405. +
  60406. + if (psta)
  60407. + {
  60408. + pattrib->mac_id = psta->mac_id;
  60409. + pattrib->psta = psta;
  60410. + }
  60411. + else
  60412. + {
  60413. + // if we cannot get psta => drop the pkt
  60414. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
  60415. + #ifdef DBG_TX_DROP_FRAME
  60416. + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
  60417. + #endif
  60418. + res = _FAIL;
  60419. + goto exit;
  60420. + }
  60421. +
  60422. + pattrib->ack_policy = 0;
  60423. + // get ether_hdr_len
  60424. + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag
  60425. +
  60426. + pattrib->hdrlen = WLAN_HDR_A3_LEN;
  60427. + pattrib->subtype = WIFI_DATA_TYPE;
  60428. + pattrib->priority = 0;
  60429. +
  60430. + if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
  60431. + {
  60432. + if(psta->qos_option)
  60433. + set_qos(&pktfile, pattrib);
  60434. + }
  60435. + else
  60436. + {
  60437. + if(pqospriv->qos_option)
  60438. + {
  60439. + set_qos(&pktfile, pattrib);
  60440. +
  60441. + if(pmlmepriv->acm_mask != 0)
  60442. + {
  60443. + pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);
  60444. + }
  60445. + }
  60446. + }
  60447. +
  60448. + //pattrib->priority = 5; //force to used VI queue, for testing
  60449. +
  60450. + if (psta->ieee8021x_blocked == _TRUE)
  60451. + {
  60452. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n"));
  60453. +
  60454. + pattrib->encrypt = 0;
  60455. +
  60456. + if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE))
  60457. + {
  60458. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type));
  60459. + #ifdef DBG_TX_DROP_FRAME
  60460. + DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n", __FUNCTION__,pattrib->ether_type);
  60461. + #endif
  60462. + res = _FAIL;
  60463. + goto exit;
  60464. + }
  60465. + }
  60466. + else
  60467. + {
  60468. + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
  60469. +
  60470. + switch(psecuritypriv->dot11AuthAlgrthm)
  60471. + {
  60472. + case dot11AuthAlgrthm_Open:
  60473. + case dot11AuthAlgrthm_Shared:
  60474. + case dot11AuthAlgrthm_Auto:
  60475. + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
  60476. + break;
  60477. + case dot11AuthAlgrthm_8021X:
  60478. + if(bmcast)
  60479. + pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
  60480. + else
  60481. + pattrib->key_idx = 0;
  60482. + break;
  60483. + default:
  60484. + pattrib->key_idx = 0;
  60485. + break;
  60486. + }
  60487. +
  60488. +
  60489. + }
  60490. +
  60491. + switch (pattrib->encrypt)
  60492. + {
  60493. + case _WEP40_:
  60494. + case _WEP104_:
  60495. + pattrib->iv_len = 4;
  60496. + pattrib->icv_len = 4;
  60497. + break;
  60498. +
  60499. + case _TKIP_:
  60500. + pattrib->iv_len = 8;
  60501. + pattrib->icv_len = 4;
  60502. +
  60503. + if(padapter->securitypriv.busetkipkey==_FAIL)
  60504. + {
  60505. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npadapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", padapter->securitypriv.busetkipkey));
  60506. + #ifdef DBG_TX_DROP_FRAME
  60507. + DBG_871X("DBG_TX_DROP_FRAME %s padapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, padapter->securitypriv.busetkipkey);
  60508. + #endif
  60509. + res =_FAIL;
  60510. + goto exit;
  60511. + }
  60512. +
  60513. + break;
  60514. + case _AES_:
  60515. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n pattrib->encrypt=%d (_AES_)\n",pattrib->encrypt));
  60516. + pattrib->iv_len = 8;
  60517. + pattrib->icv_len = 8;
  60518. + break;
  60519. +
  60520. + default:
  60521. + pattrib->iv_len = 0;
  60522. + pattrib->icv_len = 0;
  60523. + break;
  60524. + }
  60525. +
  60526. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
  60527. + ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n",
  60528. + pattrib->encrypt, padapter->securitypriv.sw_encrypt));
  60529. +
  60530. + if (pattrib->encrypt &&
  60531. + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))
  60532. + {
  60533. + pattrib->bswenc = _TRUE;
  60534. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,
  60535. + ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n",
  60536. + pattrib->encrypt, padapter->securitypriv.sw_encrypt));
  60537. + } else {
  60538. + pattrib->bswenc = _FALSE;
  60539. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
  60540. + }
  60541. +
  60542. +#ifdef CONFIG_CONCURRENT_MODE
  60543. + if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
  60544. + {
  60545. + pattrib->bswenc = _TRUE;//force using sw enc.
  60546. + }
  60547. +#endif
  60548. +
  60549. + rtw_set_tx_chksum_offload(pkt, pattrib);
  60550. +
  60551. + update_attrib_phy_info(pattrib, psta);
  60552. +
  60553. +exit:
  60554. +
  60555. +_func_exit_;
  60556. +
  60557. + return res;
  60558. +}
  60559. +
  60560. +static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){
  60561. + sint curfragnum,length;
  60562. + u8 *pframe, *payload,mic[8];
  60563. + struct mic_data micdata;
  60564. + struct sta_info *stainfo;
  60565. + struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv);
  60566. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  60567. + struct security_priv *psecuritypriv=&padapter->securitypriv;
  60568. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  60569. + u8 priority[4]={0x0,0x0,0x0,0x0};
  60570. + sint bmcst = IS_MCAST(pattrib->ra);
  60571. +
  60572. + if(pattrib->psta)
  60573. + {
  60574. + stainfo = pattrib->psta;
  60575. + }
  60576. + else
  60577. + {
  60578. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  60579. + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
  60580. + }
  60581. +
  60582. + if(stainfo==NULL)
  60583. + {
  60584. + DBG_871X("%s, psta==NUL\n", __func__);
  60585. + return _FAIL;
  60586. + }
  60587. +
  60588. + if(!(stainfo->state &_FW_LINKED))
  60589. + {
  60590. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
  60591. + return _FAIL;
  60592. + }
  60593. +
  60594. +_func_enter_;
  60595. +
  60596. + if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_)
  60597. + {
  60598. + //encode mic code
  60599. + if(stainfo!= NULL){
  60600. + u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
  60601. +
  60602. +#ifdef CONFIG_USB_TX_AGGREGATION
  60603. + pframe = pxmitframe->buf_addr + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
  60604. +#else
  60605. + pframe = pxmitframe->buf_addr + TXDESC_OFFSET;
  60606. +#endif
  60607. +
  60608. + if(bmcst)
  60609. + {
  60610. + if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){
  60611. + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
  60612. + //rtw_msleep_os(10);
  60613. + return _FAIL;
  60614. + }
  60615. + //start to calculate the mic code
  60616. + rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
  60617. + }
  60618. + else
  60619. + {
  60620. + if(_rtw_memcmp(&stainfo->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){
  60621. + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
  60622. + //rtw_msleep_os(10);
  60623. + return _FAIL;
  60624. + }
  60625. + //start to calculate the mic code
  60626. + rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]);
  60627. + }
  60628. +
  60629. + if(pframe[1]&1){ //ToDS==1
  60630. + rtw_secmicappend(&micdata, &pframe[16], 6); //DA
  60631. + if(pframe[1]&2) //From Ds==1
  60632. + rtw_secmicappend(&micdata, &pframe[24], 6);
  60633. + else
  60634. + rtw_secmicappend(&micdata, &pframe[10], 6);
  60635. + }
  60636. + else{ //ToDS==0
  60637. + rtw_secmicappend(&micdata, &pframe[4], 6); //DA
  60638. + if(pframe[1]&2) //From Ds==1
  60639. + rtw_secmicappend(&micdata, &pframe[16], 6);
  60640. + else
  60641. + rtw_secmicappend(&micdata, &pframe[10], 6);
  60642. +
  60643. + }
  60644. +
  60645. + //if(pqospriv->qos_option==1)
  60646. + if(pattrib->qos_en)
  60647. + priority[0]=(u8)pxmitframe->attrib.priority;
  60648. +
  60649. +
  60650. + rtw_secmicappend(&micdata, &priority[0], 4);
  60651. +
  60652. + payload=pframe;
  60653. +
  60654. + for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
  60655. + payload=(u8 *)RND4((SIZE_PTR)(payload));
  60656. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n",
  60657. + curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7)));
  60658. +
  60659. + payload=payload+pattrib->hdrlen+pattrib->iv_len;
  60660. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len));
  60661. + if((curfragnum+1)==pattrib->nr_frags){
  60662. + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
  60663. + rtw_secmicappend(&micdata, payload,length);
  60664. + payload=payload+length;
  60665. + }
  60666. + else{
  60667. + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
  60668. + rtw_secmicappend(&micdata, payload, length);
  60669. + payload=payload+length+pattrib->icv_len;
  60670. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len));
  60671. + }
  60672. + }
  60673. + rtw_secgetmic(&micdata,&(mic[0]));
  60674. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n"));
  60675. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz));
  60676. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\
  60677. + mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n",
  60678. + mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7]));
  60679. + //add mic code and add the mic code length in last_txcmdsz
  60680. +
  60681. + _rtw_memcpy(payload, &(mic[0]),8);
  60682. + pattrib->last_txcmdsz+=8;
  60683. +
  60684. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n"));
  60685. + payload=payload-pattrib->last_txcmdsz+8;
  60686. + for(curfragnum=0;curfragnum<pattrib->last_txcmdsz;curfragnum=curfragnum+8)
  60687. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ",
  60688. + *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3),
  60689. + *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7)));
  60690. + }
  60691. + else{
  60692. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n"));
  60693. + }
  60694. + }
  60695. +
  60696. +_func_exit_;
  60697. +
  60698. + return _SUCCESS;
  60699. +}
  60700. +
  60701. +static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){
  60702. +
  60703. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  60704. + //struct security_priv *psecuritypriv=&padapter->securitypriv;
  60705. +
  60706. +_func_enter_;
  60707. +
  60708. + //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc))
  60709. + if(pattrib->bswenc)
  60710. + {
  60711. + //DBG_871X("start xmitframe_swencrypt\n");
  60712. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n"));
  60713. + switch(pattrib->encrypt){
  60714. + case _WEP40_:
  60715. + case _WEP104_:
  60716. + rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
  60717. + break;
  60718. + case _TKIP_:
  60719. + rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
  60720. + break;
  60721. + case _AES_:
  60722. + rtw_aes_encrypt(padapter, (u8 * )pxmitframe);
  60723. + break;
  60724. + default:
  60725. + break;
  60726. + }
  60727. +
  60728. + } else {
  60729. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n"));
  60730. + }
  60731. +
  60732. +_func_exit_;
  60733. +
  60734. + return _SUCCESS;
  60735. +}
  60736. +
  60737. +s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
  60738. +{
  60739. + u16 *qc;
  60740. +
  60741. + struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
  60742. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  60743. + struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  60744. + u8 qos_option = _FALSE;
  60745. +#ifdef CONFIG_TDLS
  60746. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  60747. + struct sta_priv *pstapriv = &padapter->stapriv;
  60748. + struct sta_info *ptdls_sta=NULL, *psta_backup=NULL;
  60749. + u8 direct_link=0;
  60750. +#endif //CONFIG_TDLS
  60751. +
  60752. + sint res = _SUCCESS;
  60753. + u16 *fctrl = &pwlanhdr->frame_ctl;
  60754. +
  60755. + struct sta_info *psta;
  60756. +
  60757. + sint bmcst = IS_MCAST(pattrib->ra);
  60758. +
  60759. +_func_enter_;
  60760. +
  60761. + if (pattrib->psta) {
  60762. + psta = pattrib->psta;
  60763. + } else {
  60764. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  60765. + if(bmcst) {
  60766. + psta = rtw_get_bcmc_stainfo(padapter);
  60767. + } else {
  60768. + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  60769. + }
  60770. + }
  60771. +
  60772. + if(psta==NULL)
  60773. + {
  60774. + DBG_871X("%s, psta==NUL\n", __func__);
  60775. + return _FAIL;
  60776. + }
  60777. +
  60778. + if(!(psta->state &_FW_LINKED))
  60779. + {
  60780. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  60781. + return _FAIL;
  60782. + }
  60783. +
  60784. + _rtw_memset(hdr, 0, WLANHDR_OFFSET);
  60785. +
  60786. + SetFrameSubType(fctrl, pattrib->subtype);
  60787. +
  60788. + if (pattrib->subtype & WIFI_DATA_TYPE)
  60789. + {
  60790. + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
  60791. + //to_ds = 1, fr_ds = 0;
  60792. +#ifdef CONFIG_TDLS
  60793. + if((ptdlsinfo->setup_state == TDLS_LINKED_STATE)){
  60794. + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  60795. + if((ptdls_sta!=NULL)&&(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&(pattrib->ether_type!=0x0806)){
  60796. + //TDLS data transfer, ToDS=0, FrDs=0
  60797. + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  60798. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  60799. + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  60800. + direct_link=1;
  60801. + }else{
  60802. + // 1.Data transfer to AP
  60803. + // 2.Arp pkt will relayed by AP
  60804. + SetToDs(fctrl);
  60805. + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  60806. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  60807. + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  60808. + }
  60809. + }else
  60810. +#endif //CONFIG_TDLS
  60811. + {
  60812. + //Data transfer to AP
  60813. + SetToDs(fctrl);
  60814. + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  60815. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  60816. + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  60817. + }
  60818. +
  60819. + if (pqospriv->qos_option)
  60820. + qos_option = _TRUE;
  60821. +
  60822. + }
  60823. + else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) {
  60824. + //to_ds = 0, fr_ds = 1;
  60825. + SetFrDs(fctrl);
  60826. + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  60827. + _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
  60828. + _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
  60829. +
  60830. + if(psta->qos_option)
  60831. + qos_option = _TRUE;
  60832. + }
  60833. + else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  60834. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  60835. + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  60836. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  60837. + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  60838. +
  60839. + if(psta->qos_option)
  60840. + qos_option = _TRUE;
  60841. + }
  60842. + else {
  60843. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
  60844. + res = _FAIL;
  60845. + goto exit;
  60846. + }
  60847. +
  60848. + if(pattrib->mdata)
  60849. + SetMData(fctrl);
  60850. +
  60851. + if (pattrib->encrypt)
  60852. + SetPrivacy(fctrl);
  60853. +
  60854. + if (qos_option)
  60855. + {
  60856. + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
  60857. +
  60858. + if (pattrib->priority)
  60859. + SetPriority(qc, pattrib->priority);
  60860. +
  60861. + SetEOSP(qc, pattrib->eosp);
  60862. +
  60863. + SetAckpolicy(qc, pattrib->ack_policy);
  60864. + }
  60865. +
  60866. + //TODO: fill HT Control Field
  60867. +
  60868. + //Update Seq Num will be handled by f/w
  60869. + {
  60870. + if(psta){
  60871. +#ifdef CONFIG_TDLS
  60872. + if(direct_link==1)
  60873. + {
  60874. + psta_backup = psta;
  60875. + psta = ptdls_sta;
  60876. + }
  60877. +#endif //CONFIG_TDLS
  60878. +
  60879. + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  60880. + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  60881. +
  60882. + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
  60883. +
  60884. + SetSeqNum(hdr, pattrib->seqnum);
  60885. +
  60886. +
  60887. + //check if enable ampdu
  60888. + if(pattrib->ht_en && psta->htpriv.ampdu_enable)
  60889. + {
  60890. + if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
  60891. + pattrib->ampdu_en = _TRUE;
  60892. + }
  60893. +
  60894. + //re-check if enable ampdu by BA_starting_seqctrl
  60895. + if(pattrib->ampdu_en == _TRUE)
  60896. + {
  60897. + u16 tx_seq;
  60898. +
  60899. + tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
  60900. +
  60901. + //check BA_starting_seqctrl
  60902. + if(SN_LESS(pattrib->seqnum, tx_seq))
  60903. + {
  60904. + //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq);
  60905. + pattrib->ampdu_en = _FALSE;//AGG BK
  60906. + }
  60907. + else if(SN_EQUAL(pattrib->seqnum, tx_seq))
  60908. + {
  60909. + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
  60910. +
  60911. + pattrib->ampdu_en = _TRUE;//AGG EN
  60912. + }
  60913. + else
  60914. + {
  60915. + //DBG_871X("tx ampdu over run\n");
  60916. + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
  60917. + pattrib->ampdu_en = _TRUE;//AGG EN
  60918. + }
  60919. +
  60920. + }
  60921. +
  60922. +#ifdef CONFIG_TDLS
  60923. + if(direct_link==1)
  60924. + {
  60925. + if (pattrib->encrypt){
  60926. + pattrib->encrypt= _AES_;
  60927. + pattrib->iv_len=8;
  60928. + pattrib->icv_len=8;
  60929. + }
  60930. +
  60931. + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
  60932. + //pattrib->qos_en = ptdls_sta->qos_option;
  60933. + pattrib->ht_en = ptdls_sta->htpriv.ht_option;
  60934. + pattrib->raid = ptdls_sta->raid;
  60935. + pattrib->bwmode = ptdls_sta->htpriv.bwmode;
  60936. + pattrib->ch_offset = ptdls_sta->htpriv.ch_offset;
  60937. + pattrib->sgi= ptdls_sta->htpriv.sgi;
  60938. +
  60939. + pattrib->mac_id = ptdls_sta->mac_id;
  60940. +
  60941. + psta = psta_backup;
  60942. + }
  60943. +#endif //CONFIG_TDLS
  60944. +
  60945. + }
  60946. + }
  60947. +
  60948. + }
  60949. + else
  60950. + {
  60951. +
  60952. + }
  60953. +
  60954. +exit:
  60955. +
  60956. +_func_exit_;
  60957. +
  60958. + return res;
  60959. +}
  60960. +
  60961. +s32 rtw_txframes_pending(_adapter *padapter)
  60962. +{
  60963. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  60964. +
  60965. + return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) ||
  60966. + (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) ||
  60967. + (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||
  60968. + (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));
  60969. +}
  60970. +
  60971. +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
  60972. +{
  60973. + struct sta_info *psta;
  60974. + struct tx_servq *ptxservq;
  60975. + int priority = pattrib->priority;
  60976. +
  60977. + if(pattrib->psta)
  60978. + {
  60979. + psta = pattrib->psta;
  60980. + }
  60981. + else
  60982. + {
  60983. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  60984. + psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
  60985. + }
  60986. +
  60987. + if(psta==NULL)
  60988. + {
  60989. + DBG_871X("%s, psta==NUL\n", __func__);
  60990. + return 0;
  60991. + }
  60992. +
  60993. + if(!(psta->state &_FW_LINKED))
  60994. + {
  60995. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  60996. + return 0;
  60997. + }
  60998. +
  60999. + switch(priority)
  61000. + {
  61001. + case 1:
  61002. + case 2:
  61003. + ptxservq = &(psta->sta_xmitpriv.bk_q);
  61004. + break;
  61005. + case 4:
  61006. + case 5:
  61007. + ptxservq = &(psta->sta_xmitpriv.vi_q);
  61008. + break;
  61009. + case 6:
  61010. + case 7:
  61011. + ptxservq = &(psta->sta_xmitpriv.vo_q);
  61012. + break;
  61013. + case 0:
  61014. + case 3:
  61015. + default:
  61016. + ptxservq = &(psta->sta_xmitpriv.be_q);
  61017. + break;
  61018. +
  61019. + }
  61020. +
  61021. + return ptxservq->qcnt;
  61022. +}
  61023. +
  61024. +#ifdef CONFIG_TDLS
  61025. +
  61026. +int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 action)
  61027. +{
  61028. + int res=_SUCCESS;
  61029. +
  61030. + switch(action){
  61031. + case TDLS_SETUP_REQUEST:
  61032. + rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe);
  61033. + break;
  61034. + case TDLS_SETUP_RESPONSE:
  61035. + rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe);
  61036. + break;
  61037. + case TDLS_SETUP_CONFIRM:
  61038. + rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe);
  61039. + break;
  61040. + case TDLS_TEARDOWN:
  61041. + rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe);
  61042. + break;
  61043. + case TDLS_DISCOVERY_REQUEST:
  61044. + rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe);
  61045. + break;
  61046. + case TDLS_PEER_TRAFFIC_INDICATION:
  61047. + rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe);
  61048. + break;
  61049. + case TDLS_CHANNEL_SWITCH_REQUEST:
  61050. + rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe);
  61051. + break;
  61052. + case TDLS_CHANNEL_SWITCH_RESPONSE:
  61053. + rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe);
  61054. + break;
  61055. +#ifdef CONFIG_WFD
  61056. + case TUNNELED_PROBE_REQ:
  61057. + rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
  61058. + break;
  61059. + case TUNNELED_PROBE_RSP:
  61060. + rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);
  61061. + break;
  61062. +#endif //CONFIG_WFD
  61063. + default:
  61064. + res=_FAIL;
  61065. + break;
  61066. + }
  61067. +
  61068. + return res;
  61069. +}
  61070. +
  61071. +s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, u8 action)
  61072. +{
  61073. + u16 *qc;
  61074. + struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
  61075. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  61076. + struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  61077. + struct sta_priv *pstapriv = &padapter->stapriv;
  61078. + struct sta_info *psta=NULL, *ptdls_sta=NULL;
  61079. + u8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  61080. +
  61081. + sint res = _SUCCESS;
  61082. + u16 *fctrl = &pwlanhdr->frame_ctl;
  61083. +
  61084. +_func_enter_;
  61085. +
  61086. + _rtw_memset(hdr, 0, WLANHDR_OFFSET);
  61087. +
  61088. + SetFrameSubType(fctrl, pattrib->subtype);
  61089. +
  61090. + switch(action){
  61091. + case TDLS_SETUP_REQUEST:
  61092. + case TDLS_SETUP_RESPONSE:
  61093. + case TDLS_SETUP_CONFIRM:
  61094. + case TDLS_TEARDOWN: //directly to peer STA or via AP
  61095. + case TDLS_PEER_TRAFFIC_INDICATION:
  61096. + case TDLS_PEER_PSM_REQUEST: //directly to peer STA or via AP
  61097. + case TUNNELED_PROBE_REQ:
  61098. + case TUNNELED_PROBE_RSP:
  61099. + SetToDs(fctrl);
  61100. + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  61101. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  61102. + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  61103. + break;
  61104. + case TDLS_CHANNEL_SWITCH_REQUEST:
  61105. + case TDLS_CHANNEL_SWITCH_RESPONSE:
  61106. + case TDLS_PEER_PSM_RESPONSE:
  61107. + case TDLS_PEER_TRAFFIC_RESPONSE:
  61108. + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  61109. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  61110. + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  61111. + tdls_seq=1;
  61112. + break;
  61113. + case TDLS_DISCOVERY_REQUEST: //unicast: directly to peer sta, Bcast: via AP
  61114. + if(_rtw_memcmp(pattrib->dst, baddr, ETH_ALEN) )
  61115. + {
  61116. + SetToDs(fctrl);
  61117. + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  61118. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  61119. + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  61120. + }
  61121. + else
  61122. + {
  61123. + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  61124. + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  61125. + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  61126. + tdls_seq=1;
  61127. + }
  61128. + break;
  61129. + }
  61130. +
  61131. + if (pattrib->encrypt)
  61132. + SetPrivacy(fctrl);
  61133. +
  61134. + if (pqospriv->qos_option)
  61135. + {
  61136. + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
  61137. + if (pattrib->priority)
  61138. + SetPriority(qc, pattrib->priority);
  61139. + SetAckpolicy(qc, pattrib->ack_policy);
  61140. + }
  61141. +
  61142. + psta = pattrib->psta;
  61143. +
  61144. + // 1. update seq_num per link by sta_info
  61145. + // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len
  61146. + if(tdls_seq==1){
  61147. + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
  61148. + if(ptdls_sta){
  61149. + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  61150. + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  61151. + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
  61152. + SetSeqNum(hdr, pattrib->seqnum);
  61153. +
  61154. + if (pattrib->encrypt){
  61155. + pattrib->encrypt= _AES_;
  61156. + pattrib->iv_len=8;
  61157. + pattrib->icv_len=8;
  61158. + }
  61159. + }else{
  61160. + res=_FAIL;
  61161. + goto exit;
  61162. + }
  61163. + }else if(psta){
  61164. + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  61165. + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  61166. + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
  61167. + SetSeqNum(hdr, pattrib->seqnum);
  61168. + }
  61169. +
  61170. +
  61171. +exit:
  61172. +
  61173. +_func_exit_;
  61174. +
  61175. + return res;
  61176. +}
  61177. +
  61178. +s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 action)
  61179. +{
  61180. + s32 llc_sz;
  61181. +
  61182. + u8 *pframe, *mem_start;
  61183. +
  61184. + struct sta_info *psta;
  61185. + struct sta_priv *pstapriv = &padapter->stapriv;
  61186. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  61187. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  61188. + u8 *pbuf_start;
  61189. + s32 bmcst = IS_MCAST(pattrib->ra);
  61190. + s32 res = _SUCCESS;
  61191. +
  61192. +_func_enter_;
  61193. +
  61194. + if (pattrib->psta) {
  61195. + psta = pattrib->psta;
  61196. + } else {
  61197. + if(bmcst) {
  61198. + psta = rtw_get_bcmc_stainfo(padapter);
  61199. + } else {
  61200. + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  61201. + }
  61202. + }
  61203. +
  61204. + if(psta==NULL)
  61205. + return _FAIL;
  61206. +
  61207. + if (pxmitframe->buf_addr == NULL)
  61208. + return _FAIL;
  61209. +
  61210. + pbuf_start = pxmitframe->buf_addr;
  61211. + mem_start = pbuf_start + TXDESC_OFFSET;
  61212. +
  61213. + if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, action) == _FAIL) {
  61214. + res = _FAIL;
  61215. + goto exit;
  61216. + }
  61217. +
  61218. + pframe = mem_start;
  61219. + pframe += pattrib->hdrlen;
  61220. +
  61221. + //adding icv, if necessary...
  61222. + if (pattrib->iv_len)
  61223. + {
  61224. + if (psta != NULL)
  61225. + {
  61226. + switch(pattrib->encrypt)
  61227. + {
  61228. + case _WEP40_:
  61229. + case _WEP104_:
  61230. + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61231. + break;
  61232. + case _TKIP_:
  61233. + if(bmcst)
  61234. + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61235. + else
  61236. + TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
  61237. + break;
  61238. + case _AES_:
  61239. + if(bmcst)
  61240. + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61241. + else
  61242. + AES_IV(pattrib->iv, psta->dot11txpn, 0);
  61243. + break;
  61244. + }
  61245. + }
  61246. +
  61247. + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  61248. + pframe += pattrib->iv_len;
  61249. +
  61250. + }
  61251. +
  61252. + llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
  61253. + pframe += llc_sz;
  61254. +
  61255. + //pattrib->pktlen will be counted in rtw_build_tdls_ies
  61256. + pattrib->pktlen = 0;
  61257. +
  61258. + rtw_build_tdls_ies(padapter, pxmitframe, pframe, action);
  61259. +
  61260. + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
  61261. + pframe += pattrib->pktlen;
  61262. + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  61263. + pframe += pattrib->icv_len;
  61264. + }
  61265. +
  61266. + pattrib->nr_frags = 1;
  61267. + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz +
  61268. + ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;
  61269. +
  61270. + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
  61271. + {
  61272. + goto exit;
  61273. + }
  61274. +
  61275. + xmitframe_swencrypt(padapter, pxmitframe);
  61276. +
  61277. + update_attrib_vcs_info(padapter, pxmitframe);
  61278. +
  61279. +exit:
  61280. +
  61281. +_func_exit_;
  61282. +
  61283. + return res;
  61284. +}
  61285. +#endif //CONFIG_TDLS
  61286. +
  61287. +/*
  61288. + * Calculate wlan 802.11 packet MAX size from pkt_attrib
  61289. + * This function doesn't consider fragment case
  61290. + */
  61291. +u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
  61292. +{
  61293. + u32 len = 0;
  61294. +
  61295. + len = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV
  61296. + len += SNAP_SIZE + sizeof(u16); // LLC
  61297. + len += pattrib->pktlen;
  61298. + if (pattrib->encrypt == _TKIP_) len += 8; // MIC
  61299. + len += pattrib->icv_len; // ICV
  61300. +
  61301. + return len;
  61302. +}
  61303. +
  61304. +/*
  61305. +
  61306. +This sub-routine will perform all the following:
  61307. +
  61308. +1. remove 802.3 header.
  61309. +2. create wlan_header, based on the info in pxmitframe
  61310. +3. append sta's iv/ext-iv
  61311. +4. append LLC
  61312. +5. move frag chunk from pframe to pxmitframe->mem
  61313. +6. apply sw-encrypt, if necessary.
  61314. +
  61315. +*/
  61316. +s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
  61317. +{
  61318. + struct pkt_file pktfile;
  61319. +
  61320. + s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
  61321. +
  61322. + SIZE_PTR addr;
  61323. +
  61324. + u8 *pframe, *mem_start;
  61325. +
  61326. + struct sta_info *psta;
  61327. + //struct sta_priv *pstapriv = &padapter->stapriv;
  61328. + //struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  61329. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  61330. +
  61331. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  61332. +
  61333. + u8 *pbuf_start;
  61334. +
  61335. + s32 bmcst = IS_MCAST(pattrib->ra);
  61336. + s32 res = _SUCCESS;
  61337. +
  61338. +_func_enter_;
  61339. +
  61340. + if (pattrib->psta)
  61341. + {
  61342. + psta = pattrib->psta;
  61343. + } else
  61344. + {
  61345. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  61346. + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  61347. + }
  61348. +
  61349. + if(psta==NULL)
  61350. + {
  61351. +
  61352. + DBG_871X("%s, psta==NUL\n", __func__);
  61353. + return _FAIL;
  61354. + }
  61355. +
  61356. +
  61357. + if(!(psta->state &_FW_LINKED))
  61358. + {
  61359. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  61360. + return _FAIL;
  61361. + }
  61362. +
  61363. + if (pxmitframe->buf_addr == NULL){
  61364. + DBG_8192C("==> %s buf_addr==NULL \n",__FUNCTION__);
  61365. + return _FAIL;
  61366. + }
  61367. +
  61368. + pbuf_start = pxmitframe->buf_addr;
  61369. +
  61370. +#ifdef CONFIG_USB_TX_AGGREGATION
  61371. + mem_start = pbuf_start + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
  61372. +#else
  61373. + mem_start = pbuf_start + TXDESC_OFFSET;
  61374. +#endif
  61375. +
  61376. + if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
  61377. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
  61378. + res = _FAIL;
  61379. + goto exit;
  61380. + }
  61381. +
  61382. + _rtw_open_pktfile(pkt, &pktfile);
  61383. + _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
  61384. +
  61385. + frg_inx = 0;
  61386. + frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342
  61387. +
  61388. + while (1)
  61389. + {
  61390. + llc_sz = 0;
  61391. +
  61392. + mpdu_len = frg_len;
  61393. +
  61394. + pframe = mem_start;
  61395. +
  61396. + SetMFrag(mem_start);
  61397. +
  61398. + pframe += pattrib->hdrlen;
  61399. + mpdu_len -= pattrib->hdrlen;
  61400. +
  61401. + //adding icv, if necessary...
  61402. + if (pattrib->iv_len)
  61403. + {
  61404. + //if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
  61405. + // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  61406. + //else
  61407. + // psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  61408. +
  61409. + if (psta != NULL)
  61410. + {
  61411. + switch(pattrib->encrypt)
  61412. + {
  61413. + case _WEP40_:
  61414. + case _WEP104_:
  61415. + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61416. + break;
  61417. + case _TKIP_:
  61418. + if(bmcst)
  61419. + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61420. + else
  61421. + TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
  61422. + break;
  61423. + case _AES_:
  61424. + if(bmcst)
  61425. + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  61426. + else
  61427. + AES_IV(pattrib->iv, psta->dot11txpn, 0);
  61428. + break;
  61429. + }
  61430. + }
  61431. +
  61432. + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  61433. +
  61434. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,
  61435. + ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
  61436. + padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3)));
  61437. +
  61438. + pframe += pattrib->iv_len;
  61439. +
  61440. + mpdu_len -= pattrib->iv_len;
  61441. + }
  61442. +
  61443. + if (frg_inx == 0) {
  61444. + llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
  61445. + pframe += llc_sz;
  61446. + mpdu_len -= llc_sz;
  61447. + }
  61448. +
  61449. + if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
  61450. + mpdu_len -= pattrib->icv_len;
  61451. + }
  61452. +
  61453. +
  61454. + if (bmcst) {
  61455. + // don't do fragment to broadcat/multicast packets
  61456. + mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
  61457. + } else {
  61458. + mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
  61459. + }
  61460. +
  61461. + pframe += mem_sz;
  61462. +
  61463. + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
  61464. + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  61465. + pframe += pattrib->icv_len;
  61466. + }
  61467. +
  61468. + frg_inx++;
  61469. +
  61470. + if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE))
  61471. + {
  61472. + pattrib->nr_frags = frg_inx;
  61473. +
  61474. + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) +
  61475. + ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
  61476. +
  61477. + ClearMFrag(mem_start);
  61478. +
  61479. + break;
  61480. + } else {
  61481. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __FUNCTION__));
  61482. + }
  61483. +
  61484. + addr = (SIZE_PTR)(pframe);
  61485. +
  61486. + mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET;
  61487. + _rtw_memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen);
  61488. + }
  61489. +
  61490. + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
  61491. + {
  61492. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"));
  61493. + res = _FAIL;
  61494. + goto exit;
  61495. + }
  61496. +
  61497. + xmitframe_swencrypt(padapter, pxmitframe);
  61498. +
  61499. + if(bmcst == _FALSE)
  61500. + update_attrib_vcs_info(padapter, pxmitframe);
  61501. + else
  61502. + pattrib->vcs_mode = NONE_VCS;
  61503. +
  61504. +exit:
  61505. +
  61506. +_func_exit_;
  61507. +
  61508. + return res;
  61509. +}
  61510. +
  61511. +#ifdef CONFIG_IEEE80211W
  61512. +//broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption
  61513. +s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
  61514. +{
  61515. + struct pkt_file pktfile;
  61516. + s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
  61517. + SIZE_PTR addr;
  61518. + u8 *pframe, *mem_start = NULL, *tmp_buf=NULL;
  61519. + u8 hw_hdr_offset, subtype ;
  61520. + struct sta_info *psta = NULL;
  61521. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  61522. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  61523. + u8 *pbuf_start;
  61524. + s32 bmcst = IS_MCAST(pattrib->ra);
  61525. + s32 res = _FAIL;
  61526. + u8 *BIP_AAD=NULL;
  61527. + u8 *MGMT_body=NULL;
  61528. +
  61529. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  61530. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  61531. + struct rtw_ieee80211_hdr *pwlanhdr;
  61532. + u8 MME[_MME_IE_LENGTH_];
  61533. +
  61534. + _irqL irqL;
  61535. + u32 ori_len;
  61536. + mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
  61537. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  61538. +
  61539. +_func_enter_;
  61540. + ori_len = BIP_AAD_SIZE+pattrib->pktlen;
  61541. + tmp_buf = BIP_AAD = rtw_zmalloc(ori_len);
  61542. + subtype = GetFrameSubType(pframe); //bit(7)~bit(2)
  61543. +
  61544. + if(BIP_AAD == NULL)
  61545. + return _FAIL;
  61546. +
  61547. + _enter_critical_bh(&padapter->security_key_mutex, &irqL);
  61548. +
  61549. + //only support station mode
  61550. + if(!check_fwstate(pmlmepriv, WIFI_STATION_STATE) || !check_fwstate(pmlmepriv, _FW_LINKED))
  61551. + goto xmitframe_coalesce_success;
  61552. +
  61553. + //IGTK key is not install, it may not support 802.11w
  61554. + if(padapter->securitypriv.binstallBIPkey != _TRUE)
  61555. + {
  61556. + DBG_871X("no instll BIP key\n");
  61557. + goto xmitframe_coalesce_success;
  61558. + }
  61559. + //station mode doesn't need TX BIP, just ready the code
  61560. + if(bmcst)
  61561. + {
  61562. + int frame_body_len;
  61563. + u8 mic[16];
  61564. +
  61565. + _rtw_memset(MME, 0, 18);
  61566. +
  61567. + //other types doesn't need the BIP
  61568. + if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)
  61569. + goto xmitframe_coalesce_fail;
  61570. +
  61571. + MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  61572. + pframe += pattrib->pktlen;
  61573. +
  61574. + //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0
  61575. + MME[0]=padapter->securitypriv.dot11wBIPKeyid;
  61576. + //copy packet number
  61577. + _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);
  61578. + //increase the packet number
  61579. + pmlmeext->mgnt_80211w_IPN++;
  61580. +
  61581. + //add MME IE with MIC all zero, MME string doesn't include element id and length
  61582. + pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));
  61583. + pattrib->last_txcmdsz = pattrib->pktlen;
  61584. + // total frame length - header length
  61585. + frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);
  61586. +
  61587. + //conscruct AAD, copy frame control field
  61588. + _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
  61589. + ClearRetry(BIP_AAD);
  61590. + ClearPwrMgt(BIP_AAD);
  61591. + ClearMData(BIP_AAD);
  61592. + //conscruct AAD, copy address 1 to address 3
  61593. + _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
  61594. + //copy management fram body
  61595. + _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len);
  61596. + /*//dump total packet include MME with zero MIC
  61597. + {
  61598. + int i;
  61599. + printk("Total packet: ");
  61600. + for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++)
  61601. + printk(" %02x ", BIP_AAD[i]);
  61602. + printk("\n");
  61603. + }*/
  61604. + //calculate mic
  61605. + if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
  61606. + , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic))
  61607. + goto xmitframe_coalesce_fail;
  61608. +
  61609. + /*//dump calculated mic result
  61610. + {
  61611. + int i;
  61612. + printk("Calculated mic result: ");
  61613. + for(i=0; i<16; i++)
  61614. + printk(" %02x ", mic[i]);
  61615. + printk("\n");
  61616. + }*/
  61617. + //copy right BIP mic value, total is 128bits, we use the 0~63 bits
  61618. + _rtw_memcpy(pframe-8, mic, 8);
  61619. + /*/dump all packet after mic ok
  61620. + {
  61621. + int pp;
  61622. + printk("pattrib->pktlen = %d \n", pattrib->pktlen);
  61623. + for(pp=0;pp< pattrib->pktlen; pp++)
  61624. + printk(" %02x ", mem_start[pp]);
  61625. + printk("\n");
  61626. + }*/
  61627. + }
  61628. + else //unicast mgmt frame TX
  61629. + {
  61630. + //start to encrypt mgmt frame
  61631. + if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
  61632. + subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION)
  61633. + {
  61634. + if (pattrib->psta)
  61635. + psta = pattrib->psta;
  61636. + else
  61637. + {
  61638. + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  61639. + }
  61640. +
  61641. + if(psta==NULL)
  61642. + {
  61643. +
  61644. + DBG_871X("%s, psta==NUL\n", __func__);
  61645. + goto xmitframe_coalesce_fail;
  61646. + }
  61647. +
  61648. + if(!(psta->state & _FW_LINKED) || pxmitframe->buf_addr==NULL)
  61649. + {
  61650. + DBG_871X("%s, not _FW_LINKED or addr null\n", __func__);
  61651. + goto xmitframe_coalesce_fail;
  61652. + }
  61653. +
  61654. + //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]);
  61655. + //according 802.11-2012 standard, these five types are not robust types
  61656. + if(subtype == WIFI_ACTION &&
  61657. + (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||
  61658. + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||
  61659. + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||
  61660. + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED ||
  61661. + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))
  61662. + goto xmitframe_coalesce_fail;
  61663. + //before encrypt dump the management packet content
  61664. + /*{
  61665. + int i;
  61666. + printk("Management pkt: ");
  61667. + for(i=0; i<pattrib->pktlen; i++)
  61668. + printk(" %02x ", pframe[i]);
  61669. + printk("=======\n");
  61670. + }*/
  61671. + if(pattrib->encrypt>0)
  61672. + _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
  61673. + //bakeup original management packet
  61674. + _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);
  61675. + //move to data portion
  61676. + pframe += pattrib->hdrlen;
  61677. +
  61678. + //802.11w unicast management packet must be _AES_
  61679. + pattrib->iv_len = 8;
  61680. + //it's MIC of AES
  61681. + pattrib->icv_len = 8;
  61682. +
  61683. + switch(pattrib->encrypt)
  61684. + {
  61685. + case _AES_:
  61686. + //set AES IV header
  61687. + AES_IV(pattrib->iv, psta->dot11wtxpn, 0);
  61688. + break;
  61689. + default:
  61690. + goto xmitframe_coalesce_fail;
  61691. + }
  61692. + //insert iv header into management frame
  61693. + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  61694. + pframe += pattrib->iv_len;
  61695. + //copy mgmt data portion after CCMP header
  61696. + _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen);
  61697. + //move pframe to end of mgmt pkt
  61698. + pframe += pattrib->pktlen-pattrib->hdrlen;
  61699. + //add 8 bytes CCMP IV header to length
  61700. + pattrib->pktlen += pattrib->iv_len;
  61701. + /*//dump management packet include AES IV header
  61702. + {
  61703. + int i;
  61704. + printk("Management pkt + IV: ");
  61705. + //for(i=0; i<pattrib->pktlen; i++)
  61706. + //printk(" %02x ", mem_start[i]);
  61707. + printk("@@@@@@@@@@@@@\n");
  61708. + }*/
  61709. +
  61710. + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
  61711. + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  61712. + pframe += pattrib->icv_len;
  61713. + }
  61714. + //add 8 bytes MIC
  61715. + pattrib->pktlen += pattrib->icv_len;
  61716. + //set final tx command size
  61717. + pattrib->last_txcmdsz = pattrib->pktlen;
  61718. +
  61719. + //set protected bit must be beofre SW encrypt
  61720. + SetPrivacy(mem_start);
  61721. + /*//dump management packet include AES header
  61722. + {
  61723. + int i;
  61724. + printk("prepare to enc Management pkt + IV: ");
  61725. + for(i=0; i<pattrib->pktlen; i++)
  61726. + printk(" %02x ", mem_start[i]);
  61727. + printk("@@@@@@@@@@@@@\n");
  61728. + }*/
  61729. + //software encrypt
  61730. + xmitframe_swencrypt(padapter, pxmitframe);
  61731. + }
  61732. + }
  61733. +
  61734. +xmitframe_coalesce_success:
  61735. + _exit_critical_bh(&padapter->security_key_mutex, &irqL);
  61736. + rtw_mfree(BIP_AAD, ori_len);
  61737. +_func_exit_;
  61738. + return _SUCCESS;
  61739. +
  61740. +xmitframe_coalesce_fail:
  61741. + _exit_critical_bh(&padapter->security_key_mutex, &irqL);
  61742. + rtw_mfree(BIP_AAD, ori_len);
  61743. +_func_exit_;
  61744. +
  61745. + return _FAIL;
  61746. +}
  61747. +#endif //CONFIG_IEEE80211W
  61748. +
  61749. +/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
  61750. + * IEEE LLC/SNAP header contains 8 octets
  61751. + * First 3 octets comprise the LLC portion
  61752. + * SNAP portion, 5 octets, is divided into two fields:
  61753. + * Organizationally Unique Identifier(OUI), 3 octets,
  61754. + * type, defined by that organization, 2 octets.
  61755. + */
  61756. +s32 rtw_put_snap(u8 *data, u16 h_proto)
  61757. +{
  61758. + struct ieee80211_snap_hdr *snap;
  61759. + u8 *oui;
  61760. +
  61761. +_func_enter_;
  61762. +
  61763. + snap = (struct ieee80211_snap_hdr *)data;
  61764. + snap->dsap = 0xaa;
  61765. + snap->ssap = 0xaa;
  61766. + snap->ctrl = 0x03;
  61767. +
  61768. + if (h_proto == 0x8137 || h_proto == 0x80f3)
  61769. + oui = P802_1H_OUI;
  61770. + else
  61771. + oui = RFC1042_OUI;
  61772. +
  61773. + snap->oui[0] = oui[0];
  61774. + snap->oui[1] = oui[1];
  61775. + snap->oui[2] = oui[2];
  61776. +
  61777. + *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
  61778. +
  61779. +_func_exit_;
  61780. +
  61781. + return SNAP_SIZE + sizeof(u16);
  61782. +}
  61783. +
  61784. +void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)
  61785. +{
  61786. +
  61787. + uint protection;
  61788. + u8 *perp;
  61789. + sint erp_len;
  61790. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  61791. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  61792. +
  61793. +_func_enter_;
  61794. +
  61795. + switch(pxmitpriv->vcs_setting)
  61796. + {
  61797. + case DISABLE_VCS:
  61798. + pxmitpriv->vcs = NONE_VCS;
  61799. + break;
  61800. +
  61801. + case ENABLE_VCS:
  61802. + break;
  61803. +
  61804. + case AUTO_VCS:
  61805. + default:
  61806. + perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
  61807. + if(perp == NULL)
  61808. + {
  61809. + pxmitpriv->vcs = NONE_VCS;
  61810. + }
  61811. + else
  61812. + {
  61813. + protection = (*(perp + 2)) & BIT(1);
  61814. + if (protection)
  61815. + {
  61816. + if(pregistrypriv->vcs_type == RTS_CTS)
  61817. + pxmitpriv->vcs = RTS_CTS;
  61818. + else
  61819. + pxmitpriv->vcs = CTS_TO_SELF;
  61820. + }
  61821. + else
  61822. + pxmitpriv->vcs = NONE_VCS;
  61823. + }
  61824. +
  61825. + break;
  61826. +
  61827. + }
  61828. +
  61829. +_func_exit_;
  61830. +
  61831. +}
  61832. +
  61833. +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz)
  61834. +{
  61835. + struct sta_info *psta = NULL;
  61836. + struct stainfo_stats *pstats = NULL;
  61837. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  61838. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  61839. +
  61840. + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
  61841. + {
  61842. + pxmitpriv->tx_bytes += sz;
  61843. +#ifdef CONFIG_USB_TX_AGGREGATION
  61844. + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num;
  61845. +#else
  61846. + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod++;
  61847. +#endif
  61848. +
  61849. + psta = pxmitframe->attrib.psta;
  61850. +
  61851. + if(psta)
  61852. + {
  61853. + pstats = &psta->sta_stats;
  61854. +#ifdef CONFIG_USB_TX_AGGREGATION
  61855. + pstats->tx_pkts += pxmitframe->agg_num;
  61856. +#else
  61857. + pstats->tx_pkts++;
  61858. +#endif
  61859. + pstats->tx_bytes += sz;
  61860. + }
  61861. + }
  61862. +
  61863. +}
  61864. +
  61865. +struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
  61866. +{
  61867. + _irqL irqL;
  61868. + struct xmit_buf *pxmitbuf = NULL;
  61869. + _list *plist, *phead;
  61870. + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
  61871. +
  61872. +_func_enter_;
  61873. +
  61874. + _enter_critical(&pfree_queue->lock, &irqL);
  61875. +
  61876. + if(_rtw_queue_empty(pfree_queue) == _TRUE) {
  61877. + pxmitbuf = NULL;
  61878. + } else {
  61879. +
  61880. + phead = get_list_head(pfree_queue);
  61881. +
  61882. + plist = get_next(phead);
  61883. +
  61884. + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  61885. +
  61886. + rtw_list_delete(&(pxmitbuf->list));
  61887. + }
  61888. +
  61889. + if (pxmitbuf != NULL)
  61890. + {
  61891. + pxmitpriv->free_xmit_extbuf_cnt--;
  61892. + #ifdef DBG_XMIT_BUF
  61893. + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);
  61894. + #endif
  61895. +
  61896. +
  61897. + pxmitbuf->priv_data = NULL;
  61898. +
  61899. +#ifdef CONFIG_SDIO_HCI
  61900. + pxmitbuf->len = 0;
  61901. + pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  61902. +#endif
  61903. +#ifdef CONFIG_PCI_HCI
  61904. + pxmitbuf->len = 0;
  61905. +#endif
  61906. +
  61907. + if (pxmitbuf->sctx) {
  61908. + DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
  61909. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
  61910. + }
  61911. +
  61912. + }
  61913. +
  61914. + _exit_critical(&pfree_queue->lock, &irqL);
  61915. +
  61916. +_func_exit_;
  61917. +
  61918. + return pxmitbuf;
  61919. +}
  61920. +
  61921. +s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  61922. +{
  61923. + _irqL irqL;
  61924. + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
  61925. +
  61926. +_func_enter_;
  61927. +
  61928. + if(pxmitbuf==NULL)
  61929. + {
  61930. + return _FAIL;
  61931. + }
  61932. +
  61933. + _enter_critical(&pfree_queue->lock, &irqL);
  61934. +
  61935. + rtw_list_delete(&pxmitbuf->list);
  61936. +
  61937. + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
  61938. + pxmitpriv->free_xmit_extbuf_cnt++;
  61939. + #ifdef DBG_XMIT_BUF
  61940. + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt);
  61941. + #endif
  61942. +
  61943. + _exit_critical(&pfree_queue->lock, &irqL);
  61944. +
  61945. +_func_exit_;
  61946. +
  61947. + return _SUCCESS;
  61948. +}
  61949. +
  61950. +struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
  61951. +{
  61952. + _irqL irqL;
  61953. + struct xmit_buf *pxmitbuf = NULL;
  61954. + _list *plist, *phead;
  61955. + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
  61956. +
  61957. +_func_enter_;
  61958. +
  61959. + //DBG_871X("+rtw_alloc_xmitbuf\n");
  61960. +
  61961. + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
  61962. +
  61963. + if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) {
  61964. + pxmitbuf = NULL;
  61965. + } else {
  61966. +
  61967. + phead = get_list_head(pfree_xmitbuf_queue);
  61968. +
  61969. + plist = get_next(phead);
  61970. +
  61971. + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  61972. +
  61973. + rtw_list_delete(&(pxmitbuf->list));
  61974. + }
  61975. +
  61976. + if (pxmitbuf != NULL)
  61977. + {
  61978. + pxmitpriv->free_xmitbuf_cnt--;
  61979. + #ifdef DBG_XMIT_BUF
  61980. + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);
  61981. + #endif
  61982. + //DBG_871X("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
  61983. +
  61984. + pxmitbuf->priv_data = NULL;
  61985. +
  61986. +#ifdef CONFIG_SDIO_HCI
  61987. + pxmitbuf->len = 0;
  61988. + pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  61989. +#endif
  61990. +#ifdef CONFIG_PCI_HCI
  61991. + pxmitbuf->len = 0;
  61992. +#endif
  61993. +
  61994. + if (pxmitbuf->sctx) {
  61995. + DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
  61996. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
  61997. + }
  61998. + }
  61999. + #ifdef DBG_XMIT_BUF
  62000. + else
  62001. + {
  62002. + DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n");
  62003. + }
  62004. + #endif
  62005. +
  62006. + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
  62007. +
  62008. +_func_exit_;
  62009. +
  62010. + return pxmitbuf;
  62011. +}
  62012. +
  62013. +s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  62014. +{
  62015. + _irqL irqL;
  62016. + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
  62017. +
  62018. +_func_enter_;
  62019. +
  62020. + //DBG_871X("+rtw_free_xmitbuf\n");
  62021. +
  62022. + if(pxmitbuf==NULL)
  62023. + {
  62024. + return _FAIL;
  62025. + }
  62026. +
  62027. + if (pxmitbuf->sctx) {
  62028. + DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
  62029. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
  62030. + }
  62031. +
  62032. + if(pxmitbuf->ext_tag)
  62033. + {
  62034. + rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
  62035. + }
  62036. + else
  62037. + {
  62038. + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
  62039. +
  62040. + rtw_list_delete(&pxmitbuf->list);
  62041. +
  62042. + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
  62043. +
  62044. + pxmitpriv->free_xmitbuf_cnt++;
  62045. + //DBG_871X("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
  62046. + #ifdef DBG_XMIT_BUF
  62047. + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt);
  62048. + #endif
  62049. + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
  62050. + }
  62051. +
  62052. +_func_exit_;
  62053. +
  62054. + return _SUCCESS;
  62055. +}
  62056. +
  62057. +void rtw_init_xmitframe(struct xmit_frame *pxframe)
  62058. +{
  62059. + if (pxframe != NULL)//default value setting
  62060. + {
  62061. + pxframe->buf_addr = NULL;
  62062. + pxframe->pxmitbuf = NULL;
  62063. +
  62064. + _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
  62065. + //pxframe->attrib.psta = NULL;
  62066. +
  62067. + pxframe->frame_tag = DATA_FRAMETAG;
  62068. +
  62069. +#ifdef CONFIG_USB_HCI
  62070. + pxframe->pkt = NULL;
  62071. + pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc
  62072. +
  62073. +#ifdef CONFIG_USB_TX_AGGREGATION
  62074. + pxframe->agg_num = 1;
  62075. +#endif
  62076. +
  62077. +#endif //#ifdef CONFIG_USB_HCI
  62078. +
  62079. +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  62080. + pxframe->pg_num = 1;
  62081. + pxframe->agg_num = 1;
  62082. +#endif
  62083. +
  62084. +#ifdef CONFIG_XMIT_ACK
  62085. + pxframe->ack_report = 0;
  62086. +#endif
  62087. +
  62088. + }
  62089. +}
  62090. +
  62091. +/*
  62092. +Calling context:
  62093. +1. OS_TXENTRY
  62094. +2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
  62095. +
  62096. +If we turn on USE_RXTHREAD, then, no need for critical section.
  62097. +Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
  62098. +
  62099. +Must be very very cautious...
  62100. +
  62101. +*/
  62102. +struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue)
  62103. +{
  62104. + /*
  62105. + Please remember to use all the osdep_service api,
  62106. + and lock/unlock or _enter/_exit critical to protect
  62107. + pfree_xmit_queue
  62108. + */
  62109. +
  62110. + _irqL irqL;
  62111. + struct xmit_frame *pxframe = NULL;
  62112. + _list *plist, *phead;
  62113. + _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
  62114. +#ifdef PLATFORM_LINUX
  62115. + _adapter *padapter = pxmitpriv->adapter;
  62116. +#endif //PLATFORM_LINUX
  62117. +
  62118. +_func_enter_;
  62119. +
  62120. + _enter_critical_bh(&pfree_xmit_queue->lock, &irqL);
  62121. +
  62122. + if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {
  62123. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt));
  62124. + pxframe = NULL;
  62125. + } else {
  62126. + phead = get_list_head(pfree_xmit_queue);
  62127. +
  62128. + plist = get_next(phead);
  62129. +
  62130. + pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  62131. +
  62132. + rtw_list_delete(&(pxframe->list));
  62133. + pxmitpriv->free_xmitframe_cnt--;
  62134. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
  62135. + }
  62136. +
  62137. +#ifdef PLATFORM_LINUX
  62138. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
  62139. + if(pxmitpriv->free_xmitframe_cnt==1)
  62140. + {
  62141. + if (!rtw_netif_queue_stopped(padapter->pnetdev))
  62142. + rtw_netif_stop_queue(padapter->pnetdev);
  62143. + }
  62144. +#endif
  62145. +#endif
  62146. +
  62147. + _exit_critical_bh(&pfree_xmit_queue->lock, &irqL);
  62148. +
  62149. + rtw_init_xmitframe(pxframe);
  62150. +
  62151. +_func_exit_;
  62152. +
  62153. + return pxframe;
  62154. +}
  62155. +
  62156. +struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)
  62157. +{
  62158. + _irqL irqL;
  62159. + struct xmit_frame *pxframe = NULL;
  62160. + _list *plist, *phead;
  62161. + _queue *queue = &pxmitpriv->free_xframe_ext_queue;
  62162. +
  62163. +_func_enter_;
  62164. +
  62165. + _enter_critical_bh(&queue->lock, &irqL);
  62166. +
  62167. + if (_rtw_queue_empty(queue) == _TRUE) {
  62168. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe_ext:%d\n", pxmitpriv->free_xframe_ext_cnt));
  62169. + pxframe = NULL;
  62170. + } else {
  62171. + phead = get_list_head(queue);
  62172. + plist = get_next(phead);
  62173. + pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  62174. +
  62175. + rtw_list_delete(&(pxframe->list));
  62176. + pxmitpriv->free_xframe_ext_cnt--;
  62177. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
  62178. + }
  62179. +
  62180. + _exit_critical_bh(&queue->lock, &irqL);
  62181. +
  62182. + rtw_init_xmitframe(pxframe);
  62183. +
  62184. +_func_exit_;
  62185. +
  62186. + return pxframe;
  62187. +}
  62188. +
  62189. +struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)
  62190. +{
  62191. + struct xmit_frame *pxframe = NULL;
  62192. + u8 *alloc_addr;
  62193. +
  62194. + alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);
  62195. +
  62196. + if (alloc_addr == NULL)
  62197. + goto exit;
  62198. +
  62199. + pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);
  62200. + pxframe->alloc_addr = alloc_addr;
  62201. +
  62202. + pxframe->padapter = pxmitpriv->adapter;
  62203. + pxframe->frame_tag = NULL_FRAMETAG;
  62204. +
  62205. + pxframe->pkt = NULL;
  62206. +
  62207. + pxframe->buf_addr = NULL;
  62208. + pxframe->pxmitbuf = NULL;
  62209. +
  62210. + rtw_init_xmitframe(pxframe);
  62211. +
  62212. + DBG_871X("################## %s ##################\n", __func__);
  62213. +
  62214. +exit:
  62215. + return pxframe;
  62216. +}
  62217. +
  62218. +s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
  62219. +{
  62220. + _irqL irqL;
  62221. + _queue *queue;
  62222. + _adapter *padapter = pxmitpriv->adapter;
  62223. + _pkt *pndis_pkt = NULL;
  62224. +
  62225. +_func_enter_;
  62226. +
  62227. + if (pxmitframe == NULL) {
  62228. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n"));
  62229. + goto exit;
  62230. + }
  62231. +
  62232. + if (pxmitframe->pkt){
  62233. + pndis_pkt = pxmitframe->pkt;
  62234. + pxmitframe->pkt = NULL;
  62235. + }
  62236. +
  62237. + if (pxmitframe->alloc_addr) {
  62238. + DBG_871X("################## %s with alloc_addr ##################\n", __func__);
  62239. + rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);
  62240. + goto check_pkt_complete;
  62241. + }
  62242. +
  62243. + if (pxmitframe->ext_tag == 0)
  62244. + queue = &pxmitpriv->free_xmit_queue;
  62245. + else if(pxmitframe->ext_tag == 1)
  62246. + queue = &pxmitpriv->free_xframe_ext_queue;
  62247. + else
  62248. + {}
  62249. +
  62250. + _enter_critical_bh(&queue->lock, &irqL);
  62251. +
  62252. + rtw_list_delete(&pxmitframe->list);
  62253. + rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));
  62254. + if (pxmitframe->ext_tag == 0) {
  62255. + pxmitpriv->free_xmitframe_cnt++;
  62256. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
  62257. + } else if(pxmitframe->ext_tag == 1) {
  62258. + pxmitpriv->free_xframe_ext_cnt++;
  62259. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xframe_ext_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
  62260. + } else {
  62261. + }
  62262. +
  62263. + _exit_critical_bh(&queue->lock, &irqL);
  62264. +
  62265. +check_pkt_complete:
  62266. +
  62267. + if(pndis_pkt)
  62268. + rtw_os_pkt_complete(padapter, pndis_pkt);
  62269. +
  62270. +exit:
  62271. +
  62272. +_func_exit_;
  62273. +
  62274. + return _SUCCESS;
  62275. +}
  62276. +
  62277. +void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)
  62278. +{
  62279. + _irqL irqL;
  62280. + _list *plist, *phead;
  62281. + struct xmit_frame *pxmitframe;
  62282. +
  62283. +_func_enter_;
  62284. +
  62285. + _enter_critical_bh(&(pframequeue->lock), &irqL);
  62286. +
  62287. + phead = get_list_head(pframequeue);
  62288. + plist = get_next(phead);
  62289. +
  62290. + while (rtw_end_of_queue_search(phead, plist) == _FALSE)
  62291. + {
  62292. +
  62293. + pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  62294. +
  62295. + plist = get_next(plist);
  62296. +
  62297. + rtw_free_xmitframe(pxmitpriv,pxmitframe);
  62298. +
  62299. + }
  62300. + _exit_critical_bh(&(pframequeue->lock), &irqL);
  62301. +
  62302. +_func_exit_;
  62303. +}
  62304. +
  62305. +s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
  62306. +{
  62307. + if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
  62308. + {
  62309. + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
  62310. + ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n"));
  62311. +// pxmitframe->pkt = NULL;
  62312. + return _FAIL;
  62313. + }
  62314. +
  62315. + return _SUCCESS;
  62316. +}
  62317. +
  62318. +static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
  62319. +{
  62320. + _list *xmitframe_plist, *xmitframe_phead;
  62321. + struct xmit_frame *pxmitframe=NULL;
  62322. +
  62323. + xmitframe_phead = get_list_head(pframe_queue);
  62324. + xmitframe_plist = get_next(xmitframe_phead);
  62325. +
  62326. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  62327. + {
  62328. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  62329. +
  62330. + xmitframe_plist = get_next(xmitframe_plist);
  62331. +
  62332. +/*#ifdef RTK_DMP_PLATFORM
  62333. +#ifdef CONFIG_USB_TX_AGGREGATION
  62334. + if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))
  62335. + {
  62336. + pxmitframe = NULL;
  62337. +
  62338. + tasklet_schedule(&pxmitpriv->xmit_tasklet);
  62339. +
  62340. + break;
  62341. + }
  62342. +#endif
  62343. +#endif*/
  62344. + rtw_list_delete(&pxmitframe->list);
  62345. +
  62346. + ptxservq->qcnt--;
  62347. +
  62348. + break;
  62349. +
  62350. + pxmitframe = NULL;
  62351. +
  62352. + }
  62353. +
  62354. + return pxmitframe;
  62355. +}
  62356. +
  62357. +struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)
  62358. +{
  62359. + _irqL irqL0;
  62360. + _list *sta_plist, *sta_phead;
  62361. + struct hw_xmit *phwxmit;
  62362. + struct tx_servq *ptxservq = NULL;
  62363. + _queue *pframe_queue = NULL;
  62364. + struct xmit_frame *pxmitframe = NULL;
  62365. + _adapter *padapter = pxmitpriv->adapter;
  62366. + struct registry_priv *pregpriv = &padapter->registrypriv;
  62367. + int i, inx[4];
  62368. +#ifdef CONFIG_USB_HCI
  62369. +// int j, tmp, acirp_cnt[4];
  62370. +#endif
  62371. +
  62372. +_func_enter_;
  62373. +
  62374. + inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
  62375. +
  62376. + if(pregpriv->wifi_spec==1)
  62377. + {
  62378. + int j, tmp, acirp_cnt[4];
  62379. +#if 0
  62380. + if(flags<XMIT_QUEUE_ENTRY)
  62381. + {
  62382. + //priority exchange according to the completed xmitbuf flags.
  62383. + inx[flags] = 0;
  62384. + inx[0] = flags;
  62385. + }
  62386. +#endif
  62387. +
  62388. +#ifdef CONFIG_USB_HCI
  62389. + //entry indx: 0->vo, 1->vi, 2->be, 3->bk.
  62390. + acirp_cnt[0] = pxmitpriv->voq_cnt;
  62391. + acirp_cnt[1] = pxmitpriv->viq_cnt;
  62392. + acirp_cnt[2] = pxmitpriv->beq_cnt;
  62393. + acirp_cnt[3] = pxmitpriv->bkq_cnt;
  62394. +
  62395. + for(i=0; i<4; i++)
  62396. + {
  62397. + for(j=i+1; j<4; j++)
  62398. + {
  62399. + if(acirp_cnt[j]<acirp_cnt[i])
  62400. + {
  62401. + tmp = acirp_cnt[i];
  62402. + acirp_cnt[i] = acirp_cnt[j];
  62403. + acirp_cnt[j] = tmp;
  62404. +
  62405. + tmp = inx[i];
  62406. + inx[i] = inx[j];
  62407. + inx[j] = tmp;
  62408. + }
  62409. + }
  62410. + }
  62411. +#endif
  62412. + }
  62413. +
  62414. + _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  62415. +
  62416. + for(i = 0; i < entry; i++)
  62417. + {
  62418. + phwxmit = phwxmit_i + inx[i];
  62419. +
  62420. + //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
  62421. +
  62422. + sta_phead = get_list_head(phwxmit->sta_queue);
  62423. + sta_plist = get_next(sta_phead);
  62424. +
  62425. + while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE)
  62426. + {
  62427. +
  62428. + ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
  62429. +
  62430. + pframe_queue = &ptxservq->sta_pending;
  62431. +
  62432. + pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
  62433. +
  62434. + if(pxmitframe)
  62435. + {
  62436. + phwxmit->accnt--;
  62437. +
  62438. + //Remove sta node when there is no pending packets.
  62439. + if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break
  62440. + rtw_list_delete(&ptxservq->tx_pending);
  62441. +
  62442. + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
  62443. +
  62444. + goto exit;
  62445. + }
  62446. +
  62447. + sta_plist = get_next(sta_plist);
  62448. +
  62449. + }
  62450. +
  62451. + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
  62452. +
  62453. + }
  62454. +
  62455. +exit:
  62456. +
  62457. + _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  62458. +
  62459. +_func_exit_;
  62460. +
  62461. + return pxmitframe;
  62462. +}
  62463. +
  62464. +#if 1
  62465. +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)
  62466. +{
  62467. + struct tx_servq *ptxservq=NULL;
  62468. +
  62469. +_func_enter_;
  62470. +
  62471. + switch (up)
  62472. + {
  62473. + case 1:
  62474. + case 2:
  62475. + ptxservq = &(psta->sta_xmitpriv.bk_q);
  62476. + *(ac) = 3;
  62477. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
  62478. + break;
  62479. +
  62480. + case 4:
  62481. + case 5:
  62482. + ptxservq = &(psta->sta_xmitpriv.vi_q);
  62483. + *(ac) = 1;
  62484. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
  62485. + break;
  62486. +
  62487. + case 6:
  62488. + case 7:
  62489. + ptxservq = &(psta->sta_xmitpriv.vo_q);
  62490. + *(ac) = 0;
  62491. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
  62492. + break;
  62493. +
  62494. + case 0:
  62495. + case 3:
  62496. + default:
  62497. + ptxservq = &(psta->sta_xmitpriv.be_q);
  62498. + *(ac) = 2;
  62499. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
  62500. + break;
  62501. +
  62502. + }
  62503. +
  62504. +_func_exit_;
  62505. +
  62506. + return ptxservq;
  62507. +}
  62508. +#else
  62509. +__inline static struct tx_servq *rtw_get_sta_pending
  62510. + (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)
  62511. +{
  62512. + struct tx_servq *ptxservq;
  62513. + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  62514. +
  62515. +_func_enter_;
  62516. +
  62517. +#ifdef CONFIG_RTL8711
  62518. +
  62519. + if(IS_MCAST(psta->hwaddr))
  62520. + {
  62521. + ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo
  62522. + *ppstapending = &padapter->xmitpriv.bm_pending;
  62523. + }
  62524. + else
  62525. +#endif
  62526. + {
  62527. + switch (up)
  62528. + {
  62529. + case 1:
  62530. + case 2:
  62531. + ptxservq = &(psta->sta_xmitpriv.bk_q);
  62532. + *ppstapending = &padapter->xmitpriv.bk_pending;
  62533. + (phwxmits+3)->accnt++;
  62534. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
  62535. + break;
  62536. +
  62537. + case 4:
  62538. + case 5:
  62539. + ptxservq = &(psta->sta_xmitpriv.vi_q);
  62540. + *ppstapending = &padapter->xmitpriv.vi_pending;
  62541. + (phwxmits+1)->accnt++;
  62542. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
  62543. + break;
  62544. +
  62545. + case 6:
  62546. + case 7:
  62547. + ptxservq = &(psta->sta_xmitpriv.vo_q);
  62548. + *ppstapending = &padapter->xmitpriv.vo_pending;
  62549. + (phwxmits+0)->accnt++;
  62550. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
  62551. + break;
  62552. +
  62553. + case 0:
  62554. + case 3:
  62555. + default:
  62556. + ptxservq = &(psta->sta_xmitpriv.be_q);
  62557. + *ppstapending = &padapter->xmitpriv.be_pending;
  62558. + (phwxmits+2)->accnt++;
  62559. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
  62560. + break;
  62561. +
  62562. + }
  62563. +
  62564. + }
  62565. +
  62566. +_func_exit_;
  62567. +
  62568. + return ptxservq;
  62569. +}
  62570. +#endif
  62571. +
  62572. +/*
  62573. + * Will enqueue pxmitframe to the proper queue,
  62574. + * and indicate it to xx_pending list.....
  62575. + */
  62576. +s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
  62577. +{
  62578. + //_irqL irqL0;
  62579. + u8 ac_index;
  62580. + struct sta_info *psta;
  62581. + struct tx_servq *ptxservq;
  62582. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  62583. + struct sta_priv *pstapriv = &padapter->stapriv;
  62584. + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  62585. + sint res = _SUCCESS;
  62586. +
  62587. +_func_enter_;
  62588. +
  62589. + if (pattrib->psta) {
  62590. + psta = pattrib->psta;
  62591. + } else {
  62592. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  62593. + psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  62594. + }
  62595. +
  62596. + if (psta == NULL) {
  62597. + res = _FAIL;
  62598. + DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
  62599. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
  62600. + goto exit;
  62601. + }
  62602. +
  62603. + if(!(psta->state &_FW_LINKED))
  62604. + {
  62605. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  62606. + return _FAIL;
  62607. + }
  62608. +
  62609. + ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
  62610. +
  62611. + //_enter_critical(&pstapending->lock, &irqL0);
  62612. +
  62613. + if (rtw_is_list_empty(&ptxservq->tx_pending)) {
  62614. + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
  62615. + }
  62616. +
  62617. + //_enter_critical(&ptxservq->sta_pending.lock, &irqL1);
  62618. +
  62619. + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
  62620. + ptxservq->qcnt++;
  62621. + phwxmits[ac_index].accnt++;
  62622. +
  62623. + //_exit_critical(&ptxservq->sta_pending.lock, &irqL1);
  62624. +
  62625. + //_exit_critical(&pstapending->lock, &irqL0);
  62626. +
  62627. +exit:
  62628. +
  62629. +_func_exit_;
  62630. +
  62631. + return res;
  62632. +}
  62633. +
  62634. +void rtw_alloc_hwxmits(_adapter *padapter)
  62635. +{
  62636. + struct hw_xmit *hwxmits;
  62637. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  62638. +
  62639. + pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
  62640. +
  62641. + pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);
  62642. +
  62643. + hwxmits = pxmitpriv->hwxmits;
  62644. +
  62645. + if(pxmitpriv->hwxmit_entry == 5)
  62646. + {
  62647. + //pxmitpriv->bmc_txqueue.head = 0;
  62648. + //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
  62649. + hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
  62650. +
  62651. + //pxmitpriv->vo_txqueue.head = 0;
  62652. + //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
  62653. + hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
  62654. +
  62655. + //pxmitpriv->vi_txqueue.head = 0;
  62656. + //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
  62657. + hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
  62658. +
  62659. + //pxmitpriv->bk_txqueue.head = 0;
  62660. + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
  62661. + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
  62662. +
  62663. + //pxmitpriv->be_txqueue.head = 0;
  62664. + //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
  62665. + hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
  62666. +
  62667. + }
  62668. + else if(pxmitpriv->hwxmit_entry == 4)
  62669. + {
  62670. +
  62671. + //pxmitpriv->vo_txqueue.head = 0;
  62672. + //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
  62673. + hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
  62674. +
  62675. + //pxmitpriv->vi_txqueue.head = 0;
  62676. + //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
  62677. + hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
  62678. +
  62679. + //pxmitpriv->be_txqueue.head = 0;
  62680. + //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
  62681. + hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
  62682. +
  62683. + //pxmitpriv->bk_txqueue.head = 0;
  62684. + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
  62685. + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
  62686. + }
  62687. + else
  62688. + {
  62689. +
  62690. +
  62691. + }
  62692. +
  62693. +
  62694. +}
  62695. +
  62696. +void rtw_free_hwxmits(_adapter *padapter)
  62697. +{
  62698. + struct hw_xmit *hwxmits;
  62699. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  62700. +
  62701. + hwxmits = pxmitpriv->hwxmits;
  62702. + if(hwxmits)
  62703. + rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry));
  62704. +}
  62705. +
  62706. +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)
  62707. +{
  62708. + sint i;
  62709. +_func_enter_;
  62710. + for(i = 0; i < entry; i++, phwxmit++)
  62711. + {
  62712. + //_rtw_spinlock_init(&phwxmit->xmit_lock);
  62713. + //_rtw_init_listhead(&phwxmit->pending);
  62714. + //phwxmit->txcmdcnt = 0;
  62715. + phwxmit->accnt = 0;
  62716. + }
  62717. +_func_exit_;
  62718. +}
  62719. +
  62720. +#ifdef CONFIG_BR_EXT
  62721. +int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)
  62722. +{
  62723. + struct sk_buff *skb = *pskb;
  62724. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  62725. + _irqL irqL;
  62726. + //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
  62727. + {
  62728. + void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);
  62729. + int res, is_vlan_tag=0, i, do_nat25=1;
  62730. + unsigned short vlan_hdr=0;
  62731. + void *br_port = NULL;
  62732. +
  62733. + //mac_clone_handle_frame(priv, skb);
  62734. +
  62735. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62736. + br_port = padapter->pnetdev->br_port;
  62737. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62738. + rcu_read_lock();
  62739. + br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  62740. + rcu_read_unlock();
  62741. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62742. + _enter_critical_bh(&padapter->br_ext_lock, &irqL);
  62743. + if ( !(skb->data[0] & 1) &&
  62744. + br_port &&
  62745. + memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
  62746. + *((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&
  62747. + *((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&
  62748. + !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
  62749. + memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  62750. + padapter->scdb_entry->ageing_timer = jiffies;
  62751. + _exit_critical_bh(&padapter->br_ext_lock, &irqL);
  62752. + }
  62753. + else
  62754. + //if (!priv->pmib->ethBrExtInfo.nat25_disable)
  62755. + {
  62756. +// if (priv->dev->br_port &&
  62757. +// !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) {
  62758. +#if 1
  62759. + if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
  62760. + is_vlan_tag = 1;
  62761. + vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
  62762. + for (i=0; i<6; i++)
  62763. + *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
  62764. + skb_pull(skb, 4);
  62765. + }
  62766. + //if SA == br_mac && skb== IP => copy SIP to br_ip ?? why
  62767. + if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
  62768. + (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))
  62769. + memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
  62770. +
  62771. + if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {
  62772. + if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {
  62773. + void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);
  62774. +
  62775. + if ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
  62776. + skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) {
  62777. + memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);
  62778. + memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
  62779. + padapter->scdb_entry->ageing_timer = jiffies;
  62780. + do_nat25 = 0;
  62781. + }
  62782. + }
  62783. + else {
  62784. + if (padapter->scdb_entry) {
  62785. + padapter->scdb_entry->ageing_timer = jiffies;
  62786. + do_nat25 = 0;
  62787. + }
  62788. + else {
  62789. + memset(padapter->scdb_mac, 0, MACADDRLEN);
  62790. + memset(padapter->scdb_ip, 0, 4);
  62791. + }
  62792. + }
  62793. + }
  62794. + _exit_critical_bh(&padapter->br_ext_lock, &irqL);
  62795. +#endif // 1
  62796. + if (do_nat25)
  62797. + {
  62798. + int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);
  62799. + if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
  62800. + struct sk_buff *newskb;
  62801. +
  62802. + if (is_vlan_tag) {
  62803. + skb_push(skb, 4);
  62804. + for (i=0; i<6; i++)
  62805. + *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
  62806. + *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
  62807. + *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
  62808. + }
  62809. +
  62810. + newskb = rtw_skb_copy(skb);
  62811. + if (newskb == NULL) {
  62812. + //priv->ext_stats.tx_drops++;
  62813. + DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n");
  62814. + //goto stop_proc;
  62815. + return -1;
  62816. + }
  62817. + rtw_skb_free(skb);
  62818. +
  62819. + *pskb = skb = newskb;
  62820. + if (is_vlan_tag) {
  62821. + vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
  62822. + for (i=0; i<6; i++)
  62823. + *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
  62824. + skb_pull(skb, 4);
  62825. + }
  62826. + }
  62827. +
  62828. + if (skb_is_nonlinear(skb))
  62829. + DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__);
  62830. +
  62831. +
  62832. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
  62833. + res = skb_linearize(skb, GFP_ATOMIC);
  62834. +#else // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
  62835. + res = skb_linearize(skb);
  62836. +#endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
  62837. + if (res < 0) {
  62838. + DEBUG_ERR("TX DROP: skb_linearize fail!\n");
  62839. + //goto free_and_stop;
  62840. + return -1;
  62841. + }
  62842. +
  62843. + res = nat25_db_handle(padapter, skb, NAT25_INSERT);
  62844. + if (res < 0) {
  62845. + if (res == -2) {
  62846. + //priv->ext_stats.tx_drops++;
  62847. + DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
  62848. + //goto free_and_stop;
  62849. + return -1;
  62850. +
  62851. + }
  62852. + // we just print warning message and let it go
  62853. + //DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__);
  62854. + //return -1; // return -1 will cause system crash on 2011/08/30!
  62855. + return 0;
  62856. + }
  62857. + }
  62858. +
  62859. + memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  62860. +
  62861. + dhcp_flag_bcast(padapter, skb);
  62862. +
  62863. + if (is_vlan_tag) {
  62864. + skb_push(skb, 4);
  62865. + for (i=0; i<6; i++)
  62866. + *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
  62867. + *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
  62868. + *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
  62869. + }
  62870. + }
  62871. +#if 0
  62872. + else{
  62873. + if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
  62874. + is_vlan_tag = 1;
  62875. + }
  62876. +
  62877. + if(is_vlan_tag){
  62878. + if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){
  62879. + memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  62880. + }
  62881. + }else
  62882. + {
  62883. + if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){
  62884. + memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  62885. + }
  62886. + }
  62887. + }
  62888. +#endif // 0
  62889. +
  62890. + // check if SA is equal to our MAC
  62891. + if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
  62892. + //priv->ext_stats.tx_drops++;
  62893. + DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
  62894. + skb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]);
  62895. + //goto free_and_stop;
  62896. + return -1;
  62897. + }
  62898. + }
  62899. + return 0;
  62900. +}
  62901. +#endif // CONFIG_BR_EXT
  62902. +
  62903. +static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib)
  62904. +{
  62905. + u8 qsel;
  62906. +
  62907. + qsel = pattrib->priority;
  62908. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel));
  62909. +
  62910. +#ifdef CONFIG_CONCURRENT_MODE
  62911. +// if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
  62912. +// qsel = 7;//
  62913. +#endif
  62914. +
  62915. + pattrib->qsel = qsel;
  62916. +}
  62917. +
  62918. +/*
  62919. + * The main transmit(tx) entry
  62920. + *
  62921. + * Return
  62922. + * 1 enqueue
  62923. + * 0 success, hardware will handle this xmit frame(packet)
  62924. + * <0 fail
  62925. + */
  62926. +s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
  62927. +{
  62928. + static u32 start = 0;
  62929. + static u32 drop_cnt = 0;
  62930. +#ifdef CONFIG_AP_MODE
  62931. + _irqL irqL0;
  62932. +#endif
  62933. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  62934. + struct xmit_frame *pxmitframe = NULL;
  62935. +#ifdef CONFIG_BR_EXT
  62936. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  62937. + void *br_port = NULL;
  62938. +#endif // CONFIG_BR_EXT
  62939. +
  62940. + s32 res;
  62941. +
  62942. + if (start == 0)
  62943. + start = rtw_get_current_time();
  62944. +
  62945. + pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
  62946. +
  62947. + if (rtw_get_passing_time_ms(start) > 2000) {
  62948. + if (drop_cnt)
  62949. + DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt);
  62950. + start = rtw_get_current_time();
  62951. + drop_cnt = 0;
  62952. + }
  62953. +
  62954. + if (pxmitframe == NULL) {
  62955. + drop_cnt ++;
  62956. + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
  62957. + return -1;
  62958. + }
  62959. +
  62960. +#ifdef CONFIG_BR_EXT
  62961. +
  62962. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62963. + br_port = padapter->pnetdev->br_port;
  62964. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62965. + rcu_read_lock();
  62966. + br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  62967. + rcu_read_unlock();
  62968. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  62969. +
  62970. + if( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
  62971. + {
  62972. + res = rtw_br_client_tx(padapter, ppkt);
  62973. + if (res == -1)
  62974. + {
  62975. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  62976. + return -1;
  62977. + }
  62978. + }
  62979. +
  62980. +#endif // CONFIG_BR_EXT
  62981. +
  62982. + res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
  62983. + if (res == _FAIL) {
  62984. + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n"));
  62985. + #ifdef DBG_TX_DROP_FRAME
  62986. + DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__);
  62987. + #endif
  62988. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  62989. + return -1;
  62990. + }
  62991. + pxmitframe->pkt = *ppkt;
  62992. +
  62993. + rtw_led_control(padapter, LED_CTL_TX);
  62994. +
  62995. + do_queue_select(padapter, &pxmitframe->attrib);
  62996. +
  62997. +#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
  62998. + _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  62999. + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
  63000. + {
  63001. + _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  63002. + return 1;
  63003. + }
  63004. + _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  63005. +#endif
  63006. +
  63007. + if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
  63008. + return 1;
  63009. +
  63010. + return 0;
  63011. +}
  63012. +
  63013. +#ifdef CONFIG_TDLS
  63014. +sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
  63015. +{
  63016. + sint ret=_FALSE;
  63017. +
  63018. + _irqL irqL;
  63019. + struct sta_info *ptdls_sta=NULL;
  63020. + struct sta_priv *pstapriv = &padapter->stapriv;
  63021. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  63022. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  63023. + int i;
  63024. +
  63025. + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
  63026. + if(ptdls_sta==NULL){
  63027. + return ret;
  63028. + }else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){
  63029. +
  63030. + if(pattrib->triggered==1)
  63031. + {
  63032. + ret = _TRUE;
  63033. + return ret;
  63034. + }
  63035. +
  63036. + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  63037. +
  63038. + if(ptdls_sta->state&WIFI_SLEEP_STATE)
  63039. + {
  63040. + rtw_list_delete(&pxmitframe->list);
  63041. +
  63042. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63043. +
  63044. + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));
  63045. +
  63046. + ptdls_sta->sleepq_len++;
  63047. + ptdls_sta->sleepq_ac_len++;
  63048. +
  63049. + //indicate 4-AC queue bit in TDLS peer traffic indication
  63050. + switch(pattrib->priority)
  63051. + {
  63052. + case 1:
  63053. + case 2:
  63054. + ptdls_sta->uapsd_bk = ptdls_sta->uapsd_bk | BIT(1);
  63055. + break;
  63056. + case 4:
  63057. + case 5:
  63058. + ptdls_sta->uapsd_vi = ptdls_sta->uapsd_vi | BIT(1);
  63059. + break;
  63060. + case 6:
  63061. + case 7:
  63062. + ptdls_sta->uapsd_vo = ptdls_sta->uapsd_vo | BIT(1);
  63063. + break;
  63064. + case 0:
  63065. + case 3:
  63066. + default:
  63067. + ptdls_sta->uapsd_be = ptdls_sta->uapsd_be | BIT(1);
  63068. + break;
  63069. + }
  63070. +
  63071. + if(ptdls_sta->sleepq_len==1)
  63072. + {
  63073. + //transmit TDLS PTI via AP
  63074. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_SD_PTI);
  63075. + }
  63076. + ret = _TRUE;
  63077. +
  63078. + }
  63079. +
  63080. + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  63081. + }
  63082. +
  63083. + return ret;
  63084. +
  63085. +}
  63086. +#endif //CONFIG_TDLS
  63087. +
  63088. +#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
  63089. +
  63090. +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
  63091. +{
  63092. + _irqL irqL;
  63093. + sint ret=_FALSE;
  63094. + struct sta_info *psta=NULL;
  63095. + struct sta_priv *pstapriv = &padapter->stapriv;
  63096. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  63097. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  63098. + sint bmcst = IS_MCAST(pattrib->ra);
  63099. +#ifdef CONFIG_TDLS
  63100. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  63101. +
  63102. + if( ptdlsinfo->setup_state == TDLS_LINKED_STATE )
  63103. + {
  63104. + ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
  63105. + return ret;
  63106. + }
  63107. +#endif //CONFIG_TDLS
  63108. +
  63109. + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
  63110. + return ret;
  63111. +
  63112. + if(pattrib->psta)
  63113. + {
  63114. + psta = pattrib->psta;
  63115. + }
  63116. + else
  63117. + {
  63118. + DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
  63119. + psta=rtw_get_stainfo(pstapriv, pattrib->ra);
  63120. + }
  63121. +
  63122. + if(psta==NULL)
  63123. + {
  63124. + DBG_871X("%s, psta==NUL\n", __func__);
  63125. + return _FALSE;
  63126. + }
  63127. +
  63128. + if(!(psta->state &_FW_LINKED))
  63129. + {
  63130. + DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  63131. + return _FALSE;
  63132. + }
  63133. +
  63134. + if(pattrib->triggered==1)
  63135. + {
  63136. + //DBG_871X("directly xmit pspoll_triggered packet\n");
  63137. +
  63138. + //pattrib->triggered=0;
  63139. +
  63140. + if(bmcst)
  63141. + pattrib->qsel = 0x11;//HIQ
  63142. +
  63143. +
  63144. + return ret;
  63145. + }
  63146. +
  63147. +
  63148. + if(bmcst)
  63149. + {
  63150. + _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63151. +
  63152. + if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode
  63153. + {
  63154. + //pattrib->qsel = 0x11;//HIQ
  63155. +
  63156. + rtw_list_delete(&pxmitframe->list);
  63157. +
  63158. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63159. +
  63160. + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
  63161. +
  63162. + psta->sleepq_len++;
  63163. +
  63164. + pstapriv->tim_bitmap |= BIT(0);//
  63165. + pstapriv->sta_dz_bitmap |= BIT(0);
  63166. +
  63167. + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
  63168. +
  63169. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);//tx bc/mc packets after upate bcn
  63170. +
  63171. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63172. +
  63173. + ret = _TRUE;
  63174. +
  63175. + }
  63176. +
  63177. + _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63178. +
  63179. + return ret;
  63180. +
  63181. + }
  63182. +
  63183. +
  63184. + _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63185. +
  63186. + if(psta->state&WIFI_SLEEP_STATE)
  63187. + {
  63188. + u8 wmmps_ac=0;
  63189. +
  63190. + if(pstapriv->sta_dz_bitmap&BIT(psta->aid))
  63191. + {
  63192. + rtw_list_delete(&pxmitframe->list);
  63193. +
  63194. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63195. +
  63196. + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
  63197. +
  63198. + psta->sleepq_len++;
  63199. +
  63200. + switch(pattrib->priority)
  63201. + {
  63202. + case 1:
  63203. + case 2:
  63204. + wmmps_ac = psta->uapsd_bk&BIT(0);
  63205. + break;
  63206. + case 4:
  63207. + case 5:
  63208. + wmmps_ac = psta->uapsd_vi&BIT(0);
  63209. + break;
  63210. + case 6:
  63211. + case 7:
  63212. + wmmps_ac = psta->uapsd_vo&BIT(0);
  63213. + break;
  63214. + case 0:
  63215. + case 3:
  63216. + default:
  63217. + wmmps_ac = psta->uapsd_be&BIT(0);
  63218. + break;
  63219. + }
  63220. +
  63221. + if(wmmps_ac)
  63222. + psta->sleepq_ac_len++;
  63223. +
  63224. + if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
  63225. + {
  63226. + pstapriv->tim_bitmap |= BIT(psta->aid);
  63227. +
  63228. + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
  63229. +
  63230. + if(psta->sleepq_len==1)
  63231. + {
  63232. + //DBG_871X("sleepq_len==1, update BCNTIM\n");
  63233. + //upate BCN for TIM IE
  63234. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  63235. + }
  63236. + }
  63237. +
  63238. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63239. +
  63240. + //if(psta->sleepq_len > (NR_XMITFRAME>>3))
  63241. + //{
  63242. + // wakeup_sta_to_xmit(padapter, psta);
  63243. + //}
  63244. +
  63245. + ret = _TRUE;
  63246. +
  63247. + }
  63248. +
  63249. + }
  63250. +
  63251. + _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63252. +
  63253. + return ret;
  63254. +
  63255. +}
  63256. +
  63257. +static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)
  63258. +{
  63259. + sint ret;
  63260. + _list *plist, *phead;
  63261. + u8 ac_index;
  63262. + struct tx_servq *ptxservq;
  63263. + struct pkt_attrib *pattrib;
  63264. + struct xmit_frame *pxmitframe;
  63265. + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  63266. +
  63267. + phead = get_list_head(pframequeue);
  63268. + plist = get_next(phead);
  63269. +
  63270. + while (rtw_end_of_queue_search(phead, plist) == _FALSE)
  63271. + {
  63272. + pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  63273. +
  63274. + plist = get_next(plist);
  63275. +
  63276. + ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
  63277. +
  63278. + if(_TRUE == ret)
  63279. + {
  63280. + pattrib = &pxmitframe->attrib;
  63281. +
  63282. + ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
  63283. +
  63284. + ptxservq->qcnt--;
  63285. + phwxmits[ac_index].accnt--;
  63286. + }
  63287. + else
  63288. + {
  63289. + //DBG_871X("xmitframe_enqueue_for_sleeping_sta return _FALSE\n");
  63290. + }
  63291. +
  63292. + }
  63293. +
  63294. +}
  63295. +
  63296. +void stop_sta_xmit(_adapter *padapter, struct sta_info *psta)
  63297. +{
  63298. + _irqL irqL0;
  63299. + struct sta_info *psta_bmc;
  63300. + struct sta_xmit_priv *pstaxmitpriv;
  63301. + struct sta_priv *pstapriv = &padapter->stapriv;
  63302. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  63303. +
  63304. + pstaxmitpriv = &psta->sta_xmitpriv;
  63305. +
  63306. + //for BC/MC Frames
  63307. + psta_bmc = rtw_get_bcmc_stainfo(padapter);
  63308. +
  63309. +
  63310. + _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  63311. +
  63312. + psta->state |= WIFI_SLEEP_STATE;
  63313. +
  63314. +#ifdef CONFIG_TDLS
  63315. + if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )
  63316. +#endif //CONFIG_TDLS
  63317. + pstapriv->sta_dz_bitmap |= BIT(psta->aid);
  63318. +
  63319. +
  63320. +
  63321. + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
  63322. + rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
  63323. +
  63324. +
  63325. + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
  63326. + rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
  63327. +
  63328. +
  63329. + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
  63330. + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
  63331. +
  63332. +
  63333. + dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
  63334. + rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
  63335. +
  63336. +#ifdef CONFIG_TDLS
  63337. + if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )
  63338. + {
  63339. + if( psta_bmc != NULL )
  63340. + {
  63341. +#endif //CONFIG_TDLS
  63342. +
  63343. +
  63344. + //for BC/MC Frames
  63345. + pstaxmitpriv = &psta_bmc->sta_xmitpriv;
  63346. + dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
  63347. + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
  63348. +
  63349. +
  63350. +#ifdef CONFIG_TDLS
  63351. + }
  63352. + }
  63353. +#endif //CONFIG_TDLS
  63354. + _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  63355. +
  63356. +
  63357. +}
  63358. +
  63359. +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
  63360. +{
  63361. + _irqL irqL;
  63362. + u8 update_mask=0, wmmps_ac=0;
  63363. + struct sta_info *psta_bmc;
  63364. + _list *xmitframe_plist, *xmitframe_phead;
  63365. + struct xmit_frame *pxmitframe=NULL;
  63366. + struct sta_priv *pstapriv = &padapter->stapriv;
  63367. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  63368. +
  63369. + psta_bmc = rtw_get_bcmc_stainfo(padapter);
  63370. +
  63371. +
  63372. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63373. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  63374. +
  63375. + xmitframe_phead = get_list_head(&psta->sleep_q);
  63376. + xmitframe_plist = get_next(xmitframe_phead);
  63377. +
  63378. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  63379. + {
  63380. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  63381. +
  63382. + xmitframe_plist = get_next(xmitframe_plist);
  63383. +
  63384. + rtw_list_delete(&pxmitframe->list);
  63385. +
  63386. + switch(pxmitframe->attrib.priority)
  63387. + {
  63388. + case 1:
  63389. + case 2:
  63390. + wmmps_ac = psta->uapsd_bk&BIT(1);
  63391. + break;
  63392. + case 4:
  63393. + case 5:
  63394. + wmmps_ac = psta->uapsd_vi&BIT(1);
  63395. + break;
  63396. + case 6:
  63397. + case 7:
  63398. + wmmps_ac = psta->uapsd_vo&BIT(1);
  63399. + break;
  63400. + case 0:
  63401. + case 3:
  63402. + default:
  63403. + wmmps_ac = psta->uapsd_be&BIT(1);
  63404. + break;
  63405. + }
  63406. +
  63407. + psta->sleepq_len--;
  63408. + if(psta->sleepq_len>0)
  63409. + pxmitframe->attrib.mdata = 1;
  63410. + else
  63411. + pxmitframe->attrib.mdata = 0;
  63412. +
  63413. + if(wmmps_ac)
  63414. + {
  63415. + psta->sleepq_ac_len--;
  63416. + if(psta->sleepq_ac_len>0)
  63417. + {
  63418. + pxmitframe->attrib.mdata = 1;
  63419. + pxmitframe->attrib.eosp = 0;
  63420. + }
  63421. + else
  63422. + {
  63423. + pxmitframe->attrib.mdata = 0;
  63424. + pxmitframe->attrib.eosp = 1;
  63425. + }
  63426. + }
  63427. +
  63428. + pxmitframe->attrib.triggered = 1;
  63429. +
  63430. +/*
  63431. + _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63432. + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  63433. + {
  63434. + rtw_os_xmit_complete(padapter, pxmitframe);
  63435. + }
  63436. + _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63437. +*/
  63438. + rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  63439. +
  63440. +
  63441. + }
  63442. +
  63443. + //for BC/MC Frames
  63444. + if(!psta_bmc)
  63445. + goto _exit;
  63446. +
  63447. + if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode
  63448. + {
  63449. + xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
  63450. + xmitframe_plist = get_next(xmitframe_phead);
  63451. +
  63452. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  63453. + {
  63454. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  63455. +
  63456. + xmitframe_plist = get_next(xmitframe_plist);
  63457. +
  63458. + rtw_list_delete(&pxmitframe->list);
  63459. +
  63460. + psta_bmc->sleepq_len--;
  63461. + if(psta_bmc->sleepq_len>0)
  63462. + pxmitframe->attrib.mdata = 1;
  63463. + else
  63464. + pxmitframe->attrib.mdata = 0;
  63465. +
  63466. +
  63467. + pxmitframe->attrib.triggered = 1;
  63468. +/*
  63469. + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  63470. + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  63471. + {
  63472. + rtw_os_xmit_complete(padapter, pxmitframe);
  63473. + }
  63474. + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  63475. +
  63476. +*/
  63477. + rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  63478. +
  63479. + }
  63480. +
  63481. + if(psta_bmc->sleepq_len==0)
  63482. + {
  63483. + pstapriv->tim_bitmap &= ~BIT(0);
  63484. + pstapriv->sta_dz_bitmap &= ~BIT(0);
  63485. +
  63486. + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
  63487. + //upate BCN for TIM IE
  63488. + //update_BCNTIM(padapter);
  63489. + update_mask |= BIT(1);
  63490. + }
  63491. +
  63492. + }
  63493. +
  63494. + if(psta->sleepq_len==0)
  63495. + {
  63496. +#ifdef CONFIG_TDLS
  63497. + if( psta->tdls_sta_state & TDLS_LINKED_STATE )
  63498. + {
  63499. + if(psta->state&WIFI_SLEEP_STATE)
  63500. + psta->state ^= WIFI_SLEEP_STATE;
  63501. +
  63502. + goto _exit;
  63503. + }
  63504. +#endif //CONFIG_TDLS
  63505. + pstapriv->tim_bitmap &= ~BIT(psta->aid);
  63506. +
  63507. + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
  63508. + //upate BCN for TIM IE
  63509. + //update_BCNTIM(padapter);
  63510. + update_mask = BIT(0);
  63511. +
  63512. + if(psta->state&WIFI_SLEEP_STATE)
  63513. + psta->state ^= WIFI_SLEEP_STATE;
  63514. +
  63515. + if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
  63516. + {
  63517. + psta->expire_to = pstapriv->expire_to;
  63518. + psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
  63519. + }
  63520. +
  63521. + pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
  63522. + }
  63523. +
  63524. +_exit:
  63525. +
  63526. + //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  63527. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  63528. +
  63529. + if(update_mask)
  63530. + {
  63531. + //update_BCNTIM(padapter);
  63532. + //printk("%s => call update_beacon\n",__FUNCTION__);
  63533. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  63534. + }
  63535. +
  63536. +}
  63537. +
  63538. +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
  63539. +{
  63540. + _irqL irqL;
  63541. + u8 wmmps_ac=0;
  63542. + _list *xmitframe_plist, *xmitframe_phead;
  63543. + struct xmit_frame *pxmitframe=NULL;
  63544. + struct sta_priv *pstapriv = &padapter->stapriv;
  63545. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  63546. +
  63547. +
  63548. + //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
  63549. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  63550. +
  63551. + xmitframe_phead = get_list_head(&psta->sleep_q);
  63552. + xmitframe_plist = get_next(xmitframe_phead);
  63553. +
  63554. + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
  63555. + {
  63556. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  63557. +
  63558. + xmitframe_plist = get_next(xmitframe_plist);
  63559. +
  63560. + switch(pxmitframe->attrib.priority)
  63561. + {
  63562. + case 1:
  63563. + case 2:
  63564. + wmmps_ac = psta->uapsd_bk&BIT(1);
  63565. + break;
  63566. + case 4:
  63567. + case 5:
  63568. + wmmps_ac = psta->uapsd_vi&BIT(1);
  63569. + break;
  63570. + case 6:
  63571. + case 7:
  63572. + wmmps_ac = psta->uapsd_vo&BIT(1);
  63573. + break;
  63574. + case 0:
  63575. + case 3:
  63576. + default:
  63577. + wmmps_ac = psta->uapsd_be&BIT(1);
  63578. + break;
  63579. + }
  63580. +
  63581. + if(!wmmps_ac)
  63582. + continue;
  63583. +
  63584. + rtw_list_delete(&pxmitframe->list);
  63585. +
  63586. + psta->sleepq_len--;
  63587. + psta->sleepq_ac_len--;
  63588. +
  63589. + if(psta->sleepq_ac_len>0)
  63590. + {
  63591. + pxmitframe->attrib.mdata = 1;
  63592. + pxmitframe->attrib.eosp = 0;
  63593. + }
  63594. + else
  63595. + {
  63596. + pxmitframe->attrib.mdata = 0;
  63597. + pxmitframe->attrib.eosp = 1;
  63598. + }
  63599. +
  63600. + pxmitframe->attrib.triggered = 1;
  63601. +
  63602. +/*
  63603. + if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  63604. + {
  63605. + rtw_os_xmit_complete(padapter, pxmitframe);
  63606. + }
  63607. +*/
  63608. + rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  63609. +
  63610. + if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))
  63611. + {
  63612. +#ifdef CONFIG_TDLS
  63613. + if(psta->tdls_sta_state & TDLS_LINKED_STATE )
  63614. + {
  63615. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63616. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  63617. + return;
  63618. + }
  63619. +#endif //CONFIG_TDLS
  63620. + pstapriv->tim_bitmap &= ~BIT(psta->aid);
  63621. +
  63622. + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
  63623. + //upate BCN for TIM IE
  63624. + //update_BCNTIM(padapter);
  63625. + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
  63626. + //update_mask = BIT(0);
  63627. + }
  63628. +
  63629. + }
  63630. +
  63631. + //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
  63632. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  63633. +
  63634. +}
  63635. +
  63636. +#endif
  63637. +
  63638. +void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
  63639. +{
  63640. + sctx->timeout_ms = timeout_ms;
  63641. + sctx->submit_time= rtw_get_current_time();
  63642. +#ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */
  63643. + init_completion(&sctx->done);
  63644. +#endif
  63645. + sctx->status = RTW_SCTX_SUBMITTED;
  63646. +}
  63647. +
  63648. +int rtw_sctx_wait(struct submit_ctx *sctx)
  63649. +{
  63650. + int ret = _FAIL;
  63651. + unsigned long expire;
  63652. + int status = 0;
  63653. +
  63654. +#ifdef PLATFORM_LINUX
  63655. + expire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
  63656. + if (!wait_for_completion_timeout(&sctx->done, expire)) {
  63657. + /* timeout, do something?? */
  63658. + status = RTW_SCTX_DONE_TIMEOUT;
  63659. + DBG_871X("%s timeout\n", __func__);
  63660. + } else {
  63661. + status = sctx->status;
  63662. + }
  63663. +#endif
  63664. +
  63665. + if (status == RTW_SCTX_DONE_SUCCESS) {
  63666. + ret = _SUCCESS;
  63667. + }
  63668. +
  63669. + return ret;
  63670. +}
  63671. +
  63672. +bool rtw_sctx_chk_waring_status(int status)
  63673. +{
  63674. + switch(status) {
  63675. + case RTW_SCTX_DONE_UNKNOWN:
  63676. + case RTW_SCTX_DONE_BUF_ALLOC:
  63677. + case RTW_SCTX_DONE_BUF_FREE:
  63678. +
  63679. + case RTW_SCTX_DONE_DRV_STOP:
  63680. + case RTW_SCTX_DONE_DEV_REMOVE:
  63681. + return _TRUE;
  63682. + default:
  63683. + return _FALSE;
  63684. + }
  63685. +}
  63686. +
  63687. +void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
  63688. +{
  63689. + if (*sctx) {
  63690. + if (rtw_sctx_chk_waring_status(status))
  63691. + DBG_871X("%s status:%d\n", __func__, status);
  63692. + (*sctx)->status = status;
  63693. + #ifdef PLATFORM_LINUX
  63694. + complete(&((*sctx)->done));
  63695. + #endif
  63696. + *sctx = NULL;
  63697. + }
  63698. +}
  63699. +
  63700. +void rtw_sctx_done(struct submit_ctx **sctx)
  63701. +{
  63702. + rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
  63703. +}
  63704. +
  63705. +#ifdef CONFIG_XMIT_ACK
  63706. +
  63707. +#ifdef CONFIG_XMIT_ACK_POLLING
  63708. +s32 c2h_evt_hdl(_adapter *adapter, struct c2h_evt_hdr *c2h_evt, c2h_id_filter filter);
  63709. +
  63710. +/**
  63711. + * rtw_ack_tx_polling -
  63712. + * @pxmitpriv: xmit_priv to address ack_tx_ops
  63713. + * @timeout_ms: timeout msec
  63714. + *
  63715. + * Init ack_tx_ops and then do c2h_evt_hdl() and polling ack_tx_ops repeatedly
  63716. + * till tx report or timeout
  63717. + * Returns: _SUCCESS if TX report ok, _FAIL for others
  63718. + */
  63719. +int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms)
  63720. +{
  63721. + int ret = _FAIL;
  63722. + struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
  63723. + _adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv);
  63724. +
  63725. + pack_tx_ops->submit_time = rtw_get_current_time();
  63726. + pack_tx_ops->timeout_ms = timeout_ms;
  63727. + pack_tx_ops->status = RTW_SCTX_SUBMITTED;
  63728. +
  63729. + do {
  63730. + c2h_evt_hdl(adapter, NULL, rtw_hal_c2h_id_filter_ccx(adapter));
  63731. + if (pack_tx_ops->status != RTW_SCTX_SUBMITTED)
  63732. + break;
  63733. +
  63734. + if (adapter->bDriverStopped) {
  63735. + pack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP;
  63736. + break;
  63737. + }
  63738. + if (adapter->bSurpriseRemoved) {
  63739. + pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE;
  63740. + break;
  63741. + }
  63742. +
  63743. + rtw_msleep_os(10);
  63744. + } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms);
  63745. +
  63746. + if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) {
  63747. + pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT;
  63748. + DBG_871X("%s timeout\n", __func__);
  63749. + }
  63750. +
  63751. + if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS)
  63752. + ret = _SUCCESS;
  63753. +
  63754. + return ret;
  63755. +}
  63756. +#endif
  63757. +
  63758. +int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
  63759. +{
  63760. +#ifdef CONFIG_XMIT_ACK_POLLING
  63761. + return rtw_ack_tx_polling(pxmitpriv, timeout_ms);
  63762. +#else
  63763. + struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
  63764. +
  63765. + pack_tx_ops->submit_time = rtw_get_current_time();
  63766. + pack_tx_ops->timeout_ms = timeout_ms;
  63767. + pack_tx_ops->status = RTW_SCTX_SUBMITTED;
  63768. +
  63769. + return rtw_sctx_wait(pack_tx_ops);
  63770. +#endif
  63771. +}
  63772. +
  63773. +void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
  63774. +{
  63775. + struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
  63776. +
  63777. + if (pxmitpriv->ack_tx) {
  63778. + rtw_sctx_done_err(&pack_tx_ops, status);
  63779. + } else {
  63780. + DBG_871X("%s ack_tx not set\n", __func__);
  63781. + }
  63782. +}
  63783. +#endif //CONFIG_XMIT_ACK
  63784. --- /dev/null
  63785. +++ b/drivers/net/wireless/rtl8192cu/hal/HalPwrSeqCmd.c
  63786. @@ -0,0 +1,175 @@
  63787. +/******************************************************************************
  63788. + *
  63789. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  63790. + *
  63791. + * This program is free software; you can redistribute it and/or modify it
  63792. + * under the terms of version 2 of the GNU General Public License as
  63793. + * published by the Free Software Foundation.
  63794. + *
  63795. + * This program is distributed in the hope that it will be useful, but WITHOUT
  63796. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  63797. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  63798. + * more details.
  63799. + *
  63800. + * You should have received a copy of the GNU General Public License along with
  63801. + * this program; if not, write to the Free Software Foundation, Inc.,
  63802. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  63803. + *
  63804. + *
  63805. + ******************************************************************************/
  63806. +/*++
  63807. +Copyright (c) Realtek Semiconductor Corp. All rights reserved.
  63808. +
  63809. +Module Name:
  63810. + HalPwrSeqCmd.c
  63811. +
  63812. +Abstract:
  63813. + Implement HW Power sequence configuration CMD handling routine for Realtek devices.
  63814. +
  63815. +Major Change History:
  63816. + When Who What
  63817. + ---------- --------------- -------------------------------
  63818. + 2011-10-26 Lucas Modify to be compatible with SD4-CE driver.
  63819. + 2011-07-07 Roger Create.
  63820. +
  63821. +--*/
  63822. +#include <HalPwrSeqCmd.h>
  63823. +#include <sdio_ops.h>
  63824. +
  63825. +
  63826. +//
  63827. +// Description:
  63828. +// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC.
  63829. +//
  63830. +// Assumption:
  63831. +// We should follow specific format which was released from HW SD.
  63832. +//
  63833. +// 2011.07.07, added by Roger.
  63834. +//
  63835. +u8 HalPwrSeqCmdParsing(
  63836. + PADAPTER padapter,
  63837. + u8 CutVersion,
  63838. + u8 FabVersion,
  63839. + u8 InterfaceType,
  63840. + WLAN_PWR_CFG PwrSeqCmd[])
  63841. +{
  63842. + WLAN_PWR_CFG PwrCfgCmd = {0};
  63843. + u8 bPollingBit = _FALSE;
  63844. + u32 AryIdx = 0;
  63845. + u8 value = 0;
  63846. + u32 offset = 0;
  63847. + u32 pollingCount = 0; // polling autoload done.
  63848. + u32 maxPollingCnt = 5000;
  63849. +
  63850. + do {
  63851. + PwrCfgCmd = PwrSeqCmd[AryIdx];
  63852. +
  63853. + RT_TRACE(_module_hal_init_c_ , _drv_info_,
  63854. + ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n",
  63855. + GET_PWR_CFG_OFFSET(PwrCfgCmd),
  63856. + GET_PWR_CFG_CUT_MASK(PwrCfgCmd),
  63857. + GET_PWR_CFG_FAB_MASK(PwrCfgCmd),
  63858. + GET_PWR_CFG_INTF_MASK(PwrCfgCmd),
  63859. + GET_PWR_CFG_BASE(PwrCfgCmd),
  63860. + GET_PWR_CFG_CMD(PwrCfgCmd),
  63861. + GET_PWR_CFG_MASK(PwrCfgCmd),
  63862. + GET_PWR_CFG_VALUE(PwrCfgCmd)));
  63863. +
  63864. + //2 Only Handle the command whose FAB, CUT, and Interface are matched
  63865. + if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) &&
  63866. + (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) &&
  63867. + (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType))
  63868. + {
  63869. + switch (GET_PWR_CFG_CMD(PwrCfgCmd))
  63870. + {
  63871. + case PWR_CMD_READ:
  63872. + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n"));
  63873. + break;
  63874. +
  63875. + case PWR_CMD_WRITE:
  63876. + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n"));
  63877. + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd);
  63878. +
  63879. +#ifdef CONFIG_SDIO_HCI
  63880. + //
  63881. + // <Roger_Notes> We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface
  63882. + // 2011.07.07.
  63883. + //
  63884. + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)
  63885. + {
  63886. + // Read Back SDIO Local value
  63887. + value = SdioLocalCmd52Read1Byte(padapter, offset);
  63888. +
  63889. + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd));
  63890. + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd));
  63891. +
  63892. + // Write Back SDIO Local value
  63893. + SdioLocalCmd52Write1Byte(padapter, offset, value);
  63894. + }
  63895. + else
  63896. +#endif
  63897. + {
  63898. + // Read the value from system register
  63899. + value = rtw_read8(padapter, offset);
  63900. +
  63901. + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd));
  63902. + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd));
  63903. +
  63904. + // Write the value back to sytem register
  63905. + rtw_write8(padapter, offset, value);
  63906. + }
  63907. + break;
  63908. +
  63909. + case PWR_CMD_POLLING:
  63910. + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n"));
  63911. +
  63912. + bPollingBit = _FALSE;
  63913. + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd);
  63914. +
  63915. + do {
  63916. +#ifdef CONFIG_SDIO_HCI
  63917. + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)
  63918. + value = SdioLocalCmd52Read1Byte(padapter, offset);
  63919. + else
  63920. +#endif
  63921. + value = rtw_read8(padapter, offset);
  63922. +
  63923. + value &= GET_PWR_CFG_MASK(PwrCfgCmd);
  63924. + if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)))
  63925. + bPollingBit = _TRUE;
  63926. + else
  63927. + rtw_udelay_os(10);
  63928. +
  63929. + if (pollingCount++ > maxPollingCnt) {
  63930. + RT_TRACE(_module_hal_init_c_ , _drv_err_, ("Fail to polling Offset[%#x]\n", offset));
  63931. + return _FALSE;
  63932. + }
  63933. + } while (!bPollingBit);
  63934. +
  63935. + break;
  63936. +
  63937. + case PWR_CMD_DELAY:
  63938. + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n"));
  63939. + if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US)
  63940. + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd));
  63941. + else
  63942. + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000);
  63943. + break;
  63944. +
  63945. + case PWR_CMD_END:
  63946. + // When this command is parsed, end the process
  63947. + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n"));
  63948. + return _TRUE;
  63949. + break;
  63950. +
  63951. + default:
  63952. + RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n"));
  63953. + break;
  63954. + }
  63955. + }
  63956. +
  63957. + AryIdx++;//Add Array Index
  63958. + }while(1);
  63959. +
  63960. + return _TRUE;
  63961. +}
  63962. --- /dev/null
  63963. +++ b/drivers/net/wireless/rtl8192cu/hal/dm.c
  63964. @@ -0,0 +1,313 @@
  63965. +/******************************************************************************
  63966. + *
  63967. + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.
  63968. + *
  63969. + * This program is free software; you can redistribute it and/or modify it
  63970. + * under the terms of version 2 of the GNU General Public License as
  63971. + * published by the Free Software Foundation.
  63972. + *
  63973. + * This program is distributed in the hope that it will be useful, but WITHOUT
  63974. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  63975. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  63976. + * more details.
  63977. + *
  63978. + * You should have received a copy of the GNU General Public License along with
  63979. + * this program; if not, write to the Free Software Foundation, Inc.,
  63980. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  63981. + *
  63982. + *
  63983. + ******************************************************************************/
  63984. +
  63985. +#include <drv_conf.h>
  63986. +#include <osdep_service.h>
  63987. +#include <drv_types.h>
  63988. +
  63989. +#ifdef CONFIG_RTL8192C
  63990. +#include <rtl8192c_hal.h>
  63991. +#endif
  63992. +
  63993. +#ifdef CONFIG_RTL8192D
  63994. +#include <rtl8192d_hal.h>
  63995. +#endif
  63996. +
  63997. +bool rtw_adapter_linked(_adapter *adapter)
  63998. +{
  63999. + bool linked = _FALSE;
  64000. + struct mlme_priv *mlmepriv = &adapter->mlmepriv;
  64001. +
  64002. + if( (check_fwstate(mlmepriv, WIFI_AP_STATE) == _TRUE) ||
  64003. + (check_fwstate(mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE))
  64004. + {
  64005. + if(adapter->stapriv.asoc_sta_count > 2)
  64006. + linked = _TRUE;
  64007. + }
  64008. + else{//Station mode
  64009. + if(check_fwstate(mlmepriv, _FW_LINKED)== _TRUE)
  64010. + linked = _TRUE;
  64011. + }
  64012. +
  64013. + return linked;
  64014. +}
  64015. +
  64016. +bool dm_linked(_adapter *adapter)
  64017. +{
  64018. + bool linked;
  64019. +
  64020. + if ((linked = rtw_adapter_linked(adapter)))
  64021. + goto exit;
  64022. +
  64023. +#ifdef CONFIG_CONCURRENT_MODE
  64024. + if ((adapter = adapter->pbuddy_adapter) == NULL)
  64025. + goto exit;
  64026. + linked = rtw_adapter_linked(adapter);
  64027. +#endif
  64028. +
  64029. +exit:
  64030. + return linked;
  64031. +}
  64032. +
  64033. +#if 0
  64034. +void dm_enable_EDCCA(_adapter *adapter)
  64035. +{
  64036. + // Enable EDCCA. The value is suggested by SD3 Wilson.
  64037. +
  64038. + //
  64039. + // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
  64040. + //
  64041. + /*if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
  64042. + {
  64043. + rtw_write8(adapter,rOFDM0_ECCAThreshold,0x00);
  64044. + rtw_write8(adapter,rOFDM0_ECCAThreshold+2,0xFD);
  64045. +
  64046. + }
  64047. + else*/
  64048. + {
  64049. + rtw_write8(adapter,rOFDM0_ECCAThreshold,0x03);
  64050. + rtw_write8(adapter,rOFDM0_ECCAThreshold+2,0x00);
  64051. + }
  64052. +}
  64053. +
  64054. +void dm_disable_EDCCA(_adapter *adapter)
  64055. +{
  64056. + // Disable EDCCA..
  64057. + rtw_write8(adapter, rOFDM0_ECCAThreshold, 0x7f);
  64058. + rtw_write8(adapter, rOFDM0_ECCAThreshold+2, 0x7f);
  64059. +}
  64060. +
  64061. +//
  64062. +// Description: According to initial gain value to determine to enable or disable EDCCA.
  64063. +//
  64064. +// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
  64065. +//
  64066. +void dm_dynamic_EDCCA(_adapter *pAdapter)
  64067. +{
  64068. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  64069. + struct dm_priv *dmpriv = &pHalData->dmpriv;
  64070. + u8 RegC50, RegC58;
  64071. +
  64072. + RegC50 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
  64073. + RegC58 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
  64074. +
  64075. +
  64076. + if((RegC50 > 0x28 && RegC58 > 0x28)
  64077. + /*|| ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26))
  64078. + || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28)*/
  64079. + )
  64080. + {
  64081. + if(!dmpriv->bPreEdccaEnable)
  64082. + {
  64083. + dm_enable_EDCCA(pAdapter);
  64084. + dmpriv->bPreEdccaEnable = _TRUE;
  64085. + }
  64086. +
  64087. + }
  64088. + else if((RegC50 < 0x25 && RegC58 < 0x25)
  64089. + /*|| (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)*/
  64090. + )
  64091. + {
  64092. + if(dmpriv->bPreEdccaEnable)
  64093. + {
  64094. + dm_disable_EDCCA(pAdapter);
  64095. + dmpriv->bPreEdccaEnable = _FALSE;
  64096. + }
  64097. + }
  64098. +}
  64099. +#endif
  64100. +
  64101. +#define DM_ADAPTIVITY_VER "ADAPTIVITY_V001"
  64102. +
  64103. +int dm_adaptivity_get_parm_str(_adapter *pAdapter, char *buf, int len)
  64104. +{
  64105. +#ifdef CONFIG_DM_ADAPTIVITY
  64106. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  64107. + struct dm_priv *dmpriv = &pHalData->dmpriv;
  64108. +
  64109. + return snprintf(buf, len, DM_ADAPTIVITY_VER"\n"
  64110. + "TH_L2H_ini\tTH_EDCCA_HL_diff\tIGI_Base\tForceEDCCA\tAdapEn_RSSI\tIGI_LowerBound\n"
  64111. + "0x%02x\t%d\t0x%02x\t%d\t%u\t%u\n",
  64112. + (u8)dmpriv->TH_L2H_ini,
  64113. + dmpriv->TH_EDCCA_HL_diff,
  64114. + dmpriv->IGI_Base,
  64115. + dmpriv->ForceEDCCA,
  64116. + dmpriv->AdapEn_RSSI,
  64117. + dmpriv->IGI_LowerBound
  64118. + );
  64119. +#endif /* CONFIG_DM_ADAPTIVITY */
  64120. + return 0;
  64121. +}
  64122. +
  64123. +void dm_adaptivity_set_parm(_adapter *pAdapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
  64124. + s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound)
  64125. +{
  64126. +#ifdef CONFIG_DM_ADAPTIVITY
  64127. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  64128. + struct dm_priv *dmpriv = &pHalData->dmpriv;
  64129. +
  64130. + dmpriv->TH_L2H_ini = TH_L2H_ini;
  64131. + dmpriv->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;
  64132. + dmpriv->IGI_Base = IGI_Base;
  64133. + dmpriv->ForceEDCCA = ForceEDCCA;
  64134. + dmpriv->AdapEn_RSSI = AdapEn_RSSI;
  64135. + dmpriv->IGI_LowerBound = IGI_LowerBound;
  64136. +
  64137. +#endif /* CONFIG_DM_ADAPTIVITY */
  64138. +}
  64139. +
  64140. +void dm_adaptivity_init(_adapter *pAdapter)
  64141. +{
  64142. +#ifdef CONFIG_DM_ADAPTIVITY
  64143. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  64144. + struct dm_priv *dmpriv = &pHalData->dmpriv;
  64145. +
  64146. + /*
  64147. + if(pDM_Odm->SupportICType == ODM_RTL8723B)
  64148. + {
  64149. + pDM_Odm->TH_L2H_ini = 0xf8; // -8
  64150. + }
  64151. + if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
  64152. + {
  64153. + pDM_Odm->TH_L2H_ini = 0xf0; // -16
  64154. + }
  64155. + else */
  64156. + {
  64157. + dmpriv->TH_L2H_ini = 0xf9; // -7
  64158. + }
  64159. +
  64160. + dmpriv->TH_EDCCA_HL_diff = 7;
  64161. + dmpriv->IGI_Base = 0x32;
  64162. + dmpriv->IGI_target = 0x1c;
  64163. + dmpriv->ForceEDCCA = 0;
  64164. + dmpriv->AdapEn_RSSI = 20;
  64165. + dmpriv->IGI_LowerBound = 0;
  64166. +
  64167. + //Reg524[11]=0 is easily to transmit packets during adaptivity test
  64168. + PHY_SetBBReg(pAdapter, 0x524, BIT11, 1); // stop counting if EDCCA is asserted
  64169. +
  64170. +#endif /* CONFIG_DM_ADAPTIVITY */
  64171. +}
  64172. +
  64173. +void dm_adaptivity(_adapter *pAdapter)
  64174. +{
  64175. +#ifdef CONFIG_DM_ADAPTIVITY
  64176. + s8 TH_L2H_dmc, TH_H2L_dmc;
  64177. + s8 TH_L2H, TH_H2L, Diff, IGI_target;
  64178. + u32 value32;
  64179. + BOOLEAN EDCCA_State;
  64180. +
  64181. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  64182. + struct dm_priv *dmpriv = &pHalData->dmpriv;
  64183. + DIG_T *pDigTable = &dmpriv->DM_DigTable;
  64184. + u8 IGI = pDigTable->CurIGValue;
  64185. + u8 RSSI_Min = pDigTable->Rssi_val_min;
  64186. + HT_CHANNEL_WIDTH BandWidth = pHalData->CurrentChannelBW;
  64187. +
  64188. + if (!(dmpriv->DMFlag & DYNAMIC_FUNC_ADAPTIVITY))
  64189. + {
  64190. + LOG_LEVEL(_drv_info_, "Go to odm_DynamicEDCCA() \n");
  64191. + // Add by Neil Chen to enable edcca to MP Platform
  64192. + // Adjust EDCCA.
  64193. + /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
  64194. + dm_dynamic_EDCCA(pAdapter);
  64195. + */
  64196. + return;
  64197. + }
  64198. + LOG_LEVEL(_drv_info_, "odm_Adaptivity() =====> \n");
  64199. +
  64200. + LOG_LEVEL(_drv_info_, "ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
  64201. + dmpriv->ForceEDCCA, dmpriv->IGI_Base, dmpriv->TH_L2H_ini, dmpriv->TH_EDCCA_HL_diff, dmpriv->AdapEn_RSSI);
  64202. +
  64203. + /*if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
  64204. + PHY_SetBBReg(0x800, BIT10, 0); //ADC_mask enable
  64205. + */
  64206. +
  64207. + if(!dm_linked(pAdapter) || pHalData->CurrentChannel > 149) /* Band4 doesn't need adaptivity */
  64208. + {
  64209. + /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)*/
  64210. + {
  64211. + PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
  64212. + PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
  64213. + }
  64214. + /*else
  64215. + {
  64216. + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
  64217. + }*/
  64218. + return;
  64219. + }
  64220. +
  64221. + if(!dmpriv->ForceEDCCA)
  64222. + {
  64223. + if(RSSI_Min > dmpriv->AdapEn_RSSI)
  64224. + EDCCA_State = 1;
  64225. + else if(RSSI_Min < (dmpriv->AdapEn_RSSI - 5))
  64226. + EDCCA_State = 0;
  64227. + }
  64228. + else
  64229. + EDCCA_State = 1;
  64230. + //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
  64231. + //IGI_target = pDM_Odm->IGI_Base;
  64232. + //else
  64233. + {
  64234. +
  64235. + if(BandWidth == HT_CHANNEL_WIDTH_20) //CHANNEL_WIDTH_20
  64236. + IGI_target = dmpriv->IGI_Base;
  64237. + else if(BandWidth == HT_CHANNEL_WIDTH_40)
  64238. + IGI_target = dmpriv->IGI_Base + 2;
  64239. + /*else if(*pDM_Odm->pBandWidth == ODM_BW80M)
  64240. + IGI_target = pDM_Odm->IGI_Base + 6;*/
  64241. + else
  64242. + IGI_target = dmpriv->IGI_Base;
  64243. + }
  64244. +
  64245. + dmpriv->IGI_target = (u8)IGI_target;
  64246. +
  64247. + LOG_LEVEL(_drv_info_, "BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
  64248. + (BandWidth==HT_CHANNEL_WIDTH_40)?"40M":"20M", IGI_target, EDCCA_State);
  64249. +
  64250. + if(EDCCA_State == 1)
  64251. + {
  64252. + Diff = IGI_target -(s8)IGI;
  64253. + TH_L2H_dmc = dmpriv->TH_L2H_ini + Diff;
  64254. + if(TH_L2H_dmc > 10) TH_L2H_dmc = 10;
  64255. + TH_H2L_dmc = TH_L2H_dmc - dmpriv->TH_EDCCA_HL_diff;
  64256. + }
  64257. + else
  64258. + {
  64259. + TH_L2H_dmc = 0x7f;
  64260. + TH_H2L_dmc = 0x7f;
  64261. + }
  64262. +
  64263. + LOG_LEVEL(_drv_info_, "IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
  64264. + IGI, TH_L2H_dmc, TH_H2L_dmc);
  64265. +
  64266. + /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)*/
  64267. + {
  64268. + PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc);
  64269. + PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc);
  64270. + }
  64271. + /*else
  64272. + PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u8)TH_H2L_dmc<<8) | (u8)TH_L2H_dmc);*/
  64273. +
  64274. +skip_dm:
  64275. + return;
  64276. +#endif /* CONFIG_DM_ADAPTIVITY */
  64277. +}
  64278. --- /dev/null
  64279. +++ b/drivers/net/wireless/rtl8192cu/hal/dm.h
  64280. @@ -0,0 +1,30 @@
  64281. +/******************************************************************************
  64282. + *
  64283. + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.
  64284. + *
  64285. + * This program is free software; you can redistribute it and/or modify it
  64286. + * under the terms of version 2 of the GNU General Public License as
  64287. + * published by the Free Software Foundation.
  64288. + *
  64289. + * This program is distributed in the hope that it will be useful, but WITHOUT
  64290. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  64291. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  64292. + * more details.
  64293. + *
  64294. + * You should have received a copy of the GNU General Public License along with
  64295. + * this program; if not, write to the Free Software Foundation, Inc.,
  64296. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  64297. + *
  64298. + *
  64299. + ******************************************************************************/
  64300. +
  64301. + #ifndef __DM_H__
  64302. +#define __DM_H__
  64303. +
  64304. +int dm_adaptivity_get_parm_str(_adapter *pAdapter, char *buf, int len);
  64305. +void dm_adaptivity_set_parm(_adapter *pAdapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
  64306. + s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound);
  64307. +void dm_adaptivity_init(_adapter *pAdapter);
  64308. +void dm_adaptivity(_adapter *pAdapter);
  64309. +
  64310. +#endif /* __DM_H__ */
  64311. --- /dev/null
  64312. +++ b/drivers/net/wireless/rtl8192cu/hal/hal_com.c
  64313. @@ -0,0 +1,370 @@
  64314. +/******************************************************************************
  64315. + *
  64316. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  64317. + *
  64318. + * This program is free software; you can redistribute it and/or modify it
  64319. + * under the terms of version 2 of the GNU General Public License as
  64320. + * published by the Free Software Foundation.
  64321. + *
  64322. + * This program is distributed in the hope that it will be useful, but WITHOUT
  64323. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  64324. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  64325. + * more details.
  64326. + *
  64327. + * You should have received a copy of the GNU General Public License along with
  64328. + * this program; if not, write to the Free Software Foundation, Inc.,
  64329. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  64330. + *
  64331. + *
  64332. + ******************************************************************************/
  64333. +#include <drv_conf.h>
  64334. +#include <osdep_service.h>
  64335. +#include <drv_types.h>
  64336. +#include <rtw_byteorder.h>
  64337. +
  64338. +#include <hal_intf.h>
  64339. +#include <hal_com.h>
  64340. +
  64341. +#ifdef CONFIG_RTL8192C
  64342. +#include <rtl8192c_hal.h>
  64343. +#endif
  64344. +#ifdef CONFIG_RTL8192D
  64345. +#include <rtl8192d_hal.h>
  64346. +#endif
  64347. +
  64348. +#define _HAL_COM_C_
  64349. +
  64350. +//============================================================
  64351. +// Global var
  64352. +//============================================================
  64353. +u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] = {
  64354. + 0x7f8001fe, // 0, +6.0dB
  64355. + 0x788001e2, // 1, +5.5dB
  64356. + 0x71c001c7, // 2, +5.0dB
  64357. + 0x6b8001ae, // 3, +4.5dB
  64358. + 0x65400195, // 4, +4.0dB
  64359. + 0x5fc0017f, // 5, +3.5dB
  64360. + 0x5a400169, // 6, +3.0dB
  64361. + 0x55400155, // 7, +2.5dB
  64362. + 0x50800142, // 8, +2.0dB
  64363. + 0x4c000130, // 9, +1.5dB
  64364. + 0x47c0011f, // 10, +1.0dB
  64365. + 0x43c0010f, // 11, +0.5dB
  64366. + 0x40000100, // 12, +0dB
  64367. + 0x3c8000f2, // 13, -0.5dB
  64368. + 0x390000e4, // 14, -1.0dB
  64369. + 0x35c000d7, // 15, -1.5dB
  64370. + 0x32c000cb, // 16, -2.0dB
  64371. + 0x300000c0, // 17, -2.5dB
  64372. + 0x2d4000b5, // 18, -3.0dB
  64373. + 0x2ac000ab, // 19, -3.5dB
  64374. + 0x288000a2, // 20, -4.0dB
  64375. + 0x26000098, // 21, -4.5dB
  64376. + 0x24000090, // 22, -5.0dB
  64377. + 0x22000088, // 23, -5.5dB
  64378. + 0x20000080, // 24, -6.0dB
  64379. + 0x1e400079, // 25, -6.5dB
  64380. + 0x1c800072, // 26, -7.0dB
  64381. + 0x1b00006c, // 27. -7.5dB
  64382. + 0x19800066, // 28, -8.0dB
  64383. + 0x18000060, // 29, -8.5dB
  64384. + 0x16c0005b, // 30, -9.0dB
  64385. + 0x15800056, // 31, -9.5dB
  64386. + 0x14400051, // 32, -10.0dB
  64387. + 0x1300004c, // 33, -10.5dB
  64388. + 0x12000048, // 34, -11.0dB
  64389. + 0x11000044, // 35, -11.5dB
  64390. + 0x10000040, // 36, -12.0dB
  64391. + 0x0f00003c,// 37, -12.5dB
  64392. + 0x0e400039,// 38, -13.0dB
  64393. + 0x0d800036,// 39, -13.5dB
  64394. + 0x0cc00033,// 40, -14.0dB
  64395. + 0x0c000030,// 41, -14.5dB
  64396. + 0x0b40002d,// 42, -15.0dB
  64397. +};
  64398. +
  64399. +
  64400. +u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
  64401. + {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB
  64402. + {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB
  64403. + {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB
  64404. + {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB
  64405. + {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB
  64406. + {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB
  64407. + {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB
  64408. + {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB
  64409. + {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB
  64410. + {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB
  64411. + {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB
  64412. + {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB
  64413. + {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB
  64414. + {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB
  64415. + {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB
  64416. + {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB
  64417. + {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
  64418. + {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB
  64419. + {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB
  64420. + {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB
  64421. + {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB
  64422. + {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB
  64423. + {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB
  64424. + {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB
  64425. + {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB
  64426. + {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB
  64427. + {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB
  64428. + {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB
  64429. + {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB
  64430. + {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB
  64431. + {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB
  64432. + {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB
  64433. + {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB
  64434. +};
  64435. +
  64436. +
  64437. +u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= {
  64438. + {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB
  64439. + {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB
  64440. + {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB
  64441. + {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB
  64442. + {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB
  64443. + {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB
  64444. + {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB
  64445. + {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB
  64446. + {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB
  64447. + {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB
  64448. + {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB
  64449. + {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB
  64450. + {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB
  64451. + {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB
  64452. + {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB
  64453. + {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB
  64454. + {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
  64455. + {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB
  64456. + {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB
  64457. + {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB
  64458. + {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB
  64459. + {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB
  64460. + {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB
  64461. + {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB
  64462. + {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB
  64463. + {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB
  64464. + {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB
  64465. + {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB
  64466. + {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB
  64467. + {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB
  64468. + {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB
  64469. + {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB
  64470. + {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB
  64471. +};
  64472. +
  64473. +
  64474. +#ifdef CONFIG_CHIP_VER_INTEGRATION
  64475. +void dump_chip_info(HAL_VERSION ChipVersion)
  64476. +{
  64477. + if(IS_81XXC(ChipVersion)){
  64478. + DBG_871X("Chip Version Info: %s_",IS_92C_SERIAL(ChipVersion)?"CHIP_8192C":"CHIP_8188C");
  64479. + }
  64480. + else if(IS_92D(ChipVersion)){
  64481. + DBG_871X("Chip Version Info: CHIP_8192D_");
  64482. + }
  64483. + else if(IS_8723_SERIES(ChipVersion)){
  64484. + DBG_871X("Chip Version Info: CHIP_8723A_");
  64485. + }
  64486. + else if(IS_8188E(ChipVersion)){
  64487. + DBG_871X("Chip Version Info: CHIP_8188E_");
  64488. + }
  64489. +
  64490. + DBG_871X("%s_",IS_NORMAL_CHIP(ChipVersion)?"Normal_Chip":"Test_Chip");
  64491. + DBG_871X("%s_",IS_CHIP_VENDOR_TSMC(ChipVersion)?"TSMC":"UMC");
  64492. + if(IS_A_CUT(ChipVersion)) DBG_871X("A_CUT_");
  64493. + else if(IS_B_CUT(ChipVersion)) DBG_871X("B_CUT_");
  64494. + else if(IS_C_CUT(ChipVersion)) DBG_871X("C_CUT_");
  64495. + else if(IS_D_CUT(ChipVersion)) DBG_871X("D_CUT_");
  64496. + else if(IS_E_CUT(ChipVersion)) DBG_871X("E_CUT_");
  64497. + else DBG_871X("UNKNOWN_CUT(%d)_",ChipVersion.CUTVersion);
  64498. +
  64499. + if(IS_1T1R(ChipVersion)) DBG_871X("1T1R_");
  64500. + else if(IS_1T2R(ChipVersion)) DBG_871X("1T2R_");
  64501. + else if(IS_2T2R(ChipVersion)) DBG_871X("2T2R_");
  64502. + else DBG_871X("UNKNOWN_RFTYPE(%d)_",ChipVersion.RFType);
  64503. +
  64504. +
  64505. + DBG_871X("RomVer(%d)\n",ChipVersion.ROMVer);
  64506. +}
  64507. +
  64508. +#endif
  64509. +
  64510. +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
  64511. +
  64512. +u8 //return the final channel plan decision
  64513. +hal_com_get_channel_plan(
  64514. + IN PADAPTER padapter,
  64515. + IN u8 hw_channel_plan, //channel plan from HW (efuse/eeprom)
  64516. + IN u8 sw_channel_plan, //channel plan from SW (registry/module param)
  64517. + IN u8 def_channel_plan, //channel plan used when the former two is invalid
  64518. + IN BOOLEAN AutoLoadFail
  64519. + )
  64520. +{
  64521. + u8 swConfig;
  64522. + u8 chnlPlan;
  64523. +
  64524. + swConfig = _TRUE;
  64525. + if (!AutoLoadFail)
  64526. + {
  64527. + if (!rtw_is_channel_plan_valid(sw_channel_plan))
  64528. + swConfig = _FALSE;
  64529. + if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
  64530. + swConfig = _FALSE;
  64531. + }
  64532. +
  64533. + if (swConfig == _TRUE)
  64534. + chnlPlan = sw_channel_plan;
  64535. + else
  64536. + chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
  64537. +
  64538. + if (!rtw_is_channel_plan_valid(chnlPlan))
  64539. + chnlPlan = def_channel_plan;
  64540. +
  64541. + return chnlPlan;
  64542. +}
  64543. +
  64544. +u8 MRateToHwRate(u8 rate)
  64545. +{
  64546. + u8 ret = DESC_RATE1M;
  64547. +
  64548. + switch(rate)
  64549. + {
  64550. + // CCK and OFDM non-HT rates
  64551. + case IEEE80211_CCK_RATE_1MB: ret = DESC_RATE1M; break;
  64552. + case IEEE80211_CCK_RATE_2MB: ret = DESC_RATE2M; break;
  64553. + case IEEE80211_CCK_RATE_5MB: ret = DESC_RATE5_5M; break;
  64554. + case IEEE80211_CCK_RATE_11MB: ret = DESC_RATE11M; break;
  64555. + case IEEE80211_OFDM_RATE_6MB: ret = DESC_RATE6M; break;
  64556. + case IEEE80211_OFDM_RATE_9MB: ret = DESC_RATE9M; break;
  64557. + case IEEE80211_OFDM_RATE_12MB: ret = DESC_RATE12M; break;
  64558. + case IEEE80211_OFDM_RATE_18MB: ret = DESC_RATE18M; break;
  64559. + case IEEE80211_OFDM_RATE_24MB: ret = DESC_RATE24M; break;
  64560. + case IEEE80211_OFDM_RATE_36MB: ret = DESC_RATE36M; break;
  64561. + case IEEE80211_OFDM_RATE_48MB: ret = DESC_RATE48M; break;
  64562. + case IEEE80211_OFDM_RATE_54MB: ret = DESC_RATE54M; break;
  64563. +
  64564. + // HT rates since here
  64565. + //case MGN_MCS0: ret = DESC_RATEMCS0; break;
  64566. + //case MGN_MCS1: ret = DESC_RATEMCS1; break;
  64567. + //case MGN_MCS2: ret = DESC_RATEMCS2; break;
  64568. + //case MGN_MCS3: ret = DESC_RATEMCS3; break;
  64569. + //case MGN_MCS4: ret = DESC_RATEMCS4; break;
  64570. + //case MGN_MCS5: ret = DESC_RATEMCS5; break;
  64571. + //case MGN_MCS6: ret = DESC_RATEMCS6; break;
  64572. + //case MGN_MCS7: ret = DESC_RATEMCS7; break;
  64573. +
  64574. + default: break;
  64575. + }
  64576. +
  64577. + return ret;
  64578. +}
  64579. +
  64580. +void HalSetBrateCfg(
  64581. + IN PADAPTER Adapter,
  64582. + IN u8 *mBratesOS,
  64583. + OUT u16 *pBrateCfg)
  64584. +{
  64585. + u8 i, is_brate, brate;
  64586. +
  64587. + for(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)
  64588. + {
  64589. + is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
  64590. + brate = mBratesOS[i] & 0x7f;
  64591. +
  64592. + if( is_brate )
  64593. + {
  64594. + switch(brate)
  64595. + {
  64596. + case IEEE80211_CCK_RATE_1MB: *pBrateCfg |= RATE_1M; break;
  64597. + case IEEE80211_CCK_RATE_2MB: *pBrateCfg |= RATE_2M; break;
  64598. + case IEEE80211_CCK_RATE_5MB: *pBrateCfg |= RATE_5_5M;break;
  64599. + case IEEE80211_CCK_RATE_11MB: *pBrateCfg |= RATE_11M; break;
  64600. + case IEEE80211_OFDM_RATE_6MB: *pBrateCfg |= RATE_6M; break;
  64601. + case IEEE80211_OFDM_RATE_9MB: *pBrateCfg |= RATE_9M; break;
  64602. + case IEEE80211_OFDM_RATE_12MB: *pBrateCfg |= RATE_12M; break;
  64603. + case IEEE80211_OFDM_RATE_18MB: *pBrateCfg |= RATE_18M; break;
  64604. + case IEEE80211_OFDM_RATE_24MB: *pBrateCfg |= RATE_24M; break;
  64605. + case IEEE80211_OFDM_RATE_36MB: *pBrateCfg |= RATE_36M; break;
  64606. + case IEEE80211_OFDM_RATE_48MB: *pBrateCfg |= RATE_48M; break;
  64607. + case IEEE80211_OFDM_RATE_54MB: *pBrateCfg |= RATE_54M; break;
  64608. + }
  64609. + }
  64610. + }
  64611. +}
  64612. +
  64613. +void hal_init_macaddr(_adapter *adapter)
  64614. +{
  64615. + rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
  64616. +#ifdef CONFIG_CONCURRENT_MODE
  64617. + if (adapter->pbuddy_adapter)
  64618. + rtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter->pbuddy_adapter->eeprompriv.mac_addr);
  64619. +#endif
  64620. +}
  64621. +
  64622. +/*
  64623. +* C2H event format:
  64624. +* Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
  64625. +* BITS [127:120] [119:16] [15:8] [7:4] [3:0]
  64626. +*/
  64627. +
  64628. +void c2h_evt_clear(_adapter *adapter)
  64629. +{
  64630. + rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
  64631. +}
  64632. +
  64633. +s32 c2h_evt_read(_adapter *adapter, u8 *buf)
  64634. +{
  64635. + s32 ret = _FAIL;
  64636. + struct c2h_evt_hdr *c2h_evt;
  64637. + int i;
  64638. + u8 trigger;
  64639. +
  64640. + if (buf == NULL)
  64641. + goto exit;
  64642. +
  64643. + trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
  64644. +
  64645. + if (trigger == C2H_EVT_HOST_CLOSE) {
  64646. + goto exit; /* Not ready */
  64647. + } else if (trigger != C2H_EVT_FW_CLOSE) {
  64648. + goto clear_evt; /* Not a valid value */
  64649. + }
  64650. +
  64651. + c2h_evt = (struct c2h_evt_hdr *)buf;
  64652. +
  64653. + _rtw_memset(c2h_evt, 0, 16);
  64654. +
  64655. + *buf = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
  64656. + *(buf+1) = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1);
  64657. +
  64658. + RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): ",
  64659. + &c2h_evt , sizeof(c2h_evt));
  64660. +
  64661. + if (0) {
  64662. + DBG_871X("%s id:%u, len:%u, seq:%u, trigger:0x%02x\n", __func__
  64663. + , c2h_evt->id, c2h_evt->plen, c2h_evt->seq, trigger);
  64664. + }
  64665. +
  64666. + /* Read the content */
  64667. + for (i = 0; i < c2h_evt->plen; i++)
  64668. + c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + sizeof(*c2h_evt) + i);
  64669. +
  64670. + RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n",
  64671. + c2h_evt->payload, c2h_evt->plen);
  64672. +
  64673. + ret = _SUCCESS;
  64674. +
  64675. +clear_evt:
  64676. + /*
  64677. + * Clear event to notify FW we have read the command.
  64678. + * If this field isn't clear, the FW won't update the next command message.
  64679. + */
  64680. + c2h_evt_clear(adapter);
  64681. +exit:
  64682. + return ret;
  64683. +}
  64684. --- /dev/null
  64685. +++ b/drivers/net/wireless/rtl8192cu/hal/hal_intf.c
  64686. @@ -0,0 +1,545 @@
  64687. +/******************************************************************************
  64688. + *
  64689. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  64690. + *
  64691. + * This program is free software; you can redistribute it and/or modify it
  64692. + * under the terms of version 2 of the GNU General Public License as
  64693. + * published by the Free Software Foundation.
  64694. + *
  64695. + * This program is distributed in the hope that it will be useful, but WITHOUT
  64696. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  64697. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  64698. + * more details.
  64699. + *
  64700. + * You should have received a copy of the GNU General Public License along with
  64701. + * this program; if not, write to the Free Software Foundation, Inc.,
  64702. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  64703. + *
  64704. + *
  64705. + ******************************************************************************/
  64706. +
  64707. +#define _HAL_INTF_C_
  64708. +#include <drv_conf.h>
  64709. +#include <osdep_service.h>
  64710. +#include <drv_types.h>
  64711. +#include <rtw_byteorder.h>
  64712. +
  64713. +#include <hal_intf.h>
  64714. +
  64715. +#ifdef CONFIG_SDIO_HCI
  64716. + #include <sdio_hal.h>
  64717. +#elif defined(CONFIG_USB_HCI)
  64718. + #include <usb_hal.h>
  64719. +#elif defined(CONFIG_GSPI_HCI)
  64720. + #include <gspi_hal.h>
  64721. +#endif
  64722. +
  64723. +void rtw_hal_chip_configure(_adapter *padapter)
  64724. +{
  64725. + if(padapter->HalFunc.intf_chip_configure)
  64726. + padapter->HalFunc.intf_chip_configure(padapter);
  64727. +}
  64728. +
  64729. +void rtw_hal_read_chip_info(_adapter *padapter)
  64730. +{
  64731. + if(padapter->HalFunc.read_adapter_info)
  64732. + padapter->HalFunc.read_adapter_info(padapter);
  64733. +}
  64734. +
  64735. +void rtw_hal_read_chip_version(_adapter *padapter)
  64736. +{
  64737. + if(padapter->HalFunc.read_chip_version)
  64738. + padapter->HalFunc.read_chip_version(padapter);
  64739. +}
  64740. +
  64741. +void rtw_hal_def_value_init(_adapter *padapter)
  64742. +{
  64743. + if(padapter->HalFunc.init_default_value)
  64744. + padapter->HalFunc.init_default_value(padapter);
  64745. +}
  64746. +
  64747. +void rtw_hal_free_data(_adapter *padapter)
  64748. +{
  64749. + if(padapter->HalFunc.free_hal_data)
  64750. + padapter->HalFunc.free_hal_data(padapter);
  64751. +}
  64752. +
  64753. +void rtw_hal_dm_init(_adapter *padapter)
  64754. +{
  64755. + if(padapter->HalFunc.dm_init)
  64756. + padapter->HalFunc.dm_init(padapter);
  64757. +}
  64758. +
  64759. +void rtw_hal_dm_deinit(_adapter *padapter)
  64760. +{
  64761. + // cancel dm timer
  64762. + if(padapter->HalFunc.dm_deinit)
  64763. + padapter->HalFunc.dm_deinit(padapter);
  64764. +}
  64765. +
  64766. +void rtw_hal_sw_led_init(_adapter *padapter)
  64767. +{
  64768. + if(padapter->HalFunc.InitSwLeds)
  64769. + padapter->HalFunc.InitSwLeds(padapter);
  64770. +}
  64771. +
  64772. +void rtw_hal_sw_led_deinit(_adapter *padapter)
  64773. +{
  64774. + if(padapter->HalFunc.DeInitSwLeds)
  64775. + padapter->HalFunc.DeInitSwLeds(padapter);
  64776. +}
  64777. +
  64778. +uint rtw_hal_init(_adapter *padapter)
  64779. +{
  64780. + uint status = _SUCCESS;
  64781. +
  64782. + if(padapter->hw_init_completed == _TRUE)
  64783. + {
  64784. + DBG_871X("rtw_hal_init: hw_init_completed == _TRUE\n");
  64785. + goto success;
  64786. + }
  64787. +#ifdef CONFIG_DEINIT_BEFORE_INIT
  64788. + status = padapter->HalFunc.hal_deinit(padapter);
  64789. + if(status != _SUCCESS){
  64790. + DBG_871X("rtw_hal_init: hal_deinit before hal_init FAIL !!\n");
  64791. + goto fail;
  64792. + }
  64793. +#endif
  64794. +
  64795. +#ifdef CONFIG_DUALMAC_CONCURRENT
  64796. + // before init mac0, driver must init mac1 first to avoid usb rx error.
  64797. + if((padapter->pbuddy_adapter != NULL) && (padapter->DualMacConcurrent == _TRUE)
  64798. + && (padapter->adapter_type == PRIMARY_ADAPTER))
  64799. + {
  64800. + if(padapter->pbuddy_adapter->hw_init_completed == _TRUE)
  64801. + {
  64802. + DBG_871X("rtw_hal_init: pbuddy_adapter hw_init_completed == _TRUE\n");
  64803. + }
  64804. + else
  64805. + {
  64806. +#ifdef CONFIG_DEINIT_BEFORE_INIT
  64807. + status = padapter->HalFunc.hal_deinit(padapter->pbuddy_adapter);
  64808. + if(status != _SUCCESS){
  64809. + DBG_871X("rtw_hal_init: hal_deinit before hal_init FAIL !!(pbuddy_adapter)\n");
  64810. + goto fail;
  64811. + }
  64812. +#endif
  64813. + status = padapter->HalFunc.hal_init(padapter->pbuddy_adapter);
  64814. + if(status == _SUCCESS){
  64815. + padapter->pbuddy_adapter->hw_init_completed = _TRUE;
  64816. + }
  64817. + else{
  64818. + padapter->pbuddy_adapter->hw_init_completed = _FALSE;
  64819. + RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail(pbuddy_adapter)\n"));
  64820. + goto fail;
  64821. + }
  64822. + }
  64823. + }
  64824. +#else
  64825. + if(adapter_to_dvobj(padapter)->DualMacMode == _TRUE)
  64826. + {
  64827. + if(padapter->pbuddy_adapter != NULL) {
  64828. + if(padapter->pbuddy_adapter->hw_init_completed == _FALSE)
  64829. + {
  64830. +#ifdef CONFIG_DEINIT_BEFORE_INIT
  64831. + status = padapter->HalFunc.hal_deinit(padapter->pbuddy_adapter);
  64832. + if(status != _SUCCESS){
  64833. + DBG_871X("rtw_hal_init: hal_deinit before hal_init FAIL !!(pbuddy_adapter)\n");
  64834. + goto fail;
  64835. + }
  64836. +#endif
  64837. + status = padapter->HalFunc.hal_init(padapter->pbuddy_adapter);
  64838. + if(status == _SUCCESS){
  64839. + padapter->pbuddy_adapter->hw_init_completed = _TRUE;
  64840. + }
  64841. + else{
  64842. + padapter->pbuddy_adapter->hw_init_completed = _FALSE;
  64843. + RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail for another interface\n"));
  64844. + }
  64845. + }
  64846. + }
  64847. + }
  64848. +#endif
  64849. +
  64850. + padapter->hw_init_completed=_FALSE;
  64851. +
  64852. + status = padapter->HalFunc.hal_init(padapter);
  64853. +
  64854. + if(status == _SUCCESS){
  64855. + padapter->hw_init_completed = _TRUE;
  64856. + }
  64857. + else{
  64858. + padapter->hw_init_completed = _FALSE;
  64859. + RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail\n"));
  64860. + goto fail;
  64861. + }
  64862. +
  64863. +success:
  64864. +
  64865. + if (padapter->registrypriv.notch_filter == 1)
  64866. + rtw_hal_notch_filter(padapter, 1);
  64867. +
  64868. + rtw_hal_reset_security_engine(padapter);
  64869. +
  64870. + rtw_sec_restore_wep_key(padapter);
  64871. +
  64872. + init_hw_mlme_ext(padapter);
  64873. +
  64874. +fail:
  64875. +
  64876. + RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status));
  64877. +
  64878. + return status;
  64879. +}
  64880. +
  64881. +uint rtw_hal_deinit(_adapter *padapter)
  64882. +{
  64883. + uint status = _SUCCESS;
  64884. +
  64885. +_func_enter_;
  64886. +
  64887. + status = padapter->HalFunc.hal_deinit(padapter);
  64888. +
  64889. + if(status == _SUCCESS){
  64890. + padapter->hw_init_completed = _FALSE;
  64891. + }
  64892. + else
  64893. + {
  64894. + RT_TRACE(_module_hal_init_c_,_drv_err_,("\n rtw_hal_deinit: hal_init fail\n"));
  64895. + }
  64896. +
  64897. +_func_exit_;
  64898. +
  64899. + return status;
  64900. +}
  64901. +
  64902. +void rtw_hal_set_hwreg(_adapter *padapter, u8 variable, u8 *val)
  64903. +{
  64904. + if (padapter->HalFunc.SetHwRegHandler)
  64905. + padapter->HalFunc.SetHwRegHandler(padapter, variable, val);
  64906. +}
  64907. +
  64908. +void rtw_hal_get_hwreg(_adapter *padapter, u8 variable, u8 *val)
  64909. +{
  64910. + if (padapter->HalFunc.GetHwRegHandler)
  64911. + padapter->HalFunc.GetHwRegHandler(padapter, variable, val);
  64912. +}
  64913. +
  64914. +u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)
  64915. +{
  64916. + if(padapter->HalFunc.SetHalDefVarHandler)
  64917. + return padapter->HalFunc.SetHalDefVarHandler(padapter,eVariable,pValue);
  64918. + return _FAIL;
  64919. +}
  64920. +
  64921. +u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)
  64922. +{
  64923. + if(padapter->HalFunc.GetHalDefVarHandler)
  64924. + return padapter->HalFunc.GetHalDefVarHandler(padapter,eVariable,pValue);
  64925. + return _FAIL;
  64926. +}
  64927. +
  64928. +void rtw_hal_enable_interrupt(_adapter *padapter)
  64929. +{
  64930. + if (padapter->HalFunc.enable_interrupt)
  64931. + padapter->HalFunc.enable_interrupt(padapter);
  64932. + else
  64933. + DBG_871X("%s: HalFunc.enable_interrupt is NULL!\n", __FUNCTION__);
  64934. +
  64935. +}
  64936. +void rtw_hal_disable_interrupt(_adapter *padapter)
  64937. +{
  64938. + if (padapter->HalFunc.disable_interrupt)
  64939. + padapter->HalFunc.disable_interrupt(padapter);
  64940. + else
  64941. + DBG_871X("%s: HalFunc.disable_interrupt is NULL!\n", __FUNCTION__);
  64942. +
  64943. +}
  64944. +
  64945. +u32 rtw_hal_inirp_init(_adapter *padapter)
  64946. +{
  64947. + u32 rst = _FAIL;
  64948. + if(padapter->HalFunc.inirp_init)
  64949. + rst = padapter->HalFunc.inirp_init(padapter);
  64950. + else
  64951. + DBG_871X(" %s HalFunc.inirp_init is NULL!!!\n",__FUNCTION__);
  64952. + return rst;
  64953. +}
  64954. +
  64955. +u32 rtw_hal_inirp_deinit(_adapter *padapter)
  64956. +{
  64957. +
  64958. + if(padapter->HalFunc.inirp_deinit)
  64959. + return padapter->HalFunc.inirp_deinit(padapter);
  64960. +
  64961. + return _FAIL;
  64962. +
  64963. +}
  64964. +
  64965. +u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val)
  64966. +{
  64967. + if(padapter->HalFunc.interface_ps_func)
  64968. + return padapter->HalFunc.interface_ps_func(padapter,efunc_id,val);
  64969. + return _FAIL;
  64970. +}
  64971. +
  64972. +s32 rtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
  64973. +{
  64974. + if(padapter->HalFunc.hal_xmitframe_enqueue)
  64975. + return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe);
  64976. +
  64977. + return _FALSE;
  64978. +}
  64979. +
  64980. +s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)
  64981. +{
  64982. + if(padapter->HalFunc.hal_xmit)
  64983. + return padapter->HalFunc.hal_xmit(padapter, pxmitframe);
  64984. +
  64985. + return _FALSE;
  64986. +}
  64987. +
  64988. +s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)
  64989. +{
  64990. + s32 ret = _FAIL;
  64991. + unsigned char *pframe;
  64992. + struct rtw_ieee80211_hdr *pwlanhdr;
  64993. +
  64994. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  64995. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  64996. + _rtw_memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN);
  64997. +
  64998. +#ifdef CONFIG_IEEE80211W
  64999. + if(padapter->securitypriv.binstallBIPkey == _TRUE)
  65000. + {
  65001. + if(IS_MCAST(pmgntframe->attrib.ra))
  65002. + {
  65003. + pmgntframe->attrib.encrypt = _BIP_;
  65004. + //pmgntframe->attrib.bswenc = _TRUE;
  65005. + }
  65006. + else
  65007. + {
  65008. + pmgntframe->attrib.encrypt = _AES_;
  65009. + pmgntframe->attrib.bswenc = _TRUE;
  65010. + }
  65011. + rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);
  65012. + }
  65013. +#endif //CONFIG_IEEE80211W
  65014. +
  65015. + if(padapter->HalFunc.mgnt_xmit)
  65016. + ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe);
  65017. + return ret;
  65018. +}
  65019. +
  65020. +s32 rtw_hal_init_xmit_priv(_adapter *padapter)
  65021. +{
  65022. + if(padapter->HalFunc.init_xmit_priv != NULL)
  65023. + return padapter->HalFunc.init_xmit_priv(padapter);
  65024. + return _FAIL;
  65025. +}
  65026. +
  65027. +void rtw_hal_free_xmit_priv(_adapter *padapter)
  65028. +{
  65029. + if(padapter->HalFunc.free_xmit_priv != NULL)
  65030. + padapter->HalFunc.free_xmit_priv(padapter);
  65031. +}
  65032. +
  65033. +s32 rtw_hal_init_recv_priv(_adapter *padapter)
  65034. +{
  65035. + if(padapter->HalFunc.init_recv_priv)
  65036. + return padapter->HalFunc.init_recv_priv(padapter);
  65037. +
  65038. + return _FAIL;
  65039. +}
  65040. +
  65041. +void rtw_hal_free_recv_priv(_adapter *padapter)
  65042. +{
  65043. + if(padapter->HalFunc.free_recv_priv)
  65044. + padapter->HalFunc.free_recv_priv(padapter);
  65045. +}
  65046. +
  65047. +void rtw_hal_update_ra_mask(_adapter *padapter, u32 mac_id)
  65048. +{
  65049. + if(padapter->HalFunc.UpdateRAMaskHandler)
  65050. + padapter->HalFunc.UpdateRAMaskHandler(padapter,mac_id);
  65051. +}
  65052. +
  65053. +void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8 arg)
  65054. +{
  65055. + if(padapter->HalFunc.Add_RateATid)
  65056. + padapter->HalFunc.Add_RateATid(padapter, bitmap, arg);
  65057. +}
  65058. +
  65059. +u32 rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask)
  65060. +{
  65061. + u32 data = 0;
  65062. + if (padapter->HalFunc.read_bbreg)
  65063. + data = padapter->HalFunc.read_bbreg(padapter, RegAddr, BitMask);
  65064. + return data;
  65065. +}
  65066. +
  65067. +void rtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
  65068. +{
  65069. + if (padapter->HalFunc.write_bbreg)
  65070. + padapter->HalFunc.write_bbreg(padapter, RegAddr, BitMask, Data);
  65071. +}
  65072. +
  65073. +u32 rtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask)
  65074. +{
  65075. + u32 data = 0;
  65076. + if (padapter->HalFunc.read_rfreg)
  65077. + data = padapter->HalFunc.read_rfreg(padapter, eRFPath, RegAddr, BitMask);
  65078. + return data;
  65079. +}
  65080. +
  65081. +void rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
  65082. +{
  65083. + if (padapter->HalFunc.write_rfreg)
  65084. + padapter->HalFunc.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data);
  65085. +}
  65086. +
  65087. +s32 rtw_hal_interrupt_handler(_adapter *padapter)
  65088. +{
  65089. + if(padapter->HalFunc.interrupt_handler)
  65090. + return padapter->HalFunc.interrupt_handler(padapter);
  65091. + return _FAIL;
  65092. +}
  65093. +
  65094. +void rtw_hal_set_bwmode(_adapter *padapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset)
  65095. +{
  65096. + if(padapter->HalFunc.set_bwmode_handler)
  65097. + padapter->HalFunc.set_bwmode_handler(padapter, Bandwidth, Offset);
  65098. +}
  65099. +
  65100. +void rtw_hal_set_chan(_adapter *padapter, u8 channel)
  65101. +{
  65102. + if(padapter->HalFunc.set_channel_handler)
  65103. + padapter->HalFunc.set_channel_handler(padapter, channel);
  65104. +}
  65105. +
  65106. +void rtw_hal_dm_watchdog(_adapter *padapter)
  65107. +{
  65108. + if(padapter->HalFunc.hal_dm_watchdog)
  65109. + padapter->HalFunc.hal_dm_watchdog(padapter);
  65110. +}
  65111. +
  65112. +void rtw_hal_bcn_related_reg_setting(_adapter *padapter)
  65113. +{
  65114. + if(padapter->HalFunc.SetBeaconRelatedRegistersHandler)
  65115. + padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter);
  65116. +}
  65117. +
  65118. +#ifdef CONFIG_ANTENNA_DIVERSITY
  65119. +u8 rtw_hal_antdiv_before_linked(_adapter *padapter)
  65120. +{
  65121. + if (padapter->HalFunc.AntDivBeforeLinkHandler)
  65122. + return padapter->HalFunc.AntDivBeforeLinkHandler(padapter);
  65123. + return _FALSE;
  65124. +}
  65125. +
  65126. +void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)
  65127. +{
  65128. + if (padapter->HalFunc.AntDivCompareHandler)
  65129. + padapter->HalFunc.AntDivCompareHandler(padapter, dst, src);
  65130. +}
  65131. +#endif
  65132. +
  65133. +#ifdef CONFIG_HOSTAPD_MLME
  65134. +s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)
  65135. +{
  65136. + if (padapter->HalFunc.hostap_mgnt_xmit_entry)
  65137. + return padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, pkt);
  65138. + return _FAIL;
  65139. +}
  65140. +#endif //CONFIG_HOSTAPD_MLME
  65141. +
  65142. +#ifdef DBG_CONFIG_ERROR_DETECT
  65143. +void rtw_hal_sreset_init(_adapter *padapter)
  65144. +{
  65145. + if(padapter->HalFunc.sreset_init_value)
  65146. + padapter->HalFunc.sreset_init_value(padapter);
  65147. +}
  65148. +
  65149. +void rtw_hal_sreset_reset(_adapter *padapter)
  65150. +{
  65151. + padapter = GET_PRIMARY_ADAPTER(padapter);
  65152. +
  65153. + if(padapter->HalFunc.silentreset)
  65154. + padapter->HalFunc.silentreset(padapter);
  65155. +}
  65156. +
  65157. +void rtw_hal_sreset_reset_value(_adapter *padapter)
  65158. +{
  65159. + if(padapter->HalFunc.sreset_reset_value)
  65160. + padapter->HalFunc.sreset_reset_value(padapter);
  65161. +}
  65162. +
  65163. +void rtw_hal_sreset_xmit_status_check(_adapter *padapter)
  65164. +{
  65165. +#ifdef CONFIG_CONCURRENT_MODE
  65166. + if (padapter->adapter_type != PRIMARY_ADAPTER)
  65167. + return;
  65168. +#endif
  65169. + if(padapter->HalFunc.sreset_xmit_status_check)
  65170. + padapter->HalFunc.sreset_xmit_status_check(padapter);
  65171. +}
  65172. +
  65173. +void rtw_hal_sreset_linked_status_check(_adapter *padapter)
  65174. +{
  65175. + if(padapter->HalFunc.sreset_linked_status_check)
  65176. + padapter->HalFunc.sreset_linked_status_check(padapter);
  65177. +}
  65178. +
  65179. +u8 rtw_hal_sreset_get_wifi_status(_adapter *padapter)
  65180. +{
  65181. + u8 status = 0;
  65182. + if(padapter->HalFunc.sreset_get_wifi_status)
  65183. + status = padapter->HalFunc.sreset_get_wifi_status(padapter);
  65184. + return status;
  65185. +}
  65186. +
  65187. +bool rtw_hal_sreset_inprogress(_adapter *padapter)
  65188. +{
  65189. + bool inprogress = _FALSE;
  65190. +
  65191. + padapter = GET_PRIMARY_ADAPTER(padapter);
  65192. +
  65193. + if(padapter->HalFunc.sreset_inprogress)
  65194. + inprogress = padapter->HalFunc.sreset_inprogress(padapter);
  65195. + return inprogress;
  65196. +}
  65197. +#endif //DBG_CONFIG_ERROR_DETECT
  65198. +
  65199. +#ifdef CONFIG_IOL
  65200. +int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms)
  65201. +{
  65202. + if (adapter->HalFunc.IOL_exec_cmds_sync)
  65203. + return adapter->HalFunc.IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms);
  65204. + return _FAIL;
  65205. +}
  65206. +#endif
  65207. +
  65208. +void rtw_hal_notch_filter(_adapter *adapter, bool enable)
  65209. +{
  65210. + if(adapter->HalFunc.hal_notch_filter)
  65211. + adapter->HalFunc.hal_notch_filter(adapter,enable);
  65212. +}
  65213. +
  65214. +void rtw_hal_reset_security_engine(_adapter * adapter)
  65215. +{
  65216. + if(adapter->HalFunc.hal_reset_security_engine)
  65217. + adapter->HalFunc.hal_reset_security_engine(adapter);
  65218. +}
  65219. +
  65220. +s32 rtw_hal_c2h_handler(_adapter *adapter, struct c2h_evt_hdr *c2h_evt)
  65221. +{
  65222. + s32 ret = _FAIL;
  65223. + if (adapter->HalFunc.c2h_handler)
  65224. + ret = adapter->HalFunc.c2h_handler(adapter, c2h_evt);
  65225. + return ret;
  65226. +}
  65227. +
  65228. +c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter)
  65229. +{
  65230. + return adapter->HalFunc.c2h_id_filter_ccx;
  65231. +}
  65232. --- /dev/null
  65233. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c
  65234. @@ -0,0 +1,1154 @@
  65235. +/******************************************************************************
  65236. + *
  65237. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  65238. + *
  65239. + * This program is free software; you can redistribute it and/or modify it
  65240. + * under the terms of version 2 of the GNU General Public License as
  65241. + * published by the Free Software Foundation.
  65242. + *
  65243. + * This program is distributed in the hope that it will be useful, but WITHOUT
  65244. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  65245. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  65246. + * more details.
  65247. + *
  65248. + * You should have received a copy of the GNU General Public License along with
  65249. + * this program; if not, write to the Free Software Foundation, Inc.,
  65250. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  65251. + *
  65252. + *
  65253. + ******************************************************************************/
  65254. +#define _RTL8192C_CMD_C_
  65255. +
  65256. +#include <drv_conf.h>
  65257. +#include <osdep_service.h>
  65258. +#include <drv_types.h>
  65259. +#include <recv_osdep.h>
  65260. +#include <cmd_osdep.h>
  65261. +#include <mlme_osdep.h>
  65262. +#include <rtw_byteorder.h>
  65263. +#include <circ_buf.h>
  65264. +#include <rtw_ioctl_set.h>
  65265. +
  65266. +#include <rtl8192c_hal.h>
  65267. +
  65268. +
  65269. +#define RTL92C_MAX_H2C_BOX_NUMS 4
  65270. +#define RTL92C_MAX_CMD_LEN 5
  65271. +#define MESSAGE_BOX_SIZE 4
  65272. +#define EX_MESSAGE_BOX_SIZE 2
  65273. +
  65274. +static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num)
  65275. +{
  65276. + u8 read_down = _FALSE;
  65277. + int retry_cnts = 100;
  65278. +
  65279. + u8 valid;
  65280. +
  65281. +// DBG_8192C(" _is_fw_read_cmd_down ,isnormal_chip(%x),reg_1cc(%x),msg_box(%d)...\n",isvern,rtw_read8(padapter,REG_HMETFR),msgbox_num);
  65282. +
  65283. + do{
  65284. + valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num);
  65285. + if(0 == valid ){
  65286. + read_down = _TRUE;
  65287. + }
  65288. + }while( (!read_down) && (retry_cnts--));
  65289. +
  65290. + return read_down;
  65291. +
  65292. +}
  65293. +
  65294. +
  65295. +/*****************************************
  65296. +* H2C Msg format :
  65297. +*| 31 - 8 |7 | 6 - 0 |
  65298. +*| h2c_msg |Ext_bit |CMD_ID |
  65299. +*
  65300. +******************************************/
  65301. +int rtl8192c_FillH2CCmd(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer)
  65302. +{
  65303. + u8 bcmd_down = _FALSE;
  65304. + int retry_cnts = 100;
  65305. + u8 h2c_box_num;
  65306. + u32 msgbox_addr;
  65307. + u32 msgbox_ex_addr;
  65308. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  65309. + u32 h2c_cmd = 0;
  65310. + u16 h2c_cmd_ex = 0;
  65311. + int ret = _FAIL;
  65312. +
  65313. +_func_enter_;
  65314. +
  65315. + padapter = GET_PRIMARY_ADAPTER(padapter);
  65316. + pHalData = GET_HAL_DATA(padapter);
  65317. +
  65318. + if(padapter->bFWReady == _FALSE)
  65319. + {
  65320. + DBG_8192C("FillH2CCmd(): return H2C cmd because fw is not ready\n");
  65321. + return ret;
  65322. + }
  65323. +
  65324. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);
  65325. +
  65326. + if(!pCmdBuffer){
  65327. + goto exit;
  65328. + }
  65329. + if(CmdLen > RTL92C_MAX_CMD_LEN){
  65330. + goto exit;
  65331. + }
  65332. + //pay attention to if race condition happened in H2C cmd setting.
  65333. + do{
  65334. + h2c_box_num = pHalData->LastHMEBoxNum;
  65335. +
  65336. + if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){
  65337. + DBG_8192C(" fw read cmd failed...\n");
  65338. + goto exit;
  65339. + }
  65340. +
  65341. + if(CmdLen<=3)
  65342. + {
  65343. + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen );
  65344. + }
  65345. + else{
  65346. + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE);
  65347. + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE));
  65348. + *(u8*)(&h2c_cmd) |= BIT(7);
  65349. + }
  65350. +
  65351. + *(u8*)(&h2c_cmd) |= ElementID;
  65352. +
  65353. + if(h2c_cmd & BIT(7)){
  65354. + msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE);
  65355. + h2c_cmd_ex = cpu_to_le16( h2c_cmd_ex );
  65356. + rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex);
  65357. + }
  65358. + msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE);
  65359. + h2c_cmd = cpu_to_le32( h2c_cmd );
  65360. + rtw_write32(padapter,msgbox_addr, h2c_cmd);
  65361. +
  65362. + bcmd_down = _TRUE;
  65363. +
  65364. + // DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n"
  65365. + // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex);
  65366. +
  65367. + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS ;
  65368. +
  65369. + }while((!bcmd_down) && (retry_cnts--));
  65370. +/*
  65371. + if(bcmd_down)
  65372. + DBG_8192C("H2C Cmd exe down. \n" );
  65373. + else
  65374. + DBG_8192C("H2C Cmd exe failed. \n" );
  65375. +*/
  65376. + ret = _SUCCESS;
  65377. +
  65378. +exit:
  65379. +
  65380. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);
  65381. +
  65382. +_func_exit_;
  65383. +
  65384. + return ret;
  65385. +
  65386. +}
  65387. +
  65388. +u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf)
  65389. +{
  65390. + u8 ElementID, CmdLen;
  65391. + u8 *pCmdBuffer;
  65392. + struct cmd_msg_parm *pcmdmsg;
  65393. +
  65394. + if(!pbuf)
  65395. + return H2C_PARAMETERS_ERROR;
  65396. +
  65397. + pcmdmsg = (struct cmd_msg_parm*)pbuf;
  65398. + ElementID = pcmdmsg->eid;
  65399. + CmdLen = pcmdmsg->sz;
  65400. + pCmdBuffer = pcmdmsg->buf;
  65401. +
  65402. + rtl8192c_FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer);
  65403. +
  65404. + return H2C_SUCCESS;
  65405. +}
  65406. +
  65407. +#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED)
  65408. +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period)
  65409. +{
  65410. + u8 res=_SUCCESS;
  65411. + struct H2C_SS_RFOFF_PARAM param;
  65412. + DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll);
  65413. + param.gpio_period = period;//Polling GPIO_11 period time
  65414. + param.ROFOn = (_TRUE == bfwpoll)?1:0;
  65415. + rtl8192c_FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(&param));
  65416. + return res;
  65417. +}
  65418. +#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED
  65419. +
  65420. +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param)
  65421. +{
  65422. + u8 res=_SUCCESS;
  65423. +
  65424. +_func_enter_;
  65425. +
  65426. + *((u32*) param ) = cpu_to_le32( *((u32*) param ) );
  65427. +
  65428. + rtl8192c_FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param);
  65429. +
  65430. +_func_exit_;
  65431. +
  65432. + return res;
  65433. +}
  65434. +
  65435. +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg)
  65436. +{
  65437. + u8 buf[5];
  65438. + u8 res=_SUCCESS;
  65439. +
  65440. +_func_enter_;
  65441. +
  65442. + _rtw_memset(buf, 0, 5);
  65443. + mask = cpu_to_le32( mask );
  65444. + _rtw_memcpy(buf, &mask, 4);
  65445. + buf[4] = arg;
  65446. +
  65447. + rtl8192c_FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf);
  65448. +
  65449. +_func_exit_;
  65450. +
  65451. + return res;
  65452. +
  65453. +}
  65454. +
  65455. +//bitmap[0:27] = tx_rate_bitmap
  65456. +//bitmap[28:31]= Rate Adaptive id
  65457. +//arg[0:4] = macid
  65458. +//arg[5] = Short GI
  65459. +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg)
  65460. +{
  65461. +
  65462. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  65463. +
  65464. + if(pHalData->fw_ractrl == _TRUE)
  65465. + {
  65466. + rtl8192c_set_raid_cmd(pAdapter, bitmap, arg);
  65467. + }
  65468. + else
  65469. + {
  65470. + u8 macid, init_rate, shortGIrate=_FALSE;
  65471. +
  65472. + init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f;
  65473. +
  65474. + macid = arg&0x1f;
  65475. +
  65476. + shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE;
  65477. +
  65478. + if (shortGIrate==_TRUE)
  65479. + init_rate |= BIT(6);
  65480. +
  65481. + rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate);
  65482. + }
  65483. +
  65484. +}
  65485. +
  65486. +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode)
  65487. +{
  65488. + SETPWRMODE_PARM H2CSetPwrMode;
  65489. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  65490. +
  65491. +_func_enter_;
  65492. +
  65493. + DBG_871X("%s(): Mode = %d, SmartPS = %d\n", __FUNCTION__,Mode,pwrpriv->smart_ps);
  65494. +
  65495. + H2CSetPwrMode.Mode = Mode;
  65496. +
  65497. + H2CSetPwrMode.SmartPS = pwrpriv->smart_ps;
  65498. +
  65499. + H2CSetPwrMode.BcnPassTime = 1;//pPSC->RegMaxLPSAwakeIntvl;
  65500. +
  65501. + rtl8192c_FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode);
  65502. +
  65503. +_func_exit_;
  65504. +}
  65505. +
  65506. +void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)
  65507. +{
  65508. + struct rtw_ieee80211_hdr *pwlanhdr;
  65509. + u16 *fctrl;
  65510. + u32 rate_len, pktlen;
  65511. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  65512. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65513. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  65514. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  65515. +
  65516. +
  65517. + //DBG_871X("%s\n", __FUNCTION__);
  65518. +
  65519. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  65520. +
  65521. + fctrl = &(pwlanhdr->frame_ctl);
  65522. + *(fctrl) = 0;
  65523. +
  65524. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  65525. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  65526. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
  65527. +
  65528. + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
  65529. + //pmlmeext->mgnt_seq++;
  65530. + SetFrameSubType(pframe, WIFI_BEACON);
  65531. +
  65532. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  65533. + pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
  65534. +
  65535. + //timestamp will be inserted by hardware
  65536. + pframe += 8;
  65537. + pktlen += 8;
  65538. +
  65539. + // beacon interval: 2 bytes
  65540. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
  65541. +
  65542. + pframe += 2;
  65543. + pktlen += 2;
  65544. +
  65545. + // capability info: 2 bytes
  65546. + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
  65547. +
  65548. + pframe += 2;
  65549. + pktlen += 2;
  65550. +
  65551. + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
  65552. + {
  65553. + //DBG_871X("ie len=%d\n", cur_network->IELength);
  65554. + pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);
  65555. + _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);
  65556. +
  65557. + goto _ConstructBeacon;
  65558. + }
  65559. +
  65560. + //below for ad-hoc mode
  65561. +
  65562. + // SSID
  65563. + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);
  65564. +
  65565. + // supported rates...
  65566. + rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
  65567. + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);
  65568. +
  65569. + // DS parameter set
  65570. + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);
  65571. +
  65572. + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
  65573. + {
  65574. + u32 ATIMWindow;
  65575. + // IBSS Parameter Set...
  65576. + //ATIMWindow = cur->Configuration.ATIMWindow;
  65577. + ATIMWindow = 0;
  65578. + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
  65579. + }
  65580. +
  65581. +
  65582. + //todo: ERP IE
  65583. +
  65584. +
  65585. + // EXTERNDED SUPPORTED RATE
  65586. + if (rate_len > 8)
  65587. + {
  65588. + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
  65589. + }
  65590. +
  65591. +
  65592. + //todo:HT for adhoc
  65593. +
  65594. +_ConstructBeacon:
  65595. +
  65596. + if ((pktlen + TXDESC_SIZE) > 512)
  65597. + {
  65598. + DBG_871X("beacon frame too large\n");
  65599. + return;
  65600. + }
  65601. +
  65602. + *pLength = pktlen;
  65603. +
  65604. + //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen);
  65605. +
  65606. +}
  65607. +
  65608. +void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength)
  65609. +{
  65610. + struct rtw_ieee80211_hdr *pwlanhdr;
  65611. + u16 *fctrl;
  65612. + u32 pktlen;
  65613. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  65614. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65615. +
  65616. + //DBG_871X("%s\n", __FUNCTION__);
  65617. +
  65618. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  65619. +
  65620. + // Frame control.
  65621. + fctrl = &(pwlanhdr->frame_ctl);
  65622. + *(fctrl) = 0;
  65623. + SetPwrMgt(fctrl);
  65624. + SetFrameSubType(pframe, WIFI_PSPOLL);
  65625. +
  65626. + // AID.
  65627. + SetDuration(pframe, (pmlmeinfo->aid | 0xc000));
  65628. +
  65629. + // BSSID.
  65630. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  65631. +
  65632. + // TA.
  65633. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  65634. +
  65635. + *pLength = 16;
  65636. +}
  65637. +
  65638. +void ConstructNullFunctionData(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bForcePowerSave)
  65639. +{
  65640. + struct rtw_ieee80211_hdr *pwlanhdr;
  65641. + u16 *fctrl;
  65642. + u32 pktlen;
  65643. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  65644. + struct wlan_network *cur_network = &pmlmepriv->cur_network;
  65645. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  65646. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65647. +
  65648. + //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
  65649. +
  65650. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  65651. +
  65652. + fctrl = &(pwlanhdr->frame_ctl);
  65653. + *(fctrl) = 0;
  65654. + if (bForcePowerSave)
  65655. + {
  65656. + SetPwrMgt(fctrl);
  65657. + }
  65658. +
  65659. + switch(cur_network->network.InfrastructureMode)
  65660. + {
  65661. + case Ndis802_11Infrastructure:
  65662. + SetToDs(fctrl);
  65663. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  65664. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  65665. + _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);
  65666. + break;
  65667. + case Ndis802_11APMode:
  65668. + SetFrDs(fctrl);
  65669. + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
  65670. + _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  65671. + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
  65672. + break;
  65673. + case Ndis802_11IBSS:
  65674. + default:
  65675. + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
  65676. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  65677. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  65678. + break;
  65679. + }
  65680. +
  65681. + SetSeqNum(pwlanhdr, 0);
  65682. +
  65683. + SetFrameSubType(pframe, WIFI_DATA_NULL);
  65684. +
  65685. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  65686. + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  65687. +
  65688. + *pLength = pktlen;
  65689. +}
  65690. +
  65691. +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID)
  65692. +{
  65693. + struct rtw_ieee80211_hdr *pwlanhdr;
  65694. + u16 *fctrl;
  65695. + u8 *mac, *bssid;
  65696. + u32 pktlen;
  65697. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  65698. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65699. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  65700. +
  65701. +
  65702. + //DBG_871X("%s\n", __FUNCTION__);
  65703. +
  65704. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  65705. +
  65706. + mac = myid(&(padapter->eeprompriv));
  65707. + bssid = cur_network->MacAddress;
  65708. +
  65709. + fctrl = &(pwlanhdr->frame_ctl);
  65710. + *(fctrl) = 0;
  65711. + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
  65712. + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
  65713. + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);
  65714. +
  65715. + SetSeqNum(pwlanhdr, 0);
  65716. + SetFrameSubType(fctrl, WIFI_PROBERSP);
  65717. +
  65718. + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  65719. + pframe += pktlen;
  65720. +
  65721. + if(cur_network->IELength>MAX_IE_SZ)
  65722. + return;
  65723. +
  65724. + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
  65725. + pframe += cur_network->IELength;
  65726. + pktlen += cur_network->IELength;
  65727. +
  65728. + *pLength = pktlen;
  65729. +}
  65730. +
  65731. +//
  65732. +// Description: In normal chip, we should send some packet to Hw which will be used by Fw
  65733. +// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then
  65734. +// Fw can tell Hw to send these packet derectly.
  65735. +// Added by tynli. 2009.10.15.
  65736. +//
  65737. +static VOID
  65738. +FillFakeTxDescriptor92C(
  65739. + IN PADAPTER Adapter,
  65740. + IN u8* pDesc,
  65741. + IN u32 BufferLen,
  65742. + IN BOOLEAN IsPsPoll
  65743. +)
  65744. +{
  65745. + struct tx_desc *ptxdesc = (struct tx_desc *)pDesc;
  65746. +
  65747. + // Clear all status
  65748. + _rtw_memset(pDesc, 0, 32);
  65749. +
  65750. + //offset 0
  65751. + ptxdesc->txdw0 |= cpu_to_le32( OWN | FSG | LSG); //own, bFirstSeg, bLastSeg;
  65752. +
  65753. + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<<OFFSET_SHT)&0x00ff0000); //32 bytes for TX Desc
  65754. +
  65755. + ptxdesc->txdw0 |= cpu_to_le32(BufferLen&0x0000ffff); // Buffer size + command header
  65756. +
  65757. + //offset 4
  65758. + ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<<QSEL_SHT)&0x00001f00); // Fixed queue of Mgnt queue
  65759. +
  65760. + //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.
  65761. + if(IsPsPoll)
  65762. + {
  65763. + ptxdesc->txdw1 |= cpu_to_le32(NAVUSEHDR);
  65764. + }
  65765. + else
  65766. + {
  65767. + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number
  65768. + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29.
  65769. + }
  65770. +
  65771. + //offset 16
  65772. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  65773. +
  65774. +#ifdef CONFIG_USB_HCI
  65775. + // USB interface drop packet if the checksum of descriptor isn't correct.
  65776. + // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).
  65777. + rtl8192cu_cal_txdesc_chksum(ptxdesc);
  65778. +#endif
  65779. +
  65780. + //RT_PRINT_DATA(COMP_CMD, DBG_TRACE, "TxFillCmdDesc8192C(): H2C Tx Cmd Content ----->\n", pDesc, TX_DESC_SIZE);
  65781. +}
  65782. +
  65783. +// To check if reserved page content is destroyed by beacon beacuse beacon is too large.
  65784. +// 2010.06.23. Added by tynli.
  65785. +VOID
  65786. +CheckFwRsvdPageContent(
  65787. + IN PADAPTER Adapter
  65788. +)
  65789. +{
  65790. + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter);
  65791. + u32 MaxBcnPageNum;
  65792. +
  65793. + if(pHalData->FwRsvdPageStartOffset != 0)
  65794. + {
  65795. + /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize);
  65796. + RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset),
  65797. + ("CheckFwRsvdPageContent(): The reserved page content has been"\
  65798. + "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!",
  65799. + MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/
  65800. + }
  65801. +}
  65802. +
  65803. +//
  65804. +// Description: Fill the reserved packets that FW will use to RSVD page.
  65805. +// Now we just send 4 types packet to rsvd page.
  65806. +// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp.
  65807. +// Input:
  65808. +// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw,
  65809. +// so we need to set the packet length to total lengh.
  65810. +// TRUE: At the second time, we should send the first packet (default:beacon)
  65811. +// to Hw again and set the lengh in descriptor to the real beacon lengh.
  65812. +// 2009.10.15 by tynli.
  65813. +static void SetFwRsvdPagePkt(PADAPTER Adapter, BOOLEAN bDLFinished)
  65814. +{
  65815. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  65816. + struct xmit_frame *pmgntframe;
  65817. + struct pkt_attrib *pattrib;
  65818. + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
  65819. + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
  65820. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65821. + u32 BeaconLength, ProbeRspLength, PSPollLength, NullFunctionDataLength;
  65822. + u8 *ReservedPagePacket;
  65823. + u8 PageNum=0, U1bTmp, TxDescLen=0, TxDescOffset=0;
  65824. + u16 BufIndex=0;
  65825. + u32 TotalPacketLen;
  65826. + RSVDPAGE_LOC RsvdPageLoc;
  65827. + BOOLEAN bDLOK = _FALSE;
  65828. +
  65829. + DBG_871X("%s\n", __FUNCTION__);
  65830. +
  65831. + ReservedPagePacket = (u8*)rtw_malloc(1000);
  65832. + if(ReservedPagePacket == NULL){
  65833. + DBG_871X("%s(): alloc ReservedPagePacket fail !!!\n", __FUNCTION__);
  65834. + return;
  65835. + }
  65836. +
  65837. + _rtw_memset(ReservedPagePacket, 0, 1000);
  65838. +
  65839. + TxDescLen = 32;//TX_DESC_SIZE;
  65840. +
  65841. +#ifdef CONFIG_USB_HCI
  65842. + BufIndex = TXDESC_OFFSET;
  65843. + TxDescOffset = TxDescLen+8; //Shift index for 8 bytes because the dummy bytes in the first descipstor.
  65844. +#else
  65845. + BufIndex = 0;
  65846. + TxDescOffset = 0;
  65847. +#endif
  65848. +
  65849. + //(1) beacon
  65850. + ConstructBeacon(Adapter,&ReservedPagePacket[BufIndex],&BeaconLength);
  65851. +
  65852. + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: BCN\n", &ReservedPagePacket[BufIndex], (BeaconLength+BufIndex));
  65853. +
  65854. +//--------------------------------------------------------------------
  65855. +
  65856. + // When we count the first page size, we need to reserve description size for the RSVD
  65857. + // packet, it will be filled in front of the packet in TXPKTBUF.
  65858. + U1bTmp = (u8)PageNum_128(BeaconLength+TxDescLen);
  65859. + PageNum += U1bTmp;
  65860. + // To reserved 2 pages for beacon buffer. 2010.06.24.
  65861. + if(PageNum == 1)
  65862. + PageNum+=1;
  65863. + pHalData->FwRsvdPageStartOffset = PageNum;
  65864. +
  65865. + BufIndex = (PageNum*128) + TxDescOffset;
  65866. +
  65867. + //(2) ps-poll
  65868. + ConstructPSPoll(Adapter, &ReservedPagePacket[BufIndex],&PSPollLength);
  65869. +
  65870. + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE);
  65871. +
  65872. + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PS-POLL\n", &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen));
  65873. +
  65874. + RsvdPageLoc.LocPsPoll = PageNum;
  65875. +
  65876. +//------------------------------------------------------------------
  65877. +
  65878. + U1bTmp = (u8)PageNum_128(PSPollLength+TxDescLen);
  65879. + PageNum += U1bTmp;
  65880. +
  65881. + BufIndex = (PageNum*128) + TxDescOffset;
  65882. +
  65883. + //(3) null data
  65884. + ConstructNullFunctionData(
  65885. + Adapter,
  65886. + &ReservedPagePacket[BufIndex],
  65887. + &NullFunctionDataLength,
  65888. + get_my_bssid(&(pmlmeinfo->network)),
  65889. + _FALSE);
  65890. +
  65891. + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE);
  65892. +
  65893. + RsvdPageLoc.LocNullData = PageNum;
  65894. +
  65895. + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: NULL DATA \n", &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen));
  65896. +//------------------------------------------------------------------
  65897. +
  65898. + U1bTmp = (u8)PageNum_128(NullFunctionDataLength+TxDescLen);
  65899. + PageNum += U1bTmp;
  65900. +
  65901. + BufIndex = (PageNum*128) + TxDescOffset;
  65902. +
  65903. + //(4) probe response
  65904. + ConstructProbeRsp(
  65905. + Adapter,
  65906. + &ReservedPagePacket[BufIndex],
  65907. + &ProbeRspLength,
  65908. + get_my_bssid(&(pmlmeinfo->network)),
  65909. + _FALSE);
  65910. +
  65911. + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE);
  65912. +
  65913. + RsvdPageLoc.LocProbeRsp = PageNum;
  65914. +
  65915. + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PROBE RSP \n", &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength-TxDescLen));
  65916. +
  65917. +//------------------------------------------------------------------
  65918. +
  65919. + U1bTmp = (u8)PageNum_128(ProbeRspLength+TxDescLen);
  65920. +
  65921. + PageNum += U1bTmp;
  65922. +
  65923. + TotalPacketLen = (PageNum*128);
  65924. +
  65925. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  65926. + {
  65927. + return;
  65928. + }
  65929. +
  65930. + //update attribute
  65931. + pattrib = &pmgntframe->attrib;
  65932. + update_mgntframe_attrib(Adapter, pattrib);
  65933. + pattrib->qsel = 0x10;
  65934. + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen;
  65935. + _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen);
  65936. +
  65937. + rtw_hal_mgnt_xmit(Adapter, pmgntframe);
  65938. +
  65939. + bDLOK = _TRUE;
  65940. +
  65941. + if(bDLOK)
  65942. + {
  65943. + DBG_871X("Set RSVD page location to Fw.\n");
  65944. + rtl8192c_FillH2CCmd(Adapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8 *)&RsvdPageLoc);
  65945. + }
  65946. +
  65947. + rtw_mfree(ReservedPagePacket,1000);
  65948. +
  65949. +}
  65950. +
  65951. +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus)
  65952. +{
  65953. + JOINBSSRPT_PARM JoinBssRptParm;
  65954. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  65955. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  65956. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  65957. +
  65958. +_func_enter_;
  65959. +
  65960. + DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus);
  65961. +
  65962. + if(mstatus == 1)
  65963. + {
  65964. + BOOLEAN bRecover = _FALSE;
  65965. +
  65966. + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.
  65967. + // Suggested by filen. Added by tynli.
  65968. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));
  65969. + // Do not set TSF again here or vWiFi beacon DMA INT will not work.
  65970. + //correct_TSF(padapter, pmlmeext);
  65971. + // Hw sequende enable by dedault. 2010.06.23. by tynli.
  65972. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF));
  65973. + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF);
  65974. +
  65975. + //set REG_CR bit 8
  65976. + //U1bTmp = rtw_read8(padapter, REG_CR+1);
  65977. + rtw_write8(padapter, REG_CR+1, 0x03);
  65978. +
  65979. + // Disable Hw protection for a time which revserd for Hw sending beacon.
  65980. + // Fix download reserved page packet fail that access collision with the protection time.
  65981. + // 2010.05.11. Added by tynli.
  65982. + //SetBcnCtrlReg(padapter, 0, BIT3);
  65983. + //SetBcnCtrlReg(padapter, BIT4, 0);
  65984. + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3)));
  65985. + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4));
  65986. +
  65987. + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.
  65988. + if(pHalData->RegFwHwTxQCtrl&BIT6)
  65989. + bRecover = _TRUE;
  65990. +
  65991. + // To tell Hw the packet is not a real beacon frame.
  65992. + //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2);
  65993. + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6)));
  65994. + pHalData->RegFwHwTxQCtrl &= (~BIT6);
  65995. + SetFwRsvdPagePkt(padapter, 0);
  65996. +
  65997. + // 2010.05.11. Added by tynli.
  65998. + //SetBcnCtrlReg(padapter, BIT3, 0);
  65999. + //SetBcnCtrlReg(padapter, 0, BIT4);
  66000. + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3));
  66001. + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4)));
  66002. +
  66003. + // To make sure that if there exists an adapter which would like to send beacon.
  66004. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to
  66005. + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause
  66006. + // the beacon cannot be sent by HW.
  66007. + // 2010.06.23. Added by tynli.
  66008. + if(bRecover)
  66009. + {
  66010. + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6));
  66011. + pHalData->RegFwHwTxQCtrl |= BIT6;
  66012. + }
  66013. +
  66014. + // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
  66015. + rtw_write8(padapter, REG_CR+1, 0x02);
  66016. + }
  66017. +
  66018. + JoinBssRptParm.OpMode = mstatus;
  66019. +
  66020. + rtl8192c_FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm);
  66021. +
  66022. +_func_exit_;
  66023. +}
  66024. +
  66025. +#ifdef CONFIG_P2P_PS
  66026. +void rtl8192c_set_p2p_ctw_period_cmd(_adapter* padapter, u8 ctwindow)
  66027. +{
  66028. + struct P2P_PS_CTWPeriod_t p2p_ps_ctw;
  66029. +
  66030. + p2p_ps_ctw.CTWPeriod = ctwindow;
  66031. +
  66032. + rtl8192c_FillH2CCmd(padapter, P2P_PS_CTW_CMD_EID, 1, (u8 *)(&p2p_ps_ctw));
  66033. +
  66034. +}
  66035. +
  66036. +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state)
  66037. +{
  66038. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  66039. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  66040. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  66041. + struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload;
  66042. + u8 i;
  66043. + u16 ctwindow;
  66044. + u32 start_time, tsf_low;
  66045. +
  66046. +_func_enter_;
  66047. +
  66048. + switch(p2p_ps_state)
  66049. + {
  66050. + case P2P_PS_DISABLE:
  66051. + DBG_8192C("P2P_PS_DISABLE \n");
  66052. + _rtw_memset(p2p_ps_offload, 0 ,1);
  66053. + break;
  66054. + case P2P_PS_ENABLE:
  66055. + DBG_8192C("P2P_PS_ENABLE \n");
  66056. + // update CTWindow value.
  66057. + if( pwdinfo->ctwindow > 0 )
  66058. + {
  66059. + p2p_ps_offload->CTWindow_En = 1;
  66060. + ctwindow = pwdinfo->ctwindow;
  66061. + if(IS_HARDWARE_TYPE_8723A(padapter))
  66062. + {
  66063. + //rtw_write16(padapter, REG_ATIMWND, ctwindow);
  66064. + }
  66065. + else
  66066. + {
  66067. + rtl8192c_set_p2p_ctw_period_cmd(padapter, ctwindow);
  66068. + }
  66069. + }
  66070. +
  66071. + // hw only support 2 set of NoA
  66072. + for( i=0 ; i<pwdinfo->noa_num ; i++)
  66073. + {
  66074. + // To control the register setting for which NOA
  66075. + rtw_write8(padapter, 0x5CF, (i << 4));
  66076. + if(i == 0)
  66077. + p2p_ps_offload->NoA0_En = 1;
  66078. + else
  66079. + p2p_ps_offload->NoA1_En = 1;
  66080. +
  66081. + // config P2P NoA Descriptor Register
  66082. + rtw_write32(padapter, 0x5E0, pwdinfo->noa_duration[i]);
  66083. +
  66084. + rtw_write32(padapter, 0x5E4, pwdinfo->noa_interval[i]);
  66085. +
  66086. + //Get Current TSF value
  66087. + tsf_low = rtw_read32(padapter, REG_TSFTR);
  66088. +
  66089. + start_time = pwdinfo->noa_start_time[i];
  66090. + if(pwdinfo->noa_count[i] != 1)
  66091. + {
  66092. + while( start_time <= (tsf_low+(50*1024) ) )
  66093. + {
  66094. + start_time += pwdinfo->noa_interval[i];
  66095. + if(pwdinfo->noa_count[i] != 255)
  66096. + pwdinfo->noa_count[i]--;
  66097. + }
  66098. + }
  66099. + //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,start_time);
  66100. + rtw_write32(padapter, 0x5E8, start_time);
  66101. +
  66102. + rtw_write8(padapter, 0x5EC, pwdinfo->noa_count[i]);
  66103. + }
  66104. +
  66105. + if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) )
  66106. + {
  66107. + // rst p2p circuit
  66108. + rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4));
  66109. +
  66110. + p2p_ps_offload->Offload_En = 1;
  66111. +
  66112. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  66113. + {
  66114. + p2p_ps_offload->role= 1;
  66115. + p2p_ps_offload->AllStaSleep = 0;
  66116. + }
  66117. + else
  66118. + {
  66119. + p2p_ps_offload->role= 0;
  66120. + }
  66121. +
  66122. + p2p_ps_offload->discovery = 0;
  66123. + }
  66124. + break;
  66125. + case P2P_PS_SCAN:
  66126. + DBG_8192C("P2P_PS_SCAN \n");
  66127. + p2p_ps_offload->discovery = 1;
  66128. + break;
  66129. + case P2P_PS_SCAN_DONE:
  66130. + DBG_8192C("P2P_PS_SCAN_DONE \n");
  66131. + p2p_ps_offload->discovery = 0;
  66132. + pwdinfo->p2p_ps_state = P2P_PS_ENABLE;
  66133. + break;
  66134. + default:
  66135. + break;
  66136. + }
  66137. +
  66138. + rtl8192c_FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload);
  66139. +
  66140. +_func_exit_;
  66141. +
  66142. +}
  66143. +#endif // CONFIG_P2P_PS
  66144. +
  66145. +#ifdef CONFIG_IOL
  66146. +#include <rtw_iol.h>
  66147. +int rtl8192c_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms)
  66148. +{
  66149. + IO_OFFLOAD_LOC IoOffloadLoc;
  66150. + u32 start_time = rtw_get_current_time();
  66151. + u32 passing_time_ms;
  66152. + u8 polling_ret;
  66153. + int ret = _FAIL;
  66154. +
  66155. + if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS)
  66156. + goto exit;
  66157. +
  66158. + dump_mgntframe_and_wait(adapter, xmit_frame, max_wating_ms);
  66159. +
  66160. + IoOffloadLoc.LocCmd = 0;
  66161. + if(_SUCCESS != rtl8192c_FillH2CCmd(adapter, H2C_92C_IO_OFFLOAD, sizeof(IO_OFFLOAD_LOC), (u8 *)&IoOffloadLoc))
  66162. + goto exit;
  66163. +
  66164. + //polling if the IO offloading is done
  66165. + while( (passing_time_ms=rtw_get_passing_time_ms(start_time)) <= max_wating_ms) {
  66166. + #if 0 //C2H
  66167. + if(0xff == rtw_read8(adapter, REG_C2HEVT_CLEAR))
  66168. + break;
  66169. + #else// 0x1c3
  66170. + if(0x00 != (polling_ret=rtw_read8(adapter, 0x1c3)))
  66171. + break;
  66172. + #endif
  66173. + rtw_msleep_os(5);
  66174. + }
  66175. + #if 0 //debug
  66176. + DBG_871X("IOL %s, polling_ret:0x%02x, 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n"
  66177. + , polling_ret==0xff?"success":"error"
  66178. + , polling_ret
  66179. + , rtw_read32(adapter, 0x1c0)
  66180. + , rtw_read32(adapter, 0x1c4)
  66181. + , rtw_read32(adapter, 0x1cc)
  66182. + , rtw_read32(adapter, 0x1e8)
  66183. + , rtw_read32(adapter, 0x130)
  66184. + , rtw_read32(adapter, 0x134)
  66185. + );
  66186. + rtw_write32(adapter, 0x1c0, 0x0);
  66187. + #endif
  66188. +
  66189. + if(polling_ret == 0xff)
  66190. + ret =_SUCCESS;
  66191. + else {
  66192. + DBG_871X("IOL %s, polling_ret:0x%02x\n"
  66193. + //", 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n"
  66194. + , polling_ret==0xff?"success":"error"
  66195. + , polling_ret
  66196. + //, rtw_read32(adapter, 0x1c0)
  66197. + //, rtw_read32(adapter, 0x1c4)
  66198. + //, rtw_read32(adapter, 0x1cc)
  66199. + //, rtw_read32(adapter, 0x1e8)
  66200. + //, rtw_read32(adapter, 0x130)
  66201. + //, rtw_read32(adapter, 0x134)
  66202. + );
  66203. + #if 0 //debug
  66204. + rtw_write16(adapter, 0x1c4, 0x0000);
  66205. + rtw_msleep_os(10);
  66206. + DBG_871X("after reset, 0x1c4=0x%08x\n", rtw_read32(adapter, 0x1c4));
  66207. + #endif
  66208. +
  66209. + }
  66210. +
  66211. + {
  66212. + #if 0 //C2H
  66213. + u32 c2h_evt;
  66214. + int i;
  66215. + c2h_evt = rtw_read32(adapter, REG_C2HEVT_MSG_NORMAL);
  66216. + DBG_871X("%s io-offloading complete, in %ums: 0x%08x\n", __FUNCTION__, passing_time_ms, c2h_evt);
  66217. + rtw_write8(adapter, REG_C2HEVT_CLEAR, 0x0);
  66218. + #else// 0x1c3
  66219. + DBG_871X("IOL %s complete in %ums\n", __FUNCTION__, passing_time_ms);
  66220. + rtw_write8(adapter, 0x1c3, 0x0);
  66221. + #endif
  66222. + }
  66223. +
  66224. +exit:
  66225. + return ret;
  66226. +
  66227. +}
  66228. +#endif //CONFIG_IOL
  66229. +
  66230. +
  66231. +#ifdef CONFIG_BEACON_DISABLE_OFFLOAD
  66232. +/*
  66233. + rtl8192c_dis_beacon_fun_cmd()
  66234. + This function shall only be called by PORT1.
  66235. + PORT0's beacon function can't be disabled, because it's used by RA function in FW/HW.
  66236. +
  66237. + // Still has the REG_BCN_CTRL_1 modified by unknowned party issue in case of Primary Interface + PORT1 combination.
  66238. +*/
  66239. +u8 rtl8192c_dis_beacon_fun_cmd(_adapter* padapter)
  66240. +{
  66241. + u8 buf[2];
  66242. + u8 res=_SUCCESS;
  66243. +
  66244. +_func_enter_;
  66245. +
  66246. + _rtw_memset(buf, 0, sizeof(buf));
  66247. +
  66248. + if (padapter->iface_type == IFACE_PORT0) {
  66249. + //buf[0] = 0x1;
  66250. + DBG_871X("%s(): ERROR! padapter->iface_type = %d\n", __FUNCTION__, padapter->iface_type);
  66251. + return _FAIL;
  66252. + } else
  66253. + buf[1] = 0x1;
  66254. +
  66255. + rtl8192c_FillH2CCmd(padapter, H2C_92C_DISABLE_BCN_FUNC, 2, buf);
  66256. +
  66257. +_func_exit_;
  66258. +
  66259. + return res;
  66260. +
  66261. +}
  66262. +#endif // CONFIG_BEACON_DISABLE_OFFLOAD
  66263. +
  66264. +
  66265. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  66266. +/*
  66267. + ask FW to Reset sync register at Beacon early interrupt
  66268. +*/
  66269. +u8 rtl8192c_reset_tsf(_adapter *padapter, u8 reset_port )
  66270. +{
  66271. + u8 buf[2];
  66272. + u8 res=_SUCCESS;
  66273. +
  66274. +_func_enter_;
  66275. + if (IFACE_PORT0==reset_port) {
  66276. + buf[0] = 0x1; buf[1] = 0;
  66277. +
  66278. + } else{
  66279. + buf[0] = 0x0; buf[1] = 0x1;
  66280. + }
  66281. + rtl8192c_FillH2CCmd(padapter, H2C_92C_RESET_TSF, 2, buf);
  66282. +_func_exit_;
  66283. +
  66284. + return res;
  66285. +}
  66286. +
  66287. +int reset_tsf(PADAPTER Adapter, u8 reset_port )
  66288. +{
  66289. + u8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0;
  66290. + u32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ?
  66291. + REG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1;
  66292. +
  66293. + rtw_scan_abort(Adapter->pbuddy_adapter); /* site survey will cause reset_tsf fail */
  66294. + reset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt);
  66295. + rtl8192c_reset_tsf(Adapter, reset_port);
  66296. +
  66297. + while ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) {
  66298. + rtw_msleep_os(100);
  66299. + loop_cnt++;
  66300. + reset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt);
  66301. + }
  66302. +
  66303. + return(loop_cnt >= 10) ? _FAIL : _TRUE;
  66304. +}
  66305. +
  66306. +
  66307. +#endif // CONFIG_TSF_RESET_OFFLOAD
  66308. +
  66309. +#ifdef CONFIG_WOWLAN
  66310. +
  66311. +void rtl8192c_set_wowlan_cmd(_adapter* padapter)
  66312. +{
  66313. + u8 res=_SUCCESS;
  66314. + SETWOWLAN_PARM pwowlan_parm;
  66315. + struct pwrctrl_priv *pwrpriv=&padapter->pwrctrlpriv;
  66316. +
  66317. +_func_enter_;
  66318. +
  66319. + pwowlan_parm.mode =0;
  66320. + pwowlan_parm.gpio_index=0;
  66321. + pwowlan_parm.gpio_duration=0;
  66322. + pwowlan_parm.second_mode =0;
  66323. + pwowlan_parm.reserve=0;
  66324. +
  66325. + if(pwrpriv->wowlan_mode ==_TRUE){
  66326. + pwowlan_parm.mode |=FW_WOWLAN_FUN_EN;
  66327. + //printk("\n %s 1.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
  66328. + if(pwrpriv->wowlan_pattern ==_TRUE){
  66329. + pwowlan_parm.mode |= FW_WOWLAN_PATTERN_MATCH;
  66330. + //printk("\n %s 2.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
  66331. + }
  66332. + if(pwrpriv->wowlan_magic ==_TRUE){
  66333. + pwowlan_parm.mode |=FW_WOWLAN_MAGIC_PKT;
  66334. + //printk("\n %s 3.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
  66335. + }
  66336. + if(pwrpriv->wowlan_unicast ==_TRUE){
  66337. + pwowlan_parm.mode |=FW_WOWLAN_UNICAST;
  66338. + //printk("\n %s 4.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
  66339. + }
  66340. + //WOWLAN_GPIO_ACTIVE means GPIO high active
  66341. + //pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE;
  66342. + pwowlan_parm.mode |=FW_WOWLAN_REKEY_WAKEUP;
  66343. + pwowlan_parm.mode |=FW_WOWLAN_DEAUTH_WAKEUP;
  66344. +
  66345. + rtl8192c_set_FwJoinBssReport_cmd( padapter, 1);
  66346. +
  66347. + //GPIO3
  66348. + pwowlan_parm.gpio_index=3;
  66349. +
  66350. + //duration unit is 64us
  66351. + pwowlan_parm.gpio_duration=0xff;
  66352. + //
  66353. + pwowlan_parm.second_mode|=FW_WOWLAN_GPIO_WAKEUP_EN;
  66354. + //printk("\n %s 5.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
  66355. + { u8 *ptr=(u8 *)&pwowlan_parm;
  66356. + printk("\n %s H2C_WO_WLAN=%x %02x:%02x:%02x:%02x:%02x \n",__FUNCTION__,H2C_WO_WLAN_CMD,ptr[0],ptr[1],ptr[2],ptr[3],ptr[4] );
  66357. + }
  66358. + rtl8192c_FillH2CCmd(padapter, H2C_WO_WLAN_CMD, 4, (u8 *)&pwowlan_parm);
  66359. +
  66360. + //keep alive period = 3 * 10 BCN interval
  66361. + pwowlan_parm.mode =3;
  66362. + pwowlan_parm.gpio_index=3;
  66363. + rtl8192c_FillH2CCmd(padapter, KEEP_ALIVE_CONTROL_CMD, 2, (u8 *)&pwowlan_parm);
  66364. + printk("%s after KEEP_ALIVE_CONTROL_CMD register 0x81=%x \n",__FUNCTION__,rtw_read8(padapter, 0x81));
  66365. +
  66366. + pwowlan_parm.mode =1;
  66367. + pwowlan_parm.gpio_index=0;
  66368. + pwowlan_parm.gpio_duration=0;
  66369. + rtl8192c_FillH2CCmd(padapter, DISCONNECT_DECISION_CTRL_CMD, 3, (u8 *)&pwowlan_parm);
  66370. + printk("%s after DISCONNECT_DECISION_CTRL_CMD register 0x81=%x \n",__FUNCTION__,rtw_read8(padapter, 0x81));
  66371. +
  66372. + //enable GPIO wakeup
  66373. + pwowlan_parm.mode =1;
  66374. + pwowlan_parm.gpio_index=0;
  66375. + pwowlan_parm.gpio_duration=0;
  66376. + rtl8192c_FillH2CCmd(padapter, REMOTE_WAKE_CTRL_CMD, 3, (u8 *)&pwowlan_parm);
  66377. + }
  66378. + else
  66379. + rtl8192c_FillH2CCmd(padapter, H2C_WO_WLAN_CMD, 3, (u8 *)&pwowlan_parm);
  66380. +
  66381. +
  66382. +_func_exit_;
  66383. +
  66384. + return ;
  66385. +
  66386. +}
  66387. +
  66388. +#endif //CONFIG_WOWLAN
  66389. --- /dev/null
  66390. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c
  66391. @@ -0,0 +1,5055 @@
  66392. +/******************************************************************************
  66393. + *
  66394. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  66395. + *
  66396. + * This program is free software; you can redistribute it and/or modify it
  66397. + * under the terms of version 2 of the GNU General Public License as
  66398. + * published by the Free Software Foundation.
  66399. + *
  66400. + * This program is distributed in the hope that it will be useful, but WITHOUT
  66401. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  66402. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  66403. + * more details.
  66404. + *
  66405. + * You should have received a copy of the GNU General Public License along with
  66406. + * this program; if not, write to the Free Software Foundation, Inc.,
  66407. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  66408. + *
  66409. + *
  66410. + ******************************************************************************/
  66411. +//============================================================
  66412. +// Description:
  66413. +//
  66414. +// This file is for 92CE/92CU dynamic mechanism only
  66415. +//
  66416. +//
  66417. +//============================================================
  66418. +
  66419. +//============================================================
  66420. +// include files
  66421. +//============================================================
  66422. +#include <drv_conf.h>
  66423. +#include <osdep_service.h>
  66424. +#include <drv_types.h>
  66425. +#include <rtw_byteorder.h>
  66426. +
  66427. +#include <rtl8192c_hal.h>
  66428. +#include "../dm.h"
  66429. +#ifdef CONFIG_INTEL_PROXIM
  66430. +#include "../proxim/intel_proxim.h"
  66431. +#endif
  66432. +//============================================================
  66433. +// Global var
  66434. +//============================================================
  66435. +static u32 EDCAParam[maxAP][3] =
  66436. +{ // UL DL
  66437. + {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP
  66438. + {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP
  66439. + {0x3ea430, 0x00a630, 0x3ea44f}, //cisco AP
  66440. + {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP
  66441. + {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP
  66442. + //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP
  66443. + {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP
  66444. + {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP
  66445. + {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP
  66446. +// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP
  66447. +};
  66448. +
  66449. +
  66450. +/*-----------------------------------------------------------------------------
  66451. + * Function: dm_DIGInit()
  66452. + *
  66453. + * Overview: Set DIG scheme init value.
  66454. + *
  66455. + * Input: NONE
  66456. + *
  66457. + * Output: NONE
  66458. + *
  66459. + * Return: NONE
  66460. + *
  66461. + * Revised History:
  66462. + * When Who Remark
  66463. + *
  66464. + *---------------------------------------------------------------------------*/
  66465. +static void dm_DIGInit(
  66466. + IN PADAPTER pAdapter
  66467. +)
  66468. +{
  66469. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66470. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66471. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66472. +
  66473. +
  66474. + pDigTable->Dig_Enable_Flag = _TRUE;
  66475. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
  66476. +
  66477. + pDigTable->CurIGValue = 0x20;
  66478. + pDigTable->PreIGValue = 0x0;
  66479. +
  66480. + pDigTable->CurSTAConnectState = pDigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
  66481. + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
  66482. +
  66483. + pDigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
  66484. + pDigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
  66485. +
  66486. + pDigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
  66487. + pDigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
  66488. +
  66489. +
  66490. + pDigTable->rx_gain_range_max = DM_DIG_MAX;
  66491. + pDigTable->rx_gain_range_min = DM_DIG_MIN;
  66492. + pDigTable->rx_gain_range_min_nolink = 0;
  66493. +
  66494. + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
  66495. + pDigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
  66496. + pDigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
  66497. +
  66498. + pDigTable->PreCCKPDState = CCK_PD_STAGE_MAX;
  66499. + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi;
  66500. +
  66501. + pDigTable->ForbiddenIGI = DM_DIG_MIN;
  66502. + pDigTable->LargeFAHit = 0;
  66503. + pDigTable->Recover_cnt = 0;
  66504. + pdmpriv->DIG_Dynamic_MIN = 0x25; //for FUNAI_TV
  66505. +}
  66506. +
  66507. +
  66508. +static u8 dm_initial_gain_MinPWDB(
  66509. + IN PADAPTER pAdapter
  66510. + )
  66511. +{
  66512. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66513. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66514. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66515. + int Rssi_val_min = 0;
  66516. +
  66517. + if((pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) &&
  66518. + (pDigTable->CurSTAConnectState == DIG_STA_CONNECT) )
  66519. + {
  66520. + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0)
  66521. +#ifdef CONFIG_CONCURRENT_MODE
  66522. + Rssi_val_min = (pdmpriv->UndecoratedSmoothedPWDB+pdmpriv->EntryMinUndecoratedSmoothedPWDB)/2;
  66523. +#else
  66524. + Rssi_val_min = (pdmpriv->EntryMinUndecoratedSmoothedPWDB > pdmpriv->UndecoratedSmoothedPWDB)?
  66525. + pdmpriv->UndecoratedSmoothedPWDB:pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  66526. +#endif //CONFIG_CONCURRENT_MODE
  66527. + else
  66528. + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB;
  66529. + }
  66530. + else if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT ||
  66531. + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT)
  66532. + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB;
  66533. + else if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT)
  66534. + Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  66535. +
  66536. + //printk("%s CurMultiSTAConnectState(0x%02x) UndecoratedSmoothedPWDB(%d),EntryMinUndecoratedSmoothedPWDB(%d)\n"
  66537. + //,__FUNCTION__,pDigTable->CurSTAConnectState,
  66538. + //pdmpriv->UndecoratedSmoothedPWDB,pdmpriv->EntryMinUndecoratedSmoothedPWDB);
  66539. +
  66540. + return (u8)Rssi_val_min;
  66541. +}
  66542. +
  66543. +
  66544. +static VOID
  66545. +dm_FalseAlarmCounterStatistics(
  66546. + IN PADAPTER Adapter
  66547. + )
  66548. +{
  66549. + u32 ret_value;
  66550. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  66551. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66552. + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  66553. +#ifdef CONFIG_CONCURRENT_MODE
  66554. + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
  66555. +#endif //CONFIG_CONCURRENT_MODE
  66556. +
  66557. + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter1, bMaskDWord);
  66558. + FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
  66559. +
  66560. + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter2, bMaskDWord);
  66561. + FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
  66562. + FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
  66563. + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter3, bMaskDWord);
  66564. + FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
  66565. + ret_value = PHY_QueryBBReg(Adapter, rOFDM0_FrameSync, bMaskDWord);
  66566. + FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
  66567. + FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
  66568. +
  66569. + FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
  66570. + FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail+
  66571. + FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
  66572. +
  66573. +
  66574. + //hold cck counter
  66575. + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, BIT(14), 1);
  66576. +
  66577. + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterLower, bMaskByte0);
  66578. + FalseAlmCnt->Cnt_Cck_fail = ret_value;
  66579. +
  66580. + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterUpper, bMaskByte3);
  66581. + FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
  66582. +
  66583. + FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Parity_Fail +
  66584. + FalseAlmCnt->Cnt_Rate_Illegal +
  66585. + FalseAlmCnt->Cnt_Crc8_fail +
  66586. + FalseAlmCnt->Cnt_Mcs_fail +
  66587. + FalseAlmCnt->Cnt_Cck_fail);
  66588. +
  66589. + Adapter->recvpriv.FalseAlmCnt_all = FalseAlmCnt->Cnt_all;
  66590. +#ifdef CONFIG_CONCURRENT_MODE
  66591. + if(pbuddy_adapter)
  66592. + pbuddy_adapter->recvpriv.FalseAlmCnt_all = FalseAlmCnt->Cnt_all;
  66593. +#endif //CONFIG_CONCURRENT_MODE
  66594. +
  66595. + //reset false alarm counter registers
  66596. + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 1);
  66597. + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 0);
  66598. + //reset cck counter
  66599. + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 0);
  66600. + //enable cck counter
  66601. + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 2);
  66602. +
  66603. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Parity_Fail = %ld, Cnt_Rate_Illegal = %ld, Cnt_Crc8_fail = %ld, Cnt_Mcs_fail = %ld\n",
  66604. + // FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail) );
  66605. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n",
  66606. + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) );
  66607. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n",
  66608. + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) );
  66609. +}
  66610. +
  66611. +
  66612. +static VOID
  66613. +DM_Write_DIG(
  66614. + IN PADAPTER pAdapter
  66615. + )
  66616. +{
  66617. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66618. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66619. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66620. +
  66621. +#ifdef CONFIG_CONCURRENT_MODE
  66622. + if(rtw_buddy_adapter_up(pAdapter))
  66623. + {
  66624. + PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;
  66625. + PHAL_DATA_TYPE pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);
  66626. + struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv;
  66627. + DIG_T *pbuddy_DigTable = &pbuddy_dmpriv->DM_DigTable;
  66628. +
  66629. + //sync IGValue
  66630. + pbuddy_DigTable->PreIGValue = pDigTable->PreIGValue;
  66631. + pbuddy_DigTable->CurIGValue = pDigTable->CurIGValue;
  66632. + }
  66633. +#endif //CONFIG_CONCURRENT_MODE
  66634. +
  66635. +
  66636. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurIGValue = 0x%lx, PreIGValue = 0x%lx, BackoffVal = %d\n",
  66637. + // DM_DigTable.CurIGValue, DM_DigTable.PreIGValue, DM_DigTable.BackoffVal));
  66638. +
  66639. + if (pDigTable->Dig_Enable_Flag == _FALSE)
  66640. + {
  66641. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("DIG is disabled\n"));
  66642. + pDigTable->PreIGValue = 0x17;
  66643. + return;
  66644. + }
  66645. +
  66646. + if( (pDigTable->PreIGValue != pDigTable->CurIGValue) || ( pAdapter->bForceWriteInitGain ) )
  66647. + {
  66648. + // Set initial gain.
  66649. + //PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pDigTable->CurIGValue);
  66650. + //PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pDigTable->CurIGValue);
  66651. + //printk("%s DIG(0x%02x)\n",__FUNCTION__,pDigTable->CurIGValue);
  66652. +
  66653. +#if defined CONFIG_WIDI_DIG_3E && defined CONFIG_INTEL_WIDI
  66654. + if( pAdapter->mlmepriv.widi_enable == _TRUE )
  66655. + {
  66656. + PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, 0x7f, 0x3e);
  66657. + PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, 0x7f, 0x3e);
  66658. + }
  66659. + else
  66660. +#endif //defined CONFIG_WIDI_DIG_3E && defined CONFIG_INTEL_WIDI
  66661. + {
  66662. + PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, 0x7f, pDigTable->CurIGValue);
  66663. + PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, 0x7f, pDigTable->CurIGValue);
  66664. + }
  66665. + pDigTable->PreIGValue = pDigTable->CurIGValue;
  66666. + }
  66667. +}
  66668. +
  66669. +
  66670. +static VOID
  66671. +dm_CtrlInitGainByFA(
  66672. + IN PADAPTER pAdapter
  66673. +)
  66674. +{
  66675. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66676. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66677. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66678. + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  66679. +
  66680. + u8 value_IGI = pDigTable->CurIGValue;
  66681. +
  66682. + if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
  66683. + value_IGI --;
  66684. + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH1)
  66685. + value_IGI += 0;
  66686. + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH2)
  66687. + value_IGI ++;
  66688. + else if(FalseAlmCnt->Cnt_all >= DM_DIG_FA_TH2)
  66689. + value_IGI +=2;
  66690. +
  66691. + if(value_IGI > DM_DIG_FA_UPPER)
  66692. + value_IGI = DM_DIG_FA_UPPER;
  66693. + if(value_IGI < DM_DIG_FA_LOWER)
  66694. + value_IGI = DM_DIG_FA_LOWER;
  66695. +
  66696. + if(FalseAlmCnt->Cnt_all > 10000)
  66697. + value_IGI = DM_DIG_FA_UPPER;
  66698. +
  66699. + pDigTable->CurIGValue = value_IGI;
  66700. +
  66701. + DM_Write_DIG(pAdapter);
  66702. +
  66703. +}
  66704. +
  66705. +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
  66706. +VOID dm_CtrlInitGainByRssi( IN PADAPTER pAdapter)
  66707. +{
  66708. +
  66709. + u32 isBT;
  66710. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66711. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66712. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66713. + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  66714. +#ifdef CONFIG_DM_ADAPTIVITY
  66715. + u8 Adap_IGI_Upper = pdmpriv->IGI_target + 30 + (u8) pdmpriv->TH_L2H_ini -(u8) pdmpriv->TH_EDCCA_HL_diff;
  66716. +#endif
  66717. +
  66718. + //modify DIG upper bound
  66719. + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX )
  66720. + pDigTable->rx_gain_range_max = DM_DIG_MAX;
  66721. + else
  66722. + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20;
  66723. +
  66724. + //modify DIG lower bound
  66725. + if((FalseAlmCnt->Cnt_all > 500)&&(pdmpriv->DIG_Dynamic_MIN < 0x25))
  66726. + pdmpriv->DIG_Dynamic_MIN++;
  66727. + if((FalseAlmCnt->Cnt_all < 500)&&(pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN))
  66728. + pdmpriv->DIG_Dynamic_MIN--;
  66729. + if((pDigTable->Rssi_val_min < 8) && (pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN))
  66730. + pdmpriv->DIG_Dynamic_MIN--;
  66731. +
  66732. + //modify DIG lower bound, deal with abnorally large false alarm
  66733. + if(FalseAlmCnt->Cnt_all > 10000)
  66734. + {
  66735. + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n"));
  66736. + pDigTable->LargeFAHit++;
  66737. + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue)
  66738. + {
  66739. + pDigTable->ForbiddenIGI = pDigTable->CurIGValue;
  66740. + pDigTable->LargeFAHit = 1;
  66741. + }
  66742. + if(pDigTable->LargeFAHit >= 3)
  66743. + {
  66744. + if((pDigTable->ForbiddenIGI+1) >pDigTable->rx_gain_range_max)
  66745. + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max;
  66746. + else
  66747. + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1);
  66748. + pDigTable->Recover_cnt = 3600; //3600=2hr
  66749. + }
  66750. + }
  66751. + else
  66752. + {
  66753. + //Recovery mechanism for IGI lower bound
  66754. + if(pDigTable->Recover_cnt != 0){
  66755. + pDigTable->Recover_cnt --;
  66756. + }
  66757. + else
  66758. + {
  66759. + if(pDigTable->LargeFAHit == 0 )
  66760. + {
  66761. + if((pDigTable->ForbiddenIGI -1) < pdmpriv->DIG_Dynamic_MIN) //DM_DIG_MIN)
  66762. + {
  66763. + pDigTable->ForbiddenIGI = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN;
  66764. + pDigTable->rx_gain_range_min = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN;
  66765. + }
  66766. + else
  66767. + {
  66768. + pDigTable->ForbiddenIGI --;
  66769. + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1);
  66770. + }
  66771. + }
  66772. + else if(pDigTable->LargeFAHit == 3 )
  66773. + {
  66774. + pDigTable->LargeFAHit = 0;
  66775. + }
  66776. + }
  66777. + }
  66778. + #ifdef CONFIG_USB_HCI
  66779. + if(FalseAlmCnt->Cnt_all < 250)
  66780. + {
  66781. +#endif
  66782. + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n");
  66783. +
  66784. + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01;
  66785. +
  66786. + if(!isBT){
  66787. +
  66788. + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh)
  66789. + {
  66790. + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min)
  66791. + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min;
  66792. + else
  66793. + pDigTable->BackoffVal -= 2;
  66794. + }
  66795. + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh)
  66796. + {
  66797. + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max)
  66798. + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max;
  66799. + else
  66800. + pDigTable->BackoffVal +=2;
  66801. + }
  66802. + }
  66803. + else
  66804. + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
  66805. +
  66806. + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal;
  66807. +
  66808. + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal);
  66809. +#ifdef CONFIG_USB_HCI
  66810. + }
  66811. + else
  66812. + {
  66813. + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n");
  66814. + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min);
  66815. +
  66816. + //Adjust initial gain by false alarm
  66817. + if(FalseAlmCnt->Cnt_all > 1000)
  66818. + pDigTable->CurIGValue = pDigTable ->PreIGValue+2;
  66819. + else if (FalseAlmCnt->Cnt_all > 750)
  66820. + pDigTable->CurIGValue = pDigTable->PreIGValue+1;
  66821. + else if(FalseAlmCnt->Cnt_all < 500)
  66822. + pDigTable->CurIGValue = pDigTable->PreIGValue-1;
  66823. + }
  66824. +#endif
  66825. +
  66826. + //Check initial gain by upper/lower bound
  66827. + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max)
  66828. + pDigTable->CurIGValue = pDigTable->rx_gain_range_max;
  66829. +
  66830. + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min)
  66831. + pDigTable->CurIGValue = pDigTable->rx_gain_range_min;
  66832. +
  66833. +#ifdef CONFIG_DM_ADAPTIVITY
  66834. + if(pdmpriv->DMFlag & DYNAMIC_FUNC_ADAPTIVITY)
  66835. + {
  66836. + if(pDigTable->CurIGValue > Adap_IGI_Upper)
  66837. + pDigTable->CurIGValue = Adap_IGI_Upper;
  66838. +
  66839. + if(pdmpriv->IGI_LowerBound != 0)
  66840. + {
  66841. + if(pDigTable->CurIGValue < pdmpriv->IGI_LowerBound)
  66842. + pDigTable->CurIGValue = pdmpriv->IGI_LowerBound;
  66843. + }
  66844. + LOG_LEVEL(_drv_info_, FUNC_ADPT_FMT": pdmpriv->IGI_LowerBound = %d\n",
  66845. + FUNC_ADPT_ARG(pAdapter), pdmpriv->IGI_LowerBound);
  66846. + }
  66847. +#endif /* CONFIG_DM_ADAPTIVITY */
  66848. +
  66849. + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__,
  66850. + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min);
  66851. + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue );
  66852. +
  66853. + DM_Write_DIG(pAdapter);
  66854. +
  66855. +}
  66856. +#else
  66857. +static VOID dm_CtrlInitGainByRssi(IN PADAPTER pAdapter)
  66858. +{
  66859. + u32 isBT;
  66860. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  66861. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  66862. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  66863. + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  66864. + u8 RSSI_tmp = dm_initial_gain_MinPWDB(pAdapter);
  66865. +#ifdef CONFIG_DM_ADAPTIVITY
  66866. + u8 Adap_IGI_Upper = pdmpriv->IGI_target + 30 + (u8) pdmpriv->TH_L2H_ini -(u8) pdmpriv->TH_EDCCA_HL_diff;
  66867. +#endif
  66868. +
  66869. + //modify DIG upper bound
  66870. + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX )
  66871. + pDigTable->rx_gain_range_max = DM_DIG_MAX;
  66872. + else
  66873. + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20;
  66874. + //printk("%s Rssi_val_min(0x%02x),rx_gain_range_max(0x%02x)\n",__FUNCTION__,pDigTable->Rssi_val_min,pDigTable->rx_gain_range_max);
  66875. + //modify DIG lower bound, deal with abnorally large false alarm
  66876. + if(FalseAlmCnt->Cnt_all > 10000)
  66877. + {
  66878. + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n"));
  66879. +
  66880. + pDigTable->LargeFAHit++;
  66881. + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue)
  66882. + {
  66883. + pDigTable->ForbiddenIGI = pDigTable->CurIGValue;
  66884. + pDigTable->LargeFAHit = 1;
  66885. + }
  66886. +
  66887. + if(pDigTable->LargeFAHit >= 3)
  66888. + {
  66889. + if((pDigTable->ForbiddenIGI+1) > pDigTable->rx_gain_range_max)
  66890. + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max;
  66891. + else
  66892. + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1);
  66893. + pDigTable->Recover_cnt = 3600; //3600=2hr
  66894. + }
  66895. + }
  66896. + else
  66897. + {
  66898. + //Recovery mechanism for IGI lower bound
  66899. + if(pDigTable->Recover_cnt != 0)
  66900. + pDigTable->Recover_cnt --;
  66901. + else
  66902. + {
  66903. + if(pDigTable->LargeFAHit == 0 )
  66904. + {
  66905. + if((pDigTable->ForbiddenIGI -1) < DM_DIG_MIN)
  66906. + {
  66907. + pDigTable->ForbiddenIGI = DM_DIG_MIN;
  66908. + pDigTable->rx_gain_range_min = DM_DIG_MIN;
  66909. + }
  66910. + else
  66911. + {
  66912. + pDigTable->ForbiddenIGI --;
  66913. + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1);
  66914. + }
  66915. + }
  66916. + else if(pDigTable->LargeFAHit == 3 )
  66917. + {
  66918. + pDigTable->LargeFAHit = 0;
  66919. + }
  66920. + }
  66921. + }
  66922. +
  66923. + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.ForbiddenIGI = 0x%x, DM_DigTable.LargeFAHit = 0x%x\n",pDigTable->ForbiddenIGI, pDigTable->LargeFAHit));
  66924. + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.rx_gain_range_max = 0x%x, DM_DigTable.rx_gain_range_min = 0x%x\n",pDigTable->rx_gain_range_max, pDigTable->rx_gain_range_min));
  66925. +
  66926. +#ifdef CONFIG_USB_HCI
  66927. + if(FalseAlmCnt->Cnt_all < 250)
  66928. + {
  66929. +#endif
  66930. + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n");
  66931. +
  66932. + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01;
  66933. +
  66934. + if(!isBT){
  66935. +
  66936. + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh)
  66937. + {
  66938. + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min)
  66939. + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min;
  66940. + else
  66941. + pDigTable->BackoffVal -= 2;
  66942. + }
  66943. + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh)
  66944. + {
  66945. + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max)
  66946. + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max;
  66947. + else
  66948. + pDigTable->BackoffVal +=2;
  66949. + }
  66950. + }
  66951. + else
  66952. + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
  66953. +
  66954. + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal;
  66955. +
  66956. + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal);
  66957. +#ifdef CONFIG_USB_HCI
  66958. + }
  66959. + else
  66960. + {
  66961. + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n");
  66962. + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min);
  66963. +
  66964. + //Adjust initial gain by false alarm
  66965. + if(FalseAlmCnt->Cnt_all > 1000)
  66966. + pDigTable->CurIGValue = pDigTable ->PreIGValue+2;
  66967. + else if (FalseAlmCnt->Cnt_all > 750)
  66968. + pDigTable->CurIGValue = pDigTable->PreIGValue+1;
  66969. + else if(FalseAlmCnt->Cnt_all < 500)
  66970. + pDigTable->CurIGValue = pDigTable->PreIGValue-1;
  66971. + }
  66972. +#endif
  66973. +
  66974. + if(RSSI_tmp <= DM_DIG_MIN)
  66975. + pDigTable->rx_gain_range_min = DM_DIG_MIN;
  66976. + else if(RSSI_tmp >= DM_DIG_MAX)
  66977. + pDigTable->rx_gain_range_min = DM_DIG_MAX;
  66978. + else
  66979. + pDigTable->rx_gain_range_min = RSSI_tmp;
  66980. +
  66981. +
  66982. + //Check initial gain by upper/lower bound
  66983. + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max)
  66984. + pDigTable->CurIGValue = pDigTable->rx_gain_range_max;
  66985. +
  66986. + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min)
  66987. + pDigTable->CurIGValue = pDigTable->rx_gain_range_min;
  66988. +
  66989. +#ifdef CONFIG_DM_ADAPTIVITY
  66990. + if(pdmpriv->DMFlag & DYNAMIC_FUNC_ADAPTIVITY)
  66991. + {
  66992. + if(pDigTable->CurIGValue > Adap_IGI_Upper)
  66993. + pDigTable->CurIGValue = Adap_IGI_Upper;
  66994. +
  66995. + if(pdmpriv->IGI_LowerBound != 0)
  66996. + {
  66997. + if(pDigTable->CurIGValue < pdmpriv->IGI_LowerBound)
  66998. + pDigTable->CurIGValue = pdmpriv->IGI_LowerBound;
  66999. + }
  67000. + LOG_LEVEL(_drv_info_, FUNC_ADPT_FMT": pdmpriv->IGI_LowerBound = %d\n",
  67001. + FUNC_ADPT_ARG(pAdapter), pdmpriv->IGI_LowerBound);
  67002. + }
  67003. +#endif /* CONFIG_DM_ADAPTIVITY */
  67004. +
  67005. + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__,
  67006. + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min);
  67007. + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue );
  67008. +
  67009. + DM_Write_DIG(pAdapter);
  67010. +
  67011. +}
  67012. +#endif
  67013. +
  67014. +static VOID
  67015. +dm_initial_gain_Multi_STA(
  67016. + IN PADAPTER pAdapter)
  67017. +{
  67018. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67019. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67020. + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
  67021. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67022. + int rssi_strength = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  67023. + BOOLEAN bMulti_STA = _FALSE;
  67024. +
  67025. +#ifdef CONFIG_CONCURRENT_MODE
  67026. + //AP Mode
  67027. + if(check_buddy_fwstate(pAdapter, WIFI_AP_STATE) == _TRUE && (rssi_strength !=0))
  67028. + {
  67029. + bMulti_STA = _TRUE;
  67030. + }
  67031. + else if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT && rssi_strength==0) //STA+STA MODE
  67032. + {
  67033. + bMulti_STA = _TRUE;
  67034. + rssi_strength = pdmpriv->UndecoratedSmoothedPWDB;
  67035. + }
  67036. +#endif //CONFIG_CONCURRENT_MODE
  67037. +
  67038. +
  67039. + //ADHOC and AP Mode
  67040. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  67041. + {
  67042. + bMulti_STA = _TRUE;
  67043. + }
  67044. +
  67045. +
  67046. + if((bMulti_STA == _FALSE)
  67047. + || (pDigTable->CurSTAConnectState == DIG_STA_DISCONNECT))
  67048. + {
  67049. + pdmpriv->binitialized = _FALSE;
  67050. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
  67051. + return;
  67052. + }
  67053. + else if(pdmpriv->binitialized == _FALSE)
  67054. + {
  67055. + pdmpriv->binitialized = _TRUE;
  67056. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0;
  67057. + pDigTable->CurIGValue = 0x20;
  67058. + DM_Write_DIG(pAdapter);
  67059. + }
  67060. +
  67061. + // Initial gain control by ap mode
  67062. + if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT)
  67063. + {
  67064. + if ( (rssi_strength < pDigTable->RssiLowThresh) &&
  67065. + (pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_1))
  67066. + {
  67067. + // Set to dig value to 0x20 for Luke's opinion after disable dig
  67068. + if(pDigTable->Dig_Ext_Port_Stage == DIG_EXT_PORT_STAGE_2)
  67069. + {
  67070. + pDigTable->CurIGValue = 0x20;
  67071. + DM_Write_DIG(pAdapter);
  67072. + }
  67073. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_1;
  67074. + }
  67075. + else if (rssi_strength > pDigTable->RssiHighThresh)
  67076. + {
  67077. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_2;
  67078. + dm_CtrlInitGainByFA(pAdapter);
  67079. + }
  67080. + }
  67081. + else if(pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_0)
  67082. + {
  67083. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0;
  67084. + pDigTable->CurIGValue = 0x20;
  67085. + DM_Write_DIG(pAdapter);
  67086. + }
  67087. +
  67088. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurMultiSTAConnectState = %x Dig_Ext_Port_Stage %x\n",
  67089. + // DM_DigTable.CurMultiSTAConnectState, DM_DigTable.Dig_Ext_Port_Stage));
  67090. +}
  67091. +
  67092. +static VOID
  67093. +dm_initial_gain_STA_beforelinked(
  67094. + IN PADAPTER pAdapter)
  67095. +{
  67096. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67097. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67098. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67099. + PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  67100. +
  67101. + //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
  67102. + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
  67103. + //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
  67104. + // Updated by Albert 2012/09/27
  67105. + // Copy the same rule from 8192du code.
  67106. + if( pFalseAlmCnt->Cnt_all > 2000 )
  67107. + pDigTable->CurIGValue += 2;
  67108. + else if ( ( pFalseAlmCnt->Cnt_all > 1000 ) && ( pFalseAlmCnt->Cnt_all <= 1000 ) )
  67109. + pDigTable->CurIGValue += 1;
  67110. + else if(pFalseAlmCnt->Cnt_all < 500)
  67111. + pDigTable->CurIGValue -= 1;
  67112. +
  67113. + //Check initial gain by upper/lower bound
  67114. + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max)
  67115. + pDigTable->CurIGValue = pDigTable->rx_gain_range_max;
  67116. +
  67117. + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min)
  67118. + pDigTable->CurIGValue = pDigTable->rx_gain_range_min;
  67119. +
  67120. + printk("%s ==> FalseAlmCnt->Cnt_all:%d CurIGValue:0x%02x \n",__FUNCTION__,pFalseAlmCnt->Cnt_all ,pDigTable->CurIGValue);
  67121. +}
  67122. +
  67123. +static VOID
  67124. +dm_initial_gain_STA(
  67125. + IN PADAPTER pAdapter)
  67126. +{
  67127. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67128. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67129. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67130. +
  67131. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("PreSTAConnectState = %x, CurSTAConnectState = %x\n",
  67132. + // DM_DigTable.PreSTAConnectState, DM_DigTable.CurSTAConnectState));
  67133. +
  67134. +
  67135. + if(pDigTable->PreSTAConnectState == pDigTable->CurSTAConnectState||
  67136. + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT ||
  67137. + pDigTable->CurSTAConnectState == DIG_STA_CONNECT)
  67138. + {
  67139. + // beforeconnect -> beforeconnect or connect -> connect
  67140. + // (dis)connect -> beforeconnect
  67141. + // disconnect -> connecct or beforeconnect -> connect
  67142. + if(pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT)
  67143. + {
  67144. + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter);
  67145. + dm_CtrlInitGainByRssi(pAdapter);
  67146. + }
  67147. +#if 0
  67148. + else if((wdev_to_priv(pAdapter->rtw_wdev))->p2p_enabled == _TRUE
  67149. + && pAdapter->wdinfo.driver_interface == DRIVER_CFG80211)
  67150. + {
  67151. + //pDigTable->CurIGValue = 0x30;
  67152. + DM_Write_DIG(pAdapter);
  67153. + }
  67154. +#endif
  67155. + else{ // pDigTable->CurSTAConnectState == DIG_STA_DISCONNECT
  67156. + #ifdef CONFIG_BEFORE_LINKED_DIG
  67157. + //printk("%s==> ##1 CurIGI(0x%02x),PreIGValue(0x%02x) \n",__FUNCTION__,pDigTable->CurIGValue,pDigTable->PreIGValue );
  67158. + dm_initial_gain_STA_beforelinked(pAdapter);
  67159. + DM_Write_DIG(pAdapter);
  67160. + #endif //CONFIG_BEFORE_LINKED_DIG
  67161. + }
  67162. + }
  67163. + else
  67164. + {
  67165. + // connect -> disconnect or beforeconnect -> disconnect
  67166. + pDigTable->Rssi_val_min = 0;
  67167. + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
  67168. + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
  67169. + pDigTable->CurIGValue = 0x20;
  67170. + pDigTable->PreIGValue = 0;
  67171. + #ifdef CONFIG_BEFORE_LINKED_DIG
  67172. + //printk("%s==> ##2 CurIGI(0x%02x),PreIGValue(0x%02x) \n",__FUNCTION__,pDigTable->CurIGValue,pDigTable->PreIGValue );
  67173. + dm_initial_gain_STA_beforelinked(pAdapter);
  67174. + #endif //CONFIG_BEFORE_LINKED_DIG
  67175. +
  67176. +
  67177. + DM_Write_DIG(pAdapter);
  67178. + }
  67179. +
  67180. +}
  67181. +
  67182. +
  67183. +static void dm_CCK_PacketDetectionThresh(
  67184. + IN PADAPTER pAdapter)
  67185. +{
  67186. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67187. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67188. + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt);
  67189. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67190. +
  67191. + if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT)
  67192. + {
  67193. + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter);
  67194. + if(pDigTable->PreCCKPDState == CCK_PD_STAGE_LowRssi)
  67195. + {
  67196. + if(pDigTable->Rssi_val_min <= 25)
  67197. + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi;
  67198. + else
  67199. + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi;
  67200. + }
  67201. + else{
  67202. + if(pDigTable->Rssi_val_min <= 20)
  67203. + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi;
  67204. + else
  67205. + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi;
  67206. + }
  67207. + }
  67208. + else
  67209. + pDigTable->CurCCKPDState=CCK_PD_STAGE_MAX;
  67210. +
  67211. + if(pDigTable->PreCCKPDState != pDigTable->CurCCKPDState)
  67212. + {
  67213. + if((pDigTable->CurCCKPDState == CCK_PD_STAGE_LowRssi)||
  67214. + (pDigTable->CurCCKPDState == CCK_PD_STAGE_MAX))
  67215. + {
  67216. + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0x83);
  67217. +
  67218. + //PHY_SetBBReg(pAdapter, rCCK0_System, bMaskByte1, 0x40);
  67219. + //if(IS_92C_SERIAL(pHalData->VersionID))
  67220. + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd7);
  67221. + }
  67222. + else
  67223. + {
  67224. + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0xcd);
  67225. + //PHY_SetBBReg(pAdapter,rCCK0_System, bMaskByte1, 0x47);
  67226. + //if(IS_92C_SERIAL(pHalData->VersionID))
  67227. + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd3);
  67228. + }
  67229. +
  67230. + pDigTable->PreCCKPDState = pDigTable->CurCCKPDState;
  67231. + }
  67232. +
  67233. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CCKPDStage=%x\n",pDigTable->CurCCKPDState));
  67234. + //RT_TRACE( COMP_DIG, DBG_LOUD, ("is92C=%x\n",IS_92C_SERIAL(pHalData->VersionID)));
  67235. +
  67236. +}
  67237. +
  67238. +
  67239. +static void
  67240. +dm_CtrlInitGainByTwoPort(
  67241. + IN PADAPTER pAdapter)
  67242. +{
  67243. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67244. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67245. + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
  67246. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67247. +
  67248. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
  67249. + {
  67250. +#ifdef CONFIG_IOCTL_CFG80211
  67251. + if((wdev_to_priv(pAdapter->rtw_wdev))->p2p_enabled == _TRUE)
  67252. + {
  67253. + }
  67254. + else
  67255. +#endif
  67256. + return;
  67257. + }
  67258. +
  67259. + // Decide the current status and if modify initial gain or not
  67260. + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
  67261. + {
  67262. + pDigTable->CurSTAConnectState = DIG_STA_BEFORE_CONNECT;
  67263. + }
  67264. + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  67265. + {
  67266. + pDigTable->CurSTAConnectState = DIG_STA_CONNECT;
  67267. + }
  67268. + else
  67269. + {
  67270. + pDigTable->CurSTAConnectState = DIG_STA_DISCONNECT;
  67271. + }
  67272. +
  67273. +
  67274. + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
  67275. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  67276. + {
  67277. + if((is_IBSS_empty(pAdapter)==_FAIL) && (pAdapter->stapriv.asoc_sta_count > 2))
  67278. + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT;
  67279. + }
  67280. +
  67281. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  67282. + {
  67283. + if(pAdapter->stapriv.asoc_sta_count > 2)
  67284. + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT;
  67285. + }
  67286. +
  67287. +#ifdef CONFIG_CONCURRENT_MODE
  67288. + if(check_buddy_fwstate(pAdapter, WIFI_AP_STATE) == _TRUE)
  67289. + {
  67290. + PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;
  67291. +
  67292. + if(pbuddy_adapter->stapriv.asoc_sta_count > 2)
  67293. + {
  67294. + pDigTable->CurSTAConnectState = DIG_STA_CONNECT;
  67295. + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT;
  67296. + }
  67297. + }
  67298. + else if(check_buddy_fwstate(pAdapter, WIFI_STATION_STATE) == _TRUE &&
  67299. + check_buddy_fwstate(pAdapter, _FW_LINKED) == _TRUE)
  67300. + {
  67301. + pDigTable->CurSTAConnectState = DIG_STA_CONNECT;
  67302. +
  67303. + }
  67304. +#endif //CONFIG_CONCURRENT_MODE
  67305. +
  67306. +
  67307. + dm_initial_gain_STA(pAdapter);
  67308. + dm_initial_gain_Multi_STA(pAdapter);
  67309. + //Baron temp DIG solution for DMP
  67310. + //dm_CtrlInitGainByFA(pAdapter);
  67311. +
  67312. + dm_CCK_PacketDetectionThresh(pAdapter);
  67313. +
  67314. + pDigTable->PreSTAConnectState = pDigTable->CurSTAConnectState;
  67315. +
  67316. +}
  67317. +
  67318. +
  67319. +static void dm_DIG(
  67320. + IN PADAPTER pAdapter)
  67321. +{
  67322. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67323. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67324. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67325. +
  67326. + //Read 0x0c50; Initial gain
  67327. + pDigTable->PreIGValue = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
  67328. +
  67329. + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() ==>\n"));
  67330. +
  67331. + if(pdmpriv->bDMInitialGainEnable == _FALSE)
  67332. + return;
  67333. +
  67334. + //if(pDigTable->Dig_Enable_Flag == _FALSE)
  67335. + // return;
  67336. +
  67337. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG))
  67338. + return;
  67339. +
  67340. + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() progress \n"));
  67341. +
  67342. + dm_CtrlInitGainByTwoPort(pAdapter);
  67343. +
  67344. + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() <==\n"));
  67345. +}
  67346. +
  67347. +static void dm_SavePowerIndex(IN PADAPTER Adapter)
  67348. +{
  67349. + u8 index;
  67350. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67351. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67352. + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
  67353. +
  67354. + for(index = 0; index< 6; index++)
  67355. + pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
  67356. +}
  67357. +
  67358. +static void dm_RestorePowerIndex(IN PADAPTER Adapter)
  67359. +{
  67360. + u8 index;
  67361. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67362. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67363. + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
  67364. +
  67365. + for(index = 0; index< 6; index++)
  67366. + rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
  67367. +}
  67368. +
  67369. +static void dm_WritePowerIndex(
  67370. + IN PADAPTER Adapter,
  67371. + IN u8 Value)
  67372. +{
  67373. + u8 index;
  67374. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67375. + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
  67376. +
  67377. + for(index = 0; index< 6; index++)
  67378. + rtw_write8(Adapter, Power_Index_REG[index], Value);
  67379. +}
  67380. +
  67381. +static void dm_InitDynamicTxPower(IN PADAPTER Adapter)
  67382. +{
  67383. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67384. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67385. +
  67386. +#ifdef CONFIG_USB_HCI
  67387. +#ifdef CONFIG_INTEL_PROXIM
  67388. + if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
  67389. +#else
  67390. + if(pHalData->BoardType == BOARD_USB_High_PA)
  67391. +#endif
  67392. + {
  67393. + dm_SavePowerIndex(Adapter);
  67394. + pdmpriv->bDynamicTxPowerEnable = _TRUE;
  67395. + }
  67396. + else
  67397. +#else
  67398. + pdmpriv->bDynamicTxPowerEnable = _FALSE;
  67399. +#endif
  67400. +
  67401. + pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
  67402. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
  67403. +}
  67404. +
  67405. +
  67406. +static void dm_DynamicTxPower(IN PADAPTER Adapter)
  67407. +{
  67408. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67409. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67410. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  67411. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  67412. + int UndecoratedSmoothedPWDB;
  67413. +
  67414. + if(!pdmpriv->bDynamicTxPowerEnable)
  67415. + return;
  67416. +
  67417. + // If dynamic high power is disabled.
  67418. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_HP) )
  67419. + {
  67420. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
  67421. + return;
  67422. + }
  67423. +
  67424. + // STA not connected and AP not connected
  67425. + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
  67426. + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
  67427. + {
  67428. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
  67429. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
  67430. +
  67431. + //the LastDTPlvl should reset when disconnect,
  67432. + //otherwise the tx power level wouldn't change when disconnect and connect again.
  67433. + // Maddest 20091220.
  67434. + pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
  67435. + return;
  67436. + }
  67437. +#ifdef CONFIG_INTEL_PROXIM
  67438. + if(Adapter->proximity.proxim_on== _TRUE){
  67439. + struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
  67440. + // Intel set fixed tx power
  67441. + printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
  67442. + if(prox_priv!=NULL){
  67443. + if(prox_priv->proxim_modeinfo->power_output> 0)
  67444. +
  67445. + {
  67446. + switch(prox_priv->proxim_modeinfo->power_output){
  67447. + case 1:
  67448. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
  67449. + printk("TxHighPwrLevel_100\n");
  67450. + break;
  67451. + case 2:
  67452. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
  67453. + printk("TxHighPwrLevel_70\n");
  67454. + break;
  67455. + case 3:
  67456. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
  67457. + printk("TxHighPwrLevel_50\n");
  67458. + break;
  67459. + case 4:
  67460. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
  67461. + printk("TxHighPwrLevel_35\n");
  67462. + break;
  67463. + case 5:
  67464. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
  67465. + printk("TxHighPwrLevel_15\n");
  67466. + break;
  67467. + default:
  67468. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
  67469. + printk("TxHighPwrLevel_100\n");
  67470. + break;
  67471. + }
  67472. + }
  67473. + }
  67474. + }
  67475. + else
  67476. +#endif
  67477. +{
  67478. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
  67479. + {
  67480. + //todo: AP Mode
  67481. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
  67482. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
  67483. + {
  67484. + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  67485. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
  67486. + }
  67487. + else
  67488. + {
  67489. + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
  67490. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
  67491. + }
  67492. + }
  67493. + else // associated entry pwdb
  67494. + {
  67495. + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  67496. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
  67497. + }
  67498. +
  67499. + if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
  67500. + {
  67501. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
  67502. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
  67503. + }
  67504. + else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
  67505. + (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
  67506. + {
  67507. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
  67508. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
  67509. + }
  67510. + else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
  67511. + {
  67512. + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
  67513. + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
  67514. + }
  67515. +}
  67516. + if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
  67517. + {
  67518. + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
  67519. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
  67520. + dm_RestorePowerIndex(Adapter);
  67521. + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
  67522. + dm_WritePowerIndex(Adapter, 0x14);
  67523. + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
  67524. + dm_WritePowerIndex(Adapter, 0x10);
  67525. + }
  67526. + pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
  67527. +
  67528. +}
  67529. +
  67530. +
  67531. +static VOID
  67532. +DM_ChangeDynamicInitGainThresh(
  67533. + IN PADAPTER pAdapter,
  67534. + IN u32 DM_Type,
  67535. + IN u32 DM_Value)
  67536. +{
  67537. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  67538. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67539. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  67540. +
  67541. + if (DM_Type == DIG_TYPE_THRESH_HIGH)
  67542. + {
  67543. + pDigTable->RssiHighThresh = DM_Value;
  67544. + }
  67545. + else if (DM_Type == DIG_TYPE_THRESH_LOW)
  67546. + {
  67547. + pDigTable->RssiLowThresh = DM_Value;
  67548. + }
  67549. + else if (DM_Type == DIG_TYPE_ENABLE)
  67550. + {
  67551. + pDigTable->Dig_Enable_Flag = _TRUE;
  67552. + }
  67553. + else if (DM_Type == DIG_TYPE_DISABLE)
  67554. + {
  67555. + pDigTable->Dig_Enable_Flag = _FALSE;
  67556. + }
  67557. + else if (DM_Type == DIG_TYPE_BACKOFF)
  67558. + {
  67559. + if(DM_Value > 30)
  67560. + DM_Value = 30;
  67561. + pDigTable->BackoffVal = (u8)DM_Value;
  67562. + }
  67563. + else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
  67564. + {
  67565. + if(DM_Value == 0)
  67566. + DM_Value = 0x1;
  67567. + pDigTable->rx_gain_range_min = (u8)DM_Value;
  67568. + }
  67569. + else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
  67570. + {
  67571. + if(DM_Value > 0x50)
  67572. + DM_Value = 0x50;
  67573. + pDigTable->rx_gain_range_max = (u8)DM_Value;
  67574. + }
  67575. +} /* DM_ChangeDynamicInitGainThresh */
  67576. +
  67577. +
  67578. +static VOID PWDB_Monitor(
  67579. + IN PADAPTER Adapter
  67580. + )
  67581. +{
  67582. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67583. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67584. + int i;
  67585. + int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
  67586. + u8 sta_cnt=0;
  67587. + u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
  67588. +
  67589. + if(check_fwstate(&Adapter->mlmepriv, _FW_LINKED) != _TRUE)
  67590. + return;
  67591. +
  67592. +
  67593. + if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  67594. + {
  67595. + _irqL irqL;
  67596. + _list *plist, *phead;
  67597. + struct sta_info *psta;
  67598. + struct sta_priv *pstapriv = &Adapter->stapriv;
  67599. + u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
  67600. +
  67601. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  67602. +
  67603. + for(i=0; i< NUM_STA; i++)
  67604. + {
  67605. + phead = &(pstapriv->sta_hash[i]);
  67606. + plist = get_next(phead);
  67607. +
  67608. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  67609. + {
  67610. + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  67611. +
  67612. + plist = get_next(plist);
  67613. +
  67614. + if(_rtw_memcmp(psta ->hwaddr, bcast_addr, ETH_ALEN) ||
  67615. + _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
  67616. + continue;
  67617. +
  67618. + if(psta->state & WIFI_ASOC_STATE)
  67619. + {
  67620. +
  67621. + if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
  67622. + tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
  67623. +
  67624. + if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
  67625. + tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
  67626. +
  67627. + PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
  67628. + }
  67629. +
  67630. + }
  67631. +
  67632. + }
  67633. +
  67634. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  67635. +
  67636. +
  67637. +
  67638. + if(pHalData->fw_ractrl == _TRUE)
  67639. + {
  67640. + // Report every sta's RSSI to FW
  67641. + for(i=0; i< sta_cnt; i++)
  67642. + {
  67643. + rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
  67644. + }
  67645. + }
  67646. +
  67647. + }
  67648. +
  67649. +
  67650. +
  67651. + if(tmpEntryMaxPWDB != 0) // If associated entry is found
  67652. + {
  67653. + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
  67654. + }
  67655. + else
  67656. + {
  67657. + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
  67658. + }
  67659. +
  67660. + if(tmpEntryMinPWDB != 0xff) // If associated entry is found
  67661. + {
  67662. + pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
  67663. + }
  67664. + else
  67665. + {
  67666. + pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
  67667. + }
  67668. +
  67669. +
  67670. + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
  67671. + {
  67672. +
  67673. + if(pHalData->fw_ractrl == _TRUE)
  67674. + {
  67675. + u32 param = (u32)(pdmpriv->UndecoratedSmoothedPWDB<<16);
  67676. +
  67677. + param |= 0;//macid=0 for sta mode;
  67678. +
  67679. + rtl8192c_set_rssi_cmd(Adapter, (u8*)&param);
  67680. + }
  67681. + }
  67682. +
  67683. +}
  67684. +
  67685. +
  67686. +static void
  67687. +DM_InitEdcaTurbo(
  67688. + IN PADAPTER Adapter
  67689. + )
  67690. +{
  67691. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67692. +
  67693. + pHalData->bCurrentTurboEDCA = _FALSE;
  67694. + Adapter->recvpriv.bIsAnyNonBEPkts = _FALSE;
  67695. +
  67696. +}
  67697. +
  67698. +
  67699. +static void
  67700. +dm_CheckEdcaTurbo(
  67701. + IN PADAPTER Adapter
  67702. + )
  67703. +{
  67704. + u32 trafficIndex;
  67705. + u32 edca_param;
  67706. + u64 cur_tx_bytes = 0;
  67707. + u64 cur_rx_bytes = 0;
  67708. + u8 bbtchange = _FALSE;
  67709. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67710. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67711. + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
  67712. + struct recv_priv *precvpriv = &(Adapter->recvpriv);
  67713. + struct registry_priv *pregpriv = &Adapter->registrypriv;
  67714. + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
  67715. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  67716. +#ifdef CONFIG_BT_COEXIST
  67717. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  67718. +#endif
  67719. +
  67720. +
  67721. + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0))
  67722. + {
  67723. + goto dm_CheckEdcaTurbo_EXIT;
  67724. + }
  67725. +
  67726. + if (pmlmeinfo->assoc_AP_vendor >= maxAP)
  67727. + {
  67728. + goto dm_CheckEdcaTurbo_EXIT;
  67729. + }
  67730. +
  67731. +#ifdef CONFIG_BT_COEXIST
  67732. + if(pbtpriv->BT_Coexist)
  67733. + {
  67734. + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
  67735. + {
  67736. + bbtchange = _TRUE;
  67737. + }
  67738. + }
  67739. +#endif
  67740. +
  67741. + // Check if the status needs to be changed.
  67742. + if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
  67743. + {
  67744. + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes;
  67745. + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes;
  67746. +
  67747. + //traffic, TX or RX
  67748. + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP))
  67749. + {
  67750. + if (cur_tx_bytes > (cur_rx_bytes << 2))
  67751. + { // Uplink TP is present.
  67752. + trafficIndex = UP_LINK;
  67753. + }
  67754. + else
  67755. + { // Balance TP is present.
  67756. + trafficIndex = DOWN_LINK;
  67757. + }
  67758. + }
  67759. + else
  67760. + {
  67761. + if (cur_rx_bytes > (cur_tx_bytes << 2))
  67762. + { // Downlink TP is present.
  67763. + trafficIndex = DOWN_LINK;
  67764. + }
  67765. + else
  67766. + { // Balance TP is present.
  67767. + trafficIndex = UP_LINK;
  67768. + }
  67769. + }
  67770. +
  67771. + if ((pdmpriv->prv_traffic_idx != trafficIndex) || (!pHalData->bCurrentTurboEDCA))
  67772. + {
  67773. +#ifdef CONFIG_BT_COEXIST
  67774. + if(_TRUE == bbtchange)
  67775. + {
  67776. + edca_param = pbtpriv->BT_EDCA[trafficIndex];
  67777. + }
  67778. + else
  67779. +#endif
  67780. + {
  67781. +#if 0
  67782. + //adjust EDCA parameter for BE queue
  67783. + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
  67784. +#else
  67785. +
  67786. + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N))
  67787. + {
  67788. + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
  67789. + }
  67790. + else
  67791. + {
  67792. + edca_param = EDCAParam[unknownAP][trafficIndex];
  67793. + }
  67794. +#endif
  67795. + }
  67796. +
  67797. +#ifdef CONFIG_PCI_HCI
  67798. + if(IS_92C_SERIAL(pHalData->VersionID))
  67799. + {
  67800. + edca_param = 0x60a42b;
  67801. + }
  67802. + else
  67803. + {
  67804. + edca_param = 0x6ea42b;
  67805. + }
  67806. +#endif
  67807. + rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
  67808. +
  67809. + pdmpriv->prv_traffic_idx = trafficIndex;
  67810. + }
  67811. +
  67812. + pHalData->bCurrentTurboEDCA = _TRUE;
  67813. + }
  67814. + else
  67815. + {
  67816. + //
  67817. + // Turn Off EDCA turbo here.
  67818. + // Restore original EDCA according to the declaration of AP.
  67819. + //
  67820. + if(pHalData->bCurrentTurboEDCA)
  67821. + {
  67822. + rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
  67823. + pHalData->bCurrentTurboEDCA = _FALSE;
  67824. + }
  67825. + }
  67826. +
  67827. +dm_CheckEdcaTurbo_EXIT:
  67828. + // Set variables for next time.
  67829. + precvpriv->bIsAnyNonBEPkts = _FALSE;
  67830. + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
  67831. + precvpriv->last_rx_bytes = precvpriv->rx_bytes;
  67832. +
  67833. +}
  67834. +
  67835. +#define DPK_DELTA_MAPPING_NUM 13
  67836. +#define index_mapping_HP_NUM 15
  67837. +
  67838. +static VOID
  67839. +dm_TXPowerTrackingCallback_ThermalMeter_92C(
  67840. + IN PADAPTER Adapter)
  67841. +{
  67842. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  67843. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  67844. + u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100;
  67845. + int ele_A, ele_D, TempCCk, X, value32;
  67846. + int Y, ele_C;
  67847. + s8 OFDM_index[2], CCK_index = 0, OFDM_index_old[2], CCK_index_old = 0;
  67848. + int i = 0;
  67849. + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID);
  67850. +
  67851. +#if MP_DRIVER == 1
  67852. + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
  67853. + u8 *TxPwrLevel = pMptCtx->TxPwrLevel;
  67854. +#endif
  67855. + u8 OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur
  67856. +#if 0
  67857. + u32 DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = {
  67858. + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e,
  67859. + 0x1f, 0x00, 0x00, 0x01, 0x01,
  67860. + 0x02, 0x02, 0x03},
  67861. + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e,
  67862. + 0x1f, 0x00, 0x00, 0x01, 0x02,
  67863. + 0x02, 0x03, 0x03}};
  67864. +#endif
  67865. +#ifdef CONFIG_USB_HCI
  67866. + u8 ThermalValue_HP_count = 0;
  67867. + u32 ThermalValue_HP = 0;
  67868. + s32 index_mapping_HP[index_mapping_HP_NUM] = {
  67869. + 0, 1, 3, 4, 6,
  67870. + 7, 9, 10, 12, 13,
  67871. + 15, 16, 18, 19, 21
  67872. + };
  67873. +
  67874. + s8 index_HP;
  67875. +#endif
  67876. +
  67877. + pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug
  67878. + pdmpriv->bTXPowerTrackingInit = _TRUE;
  67879. +
  67880. + if(pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14)
  67881. + pdmpriv->bCCKinCH14 = _TRUE;
  67882. + else if(pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14)
  67883. + pdmpriv->bCCKinCH14 = _FALSE;
  67884. +
  67885. + //DBG_8192C("===>dm_TXPowerTrackingCallback_ThermalMeter_92C\n");
  67886. +
  67887. + ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0]
  67888. +
  67889. + //DBG_8192C("\n\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",ThermalValue,pdmpriv->ThermalValue, pHalData->EEPROMThermalMeter);
  67890. +
  67891. + rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter));
  67892. +
  67893. + if(is2T)
  67894. + rf = 2;
  67895. + else
  67896. + rf = 1;
  67897. +
  67898. + if(ThermalValue)
  67899. + {
  67900. +// if(!pHalData->ThermalValue)
  67901. + {
  67902. + //Query OFDM path A default setting
  67903. + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D;
  67904. + for(i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
  67905. + {
  67906. + if(ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
  67907. + {
  67908. + OFDM_index_old[0] = (u8)i;
  67909. + //DBG_8192C("Initial pathA ele_D reg0x%x = 0x%x, OFDM_index=0x%x\n", rOFDM0_XATxIQImbalance, ele_D, OFDM_index_old[0]);
  67910. + break;
  67911. + }
  67912. + }
  67913. +
  67914. + //Query OFDM path B default setting
  67915. + if(is2T)
  67916. + {
  67917. + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord)&bMaskOFDM_D;
  67918. + for(i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
  67919. + {
  67920. + if(ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
  67921. + {
  67922. + OFDM_index_old[1] = (u8)i;
  67923. + //DBG_8192C("Initial pathB ele_D reg0x%x = 0x%x, OFDM_index=0x%x\n",rOFDM0_XBTxIQImbalance, ele_D, OFDM_index_old[1]);
  67924. + break;
  67925. + }
  67926. + }
  67927. + }
  67928. +
  67929. + //Query CCK default setting From 0xa24
  67930. + TempCCk = PHY_QueryBBReg(Adapter, rCCK0_TxFilter2, bMaskDWord)&bMaskCCK;
  67931. + for(i=0 ; i<CCK_TABLE_SIZE ; i++)
  67932. + {
  67933. + if(pdmpriv->bCCKinCH14)
  67934. + {
  67935. + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==_TRUE)
  67936. + {
  67937. + CCK_index_old =(u8)i;
  67938. + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
  67939. + break;
  67940. + }
  67941. + }
  67942. + else
  67943. + {
  67944. + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==_TRUE)
  67945. + {
  67946. + CCK_index_old =(u8)i;
  67947. + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
  67948. + break;
  67949. + }
  67950. + }
  67951. + }
  67952. +
  67953. + if(!pdmpriv->ThermalValue)
  67954. + {
  67955. + pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter;
  67956. + pdmpriv->ThermalValue_LCK = ThermalValue;
  67957. + pdmpriv->ThermalValue_IQK = ThermalValue;
  67958. + pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter;
  67959. +
  67960. +#ifdef CONFIG_USB_HCI
  67961. + for(i = 0; i < rf; i++)
  67962. + pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i];
  67963. + pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old;
  67964. +#else
  67965. + for(i = 0; i < rf; i++)
  67966. + pdmpriv->OFDM_index[i] = OFDM_index_old[i];
  67967. + pdmpriv->CCK_index = CCK_index_old;
  67968. +#endif
  67969. + }
  67970. +
  67971. +#ifdef CONFIG_USB_HCI
  67972. + if(pHalData->BoardType == BOARD_USB_High_PA)
  67973. + {
  67974. + pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue;
  67975. + pdmpriv->ThermalValue_HP_index++;
  67976. + if(pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM)
  67977. + pdmpriv->ThermalValue_HP_index = 0;
  67978. +
  67979. + for(i = 0; i < HP_THERMAL_NUM; i++)
  67980. + {
  67981. + if(pdmpriv->ThermalValue_HP[i])
  67982. + {
  67983. + ThermalValue_HP += pdmpriv->ThermalValue_HP[i];
  67984. + ThermalValue_HP_count++;
  67985. + }
  67986. + }
  67987. +
  67988. + if(ThermalValue_HP_count)
  67989. + ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count);
  67990. + }
  67991. +#endif
  67992. + }
  67993. +
  67994. + delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
  67995. +#ifdef CONFIG_USB_HCI
  67996. + if(pHalData->BoardType == BOARD_USB_High_PA)
  67997. + {
  67998. + if(pdmpriv->bDoneTxpower)
  67999. + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
  68000. + else
  68001. + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
  68002. + }
  68003. + else
  68004. +#endif
  68005. + {
  68006. + delta_HP = 0;
  68007. + }
  68008. + delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue);
  68009. + delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue);
  68010. +
  68011. + //DBG_8192C("Readback Thermal Meter = 0x%lx pre thermal meter 0x%lx EEPROMthermalmeter 0x%lx delta 0x%lx delta_LCK 0x%lx delta_IQK 0x%lx\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK);
  68012. +
  68013. + if(delta_LCK > 1)
  68014. + {
  68015. + pdmpriv->ThermalValue_LCK = ThermalValue;
  68016. + rtl8192c_PHY_LCCalibrate(Adapter);
  68017. + }
  68018. +
  68019. + if((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl)
  68020. + {
  68021. +#ifdef CONFIG_USB_HCI
  68022. + if(pHalData->BoardType == BOARD_USB_High_PA)
  68023. + {
  68024. + pdmpriv->bDoneTxpower = _TRUE;
  68025. + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
  68026. +
  68027. + if(delta_HP > index_mapping_HP_NUM-1)
  68028. + index_HP = index_mapping_HP[index_mapping_HP_NUM-1];
  68029. + else
  68030. + index_HP = index_mapping_HP[delta_HP];
  68031. +
  68032. + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power
  68033. + {
  68034. + for(i = 0; i < rf; i++)
  68035. + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP;
  68036. + CCK_index = pdmpriv->CCK_index_HP -index_HP;
  68037. + }
  68038. + else
  68039. + {
  68040. + for(i = 0; i < rf; i++)
  68041. + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP;
  68042. + CCK_index = pdmpriv->CCK_index_HP + index_HP;
  68043. + }
  68044. +
  68045. + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
  68046. +
  68047. + }
  68048. + else
  68049. +#endif
  68050. + {
  68051. + if(ThermalValue > pdmpriv->ThermalValue)
  68052. + {
  68053. + for(i = 0; i < rf; i++)
  68054. + pdmpriv->OFDM_index[i] -= delta;
  68055. + pdmpriv->CCK_index -= delta;
  68056. + }
  68057. + else
  68058. + {
  68059. + for(i = 0; i < rf; i++)
  68060. + pdmpriv->OFDM_index[i] += delta;
  68061. + pdmpriv->CCK_index += delta;
  68062. + }
  68063. + }
  68064. +
  68065. + /*if(is2T)
  68066. + {
  68067. + DBG_8192C("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n",
  68068. + pdmpriv->OFDM_index[0], pdmpriv->OFDM_index[1], pdmpriv->CCK_index);
  68069. + }
  68070. + else
  68071. + {
  68072. + DBG_8192C("temp OFDM_A_index=0x%x, CCK_index=0x%x\n",
  68073. + pdmpriv->OFDM_index[0], pdmpriv->CCK_index);
  68074. + }*/
  68075. +
  68076. + //no adjust
  68077. +#ifdef CONFIG_USB_HCI
  68078. + if(pHalData->BoardType != BOARD_USB_High_PA)
  68079. +#endif
  68080. + {
  68081. + if(ThermalValue > pHalData->EEPROMThermalMeter)
  68082. + {
  68083. + for(i = 0; i < rf; i++)
  68084. + OFDM_index[i] = pdmpriv->OFDM_index[i]+1;
  68085. + CCK_index = pdmpriv->CCK_index+1;
  68086. + }
  68087. + else
  68088. + {
  68089. + for(i = 0; i < rf; i++)
  68090. + OFDM_index[i] = pdmpriv->OFDM_index[i];
  68091. + CCK_index = pdmpriv->CCK_index;
  68092. + }
  68093. +
  68094. +#if MP_DRIVER == 1
  68095. + for(i = 0; i < rf; i++)
  68096. + {
  68097. + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
  68098. + {
  68099. + if(ThermalValue > pHalData->EEPROMThermalMeter)
  68100. + {
  68101. + if (delta < 5)
  68102. + OFDM_index[i] -= 1;
  68103. + else
  68104. + OFDM_index[i] -= 2;
  68105. + }
  68106. + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
  68107. + {
  68108. + OFDM_index[i] += 1;
  68109. + }
  68110. + }
  68111. + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
  68112. + {
  68113. + if (delta < 5)
  68114. + OFDM_index[i] -= 1;
  68115. + else
  68116. + OFDM_index[i] -= 2;
  68117. + }
  68118. + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
  68119. + {
  68120. + OFDM_index[i] -= 1;
  68121. + }
  68122. + }
  68123. +
  68124. + {
  68125. + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
  68126. + {
  68127. + if(ThermalValue > pHalData->EEPROMThermalMeter)
  68128. + {
  68129. + if (delta < 5)
  68130. + CCK_index -= 1;
  68131. + else
  68132. + CCK_index -= 2;
  68133. + }
  68134. + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
  68135. + {
  68136. + CCK_index += 1;
  68137. + }
  68138. + }
  68139. + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
  68140. + {
  68141. + if (delta < 5)
  68142. + CCK_index -= 1;
  68143. + else
  68144. + CCK_index -= 2;
  68145. + }
  68146. + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
  68147. + {
  68148. + CCK_index -= 1;
  68149. + }
  68150. + }
  68151. +#endif
  68152. + }
  68153. +
  68154. + for(i = 0; i < rf; i++)
  68155. + {
  68156. + if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1))
  68157. + OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1);
  68158. + else if (OFDM_index[i] < OFDM_min_index)
  68159. + OFDM_index[i] = OFDM_min_index;
  68160. + }
  68161. +
  68162. + if(CCK_index > (CCK_TABLE_SIZE-1))
  68163. + CCK_index = (CCK_TABLE_SIZE-1);
  68164. + else if (CCK_index < 0)
  68165. + CCK_index = 0;
  68166. +
  68167. + /*if(is2T)
  68168. + {
  68169. + DBG_8192C("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n",
  68170. + OFDM_index[0], OFDM_index[1], CCK_index);
  68171. + }
  68172. + else
  68173. + {
  68174. + DBG_8192C("new OFDM_A_index=0x%x, CCK_index=0x%x\n",
  68175. + OFDM_index[0], CCK_index);
  68176. + }*/
  68177. + }
  68178. +
  68179. + if(pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0))
  68180. + {
  68181. + //Adujst OFDM Ant_A according to IQK result
  68182. + ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22;
  68183. + X = pdmpriv->RegE94;
  68184. + Y = pdmpriv->RegE9C;
  68185. +
  68186. + if(X != 0)
  68187. + {
  68188. + if ((X & 0x00000200) != 0)
  68189. + X = X | 0xFFFFFC00;
  68190. + ele_A = ((X * ele_D)>>8)&0x000003FF;
  68191. +
  68192. + //new element C = element D x Y
  68193. + if ((Y & 0x00000200) != 0)
  68194. + Y = Y | 0xFFFFFC00;
  68195. + ele_C = ((Y * ele_D)>>8)&0x000003FF;
  68196. +
  68197. + //wirte new elements A, C, D to regC80 and regC94, element B is always 0
  68198. + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A;
  68199. + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32);
  68200. +
  68201. + value32 = (ele_C&0x000003C0)>>6;
  68202. + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32);
  68203. +
  68204. + value32 = ((X * ele_D)>>7)&0x01;
  68205. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32);
  68206. +
  68207. + value32 = ((Y * ele_D)>>7)&0x01;
  68208. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32);
  68209. +
  68210. + }
  68211. + else
  68212. + {
  68213. + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]);
  68214. + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);
  68215. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00);
  68216. + }
  68217. +
  68218. + //RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D));
  68219. +
  68220. + //Adjust CCK according to IQK result
  68221. + if(!pdmpriv->bCCKinCH14){
  68222. + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]);
  68223. + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]);
  68224. + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]);
  68225. + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]);
  68226. + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]);
  68227. + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]);
  68228. + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]);
  68229. + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]);
  68230. + }
  68231. + else{
  68232. + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]);
  68233. + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]);
  68234. + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]);
  68235. + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]);
  68236. + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]);
  68237. + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]);
  68238. + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]);
  68239. + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]);
  68240. + }
  68241. +
  68242. + if(is2T)
  68243. + {
  68244. + ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22;
  68245. +
  68246. + //new element A = element D x X
  68247. + X = pdmpriv->RegEB4;
  68248. + Y = pdmpriv->RegEBC;
  68249. +
  68250. + if(X != 0){
  68251. + if ((X & 0x00000200) != 0) //consider minus
  68252. + X = X | 0xFFFFFC00;
  68253. + ele_A = ((X * ele_D)>>8)&0x000003FF;
  68254. +
  68255. + //new element C = element D x Y
  68256. + if ((Y & 0x00000200) != 0)
  68257. + Y = Y | 0xFFFFFC00;
  68258. + ele_C = ((Y * ele_D)>>8)&0x00003FF;
  68259. +
  68260. + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0
  68261. + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A;
  68262. + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);
  68263. +
  68264. + value32 = (ele_C&0x000003C0)>>6;
  68265. + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32);
  68266. +
  68267. + value32 = ((X * ele_D)>>7)&0x01;
  68268. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32);
  68269. +
  68270. + value32 = ((Y * ele_D)>>7)&0x01;
  68271. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32);
  68272. +
  68273. + }
  68274. + else{
  68275. + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]);
  68276. + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);
  68277. + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00);
  68278. + }
  68279. +
  68280. + //DBG_8192C("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D);
  68281. + }
  68282. +
  68283. + /*
  68284. + DBG_8192C("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \
  68285. + PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\
  68286. + PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \
  68287. + PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bMaskDWord));
  68288. + */
  68289. + }
  68290. +
  68291. +#if MP_DRIVER == 1
  68292. + if(delta_IQK > 1)
  68293. +#else
  68294. + if(delta_IQK > 3)
  68295. +#endif
  68296. + {
  68297. + pdmpriv->ThermalValue_IQK = ThermalValue;
  68298. + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE);
  68299. + }
  68300. +
  68301. + //update thermal meter value
  68302. + if(pdmpriv->TxPowerTrackControl)
  68303. + pdmpriv->ThermalValue = ThermalValue;
  68304. +
  68305. + }
  68306. +
  68307. + //DBG_8192C("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n");
  68308. +
  68309. + pdmpriv->TXPowercount = 0;
  68310. +
  68311. +}
  68312. +
  68313. +
  68314. +static VOID
  68315. +dm_InitializeTXPowerTracking_ThermalMeter(
  68316. + IN PADAPTER Adapter)
  68317. +{
  68318. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  68319. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  68320. +
  68321. + //pMgntInfo->bTXPowerTracking = _TRUE;
  68322. + pdmpriv->TXPowercount = 0;
  68323. + pdmpriv->bTXPowerTrackingInit = _FALSE;
  68324. + pdmpriv->ThermalValue = 0;
  68325. +
  68326. +#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
  68327. + pdmpriv->TxPowerTrackControl = _TRUE;
  68328. +#endif
  68329. +
  68330. + MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
  68331. +}
  68332. +
  68333. +
  68334. +static VOID
  68335. +DM_InitializeTXPowerTracking(
  68336. + IN PADAPTER Adapter)
  68337. +{
  68338. + dm_InitializeTXPowerTracking_ThermalMeter(Adapter);
  68339. +}
  68340. +
  68341. +//
  68342. +// Description:
  68343. +// - Dispatch TxPower Tracking direct call ONLY for 92s.
  68344. +// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource
  68345. +// leakage under some platform.
  68346. +//
  68347. +// Assumption:
  68348. +// PASSIVE_LEVEL when this routine is called.
  68349. +//
  68350. +// Added by Roger, 2009.06.18.
  68351. +//
  68352. +static VOID
  68353. +DM_TXPowerTracking92CDirectCall(
  68354. + IN PADAPTER Adapter)
  68355. +{
  68356. + dm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter);
  68357. +}
  68358. +
  68359. +static VOID
  68360. +dm_CheckTXPowerTracking_ThermalMeter(
  68361. + IN PADAPTER Adapter)
  68362. +{
  68363. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  68364. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  68365. + //u1Byte TxPowerCheckCnt = 5; //10 sec
  68366. +
  68367. + //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)
  68368. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_SS))
  68369. + {
  68370. + return;
  68371. + }
  68372. +
  68373. + if(!pdmpriv->TM_Trigger) //at least delay 1 sec
  68374. + {
  68375. + //pHalData->TxPowerCheckCnt++; //cosa add for debug
  68376. + PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
  68377. + //DBG_8192C("Trigger 92C Thermal Meter!!\n");
  68378. +
  68379. + pdmpriv->TM_Trigger = 1;
  68380. + return;
  68381. +
  68382. + }
  68383. + else
  68384. + {
  68385. + //DBG_8192C("Schedule TxPowerTracking direct call!!\n");
  68386. + DM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
  68387. + pdmpriv->TM_Trigger = 0;
  68388. + }
  68389. +
  68390. +}
  68391. +
  68392. +
  68393. +VOID
  68394. +rtl8192c_dm_CheckTXPowerTracking(
  68395. + IN PADAPTER Adapter)
  68396. +{
  68397. + dm_CheckTXPowerTracking_ThermalMeter(Adapter);
  68398. +}
  68399. +
  68400. +#ifdef CONFIG_BT_COEXIST
  68401. +static BOOLEAN BT_BTStateChange(PADAPTER Adapter)
  68402. +{
  68403. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  68404. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  68405. + struct registry_priv *registry_par = &Adapter->registrypriv;
  68406. +
  68407. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  68408. +
  68409. + u32 Polling, Ratio_Tx, Ratio_PRI;
  68410. + u32 BT_Tx, BT_PRI;
  68411. + u8 BT_State;
  68412. + static u8 ServiceTypeCnt = 0;
  68413. + u8 CurServiceType;
  68414. + static u8 LastServiceType = BT_Idle;
  68415. +
  68416. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE)
  68417. + return _FALSE;
  68418. +
  68419. + BT_State = rtw_read8(Adapter, 0x4fd);
  68420. +/*
  68421. + temp = PlatformEFIORead4Byte(Adapter, 0x488);
  68422. + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff));
  68423. + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff));
  68424. +
  68425. + temp = PlatformEFIORead4Byte(Adapter, 0x48c);
  68426. + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) +
  68427. + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff);
  68428. +
  68429. +*/
  68430. + BT_Tx = rtw_read32(Adapter, 0x488);
  68431. +
  68432. + DBG_8192C("Ratio 0x488 =%x\n", BT_Tx);
  68433. + BT_Tx =BT_Tx & 0x00ffffff;
  68434. + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx));
  68435. +
  68436. + BT_PRI = rtw_read32(Adapter, 0x48c);
  68437. +
  68438. + DBG_8192C("Ratio 0x48c =%x\n", BT_PRI);
  68439. + BT_PRI =BT_PRI & 0x00ffffff;
  68440. + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI));
  68441. +
  68442. +
  68443. + Polling = rtw_read32(Adapter, 0x490);
  68444. + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling));
  68445. +
  68446. +
  68447. + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffff && BT_State==0xff)
  68448. + return _FALSE;
  68449. +
  68450. + BT_State &= BIT0;
  68451. +
  68452. + if(BT_State != pbtpriv->BT_CUR_State)
  68453. + {
  68454. + pbtpriv->BT_CUR_State = BT_State;
  68455. +
  68456. + if(registry_par->bt_sco == 3)
  68457. + {
  68458. + ServiceTypeCnt = 0;
  68459. +
  68460. + pbtpriv->BT_Service = BT_Idle;
  68461. +
  68462. + DBG_8192C("BT_%s\n", BT_State?"ON":"OFF");
  68463. +
  68464. + BT_State = BT_State |
  68465. + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |BIT2;
  68466. +
  68467. + rtw_write8(Adapter, 0x4fd, BT_State);
  68468. + DBG_8192C("BT set 0x4fd to %x\n", BT_State);
  68469. + }
  68470. +
  68471. + return _TRUE;
  68472. + }
  68473. + DBG_8192C("bRegBT_Sco = %d\n",registry_par->bt_sco);
  68474. +
  68475. + Ratio_Tx = BT_Tx*1000/Polling;
  68476. + Ratio_PRI = BT_PRI*1000/Polling;
  68477. +
  68478. + pbtpriv->Ratio_Tx=Ratio_Tx;
  68479. + pbtpriv->Ratio_PRI=Ratio_PRI;
  68480. +
  68481. + DBG_8192C("Ratio_Tx=%d\n", Ratio_Tx);
  68482. + DBG_8192C("Ratio_PRI=%d\n", Ratio_PRI);
  68483. +
  68484. +
  68485. + if(BT_State && registry_par->bt_sco==3)
  68486. + {
  68487. + DBG_8192C("bt_sco ==3 Follow Counter\n");
  68488. +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff)
  68489. +// {
  68490. +// ServiceTypeCnt = 0;
  68491. +// return FALSE;
  68492. +// }
  68493. +// else
  68494. + {
  68495. + /*
  68496. + Ratio_Tx = BT_Tx*1000/Polling;
  68497. + Ratio_PRI = BT_PRI*1000/Polling;
  68498. +
  68499. + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx;
  68500. + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI;
  68501. +
  68502. + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx));
  68503. + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI));
  68504. +
  68505. + */
  68506. + if((Ratio_Tx < 30) && (Ratio_PRI < 30))
  68507. + CurServiceType = BT_Idle;
  68508. + else if((Ratio_PRI > 110) && (Ratio_PRI < 250))
  68509. + CurServiceType = BT_SCO;
  68510. + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200))
  68511. + CurServiceType = BT_Busy;
  68512. + else if((Ratio_Tx >=350) && (Ratio_Tx < 500))
  68513. + CurServiceType = BT_OtherBusy;
  68514. + else if(Ratio_Tx >=500)
  68515. + CurServiceType = BT_PAN;
  68516. + else
  68517. + CurServiceType=BT_OtherAction;
  68518. + }
  68519. +
  68520. +/* if(pHalData->bt_coexist.bStopCount)
  68521. + {
  68522. + ServiceTypeCnt=0;
  68523. + pHalData->bt_coexist.bStopCount=FALSE;
  68524. + }
  68525. +*/
  68526. +// if(CurServiceType == BT_OtherBusy)
  68527. + {
  68528. + ServiceTypeCnt=2;
  68529. + LastServiceType=CurServiceType;
  68530. + }
  68531. +#if 0
  68532. + else if(CurServiceType == LastServiceType)
  68533. + {
  68534. + if(ServiceTypeCnt<3)
  68535. + ServiceTypeCnt++;
  68536. + }
  68537. + else
  68538. + {
  68539. + ServiceTypeCnt = 0;
  68540. + LastServiceType = CurServiceType;
  68541. + }
  68542. +#endif
  68543. +
  68544. + if(ServiceTypeCnt==2)
  68545. + {
  68546. + pbtpriv->BT_Service = LastServiceType;
  68547. + BT_State = BT_State |
  68548. + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |
  68549. + //((pbtpriv->BT_Service==BT_SCO)?0:BIT2);
  68550. + ((pbtpriv->BT_Service!=BT_Idle)?0:BIT2);
  68551. +
  68552. + //if(pbtpriv->BT_Service==BT_Busy)
  68553. + // BT_State&= ~(BIT2);
  68554. +
  68555. + if(pbtpriv->BT_Service==BT_SCO)
  68556. + {
  68557. + DBG_8192C("BT TYPE Set to ==> BT_SCO\n");
  68558. + }
  68559. + else if(pbtpriv->BT_Service==BT_Idle)
  68560. + {
  68561. + DBG_8192C("BT TYPE Set to ==> BT_Idle\n");
  68562. + }
  68563. + else if(pbtpriv->BT_Service==BT_OtherAction)
  68564. + {
  68565. + DBG_8192C("BT TYPE Set to ==> BT_OtherAction\n");
  68566. + }
  68567. + else if(pbtpriv->BT_Service==BT_Busy)
  68568. + {
  68569. + DBG_8192C("BT TYPE Set to ==> BT_Busy\n");
  68570. + }
  68571. + else if(pbtpriv->BT_Service==BT_PAN)
  68572. + {
  68573. + DBG_8192C("BT TYPE Set to ==> BT_PAN\n");
  68574. + }
  68575. + else
  68576. + {
  68577. + DBG_8192C("BT TYPE Set to ==> BT_OtherBusy\n");
  68578. + }
  68579. +
  68580. + //Add interrupt migration when bt is not in idel state (no traffic).
  68581. + //suggestion by Victor.
  68582. + if(pbtpriv->BT_Service!=BT_Idle)//EDCA_VI_PARAM modify
  68583. + {
  68584. +
  68585. + rtw_write16(Adapter, 0x504, 0x0ccc);
  68586. + rtw_write8(Adapter, 0x506, 0x54);
  68587. + rtw_write8(Adapter, 0x507, 0x54);
  68588. +
  68589. + }
  68590. + else
  68591. + {
  68592. + rtw_write8(Adapter, 0x506, 0x00);
  68593. + rtw_write8(Adapter, 0x507, 0x00);
  68594. + }
  68595. +
  68596. + rtw_write8(Adapter, 0x4fd, BT_State);
  68597. + DBG_8192C("BT_SCO set 0x4fd to %x\n", BT_State);
  68598. + return _TRUE;
  68599. + }
  68600. + }
  68601. +
  68602. + return _FALSE;
  68603. +
  68604. +}
  68605. +
  68606. +static BOOLEAN
  68607. +BT_WifiConnectChange(
  68608. + IN PADAPTER Adapter
  68609. + )
  68610. +{
  68611. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  68612. +// PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  68613. + static BOOLEAN bMediaConnect = _FALSE;
  68614. +
  68615. + //if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo))
  68616. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE)
  68617. + {
  68618. + bMediaConnect = _FALSE;
  68619. + }
  68620. + else
  68621. + {
  68622. + if(!bMediaConnect)
  68623. + {
  68624. + bMediaConnect = _TRUE;
  68625. + return _TRUE;
  68626. + }
  68627. + bMediaConnect = _TRUE;
  68628. + }
  68629. +
  68630. + return _FALSE;
  68631. +}
  68632. +
  68633. +#define BT_RSSI_STATE_NORMAL_POWER BIT0
  68634. +#define BT_RSSI_STATE_AMDPU_OFF BIT1
  68635. +#define BT_RSSI_STATE_SPECIAL_LOW BIT2
  68636. +#define BT_RSSI_STATE_BG_EDCA_LOW BIT3
  68637. +
  68638. +static s32 GET_UNDECORATED_AVERAGE_RSSI(PADAPTER Adapter)
  68639. +{
  68640. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  68641. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  68642. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  68643. + s32 average_rssi;
  68644. +
  68645. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE))
  68646. + {
  68647. + average_rssi = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  68648. + }
  68649. + else
  68650. + {
  68651. + average_rssi = pdmpriv->UndecoratedSmoothedPWDB;
  68652. + }
  68653. + return average_rssi;
  68654. +}
  68655. +
  68656. +static u8 BT_RssiStateChange(
  68657. + IN PADAPTER Adapter
  68658. + )
  68659. +{
  68660. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  68661. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  68662. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  68663. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  68664. + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  68665. + s32 UndecoratedSmoothedPWDB;
  68666. + u8 CurrBtRssiState = 0x00;
  68667. +
  68668. +
  68669. +
  68670. +
  68671. + //if(pMgntInfo->bMediaConnect) // Default port
  68672. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  68673. + {
  68674. + UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(Adapter);
  68675. + }
  68676. + else // associated entry pwdb
  68677. + {
  68678. + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)
  68679. + UndecoratedSmoothedPWDB = 100; // No any RSSI information. Assume to be MAX.
  68680. + else
  68681. + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  68682. + }
  68683. +
  68684. + // Check RSSI to determine HighPower/NormalPower state for BT coexistence.
  68685. + if(UndecoratedSmoothedPWDB >= 67)
  68686. + CurrBtRssiState &= (~BT_RSSI_STATE_NORMAL_POWER);
  68687. + else if(UndecoratedSmoothedPWDB < 62)
  68688. + CurrBtRssiState |= BT_RSSI_STATE_NORMAL_POWER;
  68689. +
  68690. + // Check RSSI to determine AMPDU setting for BT coexistence.
  68691. + if(UndecoratedSmoothedPWDB >= 40)
  68692. + CurrBtRssiState &= (~BT_RSSI_STATE_AMDPU_OFF);
  68693. + else if(UndecoratedSmoothedPWDB <= 32)
  68694. + CurrBtRssiState |= BT_RSSI_STATE_AMDPU_OFF;
  68695. +
  68696. + // Marked RSSI state. It will be used to determine BT coexistence setting later.
  68697. + if(UndecoratedSmoothedPWDB < 35)
  68698. + CurrBtRssiState |= BT_RSSI_STATE_SPECIAL_LOW;
  68699. + else
  68700. + CurrBtRssiState &= (~BT_RSSI_STATE_SPECIAL_LOW);
  68701. +
  68702. + // Check BT state related to BT_Idle in B/G mode.
  68703. + if(UndecoratedSmoothedPWDB < 15)
  68704. + CurrBtRssiState |= BT_RSSI_STATE_BG_EDCA_LOW;
  68705. + else
  68706. + CurrBtRssiState &= (~BT_RSSI_STATE_BG_EDCA_LOW);
  68707. +
  68708. + if(CurrBtRssiState != pbtpriv->BtRssiState)
  68709. + {
  68710. + pbtpriv->BtRssiState = CurrBtRssiState;
  68711. + return _TRUE;
  68712. + }
  68713. + else
  68714. + {
  68715. + return _FALSE;
  68716. + }
  68717. +}
  68718. +
  68719. +static void dm_BTCoexist(PADAPTER Adapter )
  68720. +{
  68721. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  68722. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  68723. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  68724. + struct mlme_ext_info *pmlmeinfo = &Adapter->mlmeextpriv.mlmext_info;
  68725. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  68726. +
  68727. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  68728. + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  68729. + //PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);
  68730. +
  68731. + //PRX_TS_RECORD pRxTs = NULL;
  68732. + u8 BT_gpio_mux;
  68733. +
  68734. + BOOLEAN bWifiConnectChange, bBtStateChange,bRssiStateChange;
  68735. +
  68736. + if(pbtpriv->bCOBT == _FALSE) return;
  68737. +
  68738. + if(!( pdmpriv->DMFlag & DYNAMIC_FUNC_BT)) return;
  68739. +
  68740. + if( (pbtpriv->BT_Coexist) &&(pbtpriv->BT_CoexistType == BT_CSR_BC4) && (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) )
  68741. + {
  68742. + bWifiConnectChange = BT_WifiConnectChange(Adapter);
  68743. + bBtStateChange = BT_BTStateChange(Adapter);
  68744. + bRssiStateChange = BT_RssiStateChange(Adapter);
  68745. +
  68746. + DBG_8192C("bWifiConnectChange %d, bBtStateChange %d,bRssiStateChange %d\n",
  68747. + bWifiConnectChange,bBtStateChange,bRssiStateChange);
  68748. +
  68749. + // add by hpfan for debug message
  68750. + BT_gpio_mux = rtw_read8(Adapter, REG_GPIO_MUXCFG);
  68751. + DBG_8192C("BTCoexit Reg_0x40 (%2x)\n", BT_gpio_mux);
  68752. +
  68753. + if( bWifiConnectChange ||bBtStateChange ||bRssiStateChange )
  68754. + {
  68755. + if(pbtpriv->BT_CUR_State)
  68756. + {
  68757. +
  68758. + // Do not allow receiving A-MPDU aggregation.
  68759. + if(pbtpriv->BT_Ampdu)// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU.
  68760. + {
  68761. +
  68762. + if(pmlmeinfo->assoc_AP_vendor == ciscoAP)
  68763. + {
  68764. + if(pbtpriv->BT_Service!=BT_Idle)
  68765. + {
  68766. + if(pmlmeinfo->bAcceptAddbaReq)
  68767. + {
  68768. + DBG_8192C("BT_Disallow AMPDU \n");
  68769. + pmlmeinfo->bAcceptAddbaReq = _FALSE;
  68770. + send_delba(Adapter,0, get_my_bssid(&(pmlmeinfo->network)));
  68771. + }
  68772. + }
  68773. + else
  68774. + {
  68775. + if(!pmlmeinfo->bAcceptAddbaReq)
  68776. + {
  68777. + DBG_8192C("BT_Allow AMPDU RSSI >=40\n");
  68778. + pmlmeinfo->bAcceptAddbaReq = _TRUE;
  68779. + }
  68780. + }
  68781. + }
  68782. + else
  68783. + {
  68784. + if(!pmlmeinfo->bAcceptAddbaReq)
  68785. + {
  68786. + DBG_8192C("BT_Allow AMPDU BT Idle\n");
  68787. + pmlmeinfo->bAcceptAddbaReq = _TRUE;
  68788. + }
  68789. + }
  68790. + }
  68791. +
  68792. +#if 0
  68793. + else if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy))
  68794. + {
  68795. + if(pHalData->bt_coexist.BtRssiState & BT_RSSI_STATE_AMDPU_OFF)
  68796. + {
  68797. + if(pMgntInfo->bBT_Ampdu && pHTInfo->bAcceptAddbaReq)
  68798. + {
  68799. + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n"));
  68800. + pHTInfo->bAcceptAddbaReq = FALSE;
  68801. + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE))
  68802. + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR);
  68803. + }
  68804. + }
  68805. + else
  68806. + {
  68807. + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq)
  68808. + {
  68809. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n"));
  68810. + pHTInfo->bAcceptAddbaReq = TRUE;
  68811. + }
  68812. + }
  68813. + }
  68814. + else
  68815. + {
  68816. + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq)
  68817. + {
  68818. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n"));
  68819. + pHTInfo->bAcceptAddbaReq = TRUE;
  68820. + }
  68821. + }
  68822. +#endif
  68823. +
  68824. + if(pbtpriv->BT_Ant_isolation)
  68825. + {
  68826. + DBG_8192C("BT_IsolationLow\n");
  68827. +
  68828. +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3.
  68829. +#if 0
  68830. + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n"));
  68831. + if(pMgntInfo->bUseRAMask)
  68832. + {
  68833. + // 20100407 Joseph: Fix rate adaptive modification for BT coexist.
  68834. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case,
  68835. + // which connect with multiple STAs.
  68836. + Adapter->HalFunc.UpdateHalRAMaskHandler(
  68837. + Adapter,
  68838. + FALSE,
  68839. + 0,
  68840. + NULL,
  68841. + NULL,
  68842. + pMgntInfo->RateAdaptive.RATRState,
  68843. + RAMask_Normal);
  68844. + }
  68845. + else
  68846. + {
  68847. + Adapter->HalFunc.UpdateHalRATRTableHandler(
  68848. + Adapter,
  68849. + &pMgntInfo->dot11OperationalRateSet,
  68850. + pMgntInfo->dot11HTOperationalRateSet,NULL);
  68851. + }
  68852. +#endif
  68853. +
  68854. + // 20100415 Joseph: Modify BT coexist mechanism suggested by Yaying.
  68855. + // Now we only enable HW BT coexist when BT in "Busy" state.
  68856. + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20)
  68857. + {
  68858. + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) &&
  68859. + pbtpriv->BT_Service==BT_OtherAction)
  68860. + {
  68861. + DBG_8192C("BT_Turn ON Coexist\n");
  68862. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0);
  68863. + }
  68864. + else
  68865. + {
  68866. + if((pbtpriv->BT_Service==BT_Busy) &&
  68867. + (pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER))
  68868. + {
  68869. + DBG_8192C("BT_Turn ON Coexist\n");
  68870. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0);
  68871. + }
  68872. + else if((pbtpriv->BT_Service==BT_OtherAction) &&
  68873. + (pbtpriv->BtRssiState & BT_RSSI_STATE_SPECIAL_LOW))
  68874. + {
  68875. + DBG_8192C("BT_Turn ON Coexist\n");
  68876. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0);
  68877. + }
  68878. + else if(pbtpriv->BT_Service==BT_PAN)
  68879. + {
  68880. + DBG_8192C("BT_Turn ON Coexist\n");
  68881. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00);
  68882. + }
  68883. + else
  68884. + {
  68885. + DBG_8192C("BT_Turn OFF Coexist\n");
  68886. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00);
  68887. + }
  68888. + }
  68889. + }
  68890. + else
  68891. + {
  68892. + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist\n");
  68893. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00);
  68894. + }
  68895. +
  68896. + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20)
  68897. + {
  68898. + if(pbtpriv->BT_Service==BT_PAN)
  68899. + {
  68900. + DBG_8192C("BT_Turn ON Coexist(Reg0x44 = 0x10100)\n");
  68901. + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x10100);
  68902. + }
  68903. + else
  68904. + {
  68905. + DBG_8192C("BT_Turn OFF Coexist(Reg0x44 = 0x0)\n");
  68906. + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0);
  68907. + }
  68908. + }
  68909. + else
  68910. + {
  68911. + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist(Reg0x44 = 0x0)\n");
  68912. + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0);
  68913. + }
  68914. +
  68915. + // 20100430 Joseph: Integrate the BT coexistence EDCA tuning here.
  68916. + if(pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER)
  68917. + {
  68918. + if(pbtpriv->BT_Service==BT_OtherBusy)
  68919. + {
  68920. + //pbtpriv->BtEdcaUL = 0x5ea72b;
  68921. + //pbtpriv->BtEdcaDL = 0x5ea72b;
  68922. + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72b;
  68923. + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72b;
  68924. +
  68925. + DBG_8192C("BT in BT_OtherBusy state Tx (%d) >350 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx ,REG_EDCA_BE_PARAM, 0x5ea72b);
  68926. + }
  68927. + else if(pbtpriv->BT_Service==BT_Busy)
  68928. + {
  68929. + //pbtpriv->BtEdcaUL = 0x5eb82f;
  68930. + //pbtpriv->BtEdcaDL = 0x5eb82f;
  68931. +
  68932. + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82f;
  68933. + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82f;
  68934. +
  68935. + DBG_8192C("BT in BT_Busy state parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82f);
  68936. + }
  68937. + else if(pbtpriv->BT_Service==BT_SCO)
  68938. + {
  68939. + if(pbtpriv->Ratio_Tx>160)
  68940. + {
  68941. + //pbtpriv->BtEdcaUL = 0x5ea72f;
  68942. + //pbtpriv->BtEdcaDL = 0x5ea72f;
  68943. + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72f;
  68944. + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72f;
  68945. + DBG_8192C("BT in BT_SCO state Tx (%d) >160 parameter(0x%x) = 0x%x\n",pbtpriv->Ratio_Tx, REG_EDCA_BE_PARAM, 0x5ea72f);
  68946. + }
  68947. + else
  68948. + {
  68949. + //pbtpriv->BtEdcaUL = 0x5ea32b;
  68950. + //pbtpriv->BtEdcaDL = 0x5ea42b;
  68951. +
  68952. + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea32b;
  68953. + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea42b;
  68954. +
  68955. + DBG_8192C("BT in BT_SCO state Tx (%d) <160 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx,REG_EDCA_BE_PARAM, 0x5ea32f);
  68956. + }
  68957. + }
  68958. + else
  68959. + {
  68960. + // BT coexistence mechanism does not control EDCA parameter.
  68961. + //pbtpriv->BtEdcaUL = 0;
  68962. + //pbtpriv->BtEdcaDL = 0;
  68963. +
  68964. + pbtpriv->BT_EDCA[UP_LINK] = 0;
  68965. + pbtpriv->BT_EDCA[DOWN_LINK] = 0;
  68966. + DBG_8192C("BT in State %d and parameter(0x%x) use original setting.\n",pbtpriv->BT_Service, REG_EDCA_BE_PARAM);
  68967. + }
  68968. +
  68969. + if((pbtpriv->BT_Service!=BT_Idle) &&
  68970. + (pmlmeext->cur_wireless_mode == WIRELESS_MODE_G) &&
  68971. + (pbtpriv->BtRssiState & BT_RSSI_STATE_BG_EDCA_LOW))
  68972. + {
  68973. + //pbtpriv->BtEdcaUL = 0x5eb82b;
  68974. + //pbtpriv->BtEdcaDL = 0x5eb82b;
  68975. +
  68976. + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82b;
  68977. + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82b;
  68978. +
  68979. + DBG_8192C("BT set parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82b);
  68980. + }
  68981. + }
  68982. + else
  68983. + {
  68984. + // BT coexistence mechanism does not control EDCA parameter.
  68985. + //pbtpriv->BtEdcaUL = 0;
  68986. + //pbtpriv->BtEdcaDL = 0;
  68987. +
  68988. + pbtpriv->BT_EDCA[UP_LINK] = 0;
  68989. + pbtpriv->BT_EDCA[DOWN_LINK] = 0;
  68990. + }
  68991. +
  68992. + // 20100415 Joseph: Set RF register 0x1E and 0x1F for BT coexist suggested by Yaying.
  68993. + if(pbtpriv->BT_Service!=BT_Idle)
  68994. + {
  68995. + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf);
  68996. + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, 0xf);
  68997. + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf));
  68998. + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, 0xf);
  68999. + }
  69000. + else
  69001. + {
  69002. + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n",pbtpriv->BtRfRegOrigin1E);
  69003. + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E);
  69004. + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F));
  69005. + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F);
  69006. + }
  69007. + }
  69008. + else
  69009. + {
  69010. + DBG_8192C("BT_IsolationHigh\n");
  69011. + // Do nothing.
  69012. + }
  69013. + }
  69014. + else
  69015. + {
  69016. +
  69017. + if(pbtpriv->BT_Ampdu && !pmlmeinfo->bAcceptAddbaReq)
  69018. + {
  69019. + DBG_8192C("BT_Allow AMPDU bt is off\n");
  69020. + pmlmeinfo->bAcceptAddbaReq = _TRUE;
  69021. + }
  69022. +
  69023. + DBG_8192C("BT_Turn OFF Coexist bt is off \n");
  69024. + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00);
  69025. +
  69026. + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", pbtpriv->BtRfRegOrigin1E);
  69027. + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E);
  69028. + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F));
  69029. + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F);
  69030. +
  69031. + // BT coexistence mechanism does not control EDCA parameter since BT is disabled.
  69032. + //pbtpriv->BtEdcaUL = 0;
  69033. + //pbtpriv->BtEdcaDL = 0;
  69034. + pbtpriv->BT_EDCA[UP_LINK] = 0;
  69035. + pbtpriv->BT_EDCA[DOWN_LINK] = 0;
  69036. +
  69037. +
  69038. +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3.
  69039. +#if 0
  69040. + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n"));
  69041. + if(pMgntInfo->bUseRAMask)
  69042. + {
  69043. + // 20100407 Joseph: Fix rate adaptive modification for BT coexist.
  69044. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case,
  69045. + // which connect with multiple STAs.
  69046. + Adapter->HalFunc.UpdateHalRAMaskHandler(
  69047. + Adapter,
  69048. + FALSE,
  69049. + 0,
  69050. + NULL,
  69051. + NULL,
  69052. + pMgntInfo->RateAdaptive.RATRState,
  69053. + RAMask_Normal);
  69054. + }
  69055. + else
  69056. + {
  69057. + Adapter->HalFunc.UpdateHalRATRTableHandler(
  69058. + Adapter,
  69059. + &pMgntInfo->dot11OperationalRateSet,
  69060. + pMgntInfo->dot11HTOperationalRateSet,NULL);
  69061. + }
  69062. +#endif
  69063. + }
  69064. + }
  69065. + }
  69066. +}
  69067. +
  69068. +static void dm_InitBtCoexistDM( PADAPTER Adapter)
  69069. +{
  69070. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69071. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  69072. +
  69073. + if( !pbtpriv->BT_Coexist ) return;
  69074. +
  69075. + pbtpriv->BtRfRegOrigin1E = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1e, 0xf0);
  69076. + pbtpriv->BtRfRegOrigin1F = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1f, 0xf0);
  69077. +}
  69078. +
  69079. +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart)
  69080. +{
  69081. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  69082. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  69083. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  69084. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  69085. +
  69086. + pbtpriv->bCOBT = bStart;
  69087. + send_delba(padapter,0, get_my_bssid(&(pmlmeinfo->network)));
  69088. + send_delba(padapter,1, get_my_bssid(&(pmlmeinfo->network)));
  69089. +
  69090. +}
  69091. +
  69092. +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir)
  69093. +{
  69094. + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
  69095. + DBG_8192C("issue_delete_ba : %s...\n",(dir==0)?"RX_DIR":"TX_DIR");
  69096. + send_delba(padapter,dir, get_my_bssid(&(pmlmeinfo->network)));
  69097. +}
  69098. +
  69099. +#endif
  69100. +
  69101. +#if 0//def CONFIG_PCI_HCI
  69102. +
  69103. +BOOLEAN
  69104. +BT_BTStateChange(
  69105. + IN PADAPTER Adapter
  69106. + )
  69107. +{
  69108. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  69109. + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  69110. +
  69111. + u4Byte temp, Polling, Ratio_Tx, Ratio_PRI;
  69112. + u4Byte BT_Tx, BT_PRI;
  69113. + u1Byte BT_State;
  69114. + static u1Byte ServiceTypeCnt = 0;
  69115. + u1Byte CurServiceType;
  69116. + static u1Byte LastServiceType = BT_Idle;
  69117. +
  69118. + if(!pMgntInfo->bMediaConnect)
  69119. + return FALSE;
  69120. +
  69121. + BT_State = PlatformEFIORead1Byte(Adapter, 0x4fd);
  69122. +/*
  69123. + temp = PlatformEFIORead4Byte(Adapter, 0x488);
  69124. + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff));
  69125. + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff));
  69126. +
  69127. + temp = PlatformEFIORead4Byte(Adapter, 0x48c);
  69128. + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) +
  69129. + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff);
  69130. +
  69131. +*/
  69132. + BT_Tx = PlatformEFIORead4Byte(Adapter, 0x488);
  69133. +
  69134. + RTPRINT(FBT, BT_TRACE, ("Ratio 0x488 =%x\n", BT_Tx));
  69135. + BT_Tx =BT_Tx & 0x00ffffff;
  69136. + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx));
  69137. +
  69138. + BT_PRI = PlatformEFIORead4Byte(Adapter, 0x48c);
  69139. +
  69140. + RTPRINT(FBT, BT_TRACE, ("Ratio Ratio 0x48c =%x\n", BT_PRI));
  69141. + BT_PRI =BT_PRI & 0x00ffffff;
  69142. + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI));
  69143. +
  69144. +
  69145. + Polling = PlatformEFIORead4Byte(Adapter, 0x490);
  69146. + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling));
  69147. +
  69148. +
  69149. + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffffff && BT_State==0xff)
  69150. + return FALSE;
  69151. +
  69152. + BT_State &= BIT0;
  69153. +
  69154. + if(BT_State != pHalData->bt_coexist.BT_CUR_State)
  69155. + {
  69156. + pHalData->bt_coexist.BT_CUR_State = BT_State;
  69157. +
  69158. + if(pMgntInfo->bRegBT_Sco == 3)
  69159. + {
  69160. + ServiceTypeCnt = 0;
  69161. +
  69162. + pHalData->bt_coexist.BT_Service = BT_Idle;
  69163. +
  69164. + RTPRINT(FBT, BT_TRACE, ("BT_%s\n", BT_State?"ON":"OFF"));
  69165. +
  69166. + BT_State = BT_State |
  69167. + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) |BIT2;
  69168. +
  69169. + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State);
  69170. + RTPRINT(FBT, BT_TRACE, ("BT set 0x4fd to %x\n", BT_State));
  69171. + }
  69172. +
  69173. + return TRUE;
  69174. + }
  69175. + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco %d\n", pMgntInfo->bRegBT_Sco));
  69176. +
  69177. + Ratio_Tx = BT_Tx*1000/Polling;
  69178. + Ratio_PRI = BT_PRI*1000/Polling;
  69179. +
  69180. + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx;
  69181. + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI;
  69182. +
  69183. + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx));
  69184. + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI));
  69185. +
  69186. +
  69187. + if(BT_State && pMgntInfo->bRegBT_Sco==3)
  69188. + {
  69189. + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco ==3 Follow Counter\n"));
  69190. +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff)
  69191. +// {
  69192. +// ServiceTypeCnt = 0;
  69193. +// return FALSE;
  69194. +// }
  69195. +// else
  69196. + {
  69197. + /*
  69198. + Ratio_Tx = BT_Tx*1000/Polling;
  69199. + Ratio_PRI = BT_PRI*1000/Polling;
  69200. +
  69201. + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx;
  69202. + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI;
  69203. +
  69204. + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx));
  69205. + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI));
  69206. +
  69207. + */
  69208. + if((Ratio_Tx <= 50) && (Ratio_PRI <= 50))
  69209. + CurServiceType = BT_Idle;
  69210. + else if((Ratio_PRI > 150) && (Ratio_PRI < 200))
  69211. + CurServiceType = BT_SCO;
  69212. + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200))
  69213. + CurServiceType = BT_Busy;
  69214. + else if(Ratio_Tx >= 350)
  69215. + CurServiceType = BT_OtherBusy;
  69216. + else
  69217. + CurServiceType=BT_OtherAction;
  69218. +
  69219. + }
  69220. +/* if(pHalData->bt_coexist.bStopCount)
  69221. + {
  69222. + ServiceTypeCnt=0;
  69223. + pHalData->bt_coexist.bStopCount=FALSE;
  69224. + }
  69225. +*/
  69226. + if(CurServiceType == BT_OtherBusy)
  69227. + {
  69228. + ServiceTypeCnt=2;
  69229. + LastServiceType=CurServiceType;
  69230. + }
  69231. + else if(CurServiceType == LastServiceType)
  69232. + {
  69233. + if(ServiceTypeCnt<3)
  69234. + ServiceTypeCnt++;
  69235. + }
  69236. + else
  69237. + {
  69238. + ServiceTypeCnt = 0;
  69239. + LastServiceType = CurServiceType;
  69240. + }
  69241. +
  69242. + if(ServiceTypeCnt==2)
  69243. + {
  69244. + pHalData->bt_coexist.BT_Service = LastServiceType;
  69245. + BT_State = BT_State |
  69246. + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) |
  69247. + ((pHalData->bt_coexist.BT_Service==BT_SCO)?0:BIT2);
  69248. +
  69249. + if(pHalData->bt_coexist.BT_Service==BT_Busy)
  69250. + BT_State&= ~(BIT2);
  69251. +
  69252. + if(pHalData->bt_coexist.BT_Service==BT_SCO)
  69253. + {
  69254. + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_SCO\n"));
  69255. + }
  69256. + else if(pHalData->bt_coexist.BT_Service==BT_Idle)
  69257. + {
  69258. + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Idle\n"));
  69259. + }
  69260. + else if(pHalData->bt_coexist.BT_Service==BT_OtherAction)
  69261. + {
  69262. + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherAction\n"));
  69263. + }
  69264. + else if(pHalData->bt_coexist.BT_Service==BT_Busy)
  69265. + {
  69266. + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Busy\n"));
  69267. + }
  69268. + else
  69269. + {
  69270. + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherBusy\n"));
  69271. + }
  69272. +
  69273. + //Add interrupt migration when bt is not in idel state (no traffic).
  69274. + //suggestion by Victor.
  69275. + if(pHalData->bt_coexist.BT_Service!=BT_Idle)
  69276. + {
  69277. +
  69278. + PlatformEFIOWrite2Byte(Adapter, 0x504, 0x0ccc);
  69279. + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x54);
  69280. + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x54);
  69281. +
  69282. + }
  69283. + else
  69284. + {
  69285. + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x00);
  69286. + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x00);
  69287. + }
  69288. +
  69289. + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State);
  69290. + RTPRINT(FBT, BT_TRACE, ("BT_SCO set 0x4fd to %x\n", BT_State));
  69291. + return TRUE;
  69292. + }
  69293. + }
  69294. +
  69295. + return FALSE;
  69296. +
  69297. +}
  69298. +
  69299. +BOOLEAN
  69300. +BT_WifiConnectChange(
  69301. + IN PADAPTER Adapter
  69302. + )
  69303. +{
  69304. + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  69305. + static BOOLEAN bMediaConnect = FALSE;
  69306. +
  69307. + if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo))
  69308. + {
  69309. + bMediaConnect = FALSE;
  69310. + }
  69311. + else
  69312. + {
  69313. + if(!bMediaConnect)
  69314. + {
  69315. + bMediaConnect = TRUE;
  69316. + return TRUE;
  69317. + }
  69318. + bMediaConnect = TRUE;
  69319. + }
  69320. +
  69321. + return FALSE;
  69322. +}
  69323. +
  69324. +BOOLEAN
  69325. +BT_RSSIChangeWithAMPDU(
  69326. + IN PADAPTER Adapter
  69327. + )
  69328. +{
  69329. + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  69330. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69331. +
  69332. + if(!Adapter->pNdisCommon->bRegBT_Ampdu || !Adapter->pNdisCommon->bRegAcceptAddbaReq)
  69333. + return FALSE;
  69334. +
  69335. + RTPRINT(FBT, BT_TRACE, ("RSSI is %d\n",pHalData->UndecoratedSmoothedPWDB));
  69336. +
  69337. + if((pHalData->UndecoratedSmoothedPWDB<=32) && pMgntInfo->pHTInfo->bAcceptAddbaReq)
  69338. + {
  69339. + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32 Need change\n"));
  69340. + return TRUE;
  69341. +
  69342. + }
  69343. + else if((pHalData->UndecoratedSmoothedPWDB>=40) && !pMgntInfo->pHTInfo->bAcceptAddbaReq )
  69344. + {
  69345. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40, Need change\n"));
  69346. + return TRUE;
  69347. + }
  69348. + else
  69349. + return FALSE;
  69350. +
  69351. +}
  69352. +
  69353. +
  69354. +VOID
  69355. +dm_BTCoexist(
  69356. + IN PADAPTER Adapter
  69357. + )
  69358. +{
  69359. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69360. + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
  69361. + static u1Byte LastTxPowerLvl = 0xff;
  69362. + PRX_TS_RECORD pRxTs = NULL;
  69363. +
  69364. + BOOLEAN bWifiConnectChange, bBtStateChange,bRSSIChangeWithAMPDU;
  69365. +
  69366. + if( (pHalData->bt_coexist.BluetoothCoexist) &&
  69367. + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) &&
  69368. + (!ACTING_AS_AP(Adapter)) )
  69369. + {
  69370. + bWifiConnectChange = BT_WifiConnectChange(Adapter);
  69371. + bBtStateChange = BT_BTStateChange(Adapter);
  69372. + bRSSIChangeWithAMPDU = BT_RSSIChangeWithAMPDU(Adapter);
  69373. + RTPRINT(FBT, BT_TRACE, ("bWifiConnectChange %d, bBtStateChange %d,LastTxPowerLvl %x, DynamicTxHighPowerLvl %x\n",
  69374. + bWifiConnectChange,bBtStateChange,LastTxPowerLvl,pHalData->DynamicTxHighPowerLvl));
  69375. + if( bWifiConnectChange ||bBtStateChange ||
  69376. + (LastTxPowerLvl != pHalData->DynamicTxHighPowerLvl) ||bRSSIChangeWithAMPDU)
  69377. + {
  69378. + LastTxPowerLvl = pHalData->DynamicTxHighPowerLvl;
  69379. +
  69380. + if(pHalData->bt_coexist.BT_CUR_State)
  69381. + {
  69382. + // Do not allow receiving A-MPDU aggregation.
  69383. + if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy))
  69384. + {
  69385. + if(pHalData->UndecoratedSmoothedPWDB<=32)
  69386. + {
  69387. + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq)
  69388. + {
  69389. + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n"));
  69390. + pMgntInfo->pHTInfo->bAcceptAddbaReq = FALSE;
  69391. + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE))
  69392. + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR);
  69393. + }
  69394. + }
  69395. + else if(pHalData->UndecoratedSmoothedPWDB>=40)
  69396. + {
  69397. + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq)
  69398. + {
  69399. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n"));
  69400. + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE;
  69401. + }
  69402. + }
  69403. + }
  69404. + else
  69405. + {
  69406. + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq)
  69407. + {
  69408. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n"));
  69409. + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE;
  69410. + }
  69411. + }
  69412. +
  69413. + if(pHalData->bt_coexist.BT_Ant_isolation)
  69414. + {
  69415. + RTPRINT(FBT, BT_TRACE, ("BT_IsolationLow\n"));
  69416. + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n"));
  69417. + Adapter->HalFunc.UpdateHalRATRTableHandler(
  69418. + Adapter,
  69419. + &pMgntInfo->dot11OperationalRateSet,
  69420. + pMgntInfo->dot11HTOperationalRateSet,NULL);
  69421. +
  69422. + if(pHalData->bt_coexist.BT_Service==BT_SCO)
  69423. + {
  69424. +
  69425. + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist with SCO \n"));
  69426. + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14);
  69427. + }
  69428. + else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal)
  69429. + {
  69430. + RTPRINT(FBT, BT_TRACE, ("BT_Turn ON Coexist\n"));
  69431. + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0xb4);
  69432. + }
  69433. + else
  69434. + {
  69435. + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist\n"));
  69436. + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14);
  69437. + }
  69438. + }
  69439. + else
  69440. + {
  69441. + RTPRINT(FBT, BT_TRACE, ("BT_IsolationHigh\n"));
  69442. + // Do nothing.
  69443. + }
  69444. + }
  69445. + else
  69446. + {
  69447. + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq)
  69448. + {
  69449. + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU bt is off\n"));
  69450. + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE;
  69451. + }
  69452. +
  69453. + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n"));
  69454. + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14);
  69455. +
  69456. + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n"));
  69457. + Adapter->HalFunc.UpdateHalRATRTableHandler(
  69458. + Adapter,
  69459. + &pMgntInfo->dot11OperationalRateSet,
  69460. + pMgntInfo->dot11HTOperationalRateSet,NULL);
  69461. + }
  69462. + }
  69463. + }
  69464. +}
  69465. +#endif
  69466. +
  69467. +
  69468. +/*-----------------------------------------------------------------------------
  69469. + * Function: dm_CheckRfCtrlGPIO()
  69470. + *
  69471. + * Overview: Copy 8187B template for 9xseries.
  69472. + *
  69473. + * Input: NONE
  69474. + *
  69475. + * Output: NONE
  69476. + *
  69477. + * Return: NONE
  69478. + *
  69479. + * Revised History:
  69480. + * When Who Remark
  69481. + * 01/10/2008 MHC Create Version 0.
  69482. + *
  69483. + *---------------------------------------------------------------------------*/
  69484. +static VOID
  69485. +dm_CheckRfCtrlGPIO(
  69486. + IN PADAPTER Adapter
  69487. + )
  69488. +{
  69489. +#if 0
  69490. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69491. +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI)
  69492. + #ifdef CONFIG_USB_HCI
  69493. + // 2010/08/12 MH Add for CU selective suspend.
  69494. + PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter);
  69495. + #else
  69496. + PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter);
  69497. + #endif
  69498. +#endif
  69499. +
  69500. + if(!Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)
  69501. + return;
  69502. +
  69503. + RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));
  69504. +
  69505. +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI)
  69506. + // Walk around for DTM test, we will not enable HW - radio on/off because r/w
  69507. + // page 1 register before Lextra bus is enabled cause system fails when resuming
  69508. + // from S4. 20080218, Emily
  69509. + if(Adapter->bInHctTest)
  69510. + return;
  69511. +
  69512. +//#if ((HAL_CODE_BASE == RTL8192_S) )
  69513. + //Adapter->HalFunc.GPIOChangeRFHandler(Adapter, GPIORF_POLLING);
  69514. +//#else
  69515. + // 2010/07/27 MH Only Minicard and support selective suspend, we can not turn off all MAC power to
  69516. + // stop 8051. For dongle and minicard, we both support selective suspend mode.
  69517. + //if(pDevice->RegUsbSS && Adapter->HalFunc.GetInterfaceSelectionHandler(Adapter) == INTF_SEL2_MINICARD)
  69518. +
  69519. + //
  69520. + // 2010/08/12 MH We support severl power consumption combination as below.
  69521. + //
  69522. + // Power consumption combination
  69523. + // SS Enable: (LPS disable + IPS + SW/HW radio off)
  69524. + // 1. Dongle + PDN (support HW radio off)
  69525. + // 2. Dongle + Normal (No HW radio off)
  69526. + // 3. MiniCard + PDN (support HW radio off)
  69527. + // 4. MiniCard + Normal (support HW radio off)
  69528. + //
  69529. + // SS Disable: (LPS + IPS + SW/HW radio off)
  69530. + // 1. Dongle + PDN (support HW radio off)
  69531. + // 2. Dongle + Normal (No HW radio off)
  69532. + // 3. MiniCard + PDN (support HW radio off)
  69533. + // 4. MiniCard + Normal (support HW radio off)
  69534. + //
  69535. + // For Power down module detection. We need to read power register no matter
  69536. + // dongle or minicard, we will add the item is the detection method.
  69537. + //
  69538. + //
  69539. + //vivi add du case
  69540. + if ((IS_HARDWARE_TYPE_8192CU(Adapter)||IS_HARDWARE_TYPE_8192DU(Adapter))
  69541. + && pDevice->RegUsbSS)
  69542. + {
  69543. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Enabled\n"));
  69544. + if (SUPPORT_HW_RADIO_DETECT(Adapter))
  69545. + { // Support HW radio detection
  69546. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n"));
  69547. + GpioDetectTimerStart(Adapter);
  69548. + }
  69549. + else
  69550. + { // Dongle does not support HW radio detection.?? In the fufure??
  69551. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n"));
  69552. + }
  69553. + }
  69554. + else if (IS_HARDWARE_TYPE_8192CU(Adapter) ||
  69555. + IS_HARDWARE_TYPE_8723AU(Adapter)||
  69556. + IS_HARDWARE_TYPE_8192DU(Adapter) ||
  69557. + IS_HARDWARE_TYPE_8723AS(Adapter))
  69558. + { // Not support Selective suspend
  69559. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Disable\n"));
  69560. + if (SUPPORT_HW_RADIO_DETECT(Adapter))
  69561. + {
  69562. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n"));
  69563. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) );
  69564. + }
  69565. + else
  69566. + {
  69567. + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n"));
  69568. + }
  69569. + }
  69570. + else
  69571. + { // CE only support noemal HW radio detection now. Support timers GPIO detection in SE/CU.
  69572. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) );
  69573. + }
  69574. +//#endif
  69575. +#else if defined CONFIG_PCI_HCI
  69576. + if(Adapter->bInHctTest)
  69577. + return;
  69578. +
  69579. + // CE only support noemal HW radio detection now. We support timers GPIO detection in SE.
  69580. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) );
  69581. +#endif
  69582. +#endif
  69583. +} /* dm_CheckRfCtrlGPIO */
  69584. +
  69585. +static VOID
  69586. +dm_InitRateAdaptiveMask(
  69587. + IN PADAPTER Adapter
  69588. + )
  69589. +{
  69590. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69591. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  69592. + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pdmpriv->RateAdaptive;
  69593. +
  69594. + pRA->RATRState = DM_RATR_STA_INIT;
  69595. + pRA->PreRATRState = DM_RATR_STA_INIT;
  69596. +
  69597. + if (pdmpriv->DM_Type == DM_Type_ByDriver)
  69598. + pdmpriv->bUseRAMask = _TRUE;
  69599. + else
  69600. + pdmpriv->bUseRAMask = _FALSE;
  69601. +}
  69602. +
  69603. +/*-----------------------------------------------------------------------------
  69604. + * Function: dm_RefreshRateAdaptiveMask()
  69605. + *
  69606. + * Overview: Update rate table mask according to rssi
  69607. + *
  69608. + * Input: NONE
  69609. + *
  69610. + * Output: NONE
  69611. + *
  69612. + * Return: NONE
  69613. + *
  69614. + * Revised History:
  69615. + * When Who Remark
  69616. + * 05/27/2009 hpfan Create Version 0.
  69617. + *
  69618. + *---------------------------------------------------------------------------*/
  69619. +static VOID
  69620. +dm_RefreshRateAdaptiveMask( IN PADAPTER pAdapter)
  69621. +{
  69622. +#if 0
  69623. + PADAPTER pTargetAdapter;
  69624. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  69625. + PMGNT_INFO pMgntInfo = &(ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, TRUE)->MgntInfo);
  69626. + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive;
  69627. + u4Byte LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
  69628. +
  69629. + if(pAdapter->bDriverStopped)
  69630. + {
  69631. + RT_TRACE(COMP_RATR, DBG_TRACE, ("<---- dm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
  69632. + return;
  69633. + }
  69634. +
  69635. + if(!pMgntInfo->bUseRAMask)
  69636. + {
  69637. + RT_TRACE(COMP_RATR, DBG_LOUD, ("<---- dm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
  69638. + return;
  69639. + }
  69640. +
  69641. + // if default port is connected, update RA table for default port (infrastructure mode only)
  69642. + if(pAdapter->MgntInfo.mAssoc && (!ACTING_AS_AP(pAdapter)))
  69643. + {
  69644. +
  69645. + // decide rastate according to rssi
  69646. + switch (pRA->PreRATRState)
  69647. + {
  69648. + case DM_RATR_STA_HIGH:
  69649. + HighRSSIThreshForRA = 50;
  69650. + LowRSSIThreshForRA = 20;
  69651. + break;
  69652. +
  69653. + case DM_RATR_STA_MIDDLE:
  69654. + HighRSSIThreshForRA = 55;
  69655. + LowRSSIThreshForRA = 20;
  69656. + break;
  69657. +
  69658. + case DM_RATR_STA_LOW:
  69659. + HighRSSIThreshForRA = 50;
  69660. + LowRSSIThreshForRA = 25;
  69661. + break;
  69662. +
  69663. + default:
  69664. + HighRSSIThreshForRA = 50;
  69665. + LowRSSIThreshForRA = 20;
  69666. + break;
  69667. + }
  69668. +
  69669. + if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA)
  69670. + pRA->RATRState = DM_RATR_STA_HIGH;
  69671. + else if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA)
  69672. + pRA->RATRState = DM_RATR_STA_MIDDLE;
  69673. + else
  69674. + pRA->RATRState = DM_RATR_STA_LOW;
  69675. +
  69676. + if(pRA->PreRATRState != pRA->RATRState)
  69677. + {
  69678. + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
  69679. + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pHalData->UndecoratedSmoothedPWDB));
  69680. + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pRA->RATRState));
  69681. + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pRA->PreRATRState, pRA->RATRState));
  69682. + pAdapter->HalFunc.UpdateHalRAMaskHandler(
  69683. + pAdapter,
  69684. + FALSE,
  69685. + 0,
  69686. + NULL,
  69687. + NULL,
  69688. + pRA->RATRState);
  69689. + pRA->PreRATRState = pRA->RATRState;
  69690. + }
  69691. + }
  69692. +
  69693. + //
  69694. + // The following part configure AP/VWifi/IBSS rate adaptive mask.
  69695. + //
  69696. + if(ACTING_AS_AP(pAdapter) || ACTING_AS_IBSS(pAdapter))
  69697. + {
  69698. + pTargetAdapter = pAdapter;
  69699. + }
  69700. + else
  69701. + {
  69702. + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, FALSE);
  69703. + if(!ACTING_AS_AP(pTargetAdapter))
  69704. + pTargetAdapter = NULL;
  69705. + }
  69706. +
  69707. + // if extension port (softap) is started, updaet RA table for more than one clients associate
  69708. + if(pTargetAdapter != NULL)
  69709. + {
  69710. + int i;
  69711. + PRT_WLAN_STA pEntry;
  69712. + PRATE_ADAPTIVE pEntryRA;
  69713. +
  69714. + for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++)
  69715. + {
  69716. + if( pTargetAdapter->MgntInfo.AsocEntry[i].bUsed && pTargetAdapter->MgntInfo.AsocEntry[i].bAssociated)
  69717. + {
  69718. + pEntry = pTargetAdapter->MgntInfo.AsocEntry+i;
  69719. + pEntryRA = &pEntry->RateAdaptive;
  69720. +
  69721. + switch (pEntryRA->PreRATRState)
  69722. + {
  69723. + case DM_RATR_STA_HIGH:
  69724. + {
  69725. + HighRSSIThreshForRA = 50;
  69726. + LowRSSIThreshForRA = 20;
  69727. + }
  69728. + break;
  69729. +
  69730. + case DM_RATR_STA_MIDDLE:
  69731. + {
  69732. + HighRSSIThreshForRA = 55;
  69733. + LowRSSIThreshForRA = 20;
  69734. + }
  69735. + break;
  69736. +
  69737. + case DM_RATR_STA_LOW:
  69738. + {
  69739. + HighRSSIThreshForRA = 50;
  69740. + LowRSSIThreshForRA = 25;
  69741. + }
  69742. + break;
  69743. +
  69744. + default:
  69745. + {
  69746. + HighRSSIThreshForRA = 50;
  69747. + LowRSSIThreshForRA = 20;
  69748. + }
  69749. + }
  69750. +
  69751. + if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA)
  69752. + pEntryRA->RATRState = DM_RATR_STA_HIGH;
  69753. + else if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA)
  69754. + pEntryRA->RATRState = DM_RATR_STA_MIDDLE;
  69755. + else
  69756. + pEntryRA->RATRState = DM_RATR_STA_LOW;
  69757. +
  69758. + if(pEntryRA->PreRATRState != pEntryRA->RATRState)
  69759. + {
  69760. + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("AsocEntry addr : "), pEntry->MacAddr);
  69761. + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB));
  69762. + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pEntryRA->RATRState));
  69763. + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pEntryRA->PreRATRState, pEntryRA->RATRState));
  69764. + pAdapter->HalFunc.UpdateHalRAMaskHandler(
  69765. + pTargetAdapter,
  69766. + FALSE,
  69767. + pEntry->AID+1,
  69768. + pEntry->MacAddr,
  69769. + pEntry,
  69770. + pEntryRA->RATRState);
  69771. + pEntryRA->PreRATRState = pEntryRA->RATRState;
  69772. + }
  69773. +
  69774. + }
  69775. + }
  69776. + }
  69777. +#endif
  69778. +}
  69779. +
  69780. +static VOID
  69781. +dm_CheckProtection(
  69782. + IN PADAPTER Adapter
  69783. + )
  69784. +{
  69785. +#if 0
  69786. + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  69787. + u1Byte CurRate, RateThreshold;
  69788. +
  69789. + if(pMgntInfo->pHTInfo->bCurBW40MHz)
  69790. + RateThreshold = MGN_MCS1;
  69791. + else
  69792. + RateThreshold = MGN_MCS3;
  69793. +
  69794. + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)
  69795. + {
  69796. + pMgntInfo->bDmDisableProtect = TRUE;
  69797. + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
  69798. + }
  69799. + else
  69800. + {
  69801. + pMgntInfo->bDmDisableProtect = FALSE;
  69802. + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
  69803. + }
  69804. +#endif
  69805. +}
  69806. +
  69807. +static VOID
  69808. +dm_CheckStatistics(
  69809. + IN PADAPTER Adapter
  69810. + )
  69811. +{
  69812. +#if 0
  69813. + if(!Adapter->MgntInfo.bMediaConnect)
  69814. + return;
  69815. +
  69816. + //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly.
  69817. + rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) );
  69818. +
  69819. + // Calculate current Tx Rate(Successful transmited!!)
  69820. +
  69821. + // Calculate current Rx Rate(Successful received!!)
  69822. +
  69823. + //for tx tx retry count
  69824. + rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );
  69825. +#endif
  69826. +}
  69827. +
  69828. +static void dm_CheckPbcGPIO(_adapter *padapter)
  69829. +{
  69830. + u8 tmp1byte;
  69831. + u8 bPbcPressed = _FALSE;
  69832. + int i=0;
  69833. +
  69834. + if(!padapter->registrypriv.hw_wps_pbc)
  69835. + return;
  69836. +
  69837. + do
  69838. + {
  69839. + i++;
  69840. +#ifdef CONFIG_USB_HCI
  69841. + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);
  69842. + tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT);
  69843. + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode
  69844. +
  69845. + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);
  69846. + rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level
  69847. +
  69848. + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);
  69849. + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);
  69850. + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode
  69851. +
  69852. + tmp1byte =rtw_read8(padapter, GPIO_IN);
  69853. +
  69854. + if (tmp1byte == 0xff)
  69855. + {
  69856. + bPbcPressed = _FALSE;
  69857. + break ;
  69858. + }
  69859. +
  69860. + if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)
  69861. + {
  69862. + bPbcPressed = _TRUE;
  69863. +
  69864. + if(i<=3)
  69865. + rtw_msleep_os(50);
  69866. + }
  69867. +#else
  69868. + tmp1byte = rtw_read8(padapter, GPIO_IN);
  69869. + //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte));
  69870. +
  69871. + if (tmp1byte == 0xff || padapter->init_adpt_in_progress)
  69872. + {
  69873. + bPbcPressed = _FALSE;
  69874. + break ;
  69875. + }
  69876. +
  69877. + if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0)
  69878. + {
  69879. + bPbcPressed = _TRUE;
  69880. +
  69881. + if(i<=3)
  69882. + rtw_msleep_os(50);
  69883. + }
  69884. +#endif
  69885. +
  69886. + }while(i<=3 && bPbcPressed == _TRUE);
  69887. +
  69888. + if( _TRUE == bPbcPressed)
  69889. + {
  69890. + // Here we only set bPbcPressed to true
  69891. + // After trigger PBC, the variable will be set to false
  69892. + DBG_8192C("CheckPbcGPIO - PBC is pressed, try_cnt=%d\n", i-1);
  69893. +
  69894. +#ifdef RTK_DMP_PLATFORM
  69895. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))
  69896. + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC);
  69897. +#else
  69898. + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC);
  69899. +#endif
  69900. +#else
  69901. +
  69902. + if ( padapter->pid[0] == 0 )
  69903. + { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver.
  69904. + return;
  69905. + }
  69906. +
  69907. +#ifdef PLATFORM_LINUX
  69908. + rtw_signal_process(padapter->pid[0], SIGUSR1);
  69909. +#endif
  69910. +#endif
  69911. + }
  69912. +}
  69913. +
  69914. +#ifdef CONFIG_PCI_HCI
  69915. +//
  69916. +// Description:
  69917. +// Perform interrupt migration dynamically to reduce CPU utilization.
  69918. +//
  69919. +// Assumption:
  69920. +// 1. Do not enable migration under WIFI test.
  69921. +//
  69922. +// Created by Roger, 2010.03.05.
  69923. +//
  69924. +VOID
  69925. +dm_InterruptMigration(
  69926. + IN PADAPTER Adapter
  69927. + )
  69928. +{
  69929. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  69930. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  69931. + BOOLEAN bCurrentIntMt, bCurrentACIntDisable;
  69932. + BOOLEAN IntMtToSet = _FALSE;
  69933. + BOOLEAN ACIntToSet = _FALSE;
  69934. +
  69935. +
  69936. + // Retrieve current interrupt migration and Tx four ACs IMR settings first.
  69937. + bCurrentIntMt = pHalData->bInterruptMigration;
  69938. + bCurrentACIntDisable = pHalData->bDisableTxInt;
  69939. +
  69940. + //
  69941. + // <Roger_Notes> Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics
  69942. + // when interrupt migration is set before. 2010.03.05.
  69943. + //
  69944. + if(!Adapter->registrypriv.wifi_spec &&
  69945. + (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&
  69946. + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic)
  69947. + {
  69948. + IntMtToSet = _TRUE;
  69949. +
  69950. + // To check whether we should disable Tx interrupt or not.
  69951. + if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic )
  69952. + ACIntToSet = _TRUE;
  69953. + }
  69954. +
  69955. + //Update current settings.
  69956. + if( bCurrentIntMt != IntMtToSet ){
  69957. + DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet);
  69958. + if(IntMtToSet)
  69959. + {
  69960. + //
  69961. + // <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.
  69962. + // timer 25ns*0xfa0=100us for 0xf packets.
  69963. + // 2010.03.05.
  69964. + //
  69965. + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx
  69966. + pHalData->bInterruptMigration = IntMtToSet;
  69967. + }
  69968. + else
  69969. + {
  69970. + // Reset all interrupt migration settings.
  69971. + rtw_write32(Adapter, REG_INT_MIG, 0);
  69972. + pHalData->bInterruptMigration = IntMtToSet;
  69973. + }
  69974. + }
  69975. +
  69976. + /*if( bCurrentACIntDisable != ACIntToSet ){
  69977. + DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet);
  69978. + if(ACIntToSet) // Disable four ACs interrupts.
  69979. + {
  69980. + //
  69981. + // <Roger_Notes> Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization.
  69982. + // When extremely highly Rx OK occurs, we will disable Tx interrupts.
  69983. + // 2010.03.05.
  69984. + //
  69985. + UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );
  69986. + pHalData->bDisableTxInt = ACIntToSet;
  69987. + }
  69988. + else// Enable four ACs interrupts.
  69989. + {
  69990. + UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );
  69991. + pHalData->bDisableTxInt = ACIntToSet;
  69992. + }
  69993. + }*/
  69994. +
  69995. +}
  69996. +
  69997. +#endif
  69998. +
  69999. +//
  70000. +// Initialize GPIO setting registers
  70001. +//
  70002. +static void
  70003. +dm_InitGPIOSetting(
  70004. + IN PADAPTER Adapter
  70005. + )
  70006. +{
  70007. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  70008. +
  70009. + u8 tmp1byte;
  70010. +
  70011. + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);
  70012. + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);
  70013. +
  70014. +#ifdef CONFIG_BT_COEXIST
  70015. + // UMB-B cut bug. We need to support the modification.
  70016. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) &&
  70017. + pHalData->bt_coexist.BT_Coexist)
  70018. + {
  70019. + tmp1byte |= (BIT5);
  70020. + }
  70021. +#endif
  70022. + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);
  70023. +
  70024. +}
  70025. +
  70026. +static void update_EDCA_param(_adapter *padapter)
  70027. +{
  70028. + u32 trafficIndex;
  70029. + u32 edca_param;
  70030. + u64 cur_tx_bytes = 0;
  70031. + u64 cur_rx_bytes = 0;
  70032. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
  70033. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70034. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  70035. + struct recv_priv *precvpriv = &(padapter->recvpriv);
  70036. + struct registry_priv *pregpriv = &padapter->registrypriv;
  70037. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  70038. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  70039. +
  70040. +#ifdef CONFIG_BT_COEXIST
  70041. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  70042. + u8 bbtchange = _FALSE;
  70043. +#endif
  70044. +
  70045. +
  70046. + //DBG_871X("%s\n", __FUNCTION__);
  70047. +
  70048. + //associated AP
  70049. + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0))
  70050. + {
  70051. + return;
  70052. + }
  70053. +
  70054. + if (pmlmeinfo->assoc_AP_vendor >= maxAP)
  70055. + {
  70056. + return;
  70057. + }
  70058. +
  70059. + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes;
  70060. + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes;
  70061. +
  70062. + //traffic, TX or RX
  70063. + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP))
  70064. + {
  70065. + if (cur_tx_bytes > (cur_rx_bytes << 2))
  70066. + { // Uplink TP is present.
  70067. + trafficIndex = UP_LINK;
  70068. + }
  70069. + else
  70070. + { // Balance TP is present.
  70071. + trafficIndex = DOWN_LINK;
  70072. + }
  70073. + }
  70074. + else
  70075. + {
  70076. + if (cur_rx_bytes > (cur_tx_bytes << 2))
  70077. + { // Downlink TP is present.
  70078. + trafficIndex = DOWN_LINK;
  70079. + }
  70080. + else
  70081. + { // Balance TP is present.
  70082. + trafficIndex = UP_LINK;
  70083. + }
  70084. + }
  70085. +
  70086. +#ifdef CONFIG_BT_COEXIST
  70087. + if(pbtpriv->BT_Coexist)
  70088. + {
  70089. + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
  70090. + {
  70091. + bbtchange = _TRUE;
  70092. + }
  70093. + }
  70094. +#endif
  70095. +
  70096. + if (pdmpriv->prv_traffic_idx != trafficIndex)
  70097. + {
  70098. +#if 0
  70099. +#ifdef CONFIG_BT_COEXIST
  70100. + if(_TRUE == bbtchange)
  70101. + rtw_write32(padapter, REG_EDCA_BE_PARAM, pbtpriv->BT_EDCA[trafficIndex]);
  70102. + else
  70103. +#endif
  70104. + //adjust EDCA parameter for BE queue
  70105. + //fire_write_MAC_cmd(padapter, EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]);
  70106. + rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]);
  70107. +
  70108. +#else
  70109. + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N))
  70110. + {
  70111. + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
  70112. + }
  70113. + else if((pmlmeinfo->assoc_AP_vendor == airgocapAP) &&
  70114. + ((pmlmeext->cur_wireless_mode == WIRELESS_11G) ||(pmlmeext->cur_wireless_mode == WIRELESS_11BG)))
  70115. + {
  70116. + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
  70117. + }
  70118. + else
  70119. + {
  70120. + edca_param = EDCAParam[unknownAP][trafficIndex];
  70121. + }
  70122. +
  70123. +#ifdef CONFIG_BT_COEXIST
  70124. + if(_TRUE == bbtchange)
  70125. + edca_param = pbtpriv->BT_EDCA[trafficIndex];
  70126. +#endif
  70127. +
  70128. + rtw_write32(padapter, REG_EDCA_BE_PARAM, edca_param);
  70129. +#endif
  70130. + pdmpriv->prv_traffic_idx = trafficIndex;
  70131. + }
  70132. +
  70133. +//exit_update_EDCA_param:
  70134. +
  70135. + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
  70136. + precvpriv->last_rx_bytes = precvpriv->rx_bytes;
  70137. +
  70138. + return;
  70139. +}
  70140. +
  70141. +static void dm_InitDynamicBBPowerSaving(
  70142. + IN PADAPTER Adapter
  70143. + )
  70144. +{
  70145. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70146. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70147. + PS_T *pPSTable = &pdmpriv->DM_PSTable;
  70148. +
  70149. + pPSTable->PreCCAState = CCA_MAX;
  70150. + pPSTable->CurCCAState = CCA_MAX;
  70151. + pPSTable->PreRFState = RF_MAX;
  70152. + pPSTable->CurRFState = RF_MAX;
  70153. + pPSTable->Rssi_val_min = 0;
  70154. +}
  70155. +
  70156. +static void dm_1R_CCA(
  70157. + IN PADAPTER pAdapter)
  70158. +{
  70159. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  70160. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70161. + PS_T *pPSTable = &pdmpriv->DM_PSTable;
  70162. +
  70163. + if(pPSTable->Rssi_val_min != 0)
  70164. + {
  70165. + if(pPSTable->PreCCAState == CCA_2R)
  70166. + {
  70167. + if(pPSTable->Rssi_val_min >= 35)
  70168. + pPSTable->CurCCAState = CCA_1R;
  70169. + else
  70170. + pPSTable->CurCCAState = CCA_2R;
  70171. + }
  70172. + else{
  70173. + if(pPSTable->Rssi_val_min <= 30)
  70174. + pPSTable->CurCCAState = CCA_2R;
  70175. + else
  70176. + pPSTable->CurCCAState = CCA_1R;
  70177. + }
  70178. + }
  70179. + else
  70180. + pPSTable->CurCCAState=CCA_MAX;
  70181. +
  70182. + if(pPSTable->PreCCAState != pPSTable->CurCCAState)
  70183. + {
  70184. + if(pPSTable->CurCCAState == CCA_1R)
  70185. + {
  70186. + if(pHalData->rf_type == RF_2T2R)
  70187. + {
  70188. + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x13);
  70189. + PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
  70190. + }
  70191. + else
  70192. + {
  70193. + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x23);
  70194. + PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
  70195. + }
  70196. + }
  70197. + else
  70198. + {
  70199. + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x33);
  70200. + PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
  70201. + }
  70202. + pPSTable->PreCCAState = pPSTable->CurCCAState;
  70203. + }
  70204. + //DBG_8192C("dm_1R_CCA(): CCAStage=%x\n", pPSTable->CurCCAState);
  70205. +}
  70206. +
  70207. +void
  70208. +rtl8192c_dm_RF_Saving(
  70209. + IN PADAPTER pAdapter,
  70210. + IN u8 bForceInNormal
  70211. + )
  70212. +{
  70213. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  70214. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70215. + PS_T *pPSTable = &pdmpriv->DM_PSTable;
  70216. +
  70217. + if(pdmpriv->initialize == 0){
  70218. + pdmpriv->rf_saving_Reg874 = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord)&0x1CC000)>>14;
  70219. + pdmpriv->rf_saving_RegC70 = (PHY_QueryBBReg(pAdapter, rOFDM0_AGCParameter1, bMaskDWord)&BIT3)>>3;
  70220. + pdmpriv->rf_saving_Reg85C = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_SwitchControl, bMaskDWord)&0xFF000000)>>24;
  70221. + pdmpriv->rf_saving_RegA74 = (PHY_QueryBBReg(pAdapter, 0xa74, bMaskDWord)&0xF000)>>12;
  70222. + //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
  70223. + pdmpriv->initialize = 1;
  70224. + }
  70225. +
  70226. + if(!bForceInNormal)
  70227. + {
  70228. + if(pPSTable->Rssi_val_min != 0)
  70229. + {
  70230. +
  70231. + if(pPSTable->PreRFState == RF_Normal)
  70232. + {
  70233. + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
  70234. + if(pPSTable->Rssi_val_min >= 50)
  70235. + #else
  70236. + if(pPSTable->Rssi_val_min >= 30)
  70237. + #endif
  70238. + pPSTable->CurRFState = RF_Save;
  70239. + else
  70240. + pPSTable->CurRFState = RF_Normal;
  70241. + }
  70242. + else{
  70243. + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
  70244. + if(pPSTable->Rssi_val_min <= 45)
  70245. + #else
  70246. + if(pPSTable->Rssi_val_min <= 25)
  70247. + #endif
  70248. + pPSTable->CurRFState = RF_Normal;
  70249. + else
  70250. + pPSTable->CurRFState = RF_Save;
  70251. + }
  70252. + }
  70253. + else
  70254. + pPSTable->CurRFState=RF_MAX;
  70255. + }
  70256. + else
  70257. + {
  70258. + pPSTable->CurRFState = RF_Normal;
  70259. + }
  70260. +
  70261. + if(pPSTable->PreRFState != pPSTable->CurRFState)
  70262. + {
  70263. + if(pPSTable->CurRFState == RF_Save)
  70264. + {
  70265. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
  70266. + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, 0); //RegC70[3]=1'b0
  70267. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
  70268. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, 0xC000, 0x2); //Reg874[15:14]=2'b10
  70269. + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
  70270. + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
  70271. + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
  70272. + DBG_8192C("%s(): RF_Save\n", __FUNCTION__);
  70273. + }
  70274. + else
  70275. + {
  70276. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1CC000, pdmpriv->rf_saving_Reg874);
  70277. + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, pdmpriv->rf_saving_RegC70);
  70278. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, pdmpriv->rf_saving_Reg85C);
  70279. + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, pdmpriv->rf_saving_RegA74);
  70280. + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0);
  70281. + DBG_8192C("%s(): RF_Normal\n", __FUNCTION__);
  70282. + }
  70283. + pPSTable->PreRFState = pPSTable->CurRFState;
  70284. + }
  70285. +}
  70286. +
  70287. +static void
  70288. +dm_DynamicBBPowerSaving(
  70289. +IN PADAPTER pAdapter
  70290. + )
  70291. +{
  70292. +
  70293. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  70294. + struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv;
  70295. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70296. + PS_T *pPSTable = &pdmpriv->DM_PSTable;
  70297. +
  70298. + //1 1.Determine the minimum RSSI
  70299. + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
  70300. + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
  70301. + {
  70302. + pPSTable->Rssi_val_min = 0;
  70303. + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
  70304. + }
  70305. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
  70306. + {
  70307. + //if(ACTING_AS_AP(pAdapter) || pMgntInfo->mIbss)
  70308. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
  70309. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) //todo: AP Mode
  70310. + {
  70311. + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  70312. + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%lx \n", pPSTable->Rssi_val_min));
  70313. + }
  70314. + else
  70315. + {
  70316. + pPSTable->Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB;
  70317. + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min));
  70318. + }
  70319. + }
  70320. + else // associated entry pwdb
  70321. + {
  70322. + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
  70323. + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min));
  70324. + }
  70325. +
  70326. + //1 2.Power Saving for 92C
  70327. + if(IS_92C_SERIAL(pHalData->VersionID))
  70328. + {
  70329. + //dm_1R_CCA(pAdapter);
  70330. + }
  70331. +
  70332. + // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
  70333. + // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns to 600ns.
  70334. + //1 3.Power Saving for 88C
  70335. + else
  70336. + {
  70337. + rtl8192c_dm_RF_Saving(pAdapter, _FALSE);
  70338. + }
  70339. +}
  70340. +
  70341. +
  70342. +#ifdef CONFIG_ANTENNA_DIVERSITY
  70343. +// Add new function to reset the state of antenna diversity before link.
  70344. +//
  70345. +void SwAntDivResetBeforeLink8192C(IN PADAPTER Adapter)
  70346. +{
  70347. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70348. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70349. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70350. +
  70351. + pDM_SWAT_Table->SWAS_NoLink_State = 0;
  70352. +}
  70353. +
  70354. +// Compare RSSI for deciding antenna
  70355. +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)
  70356. +{
  70357. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70358. +
  70359. + if((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) )
  70360. + {
  70361. + //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi),
  70362. + // src->Rssi,query_rx_pwr_percentage(src->Rssi));
  70363. + //select optimum_antenna for before linked =>For antenna diversity
  70364. + if(dst->Rssi >= src->Rssi )//keep org parameter
  70365. + {
  70366. + src->Rssi = dst->Rssi;
  70367. + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna;
  70368. + }
  70369. + }
  70370. +}
  70371. +
  70372. +// Add new function to reset the state of antenna diversity before link.
  70373. +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter)
  70374. +{
  70375. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70376. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70377. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70378. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  70379. +
  70380. + // Condition that does not need to use antenna diversity.
  70381. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))
  70382. + {
  70383. + //DBG_8192C("SwAntDivBeforeLink8192C(): No AntDiv Mechanism.\n");
  70384. + return _FALSE;
  70385. + }
  70386. +
  70387. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  70388. + {
  70389. + pDM_SWAT_Table->SWAS_NoLink_State = 0;
  70390. + return _FALSE;
  70391. + }
  70392. + // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
  70393. +/*
  70394. + if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
  70395. + {
  70396. +
  70397. +
  70398. + RT_TRACE(COMP_SWAS, DBG_LOUD,
  70399. + ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
  70400. + pMgntInfo->RFChangeInProgress,
  70401. + pHalData->eRFPowerState));
  70402. +
  70403. + pDM_SWAT_Table->SWAS_NoLink_State = 0;
  70404. +
  70405. + return FALSE;
  70406. + }
  70407. +*/
  70408. +
  70409. + if(pDM_SWAT_Table->SWAS_NoLink_State == 0){
  70410. + //switch channel
  70411. + pDM_SWAT_Table->SWAS_NoLink_State = 1;
  70412. + pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
  70413. +
  70414. + //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna);
  70415. + rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE);
  70416. + //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B");
  70417. + return _TRUE;
  70418. + }
  70419. + else
  70420. + {
  70421. + pDM_SWAT_Table->SWAS_NoLink_State = 0;
  70422. + return _FALSE;
  70423. + }
  70424. +
  70425. +
  70426. +
  70427. +}
  70428. +#endif
  70429. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  70430. +//
  70431. +// 20100514 Luke/Joseph:
  70432. +// Add new function to reset antenna diversity state after link.
  70433. +//
  70434. +void
  70435. +SwAntDivRestAfterLink8192C(
  70436. + IN PADAPTER Adapter
  70437. + )
  70438. +{
  70439. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70440. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70441. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70442. +
  70443. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))
  70444. + return;
  70445. +
  70446. + //DBG_8192C("======> SwAntDivRestAfterLink <========== \n");
  70447. + pHalData->RSSI_cnt_A= 0;
  70448. + pHalData->RSSI_cnt_B= 0;
  70449. + pHalData->RSSI_test = _FALSE;
  70450. +
  70451. + pDM_SWAT_Table->try_flag = 0xff;
  70452. + pDM_SWAT_Table->RSSI_Trying = 0;
  70453. + pDM_SWAT_Table->SelectAntennaMap=0xAA;
  70454. + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna;
  70455. + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna;
  70456. +
  70457. + pdmpriv->lastTxOkCnt=0;
  70458. + pdmpriv->lastRxOkCnt=0;
  70459. +
  70460. + pdmpriv->TXByteCnt_A=0;
  70461. + pdmpriv->TXByteCnt_B=0;
  70462. + pdmpriv->RXByteCnt_A=0;
  70463. + pdmpriv->RXByteCnt_B=0;
  70464. + pdmpriv->DoubleComfirm=0;
  70465. + pdmpriv->TrafficLoad = TRAFFIC_LOW;
  70466. +
  70467. +}
  70468. +
  70469. +
  70470. +//
  70471. +// 20100514 Luke/Joseph:
  70472. +// Add new function for antenna diversity after link.
  70473. +// This is the main function of antenna diversity after link.
  70474. +// This function is called in HalDmWatchDog() and dm_SW_AntennaSwitchCallback().
  70475. +// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
  70476. +// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
  70477. +// After 500ms, dm_SW_AntennaSwitchCallback() calls this function to compare the signal just
  70478. +// listened on the air with the RSSI of original antenna.
  70479. +// It chooses the antenna with better RSSI.
  70480. +// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
  70481. +// penalty to get next try.
  70482. +//
  70483. +static VOID
  70484. +dm_SW_AntennaSwitch(
  70485. + PADAPTER Adapter,
  70486. + u8 Step
  70487. +)
  70488. +{
  70489. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70490. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70491. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70492. + s32 curRSSI=100, RSSI_A, RSSI_B;
  70493. + u64 curTxOkCnt, curRxOkCnt;
  70494. + u64 CurByteCnt = 0, PreByteCnt = 0;
  70495. + u8 nextAntenna = 0;
  70496. + u8 Score_A=0, Score_B=0;
  70497. + u8 i;
  70498. +
  70499. + // Condition that does not need to use antenna diversity.
  70500. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))
  70501. + {
  70502. + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No AntDiv Mechanism.\n"));
  70503. + return;
  70504. + }
  70505. + // If dynamic ant_div is disabled.
  70506. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_ANT_DIV) )
  70507. + {
  70508. + return;
  70509. + }
  70510. +
  70511. + if (check_fwstate(&Adapter->mlmepriv, _FW_LINKED) ==_FALSE)
  70512. + return;
  70513. +#if 0 //to do
  70514. + // Radio off: Status reset to default and return.
  70515. + if(pHalData->eRFPowerState==eRfOff)
  70516. + {
  70517. + SwAntDivRestAfterLink(Adapter);
  70518. + return;
  70519. + }
  70520. +#endif
  70521. + //DBG_8192C("\n............................ %s.........................\n",__FUNCTION__);
  70522. + // Handling step mismatch condition.
  70523. + // Peak step is not finished at last time. Recover the variable and check again.
  70524. + if( Step != pDM_SWAT_Table->try_flag )
  70525. + {
  70526. + SwAntDivRestAfterLink8192C(Adapter);
  70527. + }
  70528. +
  70529. +
  70530. + if(pDM_SWAT_Table->try_flag == 0xff)
  70531. + {
  70532. +#if 0
  70533. + // Select RSSI checking target
  70534. + if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
  70535. + {
  70536. + // Target: Infrastructure mode AP.
  70537. + pHalData->RSSI_target = NULL;
  70538. + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is DEF AP!\n"));
  70539. + }
  70540. + else
  70541. + {
  70542. + u8 index = 0;
  70543. + PRT_WLAN_STA pEntry = NULL;
  70544. + PADAPTER pTargetAdapter = NULL;
  70545. +
  70546. + if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
  70547. + {
  70548. + // Target: AP/IBSS peer.
  70549. + pTargetAdapter = Adapter;
  70550. + }
  70551. + else if(ACTING_AS_AP(ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE)))
  70552. + {
  70553. + // Target: VWIFI peer.
  70554. + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE);
  70555. + }
  70556. +
  70557. + if(pTargetAdapter != NULL)
  70558. + {
  70559. + for(index=0; index<ASSOCIATE_ENTRY_NUM; index++)
  70560. + {
  70561. + pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
  70562. + if(pEntry != NULL)
  70563. + {
  70564. + if(pEntry->bAssociated)
  70565. + break;
  70566. + }
  70567. + }
  70568. + }
  70569. +
  70570. + if(pEntry == NULL)
  70571. + {
  70572. + SwAntDivRestAfterLink(Adapter);
  70573. + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No Link.\n"));
  70574. + return;
  70575. + }
  70576. + else
  70577. + {
  70578. + pHalData->RSSI_target = pEntry;
  70579. + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is PEER STA\n"));
  70580. + }
  70581. + }
  70582. +
  70583. +
  70584. +#endif
  70585. +
  70586. + pHalData->RSSI_cnt_A= 0;
  70587. + pHalData->RSSI_cnt_B= 0;
  70588. + pDM_SWAT_Table->try_flag = 0;
  70589. + // DBG_8192C("dm_SW_AntennaSwitch(): Set try_flag to 0 prepare for peak!\n");
  70590. + return;
  70591. + }
  70592. + else
  70593. + {
  70594. + curTxOkCnt = Adapter->xmitpriv.tx_bytes - pdmpriv->lastTxOkCnt;
  70595. + curRxOkCnt = Adapter->recvpriv.rx_bytes - pdmpriv->lastRxOkCnt;
  70596. +
  70597. + pdmpriv->lastTxOkCnt = Adapter->xmitpriv.tx_bytes ;
  70598. + pdmpriv->lastRxOkCnt = Adapter->recvpriv.rx_bytes ;
  70599. +
  70600. + if(pDM_SWAT_Table->try_flag == 1)
  70601. + {
  70602. + if(pDM_SWAT_Table->CurAntenna == Antenna_A)
  70603. + {
  70604. + pdmpriv->TXByteCnt_A += curTxOkCnt;
  70605. + pdmpriv->RXByteCnt_A += curRxOkCnt;
  70606. + //DBG_8192C("##### TXByteCnt_A(%lld) , RXByteCnt_A(%lld) ####\n",pdmpriv->TXByteCnt_A,pdmpriv->RXByteCnt_A);
  70607. + }
  70608. + else
  70609. + {
  70610. + pdmpriv->TXByteCnt_B += curTxOkCnt;
  70611. + pdmpriv->RXByteCnt_B += curRxOkCnt;
  70612. + //DBG_8192C("##### TXByteCnt_B(%lld) , RXByteCnt_B(%lld) ####\n",pdmpriv->TXByteCnt_B,pdmpriv->RXByteCnt_B);
  70613. + }
  70614. +
  70615. + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
  70616. + pDM_SWAT_Table->RSSI_Trying--;
  70617. + //DBG_8192C("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying);
  70618. +
  70619. + if(pDM_SWAT_Table->RSSI_Trying == 0)
  70620. + {
  70621. + CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A) : (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B);
  70622. + PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B) : (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A);
  70623. +
  70624. + //DBG_8192C("CurByteCnt = %lld\n", CurByteCnt);
  70625. + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt);
  70626. +
  70627. + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH)
  70628. + {
  70629. + PreByteCnt = PreByteCnt*9; //normalize:Cur=90ms:Pre=10ms
  70630. + }
  70631. + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW)
  70632. + {
  70633. + //CurByteCnt = CurByteCnt/2;
  70634. + CurByteCnt = CurByteCnt>>1;//normalize:100ms:50ms
  70635. + }
  70636. +
  70637. +
  70638. + //DBG_8192C("After DIV=>CurByteCnt = %lld\n", CurByteCnt);
  70639. + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt);
  70640. +
  70641. + if(pHalData->RSSI_cnt_A > 0)
  70642. + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
  70643. + else
  70644. + RSSI_A = 0;
  70645. + if(pHalData->RSSI_cnt_B > 0)
  70646. + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
  70647. + else
  70648. + RSSI_B = 0;
  70649. +
  70650. + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
  70651. + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A;
  70652. + //DBG_8192C("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI);
  70653. + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n",
  70654. + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B"));
  70655. + //DBG_8192C("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
  70656. + //RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B);
  70657. + }
  70658. +
  70659. + }
  70660. + else
  70661. + {
  70662. +
  70663. + if(pHalData->RSSI_cnt_A > 0)
  70664. + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
  70665. + else
  70666. + RSSI_A = 0;
  70667. + if(pHalData->RSSI_cnt_B > 0)
  70668. + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
  70669. + else
  70670. + RSSI_B = 0;
  70671. + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
  70672. + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B;
  70673. + //DBG_8192C("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI);
  70674. + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n",
  70675. + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B"));
  70676. +
  70677. + //DBG_8192C("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
  70678. + // RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B);
  70679. + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
  70680. + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
  70681. + }
  70682. +
  70683. + //1 Trying State
  70684. + if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
  70685. + {
  70686. +
  70687. + if(pDM_SWAT_Table->TestMode == TP_MODE)
  70688. + {
  70689. + //DBG_8192C("SWAS: TestMode = TP_MODE\n");
  70690. + //DBG_8192C("TRY:CurByteCnt = %lld\n", CurByteCnt);
  70691. + //DBG_8192C("TRY:PreByteCnt = %lld\n",PreByteCnt);
  70692. + if(CurByteCnt < PreByteCnt)
  70693. + {
  70694. + if(pDM_SWAT_Table->CurAntenna == Antenna_A)
  70695. + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
  70696. + else
  70697. + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
  70698. + }
  70699. + else
  70700. + {
  70701. + if(pDM_SWAT_Table->CurAntenna == Antenna_A)
  70702. + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
  70703. + else
  70704. + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
  70705. + }
  70706. + for (i= 0; i<8; i++)
  70707. + {
  70708. + if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
  70709. + Score_A++;
  70710. + else
  70711. + Score_B++;
  70712. + }
  70713. + //DBG_8192C("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap);
  70714. + //DBG_8192C("Score_A=%d, Score_B=%d\n", Score_A, Score_B);
  70715. +
  70716. + if(pDM_SWAT_Table->CurAntenna == Antenna_A)
  70717. + {
  70718. + nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B;
  70719. + }
  70720. + else
  70721. + {
  70722. + nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A;
  70723. + }
  70724. + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
  70725. + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n",
  70726. + //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
  70727. +
  70728. + if(nextAntenna != pDM_SWAT_Table->CurAntenna)
  70729. + {
  70730. + //DBG_8192C("SWAS: Switch back to another antenna\n");
  70731. + }
  70732. + else
  70733. + {
  70734. + //DBG_8192C("SWAS: current anntena is good\n");
  70735. + }
  70736. + }
  70737. +
  70738. + if(pDM_SWAT_Table->TestMode == RSSI_MODE)
  70739. + {
  70740. + //DBG_8192C("SWAS: TestMode = RSSI_MODE\n");
  70741. + pDM_SWAT_Table->SelectAntennaMap=0xAA;
  70742. + if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
  70743. + {
  70744. + //DBG_8192C("SWAS: Switch back to another antenna\n");
  70745. + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
  70746. + }
  70747. + else // current anntena is good
  70748. + {
  70749. + nextAntenna = pDM_SWAT_Table->CurAntenna;
  70750. + //DBG_8192C("SWAS: current anntena is good\n");
  70751. + }
  70752. + }
  70753. + pDM_SWAT_Table->try_flag = 0;
  70754. + pHalData->RSSI_test = _FALSE;
  70755. + pHalData->RSSI_sum_A = 0;
  70756. + pHalData->RSSI_cnt_A = 0;
  70757. + pHalData->RSSI_sum_B = 0;
  70758. + pHalData->RSSI_cnt_B = 0;
  70759. + pdmpriv->TXByteCnt_A = 0;
  70760. + pdmpriv->TXByteCnt_B = 0;
  70761. + pdmpriv->RXByteCnt_A = 0;
  70762. + pdmpriv->RXByteCnt_B = 0;
  70763. +
  70764. + }
  70765. +
  70766. + //1 Normal State
  70767. + else if(pDM_SWAT_Table->try_flag == 0)
  70768. + {
  70769. + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH)
  70770. + {
  70771. + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000)
  70772. + pdmpriv->TrafficLoad = TRAFFIC_HIGH;
  70773. + else
  70774. + pdmpriv->TrafficLoad = TRAFFIC_LOW;
  70775. + }
  70776. + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW)
  70777. + {
  70778. + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000)
  70779. + pdmpriv->TrafficLoad = TRAFFIC_HIGH;
  70780. + else
  70781. + pdmpriv->TrafficLoad = TRAFFIC_LOW;
  70782. + }
  70783. + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH)
  70784. + pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
  70785. + //DBG_8192C("Normal:TrafficLoad = %lld\n", curTxOkCnt+curRxOkCnt);
  70786. +
  70787. + //Prepare To Try Antenna
  70788. + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
  70789. + pDM_SWAT_Table->try_flag = 1;
  70790. + pHalData->RSSI_test = _TRUE;
  70791. + if((curRxOkCnt+curTxOkCnt) > 1000)
  70792. + {
  70793. + pDM_SWAT_Table->RSSI_Trying = 4;
  70794. + pDM_SWAT_Table->TestMode = TP_MODE;
  70795. + }
  70796. + else
  70797. + {
  70798. + pDM_SWAT_Table->RSSI_Trying = 2;
  70799. + pDM_SWAT_Table->TestMode = RSSI_MODE;
  70800. +
  70801. + }
  70802. + //DBG_8192C("SWAS: Normal State -> Begin Trying! TestMode=%s\n",(pDM_SWAT_Table->TestMode == TP_MODE)?"TP":"RSSI");
  70803. +
  70804. +
  70805. + pHalData->RSSI_sum_A = 0;
  70806. + pHalData->RSSI_cnt_A = 0;
  70807. + pHalData->RSSI_sum_B = 0;
  70808. + pHalData->RSSI_cnt_B = 0;
  70809. + }
  70810. + }
  70811. +
  70812. + //1 4.Change TRX antenna
  70813. + if(nextAntenna != pDM_SWAT_Table->CurAntenna)
  70814. + {
  70815. + //DBG_8192C("@@@@@@@@ SWAS: Change TX Antenna!\n ");
  70816. + rtw_antenna_select_cmd(Adapter, nextAntenna, 1);
  70817. + }
  70818. +
  70819. + //1 5.Reset Statistics
  70820. + pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
  70821. + pDM_SWAT_Table->CurAntenna = nextAntenna;
  70822. + pDM_SWAT_Table->PreRSSI = curRSSI;
  70823. +
  70824. +
  70825. + //1 6.Set next timer
  70826. +
  70827. + if(pDM_SWAT_Table->RSSI_Trying == 0)
  70828. + return;
  70829. +
  70830. + if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
  70831. + {
  70832. + if(pDM_SWAT_Table->TestMode == TP_MODE)
  70833. + {
  70834. + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH)
  70835. + {
  70836. + _set_timer(&pdmpriv->SwAntennaSwitchTimer,10 ); //ms
  70837. + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n");
  70838. + }
  70839. + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW)
  70840. + {
  70841. + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 50 ); //ms
  70842. + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n");
  70843. + }
  70844. + }
  70845. + else
  70846. + {
  70847. + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 500 ); //ms
  70848. + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n");
  70849. + }
  70850. + }
  70851. + else
  70852. + {
  70853. + if(pDM_SWAT_Table->TestMode == TP_MODE)
  70854. + {
  70855. + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH)
  70856. + _set_timer(&pdmpriv->SwAntennaSwitchTimer,90 ); //ms
  70857. + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW)
  70858. + _set_timer(&pdmpriv->SwAntennaSwitchTimer,100 ); //ms
  70859. + }
  70860. + else
  70861. + {
  70862. + _set_timer(&pdmpriv->SwAntennaSwitchTimer,500 ); //ms
  70863. + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n");
  70864. + }
  70865. + }
  70866. +
  70867. +// RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: -----The End-----\n "));
  70868. +
  70869. +}
  70870. +
  70871. +//
  70872. +// 20100514 Luke/Joseph:
  70873. +// Callback function for 500ms antenna test trying.
  70874. +//
  70875. +static void dm_SW_AntennaSwitchCallback(void *FunctionContext)
  70876. +{
  70877. + _adapter *padapter = (_adapter *)FunctionContext;
  70878. +
  70879. + if(padapter->net_closed == _TRUE)
  70880. + return;
  70881. + // Only
  70882. + dm_SW_AntennaSwitch(padapter, SWAW_STEP_DETERMINE);
  70883. +}
  70884. +
  70885. +
  70886. +//
  70887. +// 20100722
  70888. +// This function is used to gather the RSSI information for antenna testing.
  70889. +// It selects the RSSI of the peer STA that we want to know.
  70890. +//
  70891. +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll)
  70892. +{
  70893. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  70894. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  70895. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70896. +
  70897. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70898. +
  70899. + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0)
  70900. + return;
  70901. +
  70902. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  70903. + {
  70904. + if(pDM_SWAT_Table->CurAntenna == Antenna_A)
  70905. + {
  70906. + pHalData->RSSI_sum_A += RxPWDBAll;
  70907. + pHalData->RSSI_cnt_A++;
  70908. + }
  70909. + else
  70910. + {
  70911. + pHalData->RSSI_sum_B+= RxPWDBAll;
  70912. + pHalData->RSSI_cnt_B++;
  70913. +
  70914. + }
  70915. + //DBG_8192C("%s Ant_(%s),RSSI_sum(%d),RSSI_cnt(%d)\n",__FUNCTION__,(2==pHalData->CurAntenna)?"A":"B",pHalData->RSSI_sum,pHalData->RSSI_cnt);
  70916. + }
  70917. +
  70918. +}
  70919. +
  70920. +
  70921. +
  70922. +static VOID
  70923. +dm_SW_AntennaSwitchInit(
  70924. + IN PADAPTER Adapter
  70925. + )
  70926. +{
  70927. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70928. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70929. + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table;
  70930. +
  70931. + pHalData->RSSI_sum_A = 0;
  70932. + pHalData->RSSI_sum_B = 0;
  70933. + pHalData->RSSI_cnt_A = 0;
  70934. + pHalData->RSSI_cnt_B = 0;
  70935. +
  70936. + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna;
  70937. + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna;
  70938. + pDM_SWAT_Table->try_flag = 0xff;
  70939. + pDM_SWAT_Table->PreRSSI = 0;
  70940. + pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
  70941. + pDM_SWAT_Table->SelectAntennaMap=0xAA;
  70942. +
  70943. + // Move the timer initialization to InitializeVariables function.
  70944. + //PlatformInitializeTimer(Adapter, &pMgntInfo->SwAntennaSwitchTimer, (RT_TIMER_CALL_BACK)dm_SW_AntennaSwitchCallback, NULL, "SwAntennaSwitchTimer");
  70945. +}
  70946. +
  70947. +#endif
  70948. +
  70949. +//#define RSSI_CCK 0
  70950. +//#define RSSI_OFDM 1
  70951. +static void dm_RSSIMonitorInit(
  70952. + IN PADAPTER Adapter
  70953. +)
  70954. +{
  70955. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70956. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70957. + pdmpriv->OFDM_Pkt_Cnt = 0;
  70958. + pdmpriv->RSSI_Select = RSSI_DEFAULT;
  70959. +}
  70960. +
  70961. +static void dm_RSSIMonitorCheck(
  70962. + IN PADAPTER Adapter
  70963. +)
  70964. +{
  70965. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  70966. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70967. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  70968. +
  70969. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE)
  70970. + return;
  70971. +
  70972. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE |WIFI_ADHOC_STATE) == _TRUE )
  70973. + {
  70974. + if(Adapter->stapriv.asoc_sta_count < 2)
  70975. + return;
  70976. + }
  70977. +
  70978. + if(pdmpriv->OFDM_Pkt_Cnt == 0)
  70979. + pdmpriv->RSSI_Select = RSSI_CCK;
  70980. + else
  70981. + pdmpriv->RSSI_Select = RSSI_OFDM;
  70982. +
  70983. + pdmpriv->OFDM_Pkt_Cnt = 0;
  70984. + //DBG_8192C("RSSI_Select=%s OFDM_Pkt_Cnt(%d)\n",
  70985. + //(pdmpriv->RSSI_Select == RSSI_OFDM)?"RSSI_OFDM":"RSSI_CCK",
  70986. + //pdmpriv->OFDM_Pkt_Cnt);
  70987. +}
  70988. +
  70989. +//============================================================
  70990. +// functions
  70991. +//============================================================
  70992. +void rtl8192c_init_dm_priv(IN PADAPTER Adapter)
  70993. +{
  70994. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  70995. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  70996. +
  70997. + //_rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));
  70998. +
  70999. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  71000. + _init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , dm_SW_AntennaSwitchCallback, Adapter);
  71001. +#endif
  71002. +}
  71003. +
  71004. +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter)
  71005. +{
  71006. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  71007. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  71008. +
  71009. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  71010. + _cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);
  71011. +#endif
  71012. +}
  71013. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  71014. +void dm_InitHybridAntDiv(IN PADAPTER Adapter)
  71015. +{
  71016. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  71017. +
  71018. + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0)
  71019. + return;
  71020. +
  71021. + //Set OFDM HW RX Antenna Diversity
  71022. + PHY_SetBBReg(Adapter,0xc50, BIT7, 1); //Enable Hardware antenna switch
  71023. + PHY_SetBBReg(Adapter,0x870, BIT9|BIT8, 0); //Enable hardware control of "ANT_SEL" & "ANT_SELB"
  71024. + PHY_SetBBReg(Adapter,0xCA4, BIT11, 0); //Switch to another antenna by checking pwdb threshold
  71025. + PHY_SetBBReg(Adapter,0xCA4, 0x7FF, 0x080); //Pwdb threshold=8dB
  71026. + PHY_SetBBReg(Adapter,0xC54, BIT23, 1); //Decide final antenna by comparing 2 antennas' pwdb
  71027. + PHY_SetBBReg(Adapter,0x874, BIT23, 0); //No update ANTSEL during GNT_BT=1
  71028. + PHY_SetBBReg(Adapter,0x80C, BIT21, 1); //TX atenna selection from tx_info
  71029. + //Set CCK HW RX Antenna Diversity
  71030. + PHY_SetBBReg(Adapter,0xA00, BIT15, 1);//Enable antenna diversity
  71031. + PHY_SetBBReg(Adapter,0xA0C, BIT4, 0); //Antenna diversity decision period = 32 sample
  71032. + PHY_SetBBReg(Adapter,0xA0C, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4
  71033. + PHY_SetBBReg(Adapter,0xA10, BIT13, 1); //polarity ana_A=1 and ana_B=0
  71034. + PHY_SetBBReg(Adapter,0xA14, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
  71035. +
  71036. + pHalData->CCK_Ant1_Cnt = 0;
  71037. + pHalData->CCK_Ant2_Cnt = 0;
  71038. + pHalData->OFDM_Ant1_Cnt = 0;
  71039. + pHalData->OFDM_Ant2_Cnt = 0;
  71040. +}
  71041. +
  71042. +
  71043. +#define RxDefaultAnt1 0x65a9
  71044. +#define RxDefaultAnt2 0x569a
  71045. +
  71046. +void dm_SelectRXDefault(IN PADAPTER Adapter)
  71047. +{
  71048. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  71049. +
  71050. + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0)
  71051. + return;
  71052. +
  71053. + //DbgPrint(" Ant1_Cnt=%d, Ant2_Cnt=%d\n", pHalData->Ant1_Cnt, pHalData->Ant2_Cnt);
  71054. + //DBG_8192C(" CCK_Ant1_Cnt = %d, CCK_Ant2_Cnt = %d\n", pHalData->CCK_Ant1_Cnt, pHalData->CCK_Ant2_Cnt);
  71055. + //DBG_8192C(" OFDM_Ant1_Cnt = %d, OFDM_Ant2_Cnt = %d\n", pHalData->OFDM_Ant1_Cnt, pHalData->OFDM_Ant2_Cnt);
  71056. + if((pHalData->OFDM_Ant1_Cnt == 0) && (pHalData->OFDM_Ant2_Cnt == 0))
  71057. + {
  71058. + if((pHalData->CCK_Ant1_Cnt + pHalData->CCK_Ant2_Cnt) >=10 )
  71059. + {
  71060. + if(pHalData->CCK_Ant1_Cnt > (5*pHalData->CCK_Ant2_Cnt))
  71061. + {
  71062. + DBG_8192C(" RX Default = Ant1\n");
  71063. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1);
  71064. + }
  71065. + else if(pHalData->CCK_Ant2_Cnt > (5*pHalData->CCK_Ant1_Cnt))
  71066. + {
  71067. + DBG_8192C(" RX Default = Ant2\n");
  71068. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2);
  71069. + }
  71070. + else if(pHalData->CCK_Ant1_Cnt > pHalData->CCK_Ant2_Cnt)
  71071. + {
  71072. + DBG_8192C(" RX Default = Ant2\n");
  71073. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2);
  71074. + }
  71075. + else
  71076. + {
  71077. + DBG_8192C(" RX Default = Ant1\n");
  71078. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1);
  71079. + }
  71080. + pHalData->CCK_Ant1_Cnt = 0;
  71081. + pHalData->CCK_Ant2_Cnt = 0;
  71082. + pHalData->OFDM_Ant1_Cnt = 0;
  71083. + pHalData->OFDM_Ant2_Cnt = 0;
  71084. + }
  71085. + }
  71086. + else
  71087. + {
  71088. + if(pHalData->OFDM_Ant1_Cnt > pHalData->OFDM_Ant2_Cnt)
  71089. + {
  71090. + DBG_8192C(" RX Default = Ant1\n");
  71091. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1);
  71092. + }
  71093. + else
  71094. + {
  71095. + DBG_8192C(" RX Default = Ant2\n");
  71096. + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2);
  71097. + }
  71098. + pHalData->CCK_Ant1_Cnt = 0;
  71099. + pHalData->CCK_Ant2_Cnt = 0;
  71100. + pHalData->OFDM_Ant1_Cnt = 0;
  71101. + pHalData->OFDM_Ant2_Cnt = 0;
  71102. + }
  71103. +
  71104. +
  71105. +}
  71106. +
  71107. +#endif
  71108. +
  71109. +void
  71110. +rtl8192c_InitHalDm(
  71111. + IN PADAPTER Adapter
  71112. + )
  71113. +{
  71114. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  71115. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  71116. + u8 i;
  71117. +
  71118. +#ifdef CONFIG_USB_HCI
  71119. + dm_InitGPIOSetting(Adapter);
  71120. +#endif
  71121. +
  71122. + pdmpriv->DM_Type = DM_Type_ByDriver;
  71123. + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
  71124. + pdmpriv->UndecoratedSmoothedPWDB = (-1);
  71125. + pdmpriv->UndecoratedSmoothedCCK = (-1);
  71126. +
  71127. +
  71128. + //.1 DIG INIT
  71129. + pdmpriv->bDMInitialGainEnable = _TRUE;
  71130. + pdmpriv->DMFlag |= DYNAMIC_FUNC_DIG;
  71131. + dm_DIGInit(Adapter);
  71132. +
  71133. + //.2 DynamicTxPower INIT
  71134. + pdmpriv->DMFlag |= DYNAMIC_FUNC_HP;
  71135. + dm_InitDynamicTxPower(Adapter);
  71136. +
  71137. + //.3
  71138. + DM_InitEdcaTurbo(Adapter);
  71139. +
  71140. + //.4 RateAdaptive INIT
  71141. + dm_InitRateAdaptiveMask(Adapter);
  71142. +
  71143. + //.5 Tx Power Tracking Init.
  71144. + pdmpriv->DMFlag |= DYNAMIC_FUNC_SS;
  71145. + DM_InitializeTXPowerTracking(Adapter);
  71146. +
  71147. +#ifdef CONFIG_BT_COEXIST
  71148. + pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
  71149. + dm_InitBtCoexistDM(Adapter);
  71150. +#endif
  71151. +
  71152. + dm_InitDynamicBBPowerSaving(Adapter);
  71153. +
  71154. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  71155. + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV;
  71156. + dm_SW_AntennaSwitchInit(Adapter);
  71157. +#endif
  71158. +
  71159. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  71160. + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV;
  71161. + dm_InitHybridAntDiv(Adapter);
  71162. +#endif
  71163. +
  71164. + dm_RSSIMonitorInit(Adapter);
  71165. +
  71166. + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag;
  71167. +
  71168. + // Save REG_INIDATA_RATE_SEL value for TXDESC.
  71169. + for(i = 0 ; i<32 ; i++)
  71170. + {
  71171. + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f;
  71172. + }
  71173. +
  71174. +#ifdef CONFIG_DM_ADAPTIVITY
  71175. + pdmpriv->DMFlag |= DYNAMIC_FUNC_ADAPTIVITY;
  71176. + dm_adaptivity_init(Adapter);
  71177. +#endif
  71178. +
  71179. +}
  71180. +
  71181. +#ifdef CONFIG_CONCURRENT_MODE
  71182. +static void FindMinimumRSSI(PADAPTER Adapter)
  71183. +{
  71184. + PHAL_DATA_TYPE pbuddy_HalData;
  71185. + struct dm_priv *pbuddy_dmpriv;
  71186. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  71187. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  71188. + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
  71189. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  71190. +
  71191. + if(!rtw_buddy_adapter_up(Adapter))
  71192. + return;
  71193. +
  71194. + pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);
  71195. + pbuddy_dmpriv = &pbuddy_HalData->dmpriv;
  71196. +
  71197. + //get min. [PWDB] when both interfaces are connected
  71198. + if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
  71199. + && Adapter->stapriv.asoc_sta_count > 2
  71200. + && check_buddy_fwstate(Adapter, _FW_LINKED)) ||
  71201. + (check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE
  71202. + && pbuddy_adapter->stapriv.asoc_sta_count > 2
  71203. + && check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
  71204. + (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
  71205. + && check_fwstate(pmlmepriv, _FW_LINKED)
  71206. + && check_buddy_fwstate(Adapter,WIFI_STATION_STATE)
  71207. + && check_buddy_fwstate(Adapter,_FW_LINKED)))
  71208. + {
  71209. + if(pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB)
  71210. + pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;
  71211. + }//primary interface is not connected
  71212. + else if((check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE
  71213. + && pbuddy_adapter->stapriv.asoc_sta_count > 2) ||
  71214. + (check_buddy_fwstate(Adapter,WIFI_STATION_STATE)
  71215. + && check_buddy_fwstate(Adapter,_FW_LINKED)))
  71216. + {
  71217. + pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;
  71218. + }
  71219. + //secondary is not connected
  71220. + else if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
  71221. + && Adapter->stapriv.asoc_sta_count > 2) ||
  71222. + (check_fwstate(pmlmepriv, WIFI_STATION_STATE)
  71223. + && check_fwstate(pmlmepriv, _FW_LINKED)))
  71224. + {
  71225. + pbuddy_dmpriv->UndecoratedSmoothedPWDB = 0;
  71226. + }
  71227. + //both interfaces are not connected
  71228. + else
  71229. + {
  71230. + pdmpriv->UndecoratedSmoothedPWDB = 0;
  71231. + pbuddy_dmpriv->UndecoratedSmoothedPWDB = 0;
  71232. + }
  71233. +
  71234. + //primary interface is ap mode
  71235. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && Adapter->stapriv.asoc_sta_count > 2)
  71236. + {
  71237. + pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
  71238. + }//secondary interface is ap mode
  71239. + else if(check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE && pbuddy_adapter->stapriv.asoc_sta_count > 2)
  71240. + {
  71241. + pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;
  71242. + }
  71243. + else //both interfaces are not ap mode
  71244. + {
  71245. + pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
  71246. + }
  71247. +
  71248. +}
  71249. +
  71250. +#endif //CONFIG_CONCURRENT_MODE
  71251. +
  71252. +VOID
  71253. +rtl8192c_HalDmWatchDog(
  71254. + IN PADAPTER Adapter
  71255. + )
  71256. +{
  71257. + BOOLEAN bFwCurrentInPSMode = _FALSE;
  71258. + BOOLEAN bFwPSAwake = _TRUE;
  71259. + u8 hw_init_completed = _FALSE;
  71260. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  71261. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  71262. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  71263. +#ifdef CONFIG_CONCURRENT_MODE
  71264. + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
  71265. +#endif //CONFIG_CONCURRENT_MODE
  71266. +
  71267. + #if defined(CONFIG_CONCURRENT_MODE)
  71268. + if (Adapter->isprimary == _FALSE && pbuddy_adapter) {
  71269. + hw_init_completed = pbuddy_adapter->hw_init_completed;
  71270. + } else
  71271. + #endif
  71272. + {
  71273. + hw_init_completed = Adapter->hw_init_completed;
  71274. + }
  71275. +
  71276. + if (hw_init_completed == _FALSE)
  71277. + goto skip_dm;
  71278. +
  71279. +#ifdef CONFIG_LPS
  71280. + #if defined(CONFIG_CONCURRENT_MODE)
  71281. + if (Adapter->iface_type != IFACE_PORT0 && pbuddy_adapter) {
  71282. + bFwCurrentInPSMode = pbuddy_adapter->pwrctrlpriv.bFwCurrentInPSMode;
  71283. + rtw_hal_get_hwreg(pbuddy_adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
  71284. + } else
  71285. + #endif
  71286. + {
  71287. + bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode;
  71288. + rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
  71289. + }
  71290. +#endif
  71291. +
  71292. +#ifdef CONFIG_P2P_PS
  71293. + // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.
  71294. + // modifed by thomas. 2011.06.11.
  71295. + if(Adapter->wdinfo.p2p_ps_mode)
  71296. + bFwPSAwake = _FALSE;
  71297. +#endif // CONFIG_P2P_PS
  71298. +
  71299. + // Stop dynamic mechanism when:
  71300. + // 1. RF is OFF. (No need to do DM.)
  71301. + // 2. Fw is under power saving mode for FwLPS. (Prevent from SW/FW I/O racing.)
  71302. + // 3. IPS workitem is scheduled. (Prevent from IPS sequence to be swapped with DM.
  71303. + // Sometimes DM execution time is longer than 100ms such that the assertion
  71304. + // in MgntActSet_RF_State() called by InactivePsWorkItem will be triggered by
  71305. + // wating to long for RFChangeInProgress.)
  71306. + // 4. RFChangeInProgress is TRUE. (Prevent from broken by IPS/HW/SW Rf off.)
  71307. + // Noted by tynli. 2010.06.01.
  71308. + //if(rfState == eRfOn)
  71309. + if( (hw_init_completed == _TRUE)
  71310. + && ((!bFwCurrentInPSMode) && bFwPSAwake))
  71311. + {
  71312. + //
  71313. + // Calculate Tx/Rx statistics.
  71314. + //
  71315. + dm_CheckStatistics(Adapter);
  71316. +
  71317. + //
  71318. + // For PWDB monitor and record some value for later use.
  71319. + //
  71320. + PWDB_Monitor(Adapter);
  71321. +
  71322. + dm_RSSIMonitorCheck(Adapter);
  71323. +
  71324. +#ifdef CONFIG_CONCURRENT_MODE
  71325. + if(Adapter->adapter_type > PRIMARY_ADAPTER)
  71326. + goto _record_initrate;
  71327. +
  71328. + FindMinimumRSSI(Adapter);
  71329. +#endif
  71330. +
  71331. + //
  71332. + // Dynamic Initial Gain mechanism.
  71333. + //
  71334. + dm_FalseAlarmCounterStatistics(Adapter);
  71335. + dm_DIG(Adapter);
  71336. + dm_adaptivity(Adapter);
  71337. +
  71338. + //
  71339. + //Dynamic BB Power Saving Mechanism
  71340. + //
  71341. + dm_DynamicBBPowerSaving(Adapter);
  71342. +
  71343. + //
  71344. + // Dynamic Tx Power mechanism.
  71345. + //
  71346. + dm_DynamicTxPower(Adapter);
  71347. +
  71348. + //
  71349. + // Tx Power Tracking.
  71350. + //
  71351. +#if MP_DRIVER == 0
  71352. +#ifdef CONFIG_BUSY_TRAFFIC_SKIP_PWR_TRACK
  71353. + if(pmlmepriv->LinkDetectInfo.bBusyTraffic == _FALSE)
  71354. +#endif //CONFIG_BUSY_TRAFFIC_SKIP_PWR_TRACK
  71355. +#endif
  71356. + rtl8192c_dm_CheckTXPowerTracking(Adapter);
  71357. +
  71358. + //
  71359. + // Rate Adaptive by Rx Signal Strength mechanism.
  71360. + //
  71361. + dm_RefreshRateAdaptiveMask(Adapter);
  71362. +
  71363. +#ifdef CONFIG_BT_COEXIST
  71364. + //BT-Coexist
  71365. + dm_BTCoexist(Adapter);
  71366. +#endif
  71367. +
  71368. + // EDCA turbo
  71369. + //update the EDCA paramter according to the Tx/RX mode
  71370. + //update_EDCA_param(Adapter);
  71371. + dm_CheckEdcaTurbo(Adapter);
  71372. +
  71373. + //
  71374. + // Dynamically switch RTS/CTS protection.
  71375. + //
  71376. + //dm_CheckProtection(Adapter);
  71377. +
  71378. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  71379. + //
  71380. + // Software Antenna diversity
  71381. + //
  71382. + dm_SW_AntennaSwitch(Adapter, SWAW_STEP_PEAK);
  71383. +#endif
  71384. +
  71385. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  71386. + //Hybrid Antenna Diversity
  71387. + dm_SelectRXDefault(Adapter);
  71388. +#endif
  71389. +
  71390. +#ifdef CONFIG_PCI_HCI
  71391. + // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.
  71392. + // Tx Migration settings.
  71393. + //dm_InterruptMigration(Adapter);
  71394. +
  71395. + //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))
  71396. + // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));
  71397. +#endif
  71398. +
  71399. +
  71400. +_record_initrate:
  71401. +
  71402. + // Read REG_INIDATA_RATE_SEL value for TXDESC.
  71403. + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
  71404. + {
  71405. + pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f;
  71406. +
  71407. +#ifdef CONFIG_TDLS
  71408. + if(Adapter->tdlsinfo.setup_state == TDLS_LINKED_STATE)
  71409. + {
  71410. + u8 i=1;
  71411. + for(; i < (Adapter->tdlsinfo.macid_index) ; i++)
  71412. + {
  71413. + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f;
  71414. + }
  71415. + }
  71416. +#endif //CONFIG_TDLS
  71417. +
  71418. + }
  71419. + else
  71420. + {
  71421. + u8 i;
  71422. + for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++)
  71423. + {
  71424. + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f;
  71425. + }
  71426. + }
  71427. + }
  71428. +
  71429. +skip_dm:
  71430. +
  71431. + // Check GPIO to determine current RF on/off and Pbc status.
  71432. + // Check Hardware Radio ON/OFF or not
  71433. + //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)
  71434. + //{
  71435. + //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));
  71436. + // dm_CheckRfCtrlGPIO(Adapter);
  71437. + //}
  71438. +
  71439. +#ifdef CONFIG_PCI_HCI
  71440. + if(pHalData->bGpioHwWpsPbc)
  71441. +#endif
  71442. + {
  71443. + dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11
  71444. + }
  71445. +
  71446. +}
  71447. --- /dev/null
  71448. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c
  71449. @@ -0,0 +1,3627 @@
  71450. +/******************************************************************************
  71451. + *
  71452. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  71453. + *
  71454. + * This program is free software; you can redistribute it and/or modify it
  71455. + * under the terms of version 2 of the GNU General Public License as
  71456. + * published by the Free Software Foundation.
  71457. + *
  71458. + * This program is distributed in the hope that it will be useful, but WITHOUT
  71459. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  71460. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  71461. + * more details.
  71462. + *
  71463. + * You should have received a copy of the GNU General Public License along with
  71464. + * this program; if not, write to the Free Software Foundation, Inc.,
  71465. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  71466. + *
  71467. + *
  71468. + ******************************************************************************/
  71469. +
  71470. +#define _RTL8192C_HAL_INIT_C_
  71471. +#include <drv_conf.h>
  71472. +#include <osdep_service.h>
  71473. +#include <drv_types.h>
  71474. +#include <rtw_byteorder.h>
  71475. +#include <rtw_efuse.h>
  71476. +
  71477. +#include <rtl8192c_hal.h>
  71478. +
  71479. +#ifdef CONFIG_USB_HCI
  71480. +#include <usb_hal.h>
  71481. +#endif
  71482. +
  71483. +#ifdef CONFIG_PCI_HCI
  71484. +#include <pci_hal.h>
  71485. +#endif
  71486. +
  71487. +static BOOLEAN
  71488. +hal_EfusePgPacketWrite2ByteHeader(
  71489. + IN PADAPTER pAdapter,
  71490. + IN u8 efuseType,
  71491. + IN u16 *pAddr,
  71492. + IN PPGPKT_STRUCT pTargetPkt,
  71493. + IN BOOLEAN bPseudoTest);
  71494. +static BOOLEAN
  71495. +hal_EfusePgPacketWrite1ByteHeader(
  71496. + IN PADAPTER pAdapter,
  71497. + IN u8 efuseType,
  71498. + IN u16 *pAddr,
  71499. + IN PPGPKT_STRUCT pTargetPkt,
  71500. + IN BOOLEAN bPseudoTest);
  71501. +static BOOLEAN
  71502. +hal_EfusePgPacketWriteData(
  71503. + IN PADAPTER pAdapter,
  71504. + IN u8 efuseType,
  71505. + IN u16 *pAddr,
  71506. + IN PPGPKT_STRUCT pTargetPkt,
  71507. + IN BOOLEAN bPseudoTest);
  71508. +static BOOLEAN
  71509. +hal_EfusePgPacketWrite_BT(
  71510. + IN PADAPTER pAdapter,
  71511. + IN u8 offset,
  71512. + IN u8 word_en,
  71513. + IN u8 *pData,
  71514. + IN BOOLEAN bPseudoTest);
  71515. +
  71516. +static VOID
  71517. +_FWDownloadEnable(
  71518. + IN PADAPTER Adapter,
  71519. + IN BOOLEAN enable
  71520. + )
  71521. +{
  71522. + u8 tmp;
  71523. +
  71524. + if(enable)
  71525. + {
  71526. + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
  71527. + {
  71528. + u8 val;
  71529. + if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
  71530. + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
  71531. + }
  71532. + #endif
  71533. +
  71534. + // 8051 enable
  71535. + tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);
  71536. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|0x04);
  71537. +
  71538. + // MCU firmware download enable.
  71539. + tmp = rtw_read8(Adapter, REG_MCUFWDL);
  71540. + rtw_write8(Adapter, REG_MCUFWDL, tmp|0x01);
  71541. +
  71542. + // 8051 reset
  71543. + tmp = rtw_read8(Adapter, REG_MCUFWDL+2);
  71544. + rtw_write8(Adapter, REG_MCUFWDL+2, tmp&0xf7);
  71545. + }
  71546. + else
  71547. + {
  71548. + // MCU firmware download enable.
  71549. + tmp = rtw_read8(Adapter, REG_MCUFWDL);
  71550. + rtw_write8(Adapter, REG_MCUFWDL, tmp&0xfe);
  71551. +
  71552. + // Reserved for fw extension.
  71553. + rtw_write8(Adapter, REG_MCUFWDL+1, 0x00);
  71554. + }
  71555. +}
  71556. +
  71557. +
  71558. +#define MAX_REG_BOLCK_SIZE 196
  71559. +#define MIN_REG_BOLCK_SIZE 8
  71560. +
  71561. +static int
  71562. +_BlockWrite(
  71563. + IN PADAPTER Adapter,
  71564. + IN PVOID buffer,
  71565. + IN u32 size
  71566. + )
  71567. +{
  71568. + int ret = _SUCCESS;
  71569. +
  71570. +#ifdef CONFIG_PCI_HCI
  71571. + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW
  71572. + u8 *bufferPtr = (u8 *)buffer;
  71573. + u32 *pu4BytePtr = (u32 *)buffer;
  71574. + u32 i, offset, blockCount, remainSize;
  71575. + u8 remainFW[4] = {0, 0, 0, 0};
  71576. + u8 *p = NULL;
  71577. +
  71578. + blockCount = size / blockSize;
  71579. + remainSize = size % blockSize;
  71580. +
  71581. + for(i = 0 ; i < blockCount ; i++){
  71582. + offset = i * blockSize;
  71583. + rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), cpu_to_le32(*(pu4BytePtr + i)));
  71584. + }
  71585. +
  71586. + p = (u8*)((u32*)(bufferPtr + blockCount * blockSize));
  71587. + if(remainSize){
  71588. + switch (remainSize) {
  71589. + case 0:
  71590. + break;
  71591. + case 3:
  71592. + remainFW[2]=*(p+2);
  71593. + case 2:
  71594. + remainFW[1]=*(p+1);
  71595. + case 1:
  71596. + remainFW[0]=*(p);
  71597. + ret = rtw_write32(Adapter, (FW_8192C_START_ADDRESS + blockCount * blockSize),
  71598. + le32_to_cpu(*(u32*)remainFW));
  71599. + }
  71600. + return ret;
  71601. + }
  71602. +#else
  71603. +
  71604. +#ifdef SUPPORTED_BLOCK_IO
  71605. + u32 blockSize = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW
  71606. + u32 blockSize2 = MIN_REG_BOLCK_SIZE;
  71607. +#else
  71608. + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW
  71609. + u32* pu4BytePtr = (u32*)buffer;
  71610. + u32 blockSize2 = sizeof(u8);
  71611. +#endif
  71612. + u8* bufferPtr = (u8*)buffer;
  71613. + u32 i, offset = 0, offset2, blockCount, remainSize, remainSize2;
  71614. +
  71615. + blockCount = size / blockSize;
  71616. + remainSize = size % blockSize;
  71617. +
  71618. + for(i = 0 ; i < blockCount ; i++){
  71619. + offset = i * blockSize;
  71620. + #ifdef SUPPORTED_BLOCK_IO
  71621. + ret = rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize, (bufferPtr + offset));
  71622. + #else
  71623. + ret = rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), le32_to_cpu(*(pu4BytePtr + i)));
  71624. + #endif
  71625. +
  71626. + if(ret == _FAIL)
  71627. + goto exit;
  71628. + }
  71629. +
  71630. + if(remainSize){
  71631. + #if defined(SUPPORTED_BLOCK_IO) && defined(DBG_BLOCK_WRITE_ISSUE) //Can this be enabled?
  71632. + offset = blockCount * blockSize;
  71633. + ret = rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), remainSize, (bufferPtr + offset));
  71634. + goto exit;
  71635. + #endif
  71636. + offset2 = blockCount * blockSize;
  71637. + blockCount = remainSize / blockSize2;
  71638. + remainSize2 = remainSize % blockSize2;
  71639. +
  71640. + for(i = 0 ; i < blockCount ; i++){
  71641. + offset = offset2 + i * blockSize2;
  71642. + #ifdef SUPPORTED_BLOCK_IO
  71643. + ret = rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize2, (bufferPtr + offset));
  71644. + #else
  71645. + ret = rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset ), *(bufferPtr + offset));
  71646. + #endif
  71647. +
  71648. + if(ret == _FAIL)
  71649. + goto exit;
  71650. + }
  71651. +
  71652. + if(remainSize2)
  71653. + {
  71654. + offset += blockSize2;
  71655. + bufferPtr += offset;
  71656. +
  71657. + for(i = 0 ; i < remainSize2 ; i++){
  71658. + ret = rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i));
  71659. +
  71660. + if(ret == _FAIL)
  71661. + goto exit;
  71662. + }
  71663. + }
  71664. + }
  71665. +#endif
  71666. +
  71667. +exit:
  71668. + return ret;
  71669. +}
  71670. +
  71671. +static int
  71672. +_PageWrite(
  71673. + IN PADAPTER Adapter,
  71674. + IN u32 page,
  71675. + IN PVOID buffer,
  71676. + IN u32 size
  71677. + )
  71678. +{
  71679. + u8 value8;
  71680. + u8 u8Page = (u8) (page & 0x07) ;
  71681. +
  71682. + value8 = (rtw_read8(Adapter, REG_MCUFWDL+2)& 0xF8 ) | u8Page ;
  71683. + rtw_write8(Adapter, REG_MCUFWDL+2,value8);
  71684. + return _BlockWrite(Adapter,buffer,size);
  71685. +}
  71686. +
  71687. +static VOID
  71688. +_FillDummy(
  71689. + u8* pFwBuf,
  71690. + u32* pFwLen
  71691. + )
  71692. +{
  71693. + u32 FwLen = *pFwLen;
  71694. + u8 remain = (u8)(FwLen%4);
  71695. + remain = (remain==0)?0:(4-remain);
  71696. +
  71697. + while(remain>0)
  71698. + {
  71699. + pFwBuf[FwLen] = 0;
  71700. + FwLen++;
  71701. + remain--;
  71702. + }
  71703. +
  71704. + *pFwLen = FwLen;
  71705. +}
  71706. +
  71707. +static int
  71708. +_WriteFW(
  71709. + IN PADAPTER Adapter,
  71710. + IN PVOID buffer,
  71711. + IN u32 size
  71712. + )
  71713. +{
  71714. + // Since we need dynamic decide method of dwonload fw, so we call this function to get chip version.
  71715. + // We can remove _ReadChipVersion from ReadAdapterInfo8192C later.
  71716. +
  71717. + int ret = _SUCCESS;
  71718. + u32 pageNums,remainSize ;
  71719. + u32 page,offset;
  71720. + u8* bufferPtr = (u8*)buffer;
  71721. +
  71722. +#ifdef CONFIG_PCI_HCI
  71723. + // 20100120 Joseph: Add for 88CE normal chip.
  71724. + // Fill in zero to make firmware image to dword alignment.
  71725. +// _FillDummy(bufferPtr, &size);
  71726. +#endif
  71727. +
  71728. + pageNums = size / MAX_PAGE_SIZE ;
  71729. + //RT_ASSERT((pageNums <= 4), ("Page numbers should not greater then 4 \n"));
  71730. + remainSize = size % MAX_PAGE_SIZE;
  71731. +
  71732. + for(page = 0; page < pageNums; page++){
  71733. + offset = page *MAX_PAGE_SIZE;
  71734. + ret = _PageWrite(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE);
  71735. +
  71736. + if(ret == _FAIL)
  71737. + goto exit;
  71738. + }
  71739. + if(remainSize){
  71740. + offset = pageNums *MAX_PAGE_SIZE;
  71741. + page = pageNums;
  71742. + ret = _PageWrite(Adapter,page, (bufferPtr+offset),remainSize);
  71743. +
  71744. + if(ret == _FAIL)
  71745. + goto exit;
  71746. + }
  71747. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Normal chip.\n"));
  71748. +
  71749. +exit:
  71750. + return ret;
  71751. +}
  71752. +
  71753. +static int _FWFreeToGo(
  71754. + IN PADAPTER Adapter
  71755. + )
  71756. +{
  71757. + u32 counter = 0;
  71758. + u32 value32;
  71759. + u32 restarted = _FALSE;
  71760. +
  71761. + // polling CheckSum report
  71762. + do{
  71763. + value32 = rtw_read32(Adapter, REG_MCUFWDL);
  71764. + }while((counter ++ < POLLING_READY_TIMEOUT_COUNT) && (!(value32 & FWDL_ChkSum_rpt)));
  71765. +
  71766. + if(counter >= POLLING_READY_TIMEOUT_COUNT){
  71767. + DBG_8192C("chksum report faill ! REG_MCUFWDL:0x%08x\n",value32);
  71768. + return _FAIL;
  71769. + } else {
  71770. + //DBG_8192C("chksum report success ! REG_MCUFWDL:0x%08x, counter:%u\n",value32, counter);
  71771. + }
  71772. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n",value32));
  71773. +
  71774. +
  71775. + value32 = rtw_read32(Adapter, REG_MCUFWDL);
  71776. + value32 |= MCUFWDL_RDY;
  71777. + value32 &= ~WINTINI_RDY;
  71778. + rtw_write32(Adapter, REG_MCUFWDL, value32);
  71779. +
  71780. +
  71781. +POLLING_FW_READY:
  71782. + // polling for FW ready
  71783. + counter = 0;
  71784. + do
  71785. + {
  71786. + if(rtw_read32(Adapter, REG_MCUFWDL) & WINTINI_RDY){
  71787. + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",PlatformIORead4Byte(Adapter, REG_MCUFWDL)) );
  71788. + return _SUCCESS;
  71789. + }
  71790. + rtw_udelay_os(5);
  71791. + }while(counter++ < POLLING_READY_TIMEOUT_COUNT);
  71792. +
  71793. + DBG_8192C("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", rtw_read32(Adapter, REG_MCUFWDL));
  71794. +
  71795. + if(restarted == _FALSE) {
  71796. + u8 tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);
  71797. + DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp & ~BIT2);
  71798. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp & ~BIT2);
  71799. + DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp|BIT2);
  71800. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|BIT2);
  71801. + restarted = _TRUE;
  71802. + goto POLLING_FW_READY;
  71803. + }
  71804. +
  71805. +
  71806. + return _FAIL;
  71807. +
  71808. +}
  71809. +
  71810. +
  71811. +VOID
  71812. +rtl8192c_FirmwareSelfReset(
  71813. + IN PADAPTER Adapter
  71814. +)
  71815. +{
  71816. + u8 u1bTmp;
  71817. + u8 Delay = 100;
  71818. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  71819. +
  71820. + if((pHalData->FirmwareVersion > 0x21) ||
  71821. + (pHalData->FirmwareVersion == 0x21 &&
  71822. + pHalData->FirmwareSubVersion >= 0x01)) // after 88C Fw v33.1
  71823. + {
  71824. + //0x1cf=0x20. Inform 8051 to reset. 2009.12.25. tynli_test
  71825. + rtw_write8(Adapter, REG_HMETFR+3, 0x20);
  71826. +
  71827. + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);
  71828. + while(u1bTmp&BIT2)
  71829. + {
  71830. + Delay--;
  71831. + if(Delay == 0)
  71832. + break;
  71833. + rtw_udelay_os(50);
  71834. + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);
  71835. + }
  71836. +
  71837. + if((u1bTmp&BIT2) && (Delay == 0))
  71838. + {
  71839. + DBG_8192C("FirmwareDownload92C():fw reset by itself Fail!!!!!! 0x03 = %x\n", u1bTmp);
  71840. + //RT_ASSERT(FALSE, ("PowerOffAdapter8192CE(): 0x03 = %x\n", u1bTmp));
  71841. + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
  71842. + {
  71843. + u8 val;
  71844. + if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
  71845. + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
  71846. + }
  71847. + #endif
  71848. + rtw_write8(Adapter,REG_SYS_FUNC_EN+1,(rtw_read8(Adapter, REG_SYS_FUNC_EN+1)&~BIT2));
  71849. + }
  71850. +
  71851. + DBG_8192C("%s =====> 8051 reset success (%d) .\n", __FUNCTION__ ,Delay);
  71852. + }
  71853. +}
  71854. +
  71855. +#ifdef CONFIG_FILE_FWIMG
  71856. +extern char *rtw_fw_file_path;
  71857. +u8 FwBuffer8192C[FW_8192C_SIZE];
  71858. +#endif //CONFIG_FILE_FWIMG
  71859. +//
  71860. +// Description:
  71861. +// Download 8192C firmware code.
  71862. +//
  71863. +//
  71864. +int FirmwareDownload92C(
  71865. + IN PADAPTER Adapter,
  71866. + IN BOOLEAN bUsedWoWLANFw
  71867. +)
  71868. +{
  71869. + int rtStatus = _SUCCESS;
  71870. + u8 writeFW_retry = 0;
  71871. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  71872. + s8 R92CFwImageFileName_TSMC[] ={RTL8192C_FW_TSMC_IMG};
  71873. + s8 R92CFwImageFileName_UMC[] ={RTL8192C_FW_UMC_IMG};
  71874. + s8 R92CFwImageFileName_UMC_B[] ={RTL8192C_FW_UMC_B_IMG};
  71875. +#ifdef CONFIG_WOWLAN
  71876. + s8 R92CFwImageFileName_TSMC_WW[] ={RTL8192C_FW_TSMC_WW_IMG};
  71877. + s8 R92CFwImageFileName_UMC_WW[] ={RTL8192C_FW_UMC_WW_IMG};
  71878. + s8 R92CFwImageFileName_UMC_B_WW[] ={RTL8192C_FW_UMC_B_WW_IMG};
  71879. +#endif //CONFIG_WOWLAN
  71880. +
  71881. + //s8 R8723FwImageFileName_UMC[] ={RTL8723_FW_UMC_IMG};
  71882. + u8* FwImage = NULL;
  71883. + u32 FwImageLen = 0;
  71884. + char* pFwImageFileName;
  71885. +#ifdef CONFIG_WOWLAN
  71886. + u8* FwImageWoWLAN;
  71887. + u32 FwImageWoWLANLen;
  71888. + char* pFwImageFileName_WoWLAN;
  71889. +#endif //CONFIG_WOWLAN
  71890. + u8* pucMappedFile = NULL;
  71891. + //vivi, merge 92c and 92s into one driver, 20090817
  71892. + //vivi modify this temply, consider it later!!!!!!!!
  71893. + //PRT_FIRMWARE pFirmware = GET_FIRMWARE_819X(Adapter);
  71894. + //PRT_FIRMWARE_92C pFirmware = GET_FIRMWARE_8192C(Adapter);
  71895. + PRT_FIRMWARE_92C pFirmware = NULL;
  71896. + PRT_8192C_FIRMWARE_HDR pFwHdr = NULL;
  71897. + u8 *pFirmwareBuf;
  71898. + u32 FirmwareLen;
  71899. +
  71900. + pFirmware = (PRT_FIRMWARE_92C)rtw_zvmalloc(sizeof(RT_FIRMWARE_92C));
  71901. +
  71902. + if(!pFirmware)
  71903. + {
  71904. + rtStatus = _FAIL;
  71905. + goto Exit;
  71906. + }
  71907. +
  71908. + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID))
  71909. + {
  71910. + pFwImageFileName = R92CFwImageFileName_UMC;
  71911. + FwImage = Rtl819XFwUMCACutImageArray;
  71912. + FwImageLen = UMCACutImgArrayLength;
  71913. +#ifdef CONFIG_WOWLAN
  71914. + pFwImageFileName_WoWLAN = R92CFwImageFileName_UMC_WW;
  71915. + FwImageWoWLAN= Rtl8192C_FwUMCWWImageArray;
  71916. + FwImageWoWLANLen =UMCACutWWImgArrayLength ;
  71917. +#endif //CONFIG_WOWLAN
  71918. + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC\n");
  71919. + }
  71920. + else if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
  71921. + {
  71922. + // The ROM code of UMC B-cut Fw is the same as TSMC. by tynli. 2011.01.14.
  71923. + pFwImageFileName = R92CFwImageFileName_UMC_B;
  71924. + FwImage = Rtl819XFwUMCBCutImageArray;
  71925. + FwImageLen = UMCBCutImgArrayLength;
  71926. +#ifdef CONFIG_WOWLAN
  71927. + pFwImageFileName_WoWLAN = R92CFwImageFileName_UMC_B_WW;
  71928. + FwImageWoWLAN= Rtl8192C_FwUMCBCutWWImageArray;
  71929. + FwImageWoWLANLen =UMCBCutWWImgArrayLength ;
  71930. +#endif //CONFIG_WOWLAN
  71931. +
  71932. + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC_B\n");
  71933. + }
  71934. + else
  71935. + {
  71936. + pFwImageFileName = R92CFwImageFileName_TSMC;
  71937. + FwImage = Rtl819XFwTSMCImageArray;
  71938. + FwImageLen = TSMCImgArrayLength;
  71939. +#ifdef CONFIG_WOWLAN
  71940. + pFwImageFileName_WoWLAN = R92CFwImageFileName_TSMC_WW;
  71941. + FwImageWoWLAN= Rtl8192C_FwTSMCWWImageArray;
  71942. + FwImageWoWLANLen =TSMCWWImgArrayLength ;
  71943. +#endif //CONFIG_WOWLAN
  71944. + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_TSMC\n");
  71945. + }
  71946. +
  71947. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:%s\n", pFwImageFileName));
  71948. +
  71949. + #ifdef CONFIG_FILE_FWIMG
  71950. + if(rtw_is_file_readable(rtw_fw_file_path) == _TRUE)
  71951. + {
  71952. + DBG_871X("%s accquire FW from file:%s\n", __FUNCTION__, rtw_fw_file_path);
  71953. + pFirmware->eFWSource = FW_SOURCE_IMG_FILE; // We should decided by Reg.
  71954. + }
  71955. + else
  71956. + #endif //CONFIG_FILE_FWIMG
  71957. + {
  71958. + DBG_871X("%s accquire FW from embedded image\n", __FUNCTION__);
  71959. + pFirmware->eFWSource = FW_SOURCE_HEADER_FILE;
  71960. + }
  71961. +
  71962. +
  71963. + switch(pFirmware->eFWSource)
  71964. + {
  71965. + case FW_SOURCE_IMG_FILE:
  71966. +
  71967. + #ifdef CONFIG_FILE_FWIMG
  71968. + rtStatus = rtw_retrive_from_file(rtw_fw_file_path, FwBuffer8192C, FW_8192C_SIZE);
  71969. + pFirmware->ulFwLength = rtStatus>=0?rtStatus:0;
  71970. + pFirmware->szFwBuffer = FwBuffer8192C;
  71971. + #endif //CONFIG_FILE_FWIMG
  71972. +
  71973. + if(pFirmware->ulFwLength <= 0)
  71974. + {
  71975. + rtStatus = _FAIL;
  71976. + goto Exit;
  71977. + }
  71978. + break;
  71979. + case FW_SOURCE_HEADER_FILE:
  71980. + if(FwImageLen > FW_8192C_SIZE){
  71981. + rtStatus = _FAIL;
  71982. + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE) );
  71983. + DBG_871X("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE);
  71984. + goto Exit;
  71985. + }
  71986. +
  71987. + pFirmware->szFwBuffer = FwImage;
  71988. + pFirmware->ulFwLength = FwImageLen;
  71989. +#ifdef CONFIG_WOWLAN
  71990. + {
  71991. + pFirmware->szWoWLANFwBuffer=FwImageWoWLAN;
  71992. + pFirmware->ulWoWLANFwLength = FwImageWoWLANLen;
  71993. + }
  71994. +#endif //CONFIG_WOWLAN
  71995. +
  71996. + break;
  71997. + }
  71998. +
  71999. +#ifdef CONFIG_WOWLAN
  72000. + if(bUsedWoWLANFw) {
  72001. + pFirmwareBuf = pFirmware->szWoWLANFwBuffer;
  72002. + FirmwareLen = pFirmware->ulWoWLANFwLength;
  72003. + pFwHdr = (PRT_8192C_FIRMWARE_HDR)pFirmware->szWoWLANFwBuffer;
  72004. + }
  72005. + else
  72006. +#endif //CONFIG_WOWLAN
  72007. + {
  72008. + #ifdef DBG_FW_STORE_FILE_PATH //used to store firmware to file...
  72009. + if(pFirmware->ulFwLength > 0)
  72010. + {
  72011. + rtw_store_to_file(DBG_FW_STORE_FILE_PATH, pFirmware->szFwBuffer, pFirmware->ulFwLength);
  72012. + }
  72013. + #endif
  72014. +
  72015. + pFirmwareBuf = pFirmware->szFwBuffer;
  72016. + FirmwareLen = pFirmware->ulFwLength;
  72017. +
  72018. + // To Check Fw header. Added by tynli. 2009.12.04.
  72019. + pFwHdr = (PRT_8192C_FIRMWARE_HDR)pFirmware->szFwBuffer;
  72020. + }
  72021. + pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version);
  72022. + pHalData->FirmwareSubVersion = le16_to_cpu(pFwHdr->Subversion);
  72023. +
  72024. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" FirmwareVersion(%#x), Signature(%#x)\n",
  72025. + // Adapter->MgntInfo.FirmwareVersion, pFwHdr->Signature));
  72026. +
  72027. + DBG_8192C("fw_ver=v%d, fw_subver=%d, sig=0x%x\n",
  72028. + pHalData->FirmwareVersion, pHalData->FirmwareSubVersion, le16_to_cpu(pFwHdr->Signature)&0xFFF0);
  72029. +
  72030. + if(IS_FW_HEADER_EXIST(pFwHdr))
  72031. + {
  72032. + //RT_TRACE(COMP_INIT, DBG_LOUD,("Shift 32 bytes for FW header!!\n"));
  72033. + pFirmwareBuf = pFirmwareBuf + 32;
  72034. + FirmwareLen = FirmwareLen -32;
  72035. + }
  72036. +
  72037. + // Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself,
  72038. + // or it will cause download Fw fail. 2010.02.01. by tynli.
  72039. + if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) //8051 RAM code
  72040. + {
  72041. + rtl8192c_FirmwareSelfReset(Adapter);
  72042. + rtw_write8(Adapter, REG_MCUFWDL, 0x00);
  72043. + }
  72044. +
  72045. +
  72046. + _FWDownloadEnable(Adapter, _TRUE);
  72047. + while(1) {
  72048. + u8 tmp8;
  72049. + tmp8 = rtw_read8(Adapter, REG_MCUFWDL);
  72050. +
  72051. + //reset the FWDL chksum
  72052. + rtw_write8(Adapter, REG_MCUFWDL, tmp8|FWDL_ChkSum_rpt);
  72053. +
  72054. + //tmp8 = rtw_read8(Adapter, REG_MCUFWDL);
  72055. + //DBG_8192C("Before _WriteFW, REG_MCUFWDL:0x%02x, writeFW_retry:%u\n", tmp8, writeFW_retry);
  72056. +
  72057. + rtStatus = _WriteFW(Adapter, pFirmwareBuf, FirmwareLen);
  72058. +
  72059. + //tmp8 = rtw_read8(Adapter, REG_MCUFWDL);
  72060. + //DBG_8192C("After _WriteFW, REG_MCUFWDL:0x%02x, rtStatus:%d\n", tmp8, rtStatus);
  72061. +
  72062. + if(rtStatus == _SUCCESS || ++writeFW_retry>3)
  72063. + break;
  72064. + }
  72065. + _FWDownloadEnable(Adapter, _FALSE);
  72066. +
  72067. + if(_SUCCESS != rtStatus){
  72068. + DBG_8192C("DL Firmware failed!\n");
  72069. + goto Exit;
  72070. + }
  72071. +
  72072. + rtStatus = _FWFreeToGo(Adapter);
  72073. + if(_SUCCESS != rtStatus){
  72074. + DBG_8192C("DL Firmware failed!\n");
  72075. + goto Exit;
  72076. + }
  72077. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" Firmware is ready to run!\n"));
  72078. +
  72079. +Exit:
  72080. +
  72081. + if(pFirmware) {
  72082. + rtw_vmfree((u8*)pFirmware, sizeof(RT_FIRMWARE_92C));
  72083. + }
  72084. +
  72085. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" <=== FirmwareDownload91C()\n"));
  72086. + return rtStatus;
  72087. +
  72088. +}
  72089. +
  72090. +VOID
  72091. +InitializeFirmwareVars92C(
  72092. + IN PADAPTER Adapter
  72093. +)
  72094. +{
  72095. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  72096. +
  72097. + // Init Fw LPS related.
  72098. + Adapter->pwrctrlpriv.bFwCurrentInPSMode = _FALSE;
  72099. +
  72100. + //Init H2C counter. by tynli. 2009.12.09.
  72101. + pHalData->LastHMEBoxNum = 0;
  72102. +}
  72103. +
  72104. +#ifdef CONFIG_WOWLAN
  72105. +//===========================================
  72106. +
  72107. +//
  72108. +// Description: Prepare some information to Fw for WoWLAN.
  72109. +// (1) Download wowlan Fw.
  72110. +// (2) Download RSVD page packets.
  72111. +// (3) Enable AP offload if needed.
  72112. +//
  72113. +// 2011.04.12 by tynli.
  72114. +//
  72115. +VOID
  72116. +SetFwRelatedForWoWLAN8192CU(
  72117. + IN PADAPTER padapter,
  72118. + IN u8 bHostIsGoingtoSleep
  72119. +)
  72120. +{
  72121. + int status=_FAIL;
  72122. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  72123. + u8 bRecover = _FALSE;
  72124. +
  72125. + if(bHostIsGoingtoSleep)
  72126. + {
  72127. + //
  72128. + // 1. Before WoWLAN we need to re-download WoWLAN Fw.
  72129. + //
  72130. + status = FirmwareDownload92C(padapter, bHostIsGoingtoSleep);
  72131. + if(status != _SUCCESS)
  72132. + {
  72133. + DBG_8192C("ConfigFwRelatedForWoWLAN8192CU(): Re-Download Firmware failed!!\n");
  72134. + return;
  72135. + }
  72136. + else
  72137. + {
  72138. + DBG_8192C("ConfigFwRelatedForWoWLAN8192CU(): Re-Download Firmware Success !!\n");
  72139. + }
  72140. +
  72141. + //
  72142. + // 2. Re-Init the variables about Fw related setting.
  72143. + //
  72144. + InitializeFirmwareVars92C(padapter);
  72145. +
  72146. +
  72147. + }
  72148. +}
  72149. +#endif // CONFIG_WOWLAN
  72150. +
  72151. +#ifdef CONFIG_BT_COEXIST
  72152. +static void _update_bt_param(_adapter *padapter)
  72153. +{
  72154. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  72155. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  72156. + struct registry_priv *registry_par = &padapter->registrypriv;
  72157. +
  72158. + if(2 != registry_par->bt_iso)
  72159. + pbtpriv->BT_Ant_isolation = registry_par->bt_iso;// 0:Low, 1:High, 2:From Efuse
  72160. +
  72161. + if(registry_par->bt_sco == 1) // 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy
  72162. + pbtpriv->BT_Service = BT_OtherAction;
  72163. + else if(registry_par->bt_sco==2)
  72164. + pbtpriv->BT_Service = BT_SCO;
  72165. + else if(registry_par->bt_sco==4)
  72166. + pbtpriv->BT_Service = BT_Busy;
  72167. + else if(registry_par->bt_sco==5)
  72168. + pbtpriv->BT_Service = BT_OtherBusy;
  72169. + else
  72170. + pbtpriv->BT_Service = BT_Idle;
  72171. +
  72172. + pbtpriv->BT_Ampdu = registry_par->bt_ampdu;
  72173. + pbtpriv->bCOBT = _TRUE;
  72174. +#if 1
  72175. + DBG_8192C("BT Coexistance = %s\n", (pbtpriv->BT_Coexist==_TRUE)?"enable":"disable");
  72176. + if(pbtpriv->BT_Coexist)
  72177. + {
  72178. + if(pbtpriv->BT_Ant_Num == Ant_x2)
  72179. + {
  72180. + DBG_8192C("BlueTooth BT_Ant_Num = Antx2\n");
  72181. + }
  72182. + else if(pbtpriv->BT_Ant_Num == Ant_x1)
  72183. + {
  72184. + DBG_8192C("BlueTooth BT_Ant_Num = Antx1\n");
  72185. + }
  72186. + switch(pbtpriv->BT_CoexistType)
  72187. + {
  72188. + case BT_2Wire:
  72189. + DBG_8192C("BlueTooth BT_CoexistType = BT_2Wire\n");
  72190. + break;
  72191. + case BT_ISSC_3Wire:
  72192. + DBG_8192C("BlueTooth BT_CoexistType = BT_ISSC_3Wire\n");
  72193. + break;
  72194. + case BT_Accel:
  72195. + DBG_8192C("BlueTooth BT_CoexistType = BT_Accel\n");
  72196. + break;
  72197. + case BT_CSR_BC4:
  72198. + DBG_8192C("BlueTooth BT_CoexistType = BT_CSR_BC4\n");
  72199. + break;
  72200. + case BT_RTL8756:
  72201. + DBG_8192C("BlueTooth BT_CoexistType = BT_RTL8756\n");
  72202. + break;
  72203. + default:
  72204. + DBG_8192C("BlueTooth BT_CoexistType = Unknown\n");
  72205. + break;
  72206. + }
  72207. + DBG_8192C("BlueTooth BT_Ant_isolation = %d\n", pbtpriv->BT_Ant_isolation);
  72208. +
  72209. +
  72210. + switch(pbtpriv->BT_Service)
  72211. + {
  72212. + case BT_OtherAction:
  72213. + DBG_8192C("BlueTooth BT_Service = BT_OtherAction\n");
  72214. + break;
  72215. + case BT_SCO:
  72216. + DBG_8192C("BlueTooth BT_Service = BT_SCO\n");
  72217. + break;
  72218. + case BT_Busy:
  72219. + DBG_8192C("BlueTooth BT_Service = BT_Busy\n");
  72220. + break;
  72221. + case BT_OtherBusy:
  72222. + DBG_8192C("BlueTooth BT_Service = BT_OtherBusy\n");
  72223. + break;
  72224. + default:
  72225. + DBG_8192C("BlueTooth BT_Service = BT_Idle\n");
  72226. + break;
  72227. + }
  72228. +
  72229. + DBG_8192C("BT_RadioSharedType = 0x%x\n", pbtpriv->BT_RadioSharedType);
  72230. + }
  72231. +#endif
  72232. +
  72233. +}
  72234. +
  72235. +
  72236. +#define GET_BT_COEXIST(priv) (&priv->bt_coexist)
  72237. +
  72238. +void rtl8192c_ReadBluetoothCoexistInfo(
  72239. + IN PADAPTER Adapter,
  72240. + IN u8* PROMContent,
  72241. + IN BOOLEAN AutoloadFail
  72242. + )
  72243. +{
  72244. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  72245. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  72246. + u8 rf_opt4;
  72247. +
  72248. + if(AutoloadFail){
  72249. + pbtpriv->BT_Coexist = _FALSE;
  72250. + pbtpriv->BT_CoexistType= BT_2Wire;
  72251. + pbtpriv->BT_Ant_Num = Ant_x2;
  72252. + pbtpriv->BT_Ant_isolation= 0;
  72253. + pbtpriv->BT_RadioSharedType = BT_Radio_Shared;
  72254. + return;
  72255. + }
  72256. +
  72257. + pbtpriv->BT_Coexist = (((PROMContent[EEPROM_RF_OPT1]&BOARD_TYPE_NORMAL_MASK)>>5) == BOARD_USB_COMBO)?_TRUE:_FALSE; // bit [7:5]
  72258. + rf_opt4 = PROMContent[EEPROM_RF_OPT4];
  72259. + pbtpriv->BT_CoexistType = ((rf_opt4&0xe)>>1); // bit [3:1]
  72260. + pbtpriv->BT_Ant_Num = (rf_opt4&0x1); // bit [0]
  72261. + pbtpriv->BT_Ant_isolation = ((rf_opt4&0x10)>>4); // bit [4]
  72262. + pbtpriv->BT_RadioSharedType = ((rf_opt4&0x20)>>5); // bit [5]
  72263. +
  72264. + _update_bt_param(Adapter);
  72265. +
  72266. +}
  72267. +#endif
  72268. +
  72269. +VERSION_8192C
  72270. +rtl8192c_ReadChipVersion(
  72271. + IN PADAPTER Adapter
  72272. + )
  72273. +{
  72274. + u32 value32;
  72275. + //VERSION_8192C version;
  72276. + u32 ChipVersion=0;
  72277. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  72278. +
  72279. + value32 = rtw_read32(Adapter, REG_SYS_CFG);
  72280. +
  72281. + if (value32 & TRP_VAUX_EN)
  72282. + {
  72283. +#if 0
  72284. + // Test chip.
  72285. + if(IS_HARDWARE_TYPE_8723A(Adapter)) {
  72286. + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0);
  72287. + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function.
  72288. + }
  72289. + else {
  72290. + version = (value32 & TYPE_ID) ?VERSION_TEST_CHIP_92C :VERSION_TEST_CHIP_88C;
  72291. + }
  72292. +#else
  72293. + // tynli_test. 2011.01.10.
  72294. + if(IS_HARDWARE_TYPE_8192C(Adapter))
  72295. + {
  72296. + ChipVersion = (value32 & TYPE_ID) ? VERSION_TEST_CHIP_92C : VERSION_TEST_CHIP_88C;
  72297. + }
  72298. + else
  72299. + {
  72300. + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0);
  72301. + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function.
  72302. + }
  72303. +#endif
  72304. + }
  72305. + else
  72306. + {
  72307. +#if 0
  72308. + // Normal mass production chip.
  72309. + ChipVersion = NORMAL_CHIP;
  72310. +#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION
  72311. + ChipVersion |= ((value32 & TYPE_ID) ? CHIP_92C : 0);
  72312. +#endif
  72313. + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0);
  72314. + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function.
  72315. + if(IS_8723_SERIES(ChipVersion))
  72316. + {
  72317. + if(IS_VENDOR_UMC(ChipVersion))
  72318. + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) ? CHIP_VENDOR_UMC_B_CUT : 0);
  72319. + }
  72320. + else
  72321. + {
  72322. + // Mark out by tynli. UMC B-cut IC will not set the SYS_CFG[19] to UMC
  72323. + // because we do not want the custmor to know. 2011.01.11.
  72324. + //if(IS_VENDOR_UMC(ChipVersion))
  72325. + {
  72326. + // To check the value of B-cut. by tynli. 2011.01.11.
  72327. + u1bTmp = (u1Byte)((value32 & CHIP_VER_RTL_MASK)>>12);
  72328. + if(u1bTmp == 1)
  72329. + { // B-cut
  72330. + ChipVersion |= CHIP_VENDOR_UMC_B_CUT;
  72331. + }
  72332. + }
  72333. + }
  72334. +#else
  72335. + // Normal mass production chip.
  72336. + ChipVersion = NORMAL_CHIP;
  72337. +//#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION
  72338. + ChipVersion |= ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0); //92c
  72339. +//#endif
  72340. + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0);
  72341. + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function.
  72342. + if(IS_HARDWARE_TYPE_8192C(Adapter))
  72343. + {
  72344. + // 88/92C UMC B-cut IC will not set the SYS_CFG[19] to UMC
  72345. + // because we do not want the custmor to know. by tynli. 2011.01.17.
  72346. + //MSG_8192C("mask result = 0x%x is_UMC %d chipversion 0x%x\n", (value32 & CHIP_VER_RTL_MASK), IS_CHIP_VENDOR_UMC(ChipVersion), ChipVersion);
  72347. + if((!IS_CHIP_VENDOR_UMC(ChipVersion) )&& (value32 & CHIP_VER_RTL_MASK))
  72348. + {
  72349. + //MSG_8192C("chip mask result = 0x%x\n", ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC));
  72350. + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC); // IC version (CUT)
  72351. + //MSG_8192C("chip version = 0x%x\n", ChipVersion);
  72352. + }
  72353. + }
  72354. + else
  72355. + {
  72356. + if(IS_CHIP_VENDOR_UMC(ChipVersion))
  72357. + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK)); // IC version (CUT)
  72358. + }
  72359. +
  72360. + if(IS_92C_SERIAL(ChipVersion))
  72361. + {
  72362. + value32 = rtw_read32(Adapter, REG_HPON_FSM);
  72363. + ChipVersion |= ((CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_92C_1T2R) ? RF_TYPE_1T2R : 0);
  72364. + }
  72365. + else if(IS_8723_SERIES(ChipVersion))
  72366. + {
  72367. + //RT_ASSERT(IS_HARDWARE_TYPE_8723A(Adapter), ("Incorrect chip version!!\n"));
  72368. + value32 = rtw_read32(Adapter, REG_GPIO_OUTSTS);
  72369. + ChipVersion |= ((value32 & RF_RL_ID)>>20); //ROM code version.
  72370. + }
  72371. +#endif
  72372. +
  72373. + }
  72374. +
  72375. + //version = (VERSION_8192C)ChipVersion;
  72376. +
  72377. + // For multi-function consideration. Added by Roger, 2010.10.06.
  72378. + if(IS_8723_SERIES(ChipVersion))
  72379. + {
  72380. + pHalData->MultiFunc = RT_MULTI_FUNC_NONE;
  72381. + value32 = rtw_read32(Adapter, REG_MULTI_FUNC_CTRL);
  72382. + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & WL_FUNC_EN) ? RT_MULTI_FUNC_WIFI : 0) );
  72383. + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & BT_FUNC_EN) ? RT_MULTI_FUNC_BT : 0) );
  72384. + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & GPS_FUNC_EN) ? RT_MULTI_FUNC_GPS : 0) );
  72385. + pHalData->PolarityCtl = ((value32 & WL_HWPDN_SL) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT);
  72386. + //MSG_8192C("ReadChipVersion(): MultiFunc(%x), PolarityCtl(%x) \n", pHalData->MultiFunc, pHalData->PolarityCtl);
  72387. +
  72388. + //For regulator mode. by tynli. 2011.01.14
  72389. + pHalData->RegulatorMode = ((value32 & TRP_BT_EN) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR);
  72390. + //MSG_8192C("ReadChipVersion(): RegulatorMode(%x) \n", pHalData->RegulatorMode);
  72391. + }
  72392. +
  72393. +//#if DBG
  72394. +#if 1
  72395. + switch(ChipVersion)
  72396. + {
  72397. + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R:
  72398. + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C_1T2R.\n");
  72399. + break;
  72400. + case VERSION_NORMAL_TSMC_CHIP_92C:
  72401. + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.\n");
  72402. + break;
  72403. + case VERSION_NORMAL_TSMC_CHIP_88C:
  72404. + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.\n");
  72405. + break;
  72406. + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT:
  72407. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT.\n");
  72408. + break;
  72409. + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT:
  72410. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_A_CUT.\n");
  72411. + break;
  72412. + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT:
  72413. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_A_CUT.\n");
  72414. + break;
  72415. + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT:
  72416. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT.\n");
  72417. + break;
  72418. + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT:
  72419. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_B_CUT.\n");
  72420. + break;
  72421. + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT:
  72422. + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_B_CUT.\n");
  72423. + break;
  72424. + case VERSION_TEST_CHIP_92C:
  72425. + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_92C.\n");
  72426. + break;
  72427. + case VERSION_TEST_CHIP_88C:
  72428. + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_88C.\n");
  72429. + break;
  72430. + case VERSION_TEST_UMC_CHIP_8723:
  72431. + MSG_8192C("Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n");
  72432. + break;
  72433. + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT:
  72434. + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT.\n");
  72435. + break;
  72436. + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT:
  72437. + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT.\n");
  72438. + break;
  72439. + default:
  72440. + MSG_8192C("Chip Version ID: ???????????????.\n");
  72441. + break;
  72442. + }
  72443. +#endif
  72444. +
  72445. + pHalData->VersionID = ChipVersion;
  72446. +
  72447. + if(IS_1T2R(ChipVersion))
  72448. + pHalData->rf_type = RF_1T2R;
  72449. + else if(IS_2T2R(ChipVersion))
  72450. + pHalData->rf_type = RF_2T2R;
  72451. + else if(IS_8723_SERIES(ChipVersion))
  72452. + pHalData->rf_type = RF_1T1R;
  72453. + else
  72454. + pHalData->rf_type = RF_1T1R;
  72455. +
  72456. + MSG_8192C("RF_Type is %x!!\n", pHalData->rf_type);
  72457. +
  72458. + return ChipVersion;
  72459. +}
  72460. +
  72461. +void
  72462. +rtl8192c_EfuseParseChnlPlan(
  72463. + IN PADAPTER padapter,
  72464. + IN u8* hwinfo,
  72465. + IN BOOLEAN AutoLoadFail
  72466. + )
  72467. +{
  72468. + padapter->mlmepriv.ChannelPlan = hal_com_get_channel_plan(
  72469. + padapter
  72470. + , hwinfo?hwinfo[EEPROM_CHANNEL_PLAN]:0xFF
  72471. + , padapter->registrypriv.channel_plan
  72472. + , RT_CHANNEL_DOMAIN_WORLD_WIDE_13
  72473. + , AutoLoadFail
  72474. + );
  72475. +
  72476. + DBG_871X("mlmepriv.ChannelPlan = 0x%02x\n", padapter->mlmepriv.ChannelPlan);
  72477. +}
  72478. +
  72479. +u8 GetEEPROMSize8192C(PADAPTER Adapter)
  72480. +{
  72481. + u8 size = 0;
  72482. + u32 curRCR;
  72483. +
  72484. + curRCR = rtw_read16(Adapter, REG_9346CR);
  72485. + size = (curRCR & BOOT_FROM_EEPROM) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse.
  72486. +
  72487. + MSG_8192C("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46");
  72488. +
  72489. + return size;
  72490. +}
  72491. +
  72492. +void rtl8192c_free_hal_data(_adapter * padapter)
  72493. +{
  72494. +_func_enter_;
  72495. +
  72496. + DBG_8192C("=====> rtl8192c_free_hal_data =====\n");
  72497. +
  72498. + if(padapter->HalData)
  72499. + rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE));
  72500. + DBG_8192C("<===== rtl8192c_free_hal_data =====\n");
  72501. +
  72502. +_func_exit_;
  72503. +}
  72504. +
  72505. +//===========================================================
  72506. +// Efuse related code
  72507. +//===========================================================
  72508. +enum{
  72509. + VOLTAGE_V25 = 0x03,
  72510. + LDOE25_SHIFT = 28 ,
  72511. + };
  72512. +
  72513. +static VOID
  72514. +hal_EfusePowerSwitch_RTL8192C(
  72515. + IN PADAPTER pAdapter,
  72516. + IN u8 bWrite,
  72517. + IN u8 PwrState)
  72518. +{
  72519. + u8 tempval;
  72520. + u16 tmpV16;
  72521. +
  72522. + if (PwrState == _TRUE)
  72523. + {
  72524. + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid
  72525. + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL);
  72526. + if( ! (tmpV16 & PWC_EV12V ) ){
  72527. + tmpV16 |= PWC_EV12V ;
  72528. + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16);
  72529. + }
  72530. + // Reset: 0x0000h[28], default valid
  72531. + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN);
  72532. + if( !(tmpV16 & FEN_ELDR) ){
  72533. + tmpV16 |= FEN_ELDR ;
  72534. + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16);
  72535. + }
  72536. +
  72537. + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid
  72538. + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR);
  72539. + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){
  72540. + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ;
  72541. + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16);
  72542. + }
  72543. +
  72544. + if(bWrite == _TRUE)
  72545. + {
  72546. + // Enable LDO 2.5V before read/write action
  72547. + tempval = rtw_read8(pAdapter, EFUSE_TEST+3);
  72548. + tempval &= 0x0F;
  72549. + tempval |= (VOLTAGE_V25 << 4);
  72550. + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80));
  72551. + }
  72552. + }
  72553. + else
  72554. + {
  72555. + if(bWrite == _TRUE){
  72556. + // Disable LDO 2.5V after read/write action
  72557. + tempval = rtw_read8(pAdapter, EFUSE_TEST+3);
  72558. + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F));
  72559. + }
  72560. + }
  72561. +}
  72562. +
  72563. +static VOID
  72564. +hal_EfusePowerSwitch_RTL8723(
  72565. + IN PADAPTER pAdapter,
  72566. + IN u8 bWrite,
  72567. + IN u8 PwrState)
  72568. +{
  72569. + u8 tempval;
  72570. + u16 tmpV16;
  72571. +
  72572. + if (PwrState == _TRUE)
  72573. + {
  72574. + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
  72575. +
  72576. + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid
  72577. + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL);
  72578. + if( ! (tmpV16 & PWC_EV12V ) ){
  72579. + tmpV16 |= PWC_EV12V ;
  72580. + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16);
  72581. + }
  72582. + // Reset: 0x0000h[28], default valid
  72583. + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN);
  72584. + if( !(tmpV16 & FEN_ELDR) ){
  72585. + tmpV16 |= FEN_ELDR ;
  72586. + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16);
  72587. + }
  72588. +
  72589. + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid
  72590. + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR);
  72591. + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){
  72592. + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ;
  72593. + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16);
  72594. + }
  72595. +
  72596. + if(bWrite == _TRUE)
  72597. + {
  72598. + // Enable LDO 2.5V before read/write action
  72599. + tempval = rtw_read8(pAdapter, EFUSE_TEST+3);
  72600. + tempval &= 0x0F;
  72601. + tempval |= (VOLTAGE_V25 << 4);
  72602. + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80));
  72603. + }
  72604. + }
  72605. + else
  72606. + {
  72607. + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
  72608. +
  72609. + if(bWrite == _TRUE){
  72610. + // Disable LDO 2.5V after read/write action
  72611. + tempval = rtw_read8(pAdapter, EFUSE_TEST+3);
  72612. + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F));
  72613. + }
  72614. + }
  72615. +}
  72616. +
  72617. +static VOID
  72618. +rtl8192c_EfusePowerSwitch(
  72619. + IN PADAPTER pAdapter,
  72620. + IN u8 bWrite,
  72621. + IN u8 PwrState)
  72622. +{
  72623. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  72624. + {
  72625. + hal_EfusePowerSwitch_RTL8192C(pAdapter, bWrite, PwrState);
  72626. + }
  72627. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  72628. + {
  72629. + hal_EfusePowerSwitch_RTL8723(pAdapter, bWrite, PwrState);
  72630. + }
  72631. +}
  72632. +
  72633. +static VOID
  72634. +ReadEFuse_RTL8192C(
  72635. + PADAPTER Adapter,
  72636. + u16 _offset,
  72637. + u16 _size_byte,
  72638. + u8 *pbuf,
  72639. + IN BOOLEAN bPseudoTest
  72640. + )
  72641. +{
  72642. + u8 efuseTbl[EFUSE_MAP_LEN];
  72643. + u8 rtemp8[1];
  72644. + u16 eFuse_Addr = 0;
  72645. + u8 offset, wren;
  72646. + u16 i, j;
  72647. + u16 eFuseWord[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT];
  72648. + u16 efuse_utilized = 0;
  72649. + u8 efuse_usage = 0;
  72650. +
  72651. + //
  72652. + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.
  72653. + //
  72654. + if((_offset + _size_byte)>EFUSE_MAP_LEN)
  72655. + {// total E-Fuse table is 128bytes
  72656. + //DBG_8192C("ReadEFuse_RTL8192C(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte);
  72657. + return;
  72658. + }
  72659. +
  72660. + // 0. Refresh efuse init map as all oxFF.
  72661. + for (i = 0; i < EFUSE_MAX_SECTION; i++)
  72662. + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++)
  72663. + eFuseWord[i][j] = 0xFFFF;
  72664. +
  72665. +
  72666. + //
  72667. + // 1. Read the first byte to check if efuse is empty!!!
  72668. + //
  72669. + //
  72670. + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest);
  72671. + if(*rtemp8 != 0xFF)
  72672. + {
  72673. + efuse_utilized++;
  72674. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr));
  72675. + eFuse_Addr++;
  72676. + }
  72677. +
  72678. + //
  72679. + // 2. Read real efuse content. Filter PG header and every section data.
  72680. + //
  72681. + while((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN))
  72682. + {
  72683. + // Check PG header for section num.
  72684. + offset = ((*rtemp8 >> 4) & 0x0f);
  72685. +
  72686. + if(offset < EFUSE_MAX_SECTION)
  72687. + {
  72688. + // Get word enable value from PG header
  72689. + wren = (*rtemp8 & 0x0f);
  72690. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wren));
  72691. +
  72692. + for(i=0; i<EFUSE_MAX_WORD_UNIT; i++)
  72693. + {
  72694. + // Check word enable condition in the section
  72695. + if(!(wren & 0x01))
  72696. + {
  72697. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr));
  72698. + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); eFuse_Addr++;
  72699. + efuse_utilized++;
  72700. + eFuseWord[offset][i] = (*rtemp8 & 0xff);
  72701. +
  72702. +
  72703. + if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN)
  72704. + break;
  72705. +
  72706. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr));
  72707. + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); eFuse_Addr++;
  72708. + efuse_utilized++;
  72709. + eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00);
  72710. +
  72711. + if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN)
  72712. + break;
  72713. + }
  72714. +
  72715. + wren >>= 1;
  72716. +
  72717. + }
  72718. + }
  72719. +
  72720. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr));
  72721. + // Read next PG header
  72722. + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest);
  72723. + if(*rtemp8 != 0xFF && (eFuse_Addr < 512))
  72724. + {
  72725. + efuse_utilized++;
  72726. + eFuse_Addr++;
  72727. + }
  72728. + }
  72729. +
  72730. + //
  72731. + // 3. Collect 16 sections and 4 word unit into Efuse map.
  72732. + //
  72733. + for(i=0; i<EFUSE_MAX_SECTION; i++)
  72734. + {
  72735. + for(j=0; j<EFUSE_MAX_WORD_UNIT; j++)
  72736. + {
  72737. + efuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);
  72738. + efuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);
  72739. + }
  72740. + }
  72741. +
  72742. + //
  72743. + // 4. Copy from Efuse map to output pointer memory!!!
  72744. + //
  72745. + for(i=0; i<_size_byte; i++)
  72746. + {
  72747. + pbuf[i] = efuseTbl[_offset+i];
  72748. + }
  72749. +
  72750. + //
  72751. + // 5. Calculate Efuse utilization.
  72752. + //
  72753. + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN);
  72754. + rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized);
  72755. + //rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage);
  72756. +}
  72757. +
  72758. +static VOID
  72759. +ReadEFuse_RTL8723(
  72760. + PADAPTER Adapter,
  72761. + u16 _offset,
  72762. + u16 _size_byte,
  72763. + u8 *pbuf,
  72764. + IN BOOLEAN bPseudoTest
  72765. + )
  72766. +{
  72767. + u8 efuseTbl[EFUSE_MAP_LEN_8723];
  72768. + u16 eFuse_Addr = 0;
  72769. + u8 offset = 0, wden = 0;
  72770. + u16 i, j;
  72771. + u16 eFuseWord[EFUSE_MAX_SECTION_8723][EFUSE_MAX_WORD_UNIT];
  72772. + u16 efuse_utilized = 0;
  72773. + u8 efuse_usage = 0;
  72774. + u8 offset_2_0=0;
  72775. + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0;
  72776. + //
  72777. + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.
  72778. + //
  72779. + if((_offset + _size_byte)>EFUSE_MAP_LEN_8723)
  72780. + {
  72781. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_RTL8723(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte));
  72782. + return;
  72783. + }
  72784. +
  72785. + // 0. Refresh efuse init map as all oxFF.
  72786. + for (i = 0; i < EFUSE_MAX_SECTION_8723; i++)
  72787. + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++)
  72788. + eFuseWord[i][j] = 0xFFFF;
  72789. +
  72790. + //
  72791. + // 1. Read the first byte to check if efuse is empty!!!
  72792. + //
  72793. + //
  72794. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  72795. +
  72796. + if(efuseHeader != 0xFF)
  72797. + {
  72798. + efuse_utilized++;
  72799. + }
  72800. + else
  72801. + {
  72802. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty\n"));
  72803. + return;
  72804. + }
  72805. +
  72806. +
  72807. + //
  72808. + // 2. Read real efuse content. Filter PG header and every section data.
  72809. + //
  72810. + while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  72811. + {
  72812. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseHeader));
  72813. +
  72814. + // Check PG header for section num.
  72815. + if(EXT_HEADER(efuseHeader)) //extended header
  72816. + {
  72817. + offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader);
  72818. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%x\n", offset_2_0));
  72819. +
  72820. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest);
  72821. +
  72822. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseExtHdr));
  72823. +
  72824. + if(efuseExtHdr != 0xff)
  72825. + {
  72826. + efuse_utilized++;
  72827. + if(ALL_WORDS_DISABLED(efuseExtHdr))
  72828. + {
  72829. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  72830. + if(efuseHeader != 0xff)
  72831. + {
  72832. + efuse_utilized++;
  72833. + }
  72834. + continue;
  72835. + }
  72836. + else
  72837. + {
  72838. + offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0;
  72839. + wden = (efuseExtHdr & 0x0F);
  72840. + }
  72841. + }
  72842. + else
  72843. + {
  72844. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n"));
  72845. + // We should handle this condition.
  72846. + }
  72847. + }
  72848. + else
  72849. + {
  72850. + offset = ((efuseHeader >> 4) & 0x0f);
  72851. + wden = (efuseHeader & 0x0f);
  72852. + }
  72853. +
  72854. + if(offset < EFUSE_MAX_SECTION_8723)
  72855. + {
  72856. + // Get word enable value from PG header
  72857. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden));
  72858. +
  72859. + for(i=0; i<EFUSE_MAX_WORD_UNIT; i++)
  72860. + {
  72861. + // Check word enable condition in the section
  72862. + if(!(wden & (0x01<<i)))
  72863. + {
  72864. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);
  72865. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseData));
  72866. + efuse_utilized++;
  72867. + eFuseWord[offset][i] = (efuseData & 0xff);
  72868. +
  72869. + if(!AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  72870. + break;
  72871. +
  72872. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);
  72873. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseData));
  72874. + efuse_utilized++;
  72875. + eFuseWord[offset][i] |= (((u16)efuseData << 8) & 0xff00);
  72876. +
  72877. + if(!AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  72878. + break;
  72879. + }
  72880. + }
  72881. + }
  72882. +
  72883. + // Read next PG header
  72884. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  72885. +
  72886. + if(efuseHeader != 0xFF)
  72887. + {
  72888. + efuse_utilized++;
  72889. + }
  72890. + }
  72891. +
  72892. + //
  72893. + // 3. Collect 16 sections and 4 word unit into Efuse map.
  72894. + //
  72895. + for(i=0; i<EFUSE_MAX_SECTION_8723; i++)
  72896. + {
  72897. + for(j=0; j<EFUSE_MAX_WORD_UNIT; j++)
  72898. + {
  72899. + efuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);
  72900. + efuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);
  72901. + }
  72902. + }
  72903. +
  72904. + //
  72905. + // 4. Copy from Efuse map to output pointer memory!!!
  72906. + //
  72907. + for(i=0; i<_size_byte; i++)
  72908. + {
  72909. + pbuf[i] = efuseTbl[_offset+i];
  72910. + }
  72911. +
  72912. + //
  72913. + // 5. Calculate Efuse utilization.
  72914. + //
  72915. + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN);
  72916. + rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized);
  72917. + //rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage);
  72918. +}
  72919. +
  72920. +static BOOLEAN
  72921. +Hal_EfuseSwitchToBank(
  72922. + IN PADAPTER pAdapter,
  72923. + IN u8 bank,
  72924. + IN BOOLEAN bPseudoTest
  72925. + )
  72926. +{
  72927. + BOOLEAN bRet = _FALSE;
  72928. + u32 value32=0;
  72929. +
  72930. + //RTPRINT(FEEPROM, EFUSE_PG, ("Efuse switch bank to %d\n", bank));
  72931. + if(bPseudoTest)
  72932. + {
  72933. + fakeEfuseBank = bank;
  72934. + bRet = _TRUE;
  72935. + }
  72936. + else
  72937. + {
  72938. + if(IS_HARDWARE_TYPE_8723A(pAdapter) &&
  72939. + INCLUDE_MULTI_FUNC_BT(pAdapter))
  72940. + {
  72941. + value32 = rtw_read32(pAdapter, EFUSE_TEST);
  72942. + bRet = _TRUE;
  72943. + switch(bank)
  72944. + {
  72945. + case 0:
  72946. + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
  72947. + break;
  72948. + case 1:
  72949. + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_0);
  72950. + break;
  72951. + case 2:
  72952. + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_1);
  72953. + break;
  72954. + case 3:
  72955. + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_2);
  72956. + break;
  72957. + default:
  72958. + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
  72959. + bRet = _FALSE;
  72960. + break;
  72961. + }
  72962. + rtw_write32(pAdapter, EFUSE_TEST, value32);
  72963. + }
  72964. + else
  72965. + bRet = _TRUE;
  72966. + }
  72967. + return bRet;
  72968. +}
  72969. +
  72970. +static VOID
  72971. +ReadEFuse_BT(
  72972. + PADAPTER Adapter,
  72973. + u16 _offset,
  72974. + u16 _size_byte,
  72975. + u8 *pbuf,
  72976. + IN BOOLEAN bPseudoTest
  72977. + )
  72978. +{
  72979. + u8 *efuseTbl;
  72980. + u16 eFuse_Addr = 0;
  72981. + u8 offset = 0, wden = 0;
  72982. + u16 i, j;
  72983. + u16 **eFuseWord;
  72984. + u16 efuse_utilized = 0;
  72985. + u8 efuse_usage = 0;
  72986. + u8 offset_2_0=0;
  72987. + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0;
  72988. + u8 bank=0;
  72989. + BOOLEAN bCheckNextBank=_FALSE;
  72990. +
  72991. + efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN);
  72992. + if(efuseTbl == NULL){
  72993. + DBG_8192C("efuseTbl malloc fail !\n");
  72994. + return;
  72995. + }
  72996. +
  72997. + eFuseWord = (u16 **)rtw_zmalloc(sizeof(u16 *)*EFUSE_BT_MAX_SECTION);
  72998. + if(eFuseWord == NULL){
  72999. + DBG_8192C("eFuseWord malloc fail !\n");
  73000. + return;
  73001. + }
  73002. + else{
  73003. + for(i=0;i<EFUSE_BT_MAX_SECTION;i++){
  73004. + eFuseWord[i]= (u16 *)rtw_zmalloc(sizeof(u16)*EFUSE_MAX_WORD_UNIT);
  73005. + if(eFuseWord[i]==NULL){
  73006. + DBG_8192C("eFuseWord[] malloc fail !\n");
  73007. + return;
  73008. + }
  73009. + }
  73010. + }
  73011. +
  73012. + //
  73013. + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.
  73014. + //
  73015. + if((_offset + _size_byte)>EFUSE_BT_MAP_LEN)
  73016. + {
  73017. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_BT(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte));
  73018. + return;
  73019. + }
  73020. +
  73021. + // 0. Refresh efuse init map as all oxFF.
  73022. + for (i = 0; i < EFUSE_BT_MAX_SECTION; i++)
  73023. + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++)
  73024. + eFuseWord[i][j] = 0xFFFF;
  73025. +
  73026. + for(bank=1; bank<EFUSE_MAX_BANK; bank++)
  73027. + {
  73028. + if(!Hal_EfuseSwitchToBank(Adapter, bank, bPseudoTest))
  73029. + {
  73030. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Hal_EfuseSwitchToBank() Fail!!\n"));
  73031. + return;
  73032. + }
  73033. + eFuse_Addr = 0;
  73034. + //
  73035. + // 1. Read the first byte to check if efuse is empty!!!
  73036. + //
  73037. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  73038. +
  73039. + if(efuseHeader != 0xFF)
  73040. + {
  73041. + efuse_utilized++;
  73042. + }
  73043. + else
  73044. + {
  73045. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty\n"));
  73046. + return;
  73047. + }
  73048. + //
  73049. + // 2. Read real efuse content. Filter PG header and every section data.
  73050. + //
  73051. + while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  73052. + {
  73053. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=0x%02x (header)\n", (((bank-1)*EFUSE_REAL_CONTENT_LEN)+eFuse_Addr-1), efuseHeader));
  73054. +
  73055. + // Check PG header for section num.
  73056. + if(EXT_HEADER(efuseHeader)) //extended header
  73057. + {
  73058. + offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader);
  73059. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%x\n", offset_2_0));
  73060. +
  73061. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest);
  73062. +
  73063. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=0x%02x (ext header)\n", (((bank-1)*EFUSE_REAL_CONTENT_LEN)+eFuse_Addr-1), efuseExtHdr));
  73064. +
  73065. + if(efuseExtHdr != 0xff)
  73066. + {
  73067. + efuse_utilized++;
  73068. + if(ALL_WORDS_DISABLED(efuseExtHdr))
  73069. + {
  73070. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  73071. + if(efuseHeader != 0xff)
  73072. + {
  73073. + efuse_utilized++;
  73074. + }
  73075. + continue;
  73076. + }
  73077. + else
  73078. + {
  73079. + offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0;
  73080. + wden = (efuseExtHdr & 0x0F);
  73081. + }
  73082. + }
  73083. + else
  73084. + {
  73085. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n"));
  73086. + // We should handle this condition.
  73087. + }
  73088. + }
  73089. + else
  73090. + {
  73091. + offset = ((efuseHeader >> 4) & 0x0f);
  73092. + wden = (efuseHeader & 0x0f);
  73093. + }
  73094. +
  73095. + if(offset < EFUSE_BT_MAX_SECTION)
  73096. + {
  73097. + // Get word enable value from PG header
  73098. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden));
  73099. +
  73100. + for(i=0; i<EFUSE_MAX_WORD_UNIT; i++)
  73101. + {
  73102. + // Check word enable condition in the section
  73103. + if(!(wden & (0x01<<i)))
  73104. + {
  73105. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);
  73106. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=0x%02x\n", (((bank-1)*EFUSE_REAL_CONTENT_LEN)+eFuse_Addr-1), efuseData));
  73107. + efuse_utilized++;
  73108. + eFuseWord[offset][i] = (efuseData & 0xff);
  73109. +
  73110. + if(!AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  73111. + break;
  73112. +
  73113. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);
  73114. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=0x%02x\n", (((bank-1)*EFUSE_REAL_CONTENT_LEN)+eFuse_Addr-1), efuseData));
  73115. + efuse_utilized++;
  73116. + eFuseWord[offset][i] |= (((u16)efuseData << 8) & 0xff00);
  73117. +
  73118. + if(!AVAILABLE_EFUSE_ADDR(eFuse_Addr))
  73119. + break;
  73120. + }
  73121. + }
  73122. + }
  73123. +
  73124. + // Read next PG header
  73125. + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
  73126. +
  73127. + if(efuseHeader != 0xFF)
  73128. + {
  73129. + efuse_utilized++;
  73130. + }
  73131. + else
  73132. + {
  73133. + if((eFuse_Addr + EFUSE_PROTECT_BYTES_BANK) >= EFUSE_REAL_CONTENT_LEN)
  73134. + bCheckNextBank = _TRUE;
  73135. + else
  73136. + bCheckNextBank = _FALSE;
  73137. + }
  73138. + }
  73139. + if(!bCheckNextBank)
  73140. + {
  73141. + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Stop to check next bank\n"));
  73142. + break;
  73143. + }
  73144. + }
  73145. +
  73146. + // switch bank back to bank 0 for later BT and wifi use.
  73147. + Hal_EfuseSwitchToBank(Adapter, 0, bPseudoTest);
  73148. +
  73149. + //
  73150. + // 3. Collect 16 sections and 4 word unit into Efuse map.
  73151. + //
  73152. + for(i=0; i<EFUSE_BT_MAX_SECTION; i++)
  73153. + {
  73154. + for(j=0; j<EFUSE_MAX_WORD_UNIT; j++)
  73155. + {
  73156. + efuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);
  73157. + efuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);
  73158. + }
  73159. + }
  73160. +
  73161. + //
  73162. + // 4. Copy from Efuse map to output pointer memory!!!
  73163. + //
  73164. + for(i=0; i<_size_byte; i++)
  73165. + {
  73166. + pbuf[i] = efuseTbl[_offset+i];
  73167. + }
  73168. +
  73169. + //
  73170. + // 5. Calculate Efuse utilization.
  73171. + //
  73172. + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_BT_REAL_CONTENT_LEN);
  73173. + if(bPseudoTest)
  73174. + {
  73175. + fakeBTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1;
  73176. + }
  73177. + else
  73178. + {
  73179. + BTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1;
  73180. + }
  73181. +
  73182. + for(i=0;i<EFUSE_BT_MAX_SECTION;i++)
  73183. + rtw_mfree((u8 *)eFuseWord[i], sizeof(u16)*EFUSE_MAX_WORD_UNIT);
  73184. + rtw_mfree((u8 *)eFuseWord, sizeof(u16 *)*EFUSE_BT_MAX_SECTION);
  73185. + rtw_mfree(efuseTbl, EFUSE_BT_MAP_LEN);
  73186. +}
  73187. +
  73188. +
  73189. +static VOID
  73190. +ReadEFuseByIC(
  73191. + PADAPTER Adapter,
  73192. + u8 efuseType,
  73193. + u16 _offset,
  73194. + u16 _size_byte,
  73195. + u8 *pbuf,
  73196. + IN BOOLEAN bPseudoTest
  73197. + )
  73198. +{
  73199. + if(efuseType == EFUSE_WIFI)
  73200. + {
  73201. + if(IS_HARDWARE_TYPE_8192C(Adapter))
  73202. + {
  73203. + ReadEFuse_RTL8192C(Adapter, _offset, _size_byte, pbuf, bPseudoTest);
  73204. + }
  73205. + else if(IS_HARDWARE_TYPE_8723A(Adapter))
  73206. + {
  73207. + ReadEFuse_RTL8723(Adapter, _offset, _size_byte, pbuf, bPseudoTest);
  73208. + }
  73209. + }
  73210. + else
  73211. + ReadEFuse_BT(Adapter, _offset, _size_byte, pbuf, bPseudoTest);
  73212. +}
  73213. +
  73214. +static VOID
  73215. +ReadEFuse_Pseudo(
  73216. + PADAPTER Adapter,
  73217. + u8 efuseType,
  73218. + u16 _offset,
  73219. + u16 _size_byte,
  73220. + u8 *pbuf,
  73221. + IN BOOLEAN bPseudoTest
  73222. + )
  73223. +{
  73224. + if(efuseType == EFUSE_WIFI)
  73225. + ReadEFuse_RTL8723(Adapter, _offset, _size_byte, pbuf, bPseudoTest);
  73226. + else
  73227. + ReadEFuse_BT(Adapter, _offset, _size_byte, pbuf, bPseudoTest);
  73228. +}
  73229. +
  73230. +static VOID
  73231. +rtl8192c_ReadEFuse(
  73232. + PADAPTER Adapter,
  73233. + u8 efuseType,
  73234. + u16 _offset,
  73235. + u16 _size_byte,
  73236. + u8 *pbuf,
  73237. + IN BOOLEAN bPseudoTest
  73238. + )
  73239. +{
  73240. + if(bPseudoTest)
  73241. + {
  73242. + ReadEFuse_Pseudo(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
  73243. + }
  73244. + else
  73245. + {
  73246. + ReadEFuseByIC(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
  73247. + }
  73248. +}
  73249. +
  73250. +static VOID
  73251. +Hal_EFUSEGetEfuseDefinition(
  73252. + IN PADAPTER pAdapter,
  73253. + IN u8 efuseType,
  73254. + IN u8 type,
  73255. + OUT PVOID *pOut
  73256. + )
  73257. +{
  73258. + switch(type)
  73259. + {
  73260. + case TYPE_EFUSE_MAX_SECTION:
  73261. + {
  73262. + u8 *pMax_section;
  73263. + pMax_section = (u8 *)pOut;
  73264. +
  73265. + if(efuseType == EFUSE_WIFI)
  73266. + {
  73267. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  73268. + {
  73269. + *pMax_section = EFUSE_MAX_SECTION;
  73270. + }
  73271. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  73272. + {
  73273. + *pMax_section = EFUSE_MAX_SECTION_8723;
  73274. + }
  73275. + }
  73276. + else
  73277. + *pMax_section = EFUSE_BT_MAX_SECTION;
  73278. + }
  73279. + break;
  73280. + case TYPE_EFUSE_REAL_CONTENT_LEN:
  73281. + {
  73282. + u16 *pu2Tmp;
  73283. + pu2Tmp = (u16 *)pOut;
  73284. + if(efuseType == EFUSE_WIFI)
  73285. + *pu2Tmp = EFUSE_REAL_CONTENT_LEN;
  73286. + else
  73287. + *pu2Tmp = EFUSE_BT_REAL_CONTENT_LEN;
  73288. + }
  73289. + break;
  73290. + case TYPE_AVAILABLE_EFUSE_BYTES_BANK:
  73291. + {
  73292. + u16 *pu2Tmp;
  73293. + pu2Tmp = (u16 *)pOut;
  73294. + if(efuseType == EFUSE_WIFI)
  73295. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES);
  73296. + else
  73297. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK);
  73298. + }
  73299. + break;
  73300. + case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL:
  73301. + {
  73302. + u16 *pu2Tmp;
  73303. + pu2Tmp = (u16 *)pOut;
  73304. + if(efuseType == EFUSE_WIFI)
  73305. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES);
  73306. + else
  73307. + *pu2Tmp = (u16)(EFUSE_BT_REAL_CONTENT_LEN-(EFUSE_PROTECT_BYTES_BANK*3));
  73308. + }
  73309. + break;
  73310. + case TYPE_EFUSE_MAP_LEN:
  73311. + {
  73312. + u16 *pu2Tmp;
  73313. + pu2Tmp = (u16 *)pOut;
  73314. +
  73315. + if(efuseType == EFUSE_WIFI)
  73316. + {
  73317. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  73318. + {
  73319. + *pu2Tmp = (u16)EFUSE_MAP_LEN;
  73320. + }
  73321. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  73322. + {
  73323. + *pu2Tmp = (u16)EFUSE_MAP_LEN_8723;
  73324. + }
  73325. + }
  73326. + else
  73327. + *pu2Tmp = (u16)EFUSE_BT_MAP_LEN;
  73328. + }
  73329. + break;
  73330. + case TYPE_EFUSE_PROTECT_BYTES_BANK:
  73331. + {
  73332. + u8 *pu1Tmp;
  73333. + pu1Tmp = (u8 *)pOut;
  73334. + if(efuseType == EFUSE_WIFI)
  73335. + *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES);
  73336. + else
  73337. + *pu1Tmp = (u8)(EFUSE_PROTECT_BYTES_BANK);
  73338. + }
  73339. + break;
  73340. + default:
  73341. + {
  73342. + u8 *pu1Tmp;
  73343. + pu1Tmp = (u8 *)pOut;
  73344. + *pu1Tmp = 0;
  73345. + }
  73346. + break;
  73347. + }
  73348. +}
  73349. +
  73350. +static VOID
  73351. +Hal_EFUSEGetEfuseDefinition_Pseudo(
  73352. + IN PADAPTER pAdapter,
  73353. + IN u8 efuseType,
  73354. + IN u8 type,
  73355. + OUT PVOID *pOut
  73356. + )
  73357. +{
  73358. + switch(type)
  73359. + {
  73360. + case TYPE_EFUSE_MAX_SECTION:
  73361. + {
  73362. + u8 *pMax_section;
  73363. + pMax_section = (u8 *)pOut;
  73364. + if(efuseType == EFUSE_WIFI)
  73365. + *pMax_section = EFUSE_MAX_SECTION_8723;
  73366. + else
  73367. + *pMax_section = EFUSE_BT_MAX_SECTION;
  73368. + }
  73369. + break;
  73370. + case TYPE_EFUSE_REAL_CONTENT_LEN:
  73371. + {
  73372. + u16 *pu2Tmp;
  73373. + pu2Tmp = (u16 *)pOut;
  73374. + if(efuseType == EFUSE_WIFI)
  73375. + *pu2Tmp = EFUSE_REAL_CONTENT_LEN;
  73376. + else
  73377. + *pu2Tmp = EFUSE_BT_REAL_CONTENT_LEN;
  73378. + }
  73379. + break;
  73380. + case TYPE_AVAILABLE_EFUSE_BYTES_BANK:
  73381. + {
  73382. + u16 *pu2Tmp;
  73383. + pu2Tmp = (u16 *)pOut;
  73384. + if(efuseType == EFUSE_WIFI)
  73385. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES);
  73386. + else
  73387. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK);
  73388. + }
  73389. + break;
  73390. + case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL:
  73391. + {
  73392. + u16 *pu2Tmp;
  73393. + pu2Tmp = (u16 *)pOut;
  73394. + if(efuseType == EFUSE_WIFI)
  73395. + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES);
  73396. + else
  73397. + *pu2Tmp = (u16)(EFUSE_BT_REAL_CONTENT_LEN-(EFUSE_PROTECT_BYTES_BANK*3));
  73398. + }
  73399. + break;
  73400. + case TYPE_EFUSE_MAP_LEN:
  73401. + {
  73402. + u16 *pu2Tmp;
  73403. + pu2Tmp = (u16 *)pOut;
  73404. + if(efuseType == EFUSE_WIFI)
  73405. + *pu2Tmp = (u16)EFUSE_MAP_LEN_8723;
  73406. + else
  73407. + *pu2Tmp = (u16)EFUSE_BT_MAP_LEN;
  73408. + }
  73409. + break;
  73410. + case TYPE_EFUSE_PROTECT_BYTES_BANK:
  73411. + {
  73412. + u8 *pu1Tmp;
  73413. + pu1Tmp = (u8 *)pOut;
  73414. + if(efuseType == EFUSE_WIFI)
  73415. + *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES);
  73416. + else
  73417. + *pu1Tmp = (u8)(EFUSE_PROTECT_BYTES_BANK);
  73418. + }
  73419. + break;
  73420. + default:
  73421. + {
  73422. + u8 *pu1Tmp;
  73423. + pu1Tmp = (u8 *)pOut;
  73424. + *pu1Tmp = 0;
  73425. + }
  73426. + break;
  73427. + }
  73428. +}
  73429. +
  73430. +static VOID
  73431. +rtl8192c_EFUSE_GetEfuseDefinition(
  73432. + IN PADAPTER pAdapter,
  73433. + IN u8 efuseType,
  73434. + IN u8 type,
  73435. + OUT PVOID *pOut,
  73436. + IN BOOLEAN bPseudoTest
  73437. + )
  73438. +{
  73439. + if(bPseudoTest)
  73440. + {
  73441. + Hal_EFUSEGetEfuseDefinition_Pseudo(pAdapter, efuseType, type, pOut);
  73442. + }
  73443. + else
  73444. + {
  73445. + Hal_EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut);
  73446. + }
  73447. +}
  73448. +
  73449. +static u8
  73450. +Hal_EfuseWordEnableDataWrite( IN PADAPTER pAdapter,
  73451. + IN u16 efuse_addr,
  73452. + IN u8 word_en,
  73453. + IN u8 *data,
  73454. + IN BOOLEAN bPseudoTest)
  73455. +{
  73456. + u16 tmpaddr = 0;
  73457. + u16 start_addr = efuse_addr;
  73458. + u8 badworden = 0x0F;
  73459. + u8 tmpdata[8];
  73460. +
  73461. + _rtw_memset((PVOID)tmpdata, 0xff, PGPKT_DATA_SIZE);
  73462. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("word_en = %x efuse_addr=%x\n", word_en, efuse_addr));
  73463. +
  73464. + if(!(word_en&BIT0))
  73465. + {
  73466. + tmpaddr = start_addr;
  73467. + efuse_OneByteWrite(pAdapter,start_addr++, data[0], bPseudoTest);
  73468. + efuse_OneByteWrite(pAdapter,start_addr++, data[1], bPseudoTest);
  73469. +
  73470. + efuse_OneByteRead(pAdapter,tmpaddr, &tmpdata[0], bPseudoTest);
  73471. + efuse_OneByteRead(pAdapter,tmpaddr+1, &tmpdata[1], bPseudoTest);
  73472. + if((data[0]!=tmpdata[0])||(data[1]!=tmpdata[1])){
  73473. + badworden &= (~BIT0);
  73474. + }
  73475. + }
  73476. + if(!(word_en&BIT1))
  73477. + {
  73478. + tmpaddr = start_addr;
  73479. + efuse_OneByteWrite(pAdapter,start_addr++, data[2], bPseudoTest);
  73480. + efuse_OneByteWrite(pAdapter,start_addr++, data[3], bPseudoTest);
  73481. +
  73482. + efuse_OneByteRead(pAdapter,tmpaddr , &tmpdata[2], bPseudoTest);
  73483. + efuse_OneByteRead(pAdapter,tmpaddr+1, &tmpdata[3], bPseudoTest);
  73484. + if((data[2]!=tmpdata[2])||(data[3]!=tmpdata[3])){
  73485. + badworden &=( ~BIT1);
  73486. + }
  73487. + }
  73488. + if(!(word_en&BIT2))
  73489. + {
  73490. + tmpaddr = start_addr;
  73491. + efuse_OneByteWrite(pAdapter,start_addr++, data[4], bPseudoTest);
  73492. + efuse_OneByteWrite(pAdapter,start_addr++, data[5], bPseudoTest);
  73493. +
  73494. + efuse_OneByteRead(pAdapter,tmpaddr, &tmpdata[4], bPseudoTest);
  73495. + efuse_OneByteRead(pAdapter,tmpaddr+1, &tmpdata[5], bPseudoTest);
  73496. + if((data[4]!=tmpdata[4])||(data[5]!=tmpdata[5])){
  73497. + badworden &=( ~BIT2);
  73498. + }
  73499. + }
  73500. + if(!(word_en&BIT3))
  73501. + {
  73502. + tmpaddr = start_addr;
  73503. + efuse_OneByteWrite(pAdapter,start_addr++, data[6], bPseudoTest);
  73504. + efuse_OneByteWrite(pAdapter,start_addr++, data[7], bPseudoTest);
  73505. +
  73506. + efuse_OneByteRead(pAdapter,tmpaddr, &tmpdata[6], bPseudoTest);
  73507. + efuse_OneByteRead(pAdapter,tmpaddr+1, &tmpdata[7], bPseudoTest);
  73508. + if((data[6]!=tmpdata[6])||(data[7]!=tmpdata[7])){
  73509. + badworden &=( ~BIT3);
  73510. + }
  73511. + }
  73512. + return badworden;
  73513. +}
  73514. +
  73515. +static u8
  73516. +Hal_EfuseWordEnableDataWrite_Pseudo( IN PADAPTER pAdapter,
  73517. + IN u16 efuse_addr,
  73518. + IN u8 word_en,
  73519. + IN u8 *data,
  73520. + IN BOOLEAN bPseudoTest)
  73521. +{
  73522. + u8 ret=0;
  73523. +
  73524. + ret = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
  73525. +
  73526. + return ret;
  73527. +}
  73528. +
  73529. +static u8
  73530. +rtl8192c_Efuse_WordEnableDataWrite( IN PADAPTER pAdapter,
  73531. + IN u16 efuse_addr,
  73532. + IN u8 word_en,
  73533. + IN u8 *data,
  73534. + IN BOOLEAN bPseudoTest)
  73535. +{
  73536. + u8 ret=0;
  73537. +
  73538. + if(bPseudoTest)
  73539. + {
  73540. + ret = Hal_EfuseWordEnableDataWrite_Pseudo(pAdapter, efuse_addr, word_en, data, bPseudoTest);
  73541. + }
  73542. + else
  73543. + {
  73544. + ret = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
  73545. + }
  73546. +
  73547. + return ret;
  73548. +}
  73549. +
  73550. +
  73551. +static u16
  73552. +hal_EfuseGetCurrentSize_8192C(IN PADAPTER pAdapter,
  73553. + IN BOOLEAN bPseudoTest)
  73554. +{
  73555. + int bContinual = _TRUE;
  73556. +
  73557. + u16 efuse_addr = 0;
  73558. + u8 hoffset=0,hworden=0;
  73559. + u8 efuse_data,word_cnts=0;
  73560. +
  73561. + while ( bContinual &&
  73562. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) &&
  73563. + (efuse_addr < EFUSE_REAL_CONTENT_LEN) )
  73564. + {
  73565. + if(efuse_data!=0xFF)
  73566. + {
  73567. + hoffset = (efuse_data>>4) & 0x0F;
  73568. + hworden = efuse_data & 0x0F;
  73569. + word_cnts = Efuse_CalculateWordCnts(hworden);
  73570. + //read next header
  73571. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73572. + }
  73573. + else
  73574. + {
  73575. + bContinual = _FALSE ;
  73576. + }
  73577. + }
  73578. +
  73579. + return efuse_addr;
  73580. +}
  73581. +
  73582. +static u16
  73583. +Hal_EfuseGetCurrentSize_BT(IN PADAPTER pAdapter,
  73584. + IN BOOLEAN bPseudoTest)
  73585. +{
  73586. + int bContinual = _TRUE;
  73587. + u16 efuse_addr = 0;
  73588. + u8 hoffset=0,hworden=0;
  73589. + u8 efuse_data,word_cnts=0;
  73590. + u8 bank=0, startBank=0;
  73591. + u16 retU2=0;
  73592. + u32 total_efuse_used=0;
  73593. +
  73594. + if(bPseudoTest)
  73595. + {
  73596. + efuse_addr = (u16)((fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN));
  73597. + startBank = (u8)(1+(fakeBTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN));
  73598. + }
  73599. + else
  73600. + {
  73601. + efuse_addr = (u16)((BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN));
  73602. + startBank = (u8)(1+(BTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN));
  73603. + }
  73604. +
  73605. + if((startBank < 1) || (startBank >= EFUSE_MAX_BANK))
  73606. + DBG_8192C("Error, bank error, bank=%d\n", bank);
  73607. +
  73608. + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), start bank=%d, start_efuse_addr = %d\n", startBank, efuse_addr));
  73609. +
  73610. + for(bank=startBank; bank<EFUSE_MAX_BANK; bank++)
  73611. + {
  73612. + if(!Hal_EfuseSwitchToBank(pAdapter, bank, bPseudoTest))
  73613. + break;
  73614. + else
  73615. + {
  73616. + bContinual = _TRUE;
  73617. + if(bank != startBank) // only when bank is switched we have to reset the efuse_addr.
  73618. + efuse_addr = 0;
  73619. + }
  73620. +
  73621. + while ( bContinual &&
  73622. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) &&
  73623. + AVAILABLE_EFUSE_ADDR(efuse_addr))
  73624. + {
  73625. + if(efuse_data!=0xFF)
  73626. + {
  73627. + if((efuse_data&0x1F) == 0x0F) //extended header
  73628. + {
  73629. + hoffset = efuse_data;
  73630. + efuse_addr++;
  73631. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest);
  73632. + if((efuse_data & 0x0F) == 0x0F)
  73633. + {
  73634. + efuse_addr++;
  73635. + continue;
  73636. + }
  73637. + else
  73638. + {
  73639. + hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
  73640. + hworden = efuse_data & 0x0F;
  73641. + }
  73642. + }
  73643. + else
  73644. + {
  73645. + hoffset = (efuse_data>>4) & 0x0F;
  73646. + hworden = efuse_data & 0x0F;
  73647. + }
  73648. + word_cnts = Efuse_CalculateWordCnts(hworden);
  73649. + //read next header
  73650. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73651. + }
  73652. + else
  73653. + {
  73654. + bContinual = _FALSE ;
  73655. + }
  73656. + }
  73657. +
  73658. + // Check if we need to check next bank efuse
  73659. + if(efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK))
  73660. + {
  73661. + break;// don't need to check next bank.
  73662. + }
  73663. + }
  73664. +
  73665. + retU2 = ((bank-1)*EFUSE_REAL_CONTENT_LEN)+efuse_addr;
  73666. + if(bPseudoTest)
  73667. + {
  73668. + fakeBTEfuseUsedBytes = retU2;
  73669. + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", fakeBTEfuseUsedBytes));
  73670. + }
  73671. + else
  73672. + {
  73673. + BTEfuseUsedBytes = retU2;
  73674. + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", BTEfuseUsedBytes));
  73675. + }
  73676. +
  73677. + return retU2;
  73678. +}
  73679. +
  73680. +
  73681. +static u16
  73682. +hal_EfuseGetCurrentSize_8723(IN PADAPTER pAdapter,
  73683. + IN BOOLEAN bPseudoTest)
  73684. +{
  73685. + int bContinual = _TRUE;
  73686. +
  73687. + u16 efuse_addr = 0;
  73688. + u8 hoffset=0,hworden=0;
  73689. + u8 efuse_data,word_cnts=0;
  73690. +
  73691. + if(bPseudoTest)
  73692. + {
  73693. + efuse_addr = (u16)(fakeEfuseUsedBytes);
  73694. + }
  73695. + else
  73696. + {
  73697. + rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr);
  73698. + }
  73699. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), start_efuse_addr = %d\n", efuse_addr));
  73700. +
  73701. + while ( bContinual &&
  73702. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) &&
  73703. + AVAILABLE_EFUSE_ADDR(efuse_addr))
  73704. + {
  73705. + if(efuse_data!=0xFF)
  73706. + {
  73707. + if((efuse_data&0x1F) == 0x0F) //extended header
  73708. + {
  73709. + hoffset = efuse_data;
  73710. + efuse_addr++;
  73711. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest);
  73712. + if((efuse_data & 0x0F) == 0x0F)
  73713. + {
  73714. + efuse_addr++;
  73715. + continue;
  73716. + }
  73717. + else
  73718. + {
  73719. + hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
  73720. + hworden = efuse_data & 0x0F;
  73721. + }
  73722. + }
  73723. + else
  73724. + {
  73725. + hoffset = (efuse_data>>4) & 0x0F;
  73726. + hworden = efuse_data & 0x0F;
  73727. + }
  73728. + word_cnts = Efuse_CalculateWordCnts(hworden);
  73729. + //read next header
  73730. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73731. + }
  73732. + else
  73733. + {
  73734. + bContinual = _FALSE ;
  73735. + }
  73736. + }
  73737. +
  73738. + if(bPseudoTest)
  73739. + {
  73740. + fakeEfuseUsedBytes = efuse_addr;
  73741. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", fakeEfuseUsedBytes));
  73742. + }
  73743. + else
  73744. + {
  73745. + rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr);
  73746. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", efuse_addr));
  73747. + }
  73748. +
  73749. + return efuse_addr;
  73750. +}
  73751. +
  73752. +static u16
  73753. +Hal_EfuseGetCurrentSize_Pseudo(IN PADAPTER pAdapter,
  73754. + IN BOOLEAN bPseudoTest)
  73755. +{
  73756. + u16 ret=0;
  73757. +
  73758. + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest);
  73759. +
  73760. + return ret;
  73761. +}
  73762. +
  73763. +static u16
  73764. +rtl8192c_EfuseGetCurrentSize(
  73765. + IN PADAPTER pAdapter,
  73766. + IN u8 efuseType,
  73767. + IN BOOLEAN bPseudoTest)
  73768. +{
  73769. + u16 ret=0;
  73770. +
  73771. + if(efuseType == EFUSE_WIFI)
  73772. + {
  73773. + if(bPseudoTest)
  73774. + {
  73775. + ret = Hal_EfuseGetCurrentSize_Pseudo(pAdapter, bPseudoTest);
  73776. + }
  73777. + else
  73778. + {
  73779. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  73780. + {
  73781. + ret = hal_EfuseGetCurrentSize_8192C(pAdapter, bPseudoTest);
  73782. + }
  73783. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  73784. + {
  73785. + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest);
  73786. + }
  73787. + }
  73788. + }
  73789. + else
  73790. + {
  73791. + ret = Hal_EfuseGetCurrentSize_BT(pAdapter, bPseudoTest);
  73792. + }
  73793. +
  73794. + return ret;
  73795. +}
  73796. +
  73797. +static int
  73798. +hal_EfusePgPacketRead_8192C( IN PADAPTER pAdapter,
  73799. + IN u8 offset,
  73800. + IN u8 *data,
  73801. + IN BOOLEAN bPseudoTest)
  73802. +{
  73803. + u8 ReadState = PG_STATE_HEADER;
  73804. +
  73805. + int bContinual = _TRUE;
  73806. + int bDataEmpty = _TRUE ;
  73807. +
  73808. + u8 efuse_data,word_cnts=0;
  73809. + u16 efuse_addr = 0;
  73810. + u8 hoffset=0,hworden=0;
  73811. + u8 tmpidx=0;
  73812. + u8 tmpdata[8];
  73813. +
  73814. + if(data==NULL) return _FALSE;
  73815. + if(offset>15) return _FALSE;
  73816. +
  73817. +
  73818. + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
  73819. + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
  73820. +
  73821. + //
  73822. + // <Roger_TODO> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
  73823. + // Skip dummy parts to prevent unexpected data read from Efuse.
  73824. + // By pass right now. 2009.02.19.
  73825. + //
  73826. + while(bContinual && (efuse_addr < EFUSE_REAL_CONTENT_LEN) )
  73827. + {
  73828. + //------- Header Read -------------
  73829. + if(ReadState & PG_STATE_HEADER)
  73830. + {
  73831. + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)){
  73832. + hoffset = (efuse_data>>4) & 0x0F;
  73833. + hworden = efuse_data & 0x0F;
  73834. + word_cnts = Efuse_CalculateWordCnts(hworden);
  73835. + bDataEmpty = _TRUE ;
  73836. +
  73837. + if(hoffset==offset){
  73838. + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){
  73839. + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){
  73840. + tmpdata[tmpidx] = efuse_data;
  73841. + if(efuse_data!=0xff){
  73842. + bDataEmpty = _FALSE;
  73843. + }
  73844. + }
  73845. + }
  73846. + if(bDataEmpty==_FALSE){
  73847. + ReadState = PG_STATE_DATA;
  73848. + }else{//read next header
  73849. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73850. + ReadState = PG_STATE_HEADER;
  73851. + }
  73852. + }
  73853. + else{//read next header
  73854. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73855. + ReadState = PG_STATE_HEADER;
  73856. + }
  73857. +
  73858. + }
  73859. + else{
  73860. + bContinual = _FALSE ;
  73861. + }
  73862. + }
  73863. + //------- Data section Read -------------
  73864. + else if(ReadState & PG_STATE_DATA)
  73865. + {
  73866. + efuse_WordEnableDataRead(hworden,tmpdata,data);
  73867. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73868. + ReadState = PG_STATE_HEADER;
  73869. + }
  73870. +
  73871. + }
  73872. +
  73873. + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) &&
  73874. + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff))
  73875. + return _FALSE;
  73876. + else
  73877. + return _TRUE;
  73878. +
  73879. +}
  73880. +
  73881. +static int
  73882. +hal_EfusePgPacketRead_8723( IN PADAPTER pAdapter,
  73883. + IN u8 offset,
  73884. + IN u8 *data,
  73885. + IN BOOLEAN bPseudoTest)
  73886. +{
  73887. + u8 ReadState = PG_STATE_HEADER;
  73888. +
  73889. + int bContinual = _TRUE;
  73890. + int bDataEmpty = _TRUE ;
  73891. +
  73892. + u8 efuse_data,word_cnts=0;
  73893. + u16 efuse_addr = 0;
  73894. + u8 hoffset=0,hworden=0;
  73895. + u8 tmpidx=0;
  73896. + u8 tmpdata[8];
  73897. + u8 max_section=0;
  73898. + u8 tmp_header = 0;
  73899. +
  73900. + EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAX_SECTION, (PVOID)&max_section, bPseudoTest);
  73901. +
  73902. + if(data==NULL)
  73903. + return _FALSE;
  73904. + if(offset>max_section)
  73905. + return _FALSE;
  73906. +
  73907. + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
  73908. + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);
  73909. +
  73910. +
  73911. + //
  73912. + // <Roger_TODO> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
  73913. + // Skip dummy parts to prevent unexpected data read from Efuse.
  73914. + // By pass right now. 2009.02.19.
  73915. + //
  73916. + while(bContinual && AVAILABLE_EFUSE_ADDR(efuse_addr) )
  73917. + {
  73918. + //------- Header Read -------------
  73919. + if(ReadState & PG_STATE_HEADER)
  73920. + {
  73921. + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF))
  73922. + {
  73923. + if(EXT_HEADER(efuse_data))
  73924. + {
  73925. + tmp_header = efuse_data;
  73926. + efuse_addr++;
  73927. + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest);
  73928. + if(!ALL_WORDS_DISABLED(efuse_data))
  73929. + {
  73930. + hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
  73931. + hworden = efuse_data & 0x0F;
  73932. + }
  73933. + else
  73934. + {
  73935. + DBG_8192C("Error, All words disabled\n");
  73936. + efuse_addr++;
  73937. + continue;
  73938. + }
  73939. + }
  73940. + else
  73941. + {
  73942. + hoffset = (efuse_data>>4) & 0x0F;
  73943. + hworden = efuse_data & 0x0F;
  73944. + }
  73945. + word_cnts = Efuse_CalculateWordCnts(hworden);
  73946. + bDataEmpty = _TRUE ;
  73947. +
  73948. + if(hoffset==offset)
  73949. + {
  73950. + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++)
  73951. + {
  73952. + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) )
  73953. + {
  73954. + tmpdata[tmpidx] = efuse_data;
  73955. + if(efuse_data!=0xff)
  73956. + {
  73957. + bDataEmpty = _FALSE;
  73958. + }
  73959. + }
  73960. + }
  73961. + if(bDataEmpty==_FALSE){
  73962. + ReadState = PG_STATE_DATA;
  73963. + }else{//read next header
  73964. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73965. + ReadState = PG_STATE_HEADER;
  73966. + }
  73967. + }
  73968. + else{//read next header
  73969. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73970. + ReadState = PG_STATE_HEADER;
  73971. + }
  73972. +
  73973. + }
  73974. + else{
  73975. + bContinual = _FALSE ;
  73976. + }
  73977. + }
  73978. + //------- Data section Read -------------
  73979. + else if(ReadState & PG_STATE_DATA)
  73980. + {
  73981. + efuse_WordEnableDataRead(hworden,tmpdata,data);
  73982. + efuse_addr = efuse_addr + (word_cnts*2)+1;
  73983. + ReadState = PG_STATE_HEADER;
  73984. + }
  73985. +
  73986. + }
  73987. +
  73988. + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) &&
  73989. + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff))
  73990. + return _FALSE;
  73991. + else
  73992. + return _TRUE;
  73993. +
  73994. +}
  73995. +
  73996. +static int
  73997. +Hal_EfusePgPacketRead( IN PADAPTER pAdapter,
  73998. + IN u8 offset,
  73999. + IN u8 *data,
  74000. + IN BOOLEAN bPseudoTest)
  74001. +{
  74002. + int ret=0;
  74003. +
  74004. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  74005. + {
  74006. + ret = hal_EfusePgPacketRead_8192C(pAdapter, offset, data, bPseudoTest);
  74007. + }
  74008. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  74009. + {
  74010. + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest);
  74011. + }
  74012. +
  74013. + return ret;
  74014. +}
  74015. +
  74016. +static int
  74017. +Hal_EfusePgPacketRead_Pseudo( IN PADAPTER pAdapter,
  74018. + IN u8 offset,
  74019. + IN u8 *data,
  74020. + IN BOOLEAN bPseudoTest)
  74021. +{
  74022. + int ret=0;
  74023. +
  74024. + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest);
  74025. +
  74026. + return ret;
  74027. +}
  74028. +
  74029. +static int
  74030. +rtl8192c_Efuse_PgPacketRead( IN PADAPTER pAdapter,
  74031. + IN u8 offset,
  74032. + IN u8 *data,
  74033. + IN BOOLEAN bPseudoTest)
  74034. +{
  74035. + int ret=0;
  74036. +
  74037. + if(bPseudoTest)
  74038. + {
  74039. + ret = Hal_EfusePgPacketRead_Pseudo(pAdapter, offset, data, bPseudoTest);
  74040. + }
  74041. + else
  74042. + {
  74043. + ret = Hal_EfusePgPacketRead(pAdapter, offset, data, bPseudoTest);
  74044. + }
  74045. +
  74046. + return ret;
  74047. +}
  74048. +
  74049. +static BOOLEAN
  74050. +hal_EfuseFixHeaderProcess(
  74051. + IN PADAPTER pAdapter,
  74052. + IN u8 efuseType,
  74053. + IN PPGPKT_STRUCT pFixPkt,
  74054. + IN u16 *pAddr,
  74055. + IN BOOLEAN bPseudoTest
  74056. +)
  74057. +{
  74058. + u8 originaldata[8], badworden=0;
  74059. + u16 efuse_addr=*pAddr;
  74060. + u32 PgWriteSuccess=0;
  74061. +
  74062. + _rtw_memset((PVOID)originaldata, 0xff, 8);
  74063. +
  74064. + if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest))
  74065. + { //check if data exist
  74066. + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest);
  74067. +
  74068. + if(badworden != 0xf) // write fail
  74069. + {
  74070. + if(efuseType == EFUSE_WIFI)
  74071. + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest);
  74072. + else
  74073. + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest);
  74074. + if(!PgWriteSuccess)
  74075. + return _FALSE;
  74076. + else
  74077. + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest);
  74078. + }
  74079. + else
  74080. + {
  74081. + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1;
  74082. + }
  74083. + }
  74084. + else
  74085. + {
  74086. + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1;
  74087. + }
  74088. + *pAddr = efuse_addr;
  74089. + return _TRUE;
  74090. +}
  74091. +
  74092. +static BOOLEAN
  74093. +hal_EfusePgPacketWrite2ByteHeader(
  74094. + IN PADAPTER pAdapter,
  74095. + IN u8 efuseType,
  74096. + IN u16 *pAddr,
  74097. + IN PPGPKT_STRUCT pTargetPkt,
  74098. + IN BOOLEAN bPseudoTest)
  74099. +{
  74100. + BOOLEAN bRet=_FALSE, bContinual=_TRUE;
  74101. + u16 efuse_addr=*pAddr, efuse_max_available_len=0;
  74102. + u8 pg_header=0, tmp_header=0, pg_header_temp=0;
  74103. + u8 repeatcnt=0;
  74104. +
  74105. + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 2byte header\n"));
  74106. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest);
  74107. +
  74108. + while(efuse_addr < efuse_max_available_len)
  74109. + {
  74110. + pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F;
  74111. + //RTPRINT(FEEPROM, EFUSE_PG, ("pg_header = 0x%x\n", pg_header));
  74112. + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);
  74113. + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);
  74114. +
  74115. + while(tmp_header == 0xFF)
  74116. + {
  74117. + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_)
  74118. + {
  74119. + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for pg_header!!\n"));
  74120. + return _FALSE;
  74121. + }
  74122. +
  74123. + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);
  74124. + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);
  74125. + }
  74126. +
  74127. + //to write ext_header
  74128. + if(tmp_header == pg_header)
  74129. + {
  74130. + efuse_addr++;
  74131. + pg_header_temp = pg_header;
  74132. + pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en;
  74133. +
  74134. + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);
  74135. + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);
  74136. +
  74137. + while(tmp_header == 0xFF)
  74138. + {
  74139. + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_)
  74140. + {
  74141. + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for ext_header!!\n"));
  74142. + return _FALSE;
  74143. + }
  74144. +
  74145. + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);
  74146. + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);
  74147. + }
  74148. +
  74149. + if((tmp_header & 0x0F) == 0x0F) //word_en PG fail
  74150. + {
  74151. + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_)
  74152. + {
  74153. + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for word_en!!\n"));
  74154. + return _FALSE;
  74155. + }
  74156. + else
  74157. + {
  74158. + efuse_addr++;
  74159. + continue;
  74160. + }
  74161. + }
  74162. + else if(pg_header != tmp_header) //offset PG fail
  74163. + {
  74164. + PGPKT_STRUCT fixPkt;
  74165. + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for offset PG fail, need to cover the existed data\n"));
  74166. + fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1);
  74167. + fixPkt.word_en = tmp_header & 0x0F;
  74168. + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en);
  74169. + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest))
  74170. + return _FALSE;
  74171. + }
  74172. + else
  74173. + {
  74174. + bRet = _TRUE;
  74175. + break;
  74176. + }
  74177. + }
  74178. + else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header
  74179. + {
  74180. + efuse_addr+=2;
  74181. + continue;
  74182. + }
  74183. + }
  74184. +
  74185. + *pAddr = efuse_addr;
  74186. + return bRet;
  74187. +}
  74188. +
  74189. +static BOOLEAN
  74190. +hal_EfusePgPacketWrite1ByteHeader(
  74191. + IN PADAPTER pAdapter,
  74192. + IN u8 efuseType,
  74193. + IN u16 *pAddr,
  74194. + IN PPGPKT_STRUCT pTargetPkt,
  74195. + IN BOOLEAN bPseudoTest)
  74196. +{
  74197. + BOOLEAN bRet=_FALSE;
  74198. + u8 pg_header=0, tmp_header=0;
  74199. + u16 efuse_addr=*pAddr;
  74200. + u8 repeatcnt=0;
  74201. +
  74202. + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 1byte header\n"));
  74203. + pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en;
  74204. +
  74205. + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);
  74206. + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);
  74207. +
  74208. + while(tmp_header == 0xFF)
  74209. + {
  74210. + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_)
  74211. + {
  74212. + return _FALSE;
  74213. + }
  74214. + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest);
  74215. + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest);
  74216. + }
  74217. +
  74218. + if(pg_header == tmp_header)
  74219. + {
  74220. + bRet = _TRUE;
  74221. + }
  74222. + else
  74223. + {
  74224. + PGPKT_STRUCT fixPkt;
  74225. + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for fixed PG packet, need to cover the existed data\n"));
  74226. + fixPkt.offset = (tmp_header>>4) & 0x0F;
  74227. + fixPkt.word_en = tmp_header & 0x0F;
  74228. + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en);
  74229. + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest))
  74230. + return _FALSE;
  74231. + }
  74232. +
  74233. + *pAddr = efuse_addr;
  74234. + return bRet;
  74235. +}
  74236. +
  74237. +static BOOLEAN
  74238. +hal_EfusePgPacketWriteData(
  74239. + IN PADAPTER pAdapter,
  74240. + IN u8 efuseType,
  74241. + IN u16 *pAddr,
  74242. + IN PPGPKT_STRUCT pTargetPkt,
  74243. + IN BOOLEAN bPseudoTest)
  74244. +{
  74245. + BOOLEAN bRet=_FALSE;
  74246. + u16 efuse_addr=*pAddr;
  74247. + u8 badworden=0;
  74248. + u32 PgWriteSuccess=0;
  74249. +
  74250. + badworden = 0x0f;
  74251. + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest);
  74252. + if(badworden == 0x0F)
  74253. + {
  74254. + // write ok
  74255. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData ok!!\n"));
  74256. + return _TRUE;
  74257. + }
  74258. + else
  74259. + {
  74260. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData Fail!!\n"));
  74261. + //reorganize other pg packet
  74262. + if(efuseType == EFUSE_WIFI)
  74263. + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);
  74264. + else
  74265. + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);
  74266. + if(!PgWriteSuccess)
  74267. + return _FALSE;
  74268. + else
  74269. + return _TRUE;
  74270. + }
  74271. +
  74272. + return bRet;
  74273. +}
  74274. +
  74275. +static BOOLEAN
  74276. +hal_EfusePgPacketWriteHeader(
  74277. + IN PADAPTER pAdapter,
  74278. + IN u8 efuseType,
  74279. + IN u16 *pAddr,
  74280. + IN PPGPKT_STRUCT pTargetPkt,
  74281. + IN BOOLEAN bPseudoTest)
  74282. +{
  74283. + BOOLEAN bRet=_FALSE;
  74284. +
  74285. + if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE)
  74286. + {
  74287. + bRet = hal_EfusePgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest);
  74288. + }
  74289. + else
  74290. + {
  74291. + bRet = hal_EfusePgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest);
  74292. + }
  74293. +
  74294. + return bRet;
  74295. +}
  74296. +
  74297. +static BOOLEAN
  74298. +hal_EfusePgCheckAvailableAddr(
  74299. + IN PADAPTER pAdapter,
  74300. + IN u8 efuseType,
  74301. + IN BOOLEAN bPseudoTest
  74302. + )
  74303. +{
  74304. + u16 efuse_max_available_len=0;
  74305. +
  74306. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&efuse_max_available_len, bPseudoTest);
  74307. + //RTPRINT(FEEPROM, EFUSE_PG, ("efuse_max_available_len = %d\n", efuse_max_available_len));
  74308. +
  74309. + if(Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= efuse_max_available_len)
  74310. + {
  74311. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgCheckAvailableAddr error!!\n"));
  74312. + return _FALSE;
  74313. + }
  74314. + return _TRUE;
  74315. +}
  74316. +
  74317. +static VOID
  74318. +hal_EfuseConstructPGPkt(
  74319. + IN u8 offset,
  74320. + IN u8 word_en,
  74321. + IN u8 *pData,
  74322. + IN PPGPKT_STRUCT pTargetPkt
  74323. +
  74324. +)
  74325. +{
  74326. + _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8);
  74327. + pTargetPkt->offset = offset;
  74328. + pTargetPkt->word_en= word_en;
  74329. + efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data);
  74330. + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en);
  74331. +
  74332. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseConstructPGPkt(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts));
  74333. +}
  74334. +
  74335. +static BOOLEAN
  74336. +hal_EfuseCheckIfDatafollowed(
  74337. + IN PADAPTER pAdapter,
  74338. + IN u8 word_cnts,
  74339. + IN u16 startAddr,
  74340. + IN BOOLEAN bPseudoTest
  74341. + )
  74342. +{
  74343. + BOOLEAN bRet=_FALSE;
  74344. + u8 i, efuse_data;
  74345. +
  74346. + for(i=0; i<(word_cnts*2) ; i++)
  74347. + {
  74348. + if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF))
  74349. + bRet = _TRUE;
  74350. + }
  74351. +
  74352. + return bRet;
  74353. +}
  74354. +
  74355. +static BOOLEAN
  74356. +wordEnMatched(
  74357. + IN PPGPKT_STRUCT pTargetPkt,
  74358. + IN PPGPKT_STRUCT pCurPkt,
  74359. + IN u8 *pWden
  74360. +)
  74361. +{
  74362. + u8 match_word_en = 0x0F; // default all words are disabled
  74363. + u8 i;
  74364. +
  74365. + // check if the same words are enabled both target and current PG packet
  74366. + if( ((pTargetPkt->word_en & BIT0) == 0) &&
  74367. + ((pCurPkt->word_en & BIT0) == 0) )
  74368. + {
  74369. + match_word_en &= ~BIT0; // enable word 0
  74370. + }
  74371. + if( ((pTargetPkt->word_en & BIT1) == 0) &&
  74372. + ((pCurPkt->word_en & BIT1) == 0) )
  74373. + {
  74374. + match_word_en &= ~BIT1; // enable word 1
  74375. + }
  74376. + if( ((pTargetPkt->word_en & BIT2) == 0) &&
  74377. + ((pCurPkt->word_en & BIT2) == 0) )
  74378. + {
  74379. + match_word_en &= ~BIT2; // enable word 2
  74380. + }
  74381. + if( ((pTargetPkt->word_en & BIT3) == 0) &&
  74382. + ((pCurPkt->word_en & BIT3) == 0) )
  74383. + {
  74384. + match_word_en &= ~BIT3; // enable word 3
  74385. + }
  74386. +
  74387. + *pWden = match_word_en;
  74388. +
  74389. + if(match_word_en != 0xf)
  74390. + return _TRUE;
  74391. + else
  74392. + return _FALSE;
  74393. +}
  74394. +
  74395. +static BOOLEAN
  74396. +hal_EfusePartialWriteCheck(
  74397. + IN PADAPTER pAdapter,
  74398. + IN u8 efuseType,
  74399. + IN u16 *pAddr,
  74400. + IN PPGPKT_STRUCT pTargetPkt,
  74401. + IN BOOLEAN bPseudoTest
  74402. + )
  74403. +{
  74404. + BOOLEAN bRet=_FALSE;
  74405. + u8 i, efuse_data=0, cur_header=0;
  74406. + u8 new_wden=0, matched_wden=0, badworden=0;
  74407. + u16 startAddr=0, efuse_max_available_len=0, efuse_max=0;
  74408. + PGPKT_STRUCT curPkt;
  74409. +
  74410. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest);
  74411. + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&efuse_max, bPseudoTest);
  74412. +
  74413. + if(efuseType == EFUSE_WIFI)
  74414. + {
  74415. + if(bPseudoTest)
  74416. + {
  74417. + startAddr = (u16)(fakeEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN);
  74418. + }
  74419. + else
  74420. + {
  74421. + rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr);
  74422. + startAddr%=EFUSE_REAL_CONTENT_LEN;
  74423. + }
  74424. + }
  74425. + else
  74426. + {
  74427. + if(bPseudoTest)
  74428. + {
  74429. + startAddr = (u16)(fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN);
  74430. + }
  74431. + else
  74432. + {
  74433. + startAddr = (u16)(BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN);
  74434. + }
  74435. + }
  74436. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePartialWriteCheck(), startAddr=%d\n", startAddr));
  74437. +
  74438. + while(1)
  74439. + {
  74440. + if(startAddr >= efuse_max_available_len)
  74441. + {
  74442. + bRet = _FALSE;
  74443. + break;
  74444. + }
  74445. +
  74446. + if(efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF))
  74447. + {
  74448. + if(EXT_HEADER(efuse_data))
  74449. + {
  74450. + cur_header = efuse_data;
  74451. + startAddr++;
  74452. + efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest);
  74453. + if(ALL_WORDS_DISABLED(efuse_data))
  74454. + {
  74455. + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition, all words disabled"));
  74456. + bRet = _FALSE;
  74457. + break;
  74458. + }
  74459. + else
  74460. + {
  74461. + curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
  74462. + curPkt.word_en = efuse_data & 0x0F;
  74463. + }
  74464. + }
  74465. + else
  74466. + {
  74467. + cur_header = efuse_data;
  74468. + curPkt.offset = (cur_header>>4) & 0x0F;
  74469. + curPkt.word_en = cur_header & 0x0F;
  74470. + }
  74471. +
  74472. + curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en);
  74473. + // if same header is found but no data followed
  74474. + // write some part of data followed by the header.
  74475. + if( (curPkt.offset == pTargetPkt->offset) &&
  74476. + (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) &&
  74477. + wordEnMatched(pTargetPkt, &curPkt, &matched_wden) )
  74478. + {
  74479. + //RTPRINT(FEEPROM, EFUSE_PG, ("Need to partial write data by the previous wrote header\n"));
  74480. + // Here to write partial data
  74481. + badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest);
  74482. + if(badworden != 0x0F)
  74483. + {
  74484. + u32 PgWriteSuccess=0;
  74485. + // if write fail on some words, write these bad words again
  74486. + if(efuseType == EFUSE_WIFI)
  74487. + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);
  74488. + else
  74489. + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);
  74490. +
  74491. + if(!PgWriteSuccess)
  74492. + {
  74493. + bRet = _FALSE; // write fail, return
  74494. + break;
  74495. + }
  74496. + }
  74497. + // partial write ok, update the target packet for later use
  74498. + for(i=0; i<4; i++)
  74499. + {
  74500. + if((matched_wden & (0x1<<i)) == 0) // this word has been written
  74501. + {
  74502. + pTargetPkt->word_en |= (0x1<<i); // disable the word
  74503. + }
  74504. + }
  74505. + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en);
  74506. + }
  74507. + // read from next header
  74508. + startAddr = startAddr + (curPkt.word_cnts*2) +1;
  74509. + }
  74510. + else
  74511. + {
  74512. + // not used header, 0xff
  74513. + *pAddr = startAddr;
  74514. + //RTPRINT(FEEPROM, EFUSE_PG, ("Started from unused header offset=%d\n", startAddr));
  74515. + bRet = _TRUE;
  74516. + break;
  74517. + }
  74518. + }
  74519. + return bRet;
  74520. +}
  74521. +
  74522. +static BOOLEAN
  74523. +hal_EfusePgPacketWrite_BT(
  74524. + IN PADAPTER pAdapter,
  74525. + IN u8 offset,
  74526. + IN u8 word_en,
  74527. + IN u8 *pData,
  74528. + IN BOOLEAN bPseudoTest
  74529. + )
  74530. +{
  74531. + PGPKT_STRUCT targetPkt;
  74532. + u16 startAddr=0;
  74533. + u8 efuseType=EFUSE_BT;
  74534. +
  74535. + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest))
  74536. + return _FALSE;
  74537. +
  74538. + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt);
  74539. +
  74540. + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74541. + return _FALSE;
  74542. +
  74543. + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74544. + return _FALSE;
  74545. +
  74546. + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74547. + return _FALSE;
  74548. +
  74549. + return _TRUE;
  74550. +}
  74551. +
  74552. +static BOOLEAN
  74553. +hal_EfusePgPacketWrite_8723(
  74554. + IN PADAPTER pAdapter,
  74555. + IN u8 offset,
  74556. + IN u8 word_en,
  74557. + IN u8 *pData,
  74558. + IN BOOLEAN bPseudoTest
  74559. + )
  74560. +{
  74561. + PGPKT_STRUCT targetPkt;
  74562. + u16 startAddr=0;
  74563. + u8 efuseType=EFUSE_WIFI;
  74564. +
  74565. + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest))
  74566. + return _FALSE;
  74567. +
  74568. + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt);
  74569. +
  74570. + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74571. + return _FALSE;
  74572. +
  74573. + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74574. + return _FALSE;
  74575. +
  74576. + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
  74577. + return _FALSE;
  74578. +
  74579. + return _TRUE;
  74580. +}
  74581. +
  74582. +static int
  74583. +hal_EfusePgPacketWrite_8192C(IN PADAPTER pAdapter,
  74584. + IN u8 offset,
  74585. + IN u8 word_en,
  74586. + IN u8 *data,
  74587. + IN BOOLEAN bPseudoTest)
  74588. +{
  74589. + u8 WriteState = PG_STATE_HEADER;
  74590. +
  74591. + int bContinual = _TRUE,bDataEmpty=_TRUE, bResult = _TRUE;
  74592. + u16 efuse_addr = 0;
  74593. + u8 efuse_data;
  74594. +
  74595. + u8 pg_header = 0;
  74596. +
  74597. + u8 tmp_word_cnts=0,target_word_cnts=0;
  74598. + u8 tmp_header,match_word_en,tmp_word_en;
  74599. +
  74600. + PGPKT_STRUCT target_pkt;
  74601. + PGPKT_STRUCT tmp_pkt;
  74602. +
  74603. + u8 originaldata[sizeof(u8)*8];
  74604. + u8 tmpindex = 0,badworden = 0x0F;
  74605. +
  74606. + static int repeat_times = 0;
  74607. + u8 efuseType=EFUSE_WIFI;
  74608. +
  74609. + //
  74610. + // <Roger_Notes> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
  74611. + // So we have to prevent unexpected data string connection, which will cause
  74612. + // incorrect data auto-load from HW. The total size is equal or smaller than 498bytes
  74613. + // (i.e., offset 0~497, and dummy 1bytes) expected after CP test.
  74614. + // 2009.02.19.
  74615. + //
  74616. + if( Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES))
  74617. + {
  74618. + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWrite_8192C(), over size\n"));
  74619. + return _FALSE;
  74620. + }
  74621. +
  74622. + // Init the 8 bytes content as 0xff
  74623. + target_pkt.offset = offset;
  74624. + target_pkt.word_en= word_en;
  74625. +
  74626. + _rtw_memset((PVOID)target_pkt.data, 0xFF, sizeof(u8)*8);
  74627. +
  74628. + efuse_WordEnableDataRead(word_en,data,target_pkt.data);
  74629. + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en);
  74630. +
  74631. + //efuse_reg_ctrl(pAdapter,_TRUE);//power on
  74632. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE Power ON\n"));
  74633. +
  74634. + //
  74635. + // <Roger_Notes> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
  74636. + // So we have to prevent unexpected data string connection, which will cause
  74637. + // incorrect data auto-load from HW. Dummy 1bytes is additional.
  74638. + // 2009.02.19.
  74639. + //
  74640. + while( bContinual && (efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) )
  74641. + {
  74642. +
  74643. + if(WriteState==PG_STATE_HEADER)
  74644. + {
  74645. + bDataEmpty=_TRUE;
  74646. + badworden = 0x0F;
  74647. + //************ so *******************
  74648. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER\n"));
  74649. + if ( efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) &&
  74650. + (efuse_data!=0xFF))
  74651. + {
  74652. + tmp_header = efuse_data;
  74653. +
  74654. + tmp_pkt.offset = (tmp_header>>4) & 0x0F;
  74655. + tmp_pkt.word_en = tmp_header & 0x0F;
  74656. + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en);
  74657. +
  74658. + //************ so-1 *******************
  74659. + if(tmp_pkt.offset != target_pkt.offset)
  74660. + {
  74661. + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
  74662. + #if (EFUSE_ERROE_HANDLE == 1)
  74663. + WriteState = PG_STATE_HEADER;
  74664. + #endif
  74665. + }
  74666. + else
  74667. + {
  74668. + //************ so-2 *******************
  74669. + for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++)
  74670. + {
  74671. + if(efuse_OneByteRead(pAdapter, (efuse_addr+1+tmpindex) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)){
  74672. + bDataEmpty = _FALSE;
  74673. + }
  74674. + }
  74675. + //************ so-2-1 *******************
  74676. + if(bDataEmpty == _FALSE)
  74677. + {
  74678. + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
  74679. + #if (EFUSE_ERROE_HANDLE == 1)
  74680. + WriteState=PG_STATE_HEADER;
  74681. + #endif
  74682. + }
  74683. + else
  74684. + {//************ so-2-2 *******************
  74685. + match_word_en = 0x0F;
  74686. + if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) ))
  74687. + {
  74688. + match_word_en &= (~BIT0);
  74689. + }
  74690. + if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) ))
  74691. + {
  74692. + match_word_en &= (~BIT1);
  74693. + }
  74694. + if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) ))
  74695. + {
  74696. + match_word_en &= (~BIT2);
  74697. + }
  74698. + if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) ))
  74699. + {
  74700. + match_word_en &= (~BIT3);
  74701. + }
  74702. +
  74703. + //************ so-2-2-A *******************
  74704. + if((match_word_en&0x0F)!=0x0F)
  74705. + {
  74706. + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data, bPseudoTest);
  74707. +
  74708. + //************ so-2-2-A-1 *******************
  74709. + //############################
  74710. + if(0x0F != (badworden&0x0F))
  74711. + {
  74712. + u8 reorg_offset = offset;
  74713. + u8 reorg_worden=badworden;
  74714. + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest);
  74715. + }
  74716. + //############################
  74717. +
  74718. + tmp_word_en = 0x0F;
  74719. + if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) )
  74720. + {
  74721. + tmp_word_en &= (~BIT0);
  74722. + }
  74723. + if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) )
  74724. + {
  74725. + tmp_word_en &= (~BIT1);
  74726. + }
  74727. + if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) )
  74728. + {
  74729. + tmp_word_en &= (~BIT2);
  74730. + }
  74731. + if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) )
  74732. + {
  74733. + tmp_word_en &=(~BIT3);
  74734. + }
  74735. +
  74736. + //************ so-2-2-A-2 *******************
  74737. + if((tmp_word_en&0x0F)!=0x0F){
  74738. + //reorganize other pg packet
  74739. + //efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr
  74740. + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest);
  74741. + //===========================
  74742. + target_pkt.offset = offset;
  74743. + target_pkt.word_en= tmp_word_en;
  74744. + //===========================
  74745. + }else{
  74746. + bContinual = _FALSE;
  74747. + }
  74748. + #if (EFUSE_ERROE_HANDLE == 1)
  74749. + WriteState=PG_STATE_HEADER;
  74750. + repeat_times++;
  74751. + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
  74752. + bContinual = _FALSE;
  74753. + bResult = _FALSE;
  74754. + }
  74755. + #endif
  74756. + }
  74757. + else{//************ so-2-2-B *******************
  74758. + //reorganize other pg packet
  74759. + efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr
  74760. + //===========================
  74761. + target_pkt.offset = offset;
  74762. + target_pkt.word_en= target_pkt.word_en;
  74763. + //===========================
  74764. + #if (EFUSE_ERROE_HANDLE == 1)
  74765. + WriteState=PG_STATE_HEADER;
  74766. + #endif
  74767. + }
  74768. + }
  74769. + }
  74770. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-1\n"));
  74771. + }
  74772. + else //************ s1: header == oxff *******************
  74773. + {
  74774. + pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en;
  74775. +
  74776. + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest);
  74777. + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest);
  74778. +
  74779. + if(tmp_header == pg_header)
  74780. + { //************ s1-1*******************
  74781. + WriteState = PG_STATE_DATA;
  74782. + }
  74783. + #if (EFUSE_ERROE_HANDLE == 1)
  74784. + else if(tmp_header == 0xFF){//************ s1-3: if Write or read func doesn't work *******************
  74785. + //efuse_addr doesn't change
  74786. + WriteState = PG_STATE_HEADER;
  74787. + repeat_times++;
  74788. + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
  74789. + bContinual = _FALSE;
  74790. + bResult = _FALSE;
  74791. + }
  74792. + }
  74793. + #endif
  74794. + else
  74795. + {//************ s1-2 : fixed the header procedure *******************
  74796. + tmp_pkt.offset = (tmp_header>>4) & 0x0F;
  74797. + tmp_pkt.word_en= tmp_header & 0x0F;
  74798. + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en);
  74799. +
  74800. + //************ s1-2-A :cover the exist data *******************
  74801. + //memset(originaldata,0xff,sizeof(UINT8)*8);
  74802. + _rtw_memset((PVOID)originaldata, 0xff, sizeof(u8)*8);
  74803. +
  74804. + if(Efuse_PgPacketRead( pAdapter, tmp_pkt.offset,originaldata, bPseudoTest))
  74805. + { //check if data exist
  74806. + //efuse_reg_ctrl(pAdapter,_TRUE);//power on
  74807. + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,tmp_pkt.word_en,originaldata, bPseudoTest);
  74808. + //############################
  74809. + if(0x0F != (badworden&0x0F))
  74810. + {
  74811. + u8 reorg_offset = tmp_pkt.offset;
  74812. + u8 reorg_worden=badworden;
  74813. + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest);
  74814. + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest);
  74815. + }
  74816. + //############################
  74817. + else{
  74818. + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
  74819. + }
  74820. + }
  74821. + //************ s1-2-B: wrong address*******************
  74822. + else
  74823. + {
  74824. + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet
  74825. + }
  74826. +
  74827. + #if (EFUSE_ERROE_HANDLE == 1)
  74828. + WriteState=PG_STATE_HEADER;
  74829. + repeat_times++;
  74830. + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
  74831. + bContinual = _FALSE;
  74832. + bResult = _FALSE;
  74833. + }
  74834. + #endif
  74835. +
  74836. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-2\n"));
  74837. + }
  74838. +
  74839. + }
  74840. +
  74841. + }
  74842. + //write data state
  74843. + else if(WriteState==PG_STATE_DATA)
  74844. + { //************ s1-1 *******************
  74845. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_DATA\n"));
  74846. + badworden = 0x0f;
  74847. + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,target_pkt.word_en,target_pkt.data, bPseudoTest);
  74848. + if((badworden&0x0F)==0x0F)
  74849. + { //************ s1-1-A *******************
  74850. + bContinual = _FALSE;
  74851. + }
  74852. + else
  74853. + {//reorganize other pg packet //************ s1-1-B *******************
  74854. + efuse_addr = efuse_addr + (2*target_word_cnts) +1;//next pg packet addr
  74855. +
  74856. + //===========================
  74857. + target_pkt.offset = offset;
  74858. + target_pkt.word_en= badworden;
  74859. + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en);
  74860. + //===========================
  74861. + #if (EFUSE_ERROE_HANDLE == 1)
  74862. + WriteState=PG_STATE_HEADER;
  74863. + repeat_times++;
  74864. + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){
  74865. + bContinual = _FALSE;
  74866. + bResult = _FALSE;
  74867. + }
  74868. + #endif
  74869. + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-3\n"));
  74870. + }
  74871. + }
  74872. + }
  74873. +
  74874. + if(efuse_addr >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES))
  74875. + {
  74876. + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("hal_EfusePgPacketWrite_8192C(): efuse_addr(%#x) Out of size!!\n", efuse_addr));
  74877. + }
  74878. + //efuse_reg_ctrl(pAdapter,_FALSE);//power off
  74879. +
  74880. + return _TRUE;
  74881. +}
  74882. +
  74883. +static int
  74884. +Hal_EfusePgPacketWrite_Pseudo(IN PADAPTER pAdapter,
  74885. + IN u8 offset,
  74886. + IN u8 word_en,
  74887. + IN u8 *data,
  74888. + IN BOOLEAN bPseudoTest)
  74889. +{
  74890. + int ret;
  74891. +
  74892. + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest);
  74893. +
  74894. + return ret;
  74895. +}
  74896. +
  74897. +static int
  74898. +Hal_EfusePgPacketWrite(IN PADAPTER pAdapter,
  74899. + IN u8 offset,
  74900. + IN u8 word_en,
  74901. + IN u8 *data,
  74902. + IN BOOLEAN bPseudoTest)
  74903. +{
  74904. + int ret=0;
  74905. +
  74906. + if(IS_HARDWARE_TYPE_8192C(pAdapter))
  74907. + {
  74908. + ret = hal_EfusePgPacketWrite_8192C(pAdapter, offset, word_en, data, bPseudoTest);
  74909. + }
  74910. + else if(IS_HARDWARE_TYPE_8723A(pAdapter))
  74911. + {
  74912. + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest);
  74913. + }
  74914. +
  74915. + return ret;
  74916. +}
  74917. +
  74918. +static int
  74919. +rtl8192c_Efuse_PgPacketWrite(IN PADAPTER pAdapter,
  74920. + IN u8 offset,
  74921. + IN u8 word_en,
  74922. + IN u8 *data,
  74923. + IN BOOLEAN bPseudoTest)
  74924. +{
  74925. + int ret;
  74926. +
  74927. + if(bPseudoTest)
  74928. + {
  74929. + ret = Hal_EfusePgPacketWrite_Pseudo(pAdapter, offset, word_en, data, bPseudoTest);
  74930. + }
  74931. + else
  74932. + {
  74933. + ret = Hal_EfusePgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);
  74934. + }
  74935. + return ret;
  74936. +}
  74937. +
  74938. +VOID
  74939. +rtl8192c_EfuseParseIDCode(
  74940. + IN PADAPTER pAdapter,
  74941. + IN u8 *hwinfo
  74942. + )
  74943. +{
  74944. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  74945. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  74946. + u16 i,EEPROMId;
  74947. +
  74948. + // Checl 0x8129 again for making sure autoload status!!
  74949. + EEPROMId = *((u16 *)&hwinfo[0]);
  74950. + if( le16_to_cpu(EEPROMId) != RTL_EEPROM_ID)
  74951. + {
  74952. + DBG_8192C("EEPROM ID(%#x) is invalid!!\n", EEPROMId);
  74953. + pEEPROM->bautoload_fail_flag = _TRUE;
  74954. + }
  74955. + else
  74956. + {
  74957. + pEEPROM->bautoload_fail_flag = _FALSE;
  74958. + }
  74959. +
  74960. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("EEPROM ID = 0x%4x\n", EEPROMId));
  74961. +}
  74962. +
  74963. +void rtl8192c_read_chip_version(PADAPTER pAdapter)
  74964. +{
  74965. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  74966. + pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter);
  74967. +}
  74968. +
  74969. +void hal_notch_filter_8192c(_adapter *adapter, bool enable)
  74970. +{
  74971. + if (enable) {
  74972. + DBG_871X("Enable notch filter\n");
  74973. + rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) | BIT1);
  74974. + } else {
  74975. + DBG_871X("Disable notch filter\n");
  74976. + rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) & ~BIT1);
  74977. + }
  74978. +}
  74979. +
  74980. +void hal_reset_security_engine_8192c(_adapter * adapter)
  74981. +{
  74982. + rtw_write8(adapter, 0x522, 0xFF);
  74983. + rtw_write8(adapter, 0x21, 0x35);
  74984. + rtw_usleep_os(300);
  74985. + rtw_write8(adapter, 0x101, rtw_read8(adapter,0x101)&~0x02);
  74986. + rtw_write8(adapter, 0x101, rtw_read8(adapter,0x101)|0x02);
  74987. + rtw_write8(adapter, 0x21, 0x55);
  74988. + rtw_write8(adapter, 0x522, 0x00);
  74989. +}
  74990. +
  74991. +s32 c2h_id_filter_ccx_8192c(u8 id)
  74992. +{
  74993. + s32 ret = _FALSE;
  74994. + if (id == C2H_CCX_TX_RPT)
  74995. + ret = _TRUE;
  74996. +
  74997. + return ret;
  74998. +}
  74999. +
  75000. +static s32 c2h_handler_8192c(_adapter *padapter, struct c2h_evt_hdr *c2h_evt)
  75001. +{
  75002. + s32 ret = _SUCCESS;
  75003. + u8 i = 0;
  75004. +
  75005. + if (c2h_evt == NULL) {
  75006. + DBG_8192C("%s c2h_evt is NULL\n",__FUNCTION__);
  75007. + ret = _FAIL;
  75008. + goto exit;
  75009. + }
  75010. +
  75011. + switch (c2h_evt->id) {
  75012. + case C2H_CCX_TX_RPT:
  75013. + handle_txrpt_ccx_8192c(padapter, c2h_evt->payload);
  75014. + break;
  75015. + default:
  75016. + ret = _FAIL;
  75017. + break;
  75018. + }
  75019. +
  75020. +exit:
  75021. + return ret;
  75022. +}
  75023. +
  75024. +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc)
  75025. +{
  75026. + pHalFunc->free_hal_data = &rtl8192c_free_hal_data;
  75027. +
  75028. + pHalFunc->dm_init = &rtl8192c_init_dm_priv;
  75029. + pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv;
  75030. + pHalFunc->read_chip_version = &rtl8192c_read_chip_version;
  75031. +
  75032. + pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C;
  75033. + pHalFunc->set_channel_handler = &PHY_SwChnl8192C;
  75034. +
  75035. + pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog;
  75036. +
  75037. + pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid;
  75038. +
  75039. +#ifdef CONFIG_ANTENNA_DIVERSITY
  75040. + pHalFunc->AntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C;
  75041. + pHalFunc->AntDivCompareHandler = &SwAntDivCompare8192C;
  75042. +#endif
  75043. +
  75044. + pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg;
  75045. + pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg;
  75046. + pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg;
  75047. + pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg;
  75048. +
  75049. + //Efuse related function
  75050. + pHalFunc->EfusePowerSwitch = &rtl8192c_EfusePowerSwitch;
  75051. + pHalFunc->ReadEFuse = &rtl8192c_ReadEFuse;
  75052. + pHalFunc->EFUSEGetEfuseDefinition = &rtl8192c_EFUSE_GetEfuseDefinition;
  75053. + pHalFunc->EfuseGetCurrentSize = &rtl8192c_EfuseGetCurrentSize;
  75054. + pHalFunc->Efuse_PgPacketRead = &rtl8192c_Efuse_PgPacketRead;
  75055. + pHalFunc->Efuse_PgPacketWrite = &rtl8192c_Efuse_PgPacketWrite;
  75056. + pHalFunc->Efuse_WordEnableDataWrite = &rtl8192c_Efuse_WordEnableDataWrite;
  75057. +
  75058. +#ifdef DBG_CONFIG_ERROR_DETECT
  75059. + pHalFunc->sreset_init_value = &sreset_init_value;
  75060. + pHalFunc->sreset_reset_value = &sreset_reset_value;
  75061. + pHalFunc->silentreset = &sreset_reset;
  75062. + pHalFunc->sreset_xmit_status_check = &rtl8192c_sreset_xmit_status_check;
  75063. + pHalFunc->sreset_linked_status_check = &rtl8192c_sreset_linked_status_check;
  75064. + pHalFunc->sreset_get_wifi_status = &sreset_get_wifi_status;
  75065. + pHalFunc->sreset_inprogress= &sreset_inprogress;
  75066. +#endif
  75067. +
  75068. +#ifdef CONFIG_IOL
  75069. + pHalFunc->IOL_exec_cmds_sync = &rtl8192c_IOL_exec_cmds_sync;
  75070. +#endif
  75071. + pHalFunc->hal_notch_filter = &hal_notch_filter_8192c;
  75072. + pHalFunc->hal_reset_security_engine = hal_reset_security_engine_8192c;
  75073. +
  75074. + pHalFunc->c2h_handler = c2h_handler_8192c;
  75075. + pHalFunc->c2h_id_filter_ccx = c2h_id_filter_ccx_8192c;
  75076. +}
  75077. --- /dev/null
  75078. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c
  75079. @@ -0,0 +1,1207 @@
  75080. +/******************************************************************************
  75081. + *
  75082. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  75083. + *
  75084. + * This program is free software; you can redistribute it and/or modify it
  75085. + * under the terms of version 2 of the GNU General Public License as
  75086. + * published by the Free Software Foundation.
  75087. + *
  75088. + * This program is distributed in the hope that it will be useful, but WITHOUT
  75089. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  75090. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  75091. + * more details.
  75092. + *
  75093. + * You should have received a copy of the GNU General Public License along with
  75094. + * this program; if not, write to the Free Software Foundation, Inc.,
  75095. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  75096. + *
  75097. + *
  75098. + ******************************************************************************/
  75099. +#define _RTL8192C_MP_C_
  75100. +#ifdef CONFIG_MP_INCLUDED
  75101. +
  75102. +#include <drv_types.h>
  75103. +#include <rtw_mp.h>
  75104. +
  75105. +#ifdef CONFIG_RTL8192C
  75106. +#include <rtl8192c_hal.h>
  75107. +#endif
  75108. +
  75109. +
  75110. +
  75111. +s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable)
  75112. +{
  75113. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  75114. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  75115. +
  75116. +
  75117. + if (!netif_running(padapter->pnetdev)) {
  75118. + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n"));
  75119. + return _FAIL;
  75120. + }
  75121. +
  75122. + if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
  75123. + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n"));
  75124. + return _FAIL;
  75125. + }
  75126. +
  75127. + if (enable)
  75128. + pdmpriv->TxPowerTrackControl = _TRUE;
  75129. + else
  75130. + pdmpriv->TxPowerTrackControl = _FALSE;
  75131. +
  75132. + return _SUCCESS;
  75133. +}
  75134. +
  75135. +void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable)
  75136. +{
  75137. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  75138. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  75139. +
  75140. +
  75141. + *enable = pdmpriv->TxPowerTrackControl;
  75142. +}
  75143. +
  75144. +static void Hal_disable_dm(PADAPTER padapter)
  75145. +{
  75146. + u8 v8;
  75147. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  75148. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  75149. +
  75150. +
  75151. + //3 1. disable firmware dynamic mechanism
  75152. + // disable Power Training, Rate Adaptive
  75153. + v8 = rtw_read8(padapter, REG_BCN_CTRL);
  75154. + v8 &= ~EN_BCN_FUNCTION;
  75155. + rtw_write8(padapter, REG_BCN_CTRL, v8);
  75156. +
  75157. + //3 2. disable driver dynamic mechanism
  75158. + // disable Dynamic Initial Gain
  75159. + // disable High Power
  75160. + // disable Power Tracking
  75161. + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
  75162. +
  75163. + // enable APK, LCK and IQK but disable power tracking
  75164. + pdmpriv->TxPowerTrackControl = _FALSE;
  75165. + Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE);
  75166. +}
  75167. +
  75168. +/*-----------------------------------------------------------------------------
  75169. + * Function: mpt_SwitchRfSetting
  75170. + *
  75171. + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP.
  75172. + *
  75173. + * Input: IN PADAPTER pAdapter
  75174. + *
  75175. + * Output: NONE
  75176. + *
  75177. + * Return: NONE
  75178. + *
  75179. + * Revised History:
  75180. + * When Who Remark
  75181. + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.
  75182. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.
  75183. + *
  75184. + *---------------------------------------------------------------------------*/
  75185. +void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter)
  75186. +{
  75187. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75188. + struct mp_priv *pmp = &pAdapter->mppriv;
  75189. + u8 ChannelToSw = pmp->channel, eRFPath = RF_PATH_A;
  75190. + u8 ulRateIdx = pmp->rateidx;
  75191. + u8 ulbandwidth = pmp->bandwidth;
  75192. + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
  75193. + BOOLEAN bInteralPA = _FALSE;
  75194. + u32 value = 0;
  75195. +
  75196. +#ifdef CONFIG_USB_HCI
  75197. + if (IS_92C_SERIAL(pHalData->VersionID))
  75198. + {
  75199. + //92CE-VAU (92cu mCard)
  75200. + if( BOARD_MINICARD == pHalData->BoardType)
  75201. + {
  75202. + if (ulRateIdx < MPT_RATE_6M) // CCK rate
  75203. + {
  75204. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400);
  75205. + }
  75206. + else //OFDM~MCS rate
  75207. + {
  75208. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000);
  75209. + }
  75210. + }
  75211. + else //92CU dongle
  75212. + {
  75213. + if (ulRateIdx < MPT_RATE_6M) // CCK rate
  75214. + {
  75215. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400);
  75216. + }
  75217. + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel
  75218. + {
  75219. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200);
  75220. + }
  75221. + else if (ChannelToSw == 4) // OFDM rate, even number channel
  75222. + {
  75223. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200);
  75224. + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe0004);
  75225. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709);
  75226. + rtw_msleep_os(1);
  75227. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333);
  75228. + }
  75229. + else if(ChannelToSw == 10) // OFDM rate, even number channel
  75230. + {
  75231. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28000);
  75232. + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000A);
  75233. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709);
  75234. + rtw_msleep_os(1);
  75235. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x7B333);
  75236. + }
  75237. + else if(ChannelToSw == 12) // OFDM rate, even number channel
  75238. + {
  75239. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200);
  75240. + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000C);
  75241. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x50B);
  75242. + rtw_msleep_os(1);
  75243. + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333);
  75244. + }
  75245. + else
  75246. + {
  75247. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200);
  75248. + }
  75249. + }
  75250. + }
  75251. + else //88cu
  75252. + {
  75253. +
  75254. + //mcard interface
  75255. +
  75256. + if( BOARD_MINICARD == pHalData->BoardType)
  75257. + {
  75258. + if (ulRateIdx < MPT_RATE_6M) // CCK rate
  75259. + {
  75260. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400);
  75261. + }
  75262. + else //OFDM~MCS rate
  75263. + {
  75264. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200);
  75265. + }
  75266. +
  75267. + if(ChannelToSw == 6 || ChannelToSw == 8)
  75268. + {
  75269. + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22);
  75270. + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22);
  75271. + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F);
  75272. + }
  75273. + else
  75274. + {
  75275. + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x20);
  75276. + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x20);
  75277. + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30);
  75278. + }
  75279. + }
  75280. + else
  75281. + {
  75282. + if (ulRateIdx < MPT_RATE_6M) // CCK rate
  75283. + {
  75284. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400);
  75285. + }
  75286. + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel
  75287. + {
  75288. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200);
  75289. + }
  75290. + else
  75291. + {
  75292. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000);
  75293. + }
  75294. + }
  75295. + }
  75296. +
  75297. +#else //PCI_INTERFACE
  75298. +
  75299. + if (ulRateIdx < MPT_RATE_6M) // CCK rate
  75300. + {
  75301. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400);
  75302. + }
  75303. + else //OFDM~MCS rate
  75304. + {
  75305. + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000);
  75306. + }
  75307. + //88CE
  75308. + if(!IS_92C_SERIAL(pHalData->VersionID))
  75309. + {
  75310. + if(ChannelToSw == 6 || ChannelToSw == 8)
  75311. + {
  75312. + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22);
  75313. + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22);
  75314. + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F);
  75315. + }
  75316. + else
  75317. + {
  75318. + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pMptCtx->backup0xc50);
  75319. + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pMptCtx->backup0xc58);
  75320. + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30);
  75321. + }
  75322. + }
  75323. +
  75324. +#endif //CONFIG_USB_HCI
  75325. +
  75326. +
  75327. +}
  75328. +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
  75329. +
  75330. +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  75331. +void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)
  75332. +{
  75333. + u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0;
  75334. + u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12;
  75335. + u8 i;
  75336. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  75337. +
  75338. +
  75339. + // get current cck swing value and check 0xa22 & 0xa23 later to match the table.
  75340. + CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord);
  75341. +
  75342. + if (!bInCH14)
  75343. + {
  75344. + // Readback the current bb cck swing value and compare with the table to
  75345. + // get the current swing index
  75346. + for (i = 0; i < CCK_TABLE_SIZE; i++)
  75347. + {
  75348. + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) &&
  75349. + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1]))
  75350. + {
  75351. + CCKSwingIndex = i;
  75352. +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n",
  75353. +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));
  75354. + break;
  75355. + }
  75356. + }
  75357. +
  75358. + //Write 0xa22 0xa23
  75359. + TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] +
  75360. + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ;
  75361. +
  75362. +
  75363. + //Write 0xa24 ~ 0xa27
  75364. + TempVal2 = 0;
  75365. + TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] +
  75366. + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) +
  75367. + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+
  75368. + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24);
  75369. +
  75370. + //Write 0xa28 0xa29
  75371. + TempVal3 = 0;
  75372. + TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] +
  75373. + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ;
  75374. + }
  75375. + else
  75376. + {
  75377. + for (i = 0; i < CCK_TABLE_SIZE; i++)
  75378. + {
  75379. + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) &&
  75380. + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1]))
  75381. + {
  75382. + CCKSwingIndex = i;
  75383. +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n",
  75384. +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));
  75385. + break;
  75386. + }
  75387. + }
  75388. +
  75389. + //Write 0xa22 0xa23
  75390. + TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] +
  75391. + (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ;
  75392. +
  75393. + //Write 0xa24 ~ 0xa27
  75394. + TempVal2 = 0;
  75395. + TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] +
  75396. + (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) +
  75397. + (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+
  75398. + (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24);
  75399. +
  75400. + //Write 0xa28 0xa29
  75401. + TempVal3 = 0;
  75402. + TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] +
  75403. + (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ;
  75404. + }
  75405. +
  75406. + write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal);
  75407. + write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2);
  75408. + write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3);
  75409. +}
  75410. +
  75411. +void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven)
  75412. +{
  75413. + s32 TempCCk;
  75414. + u8 CCK_index, CCK_index_old;
  75415. + u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even
  75416. + u8 TimeOut = 100;
  75417. + s32 i = 0;
  75418. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75419. + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
  75420. +
  75421. +
  75422. + if (!IS_92C_SERIAL(pHalData->VersionID))
  75423. + return;
  75424. +#if 0
  75425. + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE)
  75426. + {
  75427. + PlatformSleepUs(100);
  75428. + TimeOut--;
  75429. + if(TimeOut <= 0)
  75430. + {
  75431. + RTPRINT(FINIT, INIT_TxPower,
  75432. + ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" ));
  75433. + break;
  75434. + }
  75435. + }
  75436. +#endif
  75437. + if (beven && !pMptCtx->bMptIndexEven) //odd->even
  75438. + {
  75439. + Action = 2;
  75440. + pMptCtx->bMptIndexEven = _TRUE;
  75441. + }
  75442. + else if (!beven && pMptCtx->bMptIndexEven) //even->odd
  75443. + {
  75444. + Action = 1;
  75445. + pMptCtx->bMptIndexEven = _FALSE;
  75446. + }
  75447. +
  75448. + if (Action != 0)
  75449. + {
  75450. + //Query CCK default setting From 0xa24
  75451. + TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK;
  75452. + for (i = 0; i < CCK_TABLE_SIZE; i++)
  75453. + {
  75454. + if (pHalData->dmpriv.bCCKinCH14)
  75455. + {
  75456. + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE)
  75457. + {
  75458. + CCK_index_old = (u8) i;
  75459. +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n",
  75460. +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14));
  75461. + break;
  75462. + }
  75463. + }
  75464. + else
  75465. + {
  75466. + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE)
  75467. + {
  75468. + CCK_index_old = (u8) i;
  75469. +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n",
  75470. +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14));
  75471. + break;
  75472. + }
  75473. + }
  75474. + }
  75475. +
  75476. + if (Action == 1)
  75477. + CCK_index = CCK_index_old - 1;
  75478. + else
  75479. + CCK_index = CCK_index_old + 1;
  75480. +
  75481. +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n",
  75482. +// CCK_index));
  75483. +
  75484. + //Adjust CCK according to gain index
  75485. + if (!pHalData->dmpriv.bCCKinCH14) {
  75486. + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]);
  75487. + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]);
  75488. + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]);
  75489. + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]);
  75490. + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]);
  75491. + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]);
  75492. + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]);
  75493. + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]);
  75494. + } else {
  75495. + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]);
  75496. + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]);
  75497. + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]);
  75498. + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]);
  75499. + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]);
  75500. + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]);
  75501. + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]);
  75502. + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]);
  75503. + }
  75504. + }
  75505. +#if 0
  75506. + RTPRINT(FINIT, INIT_TxPower,
  75507. + ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20)));
  75508. +
  75509. + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE);
  75510. +#endif
  75511. +}
  75512. +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  75513. +
  75514. +/*
  75515. + * SetChannel
  75516. + * Description
  75517. + * Use H2C command to change channel,
  75518. + * not only modify rf register, but also other setting need to be done.
  75519. + */
  75520. +void Hal_SetChannel(PADAPTER pAdapter)
  75521. +{
  75522. +#if 0
  75523. + struct mp_priv *pmp = &pAdapter->mppriv;
  75524. +
  75525. +// SelectChannel(pAdapter, pmp->channel);
  75526. + set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth);
  75527. +#else
  75528. + u8 eRFPath;
  75529. +
  75530. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75531. + struct mp_priv *pmp = &pAdapter->mppriv;
  75532. + u8 channel = pmp->channel;
  75533. + u8 bandwidth = pmp->bandwidth;
  75534. + u8 rate = pmp->rateidx;
  75535. +
  75536. +
  75537. + // set RF channel register
  75538. + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
  75539. + {
  75540. + if(IS_HARDWARE_TYPE_8192D(pAdapter))
  75541. + _write_rfreg(pAdapter, (RF_RADIO_PATH_E)eRFPath, rRfChannel, 0xFF, channel);
  75542. + else
  75543. + _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel);
  75544. + }
  75545. + Hal_mpt_SwitchRfSetting(pAdapter);
  75546. +
  75547. + SelectChannel(pAdapter, channel);
  75548. +
  75549. + if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) {
  75550. + pHalData->dmpriv.bCCKinCH14 = _TRUE;
  75551. + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14);
  75552. + }
  75553. + else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) {
  75554. + pHalData->dmpriv.bCCKinCH14 = _FALSE;
  75555. + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14);
  75556. + }
  75557. +
  75558. +#endif
  75559. +}
  75560. +
  75561. +/*
  75562. + * Notice
  75563. + * Switch bandwitdth may change center frequency(channel)
  75564. + */
  75565. +void Hal_SetBandwidth(PADAPTER pAdapter)
  75566. +{
  75567. + struct mp_priv *pmp = &pAdapter->mppriv;
  75568. +
  75569. +
  75570. + SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset);
  75571. + Hal_mpt_SwitchRfSetting(pAdapter);
  75572. +}
  75573. +
  75574. +void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
  75575. +{
  75576. + u32 tmpval = 0;
  75577. +
  75578. +
  75579. + // rf-A cck tx power
  75580. + write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]);
  75581. + tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A];
  75582. + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
  75583. +
  75584. + // rf-B cck tx power
  75585. + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]);
  75586. + tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B];
  75587. + write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);
  75588. +
  75589. + RT_TRACE(_module_mp_, _drv_notice_,
  75590. + ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n",
  75591. + TxPower[RF_PATH_A], TxPower[RF_PATH_B]));
  75592. +}
  75593. +
  75594. +void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower)
  75595. +{
  75596. + u32 TxAGC = 0;
  75597. + u8 tmpval = 0;
  75598. + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
  75599. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75600. +
  75601. +
  75602. + // HT Tx-rf(A)
  75603. + tmpval = TxPower[RF_PATH_A];
  75604. + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval;
  75605. +
  75606. + write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC);
  75607. + write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC);
  75608. + write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC);
  75609. + write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC);
  75610. + write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC);
  75611. + write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC);
  75612. +
  75613. + // HT Tx-rf(B)
  75614. + tmpval = TxPower[RF_PATH_B];
  75615. + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval;
  75616. +
  75617. + write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC);
  75618. + write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC);
  75619. + write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC);
  75620. + write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC);
  75621. + write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC);
  75622. + write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC);
  75623. +
  75624. + RT_TRACE(_module_mp_, _drv_notice_,
  75625. + ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n",
  75626. + TxPower[RF_PATH_A], TxPower[RF_PATH_B]));
  75627. +}
  75628. +
  75629. +void Hal_SetAntennaPathPower(PADAPTER pAdapter)
  75630. +{
  75631. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75632. + u8 TxPowerLevel[MAX_RF_PATH_NUMS];
  75633. + u8 rfPath;
  75634. +
  75635. + TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx;
  75636. + TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b;
  75637. +
  75638. + switch (pAdapter->mppriv.antenna_tx)
  75639. + {
  75640. + case ANTENNA_A:
  75641. + default:
  75642. + rfPath = RF_PATH_A;
  75643. + break;
  75644. + case ANTENNA_B:
  75645. + rfPath = RF_PATH_B;
  75646. + break;
  75647. + case ANTENNA_C:
  75648. + rfPath = RF_PATH_C;
  75649. + break;
  75650. + }
  75651. +
  75652. + switch (pHalData->rf_chip)
  75653. + {
  75654. + case RF_8225:
  75655. + case RF_8256:
  75656. + case RF_6052:
  75657. + Hal_SetCCKTxPower(pAdapter, TxPowerLevel);
  75658. + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate
  75659. + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0);
  75660. + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel);
  75661. + break;
  75662. +
  75663. + default:
  75664. + break;
  75665. + }
  75666. +}
  75667. +
  75668. +void Hal_SetTxPower(PADAPTER pAdapter)
  75669. +{
  75670. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75671. + u8 TxPower = pAdapter->mppriv.txpoweridx;
  75672. + u8 TxPowerLevel[MAX_RF_PATH_NUMS];
  75673. + u8 rf, rfPath;
  75674. +
  75675. + for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) {
  75676. + TxPowerLevel[rf] = TxPower;
  75677. + }
  75678. +
  75679. + switch (pAdapter->mppriv.antenna_tx)
  75680. + {
  75681. + case ANTENNA_A:
  75682. + default:
  75683. + rfPath = RF_PATH_A;
  75684. + break;
  75685. + case ANTENNA_B:
  75686. + rfPath = RF_PATH_B;
  75687. + break;
  75688. + case ANTENNA_C:
  75689. + rfPath = RF_PATH_C;
  75690. + break;
  75691. + }
  75692. +
  75693. + switch (pHalData->rf_chip)
  75694. + {
  75695. + // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!!
  75696. + // We should call normal driver API later!!
  75697. + case RF_8225:
  75698. + case RF_8256:
  75699. + case RF_6052:
  75700. + Hal_SetCCKTxPower(pAdapter, TxPowerLevel);
  75701. + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate
  75702. + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0);
  75703. + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel);
  75704. + break;
  75705. +
  75706. + default:
  75707. + break;
  75708. + }
  75709. +
  75710. +// SetCCKTxPower(pAdapter, TxPower);
  75711. +// SetOFDMTxPower(pAdapter, TxPower);
  75712. +}
  75713. +
  75714. +void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
  75715. +{
  75716. + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;
  75717. +
  75718. + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
  75719. + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
  75720. + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);
  75721. +
  75722. + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
  75723. + write_bbreg(pAdapter, rFPGA0_TxGainStage,
  75724. + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
  75725. +}
  75726. +
  75727. +void Hal_SetDataRate(PADAPTER pAdapter)
  75728. +{
  75729. + Hal_mpt_SwitchRfSetting(pAdapter);
  75730. +}
  75731. +
  75732. +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D)
  75733. +/*------------------------------Define structure----------------------------*/
  75734. +typedef struct _R_ANTENNA_SELECT_OFDM {
  75735. + u32 r_tx_antenna:4;
  75736. + u32 r_ant_l:4;
  75737. + u32 r_ant_non_ht:4;
  75738. + u32 r_ant_ht1:4;
  75739. + u32 r_ant_ht2:4;
  75740. + u32 r_ant_ht_s1:4;
  75741. + u32 r_ant_non_ht_s1:4;
  75742. + u32 OFDM_TXSC:2;
  75743. + u32 Reserved:2;
  75744. +}R_ANTENNA_SELECT_OFDM;
  75745. +
  75746. +typedef struct _R_ANTENNA_SELECT_CCK {
  75747. + u8 r_cckrx_enable_2:2;
  75748. + u8 r_cckrx_enable:2;
  75749. + u8 r_ccktx_enable:4;
  75750. +}R_ANTENNA_SELECT_CCK;
  75751. +#endif
  75752. +
  75753. +void Hal_SetAntenna(PADAPTER pAdapter)
  75754. +{
  75755. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75756. +
  75757. + R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */
  75758. + R_ANTENNA_SELECT_CCK *p_cck_txrx;
  75759. +
  75760. + u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0;
  75761. + u8 chgTx = 0, chgRx = 0;
  75762. + u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0;
  75763. +
  75764. +
  75765. + p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val;
  75766. + p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val;
  75767. +
  75768. + p_ofdm_tx->r_ant_ht1 = 0x1;
  75769. + p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A
  75770. + p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3
  75771. +
  75772. + switch (pAdapter->mppriv.antenna_tx)
  75773. + {
  75774. + case ANTENNA_A:
  75775. + p_ofdm_tx->r_tx_antenna = 0x1;
  75776. + r_ofdm_tx_en_val = 0x1;
  75777. + p_ofdm_tx->r_ant_l = 0x1;
  75778. + p_ofdm_tx->r_ant_ht_s1 = 0x1;
  75779. + p_ofdm_tx->r_ant_non_ht_s1 = 0x1;
  75780. + p_cck_txrx->r_ccktx_enable = 0x8;
  75781. + chgTx = 1;
  75782. +
  75783. + // From SD3 Willis suggestion !!! Set RF A=TX and B as standby
  75784. +// if (IS_HARDWARE_TYPE_8192S(pAdapter))
  75785. + {
  75786. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
  75787. + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1);
  75788. + r_ofdm_tx_en_val = 0x3;
  75789. +
  75790. + // Power save
  75791. + //cosa r_ant_select_ofdm_val = 0x11111111;
  75792. +
  75793. + // We need to close RFB by SW control
  75794. + if (pHalData->rf_type == RF_2T2R)
  75795. + {
  75796. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0);
  75797. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1);
  75798. + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);
  75799. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1);
  75800. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0);
  75801. + }
  75802. + }
  75803. + break;
  75804. +
  75805. + case ANTENNA_B:
  75806. + p_ofdm_tx->r_tx_antenna = 0x2;
  75807. + r_ofdm_tx_en_val = 0x2;
  75808. + p_ofdm_tx->r_ant_l = 0x2;
  75809. + p_ofdm_tx->r_ant_ht_s1 = 0x2;
  75810. + p_ofdm_tx->r_ant_non_ht_s1 = 0x2;
  75811. + p_cck_txrx->r_ccktx_enable = 0x4;
  75812. + chgTx = 1;
  75813. +
  75814. + // From SD3 Willis suggestion !!! Set RF A as standby
  75815. + //if (IS_HARDWARE_TYPE_8192S(pAdapter))
  75816. + {
  75817. + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1);
  75818. + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
  75819. +// r_ofdm_tx_en_val = 0x3;
  75820. +
  75821. + // Power save
  75822. + //cosa r_ant_select_ofdm_val = 0x22222222;
  75823. +
  75824. + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table.
  75825. + // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control
  75826. + if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R)
  75827. + {
  75828. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1);
  75829. + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0);
  75830. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0);
  75831. +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);
  75832. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0);
  75833. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1);
  75834. + }
  75835. + }
  75836. + break;
  75837. +
  75838. + case ANTENNA_AB: // For 8192S
  75839. + p_ofdm_tx->r_tx_antenna = 0x3;
  75840. + r_ofdm_tx_en_val = 0x3;
  75841. + p_ofdm_tx->r_ant_l = 0x3;
  75842. + p_ofdm_tx->r_ant_ht_s1 = 0x3;
  75843. + p_ofdm_tx->r_ant_non_ht_s1 = 0x3;
  75844. + p_cck_txrx->r_ccktx_enable = 0xC;
  75845. + chgTx = 1;
  75846. +
  75847. + // From SD3 Willis suggestion !!! Set RF B as standby
  75848. + //if (IS_HARDWARE_TYPE_8192S(pAdapter))
  75849. + {
  75850. + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);
  75851. + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);
  75852. +
  75853. + // Disable Power save
  75854. + //cosa r_ant_select_ofdm_val = 0x3321333;
  75855. +#if 0
  75856. + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table.
  75857. + if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07.
  75858. + {
  75859. + mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF_PATH_A);
  75860. + }
  75861. +#endif
  75862. + // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control
  75863. + if (pHalData->rf_type == RF_2T2R)
  75864. + {
  75865. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0);
  75866. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0);
  75867. +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);
  75868. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1);
  75869. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1);
  75870. + }
  75871. + }
  75872. + break;
  75873. +
  75874. + default:
  75875. + break;
  75876. + }
  75877. +
  75878. + //
  75879. + // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D
  75880. + // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D
  75881. + // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D
  75882. + //
  75883. + switch (pAdapter->mppriv.antenna_rx)
  75884. + {
  75885. + case ANTENNA_A:
  75886. + r_rx_antenna_ofdm = 0x1; // A
  75887. + p_cck_txrx->r_cckrx_enable = 0x0; // default: A
  75888. + p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A
  75889. + chgRx = 1;
  75890. + break;
  75891. +
  75892. + case ANTENNA_B:
  75893. + r_rx_antenna_ofdm = 0x2; // B
  75894. + p_cck_txrx->r_cckrx_enable = 0x1; // default: B
  75895. + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B
  75896. + chgRx = 1;
  75897. + break;
  75898. +
  75899. + case ANTENNA_AB:
  75900. + r_rx_antenna_ofdm = 0x3; // AB
  75901. + p_cck_txrx->r_cckrx_enable = 0x0; // default:A
  75902. + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B
  75903. + chgRx = 1;
  75904. + break;
  75905. +
  75906. + default:
  75907. + break;
  75908. + }
  75909. +
  75910. + if (chgTx && chgRx)
  75911. + {
  75912. + switch(pHalData->rf_chip)
  75913. + {
  75914. + case RF_8225:
  75915. + case RF_8256:
  75916. + case RF_6052:
  75917. + //r_ant_sel_cck_val = r_ant_select_cck_val;
  75918. + PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx
  75919. + PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx
  75920. + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx
  75921. + PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx
  75922. + PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx
  75923. +
  75924. + break;
  75925. +
  75926. + default:
  75927. + break;
  75928. + }
  75929. + }
  75930. +
  75931. + RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n"));
  75932. +}
  75933. +
  75934. +s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
  75935. +{
  75936. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75937. +
  75938. +
  75939. + if (!netif_running(pAdapter->pnetdev)) {
  75940. + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n"));
  75941. + return _FAIL;
  75942. + }
  75943. +
  75944. + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
  75945. + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n"));
  75946. + return _FAIL;
  75947. + }
  75948. +
  75949. + target_ther &= 0xff;
  75950. + if (target_ther < 0x07)
  75951. + target_ther = 0x07;
  75952. + else if (target_ther > 0x1d)
  75953. + target_ther = 0x1d;
  75954. +
  75955. + pHalData->EEPROMThermalMeter = target_ther;
  75956. +
  75957. + return _SUCCESS;
  75958. +}
  75959. +
  75960. +void Hal_TriggerRFThermalMeter(PADAPTER pAdapter)
  75961. +{
  75962. +
  75963. + write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5]
  75964. +
  75965. +// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" ));
  75966. +}
  75967. +
  75968. +u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter)
  75969. +{
  75970. + u32 ThermalValue = 0;
  75971. +
  75972. + ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0]
  75973. +// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue));
  75974. + return (u8)ThermalValue;
  75975. +}
  75976. +
  75977. +void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value)
  75978. +{
  75979. +#if 0
  75980. + fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER);
  75981. + rtw_msleep_os(1000);
  75982. + fw_cmd_data(pAdapter, value, 1);
  75983. + *value &= 0xFF;
  75984. +#else
  75985. +
  75986. + Hal_TriggerRFThermalMeter(pAdapter);
  75987. + rtw_msleep_os(1000);
  75988. + *value = Hal_ReadRFThermalMeter(pAdapter);
  75989. +#endif
  75990. +}
  75991. +
  75992. +void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)
  75993. +{
  75994. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  75995. + pAdapter->mppriv.MptCtx.bSingleCarrier = bStart;
  75996. + if (bStart)// Start Single Carrier.
  75997. + {
  75998. + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n"));
  75999. + // 1. if OFDM block on?
  76000. + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
  76001. + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on
  76002. +
  76003. + {
  76004. + // 2. set CCK test mode off, set to CCK normal mode
  76005. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
  76006. + // 3. turn on scramble setting
  76007. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  76008. + }
  76009. + // 4. Turn On Single Carrier Tx and turn off the other test modes.
  76010. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  76011. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable);
  76012. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76013. +#ifdef CONFIG_RTL8192C
  76014. + // 5. Disable TX power saving at STF & LLTF
  76015. + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1);
  76016. +#endif
  76017. + }
  76018. + else// Stop Single Carrier.
  76019. + {
  76020. + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n"));
  76021. +
  76022. + // Turn off all test modes.
  76023. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  76024. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  76025. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76026. +#ifdef CONFIG_RTL8192C
  76027. + // Cancel disable TX power saving at STF&LLTF
  76028. + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0);
  76029. +#endif
  76030. + //Delay 10 ms //delay_ms(10);
  76031. + rtw_msleep_os(10);
  76032. +
  76033. + //BB Reset
  76034. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  76035. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  76036. + }
  76037. +}
  76038. +
  76039. +
  76040. +void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
  76041. +{
  76042. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  76043. + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID);
  76044. +
  76045. + u8 rfPath;
  76046. +
  76047. + switch (pAdapter->mppriv.antenna_tx)
  76048. + {
  76049. + case ANTENNA_A:
  76050. + default:
  76051. + rfPath = RF_PATH_A;
  76052. + break;
  76053. + case ANTENNA_B:
  76054. + rfPath = RF_PATH_B;
  76055. + break;
  76056. + case ANTENNA_C:
  76057. + rfPath = RF_PATH_C;
  76058. + break;
  76059. + }
  76060. +
  76061. + pAdapter->mppriv.MptCtx.bSingleTone = bStart;
  76062. + if (bStart)// Start Single Tone.
  76063. + {
  76064. + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n"));
  76065. + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0);
  76066. + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0);
  76067. +
  76068. + if (is92C)
  76069. + {
  76070. + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01);
  76071. + rtw_usleep_os(100);
  76072. + if (rfPath == RF_PATH_A)
  76073. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on.
  76074. + else if (rfPath == RF_PATH_B)
  76075. + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on.
  76076. + } else {
  76077. + write_rfreg(pAdapter, rfPath, 0x21, 0xd4000);
  76078. + rtw_usleep_os(100);
  76079. + }
  76080. +
  76081. + write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on.
  76082. + rtw_usleep_os(100);
  76083. + }
  76084. + else// Stop Single Tone.
  76085. + {
  76086. + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n"));
  76087. + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1);
  76088. + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
  76089. +
  76090. + if (is92C) {
  76091. + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00);
  76092. + rtw_usleep_os(100);
  76093. + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on.
  76094. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on.
  76095. + rtw_usleep_os(100);
  76096. + } else {
  76097. + write_rfreg(pAdapter, rfPath, 0x21, 0x54000);
  76098. + rtw_usleep_os(100);
  76099. +
  76100. + write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on.
  76101. + rtw_usleep_os(100);
  76102. + }
  76103. + }
  76104. +
  76105. +}
  76106. +
  76107. +
  76108. +void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
  76109. +{
  76110. + pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart;
  76111. + if (bStart) // Start Carrier Suppression.
  76112. + {
  76113. + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n"));
  76114. + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B)
  76115. + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M)
  76116. + {
  76117. + // 1. if CCK block on?
  76118. + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))
  76119. + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on
  76120. +
  76121. + //Turn Off All Test Mode
  76122. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  76123. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  76124. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76125. +
  76126. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode
  76127. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting
  76128. +
  76129. + //Set CCK Tx Test Rate
  76130. + //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate);
  76131. + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps
  76132. + }
  76133. + }
  76134. + else// Stop Carrier Suppression.
  76135. + {
  76136. + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n"));
  76137. + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B)
  76138. + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) {
  76139. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode
  76140. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting
  76141. +
  76142. + //BB Reset
  76143. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  76144. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  76145. + }
  76146. + }
  76147. + //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n");
  76148. +}
  76149. +
  76150. +void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)
  76151. +{
  76152. + u32 cckrate;
  76153. +
  76154. + if (bStart)
  76155. + {
  76156. + RT_TRACE(_module_mp_, _drv_alert_,
  76157. + ("SetCCKContinuousTx: test start\n"));
  76158. +
  76159. + // 1. if CCK block on?
  76160. + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))
  76161. + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on
  76162. +
  76163. + //Turn Off All Test Mode
  76164. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  76165. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  76166. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76167. + //Set CCK Tx Test Rate
  76168. + #if 0
  76169. + switch(pAdapter->mppriv.rateidx)
  76170. + {
  76171. + case 2:
  76172. + cckrate = 0;
  76173. + break;
  76174. + case 4:
  76175. + cckrate = 1;
  76176. + break;
  76177. + case 11:
  76178. + cckrate = 2;
  76179. + break;
  76180. + case 22:
  76181. + cckrate = 3;
  76182. + break;
  76183. + default:
  76184. + cckrate = 0;
  76185. + break;
  76186. + }
  76187. + #else
  76188. + cckrate = pAdapter->mppriv.rateidx;
  76189. + #endif
  76190. + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);
  76191. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode
  76192. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting
  76193. +
  76194. +#ifdef CONFIG_RTL8192C
  76195. + // Patch for CCK 11M waveform
  76196. + if (cckrate == MPT_RATE_1M)
  76197. + write_bbreg(pAdapter, 0xA71, BIT(6), bDisable);
  76198. + else
  76199. + write_bbreg(pAdapter, 0xA71, BIT(6), bEnable);
  76200. +#endif
  76201. +
  76202. + }
  76203. + else {
  76204. + RT_TRACE(_module_mp_, _drv_info_,
  76205. + ("SetCCKContinuousTx: test stop\n"));
  76206. +
  76207. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode
  76208. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting
  76209. +
  76210. + //BB Reset
  76211. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  76212. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  76213. + }
  76214. +
  76215. + pAdapter->mppriv.MptCtx.bCckContTx = bStart;
  76216. + pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE;
  76217. +}/* mpt_StartCckContTx */
  76218. +
  76219. +void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)
  76220. +{
  76221. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  76222. +
  76223. + if (bStart) {
  76224. + RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n"));
  76225. + // 1. if OFDM block on?
  76226. + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
  76227. + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on
  76228. + {
  76229. +
  76230. + // 2. set CCK test mode off, set to CCK normal mode
  76231. + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
  76232. +
  76233. + // 3. turn on scramble setting
  76234. + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
  76235. + }
  76236. + // 4. Turn On Continue Tx and turn off the other test modes.
  76237. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable);
  76238. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  76239. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76240. + } else {
  76241. + RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n"));
  76242. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
  76243. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
  76244. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
  76245. + //Delay 10 ms
  76246. + rtw_msleep_os(10);
  76247. + //BB Reset
  76248. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
  76249. + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
  76250. + }
  76251. +
  76252. + pAdapter->mppriv.MptCtx.bCckContTx = _FALSE;
  76253. + pAdapter->mppriv.MptCtx.bOfdmContTx = bStart;
  76254. +}/* mpt_StartOfdmContTx */
  76255. +
  76256. +void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart)
  76257. +{
  76258. +#if 0
  76259. + // ADC turn off [bit24-21] adc port0 ~ port1
  76260. + if (bStart) {
  76261. + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF);
  76262. + rtw_usleep_os(100);
  76263. + }
  76264. +#endif
  76265. + RT_TRACE(_module_mp_, _drv_info_,
  76266. + ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx));
  76267. +
  76268. + pAdapter->mppriv.MptCtx.bStartContTx = bStart;
  76269. + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M)
  76270. + {
  76271. + Hal_SetCCKContinuousTx(pAdapter, bStart);
  76272. + }
  76273. + else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) &&
  76274. + (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15))
  76275. + {
  76276. + Hal_SetOFDMContinuousTx(pAdapter, bStart);
  76277. + }
  76278. +#if 0
  76279. + // ADC turn on [bit24-21] adc port0 ~ port1
  76280. + if (!bStart) {
  76281. + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000);
  76282. + }
  76283. +#endif
  76284. +}
  76285. +
  76286. +#endif // CONFIG_MP_INCLUDE
  76287. --- /dev/null
  76288. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c
  76289. @@ -0,0 +1,4840 @@
  76290. +/******************************************************************************
  76291. + *
  76292. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  76293. + *
  76294. + * This program is free software; you can redistribute it and/or modify it
  76295. + * under the terms of version 2 of the GNU General Public License as
  76296. + * published by the Free Software Foundation.
  76297. + *
  76298. + * This program is distributed in the hope that it will be useful, but WITHOUT
  76299. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  76300. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  76301. + * more details.
  76302. + *
  76303. + * You should have received a copy of the GNU General Public License along with
  76304. + * this program; if not, write to the Free Software Foundation, Inc.,
  76305. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  76306. + *
  76307. + *
  76308. + ******************************************************************************/
  76309. +/******************************************************************************
  76310. +
  76311. + Module: rtl8192c_phycfg.c
  76312. +
  76313. + Note: Merge 92SE/SU PHY config as below
  76314. + 1. BB register R/W API
  76315. + 2. RF register R/W API
  76316. + 3. Initial BB/RF/MAC config by reading BB/MAC/RF txt.
  76317. + 3. Power setting API
  76318. + 4. Channel switch API
  76319. + 5. Initial gain switch API.
  76320. + 6. Other BB/MAC/RF API.
  76321. +
  76322. + Function: PHY: Extern function, phy: local function
  76323. +
  76324. + Export: PHY_FunctionName
  76325. +
  76326. + Abbrev: NONE
  76327. +
  76328. + History:
  76329. + Data Who Remark
  76330. + 08/08/2008 MHC 1. Port from 9x series phycfg.c
  76331. + 2. Reorganize code arch and ad description.
  76332. + 3. Collect similar function.
  76333. + 4. Seperate extern/local API.
  76334. + 08/12/2008 MHC We must merge or move USB PHY relative function later.
  76335. + 10/07/2008 MHC Add IQ calibration for PHY.(Only 1T2R mode now!!!)
  76336. + 11/06/2008 MHC Add TX Power index PG file to config in 0xExx register
  76337. + area to map with EEPROM/EFUSE tx pwr index.
  76338. +
  76339. +******************************************************************************/
  76340. +#define _HAL_8192C_PHYCFG_C_
  76341. +
  76342. +#include <drv_conf.h>
  76343. +#include <osdep_service.h>
  76344. +#include <drv_types.h>
  76345. +#include <rtw_byteorder.h>
  76346. +
  76347. +#ifdef CONFIG_IOL
  76348. +#include <rtw_iol.h>
  76349. +#endif
  76350. +
  76351. +#include <rtl8192c_hal.h>
  76352. +
  76353. +
  76354. +/*---------------------------Define Local Constant---------------------------*/
  76355. +/* Channel switch:The size of command tables for switch channel*/
  76356. +#define MAX_PRECMD_CNT 16
  76357. +#define MAX_RFDEPENDCMD_CNT 16
  76358. +#define MAX_POSTCMD_CNT 16
  76359. +
  76360. +#define MAX_DOZE_WAITING_TIMES_9x 64
  76361. +
  76362. +/*---------------------------Define Local Constant---------------------------*/
  76363. +
  76364. +
  76365. +/*------------------------Define global variable-----------------------------*/
  76366. +
  76367. +/*------------------------Define local variable------------------------------*/
  76368. +
  76369. +
  76370. +/*--------------------Define export function prototype-----------------------*/
  76371. +// Please refer to header file
  76372. +/*--------------------Define export function prototype-----------------------*/
  76373. +
  76374. +/*----------------------------Function Body----------------------------------*/
  76375. +//
  76376. +// 1. BB register R/W API
  76377. +//
  76378. +
  76379. +/**
  76380. +* Function: phy_CalculateBitShift
  76381. +*
  76382. +* OverView: Get shifted position of the BitMask
  76383. +*
  76384. +* Input:
  76385. +* u4Byte BitMask,
  76386. +*
  76387. +* Output: none
  76388. +* Return: u4Byte Return the shift bit bit position of the mask
  76389. +*/
  76390. +static u32
  76391. +phy_CalculateBitShift(
  76392. + u32 BitMask
  76393. + )
  76394. +{
  76395. + u32 i;
  76396. +
  76397. + for(i=0; i<=31; i++)
  76398. + {
  76399. + if ( ((BitMask>>i) & 0x1 ) == 1)
  76400. + break;
  76401. + }
  76402. +
  76403. + return (i);
  76404. +}
  76405. +
  76406. +
  76407. +/**
  76408. +* Function: PHY_QueryBBReg
  76409. +*
  76410. +* OverView: Read "sepcific bits" from BB register
  76411. +*
  76412. +* Input:
  76413. +* PADAPTER Adapter,
  76414. +* u4Byte RegAddr, //The target address to be readback
  76415. +* u4Byte BitMask //The target bit position in the target address
  76416. +* //to be readback
  76417. +* Output: None
  76418. +* Return: u4Byte Data //The readback register value
  76419. +* Note: This function is equal to "GetRegSetting" in PHY programming guide
  76420. +*/
  76421. +u32
  76422. +rtl8192c_PHY_QueryBBReg(
  76423. + IN PADAPTER Adapter,
  76424. + IN u32 RegAddr,
  76425. + IN u32 BitMask
  76426. + )
  76427. +{
  76428. + u32 ReturnValue = 0, OriginalValue, BitShift;
  76429. + u16 BBWaitCounter = 0;
  76430. +
  76431. +#if (DISABLE_BB_RF == 1)
  76432. + return 0;
  76433. +#endif
  76434. +
  76435. + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask));
  76436. +
  76437. + OriginalValue = rtw_read32(Adapter, RegAddr);
  76438. + BitShift = phy_CalculateBitShift(BitMask);
  76439. + ReturnValue = (OriginalValue & BitMask) >> BitShift;
  76440. +
  76441. + //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue));
  76442. + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue));
  76443. +
  76444. + return (ReturnValue);
  76445. +
  76446. +}
  76447. +
  76448. +
  76449. +/**
  76450. +* Function: PHY_SetBBReg
  76451. +*
  76452. +* OverView: Write "Specific bits" to BB register (page 8~)
  76453. +*
  76454. +* Input:
  76455. +* PADAPTER Adapter,
  76456. +* u4Byte RegAddr, //The target address to be modified
  76457. +* u4Byte BitMask //The target bit position in the target address
  76458. +* //to be modified
  76459. +* u4Byte Data //The new register value in the target bit position
  76460. +* //of the target address
  76461. +*
  76462. +* Output: None
  76463. +* Return: None
  76464. +* Note: This function is equal to "PutRegSetting" in PHY programming guide
  76465. +*/
  76466. +
  76467. +VOID
  76468. +rtl8192c_PHY_SetBBReg(
  76469. + IN PADAPTER Adapter,
  76470. + IN u32 RegAddr,
  76471. + IN u32 BitMask,
  76472. + IN u32 Data
  76473. + )
  76474. +{
  76475. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76476. + //u16 BBWaitCounter = 0;
  76477. + u32 OriginalValue, BitShift;
  76478. +
  76479. +#if (DISABLE_BB_RF == 1)
  76480. + return;
  76481. +#endif
  76482. +
  76483. + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data));
  76484. +
  76485. + if(BitMask!= bMaskDWord){//if not "double word" write
  76486. + OriginalValue = rtw_read32(Adapter, RegAddr);
  76487. + BitShift = phy_CalculateBitShift(BitMask);
  76488. + Data = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask));
  76489. + }
  76490. +
  76491. + rtw_write32(Adapter, RegAddr, Data);
  76492. +
  76493. + //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data));
  76494. + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data));
  76495. +
  76496. +}
  76497. +
  76498. +
  76499. +//
  76500. +// 2. RF register R/W API
  76501. +//
  76502. +
  76503. +/*-----------------------------------------------------------------------------
  76504. + * Function: phy_FwRFSerialRead()
  76505. + *
  76506. + * Overview: We support firmware to execute RF-R/W.
  76507. + *
  76508. + * Input: NONE
  76509. + *
  76510. + * Output: NONE
  76511. + *
  76512. + * Return: NONE
  76513. + *
  76514. + * Revised History:
  76515. + * When Who Remark
  76516. + * 01/21/2008 MHC Create Version 0.
  76517. + *
  76518. + *---------------------------------------------------------------------------*/
  76519. +static u32
  76520. +phy_FwRFSerialRead(
  76521. + IN PADAPTER Adapter,
  76522. + IN RF_RADIO_PATH_E eRFPath,
  76523. + IN u32 Offset )
  76524. +{
  76525. + u32 retValue = 0;
  76526. + //RT_ASSERT(FALSE,("deprecate!\n"));
  76527. + return (retValue);
  76528. +
  76529. +} /* phy_FwRFSerialRead */
  76530. +
  76531. +
  76532. +/*-----------------------------------------------------------------------------
  76533. + * Function: phy_FwRFSerialWrite()
  76534. + *
  76535. + * Overview: We support firmware to execute RF-R/W.
  76536. + *
  76537. + * Input: NONE
  76538. + *
  76539. + * Output: NONE
  76540. + *
  76541. + * Return: NONE
  76542. + *
  76543. + * Revised History:
  76544. + * When Who Remark
  76545. + * 01/21/2008 MHC Create Version 0.
  76546. + *
  76547. + *---------------------------------------------------------------------------*/
  76548. +static VOID
  76549. +phy_FwRFSerialWrite(
  76550. + IN PADAPTER Adapter,
  76551. + IN RF_RADIO_PATH_E eRFPath,
  76552. + IN u32 Offset,
  76553. + IN u32 Data )
  76554. +{
  76555. + //RT_ASSERT(FALSE,("deprecate!\n"));
  76556. +}
  76557. +
  76558. +
  76559. +/**
  76560. +* Function: phy_RFSerialRead
  76561. +*
  76562. +* OverView: Read regster from RF chips
  76563. +*
  76564. +* Input:
  76565. +* PADAPTER Adapter,
  76566. +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
  76567. +* u4Byte Offset, //The target address to be read
  76568. +*
  76569. +* Output: None
  76570. +* Return: u4Byte reback value
  76571. +* Note: Threre are three types of serial operations:
  76572. +* 1. Software serial write
  76573. +* 2. Hardware LSSI-Low Speed Serial Interface
  76574. +* 3. Hardware HSSI-High speed
  76575. +* serial write. Driver need to implement (1) and (2).
  76576. +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
  76577. +*/
  76578. +static u32
  76579. +phy_RFSerialRead(
  76580. + IN PADAPTER Adapter,
  76581. + IN RF_RADIO_PATH_E eRFPath,
  76582. + IN u32 Offset
  76583. + )
  76584. +{
  76585. + u32 retValue = 0;
  76586. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76587. + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
  76588. + u32 NewOffset;
  76589. + u32 tmplong,tmplong2;
  76590. + u8 RfPiEnable=0;
  76591. +#if 0
  76592. + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs
  76593. + return retValue;
  76594. + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs
  76595. + return retValue;
  76596. +#endif
  76597. + //
  76598. + // Make sure RF register offset is correct
  76599. + //
  76600. + Offset &= 0x3f;
  76601. +
  76602. + //
  76603. + // Switch page for 8256 RF IC
  76604. + //
  76605. + NewOffset = Offset;
  76606. +
  76607. + // 2009/06/17 MH We can not execute IO for power save or other accident mode.
  76608. + //if(RT_CANNOT_IO(Adapter))
  76609. + //{
  76610. + // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n"));
  76611. + // return 0xFFFFFFFF;
  76612. + //}
  76613. +
  76614. + // For 92S LSSI Read RFLSSIRead
  76615. + // For RF A/B write 0x824/82c(does not work in the future)
  76616. + // We must use 0x824 for RF A and B to execute read trigger
  76617. + tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord);
  76618. + if(eRFPath == RF_PATH_A)
  76619. + tmplong2 = tmplong;
  76620. + else
  76621. + tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord);
  76622. +
  76623. + tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF
  76624. +
  76625. + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge));
  76626. + rtw_udelay_os(10);// PlatformStallExecution(10);
  76627. +
  76628. + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2);
  76629. + rtw_udelay_os(100);//PlatformStallExecution(100);
  76630. +
  76631. + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge);
  76632. + rtw_udelay_os(10);//PlatformStallExecution(10);
  76633. +
  76634. + if(eRFPath == RF_PATH_A)
  76635. + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8);
  76636. + else if(eRFPath == RF_PATH_B)
  76637. + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8);
  76638. +
  76639. + if(RfPiEnable)
  76640. + { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF
  76641. + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData);
  76642. + //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue);
  76643. + }
  76644. + else
  76645. + { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF
  76646. + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);
  76647. + //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue);
  76648. + }
  76649. + //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue);
  76650. +
  76651. + return retValue;
  76652. +
  76653. +}
  76654. +
  76655. +
  76656. +
  76657. +/**
  76658. +* Function: phy_RFSerialWrite
  76659. +*
  76660. +* OverView: Write data to RF register (page 8~)
  76661. +*
  76662. +* Input:
  76663. +* PADAPTER Adapter,
  76664. +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
  76665. +* u4Byte Offset, //The target address to be read
  76666. +* u4Byte Data //The new register Data in the target bit position
  76667. +* //of the target to be read
  76668. +*
  76669. +* Output: None
  76670. +* Return: None
  76671. +* Note: Threre are three types of serial operations:
  76672. +* 1. Software serial write
  76673. +* 2. Hardware LSSI-Low Speed Serial Interface
  76674. +* 3. Hardware HSSI-High speed
  76675. +* serial write. Driver need to implement (1) and (2).
  76676. +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
  76677. + *
  76678. + * Note: For RF8256 only
  76679. + * The total count of RTL8256(Zebra4) register is around 36 bit it only employs
  76680. + * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
  76681. + * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
  76682. + * programming guide" for more details.
  76683. + * Thus, we define a sub-finction for RTL8526 register address conversion
  76684. + * ===========================================================
  76685. + * Register Mode RegCTL[1] RegCTL[0] Note
  76686. + * (Reg00[12]) (Reg00[10])
  76687. + * ===========================================================
  76688. + * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf)
  76689. + * ------------------------------------------------------------------
  76690. + * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf)
  76691. + * ------------------------------------------------------------------
  76692. + * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf)
  76693. + * ------------------------------------------------------------------
  76694. + *
  76695. + * 2008/09/02 MH Add 92S RF definition
  76696. + *
  76697. + *
  76698. + *
  76699. +*/
  76700. +static VOID
  76701. +phy_RFSerialWrite(
  76702. + IN PADAPTER Adapter,
  76703. + IN RF_RADIO_PATH_E eRFPath,
  76704. + IN u32 Offset,
  76705. + IN u32 Data
  76706. + )
  76707. +{
  76708. + u32 DataAndAddr = 0;
  76709. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76710. + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
  76711. + u32 NewOffset;
  76712. +
  76713. +#if 0
  76714. + //<Roger_TODO> We should check valid regs for RF_6052 case.
  76715. + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs
  76716. + return;
  76717. + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs
  76718. + return;
  76719. +#endif
  76720. +
  76721. + // 2009/06/17 MH We can not execute IO for power save or other accident mode.
  76722. + //if(RT_CANNOT_IO(Adapter))
  76723. + //{
  76724. + // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n"));
  76725. + // return;
  76726. + //}
  76727. +
  76728. + Offset &= 0x3f;
  76729. +
  76730. + //
  76731. + // Shadow Update
  76732. + //
  76733. + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data);
  76734. +
  76735. + //
  76736. + // Switch page for 8256 RF IC
  76737. + //
  76738. + NewOffset = Offset;
  76739. +
  76740. + //
  76741. + // Put write addr in [5:0] and write data in [31:16]
  76742. + //
  76743. + //DataAndAddr = (Data<<16) | (NewOffset&0x3f);
  76744. + DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF
  76745. +
  76746. + //
  76747. + // Write Operation
  76748. + //
  76749. + PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
  76750. + //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr));
  76751. +
  76752. +}
  76753. +
  76754. +
  76755. +/**
  76756. +* Function: PHY_QueryRFReg
  76757. +*
  76758. +* OverView: Query "Specific bits" to RF register (page 8~)
  76759. +*
  76760. +* Input:
  76761. +* PADAPTER Adapter,
  76762. +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
  76763. +* u4Byte RegAddr, //The target address to be read
  76764. +* u4Byte BitMask //The target bit position in the target address
  76765. +* //to be read
  76766. +*
  76767. +* Output: None
  76768. +* Return: u4Byte Readback value
  76769. +* Note: This function is equal to "GetRFRegSetting" in PHY programming guide
  76770. +*/
  76771. +u32
  76772. +rtl8192c_PHY_QueryRFReg(
  76773. + IN PADAPTER Adapter,
  76774. + IN RF_RADIO_PATH_E eRFPath,
  76775. + IN u32 RegAddr,
  76776. + IN u32 BitMask
  76777. + )
  76778. +{
  76779. + u32 Original_Value, Readback_Value, BitShift;
  76780. + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76781. + //u8 RFWaitCounter = 0;
  76782. + //_irqL irqL;
  76783. +
  76784. +#if (DISABLE_BB_RF == 1)
  76785. + return 0;
  76786. +#endif
  76787. +
  76788. + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask));
  76789. +
  76790. +#ifdef CONFIG_USB_HCI
  76791. + //PlatformAcquireMutex(&pHalData->mxRFOperate);
  76792. +#else
  76793. + //_enter_critical(&pHalData->rf_lock, &irqL);
  76794. +#endif
  76795. +
  76796. +
  76797. + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr);
  76798. +
  76799. + BitShift = phy_CalculateBitShift(BitMask);
  76800. + Readback_Value = (Original_Value & BitMask) >> BitShift;
  76801. +
  76802. +#ifdef CONFIG_USB_HCI
  76803. + //PlatformReleaseMutex(&pHalData->mxRFOperate);
  76804. +#else
  76805. + //_exit_critical(&pHalData->rf_lock, &irqL);
  76806. +#endif
  76807. +
  76808. +
  76809. + //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask,
  76810. + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n",
  76811. + // RegAddr, eRFPath, Original_Value));
  76812. +
  76813. + return (Readback_Value);
  76814. +}
  76815. +
  76816. +/**
  76817. +* Function: PHY_SetRFReg
  76818. +*
  76819. +* OverView: Write "Specific bits" to RF register (page 8~)
  76820. +*
  76821. +* Input:
  76822. +* PADAPTER Adapter,
  76823. +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
  76824. +* u4Byte RegAddr, //The target address to be modified
  76825. +* u4Byte BitMask //The target bit position in the target address
  76826. +* //to be modified
  76827. +* u4Byte Data //The new register Data in the target bit position
  76828. +* //of the target address
  76829. +*
  76830. +* Output: None
  76831. +* Return: None
  76832. +* Note: This function is equal to "PutRFRegSetting" in PHY programming guide
  76833. +*/
  76834. +VOID
  76835. +rtl8192c_PHY_SetRFReg(
  76836. + IN PADAPTER Adapter,
  76837. + IN RF_RADIO_PATH_E eRFPath,
  76838. + IN u32 RegAddr,
  76839. + IN u32 BitMask,
  76840. + IN u32 Data
  76841. + )
  76842. +{
  76843. +
  76844. + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76845. + //u1Byte RFWaitCounter = 0;
  76846. + u32 Original_Value, BitShift;
  76847. + //_irqL irqL;
  76848. +
  76849. +#if (DISABLE_BB_RF == 1)
  76850. + return;
  76851. +#endif
  76852. +
  76853. + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",
  76854. + // RegAddr, BitMask, Data, eRFPath));
  76855. + //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",
  76856. + // RegAddr, BitMask, Data, eRFPath));
  76857. +
  76858. +
  76859. +#ifdef CONFIG_USB_HCI
  76860. + //PlatformAcquireMutex(&pHalData->mxRFOperate);
  76861. +#else
  76862. + //_enter_critical(&pHalData->rf_lock, &irqL);
  76863. +#endif
  76864. +
  76865. +
  76866. + // RF data is 12 bits only
  76867. + if (BitMask != bRFRegOffsetMask)
  76868. + {
  76869. + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr);
  76870. + BitShift = phy_CalculateBitShift(BitMask);
  76871. + Data = ((Original_Value & (~BitMask)) | (Data<< BitShift));
  76872. + }
  76873. +
  76874. + phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data);
  76875. +
  76876. +
  76877. +
  76878. +#ifdef CONFIG_USB_HCI
  76879. + //PlatformReleaseMutex(&pHalData->mxRFOperate);
  76880. +#else
  76881. + //_exit_critical(&pHalData->rf_lock, &irqL);
  76882. +#endif
  76883. +
  76884. + //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask);
  76885. + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",
  76886. + // RegAddr, BitMask, Data, eRFPath));
  76887. +
  76888. +}
  76889. +
  76890. +
  76891. +//
  76892. +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.
  76893. +//
  76894. +
  76895. +/*-----------------------------------------------------------------------------
  76896. + * Function: phy_ConfigMACWithParaFile()
  76897. + *
  76898. + * Overview: This function read BB parameters from general file format, and do register
  76899. + * Read/Write
  76900. + *
  76901. + * Input: PADAPTER Adapter
  76902. + * ps1Byte pFileName
  76903. + *
  76904. + * Output: NONE
  76905. + *
  76906. + * Return: RT_STATUS_SUCCESS: configuration file exist
  76907. + *
  76908. + * Note: The format of MACPHY_REG.txt is different from PHY and RF.
  76909. + * [Register][Mask][Value]
  76910. + *---------------------------------------------------------------------------*/
  76911. +static int
  76912. +phy_ConfigMACWithParaFile(
  76913. + IN PADAPTER Adapter,
  76914. + IN u8* pFileName
  76915. +)
  76916. +{
  76917. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76918. +
  76919. + int rtStatus = _SUCCESS;
  76920. +
  76921. + return rtStatus;
  76922. +}
  76923. +
  76924. +/*-----------------------------------------------------------------------------
  76925. + * Function: phy_ConfigMACWithHeaderFile()
  76926. + *
  76927. + * Overview: This function read BB parameters from Header file we gen, and do register
  76928. + * Read/Write
  76929. + *
  76930. + * Input: PADAPTER Adapter
  76931. + * ps1Byte pFileName
  76932. + *
  76933. + * Output: NONE
  76934. + *
  76935. + * Return: RT_STATUS_SUCCESS: configuration file exist
  76936. + *
  76937. + * Note: The format of MACPHY_REG.txt is different from PHY and RF.
  76938. + * [Register][Mask][Value]
  76939. + *---------------------------------------------------------------------------*/
  76940. +static int
  76941. +phy_ConfigMACWithHeaderFile(
  76942. + IN PADAPTER Adapter
  76943. +)
  76944. +{
  76945. + u32 i = 0;
  76946. + u32 ArrayLength = 0;
  76947. + u32* ptrArray;
  76948. + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  76949. +
  76950. + //2008.11.06 Modified by tynli.
  76951. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n"));
  76952. + ArrayLength = MAC_2T_ArrayLength;
  76953. + ptrArray = Rtl819XMAC_Array;
  76954. +
  76955. +#ifdef CONFIG_IOL_MAC
  76956. + if(rtw_IOL_applied(Adapter))
  76957. + {
  76958. + struct xmit_frame *xmit_frame;
  76959. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)
  76960. + return _FAIL;
  76961. +
  76962. + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column
  76963. + rtw_IOL_append_WB_cmd(xmit_frame, ptrArray[i], (u8)ptrArray[i+1]);
  76964. + }
  76965. +
  76966. + return rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  76967. + }
  76968. + else
  76969. +#endif
  76970. + {
  76971. + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column
  76972. + rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]);
  76973. + }
  76974. + }
  76975. +
  76976. + return _SUCCESS;
  76977. +
  76978. +}
  76979. +
  76980. +
  76981. +/*-----------------------------------------------------------------------------
  76982. + * Function: PHY_MACConfig8192C
  76983. + *
  76984. + * Overview: Condig MAC by header file or parameter file.
  76985. + *
  76986. + * Input: NONE
  76987. + *
  76988. + * Output: NONE
  76989. + *
  76990. + * Return: NONE
  76991. + *
  76992. + * Revised History:
  76993. + * When Who Remark
  76994. + * 08/12/2008 MHC Create Version 0.
  76995. + *
  76996. + *---------------------------------------------------------------------------*/
  76997. +int
  76998. +PHY_MACConfig8192C(
  76999. + IN PADAPTER Adapter
  77000. + )
  77001. +{
  77002. + int rtStatus = _SUCCESS;
  77003. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77004. + s8 *pszMACRegFile;
  77005. + s8 sz88CMACRegFile[] = RTL8188C_PHY_MACREG;
  77006. + s8 sz92CMACRegFile[] = RTL8192C_PHY_MACREG;
  77007. + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID);
  77008. +
  77009. + if(is92C)
  77010. + pszMACRegFile = sz92CMACRegFile;
  77011. + else
  77012. + pszMACRegFile = sz88CMACRegFile;
  77013. +
  77014. + //
  77015. + // Config MAC
  77016. + //
  77017. +#ifdef CONFIG_EMBEDDED_FWIMG
  77018. + rtStatus = phy_ConfigMACWithHeaderFile(Adapter);
  77019. +#else
  77020. +
  77021. + // Not make sure EEPROM, add later
  77022. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n"));
  77023. + rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile);
  77024. +#endif
  77025. +
  77026. +#ifdef CONFIG_PCI_HCI
  77027. + //this switching setting cause some 8192cu hw have redownload fw fail issue
  77028. + //improve 2-stream TX EVM by Jenyu
  77029. + if(is92C)
  77030. + rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71);
  77031. +#endif
  77032. +
  77033. +
  77034. + // 2010.07.13 AMPDU aggregation number 9
  77035. + //rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM);
  77036. + rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18.
  77037. +#ifdef CONFIG_USB_HCI
  77038. + if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType))
  77039. + rtw_write8(Adapter, 0x40,0x04);
  77040. +#endif
  77041. +
  77042. + return rtStatus;
  77043. +
  77044. +}
  77045. +
  77046. +
  77047. +/**
  77048. +* Function: phy_InitBBRFRegisterDefinition
  77049. +*
  77050. +* OverView: Initialize Register definition offset for Radio Path A/B/C/D
  77051. +*
  77052. +* Input:
  77053. +* PADAPTER Adapter,
  77054. +*
  77055. +* Output: None
  77056. +* Return: None
  77057. +* Note: The initialization value is constant and it should never be changes
  77058. +*/
  77059. +static VOID
  77060. +phy_InitBBRFRegisterDefinition(
  77061. + IN PADAPTER Adapter
  77062. +)
  77063. +{
  77064. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77065. +
  77066. + // RF Interface Sowrtware Control
  77067. + pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870
  77068. + pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)
  77069. + pHalData->PHYRegDef[RF_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874
  77070. + pHalData->PHYRegDef[RF_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876)
  77071. +
  77072. + // RF Interface Readback Value
  77073. + pHalData->PHYRegDef[RF_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0
  77074. + pHalData->PHYRegDef[RF_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2)
  77075. + pHalData->PHYRegDef[RF_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4
  77076. + pHalData->PHYRegDef[RF_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6)
  77077. +
  77078. + // RF Interface Output (and Enable)
  77079. + pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860
  77080. + pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864
  77081. +
  77082. + // RF Interface (Output and) Enable
  77083. + pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)
  77084. + pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)
  77085. +
  77086. + //Addr of LSSI. Wirte RF register by driver
  77087. + pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter
  77088. + pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
  77089. +
  77090. + // RF parameter
  77091. + pHalData->PHYRegDef[RF_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select
  77092. + pHalData->PHYRegDef[RF_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
  77093. + pHalData->PHYRegDef[RF_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
  77094. + pHalData->PHYRegDef[RF_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
  77095. +
  77096. + // Tx AGC Gain Stage (same for all path. Should we remove this?)
  77097. + pHalData->PHYRegDef[RF_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
  77098. + pHalData->PHYRegDef[RF_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
  77099. + pHalData->PHYRegDef[RF_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
  77100. + pHalData->PHYRegDef[RF_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
  77101. +
  77102. + // Tranceiver A~D HSSI Parameter-1
  77103. + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1
  77104. + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1
  77105. +
  77106. + // Tranceiver A~D HSSI Parameter-2
  77107. + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2
  77108. + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2
  77109. +
  77110. + // RF switch Control
  77111. + pHalData->PHYRegDef[RF_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control
  77112. + pHalData->PHYRegDef[RF_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
  77113. + pHalData->PHYRegDef[RF_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
  77114. + pHalData->PHYRegDef[RF_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
  77115. +
  77116. + // AGC control 1
  77117. + pHalData->PHYRegDef[RF_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
  77118. + pHalData->PHYRegDef[RF_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
  77119. + pHalData->PHYRegDef[RF_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
  77120. + pHalData->PHYRegDef[RF_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
  77121. +
  77122. + // AGC control 2
  77123. + pHalData->PHYRegDef[RF_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
  77124. + pHalData->PHYRegDef[RF_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
  77125. + pHalData->PHYRegDef[RF_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
  77126. + pHalData->PHYRegDef[RF_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
  77127. +
  77128. + // RX AFE control 1
  77129. + pHalData->PHYRegDef[RF_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
  77130. + pHalData->PHYRegDef[RF_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
  77131. + pHalData->PHYRegDef[RF_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
  77132. + pHalData->PHYRegDef[RF_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
  77133. +
  77134. + // RX AFE control 1
  77135. + pHalData->PHYRegDef[RF_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
  77136. + pHalData->PHYRegDef[RF_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
  77137. + pHalData->PHYRegDef[RF_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
  77138. + pHalData->PHYRegDef[RF_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
  77139. +
  77140. + // Tx AFE control 1
  77141. + pHalData->PHYRegDef[RF_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
  77142. + pHalData->PHYRegDef[RF_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
  77143. + pHalData->PHYRegDef[RF_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
  77144. + pHalData->PHYRegDef[RF_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
  77145. +
  77146. + // Tx AFE control 2
  77147. + pHalData->PHYRegDef[RF_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
  77148. + pHalData->PHYRegDef[RF_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
  77149. + pHalData->PHYRegDef[RF_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
  77150. + pHalData->PHYRegDef[RF_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
  77151. +
  77152. + // Tranceiver LSSI Readback SI mode
  77153. + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
  77154. + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
  77155. + pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
  77156. + pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
  77157. +
  77158. + // Tranceiver LSSI Readback PI mode
  77159. + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
  77160. + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
  77161. + //pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack;
  77162. + //pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack;
  77163. +
  77164. +}
  77165. +
  77166. +
  77167. +/*-----------------------------------------------------------------------------
  77168. + * Function: phy_ConfigBBWithParaFile()
  77169. + *
  77170. + * Overview: This function read BB parameters from general file format, and do register
  77171. + * Read/Write
  77172. + *
  77173. + * Input: PADAPTER Adapter
  77174. + * ps1Byte pFileName
  77175. + *
  77176. + * Output: NONE
  77177. + *
  77178. + * Return: RT_STATUS_SUCCESS: configuration file exist
  77179. + * 2008/11/06 MH For 92S we do not support silent reset now. Disable
  77180. + * parameter file compare!!!!!!??
  77181. + *
  77182. + *---------------------------------------------------------------------------*/
  77183. +static int
  77184. +phy_ConfigBBWithParaFile(
  77185. + IN PADAPTER Adapter,
  77186. + IN u8* pFileName
  77187. +)
  77188. +{
  77189. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77190. +
  77191. + int rtStatus = _SUCCESS;
  77192. +
  77193. + return rtStatus;
  77194. +}
  77195. +
  77196. +
  77197. +
  77198. +//****************************************
  77199. +// The following is for High Power PA
  77200. +//****************************************
  77201. +VOID
  77202. +phy_ConfigBBExternalPA(
  77203. + IN PADAPTER Adapter
  77204. +)
  77205. +{
  77206. +#ifdef CONFIG_USB_HCI
  77207. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77208. + u16 i=0;
  77209. + u32 temp=0;
  77210. +
  77211. + if(!pHalData->ExternalPA)
  77212. + {
  77213. + return;
  77214. + }
  77215. +
  77216. + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the
  77217. + // same code as SU. It is already updated in PHY_REG_1T_HP.txt.
  77218. +#if 0
  77219. + PHY_SetBBReg(Adapter, 0xee8, BIT28, 1);
  77220. + temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord);
  77221. + temp |= (BIT26|BIT21|BIT10|BIT5);
  77222. + PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp);
  77223. + PHY_SetBBReg(Adapter, 0x870, BIT10, 0);
  77224. + PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080);
  77225. + PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100);
  77226. +#endif
  77227. +
  77228. +#endif
  77229. +}
  77230. +
  77231. +/*-----------------------------------------------------------------------------
  77232. + * Function: phy_ConfigBBWithHeaderFile()
  77233. + *
  77234. + * Overview: This function read BB parameters from general file format, and do register
  77235. + * Read/Write
  77236. + *
  77237. + * Input: PADAPTER Adapter
  77238. + * u1Byte ConfigType 0 => PHY_CONFIG
  77239. + * 1 =>AGC_TAB
  77240. + *
  77241. + * Output: NONE
  77242. + *
  77243. + * Return: RT_STATUS_SUCCESS: configuration file exist
  77244. + *
  77245. + *---------------------------------------------------------------------------*/
  77246. +static int
  77247. +phy_ConfigBBWithHeaderFile(
  77248. + IN PADAPTER Adapter,
  77249. + IN u8 ConfigType
  77250. +)
  77251. +{
  77252. + int i;
  77253. + u32* Rtl819XPHY_REGArray_Table;
  77254. + u32* Rtl819XAGCTAB_Array_Table;
  77255. + u16 PHY_REGArrayLen, AGCTAB_ArrayLen;
  77256. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77257. + int ret = _SUCCESS;
  77258. +
  77259. + //
  77260. + // 2009.11.24. Modified by tynli.
  77261. + //
  77262. + if(IS_92C_SERIAL(pHalData->VersionID))
  77263. + {
  77264. + AGCTAB_ArrayLen = AGCTAB_2TArrayLength;
  77265. + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_2TArray;
  77266. + PHY_REGArrayLen = PHY_REG_2TArrayLength;
  77267. + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2TArray;
  77268. +#ifdef CONFIG_USB_HCI
  77269. + if(pHalData->BoardType == BOARD_MINICARD )
  77270. + {
  77271. + PHY_REGArrayLen = PHY_REG_2T_mCardArrayLength;
  77272. + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2T_mCardArray;
  77273. + }
  77274. +#endif
  77275. + }
  77276. + else
  77277. + {
  77278. + AGCTAB_ArrayLen = AGCTAB_1TArrayLength;
  77279. + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1TArray;
  77280. + PHY_REGArrayLen = PHY_REG_1TArrayLength;
  77281. + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1TArray;
  77282. +#ifdef CONFIG_USB_HCI
  77283. + if(pHalData->BoardType == BOARD_MINICARD )
  77284. + {
  77285. + PHY_REGArrayLen = PHY_REG_1T_mCardArrayLength;
  77286. + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_mCardArray;
  77287. + }
  77288. + else if(pHalData->BoardType == BOARD_USB_High_PA)
  77289. + {
  77290. + AGCTAB_ArrayLen = AGCTAB_1T_HPArrayLength;
  77291. + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1T_HPArray;
  77292. + PHY_REGArrayLen = PHY_REG_1T_HPArrayLength;
  77293. + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_HPArray;
  77294. + }
  77295. +#endif
  77296. + }
  77297. +
  77298. + if(ConfigType == BaseBand_Config_PHY_REG)
  77299. + {
  77300. + #ifdef CONFIG_IOL_BB_PHY_REG
  77301. + if(rtw_IOL_applied(Adapter))
  77302. + {
  77303. + struct xmit_frame *xmit_frame;
  77304. + u32 tmp_value;
  77305. +
  77306. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {
  77307. + ret = _FAIL;
  77308. + goto exit;
  77309. + }
  77310. +
  77311. + for(i=0;i<PHY_REGArrayLen;i=i+2)
  77312. + {
  77313. + tmp_value=Rtl819XPHY_REGArray_Table[i+1];
  77314. +
  77315. + if (Rtl819XPHY_REGArray_Table[i] == 0xfe)
  77316. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);
  77317. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfd)
  77318. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);
  77319. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfc)
  77320. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);
  77321. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfb)
  77322. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);
  77323. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfa)
  77324. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);
  77325. + else if (Rtl819XPHY_REGArray_Table[i] == 0xf9)
  77326. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);
  77327. +
  77328. + rtw_IOL_append_WD_cmd(xmit_frame, Rtl819XPHY_REGArray_Table[i], tmp_value);
  77329. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]));
  77330. + }
  77331. +
  77332. + ret = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  77333. + }
  77334. + else
  77335. + #endif
  77336. + {
  77337. + for(i=0;i<PHY_REGArrayLen;i=i+2)
  77338. + {
  77339. + if (Rtl819XPHY_REGArray_Table[i] == 0xfe){
  77340. + #ifdef CONFIG_LONG_DELAY_ISSUE
  77341. + rtw_msleep_os(50);
  77342. + #else
  77343. + rtw_mdelay_os(50);
  77344. + #endif
  77345. + }
  77346. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfd)
  77347. + rtw_mdelay_os(5);
  77348. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfc)
  77349. + rtw_mdelay_os(1);
  77350. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfb)
  77351. + rtw_udelay_os(50);
  77352. + else if (Rtl819XPHY_REGArray_Table[i] == 0xfa)
  77353. + rtw_udelay_os(5);
  77354. + else if (Rtl819XPHY_REGArray_Table[i] == 0xf9)
  77355. + rtw_udelay_os(1);
  77356. +
  77357. + PHY_SetBBReg(Adapter, Rtl819XPHY_REGArray_Table[i], bMaskDWord, Rtl819XPHY_REGArray_Table[i+1]);
  77358. +
  77359. + // Add 1us delay between BB/RF register setting.
  77360. + rtw_udelay_os(1);
  77361. +
  77362. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]));
  77363. + }
  77364. + }
  77365. +
  77366. + // for External PA
  77367. + phy_ConfigBBExternalPA(Adapter);
  77368. + }
  77369. + else if(ConfigType == BaseBand_Config_AGC_TAB)
  77370. + {
  77371. + #ifdef CONFIG_IOL_BB_AGC_TAB
  77372. + if(rtw_IOL_applied(Adapter))
  77373. + {
  77374. + struct xmit_frame *xmit_frame;
  77375. +
  77376. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {
  77377. + ret = _FAIL;
  77378. + goto exit;
  77379. + }
  77380. +
  77381. + for(i=0;i<AGCTAB_ArrayLen;i=i+2)
  77382. + {
  77383. + rtw_IOL_append_WD_cmd(xmit_frame, Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]);
  77384. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XAGCTAB_Array_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]));
  77385. + }
  77386. +
  77387. + ret = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  77388. + }
  77389. + else
  77390. + #endif
  77391. + {
  77392. + for(i=0;i<AGCTAB_ArrayLen;i=i+2)
  77393. + {
  77394. + PHY_SetBBReg(Adapter, Rtl819XAGCTAB_Array_Table[i], bMaskDWord, Rtl819XAGCTAB_Array_Table[i+1]);
  77395. +
  77396. + // Add 1us delay between BB/RF register setting.
  77397. + rtw_udelay_os(1);
  77398. +
  77399. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XAGCTAB_Array_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]));
  77400. + }
  77401. + }
  77402. + }
  77403. +
  77404. +exit:
  77405. + return ret;
  77406. +
  77407. +}
  77408. +
  77409. +
  77410. +VOID
  77411. +storePwrIndexDiffRateOffset(
  77412. + IN PADAPTER Adapter,
  77413. + IN u32 RegAddr,
  77414. + IN u32 BitMask,
  77415. + IN u32 Data
  77416. + )
  77417. +{
  77418. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77419. +
  77420. + if(RegAddr == rTxAGC_A_Rate18_06)
  77421. + {
  77422. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data;
  77423. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt,
  77424. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0]));
  77425. + }
  77426. + if(RegAddr == rTxAGC_A_Rate54_24)
  77427. + {
  77428. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data;
  77429. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt,
  77430. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1]));
  77431. + }
  77432. + if(RegAddr == rTxAGC_A_CCK1_Mcs32)
  77433. + {
  77434. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data;
  77435. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt,
  77436. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6]));
  77437. + }
  77438. + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00)
  77439. + {
  77440. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data;
  77441. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt,
  77442. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7]));
  77443. + }
  77444. + if(RegAddr == rTxAGC_A_Mcs03_Mcs00)
  77445. + {
  77446. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data;
  77447. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt,
  77448. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2]));
  77449. + }
  77450. + if(RegAddr == rTxAGC_A_Mcs07_Mcs04)
  77451. + {
  77452. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data;
  77453. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt,
  77454. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3]));
  77455. + }
  77456. + if(RegAddr == rTxAGC_A_Mcs11_Mcs08)
  77457. + {
  77458. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data;
  77459. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt,
  77460. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4]));
  77461. + }
  77462. + if(RegAddr == rTxAGC_A_Mcs15_Mcs12)
  77463. + {
  77464. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data;
  77465. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt,
  77466. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5]));
  77467. + }
  77468. + if(RegAddr == rTxAGC_B_Rate18_06)
  77469. + {
  77470. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data;
  77471. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt,
  77472. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8]));
  77473. + }
  77474. + if(RegAddr == rTxAGC_B_Rate54_24)
  77475. + {
  77476. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data;
  77477. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt,
  77478. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9]));
  77479. + }
  77480. + if(RegAddr == rTxAGC_B_CCK1_55_Mcs32)
  77481. + {
  77482. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data;
  77483. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt,
  77484. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14]));
  77485. + }
  77486. + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff)
  77487. + {
  77488. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data;
  77489. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt,
  77490. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15]));
  77491. + }
  77492. + if(RegAddr == rTxAGC_B_Mcs03_Mcs00)
  77493. + {
  77494. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data;
  77495. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt,
  77496. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10]));
  77497. + }
  77498. + if(RegAddr == rTxAGC_B_Mcs07_Mcs04)
  77499. + {
  77500. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data;
  77501. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt,
  77502. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11]));
  77503. + }
  77504. + if(RegAddr == rTxAGC_B_Mcs11_Mcs08)
  77505. + {
  77506. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data;
  77507. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt,
  77508. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12]));
  77509. + }
  77510. + if(RegAddr == rTxAGC_B_Mcs15_Mcs12)
  77511. + {
  77512. + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data;
  77513. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt,
  77514. + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13]));
  77515. + pHalData->pwrGroupCnt++;
  77516. + }
  77517. +}
  77518. +/*-----------------------------------------------------------------------------
  77519. + * Function: phy_ConfigBBWithPgParaFile
  77520. + *
  77521. + * Overview:
  77522. + *
  77523. + * Input: NONE
  77524. + *
  77525. + * Output: NONE
  77526. + *
  77527. + * Return: NONE
  77528. + *
  77529. + * Revised History:
  77530. + * When Who Remark
  77531. + * 11/06/2008 MHC Create Version 0.
  77532. + * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset
  77533. + *---------------------------------------------------------------------------*/
  77534. +static int
  77535. +phy_ConfigBBWithPgParaFile(
  77536. + IN PADAPTER Adapter,
  77537. + IN u8* pFileName)
  77538. +{
  77539. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77540. +
  77541. + int rtStatus = _SUCCESS;
  77542. +
  77543. +
  77544. + return rtStatus;
  77545. +
  77546. +} /* phy_ConfigBBWithPgParaFile */
  77547. +
  77548. +
  77549. +/*-----------------------------------------------------------------------------
  77550. + * Function: phy_ConfigBBWithPgHeaderFile
  77551. + *
  77552. + * Overview: Config PHY_REG_PG array
  77553. + *
  77554. + * Input: NONE
  77555. + *
  77556. + * Output: NONE
  77557. + *
  77558. + * Return: NONE
  77559. + *
  77560. + * Revised History:
  77561. + * When Who Remark
  77562. + * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!!
  77563. + * 11/10/2008 tynli Modify to mew files.
  77564. + *---------------------------------------------------------------------------*/
  77565. +static int
  77566. +phy_ConfigBBWithPgHeaderFile(
  77567. + IN PADAPTER Adapter,
  77568. + IN u8 ConfigType)
  77569. +{
  77570. + int i;
  77571. + u32* Rtl819XPHY_REGArray_Table_PG;
  77572. + u16 PHY_REGArrayPGLen;
  77573. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77574. +
  77575. + // Default: pHalData->RF_Type = RF_2T2R.
  77576. + PHY_REGArrayPGLen = PHY_REG_Array_PGLength;
  77577. + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG;
  77578. +
  77579. +#ifdef CONFIG_USB_HCI
  77580. +// 2010/10/19 Chiyoko According to Alex/Willson opinion, VAU/dongle can share the same PHY_REG_PG.txt
  77581. +/*
  77582. + if(pHalData->BoardType == BOARD_MINICARD )
  77583. + {
  77584. + PHY_REGArrayPGLen = PHY_REG_Array_PG_mCardLength;
  77585. + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_mCard;
  77586. + }
  77587. + else */if(pHalData->BoardType ==BOARD_USB_High_PA )
  77588. + {
  77589. + PHY_REGArrayPGLen = PHY_REG_Array_PG_HPLength;
  77590. + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_HP;
  77591. + }
  77592. +#endif
  77593. +
  77594. + if(ConfigType == BaseBand_Config_PHY_REG)
  77595. + {
  77596. + for(i=0;i<PHY_REGArrayPGLen;i=i+3)
  77597. + {
  77598. + #if 0 //without IO, no delay is neeeded...
  77599. + if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfe){
  77600. + #ifdef CONFIG_LONG_DELAY_ISSUE
  77601. + rtw_msleep_os(50);
  77602. + #else
  77603. + rtw_mdelay_os(50);
  77604. + #endif
  77605. + }
  77606. + else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfd)
  77607. + rtw_mdelay_os(5);
  77608. + else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfc)
  77609. + rtw_mdelay_os(1);
  77610. + else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfb)
  77611. + rtw_udelay_os(50);
  77612. + else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfa)
  77613. + rtw_udelay_os(5);
  77614. + else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xf9)
  77615. + rtw_udelay_os(1);
  77616. + //PHY_SetBBReg(Adapter, Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1], Rtl819XPHY_REGArray_Table_PG[i+2]);
  77617. + #endif
  77618. +
  77619. + storePwrIndexDiffRateOffset(Adapter, Rtl819XPHY_REGArray_Table_PG[i],
  77620. + Rtl819XPHY_REGArray_Table_PG[i+1],
  77621. + Rtl819XPHY_REGArray_Table_PG[i+2]);
  77622. + //RT_TRACE(COMP_SEND, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table_PG[0] is %lx Rtl819XPHY_REGArray_Table_PG[1] is %lx \n",Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1]));
  77623. + }
  77624. + }
  77625. + else
  77626. + {
  77627. +
  77628. + //RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithPgHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n"));
  77629. + }
  77630. +
  77631. + return _SUCCESS;
  77632. +
  77633. +} /* phy_ConfigBBWithPgHeaderFile */
  77634. +
  77635. +#if (MP_DRIVER == 1)
  77636. +
  77637. +/*-----------------------------------------------------------------------------
  77638. + * Function: phy_ConfigBBWithMpParaFile()
  77639. + *
  77640. + * Overview: This function read BB parameters from general file format, and do register
  77641. + * Read/Write
  77642. + *
  77643. + * Input: PADAPTER Adapter
  77644. + * ps1Byte pFileName
  77645. + *
  77646. + * Output: NONE
  77647. + *
  77648. + * Return: RT_STATUS_SUCCESS: configuration file exist
  77649. + * 2008/11/06 MH For 92S we do not support silent reset now. Disable
  77650. + * parameter file compare!!!!!!??
  77651. + *
  77652. + *---------------------------------------------------------------------------*/
  77653. +static int
  77654. +phy_ConfigBBWithMpParaFile(
  77655. + IN PADAPTER Adapter,
  77656. + IN u8* pFileName
  77657. +)
  77658. +{
  77659. +#if 1
  77660. + int rtStatus = _SUCCESS;
  77661. +#else
  77662. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77663. + s4Byte nLinesRead, ithLine;
  77664. + RT_STATUS rtStatus = RT_STATUS_SUCCESS;
  77665. + ps1Byte szLine;
  77666. + u4Byte u4bRegOffset, u4bRegMask, u4bRegValue;
  77667. + u4Byte u4bMove;
  77668. +
  77669. + if(ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FIRST_INIT))
  77670. + {
  77671. + rtStatus = PlatformReadFile(
  77672. + Adapter,
  77673. + pFileName,
  77674. + (pu1Byte)(pHalData->BufOfLines),
  77675. + MAX_LINES_HWCONFIG_TXT,
  77676. + MAX_BYTES_LINE_HWCONFIG_TXT,
  77677. + &nLinesRead
  77678. + );
  77679. + if(rtStatus == RT_STATUS_SUCCESS)
  77680. + {
  77681. + PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT);
  77682. + pHalData->nLinesRead6 = nLinesRead;
  77683. + }
  77684. + else
  77685. + {
  77686. + // Temporarily skip PHY_REG_MP.txt if file does not exist.
  77687. + pHalData->nLinesRead6 = 0;
  77688. + RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n"));
  77689. + return RT_STATUS_SUCCESS;
  77690. + }
  77691. + }
  77692. + else
  77693. + {
  77694. + PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);
  77695. + nLinesRead = pHalData->nLinesRead6;
  77696. + rtStatus = RT_STATUS_SUCCESS;
  77697. + }
  77698. +
  77699. +
  77700. + if(rtStatus == RT_STATUS_SUCCESS)
  77701. + {
  77702. + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName));
  77703. +
  77704. + for(ithLine = 0; ithLine < nLinesRead; ithLine++)
  77705. + {
  77706. + szLine = pHalData->BufOfLines[ithLine];
  77707. +
  77708. + if(!IsCommentString(szLine))
  77709. + {
  77710. + // Get 1st hex value as register offset.
  77711. + if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))
  77712. + {
  77713. + if(u4bRegOffset == 0xff)
  77714. + { // Ending.
  77715. + break;
  77716. + }
  77717. + else if (u4bRegOffset == 0xfe)
  77718. + delay_ms(50);
  77719. + else if (u4bRegOffset == 0xfd)
  77720. + delay_ms(5);
  77721. + else if (u4bRegOffset == 0xfc)
  77722. + delay_ms(1);
  77723. + else if (u4bRegOffset == 0xfb)
  77724. + PlatformStallExecution(50);
  77725. + else if (u4bRegOffset == 0xfa)
  77726. + PlatformStallExecution(5);
  77727. + else if (u4bRegOffset == 0xf9)
  77728. + PlatformStallExecution(1);
  77729. +
  77730. + // Get 2nd hex value as register value.
  77731. + szLine += u4bMove;
  77732. + if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))
  77733. + {
  77734. + RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue));
  77735. + PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);
  77736. +
  77737. + // Add 1us delay between BB/RF register setting.
  77738. + PlatformStallExecution(1);
  77739. + }
  77740. + }
  77741. + }
  77742. + }
  77743. + }
  77744. + else
  77745. + {
  77746. + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName));
  77747. + }
  77748. +#endif
  77749. +
  77750. + return rtStatus;
  77751. +}
  77752. +
  77753. +/*-----------------------------------------------------------------------------
  77754. + * Function: phy_ConfigBBWithMpHeaderFile
  77755. + *
  77756. + * Overview: Config PHY_REG_MP array
  77757. + *
  77758. + * Input: NONE
  77759. + *
  77760. + * Output: NONE
  77761. + *
  77762. + * Return: NONE
  77763. + *
  77764. + * Revised History:
  77765. + * When Who Remark
  77766. + * 02/04/2010 chiyokolin Modify to new files.
  77767. + *---------------------------------------------------------------------------*/
  77768. +static int
  77769. +phy_ConfigBBWithMpHeaderFile(
  77770. + IN PADAPTER Adapter,
  77771. + IN u1Byte ConfigType)
  77772. +{
  77773. + int i;
  77774. + u32* Rtl8192CPHY_REGArray_Table_MP;
  77775. + u16 PHY_REGArrayMPLen;
  77776. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77777. +
  77778. + PHY_REGArrayMPLen = PHY_REG_Array_MPLength;
  77779. + Rtl8192CPHY_REGArray_Table_MP = Rtl819XPHY_REG_Array_MP;
  77780. +
  77781. + if(ConfigType == BaseBand_Config_PHY_REG)
  77782. + {
  77783. + for(i=0;i<PHY_REGArrayMPLen;i=i+2)
  77784. + {
  77785. + if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfe) {
  77786. + #ifdef CONFIG_LONG_DELAY_ISSUE
  77787. + rtw_msleep_os(50);
  77788. + #else
  77789. + rtw_mdelay_os(50);
  77790. + #endif
  77791. + }
  77792. + else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfd)
  77793. + rtw_mdelay_os(5);
  77794. + else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfc)
  77795. + rtw_mdelay_os(1);
  77796. + else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfb) {
  77797. + #ifdef CONFIG_LONG_DELAY_ISSUE
  77798. + rtw_msleep_os(50);
  77799. + #else
  77800. + rtw_mdelay_os(50);
  77801. + #endif
  77802. + }
  77803. + else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfa)
  77804. + rtw_mdelay_os(5);
  77805. + else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xf9)
  77806. + rtw_mdelay_os(1);
  77807. + PHY_SetBBReg(Adapter, Rtl8192CPHY_REGArray_Table_MP[i], bMaskDWord, Rtl8192CPHY_REGArray_Table_MP[i+1]);
  77808. +
  77809. + // Add 1us delay between BB/RF register setting.
  77810. + rtw_mdelay_os(1);
  77811. +
  77812. +// RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl8192CPHY_REGArray_Table_MP[%d] is %lx Rtl8192CPHY_REGArray_Table_MP[%d] is %lx \n", i, i+1, Rtl8192CPHY_REGArray_Table_MP[i], Rtl8192CPHY_REGArray_Table_MP[i+1]));
  77813. + }
  77814. + }
  77815. + else
  77816. + {
  77817. +// RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithMpHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n"));
  77818. + }
  77819. +
  77820. + return _SUCCESS;
  77821. +} /* phy_ConfigBBWithMpHeaderFile */
  77822. +
  77823. +#endif // #if (MP_DRIVER == 1)
  77824. +
  77825. +static VOID
  77826. +phy_BB8192C_Config_1T(
  77827. + IN PADAPTER Adapter
  77828. + )
  77829. +{
  77830. +#if 0
  77831. + //for path - A
  77832. + PHY_SetBBReg(Adapter, rFPGA0_TxInfo, 0x3, 0x1);
  77833. + PHY_SetBBReg(Adapter, rFPGA1_TxInfo, 0x0303, 0x0101);
  77834. + PHY_SetBBReg(Adapter, 0xe74, 0x0c000000, 0x1);
  77835. + PHY_SetBBReg(Adapter, 0xe78, 0x0c000000, 0x1);
  77836. + PHY_SetBBReg(Adapter, 0xe7c, 0x0c000000, 0x1);
  77837. + PHY_SetBBReg(Adapter, 0xe80, 0x0c000000, 0x1);
  77838. + PHY_SetBBReg(Adapter, 0xe88, 0x0c000000, 0x1);
  77839. +#endif
  77840. + //for path - B
  77841. + PHY_SetBBReg(Adapter, rFPGA0_TxInfo, 0x3, 0x2);
  77842. + PHY_SetBBReg(Adapter, rFPGA1_TxInfo, 0x300033, 0x200022);
  77843. +
  77844. + // 20100519 Joseph: Add for 1T2R config. Suggested by Kevin, Jenyu and Yunan.
  77845. + PHY_SetBBReg(Adapter, rCCK0_AFESetting, bMaskByte3, 0x45);
  77846. + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x23);
  77847. + PHY_SetBBReg(Adapter, rOFDM0_AGCParameter1, 0x30, 0x1); // B path first AGC
  77848. +
  77849. + PHY_SetBBReg(Adapter, 0xe74, 0x0c000000, 0x2);
  77850. + PHY_SetBBReg(Adapter, 0xe78, 0x0c000000, 0x2);
  77851. + PHY_SetBBReg(Adapter, 0xe7c, 0x0c000000, 0x2);
  77852. + PHY_SetBBReg(Adapter, 0xe80, 0x0c000000, 0x2);
  77853. + PHY_SetBBReg(Adapter, 0xe88, 0x0c000000, 0x2);
  77854. +
  77855. +
  77856. +}
  77857. +
  77858. +// Joseph test: new initialize order!!
  77859. +// Test only!! This part need to be re-organized.
  77860. +// Now it is just for 8256.
  77861. +static int
  77862. +phy_BB8190_Config_HardCode(
  77863. + IN PADAPTER Adapter
  77864. + )
  77865. +{
  77866. + //RT_ASSERT(FALSE, ("This function is not implement yet!! \n"));
  77867. + return _SUCCESS;
  77868. +}
  77869. +
  77870. +static int
  77871. +phy_BB8192C_Config_ParaFile(
  77872. + IN PADAPTER Adapter
  77873. + )
  77874. +{
  77875. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
  77876. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77877. + int rtStatus = _SUCCESS;
  77878. +
  77879. + u8 szBBRegPgFile[] = RTL819X_PHY_REG_PG;
  77880. +
  77881. + u8 sz88CBBRegFile[] = RTL8188C_PHY_REG;
  77882. + u8 sz88CAGCTableFile[] = RTL8188C_AGC_TAB;
  77883. +
  77884. + u8 sz92CBBRegFile[] = RTL8192C_PHY_REG;
  77885. + u8 sz92CAGCTableFile[] = RTL8192C_AGC_TAB;
  77886. +
  77887. + u8 *pszBBRegFile, *pszAGCTableFile, *pszBBRegMpFile;
  77888. +
  77889. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("==>phy_BB8192S_Config_ParaFile\n"));
  77890. +
  77891. + if(IS_92C_SERIAL(pHalData->VersionID)){
  77892. + pszBBRegFile=(u8*)&sz92CBBRegFile ;
  77893. + pszAGCTableFile =(u8*)&sz92CAGCTableFile;
  77894. + }
  77895. + else{
  77896. + pszBBRegFile=(u8*)&sz88CBBRegFile ;
  77897. + pszAGCTableFile =(u8*)&sz88CAGCTableFile;
  77898. + }
  77899. +
  77900. + //
  77901. + // 1. Read PHY_REG.TXT BB INIT!!
  77902. + // We will seperate as 88C / 92C according to chip version
  77903. + //
  77904. +#ifdef CONFIG_EMBEDDED_FWIMG
  77905. + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG);
  77906. +#else
  77907. + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different
  77908. + // type of parameter files to phy_reg.txt at first.
  77909. + rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile);
  77910. +#endif
  77911. +
  77912. + if(rtStatus != _SUCCESS){
  77913. + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!"));
  77914. + goto phy_BB8190_Config_ParaFile_Fail;
  77915. + }
  77916. +
  77917. +#if MP_DRIVER == 1
  77918. + //
  77919. + // 1.1 Read PHY_REG_MP.TXT BB INIT!!
  77920. + // We will seperate as 88C / 92C according to chip version
  77921. + //
  77922. +#ifdef CONFIG_EMBEDDED_FWIMG
  77923. + rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG);
  77924. +#else
  77925. + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different
  77926. + // type of parameter files to phy_reg.txt at first.
  77927. + rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile);
  77928. +#endif
  77929. +
  77930. + if(rtStatus != _SUCCESS){
  77931. +// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!"));
  77932. + goto phy_BB8190_Config_ParaFile_Fail;
  77933. + }
  77934. +#endif // #if (MP_DRIVER == 1)
  77935. +
  77936. + //
  77937. + // 20100318 Joseph: Config 2T2R to 1T2R if necessary.
  77938. + //
  77939. + if(pHalData->rf_type == RF_1T2R)
  77940. + {
  77941. + phy_BB8192C_Config_1T(Adapter);
  77942. + DBG_8192C("phy_BB8192C_Config_ParaFile():Config to 1T!!\n");
  77943. + }
  77944. +
  77945. + //
  77946. + // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt
  77947. + //
  77948. + if (pEEPROM->bautoload_fail_flag == _FALSE)
  77949. + {
  77950. + pHalData->pwrGroupCnt = 0;
  77951. +
  77952. +#ifdef CONFIG_EMBEDDED_FWIMG
  77953. + rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG);
  77954. +#else
  77955. + rtStatus = phy_ConfigBBWithPgParaFile(Adapter, (u8*)&szBBRegPgFile);
  77956. +#endif
  77957. + }
  77958. +
  77959. + if(rtStatus != _SUCCESS){
  77960. + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!"));
  77961. + goto phy_BB8190_Config_ParaFile_Fail;
  77962. + }
  77963. +
  77964. + //
  77965. + // 3. BB AGC table Initialization
  77966. + //
  77967. +#ifdef CONFIG_EMBEDDED_FWIMG
  77968. + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB);
  77969. +#else
  77970. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n"));
  77971. + rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile);
  77972. +#endif
  77973. +
  77974. + if(rtStatus != _SUCCESS){
  77975. + //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n"));
  77976. + goto phy_BB8190_Config_ParaFile_Fail;
  77977. + }
  77978. +
  77979. + // Check if the CCK HighPower is turned ON.
  77980. + // This is used to calculate PWDB.
  77981. + pHalData->bCckHighPower = (BOOLEAN)(PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, 0x200));
  77982. +
  77983. +phy_BB8190_Config_ParaFile_Fail:
  77984. +
  77985. + return rtStatus;
  77986. +}
  77987. +
  77988. +
  77989. +int
  77990. +PHY_BBConfig8192C(
  77991. + IN PADAPTER Adapter
  77992. + )
  77993. +{
  77994. + int rtStatus = _SUCCESS;
  77995. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  77996. + u32 RegVal;
  77997. + u8 TmpU1B=0;
  77998. + u8 value8;
  77999. +
  78000. + phy_InitBBRFRegisterDefinition(Adapter);
  78001. +
  78002. + if(IS_HARDWARE_TYPE_8723A(Adapter))
  78003. + {
  78004. + // Suggested by Scott. tynli_test. 2010.12.30.
  78005. + //1. 0x28[1] = 1
  78006. + TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL);
  78007. + rtw_udelay_os(2);
  78008. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1));
  78009. + rtw_udelay_os(2);
  78010. +
  78011. + //2. 0x29[7:0] = 0xFF
  78012. + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff);
  78013. + rtw_udelay_os(2);
  78014. +
  78015. + //3. 0x02[1:0] = 2b'11
  78016. + TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN);
  78017. + rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));
  78018. +
  78019. + //undo clock gated
  78020. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)&(~BIT31));
  78021. +
  78022. + //4. 0x25[6] = 0
  78023. + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1);
  78024. + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6)));
  78025. +
  78026. + //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09.
  78027. + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2);
  78028. + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4)));
  78029. +
  78030. + //6. 0x1f[7:0] = 0x07
  78031. + rtw_write8(Adapter, REG_RF_CTRL, 0x07);
  78032. + }
  78033. + else
  78034. + {
  78035. + // Enable BB and RF
  78036. + RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);
  78037. + rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1));
  78038. +
  78039. + // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF.
  78040. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);
  78041. + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb);
  78042. +
  78043. + rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);
  78044. +
  78045. +#ifdef CONFIG_USB_HCI
  78046. + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB);
  78047. +#else
  78048. + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB);
  78049. +#endif
  78050. +
  78051. + //undo clock gated
  78052. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)&(~BIT31));
  78053. +
  78054. + // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1.
  78055. +#ifdef CONFIG_USB_HCI
  78056. + //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23.
  78057. + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f);
  78058. + rtw_write8(Adapter, 0x15, 0xe9);
  78059. +#endif
  78060. +
  78061. + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80);
  78062. +
  78063. +#ifdef CONFIG_PCI_HCI
  78064. + // Force use left antenna by default for 88C.
  78065. + // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID))
  78066. + if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10)
  78067. + {
  78068. + RegVal = rtw_read32(Adapter, REG_LEDCFG0);
  78069. + rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23);
  78070. + }
  78071. +#endif
  78072. + }
  78073. +
  78074. + //
  78075. + // Config BB and AGC
  78076. + //
  78077. + rtStatus = phy_BB8192C_Config_ParaFile(Adapter);
  78078. +#if 0
  78079. + switch(Adapter->MgntInfo.bRegHwParaFile)
  78080. + {
  78081. + case 0:
  78082. + phy_BB8190_Config_HardCode(Adapter);
  78083. + break;
  78084. +
  78085. + case 1:
  78086. + rtStatus = phy_BB8192C_Config_ParaFile(Adapter);
  78087. + break;
  78088. +
  78089. + case 2:
  78090. + // Partial Modify.
  78091. + phy_BB8190_Config_HardCode(Adapter);
  78092. + phy_BB8192C_Config_ParaFile(Adapter);
  78093. + break;
  78094. +
  78095. + default:
  78096. + phy_BB8190_Config_HardCode(Adapter);
  78097. + break;
  78098. + }
  78099. +#endif
  78100. +#ifdef CONFIG_USB_HCI
  78101. + if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)
  78102. + &&(pHalData->BoardType == BOARD_USB_High_PA))
  78103. + rtw_write8(Adapter, 0xc72, 0x50);
  78104. +#endif
  78105. +
  78106. + return rtStatus;
  78107. +}
  78108. +
  78109. +
  78110. +int
  78111. +PHY_RFConfig8192C(
  78112. + IN PADAPTER Adapter
  78113. + )
  78114. +{
  78115. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78116. + int rtStatus = _SUCCESS;
  78117. +
  78118. + //
  78119. + // RF config
  78120. + //
  78121. + rtStatus = PHY_RF6052_Config8192C(Adapter);
  78122. +#if 0
  78123. + switch(pHalData->rf_chip)
  78124. + {
  78125. + case RF_6052:
  78126. + rtStatus = PHY_RF6052_Config(Adapter);
  78127. + break;
  78128. + case RF_8225:
  78129. + rtStatus = PHY_RF8225_Config(Adapter);
  78130. + break;
  78131. + case RF_8256:
  78132. + rtStatus = PHY_RF8256_Config(Adapter);
  78133. + break;
  78134. + case RF_8258:
  78135. + break;
  78136. + case RF_PSEUDO_11N:
  78137. + rtStatus = PHY_RF8225_Config(Adapter);
  78138. + break;
  78139. + default: //for MacOs Warning: "RF_TYPE_MIN" not handled in switch
  78140. + break;
  78141. + }
  78142. +#endif
  78143. + return rtStatus;
  78144. +}
  78145. +
  78146. +
  78147. +/*-----------------------------------------------------------------------------
  78148. + * Function: PHY_ConfigRFWithParaFile()
  78149. + *
  78150. + * Overview: This function read RF parameters from general file format, and do RF 3-wire
  78151. + *
  78152. + * Input: PADAPTER Adapter
  78153. + * ps1Byte pFileName
  78154. + * RF_RADIO_PATH_E eRFPath
  78155. + *
  78156. + * Output: NONE
  78157. + *
  78158. + * Return: RT_STATUS_SUCCESS: configuration file exist
  78159. + *
  78160. + * Note: Delay may be required for RF configuration
  78161. + *---------------------------------------------------------------------------*/
  78162. +int
  78163. +rtl8192c_PHY_ConfigRFWithParaFile(
  78164. + IN PADAPTER Adapter,
  78165. + IN u8* pFileName,
  78166. + RF_RADIO_PATH_E eRFPath
  78167. +)
  78168. +{
  78169. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78170. +
  78171. + int rtStatus = _SUCCESS;
  78172. +
  78173. +
  78174. + return rtStatus;
  78175. +
  78176. +}
  78177. +
  78178. +//****************************************
  78179. +// The following is for High Power PA
  78180. +//****************************************
  78181. +#define HighPowerRadioAArrayLen 22
  78182. +//This is for High power PA
  78183. +u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = {
  78184. +0x013,0x00029ea4,
  78185. +0x013,0x00025e74,
  78186. +0x013,0x00020ea4,
  78187. +0x013,0x0001ced0,
  78188. +0x013,0x00019f40,
  78189. +0x013,0x00014e70,
  78190. +0x013,0x000106a0,
  78191. +0x013,0x0000c670,
  78192. +0x013,0x000082a0,
  78193. +0x013,0x00004270,
  78194. +0x013,0x00000240,
  78195. +};
  78196. +
  78197. +int
  78198. +PHY_ConfigRFExternalPA(
  78199. + IN PADAPTER Adapter,
  78200. + RF_RADIO_PATH_E eRFPath
  78201. +)
  78202. +{
  78203. + int rtStatus = _SUCCESS;
  78204. +#ifdef CONFIG_USB_HCI
  78205. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78206. + u16 i=0;
  78207. +
  78208. + if(!pHalData->ExternalPA)
  78209. + {
  78210. + return rtStatus;
  78211. + }
  78212. +
  78213. + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the
  78214. + // same code as SU. It is already updated in radio_a_1T_HP.txt.
  78215. +#if 0
  78216. + //add for SU High Power PA
  78217. + for(i = 0;i<HighPowerRadioAArrayLen; i=i+2)
  78218. + {
  78219. + RT_TRACE(COMP_INIT, DBG_LOUD, ("External PA, write RF 0x%lx=0x%lx\n", Rtl8192S_HighPower_RadioA_Array[i], Rtl8192S_HighPower_RadioA_Array[i+1]));
  78220. + PHY_SetRFReg(Adapter, eRFPath, Rtl8192S_HighPower_RadioA_Array[i], bRFRegOffsetMask, Rtl8192S_HighPower_RadioA_Array[i+1]);
  78221. + }
  78222. +#endif
  78223. +
  78224. +#endif
  78225. + return rtStatus;
  78226. +}
  78227. +//****************************************
  78228. +/*-----------------------------------------------------------------------------
  78229. + * Function: PHY_ConfigRFWithHeaderFile()
  78230. + *
  78231. + * Overview: This function read RF parameters from general file format, and do RF 3-wire
  78232. + *
  78233. + * Input: PADAPTER Adapter
  78234. + * ps1Byte pFileName
  78235. + * RF_RADIO_PATH_E eRFPath
  78236. + *
  78237. + * Output: NONE
  78238. + *
  78239. + * Return: RT_STATUS_SUCCESS: configuration file exist
  78240. + *
  78241. + * Note: Delay may be required for RF configuration
  78242. + *---------------------------------------------------------------------------*/
  78243. +int
  78244. +rtl8192c_PHY_ConfigRFWithHeaderFile(
  78245. + IN PADAPTER Adapter,
  78246. + RF_RADIO_PATH_E eRFPath
  78247. +)
  78248. +{
  78249. +
  78250. + int i;
  78251. + int rtStatus = _SUCCESS;
  78252. + u32* Rtl819XRadioA_Array_Table;
  78253. + u32* Rtl819XRadioB_Array_Table;
  78254. + u16 RadioA_ArrayLen,RadioB_ArrayLen;
  78255. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78256. +
  78257. + //
  78258. + // 2009.11.24. Modified by tynli.
  78259. + //
  78260. + if(IS_92C_SERIAL(pHalData->VersionID))
  78261. + {
  78262. + RadioA_ArrayLen = RadioA_2TArrayLength;
  78263. + Rtl819XRadioA_Array_Table = Rtl819XRadioA_2TArray;
  78264. + RadioB_ArrayLen = RadioB_2TArrayLength;
  78265. + Rtl819XRadioB_Array_Table = Rtl819XRadioB_2TArray;
  78266. + }
  78267. + else
  78268. + {
  78269. + RadioA_ArrayLen = RadioA_1TArrayLength;
  78270. + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1TArray;
  78271. + RadioB_ArrayLen = RadioB_1TArrayLength;
  78272. + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1TArray;
  78273. +#ifdef CONFIG_USB_HCI
  78274. + if( BOARD_MINICARD == pHalData->BoardType )
  78275. + {
  78276. + RadioA_ArrayLen = RadioA_1T_mCardArrayLength;
  78277. + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_mCardArray;
  78278. + RadioB_ArrayLen = RadioB_1T_mCardArrayLength;
  78279. + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1T_mCardArray;
  78280. + }
  78281. + else if( BOARD_USB_High_PA == pHalData->BoardType )
  78282. + {
  78283. + RadioA_ArrayLen = RadioA_1T_HPArrayLength;
  78284. + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_HPArray;
  78285. + }
  78286. +#endif
  78287. + }
  78288. +
  78289. + switch(eRFPath){
  78290. + case RF_PATH_A:
  78291. + #ifdef CONFIG_IOL_RF_RF90_PATH_A
  78292. + if(rtw_IOL_applied(Adapter))
  78293. + {
  78294. + struct xmit_frame *xmit_frame;
  78295. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {
  78296. + rtStatus = _FAIL;
  78297. + goto exit;
  78298. + }
  78299. +
  78300. + for(i = 0;i<RadioA_ArrayLen; i=i+2)
  78301. + {
  78302. + if(Rtl819XRadioA_Array_Table[i] == 0xfe)
  78303. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);
  78304. + else if (Rtl819XRadioA_Array_Table[i] == 0xfd)
  78305. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);
  78306. + else if (Rtl819XRadioA_Array_Table[i] == 0xfc)
  78307. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);
  78308. + else if (Rtl819XRadioA_Array_Table[i] == 0xfb)
  78309. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);
  78310. + else if (Rtl819XRadioA_Array_Table[i] == 0xfa)
  78311. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);
  78312. + else if (Rtl819XRadioA_Array_Table[i] == 0xf9)
  78313. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);
  78314. + else
  78315. + {
  78316. + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
  78317. + u32 NewOffset = 0;
  78318. + u32 DataAndAddr = 0;
  78319. +
  78320. + NewOffset = Rtl819XRadioA_Array_Table[i] & 0x3f;
  78321. + DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioA_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF
  78322. + rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr);
  78323. + }
  78324. + }
  78325. + rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  78326. + }
  78327. + else
  78328. + #endif
  78329. + {
  78330. + for(i = 0;i<RadioA_ArrayLen; i=i+2)
  78331. + {
  78332. + if(Rtl819XRadioA_Array_Table[i] == 0xfe) {
  78333. + #ifdef CONFIG_LONG_DELAY_ISSUE
  78334. + rtw_msleep_os(50);
  78335. + #else
  78336. + rtw_mdelay_os(50);
  78337. + #endif
  78338. + }
  78339. + else if (Rtl819XRadioA_Array_Table[i] == 0xfd)
  78340. + rtw_mdelay_os(5);
  78341. + else if (Rtl819XRadioA_Array_Table[i] == 0xfc)
  78342. + rtw_mdelay_os(1);
  78343. + else if (Rtl819XRadioA_Array_Table[i] == 0xfb)
  78344. + rtw_udelay_os(50);
  78345. + else if (Rtl819XRadioA_Array_Table[i] == 0xfa)
  78346. + rtw_udelay_os(5);
  78347. + else if (Rtl819XRadioA_Array_Table[i] == 0xf9)
  78348. + rtw_udelay_os(1);
  78349. + else
  78350. + {
  78351. + PHY_SetRFReg(Adapter, eRFPath, Rtl819XRadioA_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioA_Array_Table[i+1]);
  78352. + // Add 1us delay between BB/RF register setting.
  78353. + rtw_udelay_os(1);
  78354. + }
  78355. + }
  78356. + }
  78357. +
  78358. + //Add for High Power PA
  78359. + PHY_ConfigRFExternalPA(Adapter, eRFPath);
  78360. + break;
  78361. + case RF_PATH_B:
  78362. + #ifdef CONFIG_IOL_RF_RF90_PATH_B
  78363. + if(rtw_IOL_applied(Adapter))
  78364. + {
  78365. + struct xmit_frame *xmit_frame;
  78366. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {
  78367. + rtStatus = _FAIL;
  78368. + goto exit;
  78369. + }
  78370. +
  78371. + for(i = 0;i<RadioB_ArrayLen; i=i+2)
  78372. + {
  78373. + if(Rtl819XRadioB_Array_Table[i] == 0xfe)
  78374. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);
  78375. + else if (Rtl819XRadioB_Array_Table[i] == 0xfd)
  78376. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);
  78377. + else if (Rtl819XRadioB_Array_Table[i] == 0xfc)
  78378. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);
  78379. + else if (Rtl819XRadioB_Array_Table[i] == 0xfb)
  78380. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);
  78381. + else if (Rtl819XRadioB_Array_Table[i] == 0xfa)
  78382. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);
  78383. + else if (Rtl819XRadioB_Array_Table[i] == 0xf9)
  78384. + rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);
  78385. + else
  78386. + {
  78387. + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
  78388. + u32 NewOffset = 0;
  78389. + u32 DataAndAddr = 0;
  78390. +
  78391. + NewOffset = Rtl819XRadioB_Array_Table[i] & 0x3f;
  78392. + DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioB_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF
  78393. + rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr);
  78394. + }
  78395. + }
  78396. + rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  78397. + }
  78398. + else
  78399. + #endif
  78400. + {
  78401. + for(i = 0;i<RadioB_ArrayLen; i=i+2)
  78402. + {
  78403. + if(Rtl819XRadioB_Array_Table[i] == 0xfe)
  78404. + { // Deay specific ms. Only RF configuration require delay.
  78405. +#if 0//#ifdef CONFIG_USB_HCI
  78406. + #ifdef CONFIG_LONG_DELAY_ISSUE
  78407. + rtw_msleep_os(1000);
  78408. + #else
  78409. + rtw_mdelay_os(1000);
  78410. + #endif
  78411. +#else
  78412. + #ifdef CONFIG_LONG_DELAY_ISSUE
  78413. + rtw_msleep_os(50);
  78414. + #else
  78415. + rtw_mdelay_os(50);
  78416. + #endif
  78417. +#endif
  78418. + }
  78419. + else if (Rtl819XRadioB_Array_Table[i] == 0xfd)
  78420. + rtw_mdelay_os(5);
  78421. + else if (Rtl819XRadioB_Array_Table[i] == 0xfc)
  78422. + rtw_mdelay_os(1);
  78423. + else if (Rtl819XRadioB_Array_Table[i] == 0xfb)
  78424. + rtw_udelay_os(50);
  78425. + else if (Rtl819XRadioB_Array_Table[i] == 0xfa)
  78426. + rtw_udelay_os(5);
  78427. + else if (Rtl819XRadioB_Array_Table[i] == 0xf9)
  78428. + rtw_udelay_os(1);
  78429. + else
  78430. + {
  78431. + PHY_SetRFReg(Adapter, eRFPath, Rtl819XRadioB_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioB_Array_Table[i+1]);
  78432. + // Add 1us delay between BB/RF register setting.
  78433. + rtw_udelay_os(1);
  78434. + }
  78435. + }
  78436. + }
  78437. +
  78438. + break;
  78439. + case RF_PATH_C:
  78440. + break;
  78441. + case RF_PATH_D:
  78442. + break;
  78443. + }
  78444. +
  78445. +exit:
  78446. + return rtStatus;
  78447. +
  78448. +}
  78449. +
  78450. +
  78451. +/*-----------------------------------------------------------------------------
  78452. + * Function: PHY_CheckBBAndRFOK()
  78453. + *
  78454. + * Overview: This function is write register and then readback to make sure whether
  78455. + * BB[PHY0, PHY1], RF[Patha, path b, path c, path d] is Ok
  78456. + *
  78457. + * Input: PADAPTER Adapter
  78458. + * HW90_BLOCK_E CheckBlock
  78459. + * RF_RADIO_PATH_E eRFPath // it is used only when CheckBlock is HW90_BLOCK_RF
  78460. + *
  78461. + * Output: NONE
  78462. + *
  78463. + * Return: RT_STATUS_SUCCESS: PHY is OK
  78464. + *
  78465. + * Note: This function may be removed in the ASIC
  78466. + *---------------------------------------------------------------------------*/
  78467. +int
  78468. +PHY_CheckBBAndRFOK(
  78469. + IN PADAPTER Adapter,
  78470. + IN HW90_BLOCK_E CheckBlock,
  78471. + IN RF_RADIO_PATH_E eRFPath
  78472. + )
  78473. +{
  78474. + int rtStatus = _SUCCESS;
  78475. +
  78476. + u32 i, CheckTimes = 4,ulRegRead = 0;
  78477. +
  78478. + u32 WriteAddr[4];
  78479. + u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
  78480. +
  78481. + // Initialize register address offset to be checked
  78482. + WriteAddr[HW90_BLOCK_MAC] = 0x100;
  78483. + WriteAddr[HW90_BLOCK_PHY0] = 0x900;
  78484. + WriteAddr[HW90_BLOCK_PHY1] = 0x800;
  78485. + WriteAddr[HW90_BLOCK_RF] = 0x3;
  78486. +
  78487. + for(i=0 ; i < CheckTimes ; i++)
  78488. + {
  78489. +
  78490. + //
  78491. + // Write Data to register and readback
  78492. + //
  78493. + switch(CheckBlock)
  78494. + {
  78495. + case HW90_BLOCK_MAC:
  78496. + //RT_ASSERT(FALSE, ("PHY_CheckBBRFOK(): Never Write 0x100 here!"));
  78497. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PHY_CheckBBRFOK(): Never Write 0x100 here!\n"));
  78498. + break;
  78499. +
  78500. + case HW90_BLOCK_PHY0:
  78501. + case HW90_BLOCK_PHY1:
  78502. + rtw_write32(Adapter, WriteAddr[CheckBlock], WriteData[i]);
  78503. + ulRegRead = rtw_read32(Adapter, WriteAddr[CheckBlock]);
  78504. + break;
  78505. +
  78506. + case HW90_BLOCK_RF:
  78507. + // When initialization, we want the delay function(delay_ms(), delay_us()
  78508. + // ==> actually we call PlatformStallExecution()) to do NdisStallExecution()
  78509. + // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK
  78510. + // to run at Dispatch level to achive it.
  78511. + //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK);
  78512. + WriteData[i] &= 0xfff;
  78513. + PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]);
  78514. + // TODO: we should not delay for such a long time. Ask SD3
  78515. + rtw_mdelay_os(10);
  78516. + ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord);
  78517. + rtw_mdelay_os(10);
  78518. + //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK);
  78519. + break;
  78520. +
  78521. + default:
  78522. + rtStatus = _FAIL;
  78523. + break;
  78524. + }
  78525. +
  78526. +
  78527. + //
  78528. + // Check whether readback data is correct
  78529. + //
  78530. + if(ulRegRead != WriteData[i])
  78531. + {
  78532. + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i]));
  78533. + rtStatus = _FAIL;
  78534. + break;
  78535. + }
  78536. + }
  78537. +
  78538. + return rtStatus;
  78539. +}
  78540. +
  78541. +
  78542. +VOID
  78543. +rtl8192c_PHY_GetHWRegOriginalValue(
  78544. + IN PADAPTER Adapter
  78545. + )
  78546. +{
  78547. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78548. +
  78549. + // read rx initial gain
  78550. + pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0);
  78551. + pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0);
  78552. + pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0);
  78553. + pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0);
  78554. + //RT_TRACE(COMP_INIT, DBG_LOUD,
  78555. + //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n",
  78556. + //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1],
  78557. + //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3]));
  78558. +
  78559. + // read framesync
  78560. + pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0);
  78561. + pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord);
  78562. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n",
  78563. + // rOFDM0_RxDetector3, pHalData->framesync));
  78564. +}
  78565. +
  78566. +
  78567. +//
  78568. +// Description:
  78569. +// Map dBm into Tx power index according to
  78570. +// current HW model, for example, RF and PA, and
  78571. +// current wireless mode.
  78572. +// By Bruce, 2008-01-29.
  78573. +//
  78574. +static u8
  78575. +phy_DbmToTxPwrIdx(
  78576. + IN PADAPTER Adapter,
  78577. + IN WIRELESS_MODE WirelessMode,
  78578. + IN int PowerInDbm
  78579. + )
  78580. +{
  78581. + u8 TxPwrIdx = 0;
  78582. + int Offset = 0;
  78583. +
  78584. +
  78585. + //
  78586. + // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to
  78587. + // 3dbm, and OFDM HT equals to 0dbm repectively.
  78588. + // Note:
  78589. + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result.
  78590. + // By Bruce, 2008-01-29.
  78591. + //
  78592. + switch(WirelessMode)
  78593. + {
  78594. + case WIRELESS_MODE_B:
  78595. + Offset = -7;
  78596. + break;
  78597. +
  78598. + case WIRELESS_MODE_G:
  78599. + case WIRELESS_MODE_N_24G:
  78600. + Offset = -8;
  78601. + break;
  78602. + default:
  78603. + Offset = -8;
  78604. + break;
  78605. + }
  78606. +
  78607. + if((PowerInDbm - Offset) > 0)
  78608. + {
  78609. + TxPwrIdx = (u8)((PowerInDbm - Offset) * 2);
  78610. + }
  78611. + else
  78612. + {
  78613. + TxPwrIdx = 0;
  78614. + }
  78615. +
  78616. + // Tx Power Index is too large.
  78617. + if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S)
  78618. + TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S;
  78619. +
  78620. + return TxPwrIdx;
  78621. +}
  78622. +
  78623. +//
  78624. +// Description:
  78625. +// Map Tx power index into dBm according to
  78626. +// current HW model, for example, RF and PA, and
  78627. +// current wireless mode.
  78628. +// By Bruce, 2008-01-29.
  78629. +//
  78630. +int
  78631. +phy_TxPwrIdxToDbm(
  78632. + IN PADAPTER Adapter,
  78633. + IN WIRELESS_MODE WirelessMode,
  78634. + IN u8 TxPwrIdx
  78635. + )
  78636. +{
  78637. + int Offset = 0;
  78638. + int PwrOutDbm = 0;
  78639. +
  78640. + //
  78641. + // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm.
  78642. + // Note:
  78643. + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result.
  78644. + // By Bruce, 2008-01-29.
  78645. + //
  78646. + switch(WirelessMode)
  78647. + {
  78648. + case WIRELESS_MODE_B:
  78649. + Offset = -7;
  78650. + break;
  78651. +
  78652. + case WIRELESS_MODE_G:
  78653. + case WIRELESS_MODE_N_24G:
  78654. + Offset = -8;
  78655. + default:
  78656. + Offset = -8;
  78657. + break;
  78658. + }
  78659. +
  78660. + PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part.
  78661. +
  78662. + return PwrOutDbm;
  78663. +}
  78664. +
  78665. +
  78666. +/*-----------------------------------------------------------------------------
  78667. + * Function: GetTxPowerLevel8190()
  78668. + *
  78669. + * Overview: This function is export to "common" moudule
  78670. + *
  78671. + * Input: PADAPTER Adapter
  78672. + * psByte Power Level
  78673. + *
  78674. + * Output: NONE
  78675. + *
  78676. + * Return: NONE
  78677. + *
  78678. + *---------------------------------------------------------------------------*/
  78679. +VOID
  78680. +PHY_GetTxPowerLevel8192C(
  78681. + IN PADAPTER Adapter,
  78682. + OUT u32* powerlevel
  78683. + )
  78684. +{
  78685. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78686. + u8 TxPwrLevel = 0;
  78687. + int TxPwrDbm;
  78688. +
  78689. + //
  78690. + // Because the Tx power indexes are different, we report the maximum of them to
  78691. + // meet the CCX TPC request. By Bruce, 2008-01-31.
  78692. + //
  78693. +
  78694. + // CCK
  78695. + TxPwrLevel = pHalData->CurrentCckTxPwrIdx;
  78696. + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel);
  78697. +
  78698. + // Legacy OFDM
  78699. + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff;
  78700. +
  78701. + // Compare with Legacy OFDM Tx power.
  78702. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm)
  78703. + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel);
  78704. +
  78705. + // HT OFDM
  78706. + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx;
  78707. +
  78708. + // Compare with HT OFDM Tx power.
  78709. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm)
  78710. + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel);
  78711. +
  78712. + *powerlevel = TxPwrDbm;
  78713. +}
  78714. +
  78715. +
  78716. +static void getTxPowerIndex(
  78717. + IN PADAPTER Adapter,
  78718. + IN u8 channel,
  78719. + IN OUT u8* cckPowerLevel,
  78720. + IN OUT u8* ofdmPowerLevel
  78721. + )
  78722. +{
  78723. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78724. + u8 index = (channel -1);
  78725. + // 1. CCK
  78726. + cckPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelCck[RF_PATH_A][index]; //RF-A
  78727. + cckPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelCck[RF_PATH_B][index]; //RF-B
  78728. +
  78729. + // 2. OFDM for 1S or 2S
  78730. + if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R)
  78731. + {
  78732. + // Read HT 40 OFDM TX power
  78733. + ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF_PATH_A][index];
  78734. + ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF_PATH_B][index];
  78735. + }
  78736. + else if (GET_RF_TYPE(Adapter) == RF_2T2R)
  78737. + {
  78738. + // Read HT 40 OFDM TX power
  78739. + ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF_PATH_A][index];
  78740. + ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF_PATH_B][index];
  78741. + }
  78742. + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel));
  78743. +}
  78744. +
  78745. +static void ccxPowerIndexCheck(
  78746. + IN PADAPTER Adapter,
  78747. + IN u8 channel,
  78748. + IN OUT u8* cckPowerLevel,
  78749. + IN OUT u8* ofdmPowerLevel
  78750. + )
  78751. +{
  78752. +#if 0
  78753. + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  78754. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78755. + PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo);
  78756. +
  78757. + //
  78758. + // CCX 2 S31, AP control of client transmit power:
  78759. + // 1. We shall not exceed Cell Power Limit as possible as we can.
  78760. + // 2. Tolerance is +/- 5dB.
  78761. + // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit.
  78762. + //
  78763. + // TODO:
  78764. + // 1. 802.11h power contraint
  78765. + //
  78766. + // 071011, by rcnjko.
  78767. + //
  78768. + if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE &&
  78769. + pMgntInfo->mAssoc &&
  78770. + pCcxInfo->bUpdateCcxPwr &&
  78771. + pCcxInfo->bWithCcxCellPwr &&
  78772. + channel == pMgntInfo->dot11CurrentChannelNumber)
  78773. + {
  78774. + u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr);
  78775. + u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr);
  78776. + u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr);
  78777. +
  78778. + RT_TRACE(COMP_TXAGC, DBG_LOUD,
  78779. + ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
  78780. + pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx));
  78781. + RT_TRACE(COMP_TXAGC, DBG_LOUD,
  78782. + ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
  78783. + channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));
  78784. +
  78785. + // CCK
  78786. + if(cckPowerLevel[0] > CckCellPwrIdx)
  78787. + cckPowerLevel[0] = CckCellPwrIdx;
  78788. + // Legacy OFDM, HT OFDM
  78789. + if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx)
  78790. + {
  78791. + if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)
  78792. + {
  78793. + ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff;
  78794. + }
  78795. + else
  78796. + {
  78797. + ofdmPowerLevel[0] = 0;
  78798. + }
  78799. + }
  78800. +
  78801. + RT_TRACE(COMP_TXAGC, DBG_LOUD,
  78802. + ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
  78803. + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));
  78804. + }
  78805. +
  78806. + pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0];
  78807. + pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0];
  78808. +
  78809. + RT_TRACE(COMP_TXAGC, DBG_LOUD,
  78810. + ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
  78811. + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));
  78812. +#endif
  78813. +}
  78814. +/*-----------------------------------------------------------------------------
  78815. + * Function: SetTxPowerLevel8190()
  78816. + *
  78817. + * Overview: This function is export to "HalCommon" moudule
  78818. + * We must consider RF path later!!!!!!!
  78819. + *
  78820. + * Input: PADAPTER Adapter
  78821. + * u1Byte channel
  78822. + *
  78823. + * Output: NONE
  78824. + *
  78825. + * Return: NONE
  78826. + * 2008/11/04 MHC We remove EEPROM_93C56.
  78827. + * We need to move CCX relative code to independet file.
  78828. + * 2009/01/21 MHC Support new EEPROM format from SD3 requirement.
  78829. + *
  78830. + *---------------------------------------------------------------------------*/
  78831. +VOID
  78832. +PHY_SetTxPowerLevel8192C(
  78833. + IN PADAPTER Adapter,
  78834. + IN u8 channel
  78835. + )
  78836. +{
  78837. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78838. + u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B
  78839. +
  78840. +#if(MP_DRIVER == 1)
  78841. + return;
  78842. +#endif
  78843. +
  78844. + if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE)
  78845. + return;
  78846. +
  78847. + getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]);
  78848. + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n",
  78849. + // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1]));
  78850. +
  78851. + ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]);
  78852. +
  78853. + rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]);
  78854. + rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel);
  78855. +
  78856. +#if 0
  78857. + switch(pHalData->rf_chip)
  78858. + {
  78859. + case RF_8225:
  78860. + PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]);
  78861. + PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]);
  78862. + break;
  78863. +
  78864. + case RF_8256:
  78865. + PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]);
  78866. + PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]);
  78867. + break;
  78868. +
  78869. + case RF_6052:
  78870. + PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]);
  78871. + PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel);
  78872. + break;
  78873. +
  78874. + case RF_8258:
  78875. + break;
  78876. + }
  78877. +#endif
  78878. +
  78879. +}
  78880. +
  78881. +
  78882. +//
  78883. +// Description:
  78884. +// Update transmit power level of all channel supported.
  78885. +//
  78886. +// TODO:
  78887. +// A mode.
  78888. +// By Bruce, 2008-02-04.
  78889. +//
  78890. +BOOLEAN
  78891. +PHY_UpdateTxPowerDbm8192C(
  78892. + IN PADAPTER Adapter,
  78893. + IN int powerInDbm
  78894. + )
  78895. +{
  78896. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  78897. + u8 idx;
  78898. + u8 rf_path;
  78899. +
  78900. + // TODO: A mode Tx power.
  78901. + u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm);
  78902. + u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm);
  78903. +
  78904. + if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0)
  78905. + OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff;
  78906. + else
  78907. + OfdmTxPwrIdx = 0;
  78908. +
  78909. + //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx));
  78910. +
  78911. + for(idx = 0; idx < 14; idx++)
  78912. + {
  78913. + for (rf_path = 0; rf_path < 2; rf_path++)
  78914. + {
  78915. + pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx;
  78916. + pHalData->TxPwrLevelHT40_1S[rf_path][idx] =
  78917. + pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx;
  78918. + }
  78919. + }
  78920. +
  78921. + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo
  78922. +
  78923. + return _TRUE;
  78924. +}
  78925. +
  78926. +
  78927. +/*
  78928. + Description:
  78929. + When beacon interval is changed, the values of the
  78930. + hw registers should be modified.
  78931. + By tynli, 2008.10.24.
  78932. +
  78933. +*/
  78934. +
  78935. +
  78936. +void
  78937. +rtl8192c_PHY_SetBeaconHwReg(
  78938. + IN PADAPTER Adapter,
  78939. + IN u16 BeaconInterval
  78940. + )
  78941. +{
  78942. +
  78943. +}
  78944. +
  78945. +
  78946. +VOID
  78947. +PHY_ScanOperationBackup8192C(
  78948. + IN PADAPTER Adapter,
  78949. + IN u8 Operation
  78950. + )
  78951. +{
  78952. +#if 0
  78953. + IO_TYPE IoType;
  78954. +
  78955. + if(!Adapter->bDriverStopped)
  78956. + {
  78957. + switch(Operation)
  78958. + {
  78959. + case SCAN_OPT_BACKUP:
  78960. + IoType = IO_CMD_PAUSE_DM_BY_SCAN;
  78961. + rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType);
  78962. +
  78963. + break;
  78964. +
  78965. + case SCAN_OPT_RESTORE:
  78966. + IoType = IO_CMD_RESUME_DM_BY_SCAN;
  78967. + rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType);
  78968. + break;
  78969. +
  78970. + default:
  78971. + RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n"));
  78972. + break;
  78973. + }
  78974. + }
  78975. +#endif
  78976. +}
  78977. +
  78978. +/*-----------------------------------------------------------------------------
  78979. + * Function: PHY_SetBWModeCallback8192C()
  78980. + *
  78981. + * Overview: Timer callback function for SetSetBWMode
  78982. + *
  78983. + * Input: PRT_TIMER pTimer
  78984. + *
  78985. + * Output: NONE
  78986. + *
  78987. + * Return: NONE
  78988. + *
  78989. + * Note: (1) We do not take j mode into consideration now
  78990. + * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run
  78991. + * concurrently?
  78992. + *---------------------------------------------------------------------------*/
  78993. +static VOID
  78994. +_PHY_SetBWMode92C(
  78995. + IN PADAPTER Adapter
  78996. +)
  78997. +{
  78998. +// PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
  78999. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79000. + u8 regBwOpMode;
  79001. + u8 regRRSR_RSC;
  79002. +
  79003. + //return;
  79004. +
  79005. + // Added it for 20/40 mhz switch time evaluation by guangan 070531
  79006. + //u4Byte NowL, NowH;
  79007. + //u8Byte BeginTime, EndTime;
  79008. +
  79009. + /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \
  79010. + pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/
  79011. +
  79012. + if(pHalData->rf_chip == RF_PSEUDO_11N)
  79013. + {
  79014. + //pHalData->SetBWModeInProgress= _FALSE;
  79015. + return;
  79016. + }
  79017. +
  79018. + // There is no 40MHz mode in RF_8225.
  79019. + if(pHalData->rf_chip==RF_8225)
  79020. + return;
  79021. +
  79022. + if(Adapter->bDriverStopped)
  79023. + return;
  79024. +
  79025. + // Added it for 20/40 mhz switch time evaluation by guangan 070531
  79026. + //NowL = PlatformEFIORead4Byte(Adapter, TSFR);
  79027. + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4);
  79028. + //BeginTime = ((u8Byte)NowH << 32) + NowL;
  79029. +
  79030. + //3//
  79031. + //3//<1>Set MAC register
  79032. + //3//
  79033. + //Adapter->HalFunc.SetBWModeHandler();
  79034. +
  79035. + regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE);
  79036. + regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2);
  79037. + //regBwOpMode = rtw_hal_get_hwreg(Adapter,HW_VAR_BWMODE,(pu1Byte)&regBwOpMode);
  79038. +
  79039. + switch(pHalData->CurrentChannelBW)
  79040. + {
  79041. + case HT_CHANNEL_WIDTH_20:
  79042. + regBwOpMode |= BW_OPMODE_20MHZ;
  79043. + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
  79044. + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode);
  79045. + break;
  79046. +
  79047. + case HT_CHANNEL_WIDTH_40:
  79048. + regBwOpMode &= ~BW_OPMODE_20MHZ;
  79049. + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
  79050. + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode);
  79051. +
  79052. + regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5);
  79053. + rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC);
  79054. + break;
  79055. +
  79056. + default:
  79057. + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C():
  79058. + unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/
  79059. + break;
  79060. + }
  79061. +
  79062. + //3//
  79063. + //3//<2>Set PHY related register
  79064. + //3//
  79065. + switch(pHalData->CurrentChannelBW)
  79066. + {
  79067. + /* 20 MHz channel*/
  79068. + case HT_CHANNEL_WIDTH_20:
  79069. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0);
  79070. + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0);
  79071. + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1);
  79072. +
  79073. + break;
  79074. +
  79075. +
  79076. + /* 40 MHz channel*/
  79077. + case HT_CHANNEL_WIDTH_40:
  79078. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1);
  79079. + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1);
  79080. +
  79081. + // Set Control channel to upper or lower. These settings are required only for 40MHz
  79082. + PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1));
  79083. + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC);
  79084. + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0);
  79085. +
  79086. + PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1);
  79087. +
  79088. + break;
  79089. +
  79090. +
  79091. +
  79092. + default:
  79093. + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\
  79094. + ,pHalData->CurrentChannelBW));*/
  79095. + break;
  79096. +
  79097. + }
  79098. + //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315
  79099. +
  79100. + // Added it for 20/40 mhz switch time evaluation by guangan 070531
  79101. + //NowL = PlatformEFIORead4Byte(Adapter, TSFR);
  79102. + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4);
  79103. + //EndTime = ((u8Byte)NowH << 32) + NowL;
  79104. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime)));
  79105. +
  79106. + //3<3>Set RF related register
  79107. + switch(pHalData->rf_chip)
  79108. + {
  79109. + case RF_8225:
  79110. + //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW);
  79111. + break;
  79112. +
  79113. + case RF_8256:
  79114. + // Please implement this function in Hal8190PciPhy8256.c
  79115. + //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW);
  79116. + break;
  79117. +
  79118. + case RF_8258:
  79119. + // Please implement this function in Hal8190PciPhy8258.c
  79120. + // PHY_SetRF8258Bandwidth();
  79121. + break;
  79122. +
  79123. + case RF_PSEUDO_11N:
  79124. + // Do Nothing
  79125. + break;
  79126. +
  79127. + case RF_6052:
  79128. + rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW);
  79129. + break;
  79130. +
  79131. + default:
  79132. + //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID));
  79133. + break;
  79134. + }
  79135. +
  79136. + //pHalData->SetBWModeInProgress= FALSE;
  79137. +
  79138. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" ));
  79139. +}
  79140. +
  79141. +
  79142. + /*-----------------------------------------------------------------------------
  79143. + * Function: SetBWMode8190Pci()
  79144. + *
  79145. + * Overview: This function is export to "HalCommon" moudule
  79146. + *
  79147. + * Input: PADAPTER Adapter
  79148. + * HT_CHANNEL_WIDTH Bandwidth //20M or 40M
  79149. + *
  79150. + * Output: NONE
  79151. + *
  79152. + * Return: NONE
  79153. + *
  79154. + * Note: We do not take j mode into consideration now
  79155. + *---------------------------------------------------------------------------*/
  79156. +VOID
  79157. +PHY_SetBWMode8192C(
  79158. + IN PADAPTER Adapter,
  79159. + IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M
  79160. + IN unsigned char Offset // Upper, Lower, or Don't care
  79161. +)
  79162. +{
  79163. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79164. + HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW;
  79165. + // Modified it for 20/40 mhz switch by guangan 070531
  79166. + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo;
  79167. +
  79168. + //return;
  79169. +
  79170. + //if(pHalData->SwChnlInProgress)
  79171. +// if(pMgntInfo->bScanInProgress)
  79172. +// {
  79173. +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n",
  79174. +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));
  79175. +// return;
  79176. +// }
  79177. +
  79178. +// if(pHalData->SetBWModeInProgress)
  79179. +// {
  79180. +// // Modified it for 20/40 mhz switch by guangan 070531
  79181. +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n",
  79182. +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));
  79183. +// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer);
  79184. +// //return;
  79185. +// }
  79186. +
  79187. + //if(pHalData->SetBWModeInProgress)
  79188. + // return;
  79189. +
  79190. + //pHalData->SetBWModeInProgress= TRUE;
  79191. +
  79192. + pHalData->CurrentChannelBW = Bandwidth;
  79193. +
  79194. +#if 0
  79195. + if(Offset==HT_EXTCHNL_OFFSET_LOWER)
  79196. + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
  79197. + else if(Offset==HT_EXTCHNL_OFFSET_UPPER)
  79198. + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
  79199. + else
  79200. + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  79201. +#else
  79202. + pHalData->nCur40MhzPrimeSC = Offset;
  79203. +#endif
  79204. +
  79205. + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved))
  79206. + {
  79207. +#ifdef USE_WORKITEM
  79208. + //PlatformScheduleWorkItem(&(pHalData->SetBWModeWorkItem));
  79209. +#else
  79210. + #if 0
  79211. + //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0);
  79212. + #else
  79213. + _PHY_SetBWMode92C(Adapter);
  79214. + #endif
  79215. +#endif
  79216. + }
  79217. + else
  79218. + {
  79219. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n"));
  79220. + //pHalData->SetBWModeInProgress= FALSE;
  79221. + pHalData->CurrentChannelBW = tmpBW;
  79222. + }
  79223. +
  79224. +}
  79225. +
  79226. +
  79227. +static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel)
  79228. +{
  79229. + u8 eRFPath;
  79230. + u32 param1, param2;
  79231. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79232. +
  79233. + if ( Adapter->bNotifyChannelChange )
  79234. + {
  79235. + DBG_871X( "[%s] ch = %d\n", __FUNCTION__, channel );
  79236. + }
  79237. +
  79238. + //s1. pre common command - CmdID_SetTxPowerLevel
  79239. + PHY_SetTxPowerLevel8192C(Adapter, channel);
  79240. +
  79241. + //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel
  79242. + param1 = RF_CHNLBW;
  79243. + param2 = channel;
  79244. + for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  79245. + {
  79246. + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2);
  79247. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]);
  79248. + }
  79249. +
  79250. +
  79251. + //s3. post common command - CmdID_End, None
  79252. +
  79253. +}
  79254. +
  79255. +VOID
  79256. +PHY_SwChnl8192C( // Call after initialization
  79257. + IN PADAPTER Adapter,
  79258. + IN u8 channel
  79259. + )
  79260. +{
  79261. + //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE);
  79262. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79263. + u8 tmpchannel = pHalData->CurrentChannel;
  79264. + BOOLEAN bResult = _TRUE;
  79265. +
  79266. + if(pHalData->rf_chip == RF_PSEUDO_11N)
  79267. + {
  79268. + //pHalData->SwChnlInProgress=FALSE;
  79269. + return; //return immediately if it is peudo-phy
  79270. + }
  79271. +
  79272. + //if(pHalData->SwChnlInProgress)
  79273. + // return;
  79274. +
  79275. + //if(pHalData->SetBWModeInProgress)
  79276. + // return;
  79277. +
  79278. + //--------------------------------------------
  79279. + switch(pHalData->CurrentWirelessMode)
  79280. + {
  79281. + case WIRELESS_MODE_A:
  79282. + case WIRELESS_MODE_N_5G:
  79283. + //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14"));
  79284. + break;
  79285. +
  79286. + case WIRELESS_MODE_B:
  79287. + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14"));
  79288. + break;
  79289. +
  79290. + case WIRELESS_MODE_G:
  79291. + case WIRELESS_MODE_N_24G:
  79292. + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14"));
  79293. + break;
  79294. +
  79295. + default:
  79296. + //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode));
  79297. + break;
  79298. + }
  79299. + //--------------------------------------------
  79300. +
  79301. + //pHalData->SwChnlInProgress = TRUE;
  79302. + if(channel == 0)
  79303. + channel = 1;
  79304. +
  79305. + pHalData->CurrentChannel=channel;
  79306. +
  79307. + //pHalData->SwChnlStage=0;
  79308. + //pHalData->SwChnlStep=0;
  79309. +
  79310. + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved))
  79311. + {
  79312. +#ifdef USE_WORKITEM
  79313. + //bResult = PlatformScheduleWorkItem(&(pHalData->SwChnlWorkItem));
  79314. +#else
  79315. + #if 0
  79316. + //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0);
  79317. + #else
  79318. + _PHY_SwChnl8192C(Adapter, channel);
  79319. + #endif
  79320. +#endif
  79321. + if(bResult)
  79322. + {
  79323. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n"));
  79324. + }
  79325. + else
  79326. + {
  79327. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n"));
  79328. + //if(IS_HARDWARE_TYPE_8192SU(Adapter))
  79329. + //{
  79330. + // pHalData->SwChnlInProgress = FALSE;
  79331. + pHalData->CurrentChannel = tmpchannel;
  79332. + //}
  79333. + }
  79334. +
  79335. + }
  79336. + else
  79337. + {
  79338. + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n"));
  79339. + //if(IS_HARDWARE_TYPE_8192SU(Adapter))
  79340. + //{
  79341. + // pHalData->SwChnlInProgress = FALSE;
  79342. + pHalData->CurrentChannel = tmpchannel;
  79343. + //}
  79344. + }
  79345. +}
  79346. +
  79347. +
  79348. +static BOOLEAN
  79349. +phy_SwChnlStepByStep(
  79350. + IN PADAPTER Adapter,
  79351. + IN u8 channel,
  79352. + IN u8 *stage,
  79353. + IN u8 *step,
  79354. + OUT u32 *delay
  79355. + )
  79356. +{
  79357. +#if 0
  79358. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79359. + PCHANNEL_ACCESS_SETTING pChnlAccessSetting;
  79360. + SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT];
  79361. + u4Byte PreCommonCmdCnt;
  79362. + SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT];
  79363. + u4Byte PostCommonCmdCnt;
  79364. + SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT];
  79365. + u4Byte RfDependCmdCnt;
  79366. + SwChnlCmd *CurrentCmd;
  79367. + u1Byte eRFPath;
  79368. + u4Byte RfTXPowerCtrl;
  79369. + BOOLEAN bAdjRfTXPowerCtrl = _FALSE;
  79370. +
  79371. +
  79372. + RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n"));
  79373. +#if(MP_DRIVER != 1)
  79374. + RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel));
  79375. +#endif
  79376. + RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n"));
  79377. +
  79378. + pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting;
  79379. + RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n"));
  79380. +
  79381. + //for(eRFPath = RF_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  79382. + //for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  79383. + //{
  79384. + // <1> Fill up pre common command.
  79385. + PreCommonCmdCnt = 0;
  79386. + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
  79387. + CmdID_SetTxPowerLevel, 0, 0, 0);
  79388. + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
  79389. + CmdID_End, 0, 0, 0);
  79390. +
  79391. + // <2> Fill up post common command.
  79392. + PostCommonCmdCnt = 0;
  79393. +
  79394. + phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT,
  79395. + CmdID_End, 0, 0, 0);
  79396. +
  79397. + // <3> Fill up RF dependent command.
  79398. + RfDependCmdCnt = 0;
  79399. + switch( pHalData->RFChipID )
  79400. + {
  79401. + case RF_8225:
  79402. + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));
  79403. + // 2008/09/04 MH Change channel.
  79404. + if(channel==14) channel++;
  79405. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79406. + CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10);
  79407. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79408. + CmdID_End, 0, 0, 0);
  79409. + break;
  79410. +
  79411. + case RF_8256:
  79412. + // TEST!! This is not the table for 8256!!
  79413. + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));
  79414. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79415. + CmdID_RF_WriteReg, rRfChannel, channel, 10);
  79416. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79417. + CmdID_End, 0, 0, 0);
  79418. + break;
  79419. +
  79420. + case RF_6052:
  79421. + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));
  79422. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79423. + CmdID_RF_WriteReg, RF_CHNLBW, channel, 10);
  79424. + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
  79425. + CmdID_End, 0, 0, 0);
  79426. +
  79427. + break;
  79428. +
  79429. + case RF_8258:
  79430. + break;
  79431. +
  79432. + // For FPGA two MAC verification
  79433. + case RF_PSEUDO_11N:
  79434. + return TRUE;
  79435. + default:
  79436. + RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID));
  79437. + return FALSE;
  79438. + break;
  79439. + }
  79440. +
  79441. +
  79442. + do{
  79443. + switch(*stage)
  79444. + {
  79445. + case 0:
  79446. + CurrentCmd=&PreCommonCmd[*step];
  79447. + break;
  79448. + case 1:
  79449. + CurrentCmd=&RfDependCmd[*step];
  79450. + break;
  79451. + case 2:
  79452. + CurrentCmd=&PostCommonCmd[*step];
  79453. + break;
  79454. + }
  79455. +
  79456. + if(CurrentCmd->CmdID==CmdID_End)
  79457. + {
  79458. + if((*stage)==2)
  79459. + {
  79460. + return TRUE;
  79461. + }
  79462. + else
  79463. + {
  79464. + (*stage)++;
  79465. + (*step)=0;
  79466. + continue;
  79467. + }
  79468. + }
  79469. +
  79470. + switch(CurrentCmd->CmdID)
  79471. + {
  79472. + case CmdID_SetTxPowerLevel:
  79473. + PHY_SetTxPowerLevel8192C(Adapter,channel);
  79474. + break;
  79475. + case CmdID_WritePortUlong:
  79476. + PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2);
  79477. + break;
  79478. + case CmdID_WritePortUshort:
  79479. + PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2);
  79480. + break;
  79481. + case CmdID_WritePortUchar:
  79482. + PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2);
  79483. + break;
  79484. + case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!!
  79485. + for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  79486. + {
  79487. +#if 1
  79488. + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2);
  79489. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]);
  79490. +#else
  79491. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2));
  79492. +#endif
  79493. + }
  79494. + break;
  79495. + }
  79496. +
  79497. + break;
  79498. + }while(TRUE);
  79499. + //cosa }/*for(Number of RF paths)*/
  79500. +
  79501. + (*delay)=CurrentCmd->msDelay;
  79502. + (*step)++;
  79503. + return FALSE;
  79504. +#endif
  79505. + return _TRUE;
  79506. +}
  79507. +
  79508. +
  79509. +static BOOLEAN
  79510. +phy_SetSwChnlCmdArray(
  79511. + SwChnlCmd* CmdTable,
  79512. + u32 CmdTableIdx,
  79513. + u32 CmdTableSz,
  79514. + SwChnlCmdID CmdID,
  79515. + u32 Para1,
  79516. + u32 Para2,
  79517. + u32 msDelay
  79518. + )
  79519. +{
  79520. + SwChnlCmd* pCmd;
  79521. +
  79522. + if(CmdTable == NULL)
  79523. + {
  79524. + //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n"));
  79525. + return _FALSE;
  79526. + }
  79527. + if(CmdTableIdx >= CmdTableSz)
  79528. + {
  79529. + //RT_ASSERT(FALSE,
  79530. + // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n",
  79531. + // CmdTableIdx, CmdTableSz));
  79532. + return _FALSE;
  79533. + }
  79534. +
  79535. + pCmd = CmdTable + CmdTableIdx;
  79536. + pCmd->CmdID = CmdID;
  79537. + pCmd->Para1 = Para1;
  79538. + pCmd->Para2 = Para2;
  79539. + pCmd->msDelay = msDelay;
  79540. +
  79541. + return _TRUE;
  79542. +}
  79543. +
  79544. +
  79545. +static void
  79546. +phy_FinishSwChnlNow( // We should not call this function directly
  79547. + IN PADAPTER Adapter,
  79548. + IN u8 channel
  79549. + )
  79550. +{
  79551. +#if 0
  79552. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79553. + u32 delay;
  79554. +
  79555. + while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay))
  79556. + {
  79557. + if(delay>0)
  79558. + rtw_mdelay_os(delay);
  79559. + }
  79560. +#endif
  79561. +}
  79562. +
  79563. +
  79564. +
  79565. +//
  79566. +// Description:
  79567. +// Switch channel synchronously. Called by SwChnlByDelayHandler.
  79568. +//
  79569. +// Implemented by Bruce, 2008-02-14.
  79570. +// The following procedure is operted according to SwChanlCallback8190Pci().
  79571. +// However, this procedure is performed synchronously which should be running under
  79572. +// passive level.
  79573. +//
  79574. +VOID
  79575. +PHY_SwChnlPhy8192C( // Only called during initialize
  79576. + IN PADAPTER Adapter,
  79577. + IN u8 channel
  79578. + )
  79579. +{
  79580. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  79581. +
  79582. + //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel));
  79583. +
  79584. + // Cannot IO.
  79585. + //if(RT_CANNOT_IO(Adapter))
  79586. + // return;
  79587. +
  79588. + // Channel Switching is in progress.
  79589. + //if(pHalData->SwChnlInProgress)
  79590. + // return;
  79591. +
  79592. + //return immediately if it is peudo-phy
  79593. + if(pHalData->rf_chip == RF_PSEUDO_11N)
  79594. + {
  79595. + //pHalData->SwChnlInProgress=FALSE;
  79596. + return;
  79597. + }
  79598. +
  79599. + //pHalData->SwChnlInProgress = TRUE;
  79600. + if( channel == 0)
  79601. + channel = 1;
  79602. +
  79603. + pHalData->CurrentChannel=channel;
  79604. +
  79605. + //pHalData->SwChnlStage = 0;
  79606. + //pHalData->SwChnlStep = 0;
  79607. +
  79608. + phy_FinishSwChnlNow(Adapter,channel);
  79609. +
  79610. + //pHalData->SwChnlInProgress = FALSE;
  79611. +}
  79612. +
  79613. +
  79614. +//
  79615. +// Description:
  79616. +// Configure H/W functionality to enable/disable Monitor mode.
  79617. +// Note, because we possibly need to configure BB and RF in this function,
  79618. +// so caller should in PASSIVE_LEVEL. 080118, by rcnjko.
  79619. +//
  79620. +VOID
  79621. +PHY_SetMonitorMode8192C(
  79622. + IN PADAPTER pAdapter,
  79623. + IN BOOLEAN bEnableMonitorMode
  79624. + )
  79625. +{
  79626. +#if 0
  79627. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  79628. + BOOLEAN bFilterOutNonAssociatedBSSID = FALSE;
  79629. +
  79630. + //2 Note: we may need to stop antenna diversity.
  79631. + if(bEnableMonitorMode)
  79632. + {
  79633. + bFilterOutNonAssociatedBSSID = FALSE;
  79634. + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n"));
  79635. +
  79636. + pHalData->bInMonitorMode = TRUE;
  79637. + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE);
  79638. + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID);
  79639. + }
  79640. + else
  79641. + {
  79642. + bFilterOutNonAssociatedBSSID = TRUE;
  79643. + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n"));
  79644. +
  79645. + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE);
  79646. + pHalData->bInMonitorMode = FALSE;
  79647. + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID);
  79648. + }
  79649. +#endif
  79650. +}
  79651. +
  79652. +
  79653. +/*-----------------------------------------------------------------------------
  79654. + * Function: PHYCheckIsLegalRfPath8190Pci()
  79655. + *
  79656. + * Overview: Check different RF type to execute legal judgement. If RF Path is illegal
  79657. + * We will return false.
  79658. + *
  79659. + * Input: NONE
  79660. + *
  79661. + * Output: NONE
  79662. + *
  79663. + * Return: NONE
  79664. + *
  79665. + * Revised History:
  79666. + * When Who Remark
  79667. + * 11/15/2007 MHC Create Version 0.
  79668. + *
  79669. + *---------------------------------------------------------------------------*/
  79670. +BOOLEAN
  79671. +PHY_CheckIsLegalRfPath8192C(
  79672. + IN PADAPTER pAdapter,
  79673. + IN u32 eRFPath)
  79674. +{
  79675. +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  79676. + BOOLEAN rtValue = _TRUE;
  79677. +
  79678. + // NOt check RF Path now.!
  79679. +#if 0
  79680. + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A)
  79681. + {
  79682. + rtValue = FALSE;
  79683. + }
  79684. + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A)
  79685. + {
  79686. +
  79687. + }
  79688. +#endif
  79689. + return rtValue;
  79690. +
  79691. +} /* PHY_CheckIsLegalRfPath8192C */
  79692. +
  79693. +//-------------------------------------------------------------------------
  79694. +//
  79695. +// IQK
  79696. +//
  79697. +//-------------------------------------------------------------------------
  79698. +#define MAX_TOLERANCE 5
  79699. +#define IQK_DELAY_TIME 1 //ms
  79700. +
  79701. +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
  79702. +_PHY_PathA_IQK(
  79703. + IN PADAPTER pAdapter,
  79704. + IN BOOLEAN configPathB
  79705. + )
  79706. +{
  79707. + u32 regEAC, regE94, regE9C, regEA4;
  79708. + u8 result = 0x00;
  79709. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  79710. +
  79711. + //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n"));
  79712. +
  79713. + //path-A IQK setting
  79714. + //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
  79715. + PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
  79716. + PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
  79717. + PHY_SetBBReg(pAdapter, rTx_IQK_PI_A, bMaskDWord, 0x82140102);
  79718. +
  79719. + PHY_SetBBReg(pAdapter, rRx_IQK_PI_A, bMaskDWord, configPathB ? 0x28160202 :
  79720. + IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)?0x28160202:0x28160502);
  79721. +
  79722. + //path-B IQK setting
  79723. + if(configPathB)
  79724. + {
  79725. + PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x10008c22);
  79726. + PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x10008c22);
  79727. + PHY_SetBBReg(pAdapter, rTx_IQK_PI_B, bMaskDWord, 0x82140102);
  79728. + PHY_SetBBReg(pAdapter, rRx_IQK_PI_B, bMaskDWord, 0x28160202);
  79729. + }
  79730. +
  79731. + //LO calibration setting
  79732. + //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n"));
  79733. + PHY_SetBBReg(pAdapter, rIQK_AGC_Rsp, bMaskDWord, 0x001028d1);
  79734. +
  79735. + //One shot, path A LOK & IQK
  79736. + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
  79737. + PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
  79738. + PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
  79739. +
  79740. + // delay x ms
  79741. + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME));
  79742. + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
  79743. +
  79744. + // Check failed
  79745. + regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
  79746. + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
  79747. + regE94 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord);
  79748. + //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94));
  79749. + regE9C= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord);
  79750. + //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C));
  79751. + regEA4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord);
  79752. + //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4));
  79753. +
  79754. + if(!(regEAC & BIT28) &&
  79755. + (((regE94 & 0x03FF0000)>>16) != 0x142) &&
  79756. + (((regE9C & 0x03FF0000)>>16) != 0x42) )
  79757. + result |= 0x01;
  79758. + else //if Tx not OK, ignore Rx
  79759. + return result;
  79760. +
  79761. + if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK
  79762. + (((regEA4 & 0x03FF0000)>>16) != 0x132) &&
  79763. + (((regEAC & 0x03FF0000)>>16) != 0x36))
  79764. + result |= 0x02;
  79765. + else
  79766. + DBG_8192C("Path A Rx IQK fail!!\n");
  79767. +
  79768. + return result;
  79769. +
  79770. +
  79771. +}
  79772. +
  79773. +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
  79774. +_PHY_PathB_IQK(
  79775. + IN PADAPTER pAdapter
  79776. + )
  79777. +{
  79778. + u32 regEAC, regEB4, regEBC, regEC4, regECC;
  79779. + u8 result = 0x00;
  79780. + //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n"));
  79781. +
  79782. + //One shot, path B LOK & IQK
  79783. + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
  79784. + PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000002);
  79785. + PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000000);
  79786. +
  79787. + // delay x ms
  79788. + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME));
  79789. + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
  79790. +
  79791. + // Check failed
  79792. + regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
  79793. + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
  79794. + regEB4 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord);
  79795. + //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4));
  79796. + regEBC= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord);
  79797. + //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC));
  79798. + regEC4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord);
  79799. + //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4));
  79800. + regECC= PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord);
  79801. + //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC));
  79802. +
  79803. + if(!(regEAC & BIT31) &&
  79804. + (((regEB4 & 0x03FF0000)>>16) != 0x142) &&
  79805. + (((regEBC & 0x03FF0000)>>16) != 0x42))
  79806. + result |= 0x01;
  79807. + else
  79808. + return result;
  79809. +
  79810. + if(!(regEAC & BIT30) &&
  79811. + (((regEC4 & 0x03FF0000)>>16) != 0x132) &&
  79812. + (((regECC & 0x03FF0000)>>16) != 0x36))
  79813. + result |= 0x02;
  79814. + else
  79815. + DBG_8192C("Path B Rx IQK fail!!\n");
  79816. +
  79817. +
  79818. + return result;
  79819. +
  79820. +}
  79821. +
  79822. +static VOID
  79823. +_PHY_PathAFillIQKMatrix(
  79824. + IN PADAPTER pAdapter,
  79825. + IN BOOLEAN bIQKOK,
  79826. + IN int result[][8],
  79827. + IN u8 final_candidate,
  79828. + IN BOOLEAN bTxOnly
  79829. + )
  79830. +{
  79831. + u32 Oldval_0, X, TX0_A, reg;
  79832. + s32 Y, TX0_C;
  79833. +
  79834. + DBG_8192C("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
  79835. +
  79836. + if(final_candidate == 0xFF)
  79837. + return;
  79838. + else if(bIQKOK)
  79839. + {
  79840. + Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
  79841. +
  79842. + X = result[final_candidate][0];
  79843. + if ((X & 0x00000200) != 0)
  79844. + X = X | 0xFFFFFC00;
  79845. + TX0_A = (X * Oldval_0) >> 8;
  79846. + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0));
  79847. + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);
  79848. + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1));
  79849. +
  79850. + Y = result[final_candidate][1];
  79851. + if ((Y & 0x00000200) != 0)
  79852. + Y = Y | 0xFFFFFC00;
  79853. + TX0_C = (Y * Oldval_0) >> 8;
  79854. + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C));
  79855. + PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));
  79856. + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));
  79857. + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1));
  79858. +
  79859. + if(bTxOnly)
  79860. + {
  79861. + DBG_8192C("_PHY_PathAFillIQKMatrix only Tx OK\n");
  79862. + return;
  79863. + }
  79864. +
  79865. + reg = result[final_candidate][2];
  79866. + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);
  79867. +
  79868. + reg = result[final_candidate][3] & 0x3F;
  79869. + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);
  79870. +
  79871. + reg = (result[final_candidate][3] >> 6) & 0xF;
  79872. + PHY_SetBBReg(pAdapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);
  79873. + }
  79874. +}
  79875. +
  79876. +static VOID
  79877. +_PHY_PathBFillIQKMatrix(
  79878. + IN PADAPTER pAdapter,
  79879. + IN BOOLEAN bIQKOK,
  79880. + IN int result[][8],
  79881. + IN u8 final_candidate,
  79882. + IN BOOLEAN bTxOnly //do Tx only
  79883. + )
  79884. +{
  79885. + u32 Oldval_1, X, TX1_A, reg;
  79886. + s32 Y, TX1_C;
  79887. +
  79888. + DBG_8192C("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
  79889. +
  79890. + if(final_candidate == 0xFF)
  79891. + return;
  79892. + else if(bIQKOK)
  79893. + {
  79894. + Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
  79895. +
  79896. + X = result[final_candidate][4];
  79897. + if ((X & 0x00000200) != 0)
  79898. + X = X | 0xFFFFFC00;
  79899. + TX1_A = (X * Oldval_1) >> 8;
  79900. + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A));
  79901. + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);
  79902. + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1));
  79903. +
  79904. + Y = result[final_candidate][5];
  79905. + if ((Y & 0x00000200) != 0)
  79906. + Y = Y | 0xFFFFFC00;
  79907. + TX1_C = (Y * Oldval_1) >> 8;
  79908. + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C));
  79909. + PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));
  79910. + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));
  79911. + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1));
  79912. +
  79913. + if(bTxOnly)
  79914. + return;
  79915. +
  79916. + reg = result[final_candidate][6];
  79917. + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);
  79918. +
  79919. + reg = result[final_candidate][7] & 0x3F;
  79920. + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);
  79921. +
  79922. + reg = (result[final_candidate][7] >> 6) & 0xF;
  79923. + PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg);
  79924. + }
  79925. +}
  79926. +
  79927. +static VOID
  79928. +_PHY_SaveADDARegisters(
  79929. + IN PADAPTER pAdapter,
  79930. + IN u32* ADDAReg,
  79931. + IN u32* ADDABackup,
  79932. + IN u32 RegisterNum
  79933. + )
  79934. +{
  79935. + u32 i;
  79936. +
  79937. + //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
  79938. + for( i = 0 ; i < RegisterNum ; i++){
  79939. + ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord);
  79940. + }
  79941. +}
  79942. +
  79943. +static VOID
  79944. +_PHY_SaveMACRegisters(
  79945. + IN PADAPTER pAdapter,
  79946. + IN u32* MACReg,
  79947. + IN u32* MACBackup
  79948. + )
  79949. +{
  79950. + u32 i;
  79951. +
  79952. + //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n"));
  79953. + for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){
  79954. + MACBackup[i] =rtw_read8(pAdapter, MACReg[i]);
  79955. + }
  79956. + MACBackup[i] = rtw_read32(pAdapter, MACReg[i]);
  79957. +
  79958. +}
  79959. +
  79960. +static VOID
  79961. +_PHY_ReloadADDARegisters(
  79962. + IN PADAPTER pAdapter,
  79963. + IN u32* ADDAReg,
  79964. + IN u32* ADDABackup,
  79965. + IN u32 RegiesterNum
  79966. + )
  79967. +{
  79968. + u32 i;
  79969. +
  79970. + //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
  79971. + for(i = 0 ; i < RegiesterNum ; i++){
  79972. + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]);
  79973. + }
  79974. +}
  79975. +
  79976. +static VOID
  79977. +_PHY_ReloadMACRegisters(
  79978. + IN PADAPTER pAdapter,
  79979. + IN u32* MACReg,
  79980. + IN u32* MACBackup
  79981. + )
  79982. +{
  79983. + u32 i;
  79984. +
  79985. + //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n"));
  79986. + for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){
  79987. + rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]);
  79988. + }
  79989. + rtw_write32(pAdapter, MACReg[i], MACBackup[i]);
  79990. +}
  79991. +
  79992. +static VOID
  79993. +_PHY_PathADDAOn(
  79994. + IN PADAPTER pAdapter,
  79995. + IN u32* ADDAReg,
  79996. + IN BOOLEAN isPathAOn,
  79997. + IN BOOLEAN is2T
  79998. + )
  79999. +{
  80000. + u32 pathOn;
  80001. + u32 i;
  80002. +
  80003. + //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n"));
  80004. +
  80005. + pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4;
  80006. + if(_FALSE == is2T){
  80007. + pathOn = 0x0bdb25a0;
  80008. + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0);
  80009. + }
  80010. + else{
  80011. + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn);
  80012. + }
  80013. +
  80014. + for( i = 1 ; i < IQK_ADDA_REG_NUM ; i++){
  80015. + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn);
  80016. + }
  80017. +
  80018. +}
  80019. +
  80020. +static VOID
  80021. +_PHY_MACSettingCalibration(
  80022. + IN PADAPTER pAdapter,
  80023. + IN u32* MACReg,
  80024. + IN u32* MACBackup
  80025. + )
  80026. +{
  80027. + u32 i = 0;
  80028. +
  80029. + //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n"));
  80030. +
  80031. + rtw_write8(pAdapter, MACReg[i], 0x3F);
  80032. +
  80033. + for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){
  80034. + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3)));
  80035. + }
  80036. + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5)));
  80037. +
  80038. +}
  80039. +
  80040. +static VOID
  80041. +_PHY_PathAStandBy(
  80042. + IN PADAPTER pAdapter
  80043. + )
  80044. +{
  80045. + //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n"));
  80046. +
  80047. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x0);
  80048. + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000);
  80049. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
  80050. +}
  80051. +
  80052. +static VOID
  80053. +_PHY_PIModeSwitch(
  80054. + IN PADAPTER pAdapter,
  80055. + IN BOOLEAN PIMode
  80056. + )
  80057. +{
  80058. + u32 mode;
  80059. +
  80060. + //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI")));
  80061. +
  80062. + mode = PIMode ? 0x01000100 : 0x01000000;
  80063. + PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode);
  80064. + PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode);
  80065. +}
  80066. +
  80067. +/*
  80068. +return _FALSE => do IQK again
  80069. +*/
  80070. +static BOOLEAN
  80071. +_PHY_SimularityCompare(
  80072. + IN PADAPTER pAdapter,
  80073. + IN int result[][8],
  80074. + IN u8 c1,
  80075. + IN u8 c2
  80076. + )
  80077. +{
  80078. + u32 i, j, diff, SimularityBitMap, bound = 0;
  80079. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  80080. + u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B
  80081. + BOOLEAN bResult = _TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID);
  80082. +
  80083. + if(is2T)
  80084. + bound = 8;
  80085. + else
  80086. + bound = 4;
  80087. +
  80088. + SimularityBitMap = 0;
  80089. +
  80090. + for( i = 0; i < bound; i++ )
  80091. + {
  80092. + diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]);
  80093. + if (diff > MAX_TOLERANCE)
  80094. + {
  80095. + if((i == 2 || i == 6) && !SimularityBitMap)
  80096. + {
  80097. + if(result[c1][i]+result[c1][i+1] == 0)
  80098. + final_candidate[(i/4)] = c2;
  80099. + else if (result[c2][i]+result[c2][i+1] == 0)
  80100. + final_candidate[(i/4)] = c1;
  80101. + else
  80102. + SimularityBitMap = SimularityBitMap|(1<<i);
  80103. + }
  80104. + else
  80105. + SimularityBitMap = SimularityBitMap|(1<<i);
  80106. + }
  80107. + }
  80108. +
  80109. + if ( SimularityBitMap == 0)
  80110. + {
  80111. + for( i = 0; i < (bound/4); i++ )
  80112. + {
  80113. + if(final_candidate[i] != 0xFF)
  80114. + {
  80115. + for( j = i*4; j < (i+1)*4-2; j++)
  80116. + result[3][j] = result[final_candidate[i]][j];
  80117. + bResult = _FALSE;
  80118. + }
  80119. + }
  80120. + return bResult;
  80121. + }
  80122. + else if (!(SimularityBitMap & 0x0F)) //path A OK
  80123. + {
  80124. + for(i = 0; i < 4; i++)
  80125. + result[3][i] = result[c1][i];
  80126. + return _FALSE;
  80127. + }
  80128. + else if (!(SimularityBitMap & 0xF0) && is2T) //path B OK
  80129. + {
  80130. + for(i = 4; i < 8; i++)
  80131. + result[3][i] = result[c1][i];
  80132. + return _FALSE;
  80133. + }
  80134. + else
  80135. + return _FALSE;
  80136. +
  80137. +}
  80138. +
  80139. +static VOID
  80140. +_PHY_IQCalibrate(
  80141. + IN PADAPTER pAdapter,
  80142. + IN int result[][8],
  80143. + IN u8 t,
  80144. + IN BOOLEAN is2T
  80145. + )
  80146. +{
  80147. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  80148. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  80149. + u32 i;
  80150. + u8 PathAOK, PathBOK;
  80151. + u32 ADDA_REG[IQK_ADDA_REG_NUM] = {
  80152. + rFPGA0_XCD_SwitchControl, rBlue_Tooth,
  80153. + rRx_Wait_CCA, rTx_CCK_RFON,
  80154. + rTx_CCK_BBON, rTx_OFDM_RFON,
  80155. + rTx_OFDM_BBON, rTx_To_Rx,
  80156. + rTx_To_Tx, rRx_CCK,
  80157. + rRx_OFDM, rRx_Wait_RIFS,
  80158. + rRx_TO_Rx, rStandby,
  80159. + rSleep, rPMPD_ANAEN };
  80160. +
  80161. + u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {
  80162. + REG_TXPAUSE, REG_BCN_CTRL,
  80163. + REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
  80164. +
  80165. + u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
  80166. + rOFDM0_TRxPathEnable, rOFDM0_TRMuxPar,
  80167. + rFPGA0_XCD_RFInterfaceSW, rConfig_AntA, rConfig_AntB,
  80168. + rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE,
  80169. + rFPGA0_XB_RFInterfaceOE, rFPGA0_RFMOD
  80170. + };
  80171. +
  80172. +#if MP_DRIVER
  80173. + const u32 retryCount = 9;
  80174. +#else
  80175. + const u32 retryCount = 2;
  80176. +#endif
  80177. +
  80178. + // Note: IQ calibration must be performed after loading
  80179. + // PHY_REG.txt , and radio_a, radio_b.txt
  80180. +
  80181. + u32 bbvalue;
  80182. +
  80183. + if(t==0)
  80184. + {
  80185. + bbvalue = PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bMaskDWord);
  80186. + //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue));
  80187. +
  80188. + //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R")));
  80189. +
  80190. + // Save ADDA parameters, turn Path A ADDA on
  80191. + _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM);
  80192. + _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
  80193. + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
  80194. + }
  80195. + _PHY_PathADDAOn(pAdapter, ADDA_REG, _TRUE, is2T);
  80196. +
  80197. + if(t==0)
  80198. + {
  80199. + pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8));
  80200. + }
  80201. +
  80202. + if(!pdmpriv->bRfPiEnable){
  80203. + // Switch BB to PI mode to do IQ Calibration.
  80204. + _PHY_PIModeSwitch(pAdapter, _TRUE);
  80205. + }
  80206. +
  80207. + PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0x00);
  80208. + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);
  80209. + PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);
  80210. + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);
  80211. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01);
  80212. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01);
  80213. + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00);
  80214. + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00);
  80215. +
  80216. + if(is2T)
  80217. + {
  80218. + PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000);
  80219. + PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000);
  80220. + }
  80221. +
  80222. + //MAC settings
  80223. + _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
  80224. +
  80225. + //Page B init
  80226. + PHY_SetBBReg(pAdapter, rConfig_AntA, bMaskDWord, 0x00080000);
  80227. +
  80228. + if(is2T)
  80229. + {
  80230. + PHY_SetBBReg(pAdapter, rConfig_AntB, bMaskDWord, 0x00080000);
  80231. + }
  80232. +
  80233. + // IQ calibration setting
  80234. + //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n"));
  80235. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
  80236. + PHY_SetBBReg(pAdapter, rTx_IQK, bMaskDWord, 0x01007c00);
  80237. + PHY_SetBBReg(pAdapter, rRx_IQK, bMaskDWord, 0x01004800);
  80238. +
  80239. + for(i = 0 ; i < retryCount ; i++){
  80240. + PathAOK = _PHY_PathA_IQK(pAdapter, is2T);
  80241. + if(PathAOK == 0x03){
  80242. + DBG_8192C("Path A IQK Success!!\n");
  80243. + result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
  80244. + result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
  80245. + result[t][2] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
  80246. + result[t][3] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
  80247. + break;
  80248. + }
  80249. + else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK
  80250. + {
  80251. + DBG_8192C("Path A IQK Only Tx Success!!\n");
  80252. +
  80253. + result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
  80254. + result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
  80255. + }
  80256. + }
  80257. +
  80258. + if(0x00 == PathAOK){
  80259. + DBG_8192C("Path A IQK failed!!\n");
  80260. + }
  80261. +
  80262. + if(is2T){
  80263. + _PHY_PathAStandBy(pAdapter);
  80264. +
  80265. + // Turn Path B ADDA on
  80266. + _PHY_PathADDAOn(pAdapter, ADDA_REG, _FALSE, is2T);
  80267. +
  80268. + for(i = 0 ; i < retryCount ; i++){
  80269. + PathBOK = _PHY_PathB_IQK(pAdapter);
  80270. + if(PathBOK == 0x03){
  80271. + DBG_8192C("Path B IQK Success!!\n");
  80272. + result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
  80273. + result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
  80274. + result[t][6] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
  80275. + result[t][7] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
  80276. + break;
  80277. + }
  80278. + else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK
  80279. + {
  80280. + DBG_8192C("Path B Only Tx IQK Success!!\n");
  80281. + result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
  80282. + result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
  80283. + }
  80284. + }
  80285. +
  80286. + if(0x00 == PathBOK){
  80287. + DBG_8192C("Path B IQK failed!!\n");
  80288. + }
  80289. + }
  80290. +
  80291. + //Back to BB mode, load original value
  80292. + //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n"));
  80293. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0);
  80294. +
  80295. + if(t!=0)
  80296. + {
  80297. + if(!pdmpriv->bRfPiEnable){
  80298. + // Switch back BB to SI mode after finish IQ Calibration.
  80299. + _PHY_PIModeSwitch(pAdapter, _FALSE);
  80300. + }
  80301. +
  80302. + // Reload ADDA power saving parameters
  80303. + _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM);
  80304. +
  80305. + // Reload MAC parameters
  80306. + _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
  80307. +
  80308. + // Reload BB parameters
  80309. + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
  80310. +
  80311. + // Restore RX initial gain
  80312. + PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3);
  80313. + if(is2T){
  80314. + PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3);
  80315. + }
  80316. +
  80317. + //load 0xe30 IQC default value
  80318. + PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
  80319. + PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
  80320. +
  80321. + }
  80322. + //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n"));
  80323. +
  80324. +}
  80325. +
  80326. +
  80327. +static VOID
  80328. +_PHY_LCCalibrate(
  80329. + IN PADAPTER pAdapter,
  80330. + IN BOOLEAN is2T
  80331. + )
  80332. +{
  80333. + u8 tmpReg;
  80334. + u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal;
  80335. +
  80336. + //Check continuous TX and Packet TX
  80337. + tmpReg = rtw_read8(pAdapter, 0xd03);
  80338. +
  80339. + if((tmpReg&0x70) != 0) //Deal with contisuous TX case
  80340. + rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX
  80341. + else // Deal with Packet TX case
  80342. + rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues
  80343. +
  80344. + if((tmpReg&0x70) != 0)
  80345. + {
  80346. + //1. Read original RF mode
  80347. + //Path-A
  80348. + RF_Amode = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits);
  80349. +
  80350. + //Path-B
  80351. + if(is2T)
  80352. + RF_Bmode = PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits);
  80353. +
  80354. + //2. Set RF mode = standby mode
  80355. + //Path-A
  80356. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);
  80357. +
  80358. + //Path-B
  80359. + if(is2T)
  80360. + PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);
  80361. + }
  80362. +
  80363. + //3. Read RF reg18
  80364. + LC_Cal = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits);
  80365. +
  80366. + //4. Set LC calibration begin
  80367. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);
  80368. +
  80369. + #ifdef CONFIG_LONG_DELAY_ISSUE
  80370. + rtw_msleep_os(100);
  80371. + #else
  80372. + rtw_mdelay_os(100);
  80373. + #endif
  80374. +
  80375. + //Restore original situation
  80376. + if((tmpReg&0x70) != 0) //Deal with contisuous TX case
  80377. + {
  80378. + //Path-A
  80379. + rtw_write8(pAdapter, 0xd03, tmpReg);
  80380. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);
  80381. +
  80382. + //Path-B
  80383. + if(is2T)
  80384. + PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);
  80385. + }
  80386. + else // Deal with Packet TX case
  80387. + {
  80388. + rtw_write8(pAdapter, REG_TXPAUSE, 0x00);
  80389. + }
  80390. +
  80391. +}
  80392. +
  80393. +
  80394. +//Analog Pre-distortion calibration
  80395. +#define APK_BB_REG_NUM 8
  80396. +#define APK_CURVE_REG_NUM 4
  80397. +#define PATH_NUM 2
  80398. +
  80399. +static VOID
  80400. +_PHY_APCalibrate(
  80401. + IN PADAPTER pAdapter,
  80402. + IN char delta,
  80403. + IN BOOLEAN is2T
  80404. + )
  80405. +{
  80406. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  80407. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  80408. +
  80409. + u32 regD[PATH_NUM];
  80410. + u32 tmpReg, index, offset, i, apkbound;
  80411. + u8 path, pathbound = PATH_NUM;
  80412. + u32 BB_backup[APK_BB_REG_NUM];
  80413. + u32 BB_REG[APK_BB_REG_NUM] = {
  80414. + rFPGA1_TxBlock, rOFDM0_TRxPathEnable,
  80415. + rFPGA0_RFMOD, rOFDM0_TRMuxPar,
  80416. + rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW,
  80417. + rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE };
  80418. + u32 BB_AP_MODE[APK_BB_REG_NUM] = {
  80419. + 0x00000020, 0x00a05430, 0x02040000,
  80420. + 0x000800e4, 0x00204000 };
  80421. + u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = {
  80422. + 0x00000020, 0x00a05430, 0x02040000,
  80423. + 0x000800e4, 0x22204000 };
  80424. +
  80425. + u32 AFE_backup[IQK_ADDA_REG_NUM];
  80426. + u32 AFE_REG[IQK_ADDA_REG_NUM] = {
  80427. + rFPGA0_XCD_SwitchControl, rBlue_Tooth,
  80428. + rRx_Wait_CCA, rTx_CCK_RFON,
  80429. + rTx_CCK_BBON, rTx_OFDM_RFON,
  80430. + rTx_OFDM_BBON, rTx_To_Rx,
  80431. + rTx_To_Tx, rRx_CCK,
  80432. + rRx_OFDM, rRx_Wait_RIFS,
  80433. + rRx_TO_Rx, rStandby,
  80434. + rSleep, rPMPD_ANAEN };
  80435. +
  80436. + u32 MAC_backup[IQK_MAC_REG_NUM];
  80437. + u32 MAC_REG[IQK_MAC_REG_NUM] = {
  80438. + REG_TXPAUSE, REG_BCN_CTRL,
  80439. + REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
  80440. +
  80441. + u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  80442. + {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
  80443. + {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
  80444. + };
  80445. +
  80446. + u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
  80447. + {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings
  80448. + {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
  80449. + };
  80450. +
  80451. + u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  80452. + {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
  80453. + {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
  80454. + };
  80455. +
  80456. + u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
  80457. + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings
  80458. + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
  80459. + };
  80460. +#if 0
  80461. + u32 APK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = {
  80462. + {0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80},
  80463. + {0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80}
  80464. + };
  80465. +#endif
  80466. + u32 AFE_on_off[PATH_NUM] = {
  80467. + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on
  80468. +
  80469. + u32 APK_offset[PATH_NUM] = {
  80470. + rConfig_AntA, rConfig_AntB};
  80471. +
  80472. + u32 APK_normal_offset[PATH_NUM] = {
  80473. + rConfig_Pmpd_AntA, rConfig_Pmpd_AntB};
  80474. +
  80475. + u32 APK_value[PATH_NUM] = {
  80476. + 0x92fc0000, 0x12fc0000};
  80477. +
  80478. + u32 APK_normal_value[PATH_NUM] = {
  80479. + 0x92680000, 0x12680000};
  80480. +
  80481. + char APK_delta_mapping[APK_BB_REG_NUM][13] = {
  80482. + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  80483. + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  80484. + {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  80485. + {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
  80486. + {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
  80487. + };
  80488. +
  80489. + u32 APK_normal_setting_value_1[13] = {
  80490. + 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
  80491. + 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
  80492. + 0x12680000, 0x00880000, 0x00880000
  80493. + };
  80494. +
  80495. + u32 APK_normal_setting_value_2[16] = {
  80496. + 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
  80497. + 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
  80498. + 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
  80499. + 0x00050006
  80500. + };
  80501. +
  80502. + u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a
  80503. + //u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM];
  80504. +
  80505. + int BB_offset, delta_V, delta_offset;
  80506. +
  80507. +#if (MP_DRIVER == 1)
  80508. + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
  80509. +
  80510. + pMptCtx->APK_bound[0] = 45;
  80511. + pMptCtx->APK_bound[1] = 52;
  80512. +#endif
  80513. +
  80514. + //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta));
  80515. +
  80516. + //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")));
  80517. +
  80518. + if(!is2T)
  80519. + pathbound = 1;
  80520. +
  80521. + //2 FOR NORMAL CHIP SETTINGS
  80522. +
  80523. +// Temporarily do not allow normal driver to do the following settings because these offset
  80524. +// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal
  80525. +// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the
  80526. +// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.
  80527. +#if (MP_DRIVER != 1)
  80528. + return;
  80529. +#endif
  80530. +
  80531. + //settings adjust for normal chip
  80532. + for(index = 0; index < PATH_NUM; index ++)
  80533. + {
  80534. + APK_offset[index] = APK_normal_offset[index];
  80535. + APK_value[index] = APK_normal_value[index];
  80536. + AFE_on_off[index] = 0x6fdb25a4;
  80537. + }
  80538. +
  80539. + for(index = 0; index < APK_BB_REG_NUM; index ++)
  80540. + {
  80541. + for(path = 0; path < pathbound; path++)
  80542. + {
  80543. + APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];
  80544. + APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];
  80545. + }
  80546. + BB_AP_MODE[index] = BB_normal_AP_MODE[index];
  80547. + }
  80548. +
  80549. + apkbound = 6;
  80550. +
  80551. + //save BB default value
  80552. + for(index = 0; index < APK_BB_REG_NUM ; index++)
  80553. + {
  80554. + if(index == 0) //skip
  80555. + continue;
  80556. + BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord);
  80557. + }
  80558. +
  80559. + //save MAC default value
  80560. + _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup);
  80561. +
  80562. + //save AFE default value
  80563. + _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
  80564. +
  80565. + for(path = 0; path < pathbound; path++)
  80566. + {
  80567. + if(path == RF_PATH_A)
  80568. + {
  80569. + //path A APK
  80570. + //load APK setting
  80571. + //path-A
  80572. + offset = rPdp_AntA;
  80573. + for(index = 0; index < 11; index ++)
  80574. + {
  80575. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
  80576. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80577. +
  80578. + offset += 0x04;
  80579. + }
  80580. +
  80581. + PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
  80582. +
  80583. + offset = rConfig_AntA;
  80584. + for(; index < 13; index ++)
  80585. + {
  80586. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
  80587. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80588. +
  80589. + offset += 0x04;
  80590. + }
  80591. +
  80592. + //page-B1
  80593. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
  80594. +
  80595. + //path A
  80596. + offset = rPdp_AntA;
  80597. + for(index = 0; index < 16; index++)
  80598. + {
  80599. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
  80600. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80601. +
  80602. + offset += 0x04;
  80603. + }
  80604. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
  80605. + }
  80606. + else if(path == RF_PATH_B)
  80607. + {
  80608. + //path B APK
  80609. + //load APK setting
  80610. + //path-B
  80611. + offset = rPdp_AntB;
  80612. + for(index = 0; index < 10; index ++)
  80613. + {
  80614. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
  80615. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80616. +
  80617. + offset += 0x04;
  80618. + }
  80619. + PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);
  80620. +
  80621. + PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
  80622. +
  80623. + offset = rConfig_AntA;
  80624. + index = 11;
  80625. + for(; index < 13; index ++) //offset 0xb68, 0xb6c
  80626. + {
  80627. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
  80628. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80629. +
  80630. + offset += 0x04;
  80631. + }
  80632. +
  80633. + //page-B1
  80634. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
  80635. +
  80636. + //path B
  80637. + offset = 0xb60;
  80638. + for(index = 0; index < 16; index++)
  80639. + {
  80640. + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
  80641. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
  80642. +
  80643. + offset += 0x04;
  80644. + }
  80645. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
  80646. + }
  80647. +
  80648. + //save RF default value
  80649. + regD[path] = PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask);
  80650. +
  80651. + //Path A AFE all on, path B AFE All off or vise versa
  80652. + for(index = 0; index < IQK_ADDA_REG_NUM ; index++)
  80653. + PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]);
  80654. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord)));
  80655. +
  80656. + //BB to AP mode
  80657. + if(path == 0)
  80658. + {
  80659. + for(index = 0; index < APK_BB_REG_NUM ; index++)
  80660. + {
  80661. + if(index == 0) //skip
  80662. + continue;
  80663. + else if (index < 5)
  80664. + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);
  80665. + else if (BB_REG[index] == 0x870)
  80666. + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);
  80667. + else
  80668. + PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0);
  80669. + }
  80670. + PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
  80671. + PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
  80672. + }
  80673. + else //path B
  80674. + {
  80675. + PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);
  80676. + PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);
  80677. + }
  80678. +
  80679. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord)));
  80680. +
  80681. + //MAC settings
  80682. + _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup);
  80683. +
  80684. + if(path == RF_PATH_A) //Path B to standby mode
  80685. + {
  80686. + PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bRFRegOffsetMask, 0x10000);
  80687. + }
  80688. + else //Path A to standby mode
  80689. + {
  80690. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x10000);
  80691. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
  80692. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20103);
  80693. + }
  80694. +
  80695. + delta_offset = ((delta+14)/2);
  80696. + if(delta_offset < 0)
  80697. + delta_offset = 0;
  80698. + else if (delta_offset > 12)
  80699. + delta_offset = 12;
  80700. +
  80701. + //AP calibration
  80702. + for(index = 0; index < APK_BB_REG_NUM; index++)
  80703. + {
  80704. + if(index != 1) //only DO PA11+PAD01001, AP RF setting
  80705. + continue;
  80706. +
  80707. + tmpReg = APK_RF_init_value[path][index];
  80708. +#if 1
  80709. + if(!pdmpriv->bAPKThermalMeterIgnore)
  80710. + {
  80711. + BB_offset = (tmpReg & 0xF0000) >> 16;
  80712. +
  80713. + if(!(tmpReg & BIT15)) //sign bit 0
  80714. + {
  80715. + BB_offset = -BB_offset;
  80716. + }
  80717. +
  80718. + delta_V = APK_delta_mapping[index][delta_offset];
  80719. +
  80720. + BB_offset += delta_V;
  80721. +
  80722. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset));
  80723. +
  80724. + if(BB_offset < 0)
  80725. + {
  80726. + tmpReg = tmpReg & (~BIT15);
  80727. + BB_offset = -BB_offset;
  80728. + }
  80729. + else
  80730. + {
  80731. + tmpReg = tmpReg | BIT15;
  80732. + }
  80733. + tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);
  80734. + }
  80735. +#endif
  80736. +
  80737. +#ifdef CONFIG_PCI_HCI
  80738. + if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
  80739. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_IPA_A, bRFRegOffsetMask, 0x894ae);
  80740. + else
  80741. +#endif
  80742. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_IPA_A, bRFRegOffsetMask, 0x8992e);
  80743. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0xc, bMaskDWord)));
  80744. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_AC, bRFRegOffsetMask, APK_RF_value_0[path][index]);
  80745. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0x0, bMaskDWord)));
  80746. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, tmpReg);
  80747. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0xd, bMaskDWord)));
  80748. +
  80749. + // PA11+PAD01111, one shot
  80750. + i = 0;
  80751. + do
  80752. + {
  80753. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80000000);
  80754. + {
  80755. + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]);
  80756. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));
  80757. + rtw_mdelay_os(3);
  80758. + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]);
  80759. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));
  80760. + #ifdef CONFIG_LONG_DELAY_ISSUE
  80761. + rtw_msleep_os(20);
  80762. + #else
  80763. + rtw_mdelay_os(20);
  80764. + #endif
  80765. + }
  80766. + PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
  80767. +
  80768. + if(path == RF_PATH_A)
  80769. + tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0x03E00000);
  80770. + else
  80771. + tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0xF8000000);
  80772. + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xbd8[25:21] %x\n", tmpReg));
  80773. +
  80774. + i++;
  80775. + }
  80776. + while(tmpReg > apkbound && i < 4);
  80777. +
  80778. + APK_result[path][index] = tmpReg;
  80779. + }
  80780. + }
  80781. +
  80782. + //reload MAC default value
  80783. + _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup);
  80784. +
  80785. + //reload BB default value
  80786. + for(index = 0; index < APK_BB_REG_NUM ; index++)
  80787. + {
  80788. + if(index == 0) //skip
  80789. + continue;
  80790. + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]);
  80791. + }
  80792. +
  80793. + //reload AFE default value
  80794. + _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
  80795. +
  80796. + //reload RF path default value
  80797. + for(path = 0; path < pathbound; path++)
  80798. + {
  80799. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, regD[path]);
  80800. + if(path == RF_PATH_B)
  80801. + {
  80802. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
  80803. + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20101);
  80804. + }
  80805. +
  80806. + //note no index == 0
  80807. + if (APK_result[path][1] > 6)
  80808. + APK_result[path][1] = 6;
  80809. + //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1]));
  80810. + }
  80811. +
  80812. + //RTPRINT(FINIT, INIT_IQK, ("\n"));
  80813. +
  80814. +
  80815. + for(path = 0; path < pathbound; path++)
  80816. + {
  80817. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G1_G4, bRFRegOffsetMask,
  80818. + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));
  80819. + if(path == RF_PATH_A)
  80820. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
  80821. + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));
  80822. + else
  80823. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
  80824. + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));
  80825. + PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G9_G11, bRFRegOffsetMask,
  80826. + ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));
  80827. + }
  80828. +
  80829. + pdmpriv->bAPKdone = _TRUE;
  80830. +
  80831. + //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n"));
  80832. +}
  80833. +
  80834. +static VOID _PHY_SetRFPathSwitch(
  80835. + IN PADAPTER pAdapter,
  80836. + IN BOOLEAN bMain,
  80837. + IN BOOLEAN is2T
  80838. + )
  80839. +{
  80840. + u8 u1bTmp;
  80841. +
  80842. + if(!pAdapter->hw_init_completed)
  80843. + {
  80844. + u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7;
  80845. + rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp);
  80846. + //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01);
  80847. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);
  80848. + }
  80849. +
  80850. + if(is2T)
  80851. + {
  80852. + if(bMain)
  80853. + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A
  80854. + else
  80855. + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT
  80856. + }
  80857. + else
  80858. + {
  80859. +
  80860. + if(bMain)
  80861. + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main
  80862. + else
  80863. + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux
  80864. + }
  80865. +
  80866. +}
  80867. +
  80868. +//return value TRUE => Main; FALSE => Aux
  80869. +
  80870. +static BOOLEAN _PHY_QueryRFPathSwitch(
  80871. + IN PADAPTER pAdapter,
  80872. + IN BOOLEAN is2T
  80873. + )
  80874. +{
  80875. +// if(is2T)
  80876. +// return _TRUE;
  80877. +
  80878. + if(!pAdapter->hw_init_completed)
  80879. + {
  80880. + PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01);
  80881. + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);
  80882. + }
  80883. +
  80884. + if(is2T)
  80885. + {
  80886. + if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01)
  80887. + return _TRUE;
  80888. + else
  80889. + return _FALSE;
  80890. + }
  80891. + else
  80892. + {
  80893. + if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02)
  80894. + return _TRUE;
  80895. + else
  80896. + return _FALSE;
  80897. + }
  80898. +}
  80899. +
  80900. +VOID
  80901. +rtl8192c_PHY_IQCalibrate(
  80902. + IN PADAPTER pAdapter,
  80903. + IN BOOLEAN bReCovery
  80904. + )
  80905. +{
  80906. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  80907. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  80908. + s32 result[4][8]; //last is final result
  80909. + u8 i, final_candidate;
  80910. + BOOLEAN bPathAOK, bPathBOK;
  80911. + s32 RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;
  80912. + BOOLEAN is12simular, is13simular, is23simular;
  80913. + BOOLEAN bStartContTx = _FALSE, bSingleTone = _FALSE, bCarrierSuppression = _FALSE;
  80914. + u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
  80915. + rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance,
  80916. + rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable,
  80917. + rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance,
  80918. + rOFDM0_XCTxAFE, rOFDM0_XDTxAFE,
  80919. + rOFDM0_RxIQExtAnta};
  80920. +
  80921. +
  80922. +#if MP_DRIVER == 1
  80923. + bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
  80924. + bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
  80925. + bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
  80926. +#endif
  80927. +
  80928. + //ignore IQK when continuous Tx
  80929. + if(bStartContTx || bSingleTone || bCarrierSuppression)
  80930. + return;
  80931. +
  80932. +#if DISABLE_BB_RF
  80933. + return;
  80934. +#endif
  80935. +
  80936. + if(bReCovery)
  80937. + {
  80938. + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
  80939. + return;
  80940. + }
  80941. + DBG_8192C("IQK:Start!!!\n");
  80942. +
  80943. + for(i = 0; i < 8; i++)
  80944. + {
  80945. + result[0][i] = 0;
  80946. + result[1][i] = 0;
  80947. + result[2][i] = 0;
  80948. + result[3][i] = 0;
  80949. + }
  80950. + final_candidate = 0xff;
  80951. + bPathAOK = _FALSE;
  80952. + bPathBOK = _FALSE;
  80953. + is12simular = _FALSE;
  80954. + is23simular = _FALSE;
  80955. + is13simular = _FALSE;
  80956. +
  80957. + for (i=0; i<3; i++)
  80958. + {
  80959. + if(IS_92C_SERIAL( pHalData->VersionID)){
  80960. + _PHY_IQCalibrate(pAdapter, result, i, _TRUE);
  80961. + }
  80962. + else{
  80963. + // For 88C 1T1R
  80964. + _PHY_IQCalibrate(pAdapter, result, i, _FALSE);
  80965. + }
  80966. +
  80967. + if(i == 1)
  80968. + {
  80969. + is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1);
  80970. + if(is12simular)
  80971. + {
  80972. + final_candidate = 0;
  80973. + break;
  80974. + }
  80975. + }
  80976. +
  80977. + if(i == 2)
  80978. + {
  80979. + is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2);
  80980. + if(is13simular)
  80981. + {
  80982. + final_candidate = 0;
  80983. + break;
  80984. + }
  80985. +
  80986. + is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2);
  80987. + if(is23simular)
  80988. + final_candidate = 1;
  80989. + else
  80990. + {
  80991. + for(i = 0; i < 8; i++)
  80992. + RegTmp += result[3][i];
  80993. +
  80994. + if(RegTmp != 0)
  80995. + final_candidate = 3;
  80996. + else
  80997. + final_candidate = 0xFF;
  80998. + }
  80999. + }
  81000. + }
  81001. +
  81002. + for (i=0; i<4; i++)
  81003. + {
  81004. + RegE94 = result[i][0];
  81005. + RegE9C = result[i][1];
  81006. + RegEA4 = result[i][2];
  81007. + RegEAC = result[i][3];
  81008. + RegEB4 = result[i][4];
  81009. + RegEBC = result[i][5];
  81010. + RegEC4 = result[i][6];
  81011. + RegECC = result[i][7];
  81012. + //RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%lx RegE9C=%lx RegEA4=%lx RegEAC=%lx RegEB4=%lx RegEBC=%lx RegEC4=%lx RegECC=%lx\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));
  81013. + }
  81014. +
  81015. + if(final_candidate != 0xff)
  81016. + {
  81017. + pdmpriv->RegE94 = RegE94 = result[final_candidate][0];
  81018. + pdmpriv->RegE9C = RegE9C = result[final_candidate][1];
  81019. + RegEA4 = result[final_candidate][2];
  81020. + RegEAC = result[final_candidate][3];
  81021. + pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4];
  81022. + pdmpriv->RegEBC = RegEBC = result[final_candidate][5];
  81023. + RegEC4 = result[final_candidate][6];
  81024. + RegECC = result[final_candidate][7];
  81025. + DBG_8192C("IQK: final_candidate is %x\n", final_candidate);
  81026. + DBG_8192C("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC);
  81027. + bPathAOK = bPathBOK = _TRUE;
  81028. + }
  81029. + else
  81030. + {
  81031. + RegE94 = RegEB4 = pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value
  81032. + RegE9C = RegEBC = pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value
  81033. + }
  81034. +
  81035. + if((RegE94 != 0)/*&&(RegEA4 != 0)*/)
  81036. + _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));
  81037. +
  81038. + if(IS_92C_SERIAL( pHalData->VersionID)){
  81039. + if((RegEB4 != 0)/*&&(RegEC4 != 0)*/)
  81040. + _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));
  81041. + }
  81042. +
  81043. + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
  81044. +
  81045. +}
  81046. +
  81047. +
  81048. +VOID
  81049. +rtl8192c_PHY_LCCalibrate(
  81050. + IN PADAPTER pAdapter
  81051. + )
  81052. +{
  81053. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  81054. + struct mlme_ext_priv *pmlmeext = &pAdapter->mlmeextpriv;
  81055. + BOOLEAN bStartContTx = _FALSE, bSingleTone = _FALSE, bCarrierSuppression = _FALSE;
  81056. +
  81057. +#if MP_DRIVER == 1
  81058. + bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
  81059. + bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
  81060. + bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
  81061. +#endif
  81062. +
  81063. +#if DISABLE_BB_RF
  81064. + return;
  81065. +#endif
  81066. +
  81067. + //ignore IQK when continuous Tx
  81068. + if(bStartContTx || bSingleTone || bCarrierSuppression)
  81069. + return;
  81070. +
  81071. + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
  81072. + return;
  81073. +
  81074. + if(IS_92C_SERIAL( pHalData->VersionID)){
  81075. + _PHY_LCCalibrate(pAdapter, _TRUE);
  81076. + }
  81077. + else{
  81078. + // For 88C 1T1R
  81079. + _PHY_LCCalibrate(pAdapter, _FALSE);
  81080. + }
  81081. +}
  81082. +
  81083. +VOID
  81084. +rtl8192c_PHY_APCalibrate(
  81085. + IN PADAPTER pAdapter,
  81086. + IN char delta
  81087. + )
  81088. +{
  81089. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  81090. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  81091. +
  81092. + //default disable APK, because Tx NG issue, suggest by Jenyu, 2011.11.25
  81093. + return;
  81094. +
  81095. +#if DISABLE_BB_RF
  81096. + return;
  81097. +#endif
  81098. +
  81099. + if(pdmpriv->bAPKdone)
  81100. + return;
  81101. +
  81102. + if(IS_92C_SERIAL( pHalData->VersionID)){
  81103. + _PHY_APCalibrate(pAdapter, delta, _TRUE);
  81104. + }
  81105. + else{
  81106. + // For 88C 1T1R
  81107. + _PHY_APCalibrate(pAdapter, delta, _FALSE);
  81108. + }
  81109. +}
  81110. +
  81111. +VOID rtl8192c_PHY_SetRFPathSwitch(
  81112. + IN PADAPTER pAdapter,
  81113. + IN BOOLEAN bMain
  81114. + )
  81115. +{
  81116. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  81117. +
  81118. +#if DISABLE_BB_RF
  81119. + return;
  81120. +#endif
  81121. +
  81122. + if(IS_92C_SERIAL( pHalData->VersionID)){
  81123. + _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE);
  81124. + }
  81125. + else{
  81126. + // For 88C 1T1R
  81127. + _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE);
  81128. + }
  81129. +}
  81130. --- /dev/null
  81131. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c
  81132. @@ -0,0 +1,1030 @@
  81133. +/******************************************************************************
  81134. + *
  81135. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  81136. + *
  81137. + * This program is free software; you can redistribute it and/or modify it
  81138. + * under the terms of version 2 of the GNU General Public License as
  81139. + * published by the Free Software Foundation.
  81140. + *
  81141. + * This program is distributed in the hope that it will be useful, but WITHOUT
  81142. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  81143. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  81144. + * more details.
  81145. + *
  81146. + * You should have received a copy of the GNU General Public License along with
  81147. + * this program; if not, write to the Free Software Foundation, Inc.,
  81148. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  81149. + *
  81150. + *
  81151. + ******************************************************************************/
  81152. +/******************************************************************************
  81153. + *
  81154. + *
  81155. + * Module: rtl8192c_rf6052.c ( Source C File)
  81156. + *
  81157. + * Note: Provide RF 6052 series relative API.
  81158. + *
  81159. + * Function:
  81160. + *
  81161. + * Export:
  81162. + *
  81163. + * Abbrev:
  81164. + *
  81165. + * History:
  81166. + * Data Who Remark
  81167. + *
  81168. + * 09/25/2008 MHC Create initial version.
  81169. + * 11/05/2008 MHC Add API for tw power setting.
  81170. + *
  81171. + *
  81172. +******************************************************************************/
  81173. +
  81174. +#define _RTL8192C_RF6052_C_
  81175. +
  81176. +#include <drv_conf.h>
  81177. +#include <osdep_service.h>
  81178. +#include <drv_types.h>
  81179. +#include <rtw_byteorder.h>
  81180. +
  81181. +#include <rtl8192c_hal.h>
  81182. +
  81183. +/*---------------------------Define Local Constant---------------------------*/
  81184. +// Define local structure for debug!!!!!
  81185. +typedef struct RF_Shadow_Compare_Map {
  81186. + // Shadow register value
  81187. + u32 Value;
  81188. + // Compare or not flag
  81189. + u8 Compare;
  81190. + // Record If it had ever modified unpredicted
  81191. + u8 ErrorOrNot;
  81192. + // Recorver Flag
  81193. + u8 Recorver;
  81194. + //
  81195. + u8 Driver_Write;
  81196. +}RF_SHADOW_T;
  81197. +/*---------------------------Define Local Constant---------------------------*/
  81198. +
  81199. +
  81200. +/*------------------------Define global variable-----------------------------*/
  81201. +/*------------------------Define global variable-----------------------------*/
  81202. +
  81203. +
  81204. +/*------------------------Define local variable------------------------------*/
  81205. +// 2008/11/20 MH For Debug only, RF
  81206. +//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0};
  81207. +static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
  81208. +/*------------------------Define local variable------------------------------*/
  81209. +
  81210. +
  81211. +/*-----------------------------------------------------------------------------
  81212. + * Function: RF_ChangeTxPath
  81213. + *
  81214. + * Overview: For RL6052, we must change some RF settign for 1T or 2T.
  81215. + *
  81216. + * Input: u2Byte DataRate // 0x80-8f, 0x90-9f
  81217. + *
  81218. + * Output: NONE
  81219. + *
  81220. + * Return: NONE
  81221. + *
  81222. + * Revised History:
  81223. + * When Who Remark
  81224. + * 09/25/2008 MHC Create Version 0.
  81225. + * Firmwaer support the utility later.
  81226. + *
  81227. + *---------------------------------------------------------------------------*/
  81228. +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter,
  81229. + IN u16 DataRate)
  81230. +{
  81231. +// We do not support gain table change inACUT now !!!! Delete later !!!
  81232. +#if 0//(RTL92SE_FPGA_VERIFY == 0)
  81233. + static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T
  81234. + static u4Byte tx_gain_tbl1[6]
  81235. + = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100};
  81236. + static u4Byte tx_gain_tbl2[6]
  81237. + = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030};
  81238. + u1Byte i;
  81239. +
  81240. + if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7)
  81241. + {
  81242. + // Set TX SYNC power G2G3 loop filter
  81243. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81244. + RF_TXPA_G2, bRFRegOffsetMask, 0x0f000);
  81245. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81246. + RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1);
  81247. +
  81248. + // Change TX AGC gain table
  81249. + for (i = 0; i < 6; i++)
  81250. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81251. + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]);
  81252. +
  81253. + // Set PA to high value
  81254. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81255. + RF_TXPA_G2, bRFRegOffsetMask, 0x01e39);
  81256. + }
  81257. + else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8)
  81258. + {
  81259. + // Set TX SYNC power G2G3 loop filter
  81260. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81261. + RF_TXPA_G2, bRFRegOffsetMask, 0x04440);
  81262. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81263. + RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1);
  81264. +
  81265. + // Change TX AGC gain table
  81266. + for (i = 0; i < 6; i++)
  81267. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81268. + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]);
  81269. +
  81270. + // Set PA low gain
  81271. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A,
  81272. + RF_TXPA_G2, bRFRegOffsetMask, 0x01e19);
  81273. + }
  81274. +#endif
  81275. +
  81276. +} /* RF_ChangeTxPath */
  81277. +
  81278. +
  81279. +/*-----------------------------------------------------------------------------
  81280. + * Function: PHY_RF6052SetBandwidth()
  81281. + *
  81282. + * Overview: This function is called by SetBWModeCallback8190Pci() only
  81283. + *
  81284. + * Input: PADAPTER Adapter
  81285. + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M
  81286. + *
  81287. + * Output: NONE
  81288. + *
  81289. + * Return: NONE
  81290. + *
  81291. + * Note: For RF type 0222D
  81292. + *---------------------------------------------------------------------------*/
  81293. +VOID
  81294. +rtl8192c_PHY_RF6052SetBandwidth(
  81295. + IN PADAPTER Adapter,
  81296. + IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M
  81297. +{
  81298. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81299. +
  81300. + switch(Bandwidth)
  81301. + {
  81302. + case HT_CHANNEL_WIDTH_20:
  81303. + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400);
  81304. + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
  81305. + break;
  81306. +
  81307. + case HT_CHANNEL_WIDTH_40:
  81308. + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff));
  81309. + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]);
  81310. + break;
  81311. +
  81312. + default:
  81313. + //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth ));
  81314. + break;
  81315. + }
  81316. +
  81317. +}
  81318. +
  81319. +
  81320. +/*-----------------------------------------------------------------------------
  81321. + * Function: PHY_RF6052SetCckTxPower
  81322. + *
  81323. + * Overview:
  81324. + *
  81325. + * Input: NONE
  81326. + *
  81327. + * Output: NONE
  81328. + *
  81329. + * Return: NONE
  81330. + *
  81331. + * Revised History:
  81332. + * When Who Remark
  81333. + * 11/05/2008 MHC Simulate 8192series..
  81334. + *
  81335. + *---------------------------------------------------------------------------*/
  81336. +
  81337. +VOID
  81338. +rtl8192c_PHY_RF6052SetCckTxPower(
  81339. + IN PADAPTER Adapter,
  81340. + IN u8* pPowerlevel)
  81341. +{
  81342. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81343. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  81344. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  81345. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  81346. + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo;
  81347. + u32 TxAGC[2]={0, 0}, tmpval=0;
  81348. + BOOLEAN TurboScanOff = _FALSE;
  81349. + u8 idx1, idx2;
  81350. + u8* ptr;
  81351. +
  81352. + // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU.
  81353. + // Otherwise, external PA will be broken if power index > 0x20.
  81354. +#ifdef CONFIG_USB_HCI
  81355. + if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA)
  81356. +#else
  81357. + if (pHalData->EEPROMRegulatory != 0)
  81358. +#endif
  81359. + {
  81360. + //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA);
  81361. + TurboScanOff = _TRUE;
  81362. + }
  81363. +
  81364. + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
  81365. + {
  81366. + TxAGC[RF_PATH_A] = 0x3f3f3f3f;
  81367. + TxAGC[RF_PATH_B] = 0x3f3f3f3f;
  81368. +
  81369. + TurboScanOff = _TRUE;//disable turbo scan
  81370. +
  81371. + if(TurboScanOff)
  81372. + {
  81373. + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++)
  81374. + {
  81375. + TxAGC[idx1] =
  81376. + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) |
  81377. + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24);
  81378. +#ifdef CONFIG_USB_HCI
  81379. + // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20.
  81380. + if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA)
  81381. + TxAGC[idx1] = 0x20;
  81382. +#endif
  81383. + }
  81384. + }
  81385. + }
  81386. + else
  81387. + {
  81388. +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism.
  81389. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism.
  81390. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder.
  81391. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
  81392. + {
  81393. + TxAGC[RF_PATH_A] = 0x10101010;
  81394. + TxAGC[RF_PATH_B] = 0x10101010;
  81395. + }
  81396. + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
  81397. + {
  81398. + TxAGC[RF_PATH_A] = 0x00000000;
  81399. + TxAGC[RF_PATH_B] = 0x00000000;
  81400. + }
  81401. + else
  81402. + {
  81403. + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++)
  81404. + {
  81405. + TxAGC[idx1] =
  81406. + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) |
  81407. + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24);
  81408. + }
  81409. +
  81410. + if(pHalData->EEPROMRegulatory==0)
  81411. + {
  81412. + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) +
  81413. + (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8);
  81414. + TxAGC[RF_PATH_A] += tmpval;
  81415. +
  81416. + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) +
  81417. + (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24);
  81418. + TxAGC[RF_PATH_B] += tmpval;
  81419. + }
  81420. + }
  81421. + }
  81422. +
  81423. + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++)
  81424. + {
  81425. + ptr = (u8*)(&(TxAGC[idx1]));
  81426. + for(idx2=0; idx2<4; idx2++)
  81427. + {
  81428. + if(*ptr > RF6052_MAX_TX_PWR)
  81429. + *ptr = RF6052_MAX_TX_PWR;
  81430. + ptr++;
  81431. + }
  81432. + }
  81433. +
  81434. + // rf-A cck tx power
  81435. + tmpval = TxAGC[RF_PATH_A]&0xff;
  81436. + PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval);
  81437. + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32));
  81438. + tmpval = TxAGC[RF_PATH_A]>>8;
  81439. + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
  81440. + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11));
  81441. +
  81442. + // rf-B cck tx power
  81443. + tmpval = TxAGC[RF_PATH_B]>>24;
  81444. + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval);
  81445. + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11));
  81446. + tmpval = TxAGC[RF_PATH_B]&0x00ffffff;
  81447. + PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);
  81448. + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",
  81449. + // tmpval, rTxAGC_B_CCK1_55_Mcs32));
  81450. +
  81451. +} /* PHY_RF6052SetCckTxPower */
  81452. +
  81453. +//
  81454. +// powerbase0 for OFDM rates
  81455. +// powerbase1 for HT MCS rates
  81456. +//
  81457. +static void getPowerBase(
  81458. + IN PADAPTER Adapter,
  81459. + IN u8* pPowerLevel,
  81460. + IN u8 Channel,
  81461. + IN OUT u32* OfdmBase,
  81462. + IN OUT u32* MCSBase
  81463. + )
  81464. +{
  81465. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81466. + u32 powerBase0, powerBase1;
  81467. + u8 Legacy_pwrdiff=0;
  81468. + s8 HT20_pwrdiff=0;
  81469. + u8 i, powerlevel[2];
  81470. +
  81471. + for(i=0; i<2; i++)
  81472. + {
  81473. + powerlevel[i] = pPowerLevel[i];
  81474. + Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1];
  81475. + powerBase0 = powerlevel[i] + Legacy_pwrdiff;
  81476. +
  81477. + powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
  81478. + *(OfdmBase+i) = powerBase0;
  81479. + //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i)));
  81480. + }
  81481. +
  81482. + for(i=0; i<2; i++)
  81483. + {
  81484. + //Check HT20 to HT40 diff
  81485. + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
  81486. + {
  81487. + HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1];
  81488. + powerlevel[i] += HT20_pwrdiff;
  81489. + }
  81490. + powerBase1 = powerlevel[i];
  81491. + powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
  81492. + *(MCSBase+i) = powerBase1;
  81493. + //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i)));
  81494. + }
  81495. +}
  81496. +
  81497. +static void getTxPowerWriteValByRegulatory(
  81498. + IN PADAPTER Adapter,
  81499. + IN u8 Channel,
  81500. + IN u8 index,
  81501. + IN u32* powerBase0,
  81502. + IN u32* powerBase1,
  81503. + OUT u32* pOutWriteVal
  81504. + )
  81505. +{
  81506. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81507. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  81508. + u8 i, chnlGroup, pwr_diff_limit[4];
  81509. + u32 writeVal, customer_limit, rf;
  81510. +
  81511. + //
  81512. + // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate
  81513. + //
  81514. + for(rf=0; rf<2; rf++)
  81515. + {
  81516. + switch(pHalData->EEPROMRegulatory)
  81517. + {
  81518. + case 0: // Realtek better performance
  81519. + // increase power diff defined by Realtek for large power
  81520. + chnlGroup = 0;
  81521. + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
  81522. + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]));
  81523. + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] +
  81524. + ((index<2)?powerBase0[rf]:powerBase1[rf]);
  81525. + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal));
  81526. + break;
  81527. + case 1: // Realtek regulatory
  81528. + // increase power diff defined by Realtek for regulatory
  81529. + {
  81530. + if(pHalData->pwrGroupCnt == 1)
  81531. + chnlGroup = 0;
  81532. + if(pHalData->pwrGroupCnt >= 3)
  81533. + {
  81534. + if(Channel <= 3)
  81535. + chnlGroup = 0;
  81536. + else if(Channel >= 4 && Channel <= 9)
  81537. + chnlGroup = 1;
  81538. + else if(Channel > 9)
  81539. + chnlGroup = 2;
  81540. +
  81541. + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
  81542. + chnlGroup++;
  81543. + else
  81544. + chnlGroup+=4;
  81545. + }
  81546. + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
  81547. + //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]));
  81548. + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] +
  81549. + ((index<2)?powerBase0[rf]:powerBase1[rf]);
  81550. + //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal));
  81551. + }
  81552. + break;
  81553. + case 2: // Better regulatory
  81554. + // don't increase any power diff
  81555. + writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]);
  81556. + //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal));
  81557. + break;
  81558. + case 3: // Customer defined power diff.
  81559. + // increase power diff defined by customer.
  81560. + chnlGroup = 0;
  81561. + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
  81562. + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]));
  81563. +
  81564. + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40)
  81565. + {
  81566. + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n",
  81567. + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1]));
  81568. + }
  81569. + else
  81570. + {
  81571. + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n",
  81572. + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1]));
  81573. + }
  81574. + for (i=0; i<4; i++)
  81575. + {
  81576. + pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8));
  81577. + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40)
  81578. + {
  81579. + if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1])
  81580. + pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1];
  81581. + }
  81582. + else
  81583. + {
  81584. + if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1])
  81585. + pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1];
  81586. + }
  81587. + }
  81588. + customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) |
  81589. + (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]);
  81590. + //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit));
  81591. +
  81592. + writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]);
  81593. + //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal));
  81594. + break;
  81595. + default:
  81596. + chnlGroup = 0;
  81597. + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] +
  81598. + ((index<2)?powerBase0[rf]:powerBase1[rf]);
  81599. + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal));
  81600. + break;
  81601. + }
  81602. +
  81603. +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism.
  81604. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism.
  81605. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder.
  81606. +
  81607. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
  81608. + writeVal = 0x14141414;
  81609. + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
  81610. + writeVal = 0x00000000;
  81611. +
  81612. +
  81613. + // 20100628 Joseph: High power mode for BT-Coexist mechanism.
  81614. + // This mechanism is only applied when Driver-Highpower-Mechanism is OFF.
  81615. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1)
  81616. + {
  81617. + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n"));
  81618. + writeVal = writeVal - 0x06060606;
  81619. + }
  81620. + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2)
  81621. + {
  81622. + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n"));
  81623. + writeVal = writeVal;
  81624. + }
  81625. + *(pOutWriteVal+rf) = writeVal;
  81626. + }
  81627. +}
  81628. +
  81629. +static void writeOFDMPowerReg(
  81630. + IN PADAPTER Adapter,
  81631. + IN u8 index,
  81632. + IN u32* pValue
  81633. + )
  81634. +{
  81635. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81636. + u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24,
  81637. + rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04,
  81638. + rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12};
  81639. + u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24,
  81640. + rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04,
  81641. + rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12};
  81642. + u8 i, rf, pwr_val[4];
  81643. + u32 writeVal;
  81644. + u16 RegOffset;
  81645. +
  81646. + for(rf=0; rf<2; rf++)
  81647. + {
  81648. + writeVal = pValue[rf];
  81649. + for(i=0; i<4; i++)
  81650. + {
  81651. + pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
  81652. + if (pwr_val[i] > RF6052_MAX_TX_PWR)
  81653. + pwr_val[i] = RF6052_MAX_TX_PWR;
  81654. + }
  81655. + writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0];
  81656. +
  81657. + if(rf == 0)
  81658. + RegOffset = RegOffset_A[index];
  81659. + else
  81660. + RegOffset = RegOffset_B[index];
  81661. +
  81662. + PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal);
  81663. + //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal));
  81664. +
  81665. + // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism.
  81666. + if(((pHalData->rf_type == RF_2T2R) &&
  81667. + (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))||
  81668. + ((pHalData->rf_type != RF_2T2R) &&
  81669. + (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) )
  81670. + {
  81671. + writeVal = pwr_val[3];
  81672. + if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04)
  81673. + RegOffset = 0xc90;
  81674. + if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04)
  81675. + RegOffset = 0xc98;
  81676. + for(i=0; i<3; i++)
  81677. + {
  81678. + if(i!=2)
  81679. + writeVal = (writeVal>8)?(writeVal-8):0;
  81680. + else
  81681. + writeVal = (writeVal>6)?(writeVal-6):0;
  81682. + rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal);
  81683. + }
  81684. + }
  81685. + }
  81686. +}
  81687. +/*-----------------------------------------------------------------------------
  81688. + * Function: PHY_RF6052SetOFDMTxPower
  81689. + *
  81690. + * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for
  81691. + * different channel and read original value in TX power register area from
  81692. + * 0xe00. We increase offset and original value to be correct tx pwr.
  81693. + *
  81694. + * Input: NONE
  81695. + *
  81696. + * Output: NONE
  81697. + *
  81698. + * Return: NONE
  81699. + *
  81700. + * Revised History:
  81701. + * When Who Remark
  81702. + * 11/05/2008 MHC Simulate 8192 series method.
  81703. + * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to
  81704. + * A/B pwr difference or legacy/HT pwr diff.
  81705. + * 2. We concern with path B legacy/HT OFDM difference.
  81706. + * 01/22/2009 MHC Support new EPRO format from SD3.
  81707. + *
  81708. + *---------------------------------------------------------------------------*/
  81709. +VOID
  81710. +rtl8192c_PHY_RF6052SetOFDMTxPower(
  81711. + IN PADAPTER Adapter,
  81712. + IN u8* pPowerLevel,
  81713. + IN u8 Channel)
  81714. +{
  81715. + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81716. + u32 writeVal[2], powerBase0[2], powerBase1[2];
  81717. + u8 index = 0;
  81718. +
  81719. + getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]);
  81720. +
  81721. + for(index=0; index<6; index++)
  81722. + {
  81723. + getTxPowerWriteValByRegulatory(Adapter, Channel, index,
  81724. + &powerBase0[0], &powerBase1[0], &writeVal[0]);
  81725. +
  81726. + writeOFDMPowerReg(Adapter, index, &writeVal[0]);
  81727. + }
  81728. +
  81729. +}
  81730. +
  81731. +
  81732. +static VOID
  81733. +phy_RF6052_Config_HardCode(
  81734. + IN PADAPTER Adapter
  81735. + )
  81736. +{
  81737. +
  81738. + // Set Default Bandwidth to 20M
  81739. + //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20);
  81740. +
  81741. + // TODO: Set Default Channel to channel one for RTL8225
  81742. +
  81743. +}
  81744. +
  81745. +static int
  81746. +phy_RF6052_Config_ParaFile(
  81747. + IN PADAPTER Adapter
  81748. + )
  81749. +{
  81750. + u32 u4RegValue;
  81751. + u8 eRFPath;
  81752. + BB_REGISTER_DEFINITION_T *pPhyReg;
  81753. +
  81754. + int rtStatus = _SUCCESS;
  81755. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81756. + static char sz88CRadioAFile[] = RTL8188C_PHY_RADIO_A;
  81757. + static char sz88CRadioBFile[] = RTL8188C_PHY_RADIO_B;
  81758. +#ifdef CONFIG_USB_HCI
  81759. + static char sz88CRadioAFile_mCard[] = RTL8188C_PHY_RADIO_A_mCard;
  81760. + static char sz88CRadioBFile_mCard[] = RTL8188C_PHY_RADIO_B_mCard;
  81761. + static char sz88CRadioAFile_HP[] = RTL8188C_PHY_RADIO_A_HP;
  81762. +#endif
  81763. + static char sz92CRadioAFile[] = RTL8192C_PHY_RADIO_A;
  81764. + static char sz92CRadioBFile[] = RTL8192C_PHY_RADIO_B;
  81765. + static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A;
  81766. + static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B;
  81767. + char *pszRadioAFile, *pszRadioBFile;
  81768. +
  81769. +
  81770. + if(IS_HARDWARE_TYPE_8192C(Adapter))
  81771. + {
  81772. + if(IS_92C_SERIAL( pHalData->VersionID))// 88c's IPA is different from 92c's
  81773. + {
  81774. + pszRadioAFile = sz92CRadioAFile;
  81775. + pszRadioBFile = sz92CRadioBFile;
  81776. + }
  81777. + else
  81778. + {
  81779. + pszRadioAFile = sz88CRadioAFile;
  81780. + pszRadioBFile = sz88CRadioBFile;
  81781. +#ifdef CONFIG_USB_HCI
  81782. + if( BOARD_MINICARD == pHalData->BoardType)
  81783. + {
  81784. + pszRadioAFile = sz88CRadioAFile_mCard;
  81785. + pszRadioBFile = sz88CRadioBFile_mCard;
  81786. + }
  81787. + else if( BOARD_USB_High_PA == pHalData->BoardType)
  81788. + {
  81789. + pszRadioAFile = sz88CRadioAFile_HP;
  81790. + }
  81791. +#endif
  81792. + }
  81793. + }
  81794. + else if(IS_HARDWARE_TYPE_8723A(Adapter))
  81795. + {
  81796. + pszRadioAFile = sz8723RadioAFile;
  81797. + pszRadioBFile = sz8723RadioBFile;
  81798. + }
  81799. +
  81800. + //3//-----------------------------------------------------------------
  81801. + //3// <2> Initialize RF
  81802. + //3//-----------------------------------------------------------------
  81803. + //for(eRFPath = RF_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  81804. + for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  81805. + {
  81806. +
  81807. + pPhyReg = &pHalData->PHYRegDef[eRFPath];
  81808. +
  81809. + /*----Store original RFENV control type----*/
  81810. + switch(eRFPath)
  81811. + {
  81812. + case RF_PATH_A:
  81813. + case RF_PATH_C:
  81814. + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV);
  81815. + break;
  81816. + case RF_PATH_B :
  81817. + case RF_PATH_D:
  81818. + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16);
  81819. + break;
  81820. + }
  81821. +
  81822. + /*----Set RF_ENV enable----*/
  81823. + PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
  81824. + rtw_udelay_os(1);//PlatformStallExecution(1);
  81825. +
  81826. + /*----Set RF_ENV output high----*/
  81827. + PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
  81828. + rtw_udelay_os(1);//PlatformStallExecution(1);
  81829. +
  81830. + /* Set bit number of Address and Data for RF register */
  81831. + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255
  81832. + rtw_udelay_os(1);//PlatformStallExecution(1);
  81833. +
  81834. + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255
  81835. + rtw_udelay_os(1);//PlatformStallExecution(1);
  81836. +
  81837. + /*----Initialize RF fom connfiguration file----*/
  81838. + switch(eRFPath)
  81839. + {
  81840. + case RF_PATH_A:
  81841. +#ifdef CONFIG_EMBEDDED_FWIMG
  81842. + rtStatus= rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath);
  81843. +#else
  81844. + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF_RADIO_PATH_E)eRFPath);
  81845. +#endif
  81846. + break;
  81847. + case RF_PATH_B:
  81848. +#ifdef CONFIG_EMBEDDED_FWIMG
  81849. + rtStatus = rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath);
  81850. +#else
  81851. + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF_RADIO_PATH_E)eRFPath);
  81852. +#endif
  81853. + break;
  81854. + case RF_PATH_C:
  81855. + break;
  81856. + case RF_PATH_D:
  81857. + break;
  81858. + }
  81859. +
  81860. + /*----Restore RFENV control type----*/;
  81861. + switch(eRFPath)
  81862. + {
  81863. + case RF_PATH_A:
  81864. + case RF_PATH_C:
  81865. + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
  81866. + break;
  81867. + case RF_PATH_B :
  81868. + case RF_PATH_D:
  81869. + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
  81870. + break;
  81871. + }
  81872. +
  81873. + if(rtStatus != _SUCCESS){
  81874. + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath));
  81875. + goto phy_RF6052_Config_ParaFile_Fail;
  81876. + }
  81877. +
  81878. + }
  81879. +
  81880. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n"));
  81881. + return rtStatus;
  81882. +
  81883. +phy_RF6052_Config_ParaFile_Fail:
  81884. + return rtStatus;
  81885. +}
  81886. +
  81887. +
  81888. +int
  81889. +PHY_RF6052_Config8192C(
  81890. + IN PADAPTER Adapter)
  81891. +{
  81892. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  81893. + int rtStatus = _SUCCESS;
  81894. +
  81895. + //
  81896. + // Initialize general global value
  81897. + //
  81898. + // TODO: Extend RF_PATH_C and RF_PATH_D in the future
  81899. + if(pHalData->rf_type == RF_1T1R)
  81900. + pHalData->NumTotalRFPath = 1;
  81901. + else
  81902. + pHalData->NumTotalRFPath = 2;
  81903. +
  81904. + //
  81905. + // Config BB and RF
  81906. + //
  81907. + rtStatus = phy_RF6052_Config_ParaFile(Adapter);
  81908. +#if 0
  81909. + switch( Adapter->MgntInfo.bRegHwParaFile )
  81910. + {
  81911. + case 0:
  81912. + phy_RF6052_Config_HardCode(Adapter);
  81913. + break;
  81914. +
  81915. + case 1:
  81916. + rtStatus = phy_RF6052_Config_ParaFile(Adapter);
  81917. + break;
  81918. +
  81919. + case 2:
  81920. + // Partial Modify.
  81921. + phy_RF6052_Config_HardCode(Adapter);
  81922. + phy_RF6052_Config_ParaFile(Adapter);
  81923. + break;
  81924. +
  81925. + default:
  81926. + phy_RF6052_Config_HardCode(Adapter);
  81927. + break;
  81928. + }
  81929. +#endif
  81930. + return rtStatus;
  81931. +
  81932. +}
  81933. +
  81934. +
  81935. +//
  81936. +// ==> RF shadow Operation API Code Section!!!
  81937. +//
  81938. +/*-----------------------------------------------------------------------------
  81939. + * Function: PHY_RFShadowRead
  81940. + * PHY_RFShadowWrite
  81941. + * PHY_RFShadowCompare
  81942. + * PHY_RFShadowRecorver
  81943. + * PHY_RFShadowCompareAll
  81944. + * PHY_RFShadowRecorverAll
  81945. + * PHY_RFShadowCompareFlagSet
  81946. + * PHY_RFShadowRecorverFlagSet
  81947. + *
  81948. + * Overview: When we set RF register, we must write shadow at first.
  81949. + * When we are running, we must compare shadow abd locate error addr.
  81950. + * Decide to recorver or not.
  81951. + *
  81952. + * Input: NONE
  81953. + *
  81954. + * Output: NONE
  81955. + *
  81956. + * Return: NONE
  81957. + *
  81958. + * Revised History:
  81959. + * When Who Remark
  81960. + * 11/20/2008 MHC Create Version 0.
  81961. + *
  81962. + *---------------------------------------------------------------------------*/
  81963. +u32
  81964. +PHY_RFShadowRead(
  81965. + IN PADAPTER Adapter,
  81966. + IN RF_RADIO_PATH_E eRFPath,
  81967. + IN u32 Offset)
  81968. +{
  81969. + return RF_Shadow[eRFPath][Offset].Value;
  81970. +
  81971. +} /* PHY_RFShadowRead */
  81972. +
  81973. +
  81974. +VOID
  81975. +PHY_RFShadowWrite(
  81976. + IN PADAPTER Adapter,
  81977. + IN RF_RADIO_PATH_E eRFPath,
  81978. + IN u32 Offset,
  81979. + IN u32 Data)
  81980. +{
  81981. + RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
  81982. + RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE;
  81983. +
  81984. +} /* PHY_RFShadowWrite */
  81985. +
  81986. +
  81987. +BOOLEAN
  81988. +PHY_RFShadowCompare(
  81989. + IN PADAPTER Adapter,
  81990. + IN RF_RADIO_PATH_E eRFPath,
  81991. + IN u32 Offset)
  81992. +{
  81993. + u32 reg;
  81994. + // Check if we need to check the register
  81995. + if (RF_Shadow[eRFPath][Offset].Compare == _TRUE)
  81996. + {
  81997. + reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask);
  81998. + // Compare shadow and real rf register for 20bits!!
  81999. + if (RF_Shadow[eRFPath][Offset].Value != reg)
  82000. + {
  82001. + // Locate error position.
  82002. + RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE;
  82003. + //RT_TRACE(COMP_INIT, DBG_LOUD,
  82004. + //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n",
  82005. + //eRFPath, Offset, reg));
  82006. + }
  82007. + return RF_Shadow[eRFPath][Offset].ErrorOrNot ;
  82008. + }
  82009. + return _FALSE;
  82010. +} /* PHY_RFShadowCompare */
  82011. +
  82012. +
  82013. +VOID
  82014. +PHY_RFShadowRecorver(
  82015. + IN PADAPTER Adapter,
  82016. + IN RF_RADIO_PATH_E eRFPath,
  82017. + IN u32 Offset)
  82018. +{
  82019. + // Check if the address is error
  82020. + if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE)
  82021. + {
  82022. + // Check if we need to recorver the register.
  82023. + if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE)
  82024. + {
  82025. + PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask,
  82026. + RF_Shadow[eRFPath][Offset].Value);
  82027. + //RT_TRACE(COMP_INIT, DBG_LOUD,
  82028. + //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx",
  82029. + //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value));
  82030. + }
  82031. + }
  82032. +
  82033. +} /* PHY_RFShadowRecorver */
  82034. +
  82035. +
  82036. +VOID
  82037. +PHY_RFShadowCompareAll(
  82038. + IN PADAPTER Adapter)
  82039. +{
  82040. + u32 eRFPath;
  82041. + u32 Offset;
  82042. +
  82043. + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
  82044. + {
  82045. + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
  82046. + {
  82047. + PHY_RFShadowCompare(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset);
  82048. + }
  82049. + }
  82050. +
  82051. +} /* PHY_RFShadowCompareAll */
  82052. +
  82053. +
  82054. +VOID
  82055. +PHY_RFShadowRecorverAll(
  82056. + IN PADAPTER Adapter)
  82057. +{
  82058. + u32 eRFPath;
  82059. + u32 Offset;
  82060. +
  82061. + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
  82062. + {
  82063. + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
  82064. + {
  82065. + PHY_RFShadowRecorver(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset);
  82066. + }
  82067. + }
  82068. +
  82069. +} /* PHY_RFShadowRecorverAll */
  82070. +
  82071. +
  82072. +VOID
  82073. +PHY_RFShadowCompareFlagSet(
  82074. + IN PADAPTER Adapter,
  82075. + IN RF_RADIO_PATH_E eRFPath,
  82076. + IN u32 Offset,
  82077. + IN u8 Type)
  82078. +{
  82079. + // Set True or False!!!
  82080. + RF_Shadow[eRFPath][Offset].Compare = Type;
  82081. +
  82082. +} /* PHY_RFShadowCompareFlagSet */
  82083. +
  82084. +
  82085. +VOID
  82086. +PHY_RFShadowRecorverFlagSet(
  82087. + IN PADAPTER Adapter,
  82088. + IN RF_RADIO_PATH_E eRFPath,
  82089. + IN u32 Offset,
  82090. + IN u8 Type)
  82091. +{
  82092. + // Set True or False!!!
  82093. + RF_Shadow[eRFPath][Offset].Recorver= Type;
  82094. +
  82095. +} /* PHY_RFShadowRecorverFlagSet */
  82096. +
  82097. +
  82098. +VOID
  82099. +PHY_RFShadowCompareFlagSetAll(
  82100. + IN PADAPTER Adapter)
  82101. +{
  82102. + u32 eRFPath;
  82103. + u32 Offset;
  82104. +
  82105. + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
  82106. + {
  82107. + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
  82108. + {
  82109. + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
  82110. + if (Offset != 0x26 && Offset != 0x27)
  82111. + PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE);
  82112. + else
  82113. + PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE);
  82114. + }
  82115. + }
  82116. +
  82117. +} /* PHY_RFShadowCompareFlagSetAll */
  82118. +
  82119. +
  82120. +VOID
  82121. +PHY_RFShadowRecorverFlagSetAll(
  82122. + IN PADAPTER Adapter)
  82123. +{
  82124. + u32 eRFPath;
  82125. + u32 Offset;
  82126. +
  82127. + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
  82128. + {
  82129. + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
  82130. + {
  82131. + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
  82132. + if (Offset != 0x26 && Offset != 0x27)
  82133. + PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE);
  82134. + else
  82135. + PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE);
  82136. + }
  82137. + }
  82138. +
  82139. +} /* PHY_RFShadowCompareFlagSetAll */
  82140. +
  82141. +VOID
  82142. +PHY_RFShadowRefresh(
  82143. + IN PADAPTER Adapter)
  82144. +{
  82145. + u32 eRFPath;
  82146. + u32 Offset;
  82147. +
  82148. + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
  82149. + {
  82150. + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
  82151. + {
  82152. + RF_Shadow[eRFPath][Offset].Value = 0;
  82153. + RF_Shadow[eRFPath][Offset].Compare = _FALSE;
  82154. + RF_Shadow[eRFPath][Offset].Recorver = _FALSE;
  82155. + RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE;
  82156. + RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE;
  82157. + }
  82158. + }
  82159. +
  82160. +} /* PHY_RFShadowRead */
  82161. +
  82162. +/* End of HalRf6052.c */
  82163. --- /dev/null
  82164. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c
  82165. @@ -0,0 +1,874 @@
  82166. +/******************************************************************************
  82167. + *
  82168. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  82169. + *
  82170. + * This program is free software; you can redistribute it and/or modify it
  82171. + * under the terms of version 2 of the GNU General Public License as
  82172. + * published by the Free Software Foundation.
  82173. + *
  82174. + * This program is distributed in the hope that it will be useful, but WITHOUT
  82175. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  82176. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  82177. + * more details.
  82178. + *
  82179. + * You should have received a copy of the GNU General Public License along with
  82180. + * this program; if not, write to the Free Software Foundation, Inc.,
  82181. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  82182. + *
  82183. + *
  82184. + ******************************************************************************/
  82185. +#define _RTL8192C_REDESC_C_
  82186. +#include <drv_conf.h>
  82187. +#include <osdep_service.h>
  82188. +#include <drv_types.h>
  82189. +#include <rtl8192c_hal.h>
  82190. +
  82191. +static u8 evm_db2percentage(s8 value)
  82192. +{
  82193. + //
  82194. + // -33dB~0dB to 0%~99%
  82195. + //
  82196. + s8 ret_val;
  82197. +
  82198. + ret_val = value;
  82199. + //ret_val /= 2;
  82200. +
  82201. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("EVMdbToPercentage92S Value=%d / %x \n", ret_val, ret_val));
  82202. +
  82203. + if(ret_val >= 0)
  82204. + ret_val = 0;
  82205. + if(ret_val <= -33)
  82206. + ret_val = -33;
  82207. +
  82208. + ret_val = 0 - ret_val;
  82209. + ret_val*=3;
  82210. +
  82211. + if(ret_val == 99)
  82212. + ret_val = 100;
  82213. +
  82214. + return(ret_val);
  82215. +}
  82216. +
  82217. +
  82218. +static s32 signal_scale_mapping(_adapter *padapter, s32 cur_sig )
  82219. +{
  82220. + s32 ret_sig;
  82221. +
  82222. +#ifdef CONFIG_USB_HCI
  82223. + if(cur_sig >= 51 && cur_sig <= 100)
  82224. + {
  82225. + ret_sig = 100;
  82226. + }
  82227. + else if(cur_sig >= 41 && cur_sig <= 50)
  82228. + {
  82229. + ret_sig = 80 + ((cur_sig - 40)*2);
  82230. + }
  82231. + else if(cur_sig >= 31 && cur_sig <= 40)
  82232. + {
  82233. + ret_sig = 66 + (cur_sig - 30);
  82234. + }
  82235. + else if(cur_sig >= 21 && cur_sig <= 30)
  82236. + {
  82237. + ret_sig = 54 + (cur_sig - 20);
  82238. + }
  82239. + else if(cur_sig >= 10 && cur_sig <= 20)
  82240. + {
  82241. + ret_sig = 42 + (((cur_sig - 10) * 2) / 3);
  82242. + }
  82243. + else if(cur_sig >= 5 && cur_sig <= 9)
  82244. + {
  82245. + ret_sig = 22 + (((cur_sig - 5) * 3) / 2);
  82246. + }
  82247. + else if(cur_sig >= 1 && cur_sig <= 4)
  82248. + {
  82249. + ret_sig = 6 + (((cur_sig - 1) * 3) / 2);
  82250. + }
  82251. + else
  82252. + {
  82253. + ret_sig = cur_sig;
  82254. + }
  82255. +#else
  82256. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  82257. +
  82258. + if(pHalData->CustomerID == RT_CID_819x_Lenovo)
  82259. + {
  82260. + // Step 1. Scale mapping.
  82261. + // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo.
  82262. + // 20100426 Joseph: Modify Signal strength mapping.
  82263. + // This modification makes the RSSI indication similar to Intel solution.
  82264. + // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE.
  82265. + if(cur_sig >= 54 && cur_sig <= 100)
  82266. + {
  82267. + ret_sig = 100;
  82268. + }
  82269. + else if(cur_sig>=42 && cur_sig <= 53 )
  82270. + {
  82271. + ret_sig = 95;
  82272. + }
  82273. + else if(cur_sig>=36 && cur_sig <= 41 )
  82274. + {
  82275. + ret_sig = 74 + ((cur_sig - 36) *20)/6;
  82276. + }
  82277. + else if(cur_sig>=33 && cur_sig <= 35 )
  82278. + {
  82279. + ret_sig = 65 + ((cur_sig - 33) *8)/2;
  82280. + }
  82281. + else if(cur_sig>=18 && cur_sig <= 32 )
  82282. + {
  82283. + ret_sig = 62 + ((cur_sig - 18) *2)/15;
  82284. + }
  82285. + else if(cur_sig>=15 && cur_sig <= 17 )
  82286. + {
  82287. + ret_sig = 33 + ((cur_sig - 15) *28)/2;
  82288. + }
  82289. + else if(cur_sig>=10 && cur_sig <= 14 )
  82290. + {
  82291. + ret_sig = 39;
  82292. + }
  82293. + else if(cur_sig>=8 && cur_sig <= 9 )
  82294. + {
  82295. + ret_sig = 33;
  82296. + }
  82297. + else if(cur_sig <= 8 )
  82298. + {
  82299. + ret_sig = 19;
  82300. + }
  82301. + }
  82302. + else
  82303. + {
  82304. + // Step 1. Scale mapping.
  82305. + if(cur_sig >= 61 && cur_sig <= 100)
  82306. + {
  82307. + ret_sig = 90 + ((cur_sig - 60) / 4);
  82308. + }
  82309. + else if(cur_sig >= 41 && cur_sig <= 60)
  82310. + {
  82311. + ret_sig = 78 + ((cur_sig - 40) / 2);
  82312. + }
  82313. + else if(cur_sig >= 31 && cur_sig <= 40)
  82314. + {
  82315. + ret_sig = 66 + (cur_sig - 30);
  82316. + }
  82317. + else if(cur_sig >= 21 && cur_sig <= 30)
  82318. + {
  82319. + ret_sig = 54 + (cur_sig - 20);
  82320. + }
  82321. + else if(cur_sig >= 5 && cur_sig <= 20)
  82322. + {
  82323. + ret_sig = 42 + (((cur_sig - 5) * 2) / 3);
  82324. + }
  82325. + else if(cur_sig == 4)
  82326. + {
  82327. + ret_sig = 36;
  82328. + }
  82329. + else if(cur_sig == 3)
  82330. + {
  82331. + ret_sig = 27;
  82332. + }
  82333. + else if(cur_sig == 2)
  82334. + {
  82335. + ret_sig = 18;
  82336. + }
  82337. + else if(cur_sig == 1)
  82338. + {
  82339. + ret_sig = 9;
  82340. + }
  82341. + else
  82342. + {
  82343. + ret_sig = cur_sig;
  82344. + }
  82345. + }
  82346. +#endif
  82347. +
  82348. + return ret_sig;
  82349. +}
  82350. +
  82351. +
  82352. +static s32 translate2dbm(u8 signal_strength_idx)
  82353. +{
  82354. + s32 signal_power; // in dBm.
  82355. +
  82356. +
  82357. + // Translate to dBm (x=0.5y-95).
  82358. + signal_power = (s32)((signal_strength_idx + 1) >> 1);
  82359. + signal_power -= 95;
  82360. +
  82361. + return signal_power;
  82362. +}
  82363. +
  82364. +static void query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat)
  82365. +{
  82366. + PHY_STS_OFDM_8192CD_T *pOfdm_buf;
  82367. + PHY_STS_CCK_8192CD_T *pCck_buf;
  82368. + u8 i, max_spatial_stream, evm;
  82369. + s8 rx_pwr[4], rx_pwr_all = 0;
  82370. + u8 pwdb_all;
  82371. + u32 rssi,total_rssi=0;
  82372. + u8 bcck_rate=0, rf_rx_num = 0, cck_highpwr = 0;
  82373. + _adapter *padapter = prframe->u.hdr.adapter;
  82374. + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  82375. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  82376. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  82377. + u8 tmp_rxsnr;
  82378. + s8 rx_snrX;
  82379. +
  82380. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  82381. + PHY_RX_DRIVER_INFO_8192CD *pDrvInfo = ((PHY_RX_DRIVER_INFO_8192CD *)pphy_stat);
  82382. + u8 bant1_sel = (pDrvInfo->ANTSEL == 1)?_TRUE:_FALSE;
  82383. +#endif
  82384. +
  82385. + // Record it for next packet processing
  82386. + bcck_rate=(pattrib->mcs_rate<=3? 1:0);
  82387. +
  82388. + if(bcck_rate) //CCK
  82389. + {
  82390. + u8 report;
  82391. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  82392. + if(bant1_sel == _TRUE)
  82393. + pHalData->CCK_Ant1_Cnt++;
  82394. + else
  82395. + pHalData->CCK_Ant2_Cnt++;
  82396. +#endif
  82397. +
  82398. + // CCK Driver info Structure is not the same as OFDM packet.
  82399. + pCck_buf = (PHY_STS_CCK_8192CD_T *)pphy_stat;
  82400. + //Adapter->RxStats.NumQryPhyStatusCCK++;
  82401. +
  82402. + //
  82403. + // (1)Hardware does not provide RSSI for CCK
  82404. + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
  82405. + //
  82406. +
  82407. + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on)
  82408. + cck_highpwr = (u8)pHalData->bCckHighPower;
  82409. + else
  82410. + cck_highpwr = _FALSE;
  82411. +
  82412. + if(!cck_highpwr)
  82413. + {
  82414. + report = pCck_buf->cck_agc_rpt&0xc0;
  82415. + report = report>>6;
  82416. + switch(report)
  82417. + {
  82418. + // 03312009 modified by cosa
  82419. + // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion
  82420. + // Note: different RF with the different RNA gain.
  82421. + case 0x3:
  82422. + rx_pwr_all = (-46) - (pCck_buf->cck_agc_rpt & 0x3e);
  82423. + break;
  82424. + case 0x2:
  82425. + rx_pwr_all = (-26) - (pCck_buf->cck_agc_rpt & 0x3e);
  82426. + break;
  82427. + case 0x1:
  82428. + rx_pwr_all = (-12) - (pCck_buf->cck_agc_rpt & 0x3e);
  82429. + break;
  82430. + case 0x0:
  82431. + rx_pwr_all = (16) - (pCck_buf->cck_agc_rpt & 0x3e);
  82432. + break;
  82433. + }
  82434. + }
  82435. + else
  82436. + {
  82437. + report = pCck_buf->cck_agc_rpt & 0x60;
  82438. + report = report>>5;
  82439. + switch(report)
  82440. + {
  82441. + case 0x3:
  82442. + rx_pwr_all = (-46) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ;
  82443. + break;
  82444. + case 0x2:
  82445. + rx_pwr_all = (-26)- ((pCck_buf->cck_agc_rpt & 0x1f)<<1);
  82446. + break;
  82447. + case 0x1:
  82448. + rx_pwr_all = (-12) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ;
  82449. + break;
  82450. + case 0x0:
  82451. + rx_pwr_all = (16) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ;
  82452. + break;
  82453. + }
  82454. + }
  82455. +
  82456. + pwdb_all= query_rx_pwr_percentage(rx_pwr_all);
  82457. + if(pHalData->CustomerID == RT_CID_819x_Lenovo)
  82458. + {
  82459. + // CCK gain is smaller than OFDM/MCS gain,
  82460. + // so we add gain diff by experiences, the val is 6
  82461. + pwdb_all+=6;
  82462. + if(pwdb_all > 100)
  82463. + pwdb_all = 100;
  82464. + // modify the offset to make the same gain index with OFDM.
  82465. + if(pwdb_all > 34 && pwdb_all <= 42)
  82466. + pwdb_all -= 2;
  82467. + else if(pwdb_all > 26 && pwdb_all <= 34)
  82468. + pwdb_all -= 6;
  82469. + else if(pwdb_all > 14 && pwdb_all <= 26)
  82470. + pwdb_all -= 8;
  82471. + else if(pwdb_all > 4 && pwdb_all <= 14)
  82472. + pwdb_all -= 4;
  82473. + }
  82474. +
  82475. + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive
  82476. + pattrib->RecvSignalPower = rx_pwr_all; //dBM
  82477. + padapter->recvpriv.rxpwdb = rx_pwr_all;
  82478. + //
  82479. + // (3) Get Signal Quality (EVM)
  82480. + //
  82481. + //if(bPacketMatchBSSID)
  82482. + {
  82483. + u8 sq;
  82484. +
  82485. + if(pHalData->CustomerID == RT_CID_819x_Lenovo)
  82486. + {
  82487. + // mapping to 5 bars for vista signal strength
  82488. + // signal quality in driver will be displayed to signal strength
  82489. + // in vista.
  82490. + if(pwdb_all >= 50)
  82491. + sq = 100;
  82492. + else if(pwdb_all >= 35 && pwdb_all < 50)
  82493. + sq = 80;
  82494. + else if(pwdb_all >= 22 && pwdb_all < 35)
  82495. + sq = 60;
  82496. + else if(pwdb_all >= 18 && pwdb_all < 22)
  82497. + sq = 40;
  82498. + else
  82499. + sq = 20;
  82500. + }
  82501. + else
  82502. + {
  82503. + if(pwdb_all> 40)
  82504. + {
  82505. + sq = 100;
  82506. + }
  82507. + else
  82508. + {
  82509. + sq = pCck_buf->SQ_rpt;
  82510. +
  82511. + if(pCck_buf->SQ_rpt > 64)
  82512. + sq = 0;
  82513. + else if (pCck_buf->SQ_rpt < 20)
  82514. + sq= 100;
  82515. + else
  82516. + sq = ((64-sq) * 100) / 44;
  82517. +
  82518. + }
  82519. + }
  82520. +
  82521. + pattrib->signal_qual=sq;
  82522. + pattrib->rx_mimo_signal_qual[0]=sq;
  82523. + pattrib->rx_mimo_signal_qual[1]=(-1);
  82524. + }
  82525. +
  82526. + }
  82527. + else //OFDM/HT
  82528. + {
  82529. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  82530. + if(bant1_sel == _TRUE)
  82531. + pHalData->OFDM_Ant1_Cnt++;
  82532. + else
  82533. + pHalData->OFDM_Ant2_Cnt++;
  82534. +#endif
  82535. + pdmpriv->OFDM_Pkt_Cnt++;
  82536. +
  82537. + pOfdm_buf = (PHY_STS_OFDM_8192CD_T *)pphy_stat;
  82538. +
  82539. + //
  82540. + // (1)Get RSSI per-path
  82541. + //
  82542. + for(i=0; i<pHalData->NumTotalRFPath; i++)
  82543. + {
  82544. + // 2008/01/30 MH we will judge RF RX path now.
  82545. + if (pHalData->bRFPathRxEnable[i])
  82546. + rf_rx_num++;
  82547. + //else
  82548. + //continue;
  82549. +
  82550. + rx_pwr[i] = ((pOfdm_buf->trsw_gain_X[i]&0x3F)*2) - 110;
  82551. + padapter->recvpriv.RxRssi[i] = rx_pwr[i];
  82552. + /* Translate DBM to percentage. */
  82553. + pattrib->rx_rssi[i] = rssi = query_rx_pwr_percentage(rx_pwr[i]);
  82554. + total_rssi += rssi;
  82555. +
  82556. + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], rssi));
  82557. +
  82558. + //Get Rx snr value in DB
  82559. + tmp_rxsnr = pOfdm_buf->rxsnr_X[i];
  82560. + rx_snrX = (s8)(tmp_rxsnr);
  82561. + rx_snrX >>= 1;
  82562. + padapter->recvpriv.RxSNRdB[i] = (int)rx_snrX;
  82563. + pattrib->rx_snr[i]=pOfdm_buf->rxsnr_X[i];
  82564. + /* Record Signal Strength for next packet */
  82565. + //if(bPacketMatchBSSID)
  82566. + {
  82567. + //pRfd->Status.RxMIMOSignalStrength[i] =(u1Byte) RSSI;
  82568. +
  82569. + //The following is for lenovo signal strength in vista
  82570. + if(pHalData->CustomerID == RT_CID_819x_Lenovo)
  82571. + {
  82572. + u8 sq;
  82573. +
  82574. + if(i == 0)
  82575. + {
  82576. + // mapping to 5 bars for vista signal strength
  82577. + // signal quality in driver will be displayed to signal strength
  82578. + // in vista.
  82579. + if(rssi >= 50)
  82580. + sq = 100;
  82581. + else if(rssi >= 35 && rssi < 50)
  82582. + sq = 80;
  82583. + else if(rssi >= 22 && rssi < 35)
  82584. + sq = 60;
  82585. + else if(rssi >= 18 && rssi < 22)
  82586. + sq = 40;
  82587. + else
  82588. + sq = 20;
  82589. + //DbgPrint("ofdm/mcs RSSI=%d\n", RSSI);
  82590. + //pRfd->Status.SignalQuality = SQ;
  82591. + //DbgPrint("ofdm/mcs SQ = %d\n", pRfd->Status.SignalQuality);
  82592. + }
  82593. + }
  82594. + }
  82595. + }
  82596. +
  82597. +
  82598. + //
  82599. + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive),average
  82600. + //
  82601. + rx_pwr_all = (((pOfdm_buf->pwdb_all ) >> 1 )& 0x7f) -110;//for OFDM Average RSSI
  82602. + pwdb_all = query_rx_pwr_percentage(rx_pwr_all);
  82603. +
  82604. + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("PWDB_ALL=%d\n", pwdb_all));
  82605. +
  82606. + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive
  82607. + pattrib->RecvSignalPower = rx_pwr_all;//dBM
  82608. + padapter->recvpriv.rxpwdb = rx_pwr_all;
  82609. + //
  82610. + // (3)EVM of HT rate
  82611. + //
  82612. + if(pHalData->CustomerID != RT_CID_819x_Lenovo)
  82613. + {
  82614. + if(pattrib->rxht && pattrib->mcs_rate >=20 && pattrib->mcs_rate<=27)
  82615. + max_spatial_stream = 2; //both spatial stream make sense
  82616. + else
  82617. + max_spatial_stream = 1; //only spatial stream 1 makes sense
  82618. +
  82619. + for(i=0; i<max_spatial_stream; i++)
  82620. + {
  82621. + // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
  82622. + // fill most significant bit to "zero" when doing shifting operation which may change a negative
  82623. + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore.
  82624. + evm = evm_db2percentage( (pOfdm_buf->rxevm_X[i]/*/ 2*/));//dbm
  82625. +
  82626. + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RXRATE=%x RXEVM=%x EVM=%s%d\n",
  82627. + pattrib->mcs_rate, pOfdm_buf->rxevm_X[i], "%",evm));
  82628. +
  82629. + //if(bPacketMatchBSSID)
  82630. + {
  82631. + if(i==0) // Fill value in RFD, Get the first spatial stream only
  82632. + {
  82633. + pattrib->signal_qual = (u8)(evm & 0xff);
  82634. + }
  82635. + pattrib->rx_mimo_signal_qual[i] = (u8)(evm & 0xff);
  82636. + }
  82637. + }
  82638. +
  82639. + }
  82640. +
  82641. + //
  82642. + // 4. Record rx statistics for debug
  82643. + //
  82644. +
  82645. + }
  82646. +
  82647. +
  82648. + //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
  82649. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
  82650. + if(bcck_rate)
  82651. + {
  82652. + pattrib->signal_strength=(u8)signal_scale_mapping(padapter, pwdb_all);
  82653. + }
  82654. + else
  82655. + {
  82656. + if (rf_rx_num != 0)
  82657. + {
  82658. + pattrib->signal_strength= (u8)(signal_scale_mapping(padapter, total_rssi/=rf_rx_num));
  82659. + }
  82660. + }
  82661. + //DBG_8192C("%s,rx_pwr_all(%d),RxPWDBAll(%d)\n",__FUNCTION__,rx_pwr_all,pattrib->RxPWDBAll);
  82662. +
  82663. +}
  82664. +
  82665. +
  82666. +static void process_rssi(_adapter *padapter,union recv_frame *prframe)
  82667. +{
  82668. + u32 last_rssi, tmp_val;
  82669. + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  82670. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  82671. + struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data;
  82672. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82673. +
  82674. + //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength);
  82675. + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon)
  82676. + {
  82677. +
  82678. + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  82679. + if(signal_stat->update_req) {
  82680. + signal_stat->total_num = 0;
  82681. + signal_stat->total_val = 0;
  82682. + signal_stat->update_req = 0;
  82683. + }
  82684. +
  82685. + signal_stat->total_num++;
  82686. + signal_stat->total_val += pattrib->signal_strength;
  82687. + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
  82688. + #else //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82689. +
  82690. + //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test
  82691. + if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX)
  82692. + {
  82693. + padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX;
  82694. + last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index];
  82695. + padapter->recvpriv.signal_strength_data.total_val -= last_rssi;
  82696. + }
  82697. + padapter->recvpriv.signal_strength_data.total_val +=pattrib->signal_strength;
  82698. +
  82699. + padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->signal_strength;
  82700. + if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX)
  82701. + padapter->recvpriv.signal_strength_data.index = 0;
  82702. +
  82703. +
  82704. + tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num;
  82705. +
  82706. + if(padapter->recvpriv.is_signal_dbg) {
  82707. + padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
  82708. + padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
  82709. + } else {
  82710. + padapter->recvpriv.signal_strength= tmp_val;
  82711. + padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
  82712. + }
  82713. +
  82714. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
  82715. + #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82716. + }
  82717. +
  82718. +}// Process_UI_RSSI_8192C
  82719. +
  82720. +
  82721. +static void process_PWDB(_adapter *padapter, union recv_frame *prframe)
  82722. +{
  82723. + int UndecoratedSmoothedPWDB;
  82724. + int UndecoratedSmoothedCCK;
  82725. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  82726. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  82727. + struct rx_pkt_attrib *pattrib= &prframe->u.hdr.attrib;
  82728. + struct sta_info *psta = prframe->u.hdr.psta;
  82729. + u8 isCCKrate=(pattrib->mcs_rate<=3? 1:0);
  82730. +
  82731. +
  82732. + if(psta)
  82733. + {
  82734. + UndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
  82735. + UndecoratedSmoothedCCK = psta->rssi_stat.UndecoratedSmoothedCCK;
  82736. + }
  82737. + else
  82738. + {
  82739. + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
  82740. + UndecoratedSmoothedCCK = pdmpriv->UndecoratedSmoothedCCK;
  82741. + }
  82742. +
  82743. + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon)
  82744. +
  82745. + if(!isCCKrate)
  82746. + {
  82747. + // Process OFDM RSSI
  82748. + if(UndecoratedSmoothedPWDB < 0) // initialize
  82749. + {
  82750. + UndecoratedSmoothedPWDB = pattrib->RxPWDBAll;
  82751. + }
  82752. +
  82753. + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedPWDB)
  82754. + {
  82755. + UndecoratedSmoothedPWDB =
  82756. + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) +
  82757. + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor);
  82758. +
  82759. + UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB + 1;
  82760. + }
  82761. + else
  82762. + {
  82763. + UndecoratedSmoothedPWDB =
  82764. + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) +
  82765. + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor);
  82766. + }
  82767. + }
  82768. + else
  82769. + {
  82770. + // Process CCK RSSI
  82771. + if(UndecoratedSmoothedCCK < 0) // initialize
  82772. + {
  82773. + UndecoratedSmoothedCCK = pattrib->RxPWDBAll;
  82774. + }
  82775. +
  82776. + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedCCK)
  82777. + {
  82778. + UndecoratedSmoothedCCK =
  82779. + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) +
  82780. + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor);
  82781. +
  82782. + UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1;
  82783. + }
  82784. + else
  82785. + {
  82786. + UndecoratedSmoothedCCK =
  82787. + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) +
  82788. + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor);
  82789. + }
  82790. + }
  82791. +
  82792. +
  82793. + if(psta)
  82794. + {
  82795. + //psta->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;//todo:
  82796. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82797. +
  82798. + if(pdmpriv->RSSI_Select == RSSI_OFDM){
  82799. + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82800. + }
  82801. + else if(pdmpriv->RSSI_Select == RSSI_CCK){
  82802. + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK;
  82803. + }
  82804. + else{
  82805. + if(UndecoratedSmoothedPWDB <0 )
  82806. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK;
  82807. + else
  82808. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82809. + }
  82810. + psta->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK;
  82811. + }
  82812. + else
  82813. + {
  82814. + //pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82815. +
  82816. + if(pdmpriv->RSSI_Select == RSSI_OFDM){
  82817. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82818. + }
  82819. + else if(pdmpriv->RSSI_Select == RSSI_CCK){
  82820. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK;
  82821. + }
  82822. + else {
  82823. + if(UndecoratedSmoothedPWDB <0 )
  82824. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK;
  82825. + else
  82826. + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
  82827. +
  82828. + }
  82829. + pdmpriv->UndecoratedSmoothedCCK = UndecoratedSmoothedCCK;
  82830. + }
  82831. +
  82832. + //UpdateRxSignalStatistics8192C(padapter, prframe);
  82833. +
  82834. +}
  82835. +
  82836. +
  82837. +static void process_link_qual(_adapter *padapter,union recv_frame *prframe)
  82838. +{
  82839. + u32 last_evm=0, tmpVal;
  82840. + struct rx_pkt_attrib *pattrib;
  82841. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  82842. + struct signal_stat * signal_stat;
  82843. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82844. +
  82845. + if(prframe == NULL || padapter==NULL){
  82846. + return;
  82847. + }
  82848. +
  82849. + pattrib = &prframe->u.hdr.attrib;
  82850. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  82851. + signal_stat = &padapter->recvpriv.signal_qual_data;
  82852. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82853. +
  82854. + //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual);
  82855. +
  82856. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  82857. + if(signal_stat->update_req) {
  82858. + signal_stat->total_num = 0;
  82859. + signal_stat->total_val = 0;
  82860. + signal_stat->update_req = 0;
  82861. + }
  82862. +
  82863. + signal_stat->total_num++;
  82864. + signal_stat->total_val += pattrib->signal_qual;
  82865. + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
  82866. +
  82867. +#else //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82868. + if(pattrib->signal_qual != 0)
  82869. + {
  82870. + //
  82871. + // 1. Record the general EVM to the sliding window.
  82872. + //
  82873. + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX)
  82874. + {
  82875. + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;
  82876. + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];
  82877. + padapter->recvpriv.signal_qual_data.total_val -= last_evm;
  82878. + }
  82879. + padapter->recvpriv.signal_qual_data.total_val += pattrib->signal_qual;
  82880. +
  82881. + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->signal_qual;
  82882. + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)
  82883. + padapter->recvpriv.signal_qual_data.index = 0;
  82884. +
  82885. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->signal_qual));
  82886. +
  82887. + // <1> Showed on UI for user, in percentage.
  82888. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num;
  82889. + padapter->recvpriv.signal_qual=(u8)tmpVal;
  82890. +
  82891. + }
  82892. + else
  82893. + {
  82894. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->signal_qual));
  82895. + }
  82896. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  82897. +
  82898. +}// Process_UiLinkQuality8192S
  82899. +
  82900. +
  82901. +static void process_phy_info(_adapter *padapter, union recv_frame *prframe)
  82902. +{
  82903. + union recv_frame *precvframe = (union recv_frame *)prframe;
  82904. +
  82905. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  82906. + // If we switch to the antenna for testing, the signal strength
  82907. + // of the packets in this time shall not be counted into total receiving power.
  82908. + // This prevents error counting Rx signal strength and affecting other dynamic mechanism.
  82909. +
  82910. + // Select the packets to do RSSI checking for antenna switching.
  82911. + SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll);
  82912. +
  82913. + if(GET_HAL_DATA(padapter)->RSSI_test == _TRUE)
  82914. + return;
  82915. +#endif
  82916. + //
  82917. + // Check RSSI
  82918. + //
  82919. + process_rssi(padapter, precvframe);
  82920. + //
  82921. + // Check PWDB.
  82922. + //
  82923. + process_PWDB(padapter, precvframe);
  82924. + //
  82925. + // Check EVM
  82926. + //
  82927. + process_link_qual(padapter, precvframe);
  82928. +
  82929. +}
  82930. +
  82931. +
  82932. +void rtl8192c_translate_rx_signal_stuff(union recv_frame *precvframe, struct phy_stat *pphy_info)
  82933. +{
  82934. + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  82935. + _adapter *padapter = precvframe->u.hdr.adapter;
  82936. + u8 bPacketMatchBSSID =_FALSE;
  82937. + u8 bPacketToSelf = _FALSE;
  82938. + u8 bPacketBeacon = _FALSE;
  82939. +
  82940. + if((pattrib->physt) && (pphy_info != NULL))
  82941. + {
  82942. + bPacketMatchBSSID = ((!IsFrameTypeCtrl(precvframe->u.hdr.rx_data)) && !(pattrib->icv_err) && !(pattrib->crc_err) &&
  82943. + _rtw_memcmp(get_hdr_bssid(precvframe->u.hdr.rx_data), get_my_bssid(&padapter->mlmeextpriv.mlmext_info.network), ETH_ALEN));
  82944. +
  82945. +
  82946. + bPacketToSelf = bPacketMatchBSSID && (_rtw_memcmp(get_da(precvframe->u.hdr.rx_data), myid(&padapter->eeprompriv), ETH_ALEN));
  82947. +
  82948. + bPacketBeacon =bPacketMatchBSSID && (GetFrameSubType(precvframe->u.hdr.rx_data) == WIFI_BEACON);
  82949. +
  82950. + query_rx_phy_status(precvframe, pphy_info);
  82951. +
  82952. + precvframe->u.hdr.psta = NULL;
  82953. + if(bPacketMatchBSSID && check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
  82954. + {
  82955. + u8 *sa;
  82956. + struct sta_info *psta=NULL;
  82957. + struct sta_priv *pstapriv = &padapter->stapriv;
  82958. +
  82959. + sa = get_sa(precvframe->u.hdr.rx_data);
  82960. +
  82961. + psta = rtw_get_stainfo(pstapriv, sa);
  82962. + if(psta)
  82963. + {
  82964. + precvframe->u.hdr.psta = psta;
  82965. + process_phy_info(padapter, precvframe);
  82966. + }
  82967. + }
  82968. + else if(bPacketToSelf || bPacketBeacon)
  82969. + {
  82970. + if(check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  82971. + {
  82972. + u8 *sa;
  82973. + struct sta_info *psta=NULL;
  82974. + struct sta_priv *pstapriv = &padapter->stapriv;
  82975. +
  82976. + sa = get_sa(precvframe->u.hdr.rx_data);
  82977. +
  82978. + psta = rtw_get_stainfo(pstapriv, sa);
  82979. + if(psta)
  82980. + {
  82981. + precvframe->u.hdr.psta = psta;
  82982. + }
  82983. + }
  82984. +
  82985. + process_phy_info(padapter, precvframe);
  82986. + }
  82987. + }
  82988. +}
  82989. +
  82990. +void rtl8192c_query_rx_desc_status(union recv_frame *precvframe, struct recv_stat *pdesc)
  82991. +{
  82992. + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  82993. +
  82994. + //Offset 0
  82995. + pattrib->physt = (u8)((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1);
  82996. + pattrib->pkt_len = (u16)(le32_to_cpu(pdesc->rxdw0)&0x00003fff);
  82997. + pattrib->drvinfo_sz = (u8)((le32_to_cpu(pdesc->rxdw0) >> 16) & 0xf) * 8;//uint 2^3 = 8 bytes
  82998. +
  82999. + pattrib->shift_sz = (u8)((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3);
  83000. +
  83001. + pattrib->crc_err = (u8)((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1);
  83002. + pattrib->icv_err = (u8)((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1);
  83003. + pattrib->qos = (u8)(( le32_to_cpu( pdesc->rxdw0 ) >> 23) & 0x1);// Qos data, wireless lan header length is 26
  83004. + pattrib->bdecrypted = (le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1;
  83005. +
  83006. + //Offset 4
  83007. + pattrib->mfrag = (u8)((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit
  83008. +
  83009. + //Offset 8
  83010. + pattrib->frag_num = (u8)((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number
  83011. +
  83012. + //Offset 12
  83013. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  83014. + if ( le32_to_cpu(pdesc->rxdw3) & BIT(13)){
  83015. + pattrib->tcpchk_valid = 1; // valid
  83016. + if ( le32_to_cpu(pdesc->rxdw3) & BIT(11) ) {
  83017. + pattrib->tcp_chkrpt = 1; // correct
  83018. + //DBG_8192C("tcp csum ok\n");
  83019. + }
  83020. + else
  83021. + pattrib->tcp_chkrpt = 0; // incorrect
  83022. +
  83023. + if ( le32_to_cpu(pdesc->rxdw3) & BIT(12) )
  83024. + pattrib->ip_chkrpt = 1; // correct
  83025. + else
  83026. + pattrib->ip_chkrpt = 0; // incorrect
  83027. + }
  83028. + else {
  83029. + pattrib->tcpchk_valid = 0; // invalid
  83030. + }
  83031. +#endif
  83032. +
  83033. + pattrib->mcs_rate=(u8)((le32_to_cpu(pdesc->rxdw3))&0x3f);
  83034. + pattrib->rxht=(u8)((le32_to_cpu(pdesc->rxdw3) >>6)&0x1);
  83035. + pattrib->sgi=(u8)((le32_to_cpu(pdesc->rxdw3) >>8)&0x1);
  83036. + //Offset 16
  83037. + //Offset 20
  83038. +
  83039. +}
  83040. --- /dev/null
  83041. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c
  83042. @@ -0,0 +1,93 @@
  83043. +/******************************************************************************
  83044. + *
  83045. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  83046. + *
  83047. + * This program is free software; you can redistribute it and/or modify it
  83048. + * under the terms of version 2 of the GNU General Public License as
  83049. + * published by the Free Software Foundation.
  83050. + *
  83051. + * This program is distributed in the hope that it will be useful, but WITHOUT
  83052. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  83053. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  83054. + * more details.
  83055. + *
  83056. + * You should have received a copy of the GNU General Public License along with
  83057. + * this program; if not, write to the Free Software Foundation, Inc.,
  83058. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  83059. + *
  83060. + *
  83061. + ******************************************************************************/
  83062. +#include <rtl8192c_sreset.h>
  83063. +#include <rtl8192c_hal.h>
  83064. +#ifdef DBG_CONFIG_ERROR_DETECT
  83065. +void rtl8192c_sreset_xmit_status_check(_adapter *padapter)
  83066. +{
  83067. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  83068. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  83069. +
  83070. + unsigned long current_time;
  83071. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  83072. + unsigned int diff_time;
  83073. + u32 txdma_status;
  83074. + if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){
  83075. + DBG_871X("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status);
  83076. + rtw_hal_sreset_reset(padapter);
  83077. + }
  83078. +
  83079. + //total xmit irp = 4
  83080. + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt);
  83081. + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1)
  83082. + current_time = rtw_get_current_time();
  83083. +
  83084. + if(0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) {
  83085. +
  83086. + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time);
  83087. +
  83088. + if (diff_time > 2000) {
  83089. + if (psrtpriv->last_tx_complete_time == 0) {
  83090. + psrtpriv->last_tx_complete_time = current_time;
  83091. + }
  83092. + else{
  83093. + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time);
  83094. + if (diff_time > 4000) {
  83095. + //padapter->Wifi_Error_Status = WIFI_TX_HANG;
  83096. + DBG_871X("%s tx hang\n", __FUNCTION__);
  83097. + rtw_hal_sreset_reset(padapter);
  83098. + }
  83099. + }
  83100. + }
  83101. + }
  83102. +
  83103. + if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) {
  83104. + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
  83105. + rtw_hal_sreset_reset(padapter);
  83106. + return;
  83107. + }
  83108. +}
  83109. +void rtl8192c_sreset_linked_status_check(_adapter *padapter)
  83110. +{
  83111. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  83112. + struct sreset_priv *psrtpriv = &pHalData->srestpriv;
  83113. +
  83114. + u32 regc50,regc58,reg824,reg800;
  83115. + regc50 = rtw_read32(padapter,0xc50);
  83116. + regc58 = rtw_read32(padapter,0xc58);
  83117. + reg824 = rtw_read32(padapter,0x824);
  83118. + reg800 = rtw_read32(padapter,0x800);
  83119. + if( ((regc50&0xFFFFFF00)!= 0x69543400)||
  83120. + ((regc58&0xFFFFFF00)!= 0x69543400)||
  83121. + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))||
  83122. + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000)))
  83123. + {
  83124. + DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__,
  83125. + regc50, regc58, reg824, reg800);
  83126. + rtw_hal_sreset_reset(padapter);
  83127. + }
  83128. +
  83129. + if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) {
  83130. + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL;
  83131. + rtw_hal_sreset_reset(padapter);
  83132. + return;
  83133. + }
  83134. +}
  83135. +#endif
  83136. --- /dev/null
  83137. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_xmit.c
  83138. @@ -0,0 +1,62 @@
  83139. +/******************************************************************************
  83140. + *
  83141. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  83142. + *
  83143. + * This program is free software; you can redistribute it and/or modify it
  83144. + * under the terms of version 2 of the GNU General Public License as
  83145. + * published by the Free Software Foundation.
  83146. + *
  83147. + * This program is distributed in the hope that it will be useful, but WITHOUT
  83148. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  83149. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  83150. + * more details.
  83151. + *
  83152. + * You should have received a copy of the GNU General Public License along with
  83153. + * this program; if not, write to the Free Software Foundation, Inc.,
  83154. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  83155. + *
  83156. + *
  83157. + ******************************************************************************/
  83158. +#define _RTL8192C_XMIT_C_
  83159. +
  83160. +#include <drv_conf.h>
  83161. +#include <osdep_service.h>
  83162. +#include <drv_types.h>
  83163. +#include <rtl8192c_hal.h>
  83164. +
  83165. +#ifdef CONFIG_XMIT_ACK
  83166. +void dump_txrpt_ccx_8192c(void *buf)
  83167. +{
  83168. + struct txrpt_ccx_8192c *txrpt_ccx = buf;
  83169. +
  83170. + DBG_871X("%s:\n"
  83171. + "retry_cnt:%u, rsvd_0:%u, rts_retry_cnt:%u, rsvd_1:%u\n"
  83172. + "ccx_qtime:%u, missed_pkt_num:%u, rsvd_4:%u\n"
  83173. + "mac_id:%u, des1_fragssn:%u\n"
  83174. + "rpt_pkt_num:%u, pkt_drop:%u, lifetime_over:%u, retry_over:%u\n"
  83175. + "edca_tx_queue:%u, rsvd_7:%u, bmc:%u, pkt_ok:%u, init_ccx:%u\n"
  83176. + , __func__
  83177. + , txrpt_ccx->retry_cnt, txrpt_ccx->rsvd_0, txrpt_ccx->rts_retry_cnt, txrpt_ccx->rsvd_1
  83178. + , txrpt_ccx_qtime_8192c(txrpt_ccx), txrpt_ccx->missed_pkt_num, txrpt_ccx->rsvd_4
  83179. + , txrpt_ccx->mac_id, txrpt_ccx->des1_fragssn
  83180. + , txrpt_ccx->rpt_pkt_num, txrpt_ccx->pkt_drop, txrpt_ccx->lifetime_over, txrpt_ccx->retry_over
  83181. + , txrpt_ccx->edca_tx_queue, txrpt_ccx->rsvd_7, txrpt_ccx->bmc, txrpt_ccx->pkt_ok, txrpt_ccx->int_ccx
  83182. + );
  83183. +}
  83184. +
  83185. +void handle_txrpt_ccx_8192c(_adapter *adapter, void *buf)
  83186. +{
  83187. + struct txrpt_ccx_8192c *txrpt_ccx = buf;
  83188. +
  83189. + #ifdef DBG_CCX
  83190. + dump_txrpt_ccx_8192c(buf);
  83191. + #endif
  83192. +
  83193. + if (txrpt_ccx->int_ccx) {
  83194. + if (txrpt_ccx->pkt_ok)
  83195. + rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS);
  83196. + else
  83197. + rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL);
  83198. + }
  83199. +}
  83200. +#endif //CONFIG_XMIT_ACK
  83201. --- /dev/null
  83202. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c
  83203. @@ -0,0 +1,8757 @@
  83204. +/******************************************************************************
  83205. + *
  83206. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  83207. + *
  83208. + * This program is free software; you can redistribute it and/or modify it
  83209. + * under the terms of version 2 of the GNU General Public License as
  83210. + * published by the Free Software Foundation.
  83211. + *
  83212. + * This program is distributed in the hope that it will be useful, but WITHOUT
  83213. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  83214. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  83215. + * more details.
  83216. + *
  83217. + * You should have received a copy of the GNU General Public License along with
  83218. + * this program; if not, write to the Free Software Foundation, Inc.,
  83219. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  83220. + *
  83221. + *
  83222. + ******************************************************************************/
  83223. +
  83224. +/*Created on 2011/ 6/15, 5:45*/
  83225. +
  83226. +#include <basic_types.h>
  83227. +#include "Hal8192CUHWImg.h"
  83228. +
  83229. +#ifdef CONFIG_BT_COEXISTENCE
  83230. +// =================== v84 TSMC COMMON 2012-04-13 =======================
  83231. +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = {
  83232. +0xc1,0x88,0x02,0x00,0x54,0x00,0x01,0x00,0x04,0x13,0x11,0x07,0x3a,0x3d,0x00,0x00,
  83233. +0x58,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83234. +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83235. +0x00,0x00,0x00,0x02,0x50,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83236. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83237. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83238. +0x00,0x00,0x00,0x02,0x57,0x91,0x00,0x00,0x00,0x00,0x00,0xa1,0xe8,0x00,0x00,0x00,
  83239. +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02,
  83240. +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09,
  83241. +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08,
  83242. +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18,
  83243. +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21,
  83244. +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20,
  83245. +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10,
  83246. +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20,
  83247. +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04,
  83248. +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,
  83249. +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b,
  83250. +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c,
  83251. +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,
  83252. +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,
  83253. +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,
  83254. +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,
  83255. +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,
  83256. +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,
  83257. +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,
  83258. +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,
  83259. +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,
  83260. +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,
  83261. +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,
  83262. +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,
  83263. +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,
  83264. +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,
  83265. +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,
  83266. +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,
  83267. +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83268. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  83269. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  83270. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  83271. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  83272. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  83273. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  83274. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  83275. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,
  83276. +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,
  83277. +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,
  83278. +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,
  83279. +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,
  83280. +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,
  83281. +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,
  83282. +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,
  83283. +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,
  83284. +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,
  83285. +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,
  83286. +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec,
  83287. +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4,
  83288. +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,
  83289. +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82,
  83290. +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0,
  83291. +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,
  83292. +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,
  83293. +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x48,0x29,
  83294. +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,
  83295. +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,
  83296. +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,
  83297. +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60,
  83298. +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,
  83299. +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,
  83300. +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,
  83301. +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x41,0x9e,0x77,
  83302. +0x00,0x41,0x9e,0xae,0x00,0x41,0x9e,0x54,0x80,0x41,0x9e,0xb0,0x00,0x00,0xf0,0x90,
  83303. +0x9e,0x5d,0xe0,0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0xd3,0x10,
  83304. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x85,0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,
  83305. +0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,
  83306. +0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x85,0xf0,0x90,0x9e,0x5b,0xe0,0x90,0x9e,0x86,
  83307. +0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x5e,0x90,0x01,0x5f,0x74,0x05,0xf0,
  83308. +0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x9e,0x63,0x14,0xf0,0xe5,0x61,0x54,0x0f,0xc3,
  83309. +0x94,0x0c,0x50,0x03,0x12,0x54,0xe3,0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,
  83310. +0xf0,0x22,0xe4,0xf5,0x65,0x7f,0x60,0x7e,0x01,0x80,0xed,0x7d,0x01,0xaf,0x62,0x02,
  83311. +0x54,0xe7,0xb1,0xb0,0xbf,0x01,0x12,0x90,0x9e,0x79,0xe0,0xff,0xe4,0xfd,0xf1,0x79,
  83312. +0x12,0x5f,0xf7,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xb1,0xb0,0xbf,0x01,0x0f,0x90,
  83313. +0x02,0x09,0xe0,0xff,0x7d,0x01,0xf1,0x79,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,
  83314. +0x22,0x22,0x00,0x02,0x45,0x03,0x02,0x45,0x06,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  83315. +0x8b,0x20,0x8a,0x21,0x89,0x22,0x90,0x9e,0x87,0x71,0x8b,0xab,0x23,0xaa,0x24,0xa9,
  83316. +0x25,0x90,0x9e,0x8a,0x71,0x8b,0xaf,0x26,0x15,0x26,0xef,0x60,0x1b,0x90,0x9e,0x8a,
  83317. +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x9e,0x87,0xe4,0x75,0xf0,
  83318. +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x20,0xaa,0x21,0xa9,0x22,0xd0,0xd0,
  83319. +0x92,0xaf,0x22,0x90,0x9e,0x11,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0x90,0x06,0xa9,
  83320. +0xe0,0x90,0x9e,0x10,0xf0,0xe0,0x54,0xc0,0x70,0x08,0x53,0x64,0xfe,0x53,0x64,0xfd,
  83321. +0x91,0xcb,0x90,0x9e,0x10,0xe0,0x30,0xe6,0x13,0x43,0x64,0x01,0x90,0x9e,0x66,0xe0,
  83322. +0x64,0x02,0x60,0x04,0x91,0xd2,0x80,0x07,0x91,0x79,0x80,0x03,0x53,0x64,0xfe,0x90,
  83323. +0x9e,0x10,0xe0,0x30,0xe7,0x16,0x43,0x64,0x02,0xe4,0x90,0x9e,0x85,0x91,0x4e,0x90,
  83324. +0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x67,0x74,0x01,0xf0,0x22,0x53,0x64,0xfd,0x22,
  83325. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x01,0xc4,0x74,0xb0,0xf0,0x74,0x45,0xa3,
  83326. +0xf0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,
  83327. +0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,
  83328. +0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,
  83329. +0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,
  83330. +0x05,0xc0,0x06,0xc0,0x07,0x75,0x13,0x00,0x90,0x01,0xc4,0x74,0xe8,0xf0,0x74,0x45,
  83331. +0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,
  83332. +0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,
  83333. +0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x09,0x90,
  83334. +0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0xc9,0xe5,0x34,0x30,0xe2,0x38,0x90,0x01,0x3c,
  83335. +0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x24,0x90,0x9e,0x85,0xe4,0xf0,0x90,
  83336. +0x9e,0x5b,0xe0,0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x5e,
  83337. +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x9e,
  83338. +0x64,0xe4,0xf0,0x91,0xcb,0xe5,0x34,0x30,0xe3,0x38,0x90,0x01,0x3c,0x74,0x08,0xf0,
  83339. +0x90,0x06,0x92,0xe0,0x30,0xe1,0x24,0x90,0x9e,0x85,0xe4,0xf0,0x90,0x9e,0x5b,0xe0,
  83340. +0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x5e,0x90,0x01,0x5f,
  83341. +0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x9e,0x63,0xe4,0xf0,
  83342. +0x91,0xcb,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x4b,0xfb,
  83343. +0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x4c,0x3d,0xe5,0x35,
  83344. +0x30,0xe0,0x44,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,0x44,0x7f,0xf0,
  83345. +0x90,0x00,0x83,0xe0,0x54,0x0f,0xf5,0x13,0xb4,0x01,0x02,0x80,0x1c,0xe5,0x13,0xb4,
  83346. +0x02,0x05,0x90,0x00,0x83,0x80,0x12,0xe5,0x13,0xb4,0x04,0x05,0x90,0x00,0x83,0x80,
  83347. +0x08,0xe5,0x13,0xb4,0x0c,0x06,0x90,0x00,0x83,0xe0,0xf5,0x62,0x90,0x01,0xbb,0xe5,
  83348. +0x62,0xf0,0x12,0x60,0xc0,0x91,0xcb,0xe5,0x35,0x30,0xe2,0x06,0x90,0x01,0x3d,0x74,
  83349. +0x04,0xf0,0xe5,0x35,0x30,0xe4,0x06,0x90,0x01,0x3d,0x74,0x10,0xf0,0xe5,0x36,0x30,
  83350. +0xe0,0x06,0x90,0x01,0x3e,0x74,0x01,0xf0,0xe5,0x36,0x30,0xe1,0x06,0x90,0x01,0x3e,
  83351. +0x74,0x02,0xf0,0x74,0xe8,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,
  83352. +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,
  83353. +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x9e,0x98,0xef,0xf0,0xa3,0xed,
  83354. +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x63,0x60,0x05,0xe4,0xff,0x12,0x54,0x97,0x90,
  83355. +0x9e,0x98,0xe0,0x30,0xe0,0x09,0x90,0x9e,0x9a,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90,
  83356. +0x9e,0x98,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90,
  83357. +0x9e,0x99,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc,
  83358. +0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  83359. +0xe0,0x44,0x80,0xf0,0x90,0x9e,0x9a,0xa3,0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4,
  83360. +0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  83361. +0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,
  83362. +0xf7,0xf0,0x90,0x9e,0x9a,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x75,0x28,0x33,0xe4,0xf5,
  83363. +0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,
  83364. +0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4,0x90,0x9e,0x16,0xf0,0xa3,0xf0,
  83365. +0x75,0x8e,0x02,0xf1,0xa1,0xf1,0xe9,0x90,0x9e,0x7e,0xef,0xf0,0xf1,0xdd,0x90,0x9e,
  83366. +0x80,0xef,0xf0,0xf1,0xf6,0x90,0x9e,0x75,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5,0x57,
  83367. +0x12,0x6e,0x77,0xf1,0xd4,0x12,0x60,0x4b,0x12,0x32,0x3d,0xf1,0xc9,0x11,0x0b,0x12,
  83368. +0x50,0x0e,0xf1,0xcd,0xf1,0xb1,0x12,0x44,0xff,0xf1,0x45,0x90,0x9e,0x18,0xe5,0xd9,
  83369. +0xf0,0x11,0xd0,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0xb1,0x45,0x75,0xe8,
  83370. +0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x9e,0x16,0xe0,0x64,0x01,0xf0,0x24,0x29,0x90,
  83371. +0x01,0xc4,0xf0,0x74,0x48,0xa3,0xf0,0xe5,0x57,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x57,
  83372. +0xef,0xd2,0xaf,0x12,0x58,0x74,0xe5,0x57,0x30,0xe6,0x17,0xc2,0xaf,0x53,0x57,0xbf,
  83373. +0xd2,0xaf,0x12,0x67,0xa1,0x90,0x9e,0x43,0xe0,0xff,0x60,0x03,0xb4,0x01,0x03,0x12,
  83374. +0x7b,0x5c,0x90,0x9e,0x43,0xe0,0x70,0x03,0x12,0x7c,0x5f,0x12,0x73,0x85,0x80,0xb6,
  83375. +0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,
  83376. +0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0x31,0x05,0x7d,0xff,0x7f,0x55,0x31,0x05,0x7d,
  83377. +0xff,0x7f,0x56,0x31,0x05,0x7d,0xff,0x7f,0x57,0x80,0x0a,0xf0,0x90,0x00,0x45,0xe0,
  83378. +0x54,0xfe,0xfd,0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,
  83379. +0x00,0xed,0xf0,0xb1,0x45,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x14,0x60,0x30,0x14,0x60,
  83380. +0x66,0x24,0x02,0x60,0x02,0x21,0xc1,0x90,0x9e,0x3f,0x74,0x02,0xf0,0x90,0x00,0x48,
  83381. +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x31,0x05,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,
  83382. +0x47,0x31,0x05,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x71,0xe4,0x90,
  83383. +0x9e,0x3f,0xf0,0x90,0x9e,0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  83384. +0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x31,
  83385. +0x05,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x46,0xe0,
  83386. +0x44,0x10,0xfd,0x7f,0x46,0x80,0x38,0x90,0x9e,0x3f,0x74,0x01,0xf0,0x90,0x9e,0x45,
  83387. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,
  83388. +0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x45,0xe0,0x44,
  83389. +0x10,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x31,
  83390. +0x05,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x9e,0x41,0xf0,0x90,0x00,0x01,0x12,
  83391. +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x9e,0x40,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,
  83392. +0xe0,0x90,0x9e,0x44,0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x4f,0xf0,0x90,0x05,0x61,
  83393. +0xe0,0x90,0x9e,0x50,0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x51,0xf0,0x90,0x05,0x63,
  83394. +0xe0,0x90,0x9e,0x52,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x90,
  83395. +0x9e,0x40,0xe0,0xff,0x91,0xf0,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x90,0x9e,
  83396. +0x41,0xe0,0x70,0x02,0x41,0xc8,0x90,0x9e,0x40,0xe0,0x70,0x02,0x41,0xc8,0x90,0x9e,
  83397. +0x44,0xe0,0x70,0x02,0x41,0xc8,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,
  83398. +0x90,0x9e,0x53,0x74,0x01,0xf0,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x11,0xfc,
  83399. +0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x31,0x05,0x90,0x9e,0x39,0xe0,0x60,
  83400. +0x15,0x90,0x9e,0x45,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,
  83401. +0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,
  83402. +0x54,0xef,0xfd,0x7f,0x45,0x31,0x05,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x9e,
  83403. +0x4f,0xe0,0x90,0x05,0x84,0xf0,0x90,0x9e,0x50,0xe0,0x90,0x05,0x85,0xf0,0x90,0x9e,
  83404. +0x51,0xe0,0x90,0x05,0x86,0xf0,0x90,0x9e,0x52,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,
  83405. +0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,
  83406. +0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2b,0x90,0x9e,0x41,0xe0,0x70,0x2d,0x90,0x9e,
  83407. +0x53,0x11,0xfb,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x31,0x05,0x90,0x05,
  83408. +0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,
  83409. +0x12,0x36,0x92,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x22,0x8b,0x14,0x8a,0x15,
  83410. +0x89,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x9e,0x42,0xf0,0xe0,0x30,0xe0,0x4b,
  83411. +0x90,0x9e,0x39,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0x3b,
  83412. +0x12,0x2a,0x7f,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42,0x20,0xff,
  83413. +0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,
  83414. +0x07,0x90,0x9e,0x3b,0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43,0x46,0x90,0x9e,
  83415. +0x45,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90,0x9e,0x39,0xf0,
  83416. +0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,0xec,0x44,0xc0,0xfc,0x90,
  83417. +0x9e,0x3b,0x12,0x2a,0x7f,0x90,0x9e,0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,
  83418. +0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x42,0xe0,0x30,0xe1,0x19,0x7d,
  83419. +0x0c,0x7f,0x47,0x31,0x05,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x31,0x05,
  83420. +0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1c,0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,
  83421. +0x47,0x31,0x05,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd,0x7f,0x48,0x31,0x05,0x90,0x00,
  83422. +0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0x31,0x05,0xe4,0x90,0x9e,0x3f,0xf0,0x22,0x90,
  83423. +0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,
  83424. +0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x31,0x05,0xe4,0xfd,0x7f,0x51,0x31,0x05,0xe4,
  83425. +0xfd,0x7f,0x52,0x31,0x05,0xe4,0xfd,0x7f,0x53,0x21,0x05,0xe5,0x65,0x64,0x01,0x70,
  83426. +0x3b,0xd1,0x85,0xbf,0x01,0x04,0x7f,0x01,0xd1,0x79,0x90,0x00,0x46,0xe0,0x44,0x04,
  83427. +0xfd,0x7f,0x46,0x31,0x05,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x31,0x05,
  83428. +0x90,0x00,0x46,0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x31,0x05,0x7f,0x02,0xd1,0xa1,0x8f,
  83429. +0x69,0x90,0x01,0xc9,0xe5,0x69,0xf0,0xb4,0x01,0x02,0xd1,0x19,0x22,0x90,0x9e,0x41,
  83430. +0xe0,0x64,0x01,0x60,0x02,0x81,0xef,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,
  83431. +0x31,0x05,0x90,0x9e,0x53,0xe0,0x70,0x31,0x90,0x9e,0x39,0xe0,0x60,0x15,0x90,0x9e,
  83432. +0x45,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,
  83433. +0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x9e,0x40,0xe0,0xff,0x91,0xf0,
  83434. +0x90,0x9e,0x53,0x74,0x01,0x11,0xfb,0x80,0x3f,0x90,0x9e,0x53,0xe0,0x64,0x01,0x70,
  83435. +0x37,0x90,0x9e,0x44,0xe0,0xff,0x91,0xf0,0xe4,0x90,0x9e,0x53,0xf0,0x90,0x00,0x45,
  83436. +0xe0,0x44,0x01,0xfd,0x7f,0x45,0x31,0x05,0x90,0x9e,0x39,0xe0,0x60,0x15,0x90,0x9e,
  83437. +0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,
  83438. +0xd9,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,
  83439. +0x9e,0x4f,0xe0,0x90,0x05,0x84,0xf0,0x90,0x9e,0x50,0xe0,0x90,0x05,0x85,0xf0,0x90,
  83440. +0x9e,0x51,0xe0,0x90,0x05,0x86,0xf0,0x90,0x9e,0x52,0xe0,0x90,0x05,0x87,0xf0,0x22,
  83441. +0x90,0x05,0x60,0xe0,0x90,0x9e,0x4f,0xf0,0x90,0x05,0x61,0xe0,0x90,0x9e,0x50,0xf0,
  83442. +0x90,0x05,0x62,0xe0,0x90,0x9e,0x51,0xf0,0x90,0x05,0x63,0xe0,0x90,0x9e,0x52,0xf0,
  83443. +0xc3,0x74,0xff,0x9f,0xfe,0x90,0x9e,0x50,0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,
  83444. +0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,
  83445. +0x9e,0x52,0x80,0x03,0x90,0x9e,0x51,0xe0,0x04,0xf0,0x22,0x90,0x9e,0x50,0xe0,0x2f,
  83446. +0xf0,0x22,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,
  83447. +0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x2a,0xed,
  83448. +0xf0,0x90,0x9e,0x29,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4e,0xa3,0xe0,0x70,0x1a,0x90,
  83449. +0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,
  83450. +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,
  83451. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,
  83452. +0xb1,0x45,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  83453. +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x59,0x90,0x9e,0x29,0xe0,0x24,0xf8,0xf0,
  83454. +0xa3,0xe0,0x70,0x1d,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  83455. +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80,
  83456. +0x1a,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  83457. +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0xb1,0x45,0x90,0x9e,0x29,
  83458. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,
  83459. +0x00,0x43,0xb1,0x42,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x49,0xe0,0x90,0x9e,0xb1,
  83460. +0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x31,0x05,0x90,0x9e,0xb1,0xe0,
  83461. +0x44,0xb0,0xfd,0x7f,0x49,0x21,0x05,0x90,0x9e,0x27,0xee,0xf0,0xa3,0xef,0xf0,0x75,
  83462. +0x65,0x01,0x8e,0x66,0xf5,0x67,0xe4,0xfd,0x7f,0x0b,0xb1,0x55,0xe4,0xfd,0x7f,0x02,
  83463. +0xb1,0x55,0xd1,0x85,0xe4,0xff,0xd1,0x79,0xe4,0xf5,0x69,0x90,0x01,0xc9,0xe5,0x69,
  83464. +0xf0,0x90,0x9e,0x27,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,
  83465. +0x7d,0x01,0x7f,0x60,0x7e,0x01,0x02,0x35,0xab,0x90,0x01,0xca,0xe5,0x68,0xf0,0xef,
  83466. +0x60,0x02,0xd1,0x19,0x22,0x7f,0x0b,0xd1,0xa1,0xef,0x65,0x68,0x60,0x10,0xe5,0x68,
  83467. +0xb4,0x01,0x05,0xe4,0xf5,0x68,0x80,0x03,0x75,0x68,0x01,0x7f,0x01,0x22,0x7f,0x00,
  83468. +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xb2,0xef,0xf0,0xd3,0x94,0x07,
  83469. +0x50,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,
  83470. +0xff,0x90,0x00,0x46,0xb1,0x42,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,
  83471. +0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,
  83472. +0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,
  83473. +0xd8,0xf8,0xff,0x80,0x4b,0x90,0x9e,0xb2,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,
  83474. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,
  83475. +0xf0,0xb1,0x45,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,
  83476. +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x42,0xe0,0xfb,0xe4,0xfe,
  83477. +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,
  83478. +0xd0,0xd0,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x31,0x05,0x90,0x04,0xfd,0xe4,0xf0,
  83479. +0xa3,0xf0,0x90,0x9e,0x43,0xf0,0x90,0x9e,0x49,0xf0,0x90,0x9e,0x4c,0xf0,0x90,0x9e,
  83480. +0x4a,0xf0,0x90,0x9e,0x4d,0xf0,0x90,0x9e,0x4b,0xf0,0x90,0x9e,0x4e,0xf0,0x90,0x9e,
  83481. +0x35,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0x3a,0xf0,0x90,0x9e,
  83482. +0x3f,0xf0,0x90,0x9e,0x41,0xf0,0x90,0x9e,0x53,0xf0,0x90,0x9e,0x44,0xf0,0x90,0x9e,
  83483. +0x40,0xf0,0x90,0x9e,0x39,0xf0,0x90,0x00,0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x21,
  83484. +0x05,0xe4,0x90,0x9e,0x7d,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x21,
  83485. +0x05,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,
  83486. +0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4,0xf5,0x68,0x22,0x90,0x01,0x64,
  83487. +0x74,0xa0,0xf0,0x22,0x90,0x9e,0x80,0xe0,0x90,0x9e,0x0f,0xf0,0x22,0x90,0x00,0xf3,
  83488. +0xe0,0x7f,0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x7f,
  83489. +0x01,0x60,0x02,0x7f,0x00,0x22,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x0c,0x90,0x00,0xf2,
  83490. +0xe0,0x30,0xe7,0x05,0x7e,0xfd,0x7f,0x33,0x22,0x7e,0xfd,0x7f,0x2f,0x22,0x90,0x00,
  83491. +0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,
  83492. +0xe4,0xf0,0x22,0x90,0x01,0x02,0xe0,0x54,0x03,0xff,0xe0,0x54,0x0c,0x13,0x13,0x54,
  83493. +0x3f,0xfe,0xef,0x64,0x01,0x60,0x04,0xef,0xb4,0x03,0x10,0x90,0x9e,0x10,0x74,0x01,
  83494. +0xf0,0xa3,0x74,0x37,0xf0,0xa3,0x74,0x01,0xf0,0x80,0x1a,0xee,0x64,0x01,0x60,0x07,
  83495. +0xaf,0x06,0xee,0x64,0x03,0x70,0x49,0x90,0x9e,0x10,0x74,0x01,0xf0,0xa3,0x74,0x3d,
  83496. +0xf0,0xa3,0x74,0x40,0xf0,0x90,0x9e,0x10,0xe0,0xfe,0xa3,0xe0,0xff,0xf5,0x82,0x8e,
  83497. +0x83,0xe0,0xfd,0x90,0x9e,0x12,0xe0,0xfc,0xed,0x5c,0x60,0x0c,0x8f,0x82,0x8e,0x83,
  83498. +0xec,0xf0,0xe4,0x90,0x9e,0x77,0xf0,0x22,0x90,0x9e,0x77,0xe0,0x04,0xf0,0xe0,0xc3,
  83499. +0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x44,0xea,
  83500. +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,
  83501. +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,
  83502. +0xc4,0x74,0xa1,0xf0,0x74,0x50,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,
  83503. +0xa3,0xe0,0x55,0x29,0xf5,0x2d,0xa3,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,
  83504. +0xf5,0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x41,0x46,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,
  83505. +0xd1,0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,
  83506. +0x52,0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,
  83507. +0x54,0x20,0x6f,0x70,0x02,0x21,0xf5,0xe5,0x54,0x30,0xe5,0x02,0x21,0xf5,0xe5,0x52,
  83508. +0x54,0x3f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,
  83509. +0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,
  83510. +0x42,0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,
  83511. +0x34,0x93,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,
  83512. +0x03,0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,
  83513. +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,
  83514. +0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,
  83515. +0x75,0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,
  83516. +0xe6,0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,
  83517. +0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,
  83518. +0x08,0x12,0x63,0x51,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,
  83519. +0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,
  83520. +0x30,0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0d,0xab,0x09,
  83521. +0xaf,0x08,0x12,0x62,0xee,0xe5,0x63,0x14,0x24,0xfd,0x50,0x02,0x80,0x48,0x90,0x9e,
  83522. +0x66,0xe0,0x60,0x3a,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,
  83523. +0xc3,0xef,0x64,0x01,0x70,0x30,0x90,0x9e,0x85,0xf0,0x90,0x9e,0x5b,0xe0,0x90,0x9e,
  83524. +0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,0x5e,0x90,0x01,0x5b,0x74,
  83525. +0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x9e,0x64,0xf0,0x80,0x08,0x71,0xc3,
  83526. +0xbf,0x01,0x03,0x12,0x44,0xcb,0xe5,0x2c,0x30,0xe1,0x20,0x90,0x01,0x34,0x74,0x02,
  83527. +0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,
  83528. +0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x71,0xd2,0xe5,0x2c,0x30,0xe3,0x06,
  83529. +0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,
  83530. +0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x26,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1f,
  83531. +0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,
  83532. +0x12,0x4b,0xcf,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4d,0x45,0x80,0xfe,0xe5,
  83533. +0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x12,0x90,
  83534. +0x9e,0x7f,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0,0x12,0x61,0x4e,0x90,0x9e,0x7f,0xe4,
  83535. +0xf0,0xe5,0x2e,0x30,0xe1,0x0b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x11,
  83536. +0x23,0xe5,0x2e,0x30,0xe2,0x09,0x90,0x01,0x36,0x74,0x04,0xf0,0x12,0x60,0xdf,0xe5,
  83537. +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x60,0x64,0x01,0x70,0x1c,
  83538. +0xe5,0x63,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,
  83539. +0x9e,0x85,0xe4,0x12,0x44,0x4e,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,
  83540. +0x2b,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x60,0xb4,0x01,0x20,0xe5,0x63,0x60,0x1c,
  83541. +0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x67,0xe4,0xf0,
  83542. +0x53,0x64,0xfd,0xe5,0x64,0x54,0x07,0x70,0x03,0x12,0x44,0xcb,0xe5,0x2e,0x30,0xe5,
  83543. +0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x60,0xb4,0x01,0x14,0xe5,0x63,0x60,0x10,
  83544. +0x90,0x9e,0x66,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xd2,0x80,0x03,0x12,0x44,0x79,
  83545. +0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x60,0xb4,0x01,0x10,
  83546. +0xe5,0x63,0x60,0x0c,0x53,0x64,0xfe,0xe5,0x64,0x54,0x07,0x70,0x03,0x12,0x44,0xcb,
  83547. +0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74,0x02,0xf0,0x91,0x64,0x74,0xa1,0x04,
  83548. +0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,
  83549. +0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,
  83550. +0xd0,0xe0,0x32,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,
  83551. +0x00,0x22,0x90,0x9e,0x10,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80,0xf0,
  83552. +0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0x90,0x12,0x43,0x8b,0x0b,0x7a,0x9e,0x79,
  83553. +0x10,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x8d,0x12,0x43,0x8b,0x90,0x9e,
  83554. +0xb0,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,
  83555. +0x12,0x71,0x7a,0xef,0x60,0x49,0x90,0x9e,0x8d,0x12,0x43,0x6b,0x8b,0x23,0x8a,0x24,
  83556. +0x89,0x25,0x75,0x26,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x9e,
  83557. +0x90,0x12,0x43,0x6b,0x8b,0x23,0x8a,0x24,0x89,0x25,0x90,0x9e,0x8d,0x12,0x43,0x6b,
  83558. +0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x26,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,
  83559. +0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,
  83560. +0xd0,0x92,0xaf,0x22,0x90,0x9e,0xa0,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x63,
  83561. +0x14,0x24,0xfd,0x50,0x02,0x80,0x1f,0x90,0x9e,0x66,0xe0,0x60,0x06,0x7d,0x01,0x7f,
  83562. +0x0c,0x80,0x0d,0xe5,0x61,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,
  83563. +0x91,0xe7,0xe4,0xff,0x91,0x97,0x22,0xef,0x60,0x0b,0x90,0x9e,0x80,0xe0,0xb4,0x01,
  83564. +0x10,0xe4,0xff,0x80,0x09,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x75,
  83565. +0xa5,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x74,
  83566. +0x12,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,
  83567. +0xe6,0xe5,0x63,0x60,0x04,0x7f,0x01,0x91,0x97,0x12,0x74,0xd2,0x53,0x61,0xf0,0x43,
  83568. +0x61,0x02,0x22,0x7d,0x01,0x7f,0x0c,0x8f,0x6a,0x8d,0x6b,0xe5,0x6a,0x54,0x0f,0xff,
  83569. +0xe5,0x61,0x54,0x0f,0x6f,0x60,0x65,0xe5,0x6a,0x30,0xe2,0x28,0xe5,0x61,0x20,0xe2,
  83570. +0x04,0x7f,0x01,0xd1,0xc2,0xe5,0x61,0x30,0xe3,0x0c,0xe5,0x6a,0x20,0xe3,0x07,0xb1,
  83571. +0x5d,0xef,0x60,0x48,0xa1,0xa5,0xe5,0x61,0x20,0xe3,0x41,0xe5,0x6a,0x30,0xe3,0x3c,
  83572. +0xaf,0x6b,0xc1,0xdc,0xe5,0x61,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x6a,0x20,0xe3,
  83573. +0x07,0xb1,0x5d,0xef,0x60,0x26,0xb1,0xa5,0xe5,0x61,0x54,0x0f,0xff,0xbf,0x04,0x0c,
  83574. +0xe5,0x6a,0x20,0xe2,0x07,0xf1,0x21,0xef,0x60,0x12,0x91,0xb2,0xe5,0x61,0x54,0x0f,
  83575. +0xff,0xbf,0x02,0x08,0x12,0x60,0xbd,0xef,0x60,0x02,0xd1,0xaf,0x22,0x71,0xc3,0xef,
  83576. +0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x9e,0x64,0xe0,
  83577. +0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x9e,0x63,0xe0,0x60,0x08,
  83578. +0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x62,0x54,0x0f,0xd3,0x94,0x04,0x40,
  83579. +0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,
  83580. +0x08,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x60,0xb4,0x01,
  83581. +0x04,0x7f,0x01,0xd1,0xf6,0x53,0x61,0xf0,0x43,0x61,0x04,0x22,0xef,0x64,0x01,0x70,
  83582. +0x2e,0x7d,0x78,0x7f,0x02,0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,
  83583. +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x91,0xe3,0xe4,0xff,0x91,0x97,
  83584. +0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,
  83585. +0x01,0x36,0x74,0x7b,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7b,0xff,0x12,0x36,0xe6,0x7d,
  83586. +0x02,0x7f,0x03,0x12,0x36,0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,
  83587. +0xe0,0x44,0x07,0xf0,0x12,0x62,0x4c,0xe5,0x60,0x20,0xe0,0x05,0xe4,0x90,0x9e,0x58,
  83588. +0xf0,0x22,0x8b,0x14,0x8a,0x15,0x89,0x16,0x12,0x60,0xb1,0xab,0x14,0xaa,0x15,0xa9,
  83589. +0x16,0x12,0x29,0xd9,0xf5,0x63,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,
  83590. +0x03,0x70,0x40,0x7f,0x01,0x80,0x3a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,
  83591. +0x12,0x42,0x20,0xfd,0xe4,0xff,0xd1,0x84,0x80,0x27,0xab,0x14,0xaa,0x15,0xa9,0x16,
  83592. +0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x01,0xd1,0x84,0x1f,0x80,0x13,0xab,0x14,
  83593. +0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0xd1,0x84,0xe4,
  83594. +0xff,0xb1,0xbc,0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x9e,0x65,0x74,
  83595. +0x01,0xf0,0x80,0x16,0xed,0x70,0x0a,0x90,0x9e,0x62,0xe0,0x90,0x9e,0x65,0xf0,0x80,
  83596. +0x05,0x90,0x9e,0x65,0xed,0xf0,0x90,0x9e,0x65,0xe0,0x90,0x9e,0x56,0xf0,0x22,0x53,
  83597. +0x61,0xf0,0x43,0x61,0x01,0x12,0x45,0x00,0x12,0x45,0x01,0x53,0x61,0xf0,0x43,0x61,
  83598. +0x02,0x22,0x90,0x9e,0xaf,0xef,0xf0,0x12,0x74,0x53,0x90,0x9e,0xaf,0xe0,0x60,0x05,
  83599. +0x90,0x05,0x22,0xe4,0xf0,0x53,0x61,0xf0,0x43,0x61,0x04,0x22,0x90,0x06,0x04,0xe0,
  83600. +0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x60,0xb4,0x01,0x04,0xe4,0xff,0xd1,0xf6,0x53,
  83601. +0x61,0xf0,0x43,0x61,0x0c,0x22,0x8f,0x27,0x12,0x45,0xb0,0xbf,0x01,0x22,0x90,0x9e,
  83602. +0x7a,0xe0,0xff,0x7d,0x01,0x12,0x47,0x79,0xab,0x07,0xaa,0x06,0xad,0x03,0xac,0x02,
  83603. +0xaf,0x27,0x12,0x60,0x2a,0xaf,0x03,0x12,0x5f,0xf7,0x90,0x04,0x1f,0x74,0x20,0xf0,
  83604. +0x22,0x71,0xc3,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x58,
  83605. +0xe5,0x64,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4a,0xe5,0x62,
  83606. +0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x39,0xe5,
  83607. +0x64,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x2c,0xe5,0x64,0x30,0xe4,
  83608. +0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x1f,0x90,0x9e,0x58,0xe0,0x60,0x08,0x90,
  83609. +0x01,0xb9,0x74,0x20,0xf0,0x80,0x11,0x90,0x9e,0x5e,0xe0,0x60,0x08,0x90,0x01,0xb9,
  83610. +0x74,0x80,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,
  83611. +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,
  83612. +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,
  83613. +0xc4,0x74,0x91,0xf0,0x74,0x57,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,
  83614. +0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0x90,0x00,0x52,0xe0,0xff,0x90,0x00,0x56,0xe0,
  83615. +0x5f,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,0x74,0x10,0xf0,0xe5,0x3d,
  83616. +0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,0x30,0xe6,0x1b,0x90,0x00,
  83617. +0x55,0x74,0x40,0xf0,0x90,0x9e,0x42,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x9e,
  83618. +0x3f,0xe0,0x60,0x05,0x7f,0x01,0x12,0x49,0x1a,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,
  83619. +0x55,0x74,0x80,0xf0,0x90,0x9e,0x42,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,
  83620. +0x12,0x49,0x1a,0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,0x74,0x01,0xf0,0xe5,0x3e,
  83621. +0x30,0xe1,0x06,0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,0x30,0xe2,0x06,0x90,0x00,
  83622. +0x56,0x74,0x04,0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,0x56,0x74,0x08,0xf0,0x90,
  83623. +0x01,0xc4,0x74,0x91,0xf0,0x74,0x57,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,
  83624. +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,
  83625. +0xf0,0xd0,0xe0,0x32,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  83626. +0x19,0xe0,0xfd,0x70,0x02,0x21,0xb5,0x90,0x9e,0xae,0xe0,0xff,0x74,0x01,0x7e,0x00,
  83627. +0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,
  83628. +0x02,0x21,0xae,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,
  83629. +0xe0,0x90,0x9e,0x1a,0xf0,0x75,0x23,0x01,0x75,0x24,0x9e,0x75,0x25,0x1a,0x75,0x26,
  83630. +0x01,0x7b,0x01,0x7a,0x9e,0x79,0x1b,0x12,0x45,0x09,0x90,0x9e,0x1b,0xe0,0xff,0xc4,
  83631. +0x13,0x13,0x13,0x54,0x01,0x90,0x9e,0xae,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,
  83632. +0x00,0x88,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1c,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,
  83633. +0x02,0x90,0x00,0x89,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1d,0xf0,0x90,0x9e,0xae,0xe0,
  83634. +0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1e,0xf0,0x90,0x9e,
  83635. +0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1f,0xf0,
  83636. +0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x9e,
  83637. +0x20,0xf0,0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,
  83638. +0x9e,0x1c,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,
  83639. +0xe0,0x90,0x9e,0x1d,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,
  83640. +0x43,0x5f,0xe0,0x90,0x9e,0x1e,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,
  83641. +0x1c,0x31,0xb6,0x90,0x9e,0x19,0xe0,0xff,0x90,0x9e,0xae,0xe0,0xfe,0x74,0x01,0xa8,
  83642. +0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  83643. +0xae,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,
  83644. +0xcc,0xf0,0x90,0x9e,0xae,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x01,0x7e,0x90,0x01,
  83645. +0xc6,0xe0,0x44,0x02,0xf0,0x22,0x90,0x9e,0x21,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,
  83646. +0x59,0xfc,0x01,0x59,0xf4,0x02,0x5a,0x20,0x03,0x5a,0x29,0x05,0x5a,0x32,0x06,0x5a,
  83647. +0x7e,0x07,0x5a,0x3a,0x09,0x5a,0x43,0x0b,0x5a,0x4c,0x0c,0x5a,0x55,0x0d,0x5a,0x5e,
  83648. +0x0e,0x5a,0x67,0x1b,0x5a,0x6f,0x1c,0x5a,0x05,0x2d,0x5a,0x0e,0x2e,0x5a,0x17,0x3b,
  83649. +0x00,0x00,0x5a,0x77,0x90,0x9e,0x21,0x12,0x43,0x6b,0xe1,0xe9,0x90,0x9e,0x21,0x12,
  83650. +0x43,0x6b,0x02,0x71,0xd0,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0x0b,0x90,0x9e,
  83651. +0x21,0x12,0x43,0x6b,0x02,0x72,0x53,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0x8c,
  83652. +0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0xb6,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,
  83653. +0x70,0x4a,0x90,0x9e,0x21,0x12,0x43,0x6b,0x80,0x45,0x90,0x9e,0x21,0x12,0x43,0x6b,
  83654. +0x02,0x72,0xfe,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x70,0xa2,0x90,0x9e,0x21,0x12,
  83655. +0x43,0x6b,0x02,0x49,0xc2,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x7b,0x29,0x90,0x9e,
  83656. +0x21,0x12,0x43,0x6b,0x02,0x4a,0xfc,0x90,0x9e,0x21,0x12,0x43,0x6b,0xe1,0xef,0x90,
  83657. +0x9e,0x21,0x12,0x43,0x6b,0xe1,0xd1,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x90,
  83658. +0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54,0x07,
  83659. +0xfd,0xaf,0x06,0x90,0x9e,0x24,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x8b,0x90,
  83660. +0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54,0x0f,
  83661. +0x90,0x9e,0x29,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13,0x54,
  83662. +0x03,0x90,0x9e,0x2a,0xf0,0x90,0x9e,0x24,0xe0,0xff,0x75,0xf0,0x09,0x90,0x96,0x46,
  83663. +0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x9e,0x2b,0xec,0xf0,0xa3,0xed,0xf0,0xef,
  83664. +0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b,0x01,0xa3,0x12,
  83665. +0x43,0x8b,0x90,0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0x0f,
  83666. +0xff,0x90,0x9e,0x2d,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d,0x90,0x9e,0x26,0x12,0x43,
  83667. +0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x9e,0x2d,0x12,0x43,0x6b,0x90,0x00,
  83668. +0x01,0xef,0x12,0x42,0x5f,0x90,0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,
  83669. +0x20,0xff,0x90,0x9e,0x2b,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,
  83670. +0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x29,0xe0,0xfe,0x90,0x9e,
  83671. +0x24,0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x90,0x9e,
  83672. +0x25,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x5f,0xee,0xf0,0x75,
  83673. +0xf0,0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x5f,0x74,0x01,0xf0,0x90,0x9e,0x2a,0xe0,
  83674. +0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x5f,0xee,0xf0,0x8f,0x14,0xef,
  83675. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82,0xf5,0x16,0x8f,0x17,0xe5,
  83676. +0x14,0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35,0xf0,0x75,0x18,0x01,0xf5,
  83677. +0x19,0x89,0x1a,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x46,0x12,0x43,0x5f,0xaf,0x82,
  83678. +0x85,0x83,0x1b,0x8f,0x1c,0xe5,0x14,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,
  83679. +0x35,0xf0,0x75,0x1d,0x01,0xf5,0x1e,0x89,0x1f,0x74,0x82,0x25,0x14,0xf5,0x82,0xe4,
  83680. +0x34,0x95,0xf5,0x83,0xe0,0x12,0x43,0x94,0x5c,0x0d,0x00,0x5c,0x22,0x01,0x5c,0x37,
  83681. +0x02,0x5c,0x4c,0x03,0x5c,0x75,0x04,0x5c,0x8a,0x05,0x5c,0x9f,0x06,0x5c,0xc5,0x0c,
  83682. +0x5c,0xf2,0x0d,0x5d,0x1f,0x0e,0x5d,0x4c,0x0f,0x00,0x00,0x5d,0x80,0xe5,0x14,0x25,
  83683. +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,
  83684. +0x80,0x3c,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,
  83685. +0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,
  83686. +0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x14,0x25,0xe0,
  83687. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,
  83688. +0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,
  83689. +0x74,0x8f,0xf0,0xa1,0x80,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,
  83690. +0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5,0x14,0x25,0xe0,0x24,0xc6,
  83691. +0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,
  83692. +0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0x74,
  83693. +0x0d,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,
  83694. +0xf0,0xa3,0xf0,0xa1,0x80,0x90,0x04,0x47,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,
  83695. +0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,
  83696. +0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x44,
  83697. +0xa1,0x77,0x90,0x04,0x4b,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,
  83698. +0x04,0x4a,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,
  83699. +0x04,0x49,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,
  83700. +0x04,0x4f,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,
  83701. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,
  83702. +0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,
  83703. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,0x04,0x52,0xe0,0xab,0x18,0xaa,
  83704. +0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x51,0xe0,0x85,0x17,0x82,
  83705. +0x85,0x16,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,0xf0,
  83706. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,
  83707. +0xab,0x1d,0xaa,0x1e,0xa9,0x1f,0x12,0x29,0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,
  83708. +0x12,0x42,0x4d,0xab,0x18,0xe5,0x1a,0x24,0x01,0xf9,0xe4,0x35,0x19,0xfa,0xc0,0x03,
  83709. +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1d,0xaa,0x1e,0xa9,0x1f,0x90,0x00,
  83710. +0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x17,
  83711. +0x82,0x85,0x16,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1c,0x82,0x85,0x1b,0x83,
  83712. +0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,
  83713. +0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1c,0x82,0x85,0x1b,0x83,0xa3,0xe0,0xfe,0xef,
  83714. +0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,
  83715. +0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75,0x15,0x0b,0x74,0x01,0x7e,
  83716. +0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x14,
  83717. +0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,
  83718. +0x5f,0x4e,0x60,0x06,0xe5,0x15,0x24,0x10,0x80,0x5d,0x15,0x15,0xe5,0x15,0xc3,0x94,
  83719. +0x00,0x50,0xca,0x80,0x56,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,
  83720. +0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x15,0x0f,0x74,0x01,0x7e,0x00,
  83721. +0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x14,0x25,
  83722. +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,
  83723. +0x4e,0x60,0x08,0x90,0x9e,0x30,0xe5,0x15,0xf0,0x80,0x10,0x15,0x15,0xe5,0x15,0xc3,
  83724. +0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x30,0xf0,0xe5,0x14,0x25,0xe0,0x24,
  83725. +0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,
  83726. +0xf5,0x15,0x74,0x01,0x7e,0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,
  83727. +0xd8,0xf9,0xff,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,
  83728. +0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x31,0xe5,0x15,0xf0,0x80,
  83729. +0x5b,0x05,0x15,0xe5,0x15,0xb4,0x10,0xca,0x80,0x52,0xe5,0x14,0x25,0xe0,0x24,0x02,
  83730. +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,
  83731. +0x15,0x74,0x01,0x7e,0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,
  83732. +0xf9,0xff,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,
  83733. +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x15,0x24,0x10,0x80,0x0a,0x05,0x15,
  83734. +0xe5,0x15,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x31,0xf0,0x90,0x9e,0x30,0xe0,
  83735. +0xff,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x48,0x12,0x43,0x5f,0xef,0xf0,0x90,0x9e,
  83736. +0x31,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x49,0x12,0x43,0x5f,0xee,0xf0,
  83737. +0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x06,
  83738. +0x90,0x9e,0x30,0x12,0x62,0x94,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x04,0xf5,
  83739. +0x83,0xe0,0xff,0x90,0x9e,0x31,0xe0,0xfe,0xef,0xc3,0x9e,0x50,0x03,0x12,0x62,0x94,
  83740. +0x90,0x9e,0x30,0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90,0x96,0x43,0x74,0x03,0xf0,
  83741. +0x22,0xef,0xd3,0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74,0x02,0xf0,0x22,0xef,0xd3,
  83742. +0x94,0x03,0x40,0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22,0xe4,0x90,0x96,0x43,0xf0,
  83743. +0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x3f,0xfe,0xef,0x54,0x80,0xc4,0x13,
  83744. +0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0x41,0x93,0x12,0x29,0xd9,0xf5,0x60,0x22,0x12,
  83745. +0x29,0xd9,0x90,0x95,0x01,0xf0,0x22,0xad,0x07,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,
  83746. +0xfc,0xf5,0x83,0xe0,0x44,0x01,0xf0,0x90,0x04,0x80,0xe0,0x54,0x0f,0xfc,0x74,0x14,
  83747. +0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xc0,0x4c,0xfd,0x74,0x14,0x2f,
  83748. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0x22,0xef,0x60,0x0f,0x74,0x21,0x2d,
  83749. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x22,0x74,0x21,0x2d,0xf5,
  83750. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x22,0xe4,0xf5,0x60,0xf5,0x64,
  83751. +0xf5,0x63,0x75,0x62,0x0c,0x75,0x61,0x0c,0x90,0x9e,0x66,0xf0,0x90,0x9e,0x64,0xf0,
  83752. +0x90,0x9e,0x63,0xf0,0x90,0x9e,0x65,0x04,0xf0,0x90,0x9e,0x56,0xf0,0xe4,0x90,0x9e,
  83753. +0x67,0xf0,0x90,0x9e,0x58,0xf0,0x90,0x9e,0x61,0x74,0x07,0xf0,0xe4,0x90,0x9e,0x57,
  83754. +0xf0,0x90,0x9e,0x5f,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0x5c,0x74,0x0a,0xf0,0xa3,
  83755. +0x74,0x05,0xf0,0x90,0x9e,0x5b,0x74,0x14,0xf0,0x90,0x9e,0x62,0x74,0x05,0xf0,0xe4,
  83756. +0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x55,0xf0,0x90,0x9e,0x7f,0xf0,0x90,0x9e,0x5e,0xf0,
  83757. +0x22,0xe4,0x90,0x9e,0x67,0xf0,0x90,0x9e,0x57,0xf0,0xf5,0x64,0x22,0x7f,0x00,0x22,
  83758. +0xe5,0x62,0x30,0xe6,0x19,0xe5,0x62,0x54,0x0f,0xff,0x90,0x9e,0x54,0xe0,0xfe,0x4f,
  83759. +0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x9e,0x54,0xf0,0x53,0x62,0xbf,0x22,0xe5,
  83760. +0x60,0x64,0x01,0x70,0x68,0xe5,0x63,0x60,0x64,0xe5,0x63,0x64,0x02,0x60,0x06,0xe5,
  83761. +0x63,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0x56,0xf0,0x90,0x06,0xaa,
  83762. +0xe0,0x90,0x9e,0x65,0xf0,0x90,0x9e,0x56,0xe0,0x70,0x07,0x90,0x9e,0x65,0xe0,0xff,
  83763. +0x80,0x05,0x90,0x9e,0x56,0xe0,0xff,0x90,0x9e,0x56,0xef,0xf0,0x90,0x9e,0x58,0xe0,
  83764. +0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0x57,0xf0,0x90,0x05,0x58,0x74,0x03,0xf0,
  83765. +0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x64,0xfd,0x53,0x64,
  83766. +0xef,0xe5,0x63,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0x22,0xe4,0xfb,
  83767. +0x90,0x9e,0x9c,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x63,0x60,0x6a,0xe5,0x60,
  83768. +0x64,0x01,0x70,0x64,0xe5,0x63,0x14,0x60,0x2b,0x24,0xfd,0x60,0x27,0x24,0x02,0x24,
  83769. +0xfb,0x50,0x02,0x80,0x21,0x90,0x9e,0x56,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,
  83770. +0x60,0x14,0x90,0x9e,0x56,0xe0,0x70,0x08,0x90,0x9e,0x65,0xe0,0x90,0x9e,0x56,0xf0,
  83771. +0x7b,0x01,0x80,0x02,0x7b,0x01,0xeb,0x60,0x2f,0x43,0x64,0x10,0xe4,0x90,0x9e,0x85,
  83772. +0xf0,0x90,0x9e,0x57,0xe0,0x75,0xf0,0x03,0xa4,0xff,0x90,0x9e,0x61,0xe0,0x2f,0x12,
  83773. +0x44,0x53,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x61,0x54,0x0f,0xc3,0x94,0x04,0x50,
  83774. +0x07,0x7d,0x01,0x7f,0x04,0x12,0x54,0xe7,0x22,0xe4,0x90,0x9e,0x15,0xf0,0xe5,0x63,
  83775. +0x60,0x79,0x90,0x9e,0x67,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x64,0xfd,0xe5,0x64,0x54,
  83776. +0x07,0x70,0x68,0x80,0x63,0x90,0x9e,0x57,0xe0,0x04,0xf0,0x53,0x64,0xef,0x90,0x9e,
  83777. +0x15,0xe0,0xf9,0xff,0x7e,0x00,0x24,0x01,0xfd,0xee,0x33,0xfc,0x90,0x9e,0x57,0xe0,
  83778. +0xb5,0x05,0x06,0xe4,0xb5,0x04,0x02,0x80,0x12,0xef,0x24,0x02,0xff,0xe4,0x3e,0xfe,
  83779. +0x90,0x9e,0x57,0xe0,0xb5,0x07,0x0a,0xe4,0xb5,0x06,0x06,0x90,0x05,0x58,0xe0,0x04,
  83780. +0xf0,0xe9,0xff,0x90,0x9e,0x5c,0xe0,0x2f,0xff,0xe4,0x33,0xfe,0x90,0x9e,0x57,0xe0,
  83781. +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x40,0x0d,0xe5,0x60,0xb4,0x01,0x0b,
  83782. +0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xcb,0x22,0x90,0x9e,0x5f,0xe0,
  83783. +0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,
  83784. +0x93,0x12,0x43,0x8b,0x90,0x9e,0x96,0xe0,0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54,
  83785. +0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f,0x4e,0xf0,0x90,0x9e,0x93,0x12,0x43,0x6b,
  83786. +0x90,0x9e,0x90,0x12,0x43,0x8b,0x7b,0x01,0x7a,0x9e,0x79,0x96,0x12,0x53,0xf1,0xd0,
  83787. +0xd0,0x92,0xaf,0x22,0xe0,0xfd,0x74,0x26,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9d,0xf5,
  83788. +0x83,0xed,0xf0,0xaf,0x14,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,
  83789. +0x50,0x0e,0x74,0x84,0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,
  83790. +0x74,0xa6,0x2f,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xed,0xf0,0x90,0x9e,0x68,0xef,
  83791. +0xf0,0x24,0xa6,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x90,0x9e,0x69,0xf0,0x7b,
  83792. +0x01,0x7a,0x9e,0x79,0x68,0x7d,0x02,0x51,0x57,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,
  83793. +0x8d,0x0b,0xe5,0x0b,0x54,0x1f,0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,
  83794. +0xf5,0x83,0xe0,0xf5,0x0e,0x90,0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,
  83795. +0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11,0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,
  83796. +0x25,0x0d,0xf5,0x0f,0xe5,0x10,0x90,0x41,0xd6,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,
  83797. +0x01,0x40,0x11,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,
  83798. +0xaf,0x0a,0x41,0xa5,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,
  83799. +0x22,0xad,0x07,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,0xff,0x74,
  83800. +0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,
  83801. +0x40,0x02,0x8f,0x12,0xe5,0x12,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  83802. +0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x12,0x25,0xe0,0x24,0x66,0xf5,0x82,
  83803. +0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,
  83804. +0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,
  83805. +0xf0,0xa3,0xef,0xf0,0xaf,0x05,0xad,0x12,0x51,0xa5,0xaf,0x12,0x22,0xac,0x07,0xec,
  83806. +0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,
  83807. +0x80,0x0b,0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,
  83808. +0x1f,0xe5,0x1f,0x54,0x1f,0xff,0x90,0x9e,0x25,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,
  83809. +0x49,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x27,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x48,
  83810. +0x12,0x43,0x5f,0xe0,0xfe,0x90,0x9e,0x28,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  83811. +0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x29,0xcb,0xf0,0xa3,0xeb,
  83812. +0xf0,0xec,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,
  83813. +0xe0,0x90,0x9e,0x2b,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,
  83814. +0x28,0xe0,0x90,0x9e,0x25,0xf0,0xf5,0x1f,0xed,0x70,0x02,0xa1,0x13,0x90,0x9e,0x26,
  83815. +0xed,0xf0,0xe5,0x1f,0x30,0xe6,0x0a,0x90,0x9e,0x25,0xe0,0xf5,0x1f,0xa3,0xe0,0x14,
  83816. +0xf0,0x90,0x9e,0x26,0xe0,0x70,0x02,0xa1,0x13,0x90,0x9e,0x25,0xe0,0xff,0xd3,0x94,
  83817. +0x00,0x50,0x02,0xa1,0x13,0xe4,0x90,0x9e,0x24,0xf0,0xef,0x14,0x90,0x9e,0x23,0xf0,
  83818. +0x90,0x9e,0x27,0xe0,0xfd,0x90,0x9e,0x23,0xe0,0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,
  83819. +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,
  83820. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x2b,0xe0,0x5e,0xfe,0xa3,0xe0,
  83821. +0x5f,0x4e,0x70,0x27,0x90,0x9e,0x23,0xe0,0xff,0xc3,0x94,0x10,0x50,0x33,0x74,0x01,
  83822. +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,
  83823. +0x9e,0x29,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x16,0x90,0x9e,0x23,0xe0,0xf5,
  83824. +0x1f,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x26,0xe0,0xff,0x90,0x9e,0x24,0xe0,0x6f,0x60,
  83825. +0x08,0x90,0x9e,0x23,0xe0,0x14,0xf0,0x80,0x87,0x90,0x9e,0x26,0xe0,0xff,0x90,0x9e,
  83826. +0x24,0xe0,0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x23,0xe0,0xb5,0x05,0x06,0x90,0x9e,0x27,
  83827. +0xe0,0xf5,0x1f,0xe5,0x1f,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,
  83828. +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x1f,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,
  83829. +0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,
  83830. +0x13,0xff,0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,
  83831. +0xa3,0xef,0xf0,0xaf,0x04,0xad,0x1f,0x51,0xa5,0xaf,0x1f,0x22,0xad,0x07,0xed,0xc3,
  83832. +0x94,0x20,0x50,0x0d,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,
  83833. +0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1f,
  83834. +0xe5,0x1f,0x54,0x1f,0xfc,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,
  83835. +0xff,0x90,0x9e,0x23,0xf0,0xed,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,
  83836. +0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x24,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,
  83837. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x26,
  83838. +0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  83839. +0x83,0xe4,0x93,0xfa,0x74,0x01,0x93,0xfb,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,
  83840. +0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x7a,
  83841. +0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x9e,
  83842. +0x23,0xe0,0xff,0xeb,0xd3,0x9f,0x40,0x02,0xc1,0xab,0xeb,0xc3,0x94,0x10,0x40,0x21,
  83843. +0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,
  83844. +0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x24,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,
  83845. +0x23,0xeb,0xc3,0x94,0x10,0x50,0x40,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,
  83846. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x26,0xe0,0x5e,0xfe,0xa3,0xe0,
  83847. +0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09,0x90,0x9e,0x25,0xe0,0x30,0xe7,0x02,0x7b,0x17,
  83848. +0xeb,0x64,0x13,0x60,0x03,0xbb,0x12,0x09,0x90,0x9e,0x24,0xe0,0x30,0xe0,0x02,0x7b,
  83849. +0x18,0xac,0x03,0x8c,0x1f,0x80,0x34,0x0b,0x80,0x84,0x90,0x9e,0x23,0xe0,0xfb,0x6c,
  83850. +0x70,0x69,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x75,0xf0,
  83851. +0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5,0x1f,0x20,0xe6,
  83852. +0x07,0xec,0x44,0x40,0xf5,0x1f,0x80,0x03,0xaf,0x1f,0x22,0xec,0x25,0xe0,0x24,0x9e,
  83853. +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,
  83854. +0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,
  83855. +0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,
  83856. +0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b,0x40,0x56,
  83857. +0x90,0x9e,0x23,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,
  83858. +0xf0,0xac,0x07,0x8f,0x1f,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  83859. +0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,
  83860. +0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,
  83861. +0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,
  83862. +0xa3,0xef,0xf0,0xaf,0x1f,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,
  83863. +0xe4,0xf0,0xaf,0x05,0xe5,0x1f,0x44,0x80,0xfd,0x51,0xa5,0xe5,0x1f,0x44,0x80,0xff,
  83864. +0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,
  83865. +0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,
  83866. +0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,
  83867. +0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,
  83868. +0x22,0xe4,0xf5,0x14,0xe5,0x14,0xb4,0x20,0x14,0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,
  83869. +0x95,0x01,0xe0,0xff,0x90,0x9a,0xc5,0xe0,0xb5,0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,
  83870. +0xe5,0x14,0x90,0x96,0x4b,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x03,0x02,0x6e,0x6a,
  83871. +0xe5,0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,
  83872. +0xe0,0xd3,0x94,0x00,0xee,0x94,0x00,0x50,0x03,0x02,0x6e,0x6a,0xe5,0x14,0x94,0x20,
  83873. +0x40,0x09,0x90,0x9a,0xc5,0xe0,0x60,0x03,0x02,0x6e,0x76,0xe5,0x14,0x75,0xf0,0x0a,
  83874. +0xa4,0x24,0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,
  83875. +0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,
  83876. +0x90,0x9e,0x1b,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x14,0x25,0xe0,0x24,0xc4,0xf5,0x82,
  83877. +0xe4,0x34,0x98,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x1d,0xcf,0xf0,0xa3,0xef,
  83878. +0xf0,0xe5,0x14,0xc3,0x94,0x20,0x50,0x14,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,
  83879. +0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x19,0xf0,0x80,0x12,0x74,0xa6,0x25,0x14,
  83880. +0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  83881. +0x19,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x48,0x12,
  83882. +0x43,0x5f,0xe0,0x90,0x9e,0x20,0xf0,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,
  83883. +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x41,0x9f,0x90,0x9e,0x20,0xe0,0xff,0x90,
  83884. +0x9e,0x1a,0xe0,0x9f,0x40,0x13,0x90,0x9e,0x20,0xe0,0x90,0x9e,0x1a,0xf0,0xee,0x54,
  83885. +0x40,0xfe,0x90,0x9e,0x19,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,
  83886. +0x01,0x70,0x29,0x90,0x9e,0x1a,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x44,0x25,
  83887. +0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,
  83888. +0xda,0x80,0x30,0x90,0x9e,0x1a,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x9e,0x1a,0xe0,
  83889. +0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x44,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,
  83890. +0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x9e,0x1a,0xe0,
  83891. +0x90,0x41,0x2e,0x93,0x90,0x9e,0x1f,0xf0,0x90,0x9e,0x1f,0xe0,0x75,0xf0,0x06,0xa4,
  83892. +0x24,0x50,0xf9,0x74,0x40,0x35,0xf0,0xfa,0x7b,0xff,0x8b,0x15,0xf5,0x16,0x89,0x17,
  83893. +0xe5,0x14,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xf5,0x1b,
  83894. +0xa3,0xe0,0xf5,0x1c,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,
  83895. +0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,
  83896. +0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42,0x20,0xff,
  83897. +0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac,
  83898. +0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,
  83899. +0xaa,0x16,0xa9,0x17,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x18,0xaa,
  83900. +0x19,0xa9,0x1a,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,
  83901. +0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,
  83902. +0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,
  83903. +0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,
  83904. +0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x42,0x20,
  83905. +0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd,
  83906. +0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,
  83907. +0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x9e,
  83908. +0x1b,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,
  83909. +0x40,0x0c,0xe5,0x1c,0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,
  83910. +0x1b,0xf5,0x1c,0xe5,0x14,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,
  83911. +0xe5,0x1b,0xf0,0xa3,0xe5,0x1c,0xf0,0x90,0x9e,0x19,0xe0,0x25,0xe0,0x24,0x66,0xf5,
  83912. +0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,
  83913. +0x50,0x07,0xaf,0x14,0x12,0x65,0x5c,0xa1,0x31,0x90,0x9e,0x19,0xe0,0x25,0xe0,0x24,
  83914. +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,
  83915. +0x95,0x1b,0x50,0x02,0xa1,0x31,0x7d,0x01,0xaf,0x14,0x12,0x63,0xbd,0xa1,0x31,0x74,
  83916. +0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,
  83917. +0x81,0x3a,0x90,0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x1a,0xe0,0xc3,0x94,
  83918. +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x1a,0xe0,0xc3,0x94,0x11,
  83919. +0x40,0x2e,0x80,0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x1a,0xe0,
  83920. +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x1a,0xe0,0xc3,0x94,
  83921. +0x03,0x40,0x0d,0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,
  83922. +0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1e,0x74,0x44,
  83923. +0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,
  83924. +0x61,0xe7,0x90,0x9a,0x84,0xe0,0x64,0x01,0x60,0x02,0x61,0xe7,0x74,0x85,0x25,0x14,
  83925. +0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,
  83926. +0xe4,0x33,0xfe,0x74,0x41,0x25,0x14,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xfd,
  83927. +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,
  83928. +0x33,0xfe,0x74,0x44,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3,0x9f,
  83929. +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x14,0xf5,0x82,0xe4,
  83930. +0x34,0x9d,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x1a,0xe0,0x6f,0x60,0x3d,0x74,0x44,0x25,
  83931. +0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,
  83932. +0x1e,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1e,0x03,0x80,0x03,0x75,
  83933. +0x1e,0x01,0x74,0x41,0x25,0x14,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0,0x74,
  83934. +0x85,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x14,0xf5,0x82,
  83935. +0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,
  83936. +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1e,0x74,0xe6,0x25,0x14,0xf5,0x82,
  83937. +0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x1a,0xe0,0xff,0x74,0x26,0x25,0x14,
  83938. +0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,
  83939. +0x34,0x98,0xf5,0x83,0xe5,0x1e,0xf0,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x4c,0x12,
  83940. +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1e,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,
  83941. +0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xad,0x1e,0xa1,0x2c,0xec,0x64,0x06,0x60,0x02,0xa1,
  83942. +0x31,0xf5,0x1b,0xf5,0x1c,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x9e,0x1b,0xe0,
  83943. +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x9e,0x21,0xee,0xf0,0xa3,0xef,0xf0,0x74,
  83944. +0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1e,0xe4,0xf5,0x1d,
  83945. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x1d,0xa4,0xf5,0x82,0x85,0xf0,
  83946. +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x1d,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00,
  83947. +0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90,0x9e,
  83948. +0x22,0xe0,0x95,0x1c,0x90,0x9e,0x21,0xe0,0x95,0x1b,0x40,0x07,0x05,0x1d,0xe5,0x1d,
  83949. +0xb4,0x05,0xbd,0xe5,0x1d,0xc3,0x13,0xf5,0x1d,0xe5,0x1e,0xb4,0x01,0x06,0xe5,0x1d,
  83950. +0x70,0x46,0x80,0x13,0xe5,0x1e,0xb4,0x03,0x15,0xe5,0x1d,0x70,0x05,0x75,0x1e,0x03,
  83951. +0x80,0x39,0xe5,0x1d,0xb4,0x01,0x05,0x75,0x1e,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1e,
  83952. +0xb4,0x05,0x28,0xe5,0x1d,0x70,0x05,0x75,0x1e,0x05,0x80,0x0d,0xe5,0x1d,0xb4,0x01,
  83953. +0x05,0x75,0x1e,0x03,0x80,0x03,0x75,0x1e,0x01,0xd3,0x90,0x9e,0x1e,0xe0,0x94,0x03,
  83954. +0x90,0x9e,0x1d,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1e,0xd3,0x90,0x9e,0x1e,0xe0,
  83955. +0x94,0x03,0x90,0x9e,0x1d,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1e,0x74,0x84,0x25,
  83956. +0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1e,0xf0,0xfd,0xaf,0x14,0x12,0x67,
  83957. +0x61,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94,0x05,
  83958. +0x74,0xe6,0x50,0x0e,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04,0xf0,
  83959. +0x80,0x0b,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x1d,
  83960. +0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x74,0xff,0x9f,0xfd,0x74,0xff,0x9e,0xfc,0xe5,0x14,
  83961. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xd3,
  83962. +0x9d,0xea,0x9c,0xe5,0x14,0x50,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,
  83963. +0xf5,0x83,0xee,0x8f,0xf0,0x12,0x42,0x81,0x80,0x10,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  83964. +0xe4,0x34,0x9a,0xf5,0x83,0x74,0xff,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x44,
  83965. +0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x74,0xff,0x9f,
  83966. +0xfd,0x74,0xff,0x9e,0xfc,0xe5,0x14,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,
  83967. +0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xd3,0x9d,0xea,0x9c,0xe5,0x14,0x50,0x13,0x25,0xe0,
  83968. +0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xee,0x8f,0xf0,0x12,0x42,0x81,0x80,
  83969. +0x10,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xff,0xf0,0xa3,
  83970. +0xf0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x18,0xaa,
  83971. +0x19,0xa9,0x1a,0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,
  83972. +0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,
  83973. +0x08,0xe4,0xf5,0xf0,0x12,0x43,0x19,0xe5,0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,
  83974. +0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0xc4,0xf5,0x82,
  83975. +0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x44,0xf5,
  83976. +0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x14,0xe5,0x14,0xc3,0x94,
  83977. +0x40,0x50,0x03,0x02,0x67,0xa4,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,
  83978. +0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,
  83979. +0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd,0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,
  83980. +0x01,0x04,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f,0xe4,
  83981. +0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0,0xa3,
  83982. +0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,
  83983. +0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,
  83984. +0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,
  83985. +0xe4,0x34,0x9d,0xf5,0x83,0x74,0x13,0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,
  83986. +0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,
  83987. +0xed,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83988. +0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83989. +0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83990. +0xed,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83991. +0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83992. +0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  83993. +0x74,0x86,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,
  83994. +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,
  83995. +0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,
  83996. +0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,
  83997. +0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,
  83998. +0xf0,0x09,0xed,0x90,0x96,0x4b,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,
  83999. +0x90,0x96,0x4a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,
  84000. +0x95,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x5f,
  84001. +0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x5f,0xe4,
  84002. +0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0x74,
  84003. +0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x49,0x12,0x43,0x5f,0xe4,0xf0,0xed,0xc3,
  84004. +0x94,0x20,0x50,0x0f,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,
  84005. +0xf0,0x80,0x0d,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,
  84006. +0x0d,0xed,0x64,0x40,0x60,0x03,0x02,0x6e,0xa5,0x22,0x12,0x29,0xd9,0xf5,0x14,0xc3,
  84007. +0x94,0x40,0x50,0x15,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x44,0x25,0x14,0xf5,
  84008. +0x82,0xe4,0x34,0x9a,0xf5,0x83,0xef,0xf0,0x22,0xe5,0x14,0xb4,0x40,0x0a,0x90,0x00,
  84009. +0x02,0x12,0x42,0x20,0x90,0x96,0x42,0xf0,0x22,0x90,0x9e,0x30,0x12,0x43,0x8b,0x90,
  84010. +0x9e,0x33,0xe0,0x54,0xf0,0x44,0x02,0xf0,0x54,0x0f,0x44,0xc0,0xf0,0x90,0x9e,0x30,
  84011. +0x12,0x43,0x6b,0x90,0x9e,0x90,0x12,0x43,0x8b,0x7b,0x01,0x7a,0x9e,0x79,0x33,0x02,
  84012. +0x53,0xf1,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x90,0x00,0x01,0x12,0x42,0x20,0xfc,
  84013. +0xed,0xc3,0x94,0x40,0x40,0x02,0xe4,0xfd,0xec,0xc3,0x94,0x40,0x40,0x02,0xe4,0xfc,
  84014. +0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,
  84015. +0xfb,0xea,0x90,0x9e,0x24,0xf0,0xeb,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,
  84016. +0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x26,0xf0,0xeb,
  84017. +0xa3,0xf0,0xa3,0xed,0xf0,0xa3,0x74,0xff,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  84018. +0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x2a,0xf0,0xeb,
  84019. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfa,
  84020. +0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x2c,0xf0,0xeb,0xa3,0xf0,0xa3,0xec,0xf0,0xa3,0x74,
  84021. +0xff,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,
  84022. +0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,
  84023. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,
  84024. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,
  84025. +0xa3,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x24,0x01,0x79,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  84026. +0xd0,0x90,0x9e,0xa4,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,
  84027. +0xa4,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9e,0xa7,
  84028. +0xe0,0x94,0xe8,0x90,0x9e,0xa6,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,
  84029. +0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x9e,0xa6,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,
  84030. +0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,
  84031. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x24,0x12,0x2a,0x8b,0x00,0x00,0x00,
  84032. +0x00,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x9e,0x66,0xf0,0x90,0x00,0x03,0x12,0x42,
  84033. +0x20,0x90,0x9e,0x55,0xf0,0x12,0x56,0x22,0x90,0x01,0xe5,0xe5,0x63,0xf0,0x90,0x9e,
  84034. +0x66,0xe0,0x90,0x01,0xe6,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x02,0x12,0x42,
  84035. +0x20,0xff,0x30,0xe0,0x25,0x12,0x29,0xd9,0x90,0x9e,0x5c,0xf0,0x90,0x00,0x01,0x12,
  84036. +0x42,0x20,0x90,0x9e,0x5d,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x5b,0xf0,0x90,
  84037. +0x00,0x03,0x12,0x42,0x20,0x90,0x9e,0x62,0xf0,0x22,0x90,0x9e,0x5c,0x74,0x0a,0xf0,
  84038. +0x90,0x9e,0x5d,0x74,0x05,0xf0,0x90,0x9e,0x5b,0x74,0x14,0xf0,0x90,0x9e,0x62,0x74,
  84039. +0x05,0xf0,0x22,0x12,0x29,0xd9,0x30,0xe0,0x19,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x61,
  84040. +0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x9e,0x5f,0xe4,0xf0,0xa3,0xef,0xf0,
  84041. +0x80,0x0f,0x90,0x9e,0x61,0x74,0x07,0xf0,0x90,0x9e,0x5f,0xe4,0xf0,0xa3,0x74,0x03,
  84042. +0xf0,0x90,0x9e,0x5f,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0x90,0x9e,0x24,0x12,
  84043. +0x2a,0x8b,0x00,0x00,0x00,0x00,0x12,0x29,0xd9,0x60,0x0d,0x90,0x9e,0x5e,0xf0,0xe4,
  84044. +0xfd,0x7f,0x04,0x12,0x54,0xe7,0x80,0x05,0xe4,0x90,0x9e,0x5e,0xf0,0x90,0x9e,0x5e,
  84045. +0xe0,0x90,0x01,0xe7,0xf0,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,
  84046. +0x05,0xed,0x2e,0x90,0x9e,0x78,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,
  84047. +0x90,0x9e,0x79,0xf0,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x7a,
  84048. +0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x7b,0xf0,0x90,0x00,
  84049. +0x04,0x12,0x42,0x20,0xff,0xae,0x05,0xed,0x2f,0x90,0x9e,0x7c,0xf0,0x22,0xd3,0x10,
  84050. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x24,0x12,0x43,0x8b,0x90,0x9e,0x24,0x12,0x43,
  84051. +0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,
  84052. +0x90,0x9e,0x24,0x12,0x43,0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,
  84053. +0x29,0xd9,0xff,0x60,0x2d,0xb5,0x65,0x16,0x90,0x9e,0x24,0x12,0x43,0x6b,0x90,0x00,
  84054. +0x01,0x12,0x42,0xc2,0x65,0x67,0x70,0x04,0xe5,0x66,0x65,0xf0,0x60,0x24,0x90,0x9e,
  84055. +0x24,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x12,0x4e,0x37,
  84056. +0x80,0x10,0x90,0x9e,0x24,0x12,0x43,0x6b,0x12,0x29,0xd9,0x65,0x65,0x60,0x03,0x12,
  84057. +0x44,0xc2,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,
  84058. +0xa3,0xf0,0xa3,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x24,0x14,0x70,0x1a,0x7b,0x01,
  84059. +0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x71,0xb0,0xbf,0x01,0x09,0x90,0x06,0x35,
  84060. +0xe0,0x54,0x0f,0xf0,0x80,0x04,0x80,0x00,0x80,0xcd,0xe4,0x90,0x06,0x34,0xf0,0x22,
  84061. +0x8e,0x14,0x8f,0x15,0x8b,0x16,0x8a,0x17,0x89,0x18,0xe4,0x90,0x9e,0x19,0xf0,0xef,
  84062. +0x90,0x00,0x31,0xf0,0x12,0x4d,0x45,0xe5,0x14,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,
  84063. +0x54,0xfc,0x4f,0xf0,0x12,0x4d,0x45,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4d,
  84064. +0x45,0x90,0x00,0x33,0xe0,0x20,0xe7,0x0e,0x90,0x9e,0x19,0xe0,0xc3,0x94,0x64,0x50,
  84065. +0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90,0x9e,0x19,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,
  84066. +0x00,0x30,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,
  84067. +0x00,0x22,0xe4,0x90,0x9e,0xac,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,
  84068. +0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,
  84069. +0x9e,0xad,0xe0,0x94,0xe8,0x90,0x9e,0xac,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,
  84070. +0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x9e,0xac,0xe4,0x75,0xf0,0x01,0x12,0x42,
  84071. +0x81,0x80,0xc6,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4d,0x45,0x90,0x9d,0xff,
  84072. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,
  84073. +0x90,0x9e,0x03,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,
  84074. +0x12,0x2f,0xd9,0x90,0x9e,0x07,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  84075. +0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x0b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  84076. +0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,
  84077. +0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x11,
  84078. +0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x34,
  84079. +0x81,0x22,0x7f,0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xff,0x12,0x2a,0x7f,0x7f,
  84080. +0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x9e,0x03,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,
  84081. +0x12,0x27,0xde,0x90,0x9e,0x07,0x12,0x2a,0x7f,0x90,0x9e,0x80,0xe0,0x90,0x9d,0xff,
  84082. +0xb4,0x01,0x0d,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,
  84083. +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,
  84084. +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x03,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,
  84085. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x9e,0x07,
  84086. +0x12,0x43,0x53,0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,
  84087. +0x7e,0x08,0x12,0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9e,0x0b,0x12,
  84088. +0x2a,0x7f,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,
  84089. +0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,
  84090. +0x12,0x34,0x81,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,
  84091. +0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,
  84092. +0xf6,0xf0,0x02,0x4d,0x45,0xef,0x70,0x02,0xe1,0x5c,0x90,0x9e,0x0f,0xe0,0x60,0x03,
  84093. +0x02,0x7b,0x28,0x90,0x9d,0xfb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  84094. +0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9d,0xa7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  84095. +0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9d,0xab,0x12,0x43,0x53,0x90,
  84096. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9d,0xaf,0x12,
  84097. +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  84098. +0x9d,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,
  84099. +0x2f,0xd9,0x90,0x9d,0xb7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,
  84100. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xbb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,
  84101. +0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xbf,0x12,0x43,0x53,0x90,0x80,
  84102. +0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xc3,0x12,0x43,
  84103. +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,
  84104. +0xc7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,
  84105. +0xd9,0x90,0x9d,0xcb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,
  84106. +0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xcf,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,
  84107. +0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xd3,0x12,0x43,0x53,0x90,0x80,0x85,
  84108. +0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xd7,0x12,0x43,0x53,
  84109. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xdb,
  84110. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,
  84111. +0x90,0x9d,0xdf,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,
  84112. +0x12,0x2f,0xd9,0x90,0x9d,0xe3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  84113. +0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xe7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  84114. +0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xeb,0x12,0x43,0x53,0x90,
  84115. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x9d,0xef,0x12,
  84116. +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,
  84117. +0x9d,0xf3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,
  84118. +0x2f,0xd9,0x90,0x9d,0xf7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,
  84119. +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x0f,0x74,0x01,0xf0,0x22,0x90,0x9e,0x0f,0xe0,
  84120. +0x64,0x01,0x60,0x03,0x02,0x7b,0x28,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,
  84121. +0xfb,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xa7,0x12,0x2a,
  84122. +0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xab,0x12,0x2a,0x7f,0x7f,0x6c,
  84123. +0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xaf,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,
  84124. +0x27,0xde,0x90,0x9d,0xb3,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,
  84125. +0x9d,0xb7,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xbb,0x12,
  84126. +0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xbf,0x12,0x2a,0x7f,0x7f,
  84127. +0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xc3,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,
  84128. +0x12,0x27,0xde,0x90,0x9d,0xc7,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,
  84129. +0x90,0x9d,0xcb,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xcf,
  84130. +0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xd3,0x12,0x2a,0x7f,
  84131. +0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xd7,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,
  84132. +0x0e,0x12,0x27,0xde,0x90,0x9d,0xdb,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,
  84133. +0xde,0x90,0x9d,0xdf,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,
  84134. +0xe3,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xe7,0x12,0x2a,
  84135. +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x9d,0xeb,0x12,0x2a,0x7f,0x7f,0x04,
  84136. +0x7e,0x0d,0x12,0x27,0xde,0x90,0x9d,0xef,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,
  84137. +0x27,0xde,0x90,0x9d,0xf3,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,
  84138. +0x9d,0xf7,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,
  84139. +0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec,0x90,0x9e,0xa8,
  84140. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  84141. +0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,
  84142. +0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,
  84143. +0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,
  84144. +0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,
  84145. +0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,
  84146. +0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,
  84147. +0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,
  84148. +0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,
  84149. +0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,
  84150. +0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  84151. +0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,
  84152. +0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,
  84153. +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,
  84154. +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,
  84155. +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,
  84156. +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,
  84157. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,
  84158. +0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,
  84159. +0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x9e,
  84160. +0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xe4,0xff,0xec,0x90,0x9e,0xa8,
  84161. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x9e,
  84162. +0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,
  84163. +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x9e,
  84164. +0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,
  84165. +0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,
  84166. +0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  84167. +0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  84168. +0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xe4,0xff,0xec,0x90,
  84169. +0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x11,0xff,0xec,
  84170. +0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  84171. +0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  84172. +0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xed,0x54,0x0f,0xfd,
  84173. +0xec,0x54,0xf0,0xfc,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,
  84174. +0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,
  84175. +0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,
  84176. +0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,
  84177. +0xa8,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,
  84178. +0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,
  84179. +0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,
  84180. +0x12,0x2f,0xd9,0xe4,0x90,0x9e,0x0f,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,
  84181. +0x9e,0x43,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x14,
  84182. +0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x49,0x05,0x7d,0x40,
  84183. +0x7f,0x01,0x12,0x36,0xaf,0xe5,0x14,0x24,0xff,0x92,0xaf,0x22,0x90,0x9e,0x3a,0xe0,
  84184. +0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0,0x81,0x14,0x90,0x9e,0x3a,0xe0,0x64,0x14,
  84185. +0x60,0x02,0x81,0x14,0x90,0x9e,0x49,0xe0,0x70,0x25,0x90,0x9e,0x4c,0xe0,0x70,0x1f,
  84186. +0x90,0x9e,0x4a,0xe0,0x70,0x19,0x90,0x9e,0x4d,0xe0,0x70,0x13,0x90,0x9e,0x4b,0xe0,
  84187. +0x70,0x0d,0x90,0x9e,0x4e,0xe0,0x70,0x07,0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,
  84188. +0x9e,0x49,0xe0,0x90,0x04,0x44,0xf0,0x90,0x9e,0x4a,0xe0,0x90,0x04,0x45,0xf0,0x90,
  84189. +0x9e,0x4b,0xe0,0x90,0x04,0x46,0xf0,0xa3,0xe4,0xf0,0x90,0x9e,0x4c,0xe0,0x90,0x04,
  84190. +0x48,0xf0,0x90,0x9e,0x4d,0xe0,0x90,0x04,0x49,0xf0,0x90,0x9e,0x4e,0xe0,0x90,0x04,
  84191. +0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x9e,0x35,0xe0,0x90,0x04,0x4c,0xf0,0x90,0x9e,0x36,
  84192. +0xe0,0x90,0x04,0x4d,0xf0,0x90,0x9e,0x37,0xe0,0x90,0x04,0x4e,0xf0,0x90,0x9e,0x38,
  84193. +0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x9e,0x3a,0xf0,0x90,0x9e,0x35,0x04,0xf0,0xe4,
  84194. +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0x49,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,
  84195. +0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x19,0xf0,0x90,0x05,0x61,0xe0,
  84196. +0x90,0x9e,0x1a,0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x1b,0xf0,0x90,0x05,0x63,0xe0,
  84197. +0x90,0x9e,0x1c,0xf0,0x90,0x9e,0x52,0xe0,0xff,0x90,0x9e,0x1c,0xe0,0xfe,0xd3,0x9f,
  84198. +0x50,0x0b,0x90,0x9e,0x52,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x9e,0x40,
  84199. +0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x9e,0x44,0xe0,0xff,0x12,0x4c,0xf0,0x22,0x90,
  84200. +0x9e,0x53,0xe0,0x64,0x01,0x60,0x08,0x90,0x9e,0x41,0xe0,0x60,0x02,0xa1,0x36,0x90,
  84201. +0x9e,0x35,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x9e,0x36,
  84202. +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x9e,0x37,0xe0,
  84203. +0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x36,0xf0,0x80,0x15,0x90,
  84204. +0x9e,0x38,0xe0,0xc3,0x94,0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x37,0xf0,
  84205. +0x90,0x9e,0x36,0xf0,0x90,0x9e,0x35,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,
  84206. +0xe0,0x30,0xe2,0x32,0x90,0x9e,0x49,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,
  84207. +0x80,0x24,0x90,0x9e,0x4a,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,
  84208. +0x11,0x90,0x9e,0x4b,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x9e,
  84209. +0x4a,0xf0,0x90,0x9e,0x49,0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x9e,0x4c,
  84210. +0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x9e,0x4d,0xe0,0xc3,
  84211. +0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x9e,0x4e,0xe0,0xc3,0x94,
  84212. +0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x4d,0xf0,0x90,0x9e,0x4c,0xf0,0x90,
  84213. +0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x00,0x37,0xda,};
  84214. +
  84215. +// =================== v79 UMC A Cut COMMON 2011-10-06 =====================
  84216. +u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength] = {
  84217. +0xc1,0x88,0x02,0x00,0x4f,0x00,0x00,0x00,0x0a,0x06,0x18,0x09,0x58,0x3f,0x01,0x00,
  84218. +0x61,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84219. +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84220. +0x00,0x00,0x00,0x02,0x5a,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84221. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84222. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84223. +0x00,0x00,0x00,0x02,0x5f,0xfb,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00,
  84224. +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02,
  84225. +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09,
  84226. +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08,
  84227. +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18,
  84228. +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21,
  84229. +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20,
  84230. +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10,
  84231. +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20,
  84232. +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04,
  84233. +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,
  84234. +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b,
  84235. +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c,
  84236. +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,
  84237. +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,
  84238. +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,
  84239. +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,
  84240. +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,
  84241. +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,
  84242. +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,
  84243. +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,
  84244. +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,
  84245. +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,
  84246. +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,
  84247. +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,
  84248. +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,
  84249. +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,
  84250. +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,
  84251. +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,
  84252. +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84253. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  84254. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  84255. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  84256. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  84257. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  84258. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  84259. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  84260. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,
  84261. +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,
  84262. +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,
  84263. +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,
  84264. +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,
  84265. +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,
  84266. +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,
  84267. +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,
  84268. +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,
  84269. +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,
  84270. +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,
  84271. +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec,
  84272. +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4,
  84273. +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,
  84274. +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82,
  84275. +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0,
  84276. +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,
  84277. +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,
  84278. +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0xa9,
  84279. +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,
  84280. +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,
  84281. +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,
  84282. +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60,
  84283. +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,
  84284. +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,
  84285. +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,
  84286. +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x41,0x9e,0x66,
  84287. +0x00,0x41,0x9e,0xae,0x00,0x41,0x9e,0x4d,0x80,0x41,0x9e,0x4e,0x80,0x41,0x9e,0xb0,
  84288. +0x00,0x00,0xf0,0x90,0x9e,0x57,0xe0,0x90,0x9e,0x8a,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,
  84289. +0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x88,0xeb,0xf0,0xa3,0xe0,
  84290. +0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x30,0x62,0xd0,0xd0,0x92,0xaf,0x22,
  84291. +0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x89,0xf0,
  84292. +0x90,0x9e,0x55,0xe0,0x90,0x9e,0x8a,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,
  84293. +0x62,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x9e,0x5c,
  84294. +0x14,0xf0,0x90,0x9e,0x5e,0xe0,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x02,0xf1,0x16,0x22,
  84295. +0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x22,0x7f,0x60,0x7e,
  84296. +0x01,0x80,0xed,0x90,0x9e,0x60,0xe0,0xff,0x7d,0x01,0xe1,0x1a,0xb1,0xb1,0xbf,0x01,
  84297. +0x0f,0x90,0x9e,0x68,0xe0,0xff,0xe4,0xfd,0xf1,0xfe,0x90,0x04,0x1f,0x74,0x20,0xf0,
  84298. +0x22,0x90,0x01,0xca,0xe5,0x25,0xf0,0xef,0x60,0x03,0x12,0x4f,0x2a,0x22,0x22,0x22,
  84299. +0x22,0x22,0x00,0x02,0x60,0x8d,0x02,0x60,0x94,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  84300. +0x8b,0x1b,0x8a,0x1c,0x89,0x1d,0x90,0x9e,0x8b,0x71,0x8b,0xab,0x1e,0xaa,0x1f,0xa9,
  84301. +0x20,0x90,0x9e,0x8e,0x71,0x8b,0xaf,0x21,0x15,0x21,0xef,0x60,0x1b,0x90,0x9e,0x8e,
  84302. +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x24,0x62,0xff,0x90,0x9e,0x8b,0xe4,0x75,0xf0,
  84303. +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0xd0,0xd0,
  84304. +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x50,0x54,0xc0,0x70,0x0d,0x90,0x9e,0x63,
  84305. +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xd3,0xe5,0x50,0x30,0xe6,0x17,0x90,
  84306. +0x9e,0x63,0xe0,0x44,0x01,0xf0,0x90,0x9e,0x61,0xe0,0x64,0x02,0x60,0x04,0x91,0xdc,
  84307. +0x80,0x0b,0x91,0x80,0x80,0x07,0x90,0x9e,0x63,0xe0,0x54,0xfe,0xf0,0xe5,0x50,0x90,
  84308. +0x9e,0x63,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x9e,0x89,0x91,0x52,0x90,
  84309. +0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x62,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0,
  84310. +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,
  84311. +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,
  84312. +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0,
  84313. +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,
  84314. +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,
  84315. +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,
  84316. +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,
  84317. +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,
  84318. +0x30,0xe1,0x08,0x90,0x01,0x3c,0x74,0x02,0xf0,0xf1,0xbc,0xe5,0x34,0x30,0xe2,0x38,
  84319. +0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x24,0x90,0x9e,0x89,
  84320. +0xe4,0xf0,0x90,0x9e,0x55,0xe0,0x90,0x9e,0x8a,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,
  84321. +0x01,0x91,0x62,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,
  84322. +0x07,0x90,0x9e,0x5d,0xe4,0xf0,0x91,0xd3,0xe5,0x34,0x30,0xe3,0x38,0x90,0x01,0x3c,
  84323. +0x74,0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x24,0x90,0x9e,0x89,0xe4,0xf0,0x90,
  84324. +0x9e,0x55,0xe0,0x90,0x9e,0x8a,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x62,
  84325. +0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x9e,
  84326. +0x5c,0xe4,0xf0,0x91,0xd3,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,
  84327. +0x12,0x4d,0xe2,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x4e,
  84328. +0x25,0xe5,0x35,0x30,0xe0,0x1a,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,
  84329. +0x44,0x7f,0xf0,0x90,0x00,0x83,0xe0,0x90,0x9e,0x60,0xf0,0x12,0x64,0xa1,0x91,0xd3,
  84330. +0x74,0xdf,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,
  84331. +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,
  84332. +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x7d,0x01,0x7f,0x0c,0x8f,0x71,0x8d,0x72,0xe5,0x71,
  84333. +0x54,0x0f,0xff,0x90,0x9e,0x5e,0xe0,0x54,0x0f,0x6f,0x60,0x72,0xe5,0x71,0x30,0xe2,
  84334. +0x2b,0x90,0x9e,0x5e,0xe0,0x20,0xe2,0x05,0x7f,0x01,0x12,0x63,0x92,0x90,0x9e,0x5e,
  84335. +0xe0,0x30,0xe3,0x07,0xe5,0x71,0x20,0xe3,0x02,0x80,0x54,0x90,0x9e,0x5e,0xe0,0x20,
  84336. +0xe3,0x4c,0xe5,0x71,0x30,0xe3,0x47,0xaf,0x72,0x02,0x63,0x2e,0x90,0x9e,0x5e,0xe0,
  84337. +0x54,0x0f,0xff,0xbf,0x0c,0x0d,0xe5,0x71,0x20,0xe3,0x08,0x12,0x5e,0xf1,0xef,0x60,
  84338. +0x2d,0xf1,0x9f,0x90,0x9e,0x5e,0xe0,0x54,0x0f,0xff,0xbf,0x04,0x0e,0xe5,0x71,0x20,
  84339. +0xe2,0x09,0x12,0x62,0x50,0xef,0x60,0x16,0x12,0x48,0xaa,0x90,0x9e,0x5e,0xe0,0x54,
  84340. +0x0f,0xff,0xbf,0x02,0x09,0x12,0x62,0xbb,0xef,0x60,0x03,0x12,0x64,0x87,0x22,0x90,
  84341. +0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x73,0xb4,0x01,0x05,0x7f,0x01,0x12,0x63,0x4d,
  84342. +0x90,0x9e,0x5e,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x9e,0x62,0xe0,
  84343. +0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x2b,0x80,0x27,
  84344. +0x90,0x9e,0x51,0xe0,0x04,0xf0,0x90,0x9e,0x63,0xe0,0x54,0xef,0xf0,0x90,0x9e,0x56,
  84345. +0xe0,0xff,0x90,0x9e,0x51,0xe0,0xd3,0x9f,0x40,0x0d,0xe5,0x73,0xb4,0x01,0x0a,0xa3,
  84346. +0xe0,0x70,0x06,0xe0,0x04,0xf0,0x22,0x91,0xd3,0x22,0xe0,0xff,0x7d,0x01,0x90,0x9e,
  84347. +0x9c,0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x74,0x60,0x04,0xe4,
  84348. +0xff,0x11,0x8f,0x90,0x9e,0x9c,0xe0,0x30,0xe0,0x09,0x90,0x9e,0x9e,0xe4,0xf0,0xa3,
  84349. +0x74,0x80,0xf0,0x90,0x9e,0x9c,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,
  84350. +0x25,0xef,0xf0,0x90,0x9e,0x9d,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,
  84351. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,
  84352. +0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x9e,0x9e,0xa3,0xe0,0xff,0xfd,0x24,
  84353. +0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,
  84354. +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,
  84355. +0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x9e,0x9e,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,
  84356. +0x60,0x0b,0x90,0x9e,0x77,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x9e,0x77,
  84357. +0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x77,0x66,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,
  84358. +0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x77,0x1c,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,
  84359. +0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d,0xe5,0x74,0x60,0x04,0x7f,0x01,0x11,
  84360. +0x8f,0x11,0xdf,0x90,0x9e,0x5e,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x7f,
  84361. +0x78,0x7e,0x08,0x12,0x22,0x65,0x90,0x9d,0xff,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,
  84362. +0x12,0x22,0x65,0x90,0x9e,0x03,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x22,0x65,
  84363. +0x90,0x9e,0x07,0x12,0x25,0x08,0x90,0x9e,0x77,0xe0,0x90,0x9d,0xff,0xb4,0x01,0x0d,
  84364. +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53,
  84365. +0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,
  84366. +0x2b,0x08,0x90,0x9e,0x03,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x96,
  84367. +0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x9e,0x07,0x12,0x43,0x53,
  84368. +0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,
  84369. +0x2b,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9e,0x0b,0x12,0x25,0x08,0x90,
  84370. +0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,
  84371. +0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x30,0x2c,
  84372. +0x90,0x9e,0x77,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,
  84373. +0x00,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x80,
  84374. +0x08,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  84375. +0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  84376. +0x90,0x9e,0xad,0xed,0xf0,0x90,0x9e,0xac,0xef,0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,
  84377. +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,
  84378. +0x47,0xe0,0x5f,0xf0,0x31,0xb9,0x90,0x9e,0xac,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,
  84379. +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x31,0xb9,0x90,
  84380. +0x9e,0xad,0xe0,0x60,0x16,0x90,0x9e,0xac,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  84381. +0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x66,0x90,0x9e,0xac,0xe0,0xff,
  84382. +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,
  84383. +0x80,0x6b,0x90,0x9e,0xac,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,
  84384. +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x31,0xb1,0x90,0x9e,0xac,0xe0,0xff,
  84385. +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,
  84386. +0x4f,0xf0,0x31,0xb9,0x90,0x9e,0xad,0xe0,0x60,0x1b,0x90,0x9e,0xac,0xe0,0xff,0x74,
  84387. +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,
  84388. +0x42,0xe0,0x4f,0x80,0x1a,0x90,0x9e,0xac,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  84389. +0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,
  84390. +0x31,0xb9,0xd0,0xd0,0x92,0xaf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd,0x7f,
  84391. +0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0x31,
  84392. +0xb9,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x14,0x60,0x30,0x14,0x60,0x66,0x24,0x02,0x60,
  84393. +0x02,0x61,0x7d,0x90,0x9e,0x1a,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,
  84394. +0x7f,0x48,0x51,0xc1,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x51,0xc1,0x90,
  84395. +0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x71,0xe4,0x90,0x9e,0x1a,0xf0,0x90,
  84396. +0x9e,0x16,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,
  84397. +0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x51,0xc1,0x90,0x00,0x45,
  84398. +0xe0,0x54,0xef,0xfd,0x7f,0x45,0x51,0xc1,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,
  84399. +0x46,0x80,0x38,0x90,0x9e,0x1a,0x74,0x01,0xf0,0x90,0x9e,0x20,0x12,0x43,0x53,0x90,
  84400. +0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,
  84401. +0x44,0x20,0xfd,0x7f,0x45,0x51,0xc1,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,
  84402. +0x51,0xc1,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x51,0xc1,0x22,0x90,0x00,
  84403. +0x02,0x12,0x42,0x20,0x90,0x9e,0x1c,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25,0xe0,
  84404. +0x25,0xe0,0x90,0x9e,0x1b,0xf0,0x12,0x24,0x62,0x25,0xe0,0x25,0xe0,0x90,0x9e,0x1f,
  84405. +0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x2a,0xf0,0x90,0x05,0x61,0xe0,0x90,0x9e,0x2b,
  84406. +0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x2c,0xf0,0x90,0x05,0x63,0xe0,0x90,0x9e,0x2d,
  84407. +0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x3f,0xf0,0xc2,0xaf,0x90,0x9e,0x1b,0xe0,0xff,
  84408. +0xd1,0xd8,0x90,0x9e,0x3f,0xe0,0x24,0xff,0x92,0xaf,0x90,0x9e,0x1c,0xe0,0x70,0x02,
  84409. +0x81,0x84,0x90,0x9e,0x1b,0xe0,0x70,0x02,0x81,0x84,0x90,0x9e,0x1f,0xe0,0x70,0x02,
  84410. +0x81,0x84,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x3f,0xf0,0xc2,0xaf,0x90,0x9e,0x2e,0x74,
  84411. +0x01,0xf0,0x90,0x9e,0x3f,0xe0,0x24,0xff,0x92,0xaf,0x51,0xb8,0x90,0x00,0x46,0xe0,
  84412. +0x44,0x01,0xfd,0x7f,0x46,0x51,0xc1,0x90,0x9e,0x14,0xe0,0x60,0x15,0x90,0x9e,0x20,
  84413. +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,
  84414. +0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,
  84415. +0x45,0x51,0xc1,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x9e,0x2a,0xe0,0x90,0x05,
  84416. +0x84,0xf0,0x90,0x9e,0x2b,0xe0,0x90,0x05,0x85,0xf0,0x90,0x9e,0x2c,0xe0,0x90,0x05,
  84417. +0x86,0xf0,0x90,0x9e,0x2d,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x9e,
  84418. +0x3f,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,
  84419. +0x31,0xb7,0x80,0x2b,0x90,0x9e,0x1c,0xe0,0x70,0x2d,0x90,0x9e,0x2e,0x51,0xb7,0x90,
  84420. +0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x51,0xc1,0x90,0x05,0x22,0xe4,0xf0,0xa2,
  84421. +0xaf,0x33,0x90,0x9e,0x3f,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x31,0x49,0x90,
  84422. +0x9e,0x3f,0xe0,0x24,0xff,0x92,0xaf,0x22,0x8b,0x59,0x8a,0x5a,0x89,0x5b,0x90,0x00,
  84423. +0x02,0x12,0x42,0x20,0x90,0x9e,0x1d,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x9e,0x14,0x74,
  84424. +0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x22,0x65,0x90,0x9e,0x16,0x12,0x25,0x08,0xab,
  84425. +0x59,0xaa,0x5a,0xa9,0x5b,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,
  84426. +0x78,0x1a,0x12,0x24,0xf5,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x9e,0x16,
  84427. +0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43,0x46,0x90,0x9e,0x20,0x12,0x25,0x08,
  84428. +0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90,0x9e,0x14,0xf0,0x7f,0x80,0x7e,0x08,
  84429. +0x12,0x22,0x65,0xec,0x54,0x03,0xfc,0xec,0x44,0xc0,0xfc,0x90,0x9e,0x16,0x12,0x25,
  84430. +0x08,0x90,0x9e,0x16,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,
  84431. +0x08,0x12,0x2b,0x08,0x90,0x9e,0x1d,0xe0,0x30,0xe1,0x19,0x7d,0x0c,0x7f,0x47,0x51,
  84432. +0xc1,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x51,0xc1,0x90,0x00,0x46,0xe0,
  84433. +0x44,0x10,0x80,0x1c,0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x51,0xc1,0x90,
  84434. +0x00,0x48,0xe0,0x54,0xf3,0xfd,0x7f,0x48,0x51,0xc1,0x90,0x00,0x46,0xe0,0x54,0xef,
  84435. +0xfd,0x7f,0x46,0x51,0xc1,0xe4,0x90,0x9e,0x1a,0xf0,0x22,0x90,0x01,0x3c,0x74,0xff,
  84436. +0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,
  84437. +0x7f,0x54,0x51,0xc1,0x7d,0xff,0x7f,0x55,0x51,0xc1,0x7d,0xff,0x7f,0x56,0x51,0xc1,
  84438. +0x7d,0xff,0x7f,0x57,0x41,0xc1,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,
  84439. +0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x51,0xc1,
  84440. +0xe4,0xfd,0x7f,0x51,0x51,0xc1,0xe4,0xfd,0x7f,0x52,0x51,0xc1,0xe4,0xfd,0x7f,0x53,
  84441. +0x41,0xc1,0xe5,0x22,0x64,0x01,0x70,0x3c,0xf1,0xbe,0xbf,0x01,0x05,0x7f,0x01,0x12,
  84442. +0x44,0xf1,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x51,0xc1,0x90,0x00,0x44,
  84443. +0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x51,0xc1,0x90,0x00,0x46,0xe0,0x54,0xfb,0xfd,0x7f,
  84444. +0x46,0x51,0xc1,0x7f,0x02,0xf1,0xea,0x8f,0x26,0x90,0x01,0xc9,0xe5,0x26,0xf0,0xb4,
  84445. +0x01,0x02,0xf1,0x2a,0x22,0x90,0x9e,0x1c,0xe0,0x64,0x01,0x60,0x02,0xc1,0xd7,0x90,
  84446. +0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x51,0xc1,0x90,0x9e,0x2e,0xe0,0x70,0x31,
  84447. +0x90,0x9e,0x14,0xe0,0x60,0x15,0x90,0x9e,0x20,0x12,0x43,0x53,0x90,0x80,0x96,0x12,
  84448. +0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,
  84449. +0xf0,0x90,0x9e,0x1b,0xe0,0xff,0xd1,0xd8,0x90,0x9e,0x2e,0x74,0x01,0x51,0xb7,0x80,
  84450. +0x3f,0x90,0x9e,0x2e,0xe0,0x64,0x01,0x70,0x37,0x90,0x9e,0x1f,0xe0,0xff,0xd1,0xd8,
  84451. +0xe4,0x90,0x9e,0x2e,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01,0xfd,0x7f,0x45,0x51,0xc1,
  84452. +0x90,0x9e,0x14,0xe0,0x60,0x15,0x90,0x9e,0x16,0x12,0x43,0x53,0x90,0x80,0x96,0x12,
  84453. +0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,
  84454. +0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x9e,0x2a,0xe0,0x90,0x05,0x84,0xf0,0x90,
  84455. +0x9e,0x2b,0xe0,0x90,0x05,0x85,0xf0,0x90,0x9e,0x2c,0xe0,0x90,0x05,0x86,0xf0,0x90,
  84456. +0x9e,0x2d,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x05,0x60,0xe0,0x90,0x9e,0x2a,0xf0,
  84457. +0x90,0x05,0x61,0xe0,0x90,0x9e,0x2b,0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x2c,0xf0,
  84458. +0x90,0x05,0x63,0xe0,0x90,0x9e,0x2d,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x9e,0x2b,
  84459. +0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,
  84460. +0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x9e,0x2d,0x80,0x03,0x90,0x9e,0x2c,0xe0,
  84461. +0x04,0xf0,0x22,0x90,0x9e,0x2b,0xe0,0x2f,0xf0,0x22,0x90,0x00,0x49,0xe0,0x90,0x9e,
  84462. +0xb1,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x51,0xc1,0x90,0x9e,0xb1,
  84463. +0xe0,0x44,0xb0,0xfd,0x7f,0x49,0x41,0xc1,0x8e,0x59,0x8f,0x5a,0x8b,0x5b,0x8a,0x5c,
  84464. +0x89,0x5d,0xe4,0x90,0x9e,0x34,0xf0,0xef,0x90,0x00,0x31,0xf0,0x31,0xb9,0xe5,0x59,
  84465. +0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x31,0xb9,0x90,0x00,0x33,
  84466. +0xe0,0x54,0x7f,0xf0,0x31,0xb9,0x90,0x00,0x33,0xe0,0x20,0xe7,0x0e,0x90,0x9e,0x34,
  84467. +0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90,0x9e,0x34,0xe0,0xc3,
  84468. +0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x5b,0xaa,0x5c,0xa9,0x5d,0x12,0x42,
  84469. +0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0x12,0x45,0xb1,0xbf,0x01,0x10,0x90,0x02,0x09,
  84470. +0xe0,0xff,0x7d,0x01,0x12,0x47,0xfe,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x7f,0x0b,
  84471. +0xf1,0xea,0xef,0x65,0x25,0x60,0x10,0xe5,0x25,0xb4,0x01,0x05,0xe4,0xf5,0x25,0x80,
  84472. +0x03,0x75,0x25,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0x90,0x9e,0x74,0xf0,0x90,
  84473. +0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x41,0xc1,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  84474. +0xd0,0x90,0x9e,0xb2,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8,
  84475. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,
  84476. +0x12,0x49,0xb9,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,
  84477. +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe,
  84478. +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,
  84479. +0x80,0x44,0x90,0x9e,0xb2,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,
  84480. +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x49,0xb1,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,
  84481. +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,
  84482. +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,
  84483. +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x75,0x28,0x33,0xe4,0xf5,
  84484. +0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,
  84485. +0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4,0x90,0x9e,0x31,0xf0,0xa3,0xf0,
  84486. +0x75,0x8e,0x02,0x12,0x4f,0xda,0x12,0x5f,0xa9,0x12,0x5f,0xbc,0xe4,0xf5,0x12,0x12,
  84487. +0x6f,0xa1,0x12,0x77,0x5d,0x12,0x60,0x9b,0x12,0x2e,0x01,0x12,0x77,0x18,0x11,0x8b,
  84488. +0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,
  84489. +0xf0,0xa3,0xe4,0xf0,0x12,0x5f,0xf4,0x12,0x5f,0x91,0x12,0x44,0xfe,0x12,0x7d,0x1d,
  84490. +0x90,0x9e,0x33,0xe5,0xd9,0xf0,0x12,0x4d,0x8b,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,
  84491. +0x40,0xf0,0x12,0x49,0xb9,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x01,0xbe,
  84492. +0xe0,0x04,0xf0,0x90,0x01,0xc0,0xe0,0x04,0xf0,0x90,0x9e,0x31,0xe0,0x64,0x01,0xf0,
  84493. +0x24,0xa9,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x12,0x30,0xe4,0x09,0xc2,
  84494. +0xaf,0x53,0x12,0xef,0xd2,0xaf,0x31,0x8e,0xe5,0x12,0x30,0xe6,0x17,0xc2,0xaf,0x53,
  84495. +0x12,0xbf,0xd2,0xaf,0x12,0x69,0x51,0x90,0x9e,0x1e,0xe0,0xff,0x60,0x03,0xb4,0x01,
  84496. +0x03,0x12,0x7d,0x7b,0x90,0x9e,0x1e,0xe0,0x70,0x03,0x12,0x7e,0x7e,0x31,0x61,0x80,
  84497. +0xb8,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01,0x7a,0x06,0x79,0x35,
  84498. +0x7f,0xf9,0x7e,0x01,0x12,0x4f,0x48,0xbf,0x01,0x09,0x90,0x06,0x35,0xe0,0x54,0x0f,
  84499. +0xf0,0x80,0x05,0x80,0x00,0x02,0x77,0x0a,0xe4,0x90,0x06,0x34,0xf0,0x22,0x90,0x01,
  84500. +0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x34,0xf0,0x90,0x9e,0x34,0xe0,0xfd,0x70,0x02,0x41,
  84501. +0xcf,0x90,0x9e,0xae,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,
  84502. +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x41,0xc8,0x90,0x9e,0xae,
  84503. +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x35,0xf0,0x75,
  84504. +0x1e,0x01,0x75,0x1f,0x9e,0x75,0x20,0x35,0x75,0x21,0x01,0x7b,0x01,0x7a,0x9e,0x79,
  84505. +0x36,0x12,0x45,0x09,0x90,0x9e,0x36,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,
  84506. +0x9e,0xae,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0,
  84507. +0x90,0x9e,0x37,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,
  84508. +0x5f,0xe0,0x90,0x9e,0x38,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,
  84509. +0x12,0x43,0x5f,0xe0,0x90,0x9e,0x39,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,
  84510. +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x3a,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,
  84511. +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x3b,0xf0,0x80,0x33,0xe0,0x75,
  84512. +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x37,0xf0,0x90,0x9e,0xae,
  84513. +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x38,0xf0,0x90,
  84514. +0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x39,
  84515. +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,0x37,0x51,0xd0,0x90,0x9e,0x34,
  84516. +0xe0,0xff,0x90,0x9e,0xae,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,
  84517. +0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x34,0xf0,0x90,0x9e,0xae,0xe0,0xff,0x74,0x01,0xa8,
  84518. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x9e,0xae,0xe0,
  84519. +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x21,0x98,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,
  84520. +0x90,0x9e,0x3c,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x53,0x0b,0x01,0x53,0x14,0x02,
  84521. +0x53,0x2f,0x03,0x53,0x38,0x05,0x53,0x41,0x06,0x53,0x8f,0x07,0x53,0x49,0x09,0x53,
  84522. +0x52,0x0c,0x53,0x5b,0x0d,0x53,0x64,0x0e,0x53,0x6d,0x1b,0x53,0x76,0x1c,0x53,0x7f,
  84523. +0x2c,0x53,0x1d,0x2d,0x53,0x26,0x2e,0x00,0x00,0x53,0x88,0x90,0x9e,0x3c,0x12,0x43,
  84524. +0x6b,0x02,0x61,0x9d,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x71,0xc4,0x90,0x9e,0x3c,
  84525. +0x12,0x43,0x6b,0x02,0x71,0xca,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x72,0x12,0x90,
  84526. +0x9e,0x3c,0x12,0x43,0x6b,0x02,0x72,0x40,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x71,
  84527. +0x74,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x80,0x47,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,
  84528. +0x72,0x88,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x4b,0x7e,0x90,0x9e,0x3c,0x12,0x43,
  84529. +0x6b,0x02,0x7c,0xea,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x4c,0xb8,0x90,0x9e,0x3c,
  84530. +0x12,0x43,0x6b,0x02,0x71,0xbc,0x90,0x9e,0x3c,0x12,0x43,0x6b,0x02,0x71,0xa3,0x90,
  84531. +0x9e,0x3c,0x12,0x43,0x6b,0x02,0x75,0xea,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,
  84532. +0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54,
  84533. +0x07,0xfd,0xaf,0x06,0x90,0x9e,0x3f,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x8b,
  84534. +0x90,0x9e,0x41,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54,
  84535. +0x0f,0x90,0x9e,0x44,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13,
  84536. +0x54,0x03,0x90,0x9e,0x45,0xf0,0x90,0x9e,0x3f,0xe0,0xff,0x75,0xf0,0x09,0x90,0x96,
  84537. +0x46,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x9e,0x46,0xec,0xf0,0xa3,0xed,0xf0,
  84538. +0xef,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b,0x01,0xa3,
  84539. +0x12,0x43,0x8b,0x90,0x9e,0x41,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,
  84540. +0x0f,0xff,0x90,0x9e,0x48,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d,0x90,0x9e,0x41,0x12,
  84541. +0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x9e,0x48,0x12,0x43,0x6b,0x90,
  84542. +0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x9e,0x41,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,
  84543. +0x42,0x20,0xff,0x90,0x9e,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef,
  84544. +0xf0,0x12,0x24,0x62,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x44,0xe0,0xfe,0x90,
  84545. +0x9e,0x3f,0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x90,
  84546. +0x9e,0x40,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x5f,0xee,0xf0,
  84547. +0x75,0xf0,0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x5f,0x74,0x01,0xf0,0x90,0x9e,0x45,
  84548. +0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x5f,0xee,0xf0,0x8f,0x59,
  84549. +0xef,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82,0xf5,0x5b,0x8f,0x5c,
  84550. +0xe5,0x59,0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35,0xf0,0x75,0x5d,0x01,
  84551. +0xf5,0x5e,0x89,0x5f,0x75,0xf0,0x09,0xe5,0x59,0x90,0x96,0x46,0x12,0x43,0x5f,0xaf,
  84552. +0x82,0x85,0x83,0x60,0x8f,0x61,0xe5,0x59,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,
  84553. +0x96,0x35,0xf0,0x75,0x62,0x01,0xf5,0x63,0x89,0x64,0x74,0x82,0x25,0x59,0xf5,0x82,
  84554. +0xe4,0x34,0x95,0xf5,0x83,0xe0,0x12,0x43,0x94,0x55,0x1e,0x00,0x55,0x33,0x01,0x55,
  84555. +0x48,0x02,0x55,0x5d,0x03,0x55,0x86,0x04,0x55,0x9b,0x05,0x55,0xb0,0x06,0x55,0xd6,
  84556. +0x0c,0x56,0x03,0x0d,0x56,0x30,0x0e,0x56,0x5d,0x0f,0x00,0x00,0x56,0x91,0xe5,0x59,
  84557. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,
  84558. +0x15,0x80,0x3c,0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,
  84559. +0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  84560. +0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x59,0x25,
  84561. +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,
  84562. +0xe5,0x59,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,
  84563. +0xa3,0x74,0x8f,0xf0,0xc1,0x91,0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,
  84564. +0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5,0x59,0x25,0xe0,0x24,
  84565. +0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,
  84566. +0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,
  84567. +0x74,0x0d,0xf0,0xe5,0x59,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,
  84568. +0xe4,0xf0,0xa3,0xf0,0xc1,0x91,0x90,0x04,0x47,0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,
  84569. +0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x90,0x00,0x01,
  84570. +0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x5c,0x82,0x85,0x5b,0x83,0xf0,0x90,0x04,
  84571. +0x44,0xc1,0x88,0x90,0x04,0x4b,0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x12,0x42,0x4d,
  84572. +0x90,0x04,0x4a,0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x90,0x00,0x01,0x12,0x42,0x5f,
  84573. +0x90,0x04,0x49,0xe0,0x85,0x5c,0x82,0x85,0x5b,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,
  84574. +0x90,0x04,0x4f,0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x12,0x42,0x4d,0x90,0x04,0x4e,
  84575. +0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,
  84576. +0xe0,0x85,0x5c,0x82,0x85,0x5b,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,
  84577. +0xe0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0x12,0x42,0x4d,0x90,0x04,0x52,0xe0,0xab,0x5d,
  84578. +0xaa,0x5e,0xa9,0x5f,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x51,0xe0,0x85,0x5c,
  84579. +0x82,0x85,0x5b,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x5c,0x82,0x85,0x5b,0x83,0xa3,
  84580. +0xf0,0xab,0x5d,0xaa,0x5e,0xa9,0x5f,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,
  84581. +0xff,0xab,0x62,0xaa,0x63,0xa9,0x64,0x12,0x24,0x62,0x5f,0xd0,0x01,0xd0,0x02,0xd0,
  84582. +0x03,0x12,0x42,0x4d,0xab,0x5d,0xe5,0x5f,0x24,0x01,0xf9,0xe4,0x35,0x5e,0xfa,0xc0,
  84583. +0x03,0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff,0xab,0x62,0xaa,0x63,0xa9,0x64,0x90,
  84584. +0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,
  84585. +0x5c,0x82,0x85,0x5b,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x61,0x82,0x85,0x60,
  84586. +0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x5c,0x82,0x85,0x5b,0x83,
  84587. +0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x61,0x82,0x85,0x60,0x83,0xa3,0xe0,0xfe,
  84588. +0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x59,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,
  84589. +0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75,0x5a,0x0b,0x74,0x01,
  84590. +0x7e,0x00,0xa8,0x5a,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,
  84591. +0x59,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,
  84592. +0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x5a,0x24,0x10,0x80,0x5d,0x15,0x5a,0xe5,0x5a,0xc3,
  84593. +0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,
  84594. +0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x5a,0x0f,0x74,0x01,0x7e,
  84595. +0x00,0xa8,0x5a,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x59,
  84596. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,
  84597. +0x5f,0x4e,0x60,0x08,0x90,0x9e,0x4b,0xe5,0x5a,0xf0,0x80,0x10,0x15,0x5a,0xe5,0x5a,
  84598. +0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x4b,0xf0,0xe5,0x59,0x25,0xe0,
  84599. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,
  84600. +0xe4,0xf5,0x5a,0x74,0x01,0x7e,0x00,0xa8,0x5a,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,
  84601. +0xce,0xd8,0xf9,0xff,0xe5,0x59,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,
  84602. +0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x4c,0xe5,0x5a,0xf0,
  84603. +0x80,0x5b,0x05,0x5a,0xe5,0x5a,0xb4,0x10,0xca,0x80,0x52,0xe5,0x59,0x25,0xe0,0x24,
  84604. +0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,
  84605. +0xf5,0x5a,0x74,0x01,0x7e,0x00,0xa8,0x5a,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,
  84606. +0xd8,0xf9,0xff,0xe5,0x59,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,
  84607. +0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x5a,0x24,0x10,0x80,0x0a,0x05,
  84608. +0x5a,0xe5,0x5a,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x4c,0xf0,0x90,0x9e,0x4b,
  84609. +0xe0,0xff,0x75,0xf0,0x09,0xe5,0x59,0x90,0x96,0x48,0x12,0x43,0x5f,0xef,0xf0,0x90,
  84610. +0x9e,0x4c,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x59,0x90,0x96,0x49,0x12,0x43,0x5f,0xee,
  84611. +0xf0,0x74,0x84,0x25,0x59,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,
  84612. +0x05,0x90,0x9e,0x4b,0x11,0xe0,0x74,0x84,0x25,0x59,0xf5,0x82,0xe4,0x34,0x04,0xf5,
  84613. +0x83,0xe0,0xff,0x90,0x9e,0x4c,0xe0,0xfe,0xef,0xc3,0x9e,0x50,0x02,0x11,0xe0,0x90,
  84614. +0x9e,0x4b,0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90,0x96,0x43,0x74,0x03,0xf0,0x22,
  84615. +0xef,0xd3,0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74,0x02,0xf0,0x22,0xef,0xd3,0x94,
  84616. +0x03,0x40,0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22,0xe4,0x90,0x96,0x43,0xf0,0x22,
  84617. +0xe0,0xfd,0x74,0x26,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xed,0xf0,0xaf,
  84618. +0x59,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,0x50,0x0e,0x74,0x84,
  84619. +0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,0x74,0xa6,0x2f,0xf5,
  84620. +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xed,0xf0,0x90,0x9e,0x78,0xef,0xf0,0x24,0xa6,0xf5,
  84621. +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x90,0x9e,0x79,0xf0,0x7b,0x01,0x7a,0x9e,0x79,
  84622. +0x78,0x7d,0x02,0x31,0x3a,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  84623. +0xd0,0x90,0x9e,0x97,0x12,0x43,0x8b,0x90,0x9e,0x9a,0xe0,0x54,0xf0,0x44,0x06,0xff,
  84624. +0xf0,0xed,0x54,0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f,0x4e,0xf0,0x90,0x9e,0x97,
  84625. +0x12,0x43,0x6b,0x90,0x9e,0x94,0x12,0x43,0x8b,0x7b,0x01,0x7a,0x9e,0x79,0x9a,0xd1,
  84626. +0x14,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x50,0x8d,0x51,0xe5,0x51,0x54,0x1f,0xf5,0x56,
  84627. +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x54,0x90,0x04,0xfd,
  84628. +0xe0,0xb4,0x01,0x05,0x75,0x57,0x03,0x80,0x03,0x75,0x57,0x01,0xeb,0xc3,0x95,0x57,
  84629. +0x40,0x04,0xaf,0x50,0x80,0x33,0xe5,0x54,0x25,0x53,0xf5,0x55,0xe5,0x56,0x90,0x41,
  84630. +0xd6,0x93,0xff,0xe5,0x55,0xd3,0x9f,0x74,0x01,0x40,0x11,0x25,0x50,0xf5,0x82,0xe4,
  84631. +0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x51,0xaf,0x50,0x01,0xf1,0x25,0x50,0xf5,0x82,
  84632. +0xe4,0x34,0x94,0xf5,0x83,0xe5,0x55,0xf0,0x22,0xad,0x07,0x75,0xf0,0x09,0xed,0x90,
  84633. +0x96,0x48,0x12,0x43,0x5f,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,
  84634. +0x83,0xe0,0x54,0x1f,0xf5,0x58,0xd3,0x9f,0x40,0x02,0x8f,0x58,0xe5,0x58,0x25,0xe0,
  84635. +0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,
  84636. +0xe5,0x58,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,
  84637. +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,
  84638. +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x05,0xad,0x58,
  84639. +0x11,0xf1,0xaf,0x58,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,
  84640. +0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,
  84641. +0xc0,0x07,0x90,0x01,0xc4,0x74,0x45,0xf0,0x74,0x5a,0xa3,0xf0,0x90,0x01,0x34,0xe0,
  84642. +0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,
  84643. +0xf5,0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x61,0xe1,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,
  84644. +0xd1,0x08,0x85,0xd2,0x09,0x85,0xd3,0x0a,0x85,0xd4,0x0b,0x85,0xd5,0x0c,0x85,0xd6,
  84645. +0x0d,0x85,0xd7,0x0e,0x85,0xd9,0x0f,0xe5,0x0f,0x54,0x40,0xc3,0x13,0xff,0xe5,0x0e,
  84646. +0x54,0x20,0x6f,0x70,0x02,0x61,0x93,0xe5,0x0f,0x30,0xe5,0x02,0x61,0x93,0xe5,0x0d,
  84647. +0x54,0x3f,0xf5,0x4d,0xe5,0x08,0x54,0x3f,0xf5,0x4e,0xe5,0x0c,0x54,0x1f,0xff,0xe5,
  84648. +0x4d,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,
  84649. +0x42,0x81,0xe5,0x0e,0x54,0x1f,0xff,0xe5,0x4d,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,
  84650. +0x34,0x93,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4e,0xd3,0x94,0x04,0x40,
  84651. +0x03,0x75,0x4e,0x04,0x75,0xf0,0x0a,0xe5,0x4d,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,
  84652. +0xf0,0x02,0xe5,0x4e,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x0e,0x54,0x1f,
  84653. +0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x4d,0x90,0x90,0x00,0x12,0x43,0x5f,
  84654. +0x75,0xf0,0x02,0xe5,0x4e,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x0f,0x20,
  84655. +0xe6,0x23,0xe5,0x0e,0x54,0x1f,0xff,0xe5,0x4d,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,
  84656. +0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x0a,0x30,0xe7,0x34,0xaf,
  84657. +0x4d,0x31,0xd9,0x80,0x2e,0xe5,0x0e,0x54,0x1f,0xff,0xe5,0x4d,0x25,0xe0,0x24,0x44,
  84658. +0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x0a,0x30,
  84659. +0xe7,0x11,0xe5,0x0a,0x54,0x7f,0xfd,0xe5,0x0e,0x54,0x1f,0xf5,0x53,0xab,0x4e,0xaf,
  84660. +0x4d,0x31,0x76,0xe5,0x74,0x14,0x24,0xfd,0x50,0x02,0x80,0x45,0x90,0x9e,0x61,0xe0,
  84661. +0x60,0x37,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xd1,0x05,0xef,
  84662. +0x64,0x01,0x70,0x2d,0x90,0x9e,0x55,0xe0,0xf5,0x44,0x75,0x45,0x00,0xe4,0xfb,0xfd,
  84663. +0x7f,0x58,0x7e,0x01,0x12,0x30,0x62,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,
  84664. +0x74,0x01,0xf0,0x90,0x9e,0x5d,0xf0,0x80,0x08,0xd1,0x05,0xbf,0x01,0x03,0x12,0x44,
  84665. +0xd3,0xe5,0x2c,0x30,0xe1,0x20,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x13,0x85,
  84666. +0xd2,0x14,0x85,0xd3,0x15,0x85,0xd4,0x16,0x85,0xd5,0x17,0x85,0xd6,0x18,0x85,0xd7,
  84667. +0x19,0x85,0xd9,0x1a,0xd1,0x9c,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,
  84668. +0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x12,0x10,0xe5,
  84669. +0x2c,0x30,0xe5,0x26,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1f,0xe0,0x54,0xdf,0xf0,0x90,
  84670. +0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x4d,0xb6,0x90,0x00,
  84671. +0x03,0xe0,0x54,0xfb,0xf0,0x12,0x49,0xb9,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,
  84672. +0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe1,0x3c,0x90,0x01,0x36,0x74,0x02,0xf0,
  84673. +0x43,0x12,0x40,0x90,0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,
  84674. +0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,0x9e,0x66,0xe4,0xf0,0x80,0x18,0x90,0x9e,
  84675. +0x66,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,
  84676. +0x30,0xe0,0x03,0x12,0x4f,0xa7,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x9e,0x76,0x74,0x01,
  84677. +0xf0,0x90,0x01,0x36,0xf0,0x12,0x64,0xfe,0x90,0x9e,0x76,0xe4,0xf0,0xe5,0x2e,0x30,
  84678. +0xe2,0x78,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x01,0xbd,0xe0,0x04,0xf0,0xe5,0x73,
  84679. +0x64,0x01,0x70,0x66,0xe5,0x74,0x60,0x62,0xe5,0x74,0x64,0x02,0x60,0x06,0xe5,0x74,
  84680. +0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0x50,0xf0,0x90,0x06,0xaa,0xe0,
  84681. +0x90,0x9e,0x5f,0xf0,0x90,0x9e,0x50,0xe0,0x70,0x07,0x90,0x9e,0x5f,0xe0,0xff,0x80,
  84682. +0x05,0x90,0x9e,0x50,0xe0,0xff,0x90,0x9e,0x50,0xef,0xf0,0x90,0x9e,0x52,0xe0,0x60,
  84683. +0x03,0xe0,0x14,0xf0,0x90,0x9e,0x51,0xe4,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c,
  84684. +0x74,0x02,0xf0,0x90,0x9e,0x63,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xef,0xf0,0xe5,0x74,
  84685. +0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5,0x2e,0x30,0xe3,0x28,0x90,
  84686. +0x01,0x36,0x74,0x08,0xf0,0xe5,0x73,0x64,0x01,0x70,0x1c,0xe5,0x74,0x60,0x18,0x90,
  84687. +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x89,0xe4,0x12,0x44,
  84688. +0x52,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2f,0x90,0x01,0x36,0x74,
  84689. +0x10,0xf0,0xe5,0x73,0x64,0x01,0x70,0x23,0xe5,0x74,0x60,0x1f,0x90,0x01,0x57,0xe4,
  84690. +0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x62,0xe4,0xf0,0x90,0x9e,0x63,0xe0,
  84691. +0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xd3,0xe5,0x2e,0x30,0xe5,0x1f,
  84692. +0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x73,0xb4,0x01,0x14,0xe5,0x74,0x60,0x10,0x90,
  84693. +0x9e,0x61,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xdc,0x80,0x03,0x12,0x44,0x80,0xe5,
  84694. +0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x73,0xb4,0x01,0x13,0xe5,
  84695. +0x74,0x60,0x0f,0x90,0x9e,0x63,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,
  84696. +0x44,0xd3,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74,0x02,0xf0,0xd1,0xbd,0x74,
  84697. +0x45,0x04,0x90,0x01,0xc4,0xf0,0x74,0x5a,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,
  84698. +0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,
  84699. +0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,
  84700. +0x02,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x91,0x12,0x43,
  84701. +0x8b,0x90,0x9e,0x75,0xe0,0x64,0x02,0x60,0x6e,0x90,0x9e,0x75,0xe0,0x64,0x01,0x70,
  84702. +0x66,0x90,0x9e,0xb0,0xe0,0xff,0x04,0xf0,0x90,0x9e,0x91,0x12,0x43,0x6b,0x90,0x00,
  84703. +0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0xf1,0x3b,0xef,0x60,0x49,0x90,0x9e,
  84704. +0x91,0x12,0x43,0x6b,0x8b,0x1e,0x8a,0x1f,0x89,0x20,0x75,0x21,0x02,0x7b,0x01,0x7a,
  84705. +0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x9e,0x94,0x12,0x43,0x6b,0x8b,0x1e,0x8a,0x1f,
  84706. +0x89,0x20,0x90,0x9e,0x91,0x12,0x43,0x6b,0x12,0x24,0x62,0xff,0xc4,0x54,0x0f,0xf5,
  84707. +0x21,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,
  84708. +0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0x2f,0xe0,
  84709. +0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x13,
  84710. +0x90,0x9e,0x94,0x12,0x43,0x8b,0x0b,0x7a,0x9e,0x79,0x2f,0xc1,0x14,0x7d,0x02,0x7f,
  84711. +0x03,0x12,0x31,0x2c,0xe5,0x74,0x14,0x24,0xfd,0x50,0x02,0x80,0x23,0x90,0x9e,0x61,
  84712. +0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90,0x9e,0x5e,0xe0,0x54,0x0f,0xc3,
  84713. +0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x1a,0xe4,0xff,0x12,0x48,0x8f,
  84714. +0x22,0xd1,0x05,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x32,
  84715. +0x90,0x9e,0x5d,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x24,0x90,0x9e,
  84716. +0x5c,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x16,0x90,0x9e,0x60,0xe0,
  84717. +0x54,0x0f,0xd3,0x94,0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,
  84718. +0x01,0x22,0x90,0x01,0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,
  84719. +0xc0,0xd0,0x90,0x9e,0xa0,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,
  84720. +0x9e,0xa0,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9e,
  84721. +0xa3,0xe0,0x94,0xe8,0x90,0x9e,0xa2,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,
  84722. +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x9e,0xa2,0xe4,0x75,0xf0,0x01,0x12,0x42,
  84723. +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x32,0x15,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,
  84724. +0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,
  84725. +0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x90,
  84726. +0x9e,0x75,0x60,0x04,0x74,0x01,0xf0,0x22,0x74,0x02,0xf0,0x22,0x90,0x00,0xf3,0xe0,
  84727. +0x30,0xe3,0x08,0x90,0x9e,0x77,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9e,0x77,0xf0,
  84728. +0x90,0x9e,0x77,0xe0,0xb4,0x01,0x12,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x0b,0x90,0x9e,
  84729. +0x64,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x22,0x90,0x9e,0x64,0x74,0xfd,0xf0,0xa3,
  84730. +0x74,0x2f,0xf0,0x22,0x90,0x01,0x64,0x74,0xa0,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,
  84731. +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,
  84732. +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xfb,0xf0,0x74,0x5f,
  84733. +0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,
  84734. +0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74,0x40,0xf0,0x90,0x9e,0x1d,0xe0,0x54,0x03,0xff,
  84735. +0xbf,0x03,0x0b,0x90,0x9e,0x1a,0xe0,0x60,0x05,0x7f,0x01,0x12,0x4a,0xd6,0xe5,0x3d,
  84736. +0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x9e,0x1d,0xe0,0x54,0x03,0xff,
  84737. +0xbf,0x03,0x05,0x7f,0x02,0x12,0x4a,0xd6,0x90,0x01,0xc4,0x74,0xfb,0xf0,0x74,0x5f,
  84738. +0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,
  84739. +0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x6b,0x8c,
  84740. +0x6c,0x8d,0x6d,0x22,0x8f,0x6e,0x8c,0x6f,0x8d,0x70,0x22,0xe4,0xf5,0x73,0x90,0x9e,
  84741. +0x63,0xf0,0xf5,0x74,0x90,0x9e,0x60,0x74,0x0c,0xf0,0x90,0x9e,0x5e,0xf0,0xe4,0x90,
  84742. +0x9e,0x61,0xf0,0x90,0x9e,0x5d,0xf0,0x90,0x9e,0x5c,0xf0,0x90,0x9e,0x5f,0x04,0xf0,
  84743. +0x90,0x9e,0x50,0xf0,0xe4,0x90,0x9e,0x62,0xf0,0x90,0x9e,0x52,0xf0,0x90,0x9e,0x5a,
  84744. +0x74,0x07,0xf0,0xe4,0x90,0x9e,0x51,0xf0,0x90,0x9e,0x58,0xf0,0xa3,0x74,0x02,0xf0,
  84745. +0x90,0x9e,0x56,0x14,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0x55,0x74,0x14,0xf0,0x90,
  84746. +0x9e,0x5b,0x74,0x05,0xf0,0xe4,0x90,0x9e,0x54,0xf0,0x90,0x9e,0x4f,0xf0,0x90,0x9e,
  84747. +0x76,0xf0,0x22,0xe4,0x90,0x9e,0x62,0xf0,0x90,0x9e,0x51,0xf0,0x90,0x9e,0x63,0xf0,
  84748. +0x22,0x8b,0x59,0x8a,0x5a,0x89,0x5b,0x31,0x03,0xab,0x59,0xaa,0x5a,0xa9,0x5b,0x12,
  84749. +0x24,0x62,0xf5,0x74,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,
  84750. +0x40,0x7f,0x01,0x80,0x3a,0xab,0x59,0xaa,0x5a,0xa9,0x5b,0x90,0x00,0x02,0x12,0x42,
  84751. +0x20,0xfd,0xe4,0xff,0x31,0x72,0x80,0x27,0xab,0x59,0xaa,0x5a,0xa9,0x5b,0x90,0x00,
  84752. +0x02,0x12,0x42,0x20,0xfd,0x7f,0x01,0x31,0x72,0x1f,0x80,0x13,0xab,0x59,0xaa,0x5a,
  84753. +0xa9,0x5b,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0x72,0xe4,0xff,0x31,
  84754. +0xc6,0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x9e,0x5f,0x74,0x01,0xf0,
  84755. +0x80,0x16,0xed,0x70,0x0a,0x90,0x9e,0x5b,0xe0,0x90,0x9e,0x5f,0xf0,0x80,0x05,0x90,
  84756. +0x9e,0x5f,0xed,0xf0,0x90,0x9e,0x5f,0xe0,0x90,0x9e,0x50,0xf0,0x22,0xd3,0x10,0xaf,
  84757. +0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x9e,0x61,0xf0,0x90,0x00,
  84758. +0x03,0x12,0x42,0x20,0x90,0x9e,0x4f,0xf0,0x12,0x24,0x62,0x65,0x74,0x60,0x02,0x31,
  84759. +0x11,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x64,0x01,0x70,0x30,0x7d,0x7c,0x7f,0x02,0x12,
  84760. +0x31,0x2c,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,
  84761. +0x3c,0x74,0x02,0xf0,0x12,0x47,0x16,0xe4,0xff,0x12,0x48,0x8f,0x90,0x06,0x04,0xe0,
  84762. +0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,
  84763. +0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x31,0x9d,0x7d,0x02,0x7f,0x03,0x12,
  84764. +0x31,0x9d,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,
  84765. +0x90,0x9e,0x58,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x73,0x30,0xe0,0x1b,0x90,
  84766. +0x9e,0x52,0xe0,0x70,0x1a,0xe0,0x04,0xf0,0x90,0x9e,0x5e,0xe0,0x54,0x0f,0xc3,0x94,
  84767. +0x04,0x50,0x0c,0x7d,0x01,0x7f,0x04,0x02,0x47,0x1a,0xe4,0x90,0x9e,0x52,0xf0,0x22,
  84768. +0x12,0x5e,0x05,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x52,
  84769. +0x90,0x9e,0x63,0xe0,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x42,
  84770. +0x90,0x9e,0x60,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,
  84771. +0xf0,0x80,0x2f,0x90,0x9e,0x63,0xe0,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,
  84772. +0x80,0x20,0x90,0x9e,0x63,0xe0,0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,
  84773. +0x11,0x90,0x9e,0x52,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,0x03,0x7f,
  84774. +0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,0x22,0xe5,0x12,0x60,0x08,0x90,
  84775. +0x01,0xb9,0x74,0x01,0xf0,0x80,0x5e,0x90,0x9e,0x60,0xe0,0x54,0x0f,0xd3,0x94,0x01,
  84776. +0x40,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4b,0x90,0x02,0x87,0xe0,0x60,0x08,
  84777. +0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x3d,0x90,0x9e,0x75,0xe0,0xb4,0x02,0x10,0x90,
  84778. +0x9e,0x64,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x17,0x80,0x26,0x90,
  84779. +0x9e,0x75,0xe0,0xb4,0x01,0x0e,0x90,0x01,0xaf,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,
  84780. +0x08,0xf0,0x80,0x11,0x90,0x9e,0x54,0xe0,0x70,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,
  84781. +0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x02,0xf0,0x7f,0x00,0x22,0x90,0x06,
  84782. +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x73,0xb4,0x01,0x04,0xe4,0xff,0x71,
  84783. +0x4d,0x90,0x9e,0x5e,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x76,0x90,
  84784. +0x9e,0x5e,0xe0,0x90,0x01,0xc1,0xf0,0xa3,0xe5,0x12,0xf0,0x12,0x45,0xb1,0xef,0x64,
  84785. +0x01,0x70,0x2e,0x90,0x9e,0x69,0x12,0x47,0xfa,0xe5,0x76,0x60,0x10,0x74,0x21,0x2f,
  84786. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,
  84787. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,
  84788. +0xf0,0x22,0x90,0x9e,0xaf,0xef,0xf0,0x71,0xb0,0x90,0x9e,0xaf,0xe0,0x60,0x05,0x90,
  84789. +0x05,0x22,0xe4,0xf0,0x90,0x9e,0x5e,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,
  84790. +0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x49,0xb9,0x90,0x9d,0xff,0x12,0x43,0x53,
  84791. +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,0x9e,0x03,
  84792. +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,
  84793. +0x90,0x9e,0x07,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,
  84794. +0x12,0x2b,0x08,0x90,0x9e,0x0b,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,
  84795. +0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x03,0x2d,0x95,
  84796. +0xe4,0xfd,0xff,0x12,0x30,0x2c,0x90,0x9e,0x77,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,
  84797. +0x12,0x25,0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x22,0x8f,
  84798. +0x27,0xe4,0x90,0x9e,0xa8,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0,0x7f,0x00,0x30,0xe7,
  84799. +0x02,0x7f,0x01,0xef,0x65,0x27,0x60,0x3e,0xc3,0x90,0x9e,0xa9,0xe0,0x94,0x88,0x90,
  84800. +0x9e,0xa8,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90,
  84801. +0x9e,0xa8,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e,0x00,0x12,0x32,0x15,
  84802. +0xd3,0x90,0x9e,0xa9,0xe0,0x94,0x32,0x90,0x9e,0xa8,0xe0,0x94,0x00,0x40,0xb9,0x90,
  84803. +0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x9e,0x5e,0xe0,0x54,0xf0,0xf0,0xe0,0x44,
  84804. +0x01,0xf0,0x12,0x44,0xff,0x12,0x45,0x00,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,
  84805. +0x22,0x90,0x9e,0x60,0xe0,0x30,0xe6,0x1c,0xe0,0x54,0x0f,0xff,0x90,0x9e,0x4e,0xe0,
  84806. +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x9e,0x4e,0xf0,0x90,0x9e,0x60,
  84807. +0xe0,0x54,0xbf,0xf0,0x22,0x8f,0x75,0x12,0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,
  84808. +0x9e,0x6a,0x12,0x47,0xfa,0xe5,0x75,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,
  84809. +0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,
  84810. +0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,
  84811. +0x9e,0x2f,0xf0,0xe5,0x74,0x60,0x6a,0xe5,0x73,0x64,0x01,0x70,0x64,0xe5,0x74,0x14,
  84812. +0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x9e,
  84813. +0x50,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x9e,0x50,0xe0,0x70,
  84814. +0x0a,0x90,0x9e,0x5f,0xe0,0x90,0x9e,0x50,0xf0,0x80,0x00,0x90,0x9e,0x2f,0x74,0x01,
  84815. +0xf0,0x90,0x9e,0x2f,0xe0,0x60,0x2a,0x90,0x9e,0x63,0xe0,0x44,0x10,0xf0,0xe4,0x90,
  84816. +0x9e,0x89,0xf0,0x90,0x9e,0x5a,0x12,0x44,0x56,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,
  84817. +0x9e,0x5e,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,
  84818. +0x1a,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,
  84819. +0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,
  84820. +0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,
  84821. +0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,
  84822. +0xf0,0x22,0xad,0x07,0xed,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2d,0xf5,0x82,0xe4,
  84823. +0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,
  84824. +0x83,0xe0,0x54,0x7f,0xf5,0x64,0xe5,0x64,0x54,0x1f,0xfc,0x75,0xf0,0x09,0xed,0x90,
  84825. +0x96,0x48,0x12,0x43,0x5f,0xe0,0xff,0x90,0x9e,0x3e,0xf0,0xed,0x25,0xe0,0x24,0x02,
  84826. +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x3f,0xcb,0xf0,
  84827. +0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,
  84828. +0xfb,0xa3,0xe0,0x90,0x9e,0x41,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x66,
  84829. +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93,0xfb,0xed,0x25,
  84830. +0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3,0xeb,0xf0,0xec,
  84831. +0xc3,0x9f,0x40,0x02,0xc1,0xc9,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,
  84832. +0xec,0xf0,0x04,0xfb,0x90,0x9e,0x3e,0xe0,0xff,0xeb,0xd3,0x9f,0x40,0x02,0xc1,0xfa,
  84833. +0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,
  84834. +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x3f,0xe0,0x5e,
  84835. +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x39,0x74,0x01,0x7e,
  84836. +0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,
  84837. +0x41,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64,0x13,0x60,0x08,0xeb,
  84838. +0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x9e,0x3f,0xe0,0x30,0xe0,0x02,0x7b,0x18,
  84839. +0xac,0x03,0x8c,0x64,0x80,0x34,0x0b,0x80,0x8b,0x90,0x9e,0x3e,0xe0,0xfb,0x6c,0x70,
  84840. +0x69,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x75,0xf0,0x09,
  84841. +0xed,0x90,0x96,0x4a,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5,0x64,0x20,0xe6,0x07,
  84842. +0xec,0x44,0x40,0xf5,0x64,0x80,0x03,0xaf,0x64,0x22,0xec,0x25,0xe0,0x24,0x9e,0xf5,
  84843. +0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,
  84844. +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,
  84845. +0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,
  84846. +0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b,0x40,0x56,0x90,
  84847. +0x9e,0x3e,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,
  84848. +0xac,0x07,0x8f,0x64,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,
  84849. +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,
  84850. +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,
  84851. +0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,
  84852. +0xef,0xf0,0xaf,0x64,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,
  84853. +0xf0,0xaf,0x05,0xe5,0x64,0x44,0x80,0xfd,0x12,0x58,0xf1,0xe5,0x64,0x44,0x80,0xff,
  84854. +0x22,0xac,0x07,0xec,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5,0x82,0xe4,0x34,
  84855. +0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,
  84856. +0xe0,0x54,0x7f,0xf5,0x64,0xe5,0x64,0x54,0x1f,0xff,0x90,0x9e,0x40,0xf0,0x75,0xf0,
  84857. +0x09,0xec,0x90,0x96,0x49,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x42,0xf0,0x75,0xf0,0x09,
  84858. +0xec,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x9e,0x43,0xf0,0xec,0x25,0xe0,
  84859. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x44,
  84860. +0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,
  84861. +0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x46,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3,0x9e,
  84862. +0x40,0x0a,0x90,0x9e,0x43,0xe0,0x90,0x9e,0x40,0xf0,0xf5,0x64,0xed,0x70,0x02,0x21,
  84863. +0x07,0x90,0x9e,0x41,0xed,0xf0,0xe5,0x64,0x30,0xe6,0x0a,0x90,0x9e,0x40,0xe0,0xf5,
  84864. +0x64,0xa3,0xe0,0x14,0xf0,0x90,0x9e,0x41,0xe0,0x70,0x02,0x21,0x07,0x90,0x9e,0x40,
  84865. +0xe0,0xff,0xd3,0x94,0x00,0x50,0x02,0x21,0x07,0xe4,0x90,0x9e,0x3f,0xf0,0xef,0x14,
  84866. +0x90,0x9e,0x3e,0xf0,0x90,0x9e,0x42,0xe0,0xfd,0x90,0x9e,0x3e,0xe0,0xff,0xd3,0x9d,
  84867. +0x40,0x6b,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,
  84868. +0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x46,0xe0,
  84869. +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x9e,0x3e,0xe0,0xff,0xc3,0x94,0x10,
  84870. +0x50,0x33,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,
  84871. +0xd8,0xf9,0xff,0x90,0x9e,0x44,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x16,0x90,
  84872. +0x9e,0x3e,0xe0,0xf5,0x64,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x41,0xe0,0xff,0x90,0x9e,
  84873. +0x3f,0xe0,0x6f,0x60,0x08,0x90,0x9e,0x3e,0xe0,0x14,0xf0,0x80,0x87,0x90,0x9e,0x41,
  84874. +0xe0,0xff,0x90,0x9e,0x3f,0xe0,0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x3e,0xe0,0xb5,0x05,
  84875. +0x06,0x90,0x9e,0x42,0xe0,0xf5,0x64,0xe5,0x64,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,
  84876. +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x64,0x25,0xe0,0x24,
  84877. +0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,
  84878. +0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,
  84879. +0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04,0xad,0x64,0x12,0x58,0xf1,0xaf,0x64,
  84880. +0x22,0xe4,0xf5,0x59,0xe5,0x59,0xb4,0x20,0x14,0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,
  84881. +0x95,0x01,0xe0,0xff,0x90,0x9a,0xc5,0xe0,0xb5,0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,
  84882. +0xe5,0x59,0x90,0x96,0x4b,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0x95,0xe5,
  84883. +0x59,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,
  84884. +0xd3,0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0x95,0xe5,0x59,0x94,0x20,0x40,0x08,
  84885. +0x90,0x9a,0xc5,0xe0,0x60,0x02,0xe1,0xa0,0xe5,0x59,0x75,0xf0,0x0a,0xa4,0x24,0x00,
  84886. +0xf9,0x74,0x90,0x35,0xf0,0x75,0x5e,0x01,0xf5,0x5f,0x89,0x60,0xe5,0x59,0x25,0xe0,
  84887. +0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x38,
  84888. +0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x59,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,
  84889. +0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x3a,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x59,
  84890. +0xc3,0x94,0x20,0x50,0x14,0x74,0x84,0x25,0x59,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,
  84891. +0xe0,0x54,0x3f,0x90,0x9e,0x34,0xf0,0x80,0x12,0x74,0xa6,0x25,0x59,0xf5,0x82,0xe4,
  84892. +0x34,0x9c,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x34,0xf0,0x90,0x9e,0x34,0xe0,0xfe,
  84893. +0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x59,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,
  84894. +0x90,0x9e,0x3d,0xf0,0x74,0xe6,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,
  84895. +0xc3,0x94,0x05,0x40,0x02,0x81,0x6e,0x90,0x9e,0x3d,0xe0,0xff,0x90,0x9e,0x35,0xe0,
  84896. +0x9f,0x40,0x13,0x90,0x9e,0x3d,0xe0,0x90,0x9e,0x35,0xf0,0xee,0x54,0x40,0xfe,0x90,
  84897. +0x9e,0x34,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70,0x29,0x90,0x9e,
  84898. +0x35,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x44,0x25,0x59,0xf5,0x82,0xe4,0x34,
  84899. +0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x30,0x90,0x9e,
  84900. +0x35,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x9e,0x35,0xe0,0xff,0x90,0x41,0x4a,0x93,
  84901. +0xfe,0x74,0x44,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,
  84902. +0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x9e,0x35,0xe0,0x90,0x41,0x2e,0x93,0x90,
  84903. +0x9e,0x3c,0xf0,0x90,0x9e,0x3c,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50,0xf9,0x74,0x40,
  84904. +0x35,0xf0,0x75,0x5b,0xff,0xf5,0x5c,0x89,0x5d,0x90,0x9e,0x34,0xe0,0x90,0x41,0xf2,
  84905. +0x93,0xff,0xd3,0x90,0x9e,0x3b,0xe0,0x9f,0x90,0x9e,0x3a,0xe0,0x94,0x00,0x40,0x09,
  84906. +0xe4,0xfd,0xaf,0x59,0x12,0x67,0xb1,0xe1,0x2c,0xe5,0x59,0x25,0xe0,0x24,0xc2,0xf5,
  84907. +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xf5,0x61,0xa3,0xe0,0xf5,0x62,0xab,0x5b,0xaa,
  84908. +0x5c,0xa9,0x5d,0x12,0x24,0x62,0xff,0x7e,0x00,0xab,0x5e,0xaa,0x5f,0xa9,0x60,0x12,
  84909. +0x42,0x97,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x62,0xf5,0x62,0xee,0x35,0x61,
  84910. +0xf5,0x61,0xab,0x5b,0xaa,0x5c,0xa9,0x5d,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x7e,
  84911. +0x00,0xab,0x5e,0xaa,0x5f,0xa9,0x60,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac,0xf0,
  84912. +0x12,0x24,0x7b,0xef,0x25,0x62,0xf5,0x62,0xee,0x35,0x61,0xf5,0x61,0xab,0x5b,0xaa,
  84913. +0x5c,0xa9,0x5d,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x5e,0xaa,0x5f,
  84914. +0xa9,0x60,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,
  84915. +0x62,0xf5,0x62,0xee,0x35,0x61,0xf5,0x61,0xab,0x5b,0xaa,0x5c,0xa9,0x5d,0x90,0x00,
  84916. +0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x5e,0xaa,0x5f,0xa9,0x60,0x90,0x00,0x06,
  84917. +0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x62,0xf5,0x62,0xee,0x35,
  84918. +0x61,0xf5,0x61,0xab,0x5b,0xaa,0x5c,0xa9,0x5d,0x90,0x00,0x04,0x12,0x42,0x20,0xff,
  84919. +0x7e,0x00,0xab,0x5e,0xaa,0x5f,0xa9,0x60,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd,0xac,
  84920. +0xf0,0x12,0x24,0x7b,0xef,0x25,0x62,0xf5,0x62,0xee,0x35,0x61,0xf5,0x61,0xab,0x5b,
  84921. +0xaa,0x5c,0xa9,0x5d,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x9e,0x38,
  84922. +0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0xd3,0xe5,0x62,0x9f,0xe5,0x61,0x9e,0x40,
  84923. +0x0c,0xe5,0x62,0x9f,0xf5,0x62,0xe5,0x61,0x9e,0xf5,0x61,0x80,0x05,0xe4,0xf5,0x61,
  84924. +0xf5,0x62,0xe5,0x59,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe5,
  84925. +0x61,0xf0,0xa3,0xe5,0x62,0xf0,0x90,0x9e,0x34,0xe0,0x25,0xe0,0x24,0x66,0xf5,0x82,
  84926. +0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x62,0xe4,0x93,0x95,0x61,0x50,
  84927. +0x07,0xaf,0x59,0x12,0x65,0xb2,0xe1,0x00,0x90,0x9e,0x34,0xe0,0x25,0xe0,0x24,0x9e,
  84928. +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x62,0xe4,0x93,0x95,
  84929. +0x61,0x50,0x02,0xe1,0x00,0x7d,0x01,0xaf,0x59,0x12,0x67,0xb1,0xe1,0x00,0x74,0xe6,
  84930. +0x25,0x59,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,
  84931. +0x09,0x90,0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x35,0xe0,0xc3,0x94,0x19,
  84932. +0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x35,0xe0,0xc3,0x94,0x11,0x40,
  84933. +0x2e,0x80,0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x35,0xe0,0xc3,
  84934. +0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x35,0xe0,0xc3,0x94,0x03,
  84935. +0x40,0x0d,0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,0x74,
  84936. +0x84,0x25,0x59,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x63,0x74,0x44,0x25,
  84937. +0x59,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xa1,
  84938. +0xb6,0x90,0x9a,0x84,0xe0,0x64,0x01,0x60,0x02,0xa1,0xb6,0x74,0x85,0x25,0x59,0xf5,
  84939. +0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,
  84940. +0x33,0xfe,0x74,0x41,0x25,0x59,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xfd,0xd3,
  84941. +0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,
  84942. +0xfe,0x74,0x44,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3,0x9f,0xee,
  84943. +0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x59,0xf5,0x82,0xe4,0x34,
  84944. +0x9d,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x35,0xe0,0x6f,0x60,0x3d,0x74,0x44,0x25,0x59,
  84945. +0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x63,
  84946. +0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x63,0x03,0x80,0x03,0x75,0x63,
  84947. +0x01,0x74,0x41,0x25,0x59,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0,0x74,0x85,
  84948. +0x25,0x59,0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x59,0xf5,0x82,0xe4,
  84949. +0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9a,0xf5,
  84950. +0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x63,0x74,0xe6,0x25,0x59,0xf5,0x82,0xe4,
  84951. +0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x35,0xe0,0xff,0x74,0x26,0x25,0x59,0xf5,
  84952. +0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x59,0xf5,0x82,0xe4,0x34,
  84953. +0x98,0xf5,0x83,0xe5,0x63,0xf0,0x75,0xf0,0x09,0xe5,0x59,0x90,0x96,0x4c,0x12,0x43,
  84954. +0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x63,0x74,0xe6,0x25,0x59,0xf5,0x82,0xe4,0x34,
  84955. +0x9c,0xf5,0x83,0xe4,0xf0,0xad,0x63,0xc1,0xfb,0xec,0x64,0x06,0x60,0x02,0xe1,0x00,
  84956. +0xf5,0x61,0xf5,0x62,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x9e,0x38,0xe0,0xfc,
  84957. +0xa3,0xe0,0xfd,0x12,0x24,0x7b,0x90,0x9e,0x36,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x84,
  84958. +0x25,0x59,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x63,0xe4,0xf5,0x5a,0xab,
  84959. +0x5e,0xaa,0x5f,0xa9,0x60,0x75,0xf0,0x02,0xe5,0x5a,0xa4,0xf5,0x82,0x85,0xf0,0x83,
  84960. +0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x5a,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00,0x12,
  84961. +0x24,0x7b,0xef,0x25,0x62,0xf5,0x62,0xee,0x35,0x61,0xf5,0x61,0xc3,0x90,0x9e,0x37,
  84962. +0xe0,0x95,0x62,0x90,0x9e,0x36,0xe0,0x95,0x61,0x40,0x07,0x05,0x5a,0xe5,0x5a,0xb4,
  84963. +0x05,0xbd,0xe5,0x5a,0xc3,0x13,0xf5,0x5a,0xe5,0x63,0xb4,0x01,0x06,0xe5,0x5a,0x70,
  84964. +0x46,0x80,0x13,0xe5,0x63,0xb4,0x03,0x15,0xe5,0x5a,0x70,0x05,0x75,0x63,0x03,0x80,
  84965. +0x39,0xe5,0x5a,0xb4,0x01,0x05,0x75,0x63,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x63,0xb4,
  84966. +0x05,0x28,0xe5,0x5a,0x70,0x05,0x75,0x63,0x05,0x80,0x0d,0xe5,0x5a,0xb4,0x01,0x05,
  84967. +0x75,0x63,0x03,0x80,0x03,0x75,0x63,0x01,0xd3,0x90,0x9e,0x3b,0xe0,0x94,0x03,0x90,
  84968. +0x9e,0x3a,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x63,0xd3,0x90,0x9e,0x3b,0xe0,0x94,
  84969. +0x03,0x90,0x9e,0x3a,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x63,0x74,0x84,0x25,0x59,
  84970. +0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe5,0x63,0xf0,0xfd,0xaf,0x59,0x12,0x65,0x72,
  84971. +0x74,0xe6,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,
  84972. +0xe6,0x50,0x0e,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04,0xf0,0x80,
  84973. +0x0b,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xab,0x5e,0xaa,0x5f,
  84974. +0xa9,0x60,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x5e,0xaa,0x5f,0xa9,0x60,0x90,0x00,
  84975. +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19,
  84976. +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,
  84977. +0x43,0x19,0xe5,0x59,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,
  84978. +0xf0,0xa3,0xf0,0xe5,0x59,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,
  84979. +0xe4,0xf0,0xa3,0xf0,0xe5,0x59,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,
  84980. +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x59,0xe5,0x59,0xc3,0x94,0x40,0x50,0x02,0x21,0x54,
  84981. +0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,
  84982. +0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,
  84983. +0xbd,0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,0x01,0x04,0xf0,0xe4,0xfd,0x75,
  84984. +0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,
  84985. +0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,
  84986. +0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,
  84987. +0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x08,0x12,0x43,
  84988. +0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0x74,
  84989. +0x13,0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0x74,0x84,
  84990. +0x2d,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xed,0x25,0xe0,0x24,0x80,0xf5,
  84991. +0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,
  84992. +0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,
  84993. +0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x44,0xf5,
  84994. +0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,
  84995. +0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,
  84996. +0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x86,0x2d,0xf5,0x82,0xe4,
  84997. +0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,
  84998. +0xe4,0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x41,
  84999. +0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,
  85000. +0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,
  85001. +0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4b,
  85002. +0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x5f,
  85003. +0x74,0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0c,0xf0,
  85004. +0x75,0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,
  85005. +0xf0,0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,
  85006. +0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,
  85007. +0x90,0x96,0x49,0x12,0x43,0x5f,0xe4,0xf0,0xed,0xc3,0x94,0x20,0x50,0x0f,0x74,0x84,
  85008. +0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x80,0x0d,0x74,0xa6,0x2d,
  85009. +0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x40,0x60,0x03,
  85010. +0x02,0x6f,0xcf,0x22,0x12,0x24,0x62,0xf5,0x59,0xc3,0x94,0x40,0x50,0x15,0x90,0x00,
  85011. +0x02,0x12,0x42,0x20,0xff,0x74,0x44,0x25,0x59,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,
  85012. +0xef,0xf0,0x22,0xe5,0x59,0xb4,0x40,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x96,
  85013. +0x42,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x3f,0xfe,0xef,0x54,0x80,
  85014. +0xc4,0x13,0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0x02,0x53,0xa4,0x12,0x24,0x62,0x90,
  85015. +0x95,0x01,0xf0,0x22,0x12,0x24,0x62,0xf5,0x73,0x22,0x90,0x00,0x02,0x12,0x42,0x20,
  85016. +0xff,0x30,0xe0,0x25,0x12,0x24,0x62,0x90,0x9e,0x56,0xf0,0x90,0x00,0x01,0x12,0x42,
  85017. +0x20,0x90,0x9e,0x57,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x55,0xf0,0x90,0x00,
  85018. +0x03,0x12,0x42,0x20,0x90,0x9e,0x5b,0xf0,0x22,0x90,0x9e,0x56,0x74,0x01,0xf0,0x90,
  85019. +0x9e,0x57,0x74,0x03,0xf0,0x90,0x9e,0x55,0x74,0x14,0xf0,0x90,0x9e,0x5b,0x74,0x05,
  85020. +0xf0,0x22,0x12,0x24,0x62,0x30,0xe0,0x18,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x5a,0xf0,
  85021. +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x9e,0x58,0xe4,0xf0,0xa3,0xef,0xf0,0x22,
  85022. +0x90,0x9e,0x5a,0x74,0x07,0xf0,0x90,0x9e,0x58,0xe4,0xf0,0xa3,0x74,0x02,0xf0,0x22,
  85023. +0x90,0x02,0x09,0xe0,0xfd,0x12,0x24,0x62,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x9e,0x67,
  85024. +0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x68,0xf0,0x90,0x00,
  85025. +0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x69,0xf0,0x90,0x00,0x03,0x12,0x42,
  85026. +0x20,0xff,0xed,0x2f,0x90,0x9e,0x6a,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0xae,
  85027. +0x05,0xed,0x2f,0x90,0x9e,0x6b,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,
  85028. +0x9e,0x3f,0x12,0x43,0x8b,0x90,0x9e,0x3f,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,
  85029. +0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x9e,0x3f,0x12,0x43,0x6b,
  85030. +0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x24,0x62,0xff,0x60,0x2c,0xb5,
  85031. +0x22,0x16,0x90,0x9e,0x3f,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65,0x24,
  85032. +0x70,0x04,0xe5,0x23,0x65,0xf0,0x60,0x23,0x90,0x9e,0x3f,0x12,0x43,0x6b,0x90,0x00,
  85033. +0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0x00,0x80,0x10,0x90,0x9e,0x3f,0x12,0x43,
  85034. +0x6b,0x12,0x24,0x62,0x65,0x22,0x60,0x03,0x12,0x44,0xca,0xd0,0xd0,0x92,0xaf,0x22,
  85035. +0x90,0x9e,0x42,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x22,0x01,0x8e,0x23,0xf5,0x24,0xe4,
  85036. +0xfd,0x7f,0x0b,0x71,0x44,0xe4,0xfd,0x7f,0x02,0x71,0x44,0x12,0x4f,0xbe,0xe4,0xff,
  85037. +0x12,0x44,0xf1,0xe4,0xf5,0x26,0x90,0x01,0xc9,0xe5,0x26,0xf0,0x90,0x9e,0x42,0xe0,
  85038. +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e,
  85039. +0x01,0x02,0x30,0x62,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x45,0xed,0xf0,
  85040. +0x90,0x9e,0x44,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x9e,
  85041. +0x44,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,
  85042. +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9e,0x44,0xe0,0xff,0x74,0x01,0xa8,
  85043. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12,
  85044. +0x49,0xb9,0x90,0x9e,0x44,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  85045. +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x9e,0x44,0xe0,0x24,0xf8,0xf0,
  85046. +0xa3,0xe0,0x70,0x1d,0x90,0x9e,0x44,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  85047. +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80,
  85048. +0x1a,0x90,0x9e,0x44,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  85049. +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x49,0xb9,0x90,0x9e,
  85050. +0x44,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,
  85051. +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x49,0xb9,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,
  85052. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x6d,0xe0,0x90,0x9e,0x40,0xf0,0x90,0x9e,0x6e,
  85053. +0xe0,0xf5,0x64,0xa3,0xe0,0xf5,0x65,0xe4,0xf5,0x61,0x74,0x70,0x25,0x61,0xf5,0x82,
  85054. +0xe4,0x34,0x9e,0xf5,0x83,0xe0,0xff,0x74,0x66,0x25,0x61,0xf8,0xa6,0x07,0x05,0x61,
  85055. +0xe5,0x61,0xb4,0x04,0xe5,0x90,0x9e,0x40,0xe0,0x12,0x43,0x94,0x74,0x6b,0x00,0x75,
  85056. +0x93,0x01,0x74,0x71,0x02,0x74,0x71,0x03,0x74,0x71,0x04,0x75,0x93,0x05,0x75,0x63,
  85057. +0x80,0x75,0x79,0x81,0x75,0x93,0x82,0x00,0x00,0x75,0x8f,0xaf,0x69,0xb1,0x9a,0xa1,
  85058. +0x93,0x90,0x9e,0x40,0xe0,0xff,0xb4,0x02,0x08,0x90,0x9e,0x3f,0x74,0x01,0xf0,0x80,
  85059. +0x0f,0xef,0x90,0x9e,0x3f,0xb4,0x03,0x05,0x74,0x02,0xf0,0x80,0x03,0x74,0x04,0xf0,
  85060. +0xc3,0xe5,0x64,0x94,0x08,0x50,0x49,0xe4,0xf5,0x61,0x90,0x9e,0x3f,0xe0,0xff,0xe5,
  85061. +0x61,0xc3,0x9f,0x40,0x02,0xa1,0x93,0xc3,0xe5,0x64,0x94,0x01,0x50,0x14,0xe5,0x61,
  85062. +0x25,0x65,0xff,0xc3,0x74,0x03,0x95,0x61,0x24,0x66,0xf8,0xe6,0xfd,0x12,0x4a,0xc1,
  85063. +0x80,0x1a,0xc3,0x74,0x03,0x95,0x61,0x24,0x66,0xf8,0xe6,0xff,0xe5,0x61,0x7c,0x00,
  85064. +0x25,0x65,0xfd,0xec,0x35,0x64,0x8d,0x82,0xf5,0x83,0xef,0xf0,0x05,0x61,0x80,0xba,
  85065. +0xc3,0xe5,0x64,0x94,0x10,0x40,0x02,0xa1,0x93,0x90,0x9e,0x40,0xe0,0x64,0x04,0x60,
  85066. +0x02,0xa1,0x93,0xaf,0x67,0xfc,0xfd,0xfe,0x78,0x10,0x12,0x24,0xf5,0xc0,0x04,0xc0,
  85067. +0x05,0xc0,0x06,0xc0,0x07,0xaf,0x66,0xe4,0xfc,0xfd,0xfe,0x78,0x18,0x12,0x24,0xf5,
  85068. +0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,0x43,0x46,0xc0,0x04,0xc0,0x05,0xc0,
  85069. +0x06,0xc0,0x07,0xaf,0x68,0xe4,0xfc,0xfd,0xfe,0x78,0x08,0x12,0x24,0xf5,0xd0,0x03,
  85070. +0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,0x43,0x46,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,
  85071. +0x07,0xaf,0x69,0xe4,0xfc,0xfd,0xfe,0x12,0x43,0x46,0xa3,0x12,0x25,0x08,0x90,0x9e,
  85072. +0x41,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0xaf,0x65,0xae,0x64,0x12,0x2b,
  85073. +0x08,0x80,0x30,0xe5,0x68,0x7f,0x00,0xfe,0xef,0x25,0x69,0xf5,0x63,0xe4,0x3e,0xf5,
  85074. +0x62,0xaf,0x63,0xfe,0x12,0x32,0x15,0x80,0x1a,0xe5,0x68,0x7f,0x00,0xfe,0xef,0x25,
  85075. +0x69,0xf5,0x63,0xe4,0x3e,0xf5,0x62,0xaf,0x63,0xfe,0x12,0x31,0x82,0x80,0x04,0x7f,
  85076. +0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x6a,0xe4,0x90,0x9e,0x45,
  85077. +0xf0,0xe5,0x6a,0x14,0xfe,0x90,0x9e,0x45,0xe0,0xff,0xc3,0x9e,0x50,0x0e,0xef,0x04,
  85078. +0xfd,0x12,0x2d,0x4d,0x90,0x9e,0x45,0xe0,0x04,0xf0,0x80,0xe5,0xe5,0x6a,0x14,0xff,
  85079. +0x7d,0xff,0x12,0x2d,0x4d,0x90,0x9e,0x45,0xe5,0x6a,0xf0,0x90,0x9e,0x45,0xe0,0xc3,
  85080. +0x94,0xff,0x50,0x0f,0xe0,0xff,0x04,0xfd,0x12,0x2d,0x4d,0x90,0x9e,0x45,0xe0,0x04,
  85081. +0xf0,0x80,0xe8,0xad,0x6a,0x7f,0xff,0x02,0x2d,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  85082. +0xd0,0xe4,0xf5,0x5b,0x75,0x5c,0x04,0xf5,0x5d,0xf5,0x5f,0xf5,0x60,0x90,0x02,0x09,
  85083. +0xe0,0xff,0x12,0x24,0x62,0xfe,0xef,0x2e,0xf5,0x5e,0x30,0xe0,0x08,0x75,0x59,0x00,
  85084. +0x75,0x5a,0x80,0x80,0x05,0xe4,0xf5,0x59,0xf5,0x5a,0xe5,0x5e,0xc3,0x13,0x90,0xfd,
  85085. +0x10,0xf0,0x74,0x20,0x25,0x5b,0xf5,0x5b,0xad,0x5a,0xe5,0x5b,0x2d,0xff,0x24,0x01,
  85086. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0x9e,0x6d,0xf0,0x74,0x02,0x2f,0xf5,
  85087. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0xe5,0x5b,0x2d,0x24,0x03,0xf5,0x82,0xe4,
  85088. +0x34,0xfc,0xf5,0x83,0xe0,0x24,0x00,0xff,0xe4,0x3e,0x90,0x9e,0x6e,0xf0,0xa3,0xef,
  85089. +0xf0,0x7f,0x04,0xe5,0x5b,0x25,0x5a,0x2f,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
  85090. +0x83,0xe0,0xfe,0x74,0x6c,0x2f,0xf5,0x82,0xe4,0x34,0x9e,0xf5,0x83,0xee,0xf0,0x0f,
  85091. +0xbf,0x08,0xe0,0x91,0x0e,0xef,0x70,0x3f,0x90,0x01,0xc3,0xe0,0x60,0x25,0xc3,0xe5,
  85092. +0x60,0x94,0xe8,0xe5,0x5f,0x94,0x03,0x40,0x09,0x90,0x01,0xc6,0xe0,0x44,0x10,0xf0,
  85093. +0x80,0x63,0x05,0x60,0xe5,0x60,0x70,0x02,0x05,0x5f,0x7f,0x0a,0x7e,0x00,0x12,0x32,
  85094. +0x15,0x80,0xd5,0x90,0x01,0xc6,0xe0,0x90,0x01,0xc3,0x30,0xe2,0x05,0x74,0xfe,0xf0,
  85095. +0x80,0x43,0x74,0xff,0xf0,0x80,0x3e,0xe5,0x5b,0xb4,0x78,0x23,0xe4,0xf5,0x5b,0x05,
  85096. +0x5e,0xe5,0x5a,0x64,0x80,0x45,0x59,0x70,0x06,0xf5,0x59,0xf5,0x5a,0x80,0x06,0x75,
  85097. +0x59,0x00,0x75,0x5a,0x80,0xe5,0x5e,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x80,0x06,0x74,
  85098. +0x08,0x25,0x5b,0xf5,0x5b,0xe5,0x5d,0x15,0x5d,0x70,0x02,0x15,0x5c,0xe5,0x5d,0x45,
  85099. +0x5c,0x60,0x02,0xc1,0x28,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,
  85100. +0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xe4,0xf5,0x25,0x22,0xe4,0x90,0x9e,0xaa,
  85101. +0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,
  85102. +0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x9e,0xab,0xe0,0x94,0xe8,0x90,
  85103. +0x9e,0xaa,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x32,
  85104. +0x15,0x90,0x9e,0xaa,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0x90,0x9e,0x77,
  85105. +0xe0,0x90,0x9e,0x0f,0xf0,0x22,0xef,0x70,0x03,0x02,0x79,0x1e,0x90,0x9e,0x0f,0xe0,
  85106. +0x60,0x03,0x02,0x7c,0xe9,0x90,0x9d,0xfb,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,
  85107. +0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x9d,0xa7,0x12,0x43,0x53,0x90,0x80,
  85108. +0x96,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x9d,0xab,0x12,0x43,
  85109. +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x9d,
  85110. +0xaf,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,
  85111. +0x08,0x90,0x9d,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x70,0x7e,
  85112. +0x0e,0x12,0x2b,0x08,0x90,0x9d,0xb7,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,
  85113. +0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xbb,0x12,0x43,0x53,0x90,0x80,0x96,
  85114. +0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xbf,0x12,0x43,0x53,
  85115. +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xc3,
  85116. +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x08,
  85117. +0x90,0x9d,0xc7,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x84,0x7e,0x0e,
  85118. +0x12,0x2b,0x08,0x90,0x9d,0xcb,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,
  85119. +0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xcf,0x12,0x43,0x53,0x90,0x80,0x96,0x12,
  85120. +0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xd3,0x12,0x43,0x53,0x90,
  85121. +0x80,0x96,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xd7,0x12,
  85122. +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x08,0x90,
  85123. +0x9d,0xdb,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd8,0x7e,0x0e,0x12,
  85124. +0x2b,0x08,0x90,0x9d,0xdf,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xdc,
  85125. +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xe3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,
  85126. +0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xe7,0x12,0x43,0x53,0x90,0x80,
  85127. +0x96,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x9d,0xeb,0x12,0x43,
  85128. +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x9d,
  85129. +0xef,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,
  85130. +0x08,0x90,0x9d,0xf3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,
  85131. +0x09,0x12,0x2b,0x08,0x90,0x9d,0xf7,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,
  85132. +0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0x90,0x9e,0x0f,0x74,0x01,0xf0,0x22,0x90,0x9e,
  85133. +0x0f,0xe0,0x64,0x01,0x60,0x02,0x81,0xe9,0x7f,0x8c,0x7e,0x08,0x12,0x22,0x65,0x90,
  85134. +0x9d,0xfb,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x22,0x65,0x90,0x9d,0xa7,0x12,
  85135. +0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x22,0x65,0x90,0x9d,0xab,0x12,0x25,0x08,0x7f,
  85136. +0x6c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xaf,0x12,0x25,0x08,0x7f,0x70,0x7e,0x0e,
  85137. +0x12,0x22,0x65,0x90,0x9d,0xb3,0x12,0x25,0x08,0x7f,0x74,0x7e,0x0e,0x12,0x22,0x65,
  85138. +0x90,0x9d,0xb7,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xbb,
  85139. +0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xbf,0x12,0x25,0x08,
  85140. +0x7f,0x80,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xc3,0x12,0x25,0x08,0x7f,0x84,0x7e,
  85141. +0x0e,0x12,0x22,0x65,0x90,0x9d,0xc7,0x12,0x25,0x08,0x7f,0x88,0x7e,0x0e,0x12,0x22,
  85142. +0x65,0x90,0x9d,0xcb,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,
  85143. +0xcf,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xd3,0x12,0x25,
  85144. +0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xd7,0x12,0x25,0x08,0x7f,0xd8,
  85145. +0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xdb,0x12,0x25,0x08,0x7f,0xdc,0x7e,0x0e,0x12,
  85146. +0x22,0x65,0x90,0x9d,0xdf,0x12,0x25,0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x22,0x65,0x90,
  85147. +0x9d,0xe3,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x22,0x65,0x90,0x9d,0xe7,0x12,
  85148. +0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x9d,0xeb,0x12,0x25,0x08,0x7f,
  85149. +0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,0x9d,0xef,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,
  85150. +0x12,0x22,0x65,0x90,0x9d,0xf3,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,
  85151. +0x90,0x9d,0xf7,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x22,0x65,0x90,0x9e,0xa4,
  85152. +0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec,0x90,0x9e,
  85153. +0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,
  85154. +0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x01,0x00,
  85155. +0x00,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0xdb,
  85156. +0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,
  85157. +0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,
  85158. +0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,
  85159. +0x14,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,
  85160. +0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,
  85161. +0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,
  85162. +0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x08,0x90,
  85163. +0x80,0x96,0x12,0x25,0x14,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x08,
  85164. +0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2b,
  85165. +0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,
  85166. +0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,
  85167. +0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,
  85168. +0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd8,
  85169. +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa4,0x7f,
  85170. +0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa4,
  85171. +0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x24,0xdb,0x25,
  85172. +0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,
  85173. +0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xe4,0xff,0xec,0x90,0x9e,
  85174. +0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xef,0x44,0x11,0xff,0xec,0x90,
  85175. +0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,
  85176. +0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,
  85177. +0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,
  85178. +0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xef,0x44,0x01,0xff,
  85179. +0xec,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,
  85180. +0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,
  85181. +0x65,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xe4,0xff,0xec,
  85182. +0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xef,0x44,0x11,0xff,
  85183. +0xec,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,
  85184. +0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,
  85185. +0x65,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0xed,0x54,0x0f,
  85186. +0xfd,0xec,0x54,0xf0,0xfc,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,0x9e,0xa4,0x12,0x43,
  85187. +0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,
  85188. +0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,
  85189. +0x2b,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,0x9e,0xa4,0x12,0x25,0x08,0x90,
  85190. +0x9e,0xa4,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x9e,0xa4,0x12,0x25,0x08,
  85191. +0x90,0x9e,0xa4,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x9e,0xa4,0x12,0x25,
  85192. +0x08,0x90,0x9e,0xa4,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,
  85193. +0x08,0x12,0x2b,0x08,0xe4,0x90,0x9e,0x0f,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,
  85194. +0x90,0x9e,0x1e,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,
  85195. +0x59,0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x4a,0xc1,0x7d,
  85196. +0x40,0x7f,0x01,0x12,0x31,0x66,0xe5,0x59,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,
  85197. +0x45,0x12,0x4a,0xc1,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x9e,0x1e,0xf0,0x90,
  85198. +0x9e,0x24,0xf0,0x90,0x9e,0x27,0xf0,0x90,0x9e,0x25,0xf0,0x90,0x9e,0x28,0xf0,0x90,
  85199. +0x9e,0x26,0xf0,0x90,0x9e,0x29,0xf0,0x90,0x9e,0x10,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,
  85200. +0xf0,0xa3,0xf0,0x90,0x9e,0x15,0xf0,0x90,0x9e,0x1a,0xf0,0x90,0x9e,0x1c,0xf0,0x90,
  85201. +0x9e,0x2e,0xf0,0x90,0x9e,0x1f,0xf0,0x90,0x9e,0x1b,0xf0,0x90,0x9e,0x14,0xf0,0x90,
  85202. +0x00,0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x4a,0xc1,0x90,0x9e,0x15,0xe0,0xc3,
  85203. +0x94,0x14,0x50,0x05,0xe0,0x04,0xf0,0xc1,0x33,0x90,0x9e,0x15,0xe0,0x64,0x14,0x60,
  85204. +0x02,0xc1,0x33,0x90,0x9e,0x24,0xe0,0x70,0x25,0x90,0x9e,0x27,0xe0,0x70,0x1f,0x90,
  85205. +0x9e,0x25,0xe0,0x70,0x19,0x90,0x9e,0x28,0xe0,0x70,0x13,0x90,0x9e,0x26,0xe0,0x70,
  85206. +0x0d,0x90,0x9e,0x29,0xe0,0x70,0x07,0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x9e,
  85207. +0x24,0xe0,0x90,0x04,0x44,0xf0,0x90,0x9e,0x25,0xe0,0x90,0x04,0x45,0xf0,0x90,0x9e,
  85208. +0x26,0xe0,0x90,0x04,0x46,0xf0,0xa3,0xe4,0xf0,0x90,0x9e,0x27,0xe0,0x90,0x04,0x48,
  85209. +0xf0,0x90,0x9e,0x28,0xe0,0x90,0x04,0x49,0xf0,0x90,0x9e,0x29,0xe0,0x90,0x04,0x4a,
  85210. +0xf0,0xa3,0xe4,0xf0,0x90,0x9e,0x10,0xe0,0x90,0x04,0x4c,0xf0,0x90,0x9e,0x11,0xe0,
  85211. +0x90,0x04,0x4d,0xf0,0x90,0x9e,0x12,0xe0,0x90,0x04,0x4e,0xf0,0x90,0x9e,0x13,0xe0,
  85212. +0x90,0x04,0x4f,0xf0,0xe4,0x90,0x9e,0x15,0xf0,0x90,0x9e,0x10,0x04,0xf0,0xe4,0xa3,
  85213. +0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0x24,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,
  85214. +0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x34,0xf0,0x90,0x05,0x61,0xe0,0x90,
  85215. +0x9e,0x35,0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x36,0xf0,0x90,0x05,0x63,0xe0,0x90,
  85216. +0x9e,0x37,0xf0,0x90,0x9e,0x2d,0xe0,0xff,0x90,0x9e,0x37,0xe0,0xfe,0xd3,0x9f,0x50,
  85217. +0x0b,0x90,0x9e,0x2d,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x9e,0x1b,0xe0,
  85218. +0xb4,0x01,0x02,0x80,0x03,0x90,0x9e,0x1f,0xe0,0xff,0x12,0x4e,0xd8,0x22,0x90,0x9e,
  85219. +0x2e,0xe0,0x64,0x01,0x60,0x08,0x90,0x9e,0x1c,0xe0,0x60,0x02,0xe1,0x55,0x90,0x9e,
  85220. +0x10,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x9e,0x11,0xe0,
  85221. +0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x9e,0x12,0xe0,0xc3,
  85222. +0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x11,0xf0,0x80,0x15,0x90,0x9e,
  85223. +0x13,0xe0,0xc3,0x94,0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x12,0xf0,0x90,
  85224. +0x9e,0x11,0xf0,0x90,0x9e,0x10,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,
  85225. +0x30,0xe2,0x32,0x90,0x9e,0x24,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,
  85226. +0x24,0x90,0x9e,0x25,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,
  85227. +0x90,0x9e,0x26,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x25,
  85228. +0xf0,0x90,0x9e,0x24,0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x9e,0x27,0xe0,
  85229. +0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x9e,0x28,0xe0,0xc3,0x94,
  85230. +0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x9e,0x29,0xe0,0xc3,0x94,0xff,
  85231. +0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x28,0xf0,0x90,0x9e,0x27,0xf0,0x90,0x04,
  85232. +0xfd,0xe0,0x44,0x01,0xf0,0x22,0xf5,0x67,};
  85233. +
  85234. +// =================== v84 UMC B Cut COMMON 2012-04-13 =====================
  85235. +u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] = {
  85236. +0xc2,0x88,0x02,0x00,0x54,0x00,0x01,0x00,0x04,0x13,0x11,0x08,0x26,0x3d,0x01,0x00,
  85237. +0x58,0x97,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85238. +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85239. +0x00,0x00,0x00,0x02,0x50,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85240. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85241. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85242. +0x00,0x00,0x00,0x02,0x57,0x91,0x00,0x00,0x00,0x00,0x00,0xa1,0xe8,0x00,0x00,0x00,
  85243. +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02,
  85244. +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09,
  85245. +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08,
  85246. +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18,
  85247. +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21,
  85248. +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20,
  85249. +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10,
  85250. +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20,
  85251. +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04,
  85252. +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,
  85253. +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b,
  85254. +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c,
  85255. +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,
  85256. +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,
  85257. +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,
  85258. +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,
  85259. +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,
  85260. +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,
  85261. +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,
  85262. +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,
  85263. +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,
  85264. +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,
  85265. +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,
  85266. +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,
  85267. +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,
  85268. +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,
  85269. +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,
  85270. +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,
  85271. +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85272. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  85273. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  85274. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  85275. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  85276. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  85277. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  85278. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  85279. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,
  85280. +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,
  85281. +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,
  85282. +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,
  85283. +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,
  85284. +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,
  85285. +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,
  85286. +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,
  85287. +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,
  85288. +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,
  85289. +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,
  85290. +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec,
  85291. +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4,
  85292. +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,
  85293. +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82,
  85294. +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0,
  85295. +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,
  85296. +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,
  85297. +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x48,0x29,
  85298. +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,
  85299. +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,
  85300. +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,
  85301. +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60,
  85302. +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,
  85303. +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,
  85304. +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,
  85305. +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x41,0x9e,0x77,
  85306. +0x00,0x41,0x9e,0xae,0x00,0x41,0x9e,0x54,0x80,0x41,0x9e,0xb0,0x00,0x00,0xf0,0x90,
  85307. +0x9e,0x5d,0xe0,0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0xd3,0x10,
  85308. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x85,0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,
  85309. +0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,
  85310. +0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x85,0xf0,0x90,0x9e,0x5b,0xe0,0x90,0x9e,0x86,
  85311. +0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x5e,0x90,0x01,0x5f,0x74,0x05,0xf0,
  85312. +0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x9e,0x63,0x14,0xf0,0xe5,0x61,0x54,0x0f,0xc3,
  85313. +0x94,0x0c,0x50,0x03,0x12,0x54,0xe3,0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,
  85314. +0xf0,0x22,0xe4,0xf5,0x65,0x7f,0x60,0x7e,0x01,0x80,0xed,0x7d,0x01,0xaf,0x62,0x02,
  85315. +0x54,0xe7,0xb1,0xb0,0xbf,0x01,0x12,0x90,0x9e,0x79,0xe0,0xff,0xe4,0xfd,0xf1,0x79,
  85316. +0x12,0x5f,0xf7,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xb1,0xb0,0xbf,0x01,0x0f,0x90,
  85317. +0x02,0x09,0xe0,0xff,0x7d,0x01,0xf1,0x79,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,
  85318. +0x22,0x22,0x00,0x02,0x45,0x03,0x02,0x45,0x06,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  85319. +0x8b,0x20,0x8a,0x21,0x89,0x22,0x90,0x9e,0x87,0x71,0x8b,0xab,0x23,0xaa,0x24,0xa9,
  85320. +0x25,0x90,0x9e,0x8a,0x71,0x8b,0xaf,0x26,0x15,0x26,0xef,0x60,0x1b,0x90,0x9e,0x8a,
  85321. +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x9e,0x87,0xe4,0x75,0xf0,
  85322. +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x20,0xaa,0x21,0xa9,0x22,0xd0,0xd0,
  85323. +0x92,0xaf,0x22,0x90,0x9e,0x11,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0x90,0x06,0xa9,
  85324. +0xe0,0x90,0x9e,0x10,0xf0,0xe0,0x54,0xc0,0x70,0x08,0x53,0x64,0xfe,0x53,0x64,0xfd,
  85325. +0x91,0xcb,0x90,0x9e,0x10,0xe0,0x30,0xe6,0x13,0x43,0x64,0x01,0x90,0x9e,0x66,0xe0,
  85326. +0x64,0x02,0x60,0x04,0x91,0xd2,0x80,0x07,0x91,0x79,0x80,0x03,0x53,0x64,0xfe,0x90,
  85327. +0x9e,0x10,0xe0,0x30,0xe7,0x16,0x43,0x64,0x02,0xe4,0x90,0x9e,0x85,0x91,0x4e,0x90,
  85328. +0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x67,0x74,0x01,0xf0,0x22,0x53,0x64,0xfd,0x22,
  85329. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x01,0xc4,0x74,0xb0,0xf0,0x74,0x45,0xa3,
  85330. +0xf0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,
  85331. +0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,
  85332. +0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,
  85333. +0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,
  85334. +0x05,0xc0,0x06,0xc0,0x07,0x75,0x13,0x00,0x90,0x01,0xc4,0x74,0xe8,0xf0,0x74,0x45,
  85335. +0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,
  85336. +0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,
  85337. +0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x09,0x90,
  85338. +0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0xc9,0xe5,0x34,0x30,0xe2,0x38,0x90,0x01,0x3c,
  85339. +0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x24,0x90,0x9e,0x85,0xe4,0xf0,0x90,
  85340. +0x9e,0x5b,0xe0,0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x5e,
  85341. +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x9e,
  85342. +0x64,0xe4,0xf0,0x91,0xcb,0xe5,0x34,0x30,0xe3,0x38,0x90,0x01,0x3c,0x74,0x08,0xf0,
  85343. +0x90,0x06,0x92,0xe0,0x30,0xe1,0x24,0x90,0x9e,0x85,0xe4,0xf0,0x90,0x9e,0x5b,0xe0,
  85344. +0x90,0x9e,0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x5e,0x90,0x01,0x5f,
  85345. +0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x9e,0x63,0xe4,0xf0,
  85346. +0x91,0xcb,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x4b,0xfb,
  85347. +0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x4c,0x3d,0xe5,0x35,
  85348. +0x30,0xe0,0x44,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,0x44,0x7f,0xf0,
  85349. +0x90,0x00,0x83,0xe0,0x54,0x0f,0xf5,0x13,0xb4,0x01,0x02,0x80,0x1c,0xe5,0x13,0xb4,
  85350. +0x02,0x05,0x90,0x00,0x83,0x80,0x12,0xe5,0x13,0xb4,0x04,0x05,0x90,0x00,0x83,0x80,
  85351. +0x08,0xe5,0x13,0xb4,0x0c,0x06,0x90,0x00,0x83,0xe0,0xf5,0x62,0x90,0x01,0xbb,0xe5,
  85352. +0x62,0xf0,0x12,0x60,0xc0,0x91,0xcb,0xe5,0x35,0x30,0xe2,0x06,0x90,0x01,0x3d,0x74,
  85353. +0x04,0xf0,0xe5,0x35,0x30,0xe4,0x06,0x90,0x01,0x3d,0x74,0x10,0xf0,0xe5,0x36,0x30,
  85354. +0xe0,0x06,0x90,0x01,0x3e,0x74,0x01,0xf0,0xe5,0x36,0x30,0xe1,0x06,0x90,0x01,0x3e,
  85355. +0x74,0x02,0xf0,0x74,0xe8,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,
  85356. +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,
  85357. +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x9e,0x98,0xef,0xf0,0xa3,0xed,
  85358. +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x63,0x60,0x05,0xe4,0xff,0x12,0x54,0x97,0x90,
  85359. +0x9e,0x98,0xe0,0x30,0xe0,0x09,0x90,0x9e,0x9a,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90,
  85360. +0x9e,0x98,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90,
  85361. +0x9e,0x99,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc,
  85362. +0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  85363. +0xe0,0x44,0x80,0xf0,0x90,0x9e,0x9a,0xa3,0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4,
  85364. +0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  85365. +0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,
  85366. +0xf7,0xf0,0x90,0x9e,0x9a,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x75,0x28,0x33,0xe4,0xf5,
  85367. +0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,
  85368. +0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4,0x90,0x9e,0x16,0xf0,0xa3,0xf0,
  85369. +0x75,0x8e,0x02,0xf1,0xa1,0xf1,0xe9,0x90,0x9e,0x7e,0xef,0xf0,0xf1,0xdd,0x90,0x9e,
  85370. +0x80,0xef,0xf0,0xf1,0xf6,0x90,0x9e,0x75,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5,0x57,
  85371. +0x12,0x6e,0x77,0xf1,0xd4,0x12,0x60,0x4b,0x12,0x32,0x3d,0xf1,0xc9,0x11,0x0b,0x12,
  85372. +0x50,0x0e,0xf1,0xcd,0xf1,0xb1,0x12,0x44,0xff,0xf1,0x45,0x90,0x9e,0x18,0xe5,0xd9,
  85373. +0xf0,0x11,0xd0,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0xb1,0x45,0x75,0xe8,
  85374. +0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x9e,0x16,0xe0,0x64,0x01,0xf0,0x24,0x29,0x90,
  85375. +0x01,0xc4,0xf0,0x74,0x48,0xa3,0xf0,0xe5,0x57,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x57,
  85376. +0xef,0xd2,0xaf,0x12,0x58,0x74,0xe5,0x57,0x30,0xe6,0x17,0xc2,0xaf,0x53,0x57,0xbf,
  85377. +0xd2,0xaf,0x12,0x67,0xa1,0x90,0x9e,0x43,0xe0,0xff,0x60,0x03,0xb4,0x01,0x03,0x12,
  85378. +0x7b,0x49,0x90,0x9e,0x43,0xe0,0x70,0x03,0x12,0x7c,0x4c,0x12,0x73,0x85,0x80,0xb6,
  85379. +0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,
  85380. +0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0x31,0x05,0x7d,0xff,0x7f,0x55,0x31,0x05,0x7d,
  85381. +0xff,0x7f,0x56,0x31,0x05,0x7d,0xff,0x7f,0x57,0x80,0x0a,0xf0,0x90,0x00,0x45,0xe0,
  85382. +0x54,0xfe,0xfd,0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,
  85383. +0x00,0xed,0xf0,0xb1,0x45,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x14,0x60,0x30,0x14,0x60,
  85384. +0x66,0x24,0x02,0x60,0x02,0x21,0xc1,0x90,0x9e,0x3f,0x74,0x02,0xf0,0x90,0x00,0x48,
  85385. +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x31,0x05,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,
  85386. +0x47,0x31,0x05,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x71,0xe4,0x90,
  85387. +0x9e,0x3f,0xf0,0x90,0x9e,0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  85388. +0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x31,
  85389. +0x05,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x46,0xe0,
  85390. +0x44,0x10,0xfd,0x7f,0x46,0x80,0x38,0x90,0x9e,0x3f,0x74,0x01,0xf0,0x90,0x9e,0x45,
  85391. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,
  85392. +0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x45,0xe0,0x44,
  85393. +0x10,0xfd,0x7f,0x45,0x31,0x05,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x31,
  85394. +0x05,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x9e,0x41,0xf0,0x90,0x00,0x01,0x12,
  85395. +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x9e,0x40,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,
  85396. +0xe0,0x90,0x9e,0x44,0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x4f,0xf0,0x90,0x05,0x61,
  85397. +0xe0,0x90,0x9e,0x50,0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x51,0xf0,0x90,0x05,0x63,
  85398. +0xe0,0x90,0x9e,0x52,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x90,
  85399. +0x9e,0x40,0xe0,0xff,0x91,0xf0,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x90,0x9e,
  85400. +0x41,0xe0,0x70,0x02,0x41,0xc8,0x90,0x9e,0x40,0xe0,0x70,0x02,0x41,0xc8,0x90,0x9e,
  85401. +0x44,0xe0,0x70,0x02,0x41,0xc8,0xa2,0xaf,0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,
  85402. +0x90,0x9e,0x53,0x74,0x01,0xf0,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x11,0xfc,
  85403. +0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x31,0x05,0x90,0x9e,0x39,0xe0,0x60,
  85404. +0x15,0x90,0x9e,0x45,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,
  85405. +0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,
  85406. +0x54,0xef,0xfd,0x7f,0x45,0x31,0x05,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x9e,
  85407. +0x4f,0xe0,0x90,0x05,0x84,0xf0,0x90,0x9e,0x50,0xe0,0x90,0x05,0x85,0xf0,0x90,0x9e,
  85408. +0x51,0xe0,0x90,0x05,0x86,0xf0,0x90,0x9e,0x52,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,
  85409. +0xe4,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,
  85410. +0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2b,0x90,0x9e,0x41,0xe0,0x70,0x2d,0x90,0x9e,
  85411. +0x53,0x11,0xfb,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x31,0x05,0x90,0x05,
  85412. +0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x9e,0x24,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,
  85413. +0x12,0x36,0x92,0x90,0x9e,0x24,0xe0,0x24,0xff,0x92,0xaf,0x22,0x8b,0x14,0x8a,0x15,
  85414. +0x89,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x9e,0x42,0xf0,0xe0,0x30,0xe0,0x4b,
  85415. +0x90,0x9e,0x39,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0x3b,
  85416. +0x12,0x2a,0x7f,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42,0x20,0xff,
  85417. +0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,
  85418. +0x07,0x90,0x9e,0x3b,0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43,0x46,0x90,0x9e,
  85419. +0x45,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90,0x9e,0x39,0xf0,
  85420. +0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,0xec,0x44,0xc0,0xfc,0x90,
  85421. +0x9e,0x3b,0x12,0x2a,0x7f,0x90,0x9e,0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,
  85422. +0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x42,0xe0,0x30,0xe1,0x19,0x7d,
  85423. +0x0c,0x7f,0x47,0x31,0x05,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x31,0x05,
  85424. +0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1c,0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,
  85425. +0x47,0x31,0x05,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd,0x7f,0x48,0x31,0x05,0x90,0x00,
  85426. +0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0x31,0x05,0xe4,0x90,0x9e,0x3f,0xf0,0x22,0x90,
  85427. +0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,
  85428. +0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x31,0x05,0xe4,0xfd,0x7f,0x51,0x31,0x05,0xe4,
  85429. +0xfd,0x7f,0x52,0x31,0x05,0xe4,0xfd,0x7f,0x53,0x21,0x05,0xe5,0x65,0x64,0x01,0x70,
  85430. +0x3b,0xd1,0x85,0xbf,0x01,0x04,0x7f,0x01,0xd1,0x79,0x90,0x00,0x46,0xe0,0x44,0x04,
  85431. +0xfd,0x7f,0x46,0x31,0x05,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x31,0x05,
  85432. +0x90,0x00,0x46,0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x31,0x05,0x7f,0x02,0xd1,0xa1,0x8f,
  85433. +0x69,0x90,0x01,0xc9,0xe5,0x69,0xf0,0xb4,0x01,0x02,0xd1,0x19,0x22,0x90,0x9e,0x41,
  85434. +0xe0,0x64,0x01,0x60,0x02,0x81,0xef,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,
  85435. +0x31,0x05,0x90,0x9e,0x53,0xe0,0x70,0x31,0x90,0x9e,0x39,0xe0,0x60,0x15,0x90,0x9e,
  85436. +0x45,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,
  85437. +0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x9e,0x40,0xe0,0xff,0x91,0xf0,
  85438. +0x90,0x9e,0x53,0x74,0x01,0x11,0xfb,0x80,0x3f,0x90,0x9e,0x53,0xe0,0x64,0x01,0x70,
  85439. +0x37,0x90,0x9e,0x44,0xe0,0xff,0x91,0xf0,0xe4,0x90,0x9e,0x53,0xf0,0x90,0x00,0x45,
  85440. +0xe0,0x44,0x01,0xfd,0x7f,0x45,0x31,0x05,0x90,0x9e,0x39,0xe0,0x60,0x15,0x90,0x9e,
  85441. +0x3b,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,
  85442. +0xd9,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,
  85443. +0x9e,0x4f,0xe0,0x90,0x05,0x84,0xf0,0x90,0x9e,0x50,0xe0,0x90,0x05,0x85,0xf0,0x90,
  85444. +0x9e,0x51,0xe0,0x90,0x05,0x86,0xf0,0x90,0x9e,0x52,0xe0,0x90,0x05,0x87,0xf0,0x22,
  85445. +0x90,0x05,0x60,0xe0,0x90,0x9e,0x4f,0xf0,0x90,0x05,0x61,0xe0,0x90,0x9e,0x50,0xf0,
  85446. +0x90,0x05,0x62,0xe0,0x90,0x9e,0x51,0xf0,0x90,0x05,0x63,0xe0,0x90,0x9e,0x52,0xf0,
  85447. +0xc3,0x74,0xff,0x9f,0xfe,0x90,0x9e,0x50,0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,
  85448. +0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,
  85449. +0x9e,0x52,0x80,0x03,0x90,0x9e,0x51,0xe0,0x04,0xf0,0x22,0x90,0x9e,0x50,0xe0,0x2f,
  85450. +0xf0,0x22,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,
  85451. +0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x2a,0xed,
  85452. +0xf0,0x90,0x9e,0x29,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4e,0xa3,0xe0,0x70,0x1a,0x90,
  85453. +0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,
  85454. +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,
  85455. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,
  85456. +0xb1,0x45,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  85457. +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x59,0x90,0x9e,0x29,0xe0,0x24,0xf8,0xf0,
  85458. +0xa3,0xe0,0x70,0x1d,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  85459. +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80,
  85460. +0x1a,0x90,0x9e,0x29,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  85461. +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0xb1,0x45,0x90,0x9e,0x29,
  85462. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,
  85463. +0x00,0x43,0xb1,0x42,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x49,0xe0,0x90,0x9e,0xb1,
  85464. +0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x31,0x05,0x90,0x9e,0xb1,0xe0,
  85465. +0x44,0xb0,0xfd,0x7f,0x49,0x21,0x05,0x90,0x9e,0x27,0xee,0xf0,0xa3,0xef,0xf0,0x75,
  85466. +0x65,0x01,0x8e,0x66,0xf5,0x67,0xe4,0xfd,0x7f,0x0b,0xb1,0x55,0xe4,0xfd,0x7f,0x02,
  85467. +0xb1,0x55,0xd1,0x85,0xe4,0xff,0xd1,0x79,0xe4,0xf5,0x69,0x90,0x01,0xc9,0xe5,0x69,
  85468. +0xf0,0x90,0x9e,0x27,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,
  85469. +0x7d,0x01,0x7f,0x60,0x7e,0x01,0x02,0x35,0xab,0x90,0x01,0xca,0xe5,0x68,0xf0,0xef,
  85470. +0x60,0x02,0xd1,0x19,0x22,0x7f,0x0b,0xd1,0xa1,0xef,0x65,0x68,0x60,0x10,0xe5,0x68,
  85471. +0xb4,0x01,0x05,0xe4,0xf5,0x68,0x80,0x03,0x75,0x68,0x01,0x7f,0x01,0x22,0x7f,0x00,
  85472. +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xb2,0xef,0xf0,0xd3,0x94,0x07,
  85473. +0x50,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,
  85474. +0xff,0x90,0x00,0x46,0xb1,0x42,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,
  85475. +0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,
  85476. +0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,
  85477. +0xd8,0xf8,0xff,0x80,0x4b,0x90,0x9e,0xb2,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,
  85478. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,
  85479. +0xf0,0xb1,0x45,0x90,0x9e,0xb2,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,
  85480. +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x42,0xe0,0xfb,0xe4,0xfe,
  85481. +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,
  85482. +0xd0,0xd0,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x31,0x05,0x90,0x04,0xfd,0xe4,0xf0,
  85483. +0xa3,0xf0,0x90,0x9e,0x43,0xf0,0x90,0x9e,0x49,0xf0,0x90,0x9e,0x4c,0xf0,0x90,0x9e,
  85484. +0x4a,0xf0,0x90,0x9e,0x4d,0xf0,0x90,0x9e,0x4b,0xf0,0x90,0x9e,0x4e,0xf0,0x90,0x9e,
  85485. +0x35,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0x3a,0xf0,0x90,0x9e,
  85486. +0x3f,0xf0,0x90,0x9e,0x41,0xf0,0x90,0x9e,0x53,0xf0,0x90,0x9e,0x44,0xf0,0x90,0x9e,
  85487. +0x40,0xf0,0x90,0x9e,0x39,0xf0,0x90,0x00,0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x21,
  85488. +0x05,0xe4,0x90,0x9e,0x7d,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x21,
  85489. +0x05,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,
  85490. +0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4,0xf5,0x68,0x22,0x90,0x01,0x64,
  85491. +0x74,0xa0,0xf0,0x22,0x90,0x9e,0x80,0xe0,0x90,0x9e,0x0f,0xf0,0x22,0x90,0x00,0xf3,
  85492. +0xe0,0x7f,0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x7f,
  85493. +0x01,0x60,0x02,0x7f,0x00,0x22,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x0c,0x90,0x00,0xf2,
  85494. +0xe0,0x30,0xe7,0x05,0x7e,0xfd,0x7f,0x33,0x22,0x7e,0xfd,0x7f,0x2f,0x22,0x90,0x00,
  85495. +0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,
  85496. +0xe4,0xf0,0x22,0x90,0x01,0x02,0xe0,0x54,0x03,0xff,0xe0,0x54,0x0c,0x13,0x13,0x54,
  85497. +0x3f,0xfe,0xef,0x64,0x01,0x60,0x04,0xef,0xb4,0x03,0x10,0x90,0x9e,0x10,0x74,0x01,
  85498. +0xf0,0xa3,0x74,0x37,0xf0,0xa3,0x74,0x01,0xf0,0x80,0x1a,0xee,0x64,0x01,0x60,0x07,
  85499. +0xaf,0x06,0xee,0x64,0x03,0x70,0x49,0x90,0x9e,0x10,0x74,0x01,0xf0,0xa3,0x74,0x3d,
  85500. +0xf0,0xa3,0x74,0x40,0xf0,0x90,0x9e,0x10,0xe0,0xfe,0xa3,0xe0,0xff,0xf5,0x82,0x8e,
  85501. +0x83,0xe0,0xfd,0x90,0x9e,0x12,0xe0,0xfc,0xed,0x5c,0x60,0x0c,0x8f,0x82,0x8e,0x83,
  85502. +0xec,0xf0,0xe4,0x90,0x9e,0x77,0xf0,0x22,0x90,0x9e,0x77,0xe0,0x04,0xf0,0xe0,0xc3,
  85503. +0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x44,0xea,
  85504. +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,
  85505. +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,
  85506. +0xc4,0x74,0xa1,0xf0,0x74,0x50,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,
  85507. +0xa3,0xe0,0x55,0x29,0xf5,0x2d,0xa3,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,
  85508. +0xf5,0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x41,0x46,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,
  85509. +0xd1,0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,
  85510. +0x52,0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,
  85511. +0x54,0x20,0x6f,0x70,0x02,0x21,0xf5,0xe5,0x54,0x30,0xe5,0x02,0x21,0xf5,0xe5,0x52,
  85512. +0x54,0x3f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,
  85513. +0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,
  85514. +0x42,0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,
  85515. +0x34,0x93,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,
  85516. +0x03,0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,
  85517. +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,
  85518. +0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,
  85519. +0x75,0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,
  85520. +0xe6,0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,
  85521. +0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,
  85522. +0x08,0x12,0x63,0x51,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,
  85523. +0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,
  85524. +0x30,0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0d,0xab,0x09,
  85525. +0xaf,0x08,0x12,0x62,0xee,0xe5,0x63,0x14,0x24,0xfd,0x50,0x02,0x80,0x48,0x90,0x9e,
  85526. +0x66,0xe0,0x60,0x3a,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,
  85527. +0xc3,0xef,0x64,0x01,0x70,0x30,0x90,0x9e,0x85,0xf0,0x90,0x9e,0x5b,0xe0,0x90,0x9e,
  85528. +0x86,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,0x5e,0x90,0x01,0x5b,0x74,
  85529. +0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x9e,0x64,0xf0,0x80,0x08,0x71,0xc3,
  85530. +0xbf,0x01,0x03,0x12,0x44,0xcb,0xe5,0x2c,0x30,0xe1,0x20,0x90,0x01,0x34,0x74,0x02,
  85531. +0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,
  85532. +0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x71,0xd2,0xe5,0x2c,0x30,0xe3,0x06,
  85533. +0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,
  85534. +0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x26,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1f,
  85535. +0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,
  85536. +0x12,0x4b,0xcf,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4d,0x45,0x80,0xfe,0xe5,
  85537. +0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x12,0x90,
  85538. +0x9e,0x7f,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0,0x12,0x61,0x4e,0x90,0x9e,0x7f,0xe4,
  85539. +0xf0,0xe5,0x2e,0x30,0xe1,0x0b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x11,
  85540. +0x23,0xe5,0x2e,0x30,0xe2,0x09,0x90,0x01,0x36,0x74,0x04,0xf0,0x12,0x60,0xdf,0xe5,
  85541. +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x60,0x64,0x01,0x70,0x1c,
  85542. +0xe5,0x63,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,
  85543. +0x9e,0x85,0xe4,0x12,0x44,0x4e,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,
  85544. +0x2b,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x60,0xb4,0x01,0x20,0xe5,0x63,0x60,0x1c,
  85545. +0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x67,0xe4,0xf0,
  85546. +0x53,0x64,0xfd,0xe5,0x64,0x54,0x07,0x70,0x03,0x12,0x44,0xcb,0xe5,0x2e,0x30,0xe5,
  85547. +0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x60,0xb4,0x01,0x14,0xe5,0x63,0x60,0x10,
  85548. +0x90,0x9e,0x66,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xd2,0x80,0x03,0x12,0x44,0x79,
  85549. +0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x60,0xb4,0x01,0x10,
  85550. +0xe5,0x63,0x60,0x0c,0x53,0x64,0xfe,0xe5,0x64,0x54,0x07,0x70,0x03,0x12,0x44,0xcb,
  85551. +0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74,0x02,0xf0,0x91,0x64,0x74,0xa1,0x04,
  85552. +0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,
  85553. +0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,
  85554. +0xd0,0xe0,0x32,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,
  85555. +0x00,0x22,0x90,0x9e,0x10,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80,0xf0,
  85556. +0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0x90,0x12,0x43,0x8b,0x0b,0x7a,0x9e,0x79,
  85557. +0x10,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x8d,0x12,0x43,0x8b,0x90,0x9e,
  85558. +0xb0,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,
  85559. +0x12,0x71,0x7a,0xef,0x60,0x49,0x90,0x9e,0x8d,0x12,0x43,0x6b,0x8b,0x23,0x8a,0x24,
  85560. +0x89,0x25,0x75,0x26,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x9e,
  85561. +0x90,0x12,0x43,0x6b,0x8b,0x23,0x8a,0x24,0x89,0x25,0x90,0x9e,0x8d,0x12,0x43,0x6b,
  85562. +0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x26,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,
  85563. +0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,
  85564. +0xd0,0x92,0xaf,0x22,0x90,0x9e,0xa0,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x63,
  85565. +0x14,0x24,0xfd,0x50,0x02,0x80,0x1f,0x90,0x9e,0x66,0xe0,0x60,0x06,0x7d,0x01,0x7f,
  85566. +0x0c,0x80,0x0d,0xe5,0x61,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,
  85567. +0x91,0xe7,0xe4,0xff,0x91,0x97,0x22,0xef,0x60,0x0b,0x90,0x9e,0x80,0xe0,0xb4,0x01,
  85568. +0x10,0xe4,0xff,0x80,0x09,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x75,
  85569. +0x92,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x74,
  85570. +0x12,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,
  85571. +0xe6,0xe5,0x63,0x60,0x04,0x7f,0x01,0x91,0x97,0x12,0x74,0xc8,0x53,0x61,0xf0,0x43,
  85572. +0x61,0x02,0x22,0x7d,0x01,0x7f,0x0c,0x8f,0x6a,0x8d,0x6b,0xe5,0x6a,0x54,0x0f,0xff,
  85573. +0xe5,0x61,0x54,0x0f,0x6f,0x60,0x65,0xe5,0x6a,0x30,0xe2,0x28,0xe5,0x61,0x20,0xe2,
  85574. +0x04,0x7f,0x01,0xd1,0xc2,0xe5,0x61,0x30,0xe3,0x0c,0xe5,0x6a,0x20,0xe3,0x07,0xb1,
  85575. +0x5d,0xef,0x60,0x48,0xa1,0xa5,0xe5,0x61,0x20,0xe3,0x41,0xe5,0x6a,0x30,0xe3,0x3c,
  85576. +0xaf,0x6b,0xc1,0xdc,0xe5,0x61,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x6a,0x20,0xe3,
  85577. +0x07,0xb1,0x5d,0xef,0x60,0x26,0xb1,0xa5,0xe5,0x61,0x54,0x0f,0xff,0xbf,0x04,0x0c,
  85578. +0xe5,0x6a,0x20,0xe2,0x07,0xf1,0x21,0xef,0x60,0x12,0x91,0xb2,0xe5,0x61,0x54,0x0f,
  85579. +0xff,0xbf,0x02,0x08,0x12,0x60,0xbd,0xef,0x60,0x02,0xd1,0xaf,0x22,0x71,0xc3,0xef,
  85580. +0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x9e,0x64,0xe0,
  85581. +0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x9e,0x63,0xe0,0x60,0x08,
  85582. +0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x62,0x54,0x0f,0xd3,0x94,0x04,0x40,
  85583. +0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,
  85584. +0x08,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x60,0xb4,0x01,
  85585. +0x04,0x7f,0x01,0xd1,0xf6,0x53,0x61,0xf0,0x43,0x61,0x04,0x22,0xef,0x64,0x01,0x70,
  85586. +0x2e,0x7d,0x78,0x7f,0x02,0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,
  85587. +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x91,0xe3,0xe4,0xff,0x91,0x97,
  85588. +0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,
  85589. +0x01,0x36,0x74,0x7b,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7b,0xff,0x12,0x36,0xe6,0x7d,
  85590. +0x02,0x7f,0x03,0x12,0x36,0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,
  85591. +0xe0,0x44,0x07,0xf0,0x12,0x62,0x4c,0xe5,0x60,0x20,0xe0,0x05,0xe4,0x90,0x9e,0x58,
  85592. +0xf0,0x22,0x8b,0x14,0x8a,0x15,0x89,0x16,0x12,0x60,0xb1,0xab,0x14,0xaa,0x15,0xa9,
  85593. +0x16,0x12,0x29,0xd9,0xf5,0x63,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,
  85594. +0x03,0x70,0x40,0x7f,0x01,0x80,0x3a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,
  85595. +0x12,0x42,0x20,0xfd,0xe4,0xff,0xd1,0x84,0x80,0x27,0xab,0x14,0xaa,0x15,0xa9,0x16,
  85596. +0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x01,0xd1,0x84,0x1f,0x80,0x13,0xab,0x14,
  85597. +0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0xd1,0x84,0xe4,
  85598. +0xff,0xb1,0xbc,0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x9e,0x65,0x74,
  85599. +0x01,0xf0,0x80,0x16,0xed,0x70,0x0a,0x90,0x9e,0x62,0xe0,0x90,0x9e,0x65,0xf0,0x80,
  85600. +0x05,0x90,0x9e,0x65,0xed,0xf0,0x90,0x9e,0x65,0xe0,0x90,0x9e,0x56,0xf0,0x22,0x53,
  85601. +0x61,0xf0,0x43,0x61,0x01,0x12,0x45,0x00,0x12,0x45,0x01,0x53,0x61,0xf0,0x43,0x61,
  85602. +0x02,0x22,0x90,0x9e,0xaf,0xef,0xf0,0x12,0x74,0x53,0x90,0x9e,0xaf,0xe0,0x60,0x05,
  85603. +0x90,0x05,0x22,0xe4,0xf0,0x53,0x61,0xf0,0x43,0x61,0x04,0x22,0x90,0x06,0x04,0xe0,
  85604. +0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x60,0xb4,0x01,0x04,0xe4,0xff,0xd1,0xf6,0x53,
  85605. +0x61,0xf0,0x43,0x61,0x0c,0x22,0x8f,0x27,0x12,0x45,0xb0,0xbf,0x01,0x22,0x90,0x9e,
  85606. +0x7a,0xe0,0xff,0x7d,0x01,0x12,0x47,0x79,0xab,0x07,0xaa,0x06,0xad,0x03,0xac,0x02,
  85607. +0xaf,0x27,0x12,0x60,0x2a,0xaf,0x03,0x12,0x5f,0xf7,0x90,0x04,0x1f,0x74,0x20,0xf0,
  85608. +0x22,0x71,0xc3,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x58,
  85609. +0xe5,0x64,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4a,0xe5,0x62,
  85610. +0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x39,0xe5,
  85611. +0x64,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x2c,0xe5,0x64,0x30,0xe4,
  85612. +0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x1f,0x90,0x9e,0x58,0xe0,0x60,0x08,0x90,
  85613. +0x01,0xb9,0x74,0x20,0xf0,0x80,0x11,0x90,0x9e,0x5e,0xe0,0x60,0x08,0x90,0x01,0xb9,
  85614. +0x74,0x80,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,
  85615. +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,
  85616. +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,
  85617. +0xc4,0x74,0x91,0xf0,0x74,0x57,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,
  85618. +0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0x90,0x00,0x52,0xe0,0xff,0x90,0x00,0x56,0xe0,
  85619. +0x5f,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,0x74,0x10,0xf0,0xe5,0x3d,
  85620. +0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,0x30,0xe6,0x1b,0x90,0x00,
  85621. +0x55,0x74,0x40,0xf0,0x90,0x9e,0x42,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x9e,
  85622. +0x3f,0xe0,0x60,0x05,0x7f,0x01,0x12,0x49,0x1a,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,
  85623. +0x55,0x74,0x80,0xf0,0x90,0x9e,0x42,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,
  85624. +0x12,0x49,0x1a,0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,0x74,0x01,0xf0,0xe5,0x3e,
  85625. +0x30,0xe1,0x06,0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,0x30,0xe2,0x06,0x90,0x00,
  85626. +0x56,0x74,0x04,0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,0x56,0x74,0x08,0xf0,0x90,
  85627. +0x01,0xc4,0x74,0x91,0xf0,0x74,0x57,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,
  85628. +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,
  85629. +0xf0,0xd0,0xe0,0x32,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  85630. +0x19,0xe0,0xfd,0x70,0x02,0x21,0xb5,0x90,0x9e,0xae,0xe0,0xff,0x74,0x01,0x7e,0x00,
  85631. +0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,
  85632. +0x02,0x21,0xae,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,
  85633. +0xe0,0x90,0x9e,0x1a,0xf0,0x75,0x23,0x01,0x75,0x24,0x9e,0x75,0x25,0x1a,0x75,0x26,
  85634. +0x01,0x7b,0x01,0x7a,0x9e,0x79,0x1b,0x12,0x45,0x09,0x90,0x9e,0x1b,0xe0,0xff,0xc4,
  85635. +0x13,0x13,0x13,0x54,0x01,0x90,0x9e,0xae,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,
  85636. +0x00,0x88,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1c,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,
  85637. +0x02,0x90,0x00,0x89,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1d,0xf0,0x90,0x9e,0xae,0xe0,
  85638. +0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1e,0xf0,0x90,0x9e,
  85639. +0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x1f,0xf0,
  85640. +0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x9e,
  85641. +0x20,0xf0,0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,
  85642. +0x9e,0x1c,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,
  85643. +0xe0,0x90,0x9e,0x1d,0xf0,0x90,0x9e,0xae,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,
  85644. +0x43,0x5f,0xe0,0x90,0x9e,0x1e,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,
  85645. +0x1c,0x31,0xb6,0x90,0x9e,0x19,0xe0,0xff,0x90,0x9e,0xae,0xe0,0xfe,0x74,0x01,0xa8,
  85646. +0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  85647. +0xae,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,
  85648. +0xcc,0xf0,0x90,0x9e,0xae,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x01,0x7e,0x90,0x01,
  85649. +0xc6,0xe0,0x44,0x02,0xf0,0x22,0x90,0x9e,0x21,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,
  85650. +0x59,0xfc,0x01,0x59,0xf4,0x02,0x5a,0x20,0x03,0x5a,0x29,0x05,0x5a,0x32,0x06,0x5a,
  85651. +0x7e,0x07,0x5a,0x3a,0x09,0x5a,0x43,0x0b,0x5a,0x4c,0x0c,0x5a,0x55,0x0d,0x5a,0x5e,
  85652. +0x0e,0x5a,0x67,0x1b,0x5a,0x6f,0x1c,0x5a,0x05,0x2d,0x5a,0x0e,0x2e,0x5a,0x17,0x3b,
  85653. +0x00,0x00,0x5a,0x77,0x90,0x9e,0x21,0x12,0x43,0x6b,0xe1,0xe9,0x90,0x9e,0x21,0x12,
  85654. +0x43,0x6b,0x02,0x71,0xd0,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0x0b,0x90,0x9e,
  85655. +0x21,0x12,0x43,0x6b,0x02,0x72,0x53,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0x8c,
  85656. +0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x72,0xb6,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,
  85657. +0x70,0x4a,0x90,0x9e,0x21,0x12,0x43,0x6b,0x80,0x45,0x90,0x9e,0x21,0x12,0x43,0x6b,
  85658. +0x02,0x72,0xfe,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x70,0xa2,0x90,0x9e,0x21,0x12,
  85659. +0x43,0x6b,0x02,0x49,0xc2,0x90,0x9e,0x21,0x12,0x43,0x6b,0x02,0x7b,0x16,0x90,0x9e,
  85660. +0x21,0x12,0x43,0x6b,0x02,0x4a,0xfc,0x90,0x9e,0x21,0x12,0x43,0x6b,0xe1,0xef,0x90,
  85661. +0x9e,0x21,0x12,0x43,0x6b,0xe1,0xd1,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x90,
  85662. +0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54,0x07,
  85663. +0xfd,0xaf,0x06,0x90,0x9e,0x24,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x8b,0x90,
  85664. +0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54,0x0f,
  85665. +0x90,0x9e,0x29,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13,0x54,
  85666. +0x03,0x90,0x9e,0x2a,0xf0,0x90,0x9e,0x24,0xe0,0xff,0x75,0xf0,0x09,0x90,0x96,0x46,
  85667. +0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x9e,0x2b,0xec,0xf0,0xa3,0xed,0xf0,0xef,
  85668. +0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b,0x01,0xa3,0x12,
  85669. +0x43,0x8b,0x90,0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0x0f,
  85670. +0xff,0x90,0x9e,0x2d,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d,0x90,0x9e,0x26,0x12,0x43,
  85671. +0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x9e,0x2d,0x12,0x43,0x6b,0x90,0x00,
  85672. +0x01,0xef,0x12,0x42,0x5f,0x90,0x9e,0x26,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,
  85673. +0x20,0xff,0x90,0x9e,0x2b,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,
  85674. +0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x29,0xe0,0xfe,0x90,0x9e,
  85675. +0x24,0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x90,0x9e,
  85676. +0x25,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x5f,0xee,0xf0,0x75,
  85677. +0xf0,0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x5f,0x74,0x01,0xf0,0x90,0x9e,0x2a,0xe0,
  85678. +0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x5f,0xee,0xf0,0x8f,0x14,0xef,
  85679. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82,0xf5,0x16,0x8f,0x17,0xe5,
  85680. +0x14,0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35,0xf0,0x75,0x18,0x01,0xf5,
  85681. +0x19,0x89,0x1a,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x46,0x12,0x43,0x5f,0xaf,0x82,
  85682. +0x85,0x83,0x1b,0x8f,0x1c,0xe5,0x14,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,
  85683. +0x35,0xf0,0x75,0x1d,0x01,0xf5,0x1e,0x89,0x1f,0x74,0x82,0x25,0x14,0xf5,0x82,0xe4,
  85684. +0x34,0x95,0xf5,0x83,0xe0,0x12,0x43,0x94,0x5c,0x0d,0x00,0x5c,0x22,0x01,0x5c,0x37,
  85685. +0x02,0x5c,0x4c,0x03,0x5c,0x75,0x04,0x5c,0x8a,0x05,0x5c,0x9f,0x06,0x5c,0xc5,0x0c,
  85686. +0x5c,0xf2,0x0d,0x5d,0x1f,0x0e,0x5d,0x4c,0x0f,0x00,0x00,0x5d,0x80,0xe5,0x14,0x25,
  85687. +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,
  85688. +0x80,0x3c,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,
  85689. +0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,
  85690. +0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x14,0x25,0xe0,
  85691. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,
  85692. +0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,
  85693. +0x74,0x8f,0xf0,0xa1,0x80,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,
  85694. +0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5,0x14,0x25,0xe0,0x24,0xc6,
  85695. +0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,
  85696. +0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0x74,
  85697. +0x0d,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,
  85698. +0xf0,0xa3,0xf0,0xa1,0x80,0x90,0x04,0x47,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,
  85699. +0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,
  85700. +0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x44,
  85701. +0xa1,0x77,0x90,0x04,0x4b,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,
  85702. +0x04,0x4a,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,
  85703. +0x04,0x49,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,
  85704. +0x04,0x4f,0xe0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,
  85705. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,
  85706. +0x85,0x17,0x82,0x85,0x16,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,
  85707. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x4d,0x90,0x04,0x52,0xe0,0xab,0x18,0xaa,
  85708. +0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x51,0xe0,0x85,0x17,0x82,
  85709. +0x85,0x16,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,0xf0,
  85710. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,
  85711. +0xab,0x1d,0xaa,0x1e,0xa9,0x1f,0x12,0x29,0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,
  85712. +0x12,0x42,0x4d,0xab,0x18,0xe5,0x1a,0x24,0x01,0xf9,0xe4,0x35,0x19,0xfa,0xc0,0x03,
  85713. +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1d,0xaa,0x1e,0xa9,0x1f,0x90,0x00,
  85714. +0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x17,
  85715. +0x82,0x85,0x16,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1c,0x82,0x85,0x1b,0x83,
  85716. +0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,
  85717. +0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1c,0x82,0x85,0x1b,0x83,0xa3,0xe0,0xfe,0xef,
  85718. +0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,
  85719. +0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75,0x15,0x0b,0x74,0x01,0x7e,
  85720. +0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x14,
  85721. +0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,
  85722. +0x5f,0x4e,0x60,0x06,0xe5,0x15,0x24,0x10,0x80,0x5d,0x15,0x15,0xe5,0x15,0xc3,0x94,
  85723. +0x00,0x50,0xca,0x80,0x56,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,
  85724. +0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x15,0x0f,0x74,0x01,0x7e,0x00,
  85725. +0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x14,0x25,
  85726. +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,
  85727. +0x4e,0x60,0x08,0x90,0x9e,0x30,0xe5,0x15,0xf0,0x80,0x10,0x15,0x15,0xe5,0x15,0xc3,
  85728. +0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x30,0xf0,0xe5,0x14,0x25,0xe0,0x24,
  85729. +0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,
  85730. +0xf5,0x15,0x74,0x01,0x7e,0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,
  85731. +0xd8,0xf9,0xff,0xe5,0x14,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,
  85732. +0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x31,0xe5,0x15,0xf0,0x80,
  85733. +0x5b,0x05,0x15,0xe5,0x15,0xb4,0x10,0xca,0x80,0x52,0xe5,0x14,0x25,0xe0,0x24,0x02,
  85734. +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,
  85735. +0x15,0x74,0x01,0x7e,0x00,0xa8,0x15,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,
  85736. +0xf9,0xff,0xe5,0x14,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,
  85737. +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x15,0x24,0x10,0x80,0x0a,0x05,0x15,
  85738. +0xe5,0x15,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x31,0xf0,0x90,0x9e,0x30,0xe0,
  85739. +0xff,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x48,0x12,0x43,0x5f,0xef,0xf0,0x90,0x9e,
  85740. +0x31,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x49,0x12,0x43,0x5f,0xee,0xf0,
  85741. +0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x06,
  85742. +0x90,0x9e,0x30,0x12,0x62,0x94,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x04,0xf5,
  85743. +0x83,0xe0,0xff,0x90,0x9e,0x31,0xe0,0xfe,0xef,0xc3,0x9e,0x50,0x03,0x12,0x62,0x94,
  85744. +0x90,0x9e,0x30,0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90,0x96,0x43,0x74,0x03,0xf0,
  85745. +0x22,0xef,0xd3,0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74,0x02,0xf0,0x22,0xef,0xd3,
  85746. +0x94,0x03,0x40,0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22,0xe4,0x90,0x96,0x43,0xf0,
  85747. +0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x3f,0xfe,0xef,0x54,0x80,0xc4,0x13,
  85748. +0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0x41,0x93,0x12,0x29,0xd9,0xf5,0x60,0x22,0x12,
  85749. +0x29,0xd9,0x90,0x95,0x01,0xf0,0x22,0xad,0x07,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,
  85750. +0xfc,0xf5,0x83,0xe0,0x44,0x01,0xf0,0x90,0x04,0x80,0xe0,0x54,0x0f,0xfc,0x74,0x14,
  85751. +0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xc0,0x4c,0xfd,0x74,0x14,0x2f,
  85752. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0x22,0xef,0x60,0x0f,0x74,0x21,0x2d,
  85753. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x22,0x74,0x21,0x2d,0xf5,
  85754. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x22,0xe4,0xf5,0x60,0xf5,0x64,
  85755. +0xf5,0x63,0x75,0x62,0x0c,0x75,0x61,0x0c,0x90,0x9e,0x66,0xf0,0x90,0x9e,0x64,0xf0,
  85756. +0x90,0x9e,0x63,0xf0,0x90,0x9e,0x65,0x04,0xf0,0x90,0x9e,0x56,0xf0,0xe4,0x90,0x9e,
  85757. +0x67,0xf0,0x90,0x9e,0x58,0xf0,0x90,0x9e,0x61,0x74,0x07,0xf0,0xe4,0x90,0x9e,0x57,
  85758. +0xf0,0x90,0x9e,0x5f,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0x5c,0x74,0x0a,0xf0,0xa3,
  85759. +0x74,0x05,0xf0,0x90,0x9e,0x5b,0x74,0x14,0xf0,0x90,0x9e,0x62,0x74,0x05,0xf0,0xe4,
  85760. +0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x55,0xf0,0x90,0x9e,0x7f,0xf0,0x90,0x9e,0x5e,0xf0,
  85761. +0x22,0xe4,0x90,0x9e,0x67,0xf0,0x90,0x9e,0x57,0xf0,0xf5,0x64,0x22,0x7f,0x00,0x22,
  85762. +0xe5,0x62,0x30,0xe6,0x19,0xe5,0x62,0x54,0x0f,0xff,0x90,0x9e,0x54,0xe0,0xfe,0x4f,
  85763. +0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x9e,0x54,0xf0,0x53,0x62,0xbf,0x22,0xe5,
  85764. +0x60,0x64,0x01,0x70,0x68,0xe5,0x63,0x60,0x64,0xe5,0x63,0x64,0x02,0x60,0x06,0xe5,
  85765. +0x63,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0x56,0xf0,0x90,0x06,0xaa,
  85766. +0xe0,0x90,0x9e,0x65,0xf0,0x90,0x9e,0x56,0xe0,0x70,0x07,0x90,0x9e,0x65,0xe0,0xff,
  85767. +0x80,0x05,0x90,0x9e,0x56,0xe0,0xff,0x90,0x9e,0x56,0xef,0xf0,0x90,0x9e,0x58,0xe0,
  85768. +0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0x57,0xf0,0x90,0x05,0x58,0x74,0x03,0xf0,
  85769. +0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x64,0xfd,0x53,0x64,
  85770. +0xef,0xe5,0x63,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0x22,0xe4,0xfb,
  85771. +0x90,0x9e,0x9c,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x63,0x60,0x6a,0xe5,0x60,
  85772. +0x64,0x01,0x70,0x64,0xe5,0x63,0x14,0x60,0x2b,0x24,0xfd,0x60,0x27,0x24,0x02,0x24,
  85773. +0xfb,0x50,0x02,0x80,0x21,0x90,0x9e,0x56,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,
  85774. +0x60,0x14,0x90,0x9e,0x56,0xe0,0x70,0x08,0x90,0x9e,0x65,0xe0,0x90,0x9e,0x56,0xf0,
  85775. +0x7b,0x01,0x80,0x02,0x7b,0x01,0xeb,0x60,0x2f,0x43,0x64,0x10,0xe4,0x90,0x9e,0x85,
  85776. +0xf0,0x90,0x9e,0x57,0xe0,0x75,0xf0,0x03,0xa4,0xff,0x90,0x9e,0x61,0xe0,0x2f,0x12,
  85777. +0x44,0x53,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x61,0x54,0x0f,0xc3,0x94,0x04,0x50,
  85778. +0x07,0x7d,0x01,0x7f,0x04,0x12,0x54,0xe7,0x22,0xe4,0x90,0x9e,0x15,0xf0,0xe5,0x63,
  85779. +0x60,0x79,0x90,0x9e,0x67,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x64,0xfd,0xe5,0x64,0x54,
  85780. +0x07,0x70,0x68,0x80,0x63,0x90,0x9e,0x57,0xe0,0x04,0xf0,0x53,0x64,0xef,0x90,0x9e,
  85781. +0x15,0xe0,0xf9,0xff,0x7e,0x00,0x24,0x01,0xfd,0xee,0x33,0xfc,0x90,0x9e,0x57,0xe0,
  85782. +0xb5,0x05,0x06,0xe4,0xb5,0x04,0x02,0x80,0x12,0xef,0x24,0x02,0xff,0xe4,0x3e,0xfe,
  85783. +0x90,0x9e,0x57,0xe0,0xb5,0x07,0x0a,0xe4,0xb5,0x06,0x06,0x90,0x05,0x58,0xe0,0x04,
  85784. +0xf0,0xe9,0xff,0x90,0x9e,0x5c,0xe0,0x2f,0xff,0xe4,0x33,0xfe,0x90,0x9e,0x57,0xe0,
  85785. +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x40,0x0d,0xe5,0x60,0xb4,0x01,0x0b,
  85786. +0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xcb,0x22,0x90,0x9e,0x5f,0xe0,
  85787. +0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,
  85788. +0x93,0x12,0x43,0x8b,0x90,0x9e,0x96,0xe0,0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54,
  85789. +0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f,0x4e,0xf0,0x90,0x9e,0x93,0x12,0x43,0x6b,
  85790. +0x90,0x9e,0x90,0x12,0x43,0x8b,0x7b,0x01,0x7a,0x9e,0x79,0x96,0x12,0x53,0xf1,0xd0,
  85791. +0xd0,0x92,0xaf,0x22,0xe0,0xfd,0x74,0x26,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9d,0xf5,
  85792. +0x83,0xed,0xf0,0xaf,0x14,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,
  85793. +0x50,0x0e,0x74,0x84,0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,
  85794. +0x74,0xa6,0x2f,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xed,0xf0,0x90,0x9e,0x68,0xef,
  85795. +0xf0,0x24,0xa6,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x90,0x9e,0x69,0xf0,0x7b,
  85796. +0x01,0x7a,0x9e,0x79,0x68,0x7d,0x02,0x51,0x57,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,
  85797. +0x8d,0x0b,0xe5,0x0b,0x54,0x1f,0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,
  85798. +0xf5,0x83,0xe0,0xf5,0x0e,0x90,0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,
  85799. +0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11,0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,
  85800. +0x25,0x0d,0xf5,0x0f,0xe5,0x10,0x90,0x41,0xd6,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,
  85801. +0x01,0x40,0x11,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,
  85802. +0xaf,0x0a,0x41,0xa5,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,
  85803. +0x22,0xad,0x07,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,0xff,0x74,
  85804. +0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,
  85805. +0x40,0x02,0x8f,0x12,0xe5,0x12,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  85806. +0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x12,0x25,0xe0,0x24,0x66,0xf5,0x82,
  85807. +0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,
  85808. +0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,
  85809. +0xf0,0xa3,0xef,0xf0,0xaf,0x05,0xad,0x12,0x51,0xa5,0xaf,0x12,0x22,0xac,0x07,0xec,
  85810. +0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,
  85811. +0x80,0x0b,0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,
  85812. +0x1f,0xe5,0x1f,0x54,0x1f,0xff,0x90,0x9e,0x25,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,
  85813. +0x49,0x12,0x43,0x5f,0xe0,0x90,0x9e,0x27,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x48,
  85814. +0x12,0x43,0x5f,0xe0,0xfe,0x90,0x9e,0x28,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  85815. +0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x29,0xcb,0xf0,0xa3,0xeb,
  85816. +0xf0,0xec,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,
  85817. +0xe0,0x90,0x9e,0x2b,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,
  85818. +0x28,0xe0,0x90,0x9e,0x25,0xf0,0xf5,0x1f,0xed,0x70,0x02,0xa1,0x13,0x90,0x9e,0x26,
  85819. +0xed,0xf0,0xe5,0x1f,0x30,0xe6,0x0a,0x90,0x9e,0x25,0xe0,0xf5,0x1f,0xa3,0xe0,0x14,
  85820. +0xf0,0x90,0x9e,0x26,0xe0,0x70,0x02,0xa1,0x13,0x90,0x9e,0x25,0xe0,0xff,0xd3,0x94,
  85821. +0x00,0x50,0x02,0xa1,0x13,0xe4,0x90,0x9e,0x24,0xf0,0xef,0x14,0x90,0x9e,0x23,0xf0,
  85822. +0x90,0x9e,0x27,0xe0,0xfd,0x90,0x9e,0x23,0xe0,0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,
  85823. +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,
  85824. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x2b,0xe0,0x5e,0xfe,0xa3,0xe0,
  85825. +0x5f,0x4e,0x70,0x27,0x90,0x9e,0x23,0xe0,0xff,0xc3,0x94,0x10,0x50,0x33,0x74,0x01,
  85826. +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,
  85827. +0x9e,0x29,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x16,0x90,0x9e,0x23,0xe0,0xf5,
  85828. +0x1f,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x26,0xe0,0xff,0x90,0x9e,0x24,0xe0,0x6f,0x60,
  85829. +0x08,0x90,0x9e,0x23,0xe0,0x14,0xf0,0x80,0x87,0x90,0x9e,0x26,0xe0,0xff,0x90,0x9e,
  85830. +0x24,0xe0,0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x23,0xe0,0xb5,0x05,0x06,0x90,0x9e,0x27,
  85831. +0xe0,0xf5,0x1f,0xe5,0x1f,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,
  85832. +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x1f,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,
  85833. +0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,
  85834. +0x13,0xff,0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,
  85835. +0xa3,0xef,0xf0,0xaf,0x04,0xad,0x1f,0x51,0xa5,0xaf,0x1f,0x22,0xad,0x07,0xed,0xc3,
  85836. +0x94,0x20,0x50,0x0d,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,
  85837. +0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1f,
  85838. +0xe5,0x1f,0x54,0x1f,0xfc,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0xe0,
  85839. +0xff,0x90,0x9e,0x23,0xf0,0xed,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,
  85840. +0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x24,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,
  85841. +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x26,
  85842. +0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  85843. +0x83,0xe4,0x93,0xfa,0x74,0x01,0x93,0xfb,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,
  85844. +0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x7a,
  85845. +0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x9e,
  85846. +0x23,0xe0,0xff,0xeb,0xd3,0x9f,0x40,0x02,0xc1,0xab,0xeb,0xc3,0x94,0x10,0x40,0x21,
  85847. +0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,
  85848. +0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x24,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,
  85849. +0x23,0xeb,0xc3,0x94,0x10,0x50,0x40,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,
  85850. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x26,0xe0,0x5e,0xfe,0xa3,0xe0,
  85851. +0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09,0x90,0x9e,0x25,0xe0,0x30,0xe7,0x02,0x7b,0x17,
  85852. +0xeb,0x64,0x13,0x60,0x03,0xbb,0x12,0x09,0x90,0x9e,0x24,0xe0,0x30,0xe0,0x02,0x7b,
  85853. +0x18,0xac,0x03,0x8c,0x1f,0x80,0x34,0x0b,0x80,0x84,0x90,0x9e,0x23,0xe0,0xfb,0x6c,
  85854. +0x70,0x69,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x75,0xf0,
  85855. +0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5,0x1f,0x20,0xe6,
  85856. +0x07,0xec,0x44,0x40,0xf5,0x1f,0x80,0x03,0xaf,0x1f,0x22,0xec,0x25,0xe0,0x24,0x9e,
  85857. +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,
  85858. +0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,
  85859. +0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,
  85860. +0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b,0x40,0x56,
  85861. +0x90,0x9e,0x23,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,
  85862. +0xf0,0xac,0x07,0x8f,0x1f,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,
  85863. +0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,
  85864. +0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,
  85865. +0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,
  85866. +0xa3,0xef,0xf0,0xaf,0x1f,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,
  85867. +0xe4,0xf0,0xaf,0x05,0xe5,0x1f,0x44,0x80,0xfd,0x51,0xa5,0xe5,0x1f,0x44,0x80,0xff,
  85868. +0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,
  85869. +0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,
  85870. +0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,
  85871. +0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,
  85872. +0x22,0xe4,0xf5,0x14,0xe5,0x14,0xb4,0x20,0x14,0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,
  85873. +0x95,0x01,0xe0,0xff,0x90,0x9a,0xc5,0xe0,0xb5,0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,
  85874. +0xe5,0x14,0x90,0x96,0x4b,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x03,0x02,0x6e,0x6a,
  85875. +0xe5,0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,
  85876. +0xe0,0xd3,0x94,0x00,0xee,0x94,0x00,0x50,0x03,0x02,0x6e,0x6a,0xe5,0x14,0x94,0x20,
  85877. +0x40,0x09,0x90,0x9a,0xc5,0xe0,0x60,0x03,0x02,0x6e,0x76,0xe5,0x14,0x75,0xf0,0x0a,
  85878. +0xa4,0x24,0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,
  85879. +0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,
  85880. +0x90,0x9e,0x1b,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x14,0x25,0xe0,0x24,0xc4,0xf5,0x82,
  85881. +0xe4,0x34,0x98,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x1d,0xcf,0xf0,0xa3,0xef,
  85882. +0xf0,0xe5,0x14,0xc3,0x94,0x20,0x50,0x14,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,
  85883. +0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x19,0xf0,0x80,0x12,0x74,0xa6,0x25,0x14,
  85884. +0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x19,0xf0,0x90,0x9e,
  85885. +0x19,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x48,0x12,
  85886. +0x43,0x5f,0xe0,0x90,0x9e,0x20,0xf0,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,
  85887. +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x41,0x9f,0x90,0x9e,0x20,0xe0,0xff,0x90,
  85888. +0x9e,0x1a,0xe0,0x9f,0x40,0x13,0x90,0x9e,0x20,0xe0,0x90,0x9e,0x1a,0xf0,0xee,0x54,
  85889. +0x40,0xfe,0x90,0x9e,0x19,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,
  85890. +0x01,0x70,0x29,0x90,0x9e,0x1a,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x44,0x25,
  85891. +0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,
  85892. +0xda,0x80,0x30,0x90,0x9e,0x1a,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x9e,0x1a,0xe0,
  85893. +0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x44,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,
  85894. +0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x9e,0x1a,0xe0,
  85895. +0x90,0x41,0x2e,0x93,0x90,0x9e,0x1f,0xf0,0x90,0x9e,0x1f,0xe0,0x75,0xf0,0x06,0xa4,
  85896. +0x24,0x50,0xf9,0x74,0x40,0x35,0xf0,0xfa,0x7b,0xff,0x8b,0x15,0xf5,0x16,0x89,0x17,
  85897. +0xe5,0x14,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xf5,0x1b,
  85898. +0xa3,0xe0,0xf5,0x1c,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,
  85899. +0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,
  85900. +0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42,0x20,0xff,
  85901. +0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac,
  85902. +0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,
  85903. +0xaa,0x16,0xa9,0x17,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x18,0xaa,
  85904. +0x19,0xa9,0x1a,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,
  85905. +0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,
  85906. +0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,
  85907. +0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,
  85908. +0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x42,0x20,
  85909. +0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd,
  85910. +0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,
  85911. +0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x9e,
  85912. +0x1b,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,
  85913. +0x40,0x0c,0xe5,0x1c,0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,
  85914. +0x1b,0xf5,0x1c,0xe5,0x14,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,
  85915. +0xe5,0x1b,0xf0,0xa3,0xe5,0x1c,0xf0,0x90,0x9e,0x19,0xe0,0x25,0xe0,0x24,0x66,0xf5,
  85916. +0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,
  85917. +0x50,0x07,0xaf,0x14,0x12,0x65,0x5c,0xa1,0x31,0x90,0x9e,0x19,0xe0,0x25,0xe0,0x24,
  85918. +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,
  85919. +0x95,0x1b,0x50,0x02,0xa1,0x31,0x7d,0x01,0xaf,0x14,0x12,0x63,0xbd,0xa1,0x31,0x74,
  85920. +0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,
  85921. +0x81,0x3a,0x90,0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x1a,0xe0,0xc3,0x94,
  85922. +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x1a,0xe0,0xc3,0x94,0x11,
  85923. +0x40,0x2e,0x80,0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x1a,0xe0,
  85924. +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x1a,0xe0,0xc3,0x94,
  85925. +0x03,0x40,0x0d,0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,
  85926. +0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1e,0x74,0x44,
  85927. +0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,
  85928. +0x61,0xe7,0x90,0x9a,0x84,0xe0,0x64,0x01,0x60,0x02,0x61,0xe7,0x74,0x85,0x25,0x14,
  85929. +0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,
  85930. +0xe4,0x33,0xfe,0x74,0x41,0x25,0x14,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xfd,
  85931. +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,
  85932. +0x33,0xfe,0x74,0x44,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3,0x9f,
  85933. +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x14,0xf5,0x82,0xe4,
  85934. +0x34,0x9d,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x1a,0xe0,0x6f,0x60,0x3d,0x74,0x44,0x25,
  85935. +0x14,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,
  85936. +0x1e,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1e,0x03,0x80,0x03,0x75,
  85937. +0x1e,0x01,0x74,0x41,0x25,0x14,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0,0x74,
  85938. +0x85,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x14,0xf5,0x82,
  85939. +0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9a,
  85940. +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1e,0x74,0xe6,0x25,0x14,0xf5,0x82,
  85941. +0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x1a,0xe0,0xff,0x74,0x26,0x25,0x14,
  85942. +0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x14,0xf5,0x82,0xe4,
  85943. +0x34,0x98,0xf5,0x83,0xe5,0x1e,0xf0,0x75,0xf0,0x09,0xe5,0x14,0x90,0x96,0x4c,0x12,
  85944. +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1e,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,
  85945. +0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xad,0x1e,0xa1,0x2c,0xec,0x64,0x06,0x60,0x02,0xa1,
  85946. +0x31,0xf5,0x1b,0xf5,0x1c,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x9e,0x1b,0xe0,
  85947. +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x9e,0x21,0xee,0xf0,0xa3,0xef,0xf0,0x74,
  85948. +0x84,0x25,0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1e,0xe4,0xf5,0x1d,
  85949. +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x1d,0xa4,0xf5,0x82,0x85,0xf0,
  85950. +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x1d,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00,
  85951. +0x12,0x29,0xf2,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90,0x9e,
  85952. +0x22,0xe0,0x95,0x1c,0x90,0x9e,0x21,0xe0,0x95,0x1b,0x40,0x07,0x05,0x1d,0xe5,0x1d,
  85953. +0xb4,0x05,0xbd,0xe5,0x1d,0xc3,0x13,0xf5,0x1d,0xe5,0x1e,0xb4,0x01,0x06,0xe5,0x1d,
  85954. +0x70,0x46,0x80,0x13,0xe5,0x1e,0xb4,0x03,0x15,0xe5,0x1d,0x70,0x05,0x75,0x1e,0x03,
  85955. +0x80,0x39,0xe5,0x1d,0xb4,0x01,0x05,0x75,0x1e,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1e,
  85956. +0xb4,0x05,0x28,0xe5,0x1d,0x70,0x05,0x75,0x1e,0x05,0x80,0x0d,0xe5,0x1d,0xb4,0x01,
  85957. +0x05,0x75,0x1e,0x03,0x80,0x03,0x75,0x1e,0x01,0xd3,0x90,0x9e,0x1e,0xe0,0x94,0x03,
  85958. +0x90,0x9e,0x1d,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1e,0xd3,0x90,0x9e,0x1e,0xe0,
  85959. +0x94,0x03,0x90,0x9e,0x1d,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1e,0x74,0x84,0x25,
  85960. +0x14,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1e,0xf0,0xfd,0xaf,0x14,0x12,0x67,
  85961. +0x61,0x74,0xe6,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94,0x05,
  85962. +0x74,0xe6,0x50,0x0e,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04,0xf0,
  85963. +0x80,0x0b,0x25,0x14,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x1d,
  85964. +0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x74,0xff,0x9f,0xfd,0x74,0xff,0x9e,0xfc,0xe5,0x14,
  85965. +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xd3,
  85966. +0x9d,0xea,0x9c,0xe5,0x14,0x50,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,
  85967. +0xf5,0x83,0xee,0x8f,0xf0,0x12,0x42,0x81,0x80,0x10,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  85968. +0xe4,0x34,0x9a,0xf5,0x83,0x74,0xff,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x44,
  85969. +0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x74,0xff,0x9f,
  85970. +0xfd,0x74,0xff,0x9e,0xfc,0xe5,0x14,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,
  85971. +0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xd3,0x9d,0xea,0x9c,0xe5,0x14,0x50,0x13,0x25,0xe0,
  85972. +0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xee,0x8f,0xf0,0x12,0x42,0x81,0x80,
  85973. +0x10,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xff,0xf0,0xa3,
  85974. +0xf0,0xab,0x18,0xaa,0x19,0xa9,0x1a,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x18,0xaa,
  85975. +0x19,0xa9,0x1a,0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,
  85976. +0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,
  85977. +0x08,0xe4,0xf5,0xf0,0x12,0x43,0x19,0xe5,0x14,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,
  85978. +0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0xc4,0xf5,0x82,
  85979. +0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x14,0x25,0xe0,0x24,0x44,0xf5,
  85980. +0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x14,0xe5,0x14,0xc3,0x94,
  85981. +0x40,0x50,0x03,0x02,0x67,0xa4,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,
  85982. +0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,
  85983. +0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd,0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,
  85984. +0x01,0x04,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f,0xe4,
  85985. +0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0,0xa3,
  85986. +0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,
  85987. +0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,
  85988. +0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,
  85989. +0xe4,0x34,0x9d,0xf5,0x83,0x74,0x13,0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,
  85990. +0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,
  85991. +0xed,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85992. +0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85993. +0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85994. +0xed,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85995. +0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85996. +0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,
  85997. +0x74,0x86,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,
  85998. +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,
  85999. +0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,
  86000. +0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,
  86001. +0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,
  86002. +0xf0,0x09,0xed,0x90,0x96,0x4b,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,
  86003. +0x90,0x96,0x4a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,
  86004. +0x95,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x5f,
  86005. +0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x5f,0xe4,
  86006. +0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x5f,0x74,
  86007. +0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x49,0x12,0x43,0x5f,0xe4,0xf0,0xed,0xc3,
  86008. +0x94,0x20,0x50,0x0f,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,
  86009. +0xf0,0x80,0x0d,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,
  86010. +0x0d,0xed,0x64,0x40,0x60,0x03,0x02,0x6e,0xa5,0x22,0x12,0x29,0xd9,0xf5,0x14,0xc3,
  86011. +0x94,0x40,0x50,0x15,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x44,0x25,0x14,0xf5,
  86012. +0x82,0xe4,0x34,0x9a,0xf5,0x83,0xef,0xf0,0x22,0xe5,0x14,0xb4,0x40,0x0a,0x90,0x00,
  86013. +0x02,0x12,0x42,0x20,0x90,0x96,0x42,0xf0,0x22,0x90,0x9e,0x30,0x12,0x43,0x8b,0x90,
  86014. +0x9e,0x33,0xe0,0x54,0xf0,0x44,0x02,0xf0,0x54,0x0f,0x44,0xc0,0xf0,0x90,0x9e,0x30,
  86015. +0x12,0x43,0x6b,0x90,0x9e,0x90,0x12,0x43,0x8b,0x7b,0x01,0x7a,0x9e,0x79,0x33,0x02,
  86016. +0x53,0xf1,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x90,0x00,0x01,0x12,0x42,0x20,0xfc,
  86017. +0xed,0xc3,0x94,0x40,0x40,0x02,0xe4,0xfd,0xec,0xc3,0x94,0x40,0x40,0x02,0xe4,0xfc,
  86018. +0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,
  86019. +0xfb,0xea,0x90,0x9e,0x24,0xf0,0xeb,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,
  86020. +0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x26,0xf0,0xeb,
  86021. +0xa3,0xf0,0xa3,0xed,0xf0,0xa3,0x74,0xff,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,
  86022. +0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xfa,0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x2a,0xf0,0xeb,
  86023. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfa,
  86024. +0xa3,0xe0,0xfb,0xea,0x90,0x9e,0x2c,0xf0,0xeb,0xa3,0xf0,0xa3,0xec,0xf0,0xa3,0x74,
  86025. +0xff,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,
  86026. +0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,
  86027. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,
  86028. +0xa3,0xf0,0xec,0x25,0xe0,0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,
  86029. +0xa3,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x24,0x01,0x79,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  86030. +0xd0,0x90,0x9e,0xa4,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,
  86031. +0xa4,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9e,0xa7,
  86032. +0xe0,0x94,0xe8,0x90,0x9e,0xa6,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,
  86033. +0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x9e,0xa6,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,
  86034. +0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,
  86035. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x24,0x12,0x2a,0x8b,0x00,0x00,0x00,
  86036. +0x00,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x9e,0x66,0xf0,0x90,0x00,0x03,0x12,0x42,
  86037. +0x20,0x90,0x9e,0x55,0xf0,0x12,0x56,0x22,0x90,0x01,0xe5,0xe5,0x63,0xf0,0x90,0x9e,
  86038. +0x66,0xe0,0x90,0x01,0xe6,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x02,0x12,0x42,
  86039. +0x20,0xff,0x30,0xe0,0x25,0x12,0x29,0xd9,0x90,0x9e,0x5c,0xf0,0x90,0x00,0x01,0x12,
  86040. +0x42,0x20,0x90,0x9e,0x5d,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x5b,0xf0,0x90,
  86041. +0x00,0x03,0x12,0x42,0x20,0x90,0x9e,0x62,0xf0,0x22,0x90,0x9e,0x5c,0x74,0x0a,0xf0,
  86042. +0x90,0x9e,0x5d,0x74,0x05,0xf0,0x90,0x9e,0x5b,0x74,0x14,0xf0,0x90,0x9e,0x62,0x74,
  86043. +0x05,0xf0,0x22,0x12,0x29,0xd9,0x30,0xe0,0x19,0xc3,0x13,0x54,0x7f,0x90,0x9e,0x61,
  86044. +0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x9e,0x5f,0xe4,0xf0,0xa3,0xef,0xf0,
  86045. +0x80,0x0f,0x90,0x9e,0x61,0x74,0x07,0xf0,0x90,0x9e,0x5f,0xe4,0xf0,0xa3,0x74,0x03,
  86046. +0xf0,0x90,0x9e,0x5f,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0x90,0x9e,0x24,0x12,
  86047. +0x2a,0x8b,0x00,0x00,0x00,0x00,0x12,0x29,0xd9,0x60,0x0d,0x90,0x9e,0x5e,0xf0,0xe4,
  86048. +0xfd,0x7f,0x04,0x12,0x54,0xe7,0x80,0x05,0xe4,0x90,0x9e,0x5e,0xf0,0x90,0x9e,0x5e,
  86049. +0xe0,0x90,0x01,0xe7,0xf0,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,
  86050. +0x05,0xed,0x2e,0x90,0x9e,0x78,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,
  86051. +0x90,0x9e,0x79,0xf0,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x7a,
  86052. +0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x9e,0x7b,0xf0,0x90,0x00,
  86053. +0x04,0x12,0x42,0x20,0xff,0xae,0x05,0xed,0x2f,0x90,0x9e,0x7c,0xf0,0x22,0xd3,0x10,
  86054. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x24,0x12,0x43,0x8b,0x90,0x9e,0x24,0x12,0x43,
  86055. +0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,
  86056. +0x90,0x9e,0x24,0x12,0x43,0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,
  86057. +0x29,0xd9,0xff,0x60,0x2d,0xb5,0x65,0x16,0x90,0x9e,0x24,0x12,0x43,0x6b,0x90,0x00,
  86058. +0x01,0x12,0x42,0xc2,0x65,0x67,0x70,0x04,0xe5,0x66,0x65,0xf0,0x60,0x24,0x90,0x9e,
  86059. +0x24,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x12,0x4e,0x37,
  86060. +0x80,0x10,0x90,0x9e,0x24,0x12,0x43,0x6b,0x12,0x29,0xd9,0x65,0x65,0x60,0x03,0x12,
  86061. +0x44,0xc2,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,
  86062. +0xa3,0xf0,0xa3,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x24,0x14,0x70,0x1a,0x7b,0x01,
  86063. +0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x71,0xb0,0xbf,0x01,0x09,0x90,0x06,0x35,
  86064. +0xe0,0x54,0x0f,0xf0,0x80,0x04,0x80,0x00,0x80,0xcd,0xe4,0x90,0x06,0x34,0xf0,0x22,
  86065. +0x8e,0x14,0x8f,0x15,0x8b,0x16,0x8a,0x17,0x89,0x18,0xe4,0x90,0x9e,0x19,0xf0,0xef,
  86066. +0x90,0x00,0x31,0xf0,0x12,0x4d,0x45,0xe5,0x14,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,
  86067. +0x54,0xfc,0x4f,0xf0,0x12,0x4d,0x45,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4d,
  86068. +0x45,0x90,0x00,0x33,0xe0,0x20,0xe7,0x0e,0x90,0x9e,0x19,0xe0,0xc3,0x94,0x64,0x50,
  86069. +0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90,0x9e,0x19,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,
  86070. +0x00,0x30,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,
  86071. +0x00,0x22,0xe4,0x90,0x9e,0xac,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,
  86072. +0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,
  86073. +0x9e,0xad,0xe0,0x94,0xe8,0x90,0x9e,0xac,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,
  86074. +0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x9e,0xac,0xe4,0x75,0xf0,0x01,0x12,0x42,
  86075. +0x81,0x80,0xc6,0x90,0x9d,0xff,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  86076. +0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x03,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  86077. +0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x9e,0x07,0x12,0x43,0x53,0x90,
  86078. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x0b,0x12,
  86079. +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  86080. +0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,
  86081. +0x9e,0x80,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,
  86082. +0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x7f,0x78,0x7e,0x08,0x12,0x27,0xde,0x90,
  86083. +0x9d,0xff,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x9e,0x03,0x12,
  86084. +0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0x07,0x12,0x2a,0x7f,0x90,
  86085. +0x9e,0x80,0xe0,0x90,0x9d,0xff,0xb4,0x01,0x0d,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,
  86086. +0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xec,0x90,0x80,
  86087. +0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9e,0x03,0x12,0x43,
  86088. +0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,
  86089. +0x12,0x2f,0xd9,0x90,0x9e,0x07,0x12,0x43,0x53,0xef,0x44,0x02,0xff,0xec,0x90,0x80,
  86090. +0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,
  86091. +0x27,0xde,0x90,0x9e,0x0b,0x12,0x2a,0x7f,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,
  86092. +0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,
  86093. +0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x9e,0x80,0xe0,0xb4,0x01,0x11,
  86094. +0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,
  86095. +0x81,0x22,0xef,0x70,0x02,0xe1,0x49,0x90,0x9e,0x0f,0xe0,0x60,0x03,0x02,0x7b,0x15,
  86096. +0x90,0x9d,0xfb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,
  86097. +0x12,0x2f,0xd9,0x90,0x9d,0xa7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  86098. +0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9d,0xab,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  86099. +0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x9d,0xaf,0x12,0x43,0x53,0x90,
  86100. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xb3,0x12,
  86101. +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  86102. +0x9d,0xb7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,
  86103. +0x2f,0xd9,0x90,0x9d,0xbb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,
  86104. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xbf,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,
  86105. +0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xc3,0x12,0x43,0x53,0x90,0x80,
  86106. +0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xc7,0x12,0x43,
  86107. +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,
  86108. +0xcb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,
  86109. +0xd9,0x90,0x9d,0xcf,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,
  86110. +0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xd3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,
  86111. +0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xd7,0x12,0x43,0x53,0x90,0x80,0x85,
  86112. +0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xdb,0x12,0x43,0x53,
  86113. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xdf,
  86114. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,
  86115. +0x90,0x9d,0xe3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,
  86116. +0x12,0x2f,0xd9,0x90,0x9d,0xe7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  86117. +0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x9d,0xeb,0x12,0x43,0x53,0x90,0x80,0x85,0x12,
  86118. +0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x9d,0xef,0x12,0x43,0x53,0x90,
  86119. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x9d,0xf3,0x12,
  86120. +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,
  86121. +0x9d,0xf7,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,
  86122. +0x2f,0xd9,0x90,0x9e,0x0f,0x74,0x01,0xf0,0x22,0x90,0x9e,0x0f,0xe0,0x64,0x01,0x60,
  86123. +0x03,0x02,0x7b,0x15,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xfb,0x12,0x2a,
  86124. +0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xa7,0x12,0x2a,0x7f,0x7f,0x5c,
  86125. +0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xab,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,
  86126. +0x27,0xde,0x90,0x9d,0xaf,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,
  86127. +0x9d,0xb3,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xb7,0x12,
  86128. +0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xbb,0x12,0x2a,0x7f,0x7f,
  86129. +0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xbf,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,
  86130. +0x12,0x27,0xde,0x90,0x9d,0xc3,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,
  86131. +0x90,0x9d,0xc7,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xcb,
  86132. +0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xcf,0x12,0x2a,0x7f,
  86133. +0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xd3,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,
  86134. +0x0e,0x12,0x27,0xde,0x90,0x9d,0xd7,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,
  86135. +0xde,0x90,0x9d,0xdb,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,
  86136. +0xdf,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xe3,0x12,0x2a,
  86137. +0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x9d,0xe7,0x12,0x2a,0x7f,0x7f,0x04,
  86138. +0x7e,0x0c,0x12,0x27,0xde,0x90,0x9d,0xeb,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,
  86139. +0x27,0xde,0x90,0x9d,0xef,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,
  86140. +0x9d,0xf3,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x9d,0xf7,0x12,
  86141. +0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,
  86142. +0x9e,0xa8,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,
  86143. +0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,
  86144. +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,
  86145. +0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,
  86146. +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,
  86147. +0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,
  86148. +0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,
  86149. +0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,
  86150. +0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,
  86151. +0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,
  86152. +0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,
  86153. +0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,
  86154. +0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,
  86155. +0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,
  86156. +0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  86157. +0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,
  86158. +0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,
  86159. +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,
  86160. +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,
  86161. +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,
  86162. +0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,0x2a,
  86163. +0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xe4,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,
  86164. +0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,
  86165. +0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,
  86166. +0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,0x2a,
  86167. +0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x9e,0xa8,0x12,
  86168. +0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x9e,0xa8,
  86169. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  86170. +0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x9e,0xa8,
  86171. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xe4,0xff,0xec,0x90,0x9e,0xa8,0x12,
  86172. +0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x9e,0xa8,
  86173. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  86174. +0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x9e,0xa8,
  86175. +0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,
  86176. +0xfc,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,0x53,0xed,0x44,0x10,
  86177. +0xfd,0xec,0x44,0x01,0xfc,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,
  86178. +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,
  86179. +0x7e,0x08,0x12,0x27,0xde,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,0x43,
  86180. +0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,0x12,
  86181. +0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x9e,0xa8,0x12,0x2a,0x7f,0x90,0x9e,0xa8,
  86182. +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,
  86183. +0xe4,0x90,0x9e,0x0f,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x9e,0x43,0xf0,
  86184. +0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x14,0xc2,0xaf,0x90,
  86185. +0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x49,0x05,0x7d,0x40,0x7f,0x01,0x12,
  86186. +0x36,0xaf,0xe5,0x14,0x24,0xff,0x92,0xaf,0x22,0x90,0x9e,0x3a,0xe0,0xc3,0x94,0x14,
  86187. +0x50,0x05,0xe0,0x04,0xf0,0x81,0x01,0x90,0x9e,0x3a,0xe0,0x64,0x14,0x60,0x02,0x81,
  86188. +0x01,0x90,0x9e,0x49,0xe0,0x70,0x25,0x90,0x9e,0x4c,0xe0,0x70,0x1f,0x90,0x9e,0x4a,
  86189. +0xe0,0x70,0x19,0x90,0x9e,0x4d,0xe0,0x70,0x13,0x90,0x9e,0x4b,0xe0,0x70,0x0d,0x90,
  86190. +0x9e,0x4e,0xe0,0x70,0x07,0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x9e,0x49,0xe0,
  86191. +0x90,0x04,0x44,0xf0,0x90,0x9e,0x4a,0xe0,0x90,0x04,0x45,0xf0,0x90,0x9e,0x4b,0xe0,
  86192. +0x90,0x04,0x46,0xf0,0xa3,0xe4,0xf0,0x90,0x9e,0x4c,0xe0,0x90,0x04,0x48,0xf0,0x90,
  86193. +0x9e,0x4d,0xe0,0x90,0x04,0x49,0xf0,0x90,0x9e,0x4e,0xe0,0x90,0x04,0x4a,0xf0,0xa3,
  86194. +0xe4,0xf0,0x90,0x9e,0x35,0xe0,0x90,0x04,0x4c,0xf0,0x90,0x9e,0x36,0xe0,0x90,0x04,
  86195. +0x4d,0xf0,0x90,0x9e,0x37,0xe0,0x90,0x04,0x4e,0xf0,0x90,0x9e,0x38,0xe0,0x90,0x04,
  86196. +0x4f,0xf0,0xe4,0x90,0x9e,0x3a,0xf0,0x90,0x9e,0x35,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,
  86197. +0xf0,0xa3,0xf0,0x90,0x9e,0x49,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,
  86198. +0xf0,0x90,0x05,0x60,0xe0,0x90,0x9e,0x19,0xf0,0x90,0x05,0x61,0xe0,0x90,0x9e,0x1a,
  86199. +0xf0,0x90,0x05,0x62,0xe0,0x90,0x9e,0x1b,0xf0,0x90,0x05,0x63,0xe0,0x90,0x9e,0x1c,
  86200. +0xf0,0x90,0x9e,0x52,0xe0,0xff,0x90,0x9e,0x1c,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,
  86201. +0x9e,0x52,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x9e,0x40,0xe0,0xb4,0x01,
  86202. +0x02,0x80,0x03,0x90,0x9e,0x44,0xe0,0xff,0x12,0x4c,0xf0,0x22,0x90,0x9e,0x53,0xe0,
  86203. +0x64,0x01,0x60,0x08,0x90,0x9e,0x41,0xe0,0x60,0x02,0xa1,0x23,0x90,0x9e,0x35,0xe0,
  86204. +0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x9e,0x36,0xe0,0xc3,0x94,
  86205. +0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x9e,0x37,0xe0,0xc3,0x94,0xff,
  86206. +0x50,0x0a,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x36,0xf0,0x80,0x15,0x90,0x9e,0x38,0xe0,
  86207. +0xc3,0x94,0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x37,0xf0,0x90,0x9e,0x36,
  86208. +0xf0,0x90,0x9e,0x35,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,
  86209. +0x32,0x90,0x9e,0x49,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,
  86210. +0x9e,0x4a,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x9e,
  86211. +0x4b,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x4a,0xf0,0x90,
  86212. +0x9e,0x49,0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x9e,0x4c,0xe0,0xc3,0x94,
  86213. +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x9e,0x4d,0xe0,0xc3,0x94,0xff,0x50,
  86214. +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x9e,0x4e,0xe0,0xc3,0x94,0xff,0x50,0x0c,
  86215. +0xe0,0x04,0xf0,0xe4,0x90,0x9e,0x4d,0xf0,0x90,0x9e,0x4c,0xf0,0x90,0x04,0xfd,0xe0,
  86216. +0x44,0x01,0xf0,0x22,0x68,0x4c,};
  86217. +#else
  86218. +// =================== v88 TSMC P2PPS with CCX report C2H 2012-12-05 =======================
  86219. +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = {
  86220. +0xC1, 0x88, 0x02, 0x05, 0x58, 0x00, 0x02, 0x00, 0x12, 0x05, 0x17, 0x12, 0xDE, 0x3E, 0x00, 0x00,
  86221. +0x94, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86222. +0x02, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86223. +0x00, 0x00, 0x00, 0x02, 0x60, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86224. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86225. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86226. +0x00, 0x00, 0x00, 0x02, 0x68, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4B, 0x87, 0x00, 0x00,
  86227. +0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02,
  86228. +0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09,
  86229. +0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08,
  86230. +0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18,
  86231. +0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21,
  86232. +0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20,
  86233. +0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10,
  86234. +0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20,
  86235. +0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04,
  86236. +0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05,
  86237. +0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E,
  86238. +0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E,
  86239. +0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A,
  86240. +0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04,
  86241. +0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60,
  86242. +0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40,
  86243. +0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8,
  86244. +0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C,
  86245. +0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28,
  86246. +0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64,
  86247. +0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02,
  86248. +0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E,
  86249. +0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
  86250. +0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06,
  86251. +0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00,
  86252. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86253. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86254. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86255. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86256. +0xBB, 0x01, 0x0C, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x22, 0x50,
  86257. +0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE6, 0x22, 0xBB, 0xFE, 0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0x22,
  86258. +0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE4, 0x93, 0x22, 0xBB, 0x01, 0x06,
  86259. +0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, 0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8,
  86260. +0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22,
  86261. +0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, 0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2,
  86262. +0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70,
  86263. +0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5,
  86264. +0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3,
  86265. +0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01,
  86266. +0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0,
  86267. +0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22,
  86268. +0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A,
  86269. +0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A,
  86270. +0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, 0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB,
  86271. +0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, 0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29,
  86272. +0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09,
  86273. +0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, 0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8,
  86274. +0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC,
  86275. +0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xA4,
  86276. +0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA,
  86277. +0xA3, 0xE0, 0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82,
  86278. +0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0,
  86279. +0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93,
  86280. +0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74,
  86281. +0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4,
  86282. +0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5,
  86283. +0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60,
  86284. +0xE9, 0xA3, 0xA3, 0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x8A, 0xC5, 0xF0, 0xE5, 0x24, 0x70, 0x03,
  86285. +0x02, 0x44, 0x9D, 0xE5, 0x21, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0x9D, 0xE5, 0x24, 0x14, 0x60,
  86286. +0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, 0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x8B, 0x0B,
  86287. +0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x0A,
  86288. +0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B, 0xF0, 0x80, 0x00, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0,
  86289. +0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x8A, 0xC5,
  86290. +0xF0, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x70, 0x04, 0x90, 0x8A, 0xC5, 0xF0, 0x90, 0x8A, 0xC5,
  86291. +0xE0, 0x60, 0x4A, 0x43, 0x25, 0x10, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0C, 0xE0, 0x75,
  86292. +0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x8B, 0x15, 0xE0, 0x2F, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  86293. +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x22, 0x54,
  86294. +0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x90, 0x8B, 0x2C,
  86295. +0xE0, 0x30, 0xE0, 0x09, 0x12, 0x7D, 0xC1, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0xF5,
  86296. +0x25, 0xF5, 0x24, 0x75, 0x23, 0x0C, 0x75, 0x22, 0x0C, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x8B, 0x18,
  86297. +0xF0, 0x90, 0x8B, 0x17, 0xF0, 0x90, 0x8B, 0x19, 0x04, 0xF0, 0x90, 0x8B, 0x0B, 0xF0, 0xE4, 0x90,
  86298. +0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0D, 0xF0, 0x90, 0x8B, 0x15, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x8B,
  86299. +0x0C, 0xF0, 0x90, 0x8B, 0x13, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x10, 0xF0, 0xA3, 0x74,
  86300. +0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0, 0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0xE4, 0x90,
  86301. +0x8B, 0x0E, 0xF0, 0x90, 0x8B, 0x0A, 0xF0, 0x90, 0x8B, 0x08, 0xF0, 0x90, 0x8B, 0x12, 0xF0, 0x22,
  86302. +0x7F, 0x00, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0x8E, 0x64, 0x8F, 0x65, 0xAD, 0x65, 0xAC,
  86303. +0x64, 0xAF, 0x63, 0x12, 0x4A, 0x5B, 0xAF, 0x65, 0xAE, 0x64, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F,
  86304. +0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01,
  86305. +0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC,
  86306. +0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74,
  86307. +0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74,
  86308. +0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53,
  86309. +0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74,
  86310. +0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D,
  86311. +0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01,
  86312. +0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0xE5, 0x67, 0x54,
  86313. +0x0F, 0xFF, 0xE5, 0x22, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x67, 0x30, 0xE2, 0x30, 0xE5, 0x22,
  86314. +0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x4A, 0xB2, 0xE5, 0x22, 0x30, 0xE3, 0x10, 0xE5, 0x67, 0x20,
  86315. +0xE3, 0x0B, 0x12, 0x49, 0xD5, 0xEF, 0x60, 0x53, 0x12, 0x4A, 0xCC, 0x80, 0x4E, 0xE5, 0x22, 0x20,
  86316. +0xE3, 0x49, 0xE5, 0x67, 0x30, 0xE3, 0x44, 0xAF, 0x68, 0x12, 0x4A, 0x7C, 0x80, 0x3D, 0xE5, 0x22,
  86317. +0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x67, 0x20, 0xE3, 0x09, 0x12, 0x49, 0xD5, 0xEF, 0x60,
  86318. +0x2A, 0x12, 0x4A, 0xCC, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x67, 0x20, 0xE2,
  86319. +0x09, 0x12, 0x49, 0x93, 0xEF, 0x60, 0x14, 0x12, 0x4A, 0x32, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF,
  86320. +0x02, 0x09, 0x12, 0x45, 0x00, 0xEF, 0x60, 0x03, 0x12, 0x4B, 0x10, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
  86321. +0x02, 0x46, 0x6E, 0x02, 0x50, 0xC6, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6,
  86322. +0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C,
  86323. +0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01,
  86324. +0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B,
  86325. +0x23, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F,
  86326. +0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8,
  86327. +0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA,
  86328. +0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE,
  86329. +0xE7, 0x80, 0xBE, 0xE5, 0x21, 0x64, 0x01, 0x70, 0x67, 0xE5, 0x24, 0x60, 0x63, 0xE5, 0x24, 0x64,
  86330. +0x02, 0x60, 0x06, 0xE5, 0x24, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8B, 0x0B,
  86331. +0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8B, 0x19, 0xF0, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x07, 0x90,
  86332. +0x8B, 0x19, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x8B, 0x0B, 0xE0, 0xFF, 0x90, 0x8B, 0x0B, 0xEF, 0xF0,
  86333. +0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x0C, 0xF0, 0x90, 0x05, 0x58,
  86334. +0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, 0x25,
  86335. +0xFD, 0x53, 0x25, 0xEF, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x47, 0x8E,
  86336. +0x22, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x36, 0x75, 0x7D, 0x02, 0x7F,
  86337. +0x03, 0x12, 0x36, 0x75, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12,
  86338. +0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x7D, 0xC1, 0x90, 0x06, 0x04, 0xE0,
  86339. +0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B,
  86340. +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x36, 0xE6, 0x7D, 0x02, 0x7F, 0x03, 0x12,
  86341. +0x36, 0xE6, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0,
  86342. +0x12, 0x4B, 0x4F, 0xE5, 0x21, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x8B, 0x0D, 0xF0, 0x22, 0xE4, 0x90,
  86343. +0x8A, 0xC5, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x8A, 0xC5, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x09,
  86344. +0x53, 0x25, 0xFE, 0x53, 0x25, 0xFD, 0x12, 0x4A, 0xFC, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE6, 0x15,
  86345. +0x43, 0x25, 0x01, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x4A, 0x97, 0x80, 0x08,
  86346. +0x12, 0x49, 0x49, 0x80, 0x03, 0x53, 0x25, 0xFE, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE7, 0x27, 0x43,
  86347. +0x25, 0x02, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4,
  86348. +0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90,
  86349. +0x8B, 0x1B, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x25, 0xFD, 0x22, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x8B,
  86350. +0x12, 0x4B, 0x43, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xF5, 0x24, 0x14, 0x60,
  86351. +0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90,
  86352. +0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD, 0xE4, 0xFF, 0x12, 0x4A,
  86353. +0x07, 0x80, 0x29, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD,
  86354. +0x7F, 0x01, 0x12, 0x4A, 0x07, 0x1F, 0x80, 0x14, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00,
  86355. +0x02, 0x12, 0x42, 0x20, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0x07, 0xE4, 0xFF, 0x12, 0x47, 0x21, 0x22,
  86356. +0xE4, 0x90, 0x8A, 0xCB, 0xF0, 0xE5, 0x24, 0x60, 0x49, 0x90, 0x8B, 0x1B, 0xE0, 0x60, 0x0D, 0xE4,
  86357. +0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x38, 0x80, 0x33, 0x90, 0x8B, 0x0C, 0xE0,
  86358. +0x04, 0xF0, 0x53, 0x25, 0xEF, 0x90, 0x8A, 0xCB, 0xE0, 0xFF, 0x90, 0x8B, 0x10, 0xE0, 0x2F, 0xFF,
  86359. +0xE4, 0x33, 0xFE, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98,
  86360. +0x40, 0x0D, 0xE5, 0x21, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12,
  86361. +0x4A, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x63, 0x90, 0x04, 0x1D, 0xE0,
  86362. +0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x66, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x9A, 0xBF, 0x01,
  86363. +0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD, 0x12, 0x45, 0x09, 0x90, 0x05,
  86364. +0x22, 0xE5, 0x66, 0xF0, 0x80, 0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD,
  86365. +0x12, 0x45, 0x09, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x24,
  86366. +0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x41, 0x90, 0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x12, 0x45, 0x9E,
  86367. +0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  86368. +0x7F, 0x58, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92,
  86369. +0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x22, 0xE5, 0x22, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50,
  86370. +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01,
  86371. +0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E,
  86372. +0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05,
  86373. +0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x17, 0x14, 0xF0, 0xE5, 0x22, 0x54, 0x0F,
  86374. +0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12,
  86375. +0x7D, 0xC1, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x37, 0xE5, 0x25, 0x54, 0x03, 0x70,
  86376. +0x31, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x50, 0x28, 0xE5, 0x25, 0x20, 0xE2, 0x23, 0xE5,
  86377. +0x25, 0x20, 0xE4, 0x1E, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x18, 0x90, 0x8B, 0x12, 0xE0, 0x70, 0x12,
  86378. +0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F,
  86379. +0x01, 0x22, 0x7F, 0x00, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x27, 0x90, 0x8B, 0x18,
  86380. +0xE0, 0x70, 0x21, 0x90, 0x8B, 0x17, 0xE0, 0x70, 0x1B, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x04,
  86381. +0x50, 0x12, 0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08,
  86382. +0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x22, 0x90,
  86383. +0x8B, 0x19, 0x74, 0x01, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8B, 0x16, 0xE0, 0x90, 0x8B,
  86384. +0x19, 0xF0, 0x80, 0x05, 0x90, 0x8B, 0x19, 0xED, 0xF0, 0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B,
  86385. +0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E,
  86386. +0x9A, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x36,
  86387. +0xE6, 0x12, 0x7C, 0x50, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x02, 0x22, 0xEF, 0x60, 0x0F, 0x74, 0x21,
  86388. +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x21, 0x2D,
  86389. +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0,
  86390. +0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x48, 0xB3,
  86391. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x0C, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x8A, 0xF8,
  86392. +0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5F, 0xFD, 0x8E, 0x69, 0x8F, 0x6A, 0x90, 0x04, 0x1F, 0x74, 0x20,
  86393. +0xF0, 0x22, 0x90, 0x8B, 0x52, 0xEF, 0xF0, 0x12, 0x7D, 0x42, 0x90, 0x8B, 0x52, 0xE0, 0x60, 0x05,
  86394. +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x04, 0x22, 0x90, 0x06, 0x04, 0xE0,
  86395. +0x44, 0x40, 0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0x7F, 0x01, 0x12, 0x48, 0xB3, 0x53, 0x22, 0xF0,
  86396. +0x43, 0x22, 0x04, 0x22, 0xE5, 0x23, 0x30, 0xE6, 0x12, 0xE5, 0x23, 0x54, 0x0F, 0xFF, 0x90, 0x01,
  86397. +0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, 0x53, 0x23, 0xBF, 0x22, 0x90, 0x8B, 0x2C, 0xE0,
  86398. +0x30, 0xE0, 0x05, 0xAF, 0x23, 0x02, 0x7E, 0x06, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x22,
  86399. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x01, 0x12, 0x4B, 0x5A, 0x12, 0x4B, 0x5B, 0x53, 0x22, 0xF0, 0x43,
  86400. +0x22, 0x02, 0x22, 0x41, 0x8A, 0xF6, 0x00, 0x41, 0x8B, 0x05, 0x00, 0x41, 0x8B, 0x51, 0x00, 0x41,
  86401. +0x8B, 0x53, 0x00, 0x00, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x7F, 0x64, 0x7F, 0x7F, 0x01, 0x60, 0x02,
  86402. +0x7F, 0x00, 0x22, 0xE4, 0x90, 0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0C, 0xF0, 0xF5, 0x25, 0x22, 0x90,
  86403. +0x8B, 0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x22, 0x22, 0xF0, 0x90, 0x8B, 0x0F,
  86404. +0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01,
  86405. +0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x3D, 0xE0, 0xFB, 0xA3, 0xE0, 0xF5, 0x44, 0xE4, 0xF5, 0x45, 0x12,
  86406. +0x35, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0,
  86407. +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05,
  86408. +0xC0, 0x06, 0xC0, 0x07, 0x75, 0x0E, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x87, 0xF0, 0x74, 0x4B, 0xA3,
  86409. +0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31,
  86410. +0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34,
  86411. +0x30, 0xE0, 0x51, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x1F,
  86412. +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x34, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0,
  86413. +0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90,
  86414. +0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x1D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, 0x8B,
  86415. +0x2E, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF,
  86416. +0x70, 0x02, 0xD1, 0x56, 0xE5, 0x34, 0x30, 0xE1, 0x08, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x11,
  86417. +0x60, 0xE5, 0x34, 0x30, 0xE2, 0x28, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0,
  86418. +0x30, 0xE0, 0x14, 0x90, 0x8B, 0x3D, 0xE4, 0x71, 0x5C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90,
  86419. +0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x18, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34,
  86420. +0x30, 0xE3, 0x38, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24,
  86421. +0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  86422. +0x7F, 0x5C, 0x7E, 0x01, 0x71, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74,
  86423. +0x02, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x17, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34, 0x30, 0xE4, 0x09,
  86424. +0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x12, 0x51, 0xC9, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01,
  86425. +0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x10, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90,
  86426. +0x00, 0x83, 0xE0, 0xF5, 0x23, 0x51, 0xE4, 0x51, 0xFC, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01,
  86427. +0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90,
  86428. +0x8B, 0x05, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05,
  86429. +0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x75, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90,
  86430. +0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x36, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64,
  86431. +0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0xD1, 0x89, 0x90, 0x8B,
  86432. +0x2C, 0xE0, 0x30, 0xE0, 0x49, 0x90, 0x8B, 0x30, 0xE4, 0xF0, 0xFF, 0xB1, 0xE0, 0xEF, 0x60, 0x3E,
  86433. +0x12, 0x65, 0x5F, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60, 0x32, 0xEF, 0xB4, 0x04, 0x02,
  86434. +0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x8B, 0x2D,
  86435. +0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x05, 0x7F,
  86436. +0x01, 0x12, 0x65, 0x82, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x12, 0x7D, 0xC1, 0xE5, 0x36,
  86437. +0x30, 0xE1, 0x47, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x19,
  86438. +0x90, 0x8B, 0x36, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01,
  86439. +0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x1A,
  86440. +0x90, 0x8B, 0x30, 0x74, 0x01, 0xF0, 0x12, 0x7E, 0x2B, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60,
  86441. +0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF, 0x70, 0x02, 0xD1, 0x56, 0x74, 0x87, 0x04, 0x90, 0x01, 0xC4,
  86442. +0xF0, 0x74, 0x4B, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0,
  86443. +0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32,
  86444. +0xEF, 0x64, 0x01, 0x70, 0x3D, 0x90, 0x8B, 0x35, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B,
  86445. +0x08, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x34, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22,
  86446. +0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54,
  86447. +0x07, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x36, 0xE0, 0x7F, 0x01, 0x60, 0x36, 0x7F,
  86448. +0x00, 0x22, 0x90, 0x8B, 0x2F, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x08, 0xE0, 0x60,
  86449. +0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2E, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2C,
  86450. +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x30, 0xE0, 0x7F,
  86451. +0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x2D, 0xE0,
  86452. +0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x1A, 0x7F, 0x02,
  86453. +0x80, 0x13, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, 0x8B, 0x2D,
  86454. +0xE0, 0x70, 0x05, 0x7F, 0x04, 0x12, 0x65, 0x82, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  86455. +0x90, 0x8B, 0x33, 0xE0, 0x90, 0x8B, 0x55, 0xF0, 0x6F, 0x70, 0x02, 0xE1, 0x55, 0xEF, 0x14, 0x60,
  86456. +0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xE1, 0x30, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x55, 0x90,
  86457. +0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xC2, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x02,
  86458. +0x04, 0xF1, 0xAF, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0xC6, 0xE1, 0x55,
  86459. +0x90, 0x8B, 0x55, 0xE0, 0x64, 0x01, 0x70, 0x7D, 0xF1, 0xB1, 0x80, 0x79, 0x90, 0x8B, 0x55, 0xE0,
  86460. +0xFF, 0xB4, 0x03, 0x04, 0xF1, 0xCA, 0x80, 0x6D, 0xEF, 0xB4, 0x02, 0x04, 0xF1, 0xA1, 0x80, 0x65,
  86461. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0xD5, 0x80, 0x59, 0xEF, 0x70, 0x56, 0xF1,
  86462. +0x8E, 0x80, 0x52, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x7C, 0x41, 0x80, 0x46, 0x90,
  86463. +0x8B, 0x55, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0x72, 0x80, 0x3B, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04,
  86464. +0x05, 0x12, 0x7D, 0x23, 0x80, 0x2F, 0x90, 0x8B, 0x55, 0xE0, 0x70, 0x29, 0xF1, 0x70, 0x80, 0x25,
  86465. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xF1, 0x5A, 0x80, 0x19, 0xEF, 0xB4, 0x02, 0x04,
  86466. +0xF1, 0x6B, 0x80, 0x11, 0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0x5A, 0x80, 0x05,
  86467. +0xEF, 0x70, 0x02, 0xF1, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0,
  86468. +0x90, 0x8B, 0x33, 0x74, 0x03, 0xF0, 0x22, 0xF1, 0x8E, 0x80, 0xEF, 0x12, 0x7D, 0x42, 0x80, 0xEA,
  86469. +0xF1, 0x8E, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x9A, 0xEF, 0x70, 0x06, 0x90, 0x01,
  86470. +0xC8, 0x74, 0xFD, 0xF0, 0x12, 0x7C, 0x50, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01,
  86471. +0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x37, 0x00, 0x90, 0x8B, 0x33, 0x74, 0x01, 0xF0,
  86472. +0x22, 0x12, 0x7D, 0x42, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22, 0xF1,
  86473. +0xA1, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x36, 0x92, 0x90, 0x05, 0x27, 0xE4, 0xF0, 0x90, 0x8B, 0x33,
  86474. +0xF0, 0x22, 0xF1, 0xCA, 0x80, 0xEB, 0xF1, 0xD5, 0x80, 0xE7, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90,
  86475. +0x8B, 0x33, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22,
  86476. +0xF1, 0x8E, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0x90,
  86477. +0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12,
  86478. +0x43, 0xBA, 0x50, 0x1A, 0x00, 0x40, 0x50, 0x42, 0x00, 0x80, 0x50, 0x6D, 0x01, 0x00, 0x50, 0x81,
  86479. +0x02, 0x00, 0x50, 0x99, 0x04, 0x00, 0x00, 0x00, 0x50, 0xB6, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE,
  86480. +0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06,
  86481. +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
  86482. +0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF,
  86483. +0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78,
  86484. +0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04,
  86485. +0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80,
  86486. +0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF,
  86487. +0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE,
  86488. +0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D,
  86489. +0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x58,
  86490. +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0xCC, 0xF0, 0xA3, 0xF0, 0x75, 0x8E, 0x02,
  86491. +0x91, 0x0E, 0x12, 0x68, 0x44, 0x90, 0x8B, 0x07, 0xEF, 0xF0, 0x12, 0x68, 0x51, 0x90, 0x8B, 0x09,
  86492. +0xEF, 0xF0, 0x12, 0x68, 0x5D, 0x90, 0x8A, 0xF4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x55,
  86493. +0xF5, 0x21, 0x12, 0x72, 0x55, 0x12, 0x44, 0x9E, 0x12, 0x32, 0x3D, 0x7F, 0x03, 0x12, 0x78, 0x42,
  86494. +0x12, 0x7C, 0x3D, 0x12, 0x68, 0x0A, 0x12, 0x68, 0x75, 0x12, 0x68, 0x8A, 0x12, 0x68, 0x28, 0x12,
  86495. +0x68, 0x43, 0x90, 0x8A, 0xCE, 0xE5, 0xD9, 0xF0, 0x31, 0x5F, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0,
  86496. +0x44, 0x40, 0xF0, 0x51, 0x0E, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x11, 0xBB, 0x90,
  86497. +0x8A, 0xCC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xC6, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x50, 0xA3, 0xF0,
  86498. +0xE5, 0x55, 0x30, 0xE4, 0x09, 0xC2, 0xAF, 0x53, 0x55, 0xEF, 0xD2, 0xAF, 0xB1, 0x59, 0xE5, 0x55,
  86499. +0x30, 0xE6, 0xDC, 0xC2, 0xAF, 0x53, 0x55, 0xBF, 0xD2, 0xAF, 0x12, 0x6B, 0xBD, 0x80, 0xD0, 0x90,
  86500. +0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3,
  86501. +0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x31, 0x88, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x88, 0x7D, 0xFF,
  86502. +0x7F, 0x56, 0x31, 0x88, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F,
  86503. +0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x51, 0x0E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30,
  86504. +0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  86505. +0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x31, 0x88, 0xE4, 0xFD, 0x7F, 0x51, 0x31, 0x88, 0xE4, 0xFD, 0x7F,
  86506. +0x52, 0x31, 0x88, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0xE5, 0x5E, 0x64, 0x01, 0x70, 0x3B, 0x71,
  86507. +0x4E, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x71, 0x42, 0x90, 0x00, 0x46, 0xE0, 0x44, 0x04, 0xFD, 0x7F,
  86508. +0x46, 0x31, 0x88, 0x90, 0x00, 0x44, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x44, 0x31, 0x88, 0x90, 0x00,
  86509. +0x46, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x46, 0x31, 0x88, 0x7F, 0x02, 0x71, 0x6A, 0x8F, 0x62, 0x90,
  86510. +0x01, 0xC9, 0xE5, 0x62, 0xF0, 0xB4, 0x01, 0x02, 0x51, 0xE2, 0x22, 0xE0, 0x5F, 0xF0, 0xD3, 0x10,
  86511. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
  86512. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xE0, 0xED, 0xF0, 0x90, 0x8A, 0xDF, 0xEF, 0xF0, 0xD3,
  86513. +0x94, 0x07, 0x50, 0x4E, 0xA3, 0xE0, 0x70, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8,
  86514. +0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x5F, 0xF0,
  86515. +0x80, 0x17, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33,
  86516. +0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x4F, 0xF0, 0x51, 0x0E, 0x90, 0x8A, 0xDF, 0xE0, 0xFF,
  86517. +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46,
  86518. +0x80, 0x59, 0x90, 0x8A, 0xDF, 0xE0, 0x24, 0xF8, 0xF0, 0xA3, 0xE0, 0x70, 0x1D, 0x90, 0x8A, 0xDF,
  86519. +0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xC4, 0x54, 0xF0,
  86520. +0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x80, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74,
  86521. +0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x00,
  86522. +0x43, 0xE0, 0x4F, 0xF0, 0x51, 0x0E, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08,
  86523. +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0x51, 0x0B, 0xD0, 0xD0, 0x92,
  86524. +0xAF, 0x22, 0x90, 0x00, 0x49, 0xE0, 0x90, 0x8B, 0x54, 0xF0, 0xE0, 0x54, 0x0F, 0xF0, 0x44, 0xF0,
  86525. +0xFD, 0x7F, 0x49, 0x31, 0x88, 0x90, 0x8B, 0x54, 0xE0, 0x44, 0xB0, 0xFD, 0x7F, 0x49, 0x21, 0x88,
  86526. +0x90, 0x8A, 0xDD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0x5E, 0x01, 0x8E, 0x5F, 0xF5, 0x60, 0xE4,
  86527. +0xFD, 0x7F, 0x0B, 0x51, 0x1E, 0xE4, 0xFD, 0x7F, 0x02, 0x51, 0x1E, 0x71, 0x4E, 0xE4, 0xFF, 0x71,
  86528. +0x42, 0xE4, 0xF5, 0x62, 0x90, 0x01, 0xC9, 0xE5, 0x62, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFC, 0xA3,
  86529. +0xE0, 0xFD, 0xEC, 0xFB, 0x8D, 0x44, 0xE4, 0xF5, 0x45, 0x7D, 0x01, 0x7F, 0x60, 0x7E, 0x01, 0x02,
  86530. +0x35, 0xAB, 0x90, 0x01, 0xCA, 0xE5, 0x61, 0xF0, 0xEF, 0x60, 0x02, 0x51, 0xE2, 0x22, 0x7F, 0x0B,
  86531. +0x71, 0x6A, 0xEF, 0x65, 0x61, 0x60, 0x10, 0xE5, 0x61, 0xB4, 0x01, 0x05, 0xE4, 0xF5, 0x61, 0x80,
  86532. +0x03, 0x75, 0x61, 0x01, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  86533. +0xD0, 0x90, 0x8B, 0x57, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x43, 0xE0, 0xFF, 0x74, 0x01, 0xA8,
  86534. +0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0x51, 0x0B, 0x90,
  86535. +0x8B, 0x57, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
  86536. +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05,
  86537. +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, 0x8B,
  86538. +0x57, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33,
  86539. +0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x51, 0x0E, 0x90, 0x8B, 0x57, 0xE0,
  86540. +0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  86541. +0xF9, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06,
  86542. +0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90,
  86543. +0x8B, 0x04, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x21, 0x88, 0xD3, 0x10,
  86544. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDA, 0x12, 0x43,
  86545. +0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFA, 0xE5, 0xF0, 0x24, 0x00, 0xFF, 0xE4, 0x3A, 0xFE,
  86546. +0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEE, 0x8F, 0xF0, 0x12, 0x43, 0x19, 0x12,
  86547. +0x29, 0xD9, 0xFF, 0x60, 0x2C, 0xB5, 0x5E, 0x16, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00,
  86548. +0x01, 0x12, 0x42, 0xC2, 0x65, 0x60, 0x70, 0x04, 0xE5, 0x5F, 0x65, 0xF0, 0x60, 0x22, 0x90, 0x8A,
  86549. +0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFF, 0xAE, 0xF0, 0x71, 0x00, 0x80,
  86550. +0x0F, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0x65, 0x5E, 0x60, 0x02, 0x91, 0x95,
  86551. +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x5E, 0x7F, 0x60, 0x7E, 0x01, 0x8F, 0x82, 0x8E, 0x83,
  86552. +0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x8B, 0xEF, 0x12, 0x43, 0x94,
  86553. +0x54, 0xE7, 0x01, 0x54, 0xDE, 0x02, 0x55, 0x0B, 0x03, 0x55, 0x14, 0x05, 0x55, 0x1D, 0x06, 0x55,
  86554. +0x58, 0x07, 0x55, 0x25, 0x08, 0x55, 0x2E, 0x09, 0x55, 0x36, 0x20, 0x55, 0x3F, 0x2C, 0x54, 0xF0,
  86555. +0x2D, 0x54, 0xF9, 0x2E, 0x55, 0x02, 0x3B, 0x55, 0x48, 0x4B, 0x00, 0x00, 0x55, 0x51, 0x90, 0x8A,
  86556. +0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x85, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x8B,
  86557. +0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0xB8, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02,
  86558. +0x75, 0x00, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x75, 0x39, 0x90, 0x8A, 0xD7, 0x12, 0x43,
  86559. +0x6B, 0x02, 0x75, 0x52, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x0F, 0x90, 0x8A, 0xD7,
  86560. +0x12, 0x43, 0x6B, 0xC1, 0xA6, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x75, 0x9A, 0x90, 0x8A,
  86561. +0xD7, 0x12, 0x43, 0x6B, 0x81, 0x1E, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x78, 0x81, 0x90,
  86562. +0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x7A, 0xC2, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x7C,
  86563. +0x2B, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  86564. +0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFD, 0x70,
  86565. +0x02, 0xC1, 0xA1, 0x90, 0x8B, 0x51, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  86566. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x9A, 0x90,
  86567. +0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD0,
  86568. +0xF0, 0x75, 0x1D, 0x01, 0x75, 0x1E, 0x8A, 0x75, 0x1F, 0xD0, 0x75, 0x20, 0x01, 0x7B, 0x01, 0x7A,
  86569. +0x8A, 0x79, 0xD1, 0x12, 0x5E, 0xE4, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54,
  86570. +0x01, 0x90, 0x8B, 0x51, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43,
  86571. +0x5F, 0xE0, 0x90, 0x8A, 0xD2, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89,
  86572. +0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD3, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90,
  86573. +0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD4, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0,
  86574. +0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD5, 0xF0, 0x90, 0x8B, 0x51, 0xE0,
  86575. +0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD6, 0xF0, 0x80, 0x33,
  86576. +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD2, 0xF0, 0x90,
  86577. +0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD3,
  86578. +0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x5F, 0xE0, 0x90,
  86579. +0x8A, 0xD4, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x8A, 0x79, 0xD2, 0x91, 0xA6, 0x90,
  86580. +0x8A, 0xCF, 0xE0, 0xFF, 0x90, 0x8B, 0x51, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
  86581. +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0xFF, 0x74,
  86582. +0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x8B,
  86583. +0x51, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0xA1, 0x6A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02,
  86584. +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20, 0xFF, 0x54, 0x1F, 0xFE,
  86585. +0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x8A, 0xDA, 0xEF, 0xF0, 0xA3,
  86586. +0xED, 0xF0, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x03, 0x12,
  86587. +0x42, 0x20, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x42,
  86588. +0x20, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x8A, 0xE0, 0xF0, 0x90, 0x8A, 0xDA, 0xE0,
  86589. +0xFF, 0x75, 0xF0, 0x09, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x8A,
  86590. +0xE1, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x23, 0xF9, 0x74, 0x87,
  86591. +0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90,
  86592. +0x00, 0x03, 0x12, 0x42, 0x20, 0x54, 0x0F, 0xFF, 0x90, 0x8A, 0xE3, 0x12, 0x43, 0x6B, 0xEF, 0x12,
  86593. +0x42, 0x4D, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x90,
  86594. +0x8A, 0xE3, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x90, 0x8A, 0xDC, 0x12,
  86595. +0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8A, 0xE1, 0xE0, 0xFC, 0xA3, 0xE0,
  86596. +0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x29, 0xD9, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0,
  86597. +0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x24, 0xC1, 0xF5, 0x82, 0xE4, 0x34,
  86598. +0x86, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xDB, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87,
  86599. +0x29, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A, 0x12, 0x43, 0x5F,
  86600. +0x74, 0x01, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2B, 0x12,
  86601. +0x43, 0x5F, 0xEE, 0xF0, 0x8F, 0x0F, 0xEF, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89,
  86602. +0xAF, 0x82, 0xF5, 0x10, 0x8F, 0x11, 0xE5, 0x0F, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x81, 0xF9, 0x74,
  86603. +0x86, 0x35, 0xF0, 0x75, 0x12, 0x01, 0xF5, 0x13, 0x89, 0x14, 0x75, 0xF0, 0x09, 0xE5, 0x0F, 0x90,
  86604. +0x87, 0x25, 0x12, 0x43, 0x5F, 0xAF, 0x82, 0x85, 0x83, 0x15, 0x8F, 0x16, 0xE5, 0x0F, 0x75, 0xF0,
  86605. +0x09, 0xA4, 0x24, 0x23, 0xF9, 0x74, 0x87, 0x35, 0xF0, 0x75, 0x17, 0x01, 0xF5, 0x18, 0x89, 0x19,
  86606. +0x74, 0xC1, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0x94, 0x58,
  86607. +0x34, 0x00, 0x58, 0x49, 0x01, 0x58, 0x5E, 0x02, 0x58, 0x73, 0x03, 0x58, 0x9C, 0x04, 0x58, 0xB1,
  86608. +0x05, 0x58, 0xC6, 0x06, 0x58, 0xEC, 0x0C, 0x59, 0x19, 0x0D, 0x59, 0x46, 0x0E, 0x59, 0x73, 0x0F,
  86609. +0x00, 0x00, 0x59, 0xA7, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  86610. +0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5,
  86611. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x0F,
  86612. +0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74,
  86613. +0x05, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  86614. +0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
  86615. +0x86, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x21, 0xA7, 0xE5, 0x0F, 0x25, 0xE0,
  86616. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80,
  86617. +0x27, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F,
  86618. +0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34,
  86619. +0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5,
  86620. +0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x21, 0xA7, 0x90, 0x04, 0x47, 0xE0,
  86621. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x12, 0xAA,
  86622. +0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x11, 0x82,
  86623. +0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x21, 0x9E, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x12, 0xAA,
  86624. +0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  86625. +0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83,
  86626. +0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  86627. +0x12, 0x42, 0x4D, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01,
  86628. +0x12, 0x42, 0x5F, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04,
  86629. +0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D,
  86630. +0x90, 0x04, 0x52, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F,
  86631. +0x90, 0x04, 0x51, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85,
  86632. +0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0xC0, 0x03, 0xC0,
  86633. +0x02, 0xC0, 0x01, 0x12, 0x29, 0xD9, 0xFF, 0xAB, 0x17, 0xAA, 0x18, 0xA9, 0x19, 0x12, 0x29, 0xD9,
  86634. +0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x4D, 0xAB, 0x12, 0xE5, 0x14, 0x24, 0x01,
  86635. +0xF9, 0xE4, 0x35, 0x13, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x29, 0xD9, 0xFF, 0xAB,
  86636. +0x17, 0xAA, 0x18, 0xA9, 0x19, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x5F, 0xD0, 0x01, 0xD0, 0x02,
  86637. +0xD0, 0x03, 0x12, 0x42, 0x4D, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0,
  86638. +0xFF, 0x85, 0x16, 0x82, 0x85, 0x15, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0,
  86639. +0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x16, 0x82,
  86640. +0x85, 0x15, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0x25,
  86641. +0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60,
  86642. +0x4B, 0x90, 0x8A, 0xE6, 0x74, 0x0B, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50,
  86643. +0x02, 0x41, 0xEC, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
  86644. +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5,
  86645. +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x8A, 0xE6, 0xE0, 0x24, 0x10,
  86646. +0xA3, 0xF0, 0x80, 0x68, 0x90, 0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, 0x0F, 0x25, 0xE0,
  86647. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47,
  86648. +0x90, 0x8A, 0xE6, 0x74, 0x0F, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C,
  86649. +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
  86650. +0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E,
  86651. +0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x8A, 0xE6, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90,
  86652. +0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x8A, 0xE7, 0xF0, 0xE5, 0x0F, 0x25, 0xE0,
  86653. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46,
  86654. +0xE4, 0x90, 0x8A, 0xE6, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x61,
  86655. +0xA5, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  86656. +0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
  86657. +0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x8A, 0xE6, 0xE0, 0x80, 0x63, 0x90, 0x8A,
  86658. +0xE6, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
  86659. +0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x8A, 0xE6, 0xF0, 0x90,
  86660. +0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08,
  86661. +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81,
  86662. +0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08,
  86663. +0x90, 0x8A, 0xE6, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x8A, 0xE6, 0xE0, 0x04, 0xF0, 0x80, 0xBF,
  86664. +0xE4, 0x90, 0x8A, 0xE8, 0xF0, 0x90, 0x8A, 0xE7, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x0F, 0x90,
  86665. +0x87, 0x27, 0x12, 0x43, 0x5F, 0xEF, 0xF0, 0x90, 0x8A, 0xE8, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5,
  86666. +0x0F, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, 0x20, 0x50, 0x32,
  86667. +0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02,
  86668. +0x80, 0x18, 0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E,
  86669. +0x50, 0x08, 0x90, 0x8A, 0xE8, 0xE0, 0xA3, 0xF0, 0x80, 0x08, 0x90, 0x8A, 0xE7, 0xE0, 0x90, 0x8A,
  86670. +0xE9, 0xF0, 0x90, 0x8A, 0xE9, 0xE0, 0xFD, 0xAF, 0x0F, 0x91, 0x4E, 0x90, 0x8A, 0xE9, 0xE0, 0xFF,
  86671. +0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8A, 0xE7,
  86672. +0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3,
  86673. +0x94, 0x0B, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40,
  86674. +0x07, 0x90, 0x87, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x87, 0x22, 0xF0, 0x22, 0xD3, 0x10,
  86675. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED,
  86676. +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xED, 0x54, 0x1F, 0x90, 0x8A, 0xC7, 0xF0, 0x74,
  86677. +0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xC5, 0xF0, 0x90, 0x8A,
  86678. +0xC8, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, 0x37, 0x90, 0x8A, 0xC5, 0xE0,
  86679. +0x25, 0x0D, 0xFF, 0xA3, 0xF0, 0xA3, 0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40,
  86680. +0x10, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x04, 0x80,
  86681. +0x9D, 0x90, 0x8A, 0xC6, 0xE0, 0xFF, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  86682. +0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0,
  86683. +0xFF, 0x90, 0x8A, 0xCA, 0xF0, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
  86684. +0x54, 0x1F, 0x90, 0x8A, 0xC9, 0xF0, 0xD3, 0x9F, 0x40, 0x06, 0xA3, 0xE0, 0x90, 0x8A, 0xC9, 0xF0,
  86685. +0x90, 0x8A, 0xC9, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83,
  86686. +0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
  86687. +0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13,
  86688. +0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
  86689. +0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xC9, 0xE0, 0xFD, 0x91, 0x4E, 0x90, 0x8A, 0xC9, 0xE0, 0xFF,
  86690. +0x22, 0xAC, 0x07, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F,
  86691. +0x90, 0x8A, 0xDE, 0xF0, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x8A, 0xE1, 0xF0, 0x75, 0xF0, 0x09, 0xEC,
  86692. +0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xE3, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90,
  86693. +0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0x90, 0x8A, 0xE4, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xE4,
  86694. +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE5, 0xCB, 0xF0,
  86695. +0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0,
  86696. +0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE7, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C,
  86697. +0x90, 0x8A, 0xE4, 0xE0, 0x90, 0x8A, 0xE1, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0xED, 0x70, 0x02, 0xC1,
  86698. +0x93, 0x90, 0x8A, 0xE2, 0xED, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x8A, 0xE1,
  86699. +0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0x14, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0x70,
  86700. +0x02, 0xC1, 0x93, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xC1, 0x93, 0xE4,
  86701. +0x90, 0x8A, 0xE0, 0xF0, 0xEF, 0x14, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xE3, 0xE0, 0xFD, 0x90,
  86702. +0x8A, 0xDF, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0,
  86703. +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  86704. +0xF9, 0xFF, 0x90, 0x8A, 0xE7, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x8A,
  86705. +0xDF, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  86706. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE5, 0xE0, 0x5E, 0xFE, 0xA3,
  86707. +0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xE0,
  86708. +0xE0, 0x04, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0, 0x6F, 0x60, 0x08, 0x90,
  86709. +0x8A, 0xDF, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0,
  86710. +0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x8A, 0xDF, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x8A, 0xE3, 0xE0, 0x90,
  86711. +0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34,
  86712. +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  86713. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13,
  86714. +0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  86715. +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x8A, 0xDE, 0xE0, 0xFD, 0x91, 0x4E, 0x90, 0x8A,
  86716. +0xDE, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1A, 0x8A, 0x1B, 0x89,
  86717. +0x1C, 0x90, 0x8B, 0x3F, 0x12, 0x43, 0x8B, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0x90, 0x8B, 0x42,
  86718. +0x12, 0x43, 0x8B, 0xAF, 0x20, 0x15, 0x20, 0xEF, 0x60, 0x1E, 0x90, 0x8B, 0x42, 0xE4, 0x75, 0xF0,
  86719. +0x01, 0x12, 0x43, 0x74, 0x12, 0x29, 0xD9, 0xFF, 0x90, 0x8B, 0x3F, 0xE4, 0x75, 0xF0, 0x01, 0x12,
  86720. +0x43, 0x74, 0xEF, 0x12, 0x42, 0x4D, 0x80, 0xDB, 0xAB, 0x1A, 0xAA, 0x1B, 0xA9, 0x1C, 0xD0, 0xD0,
  86721. +0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x8B,
  86722. +0x90, 0x8B, 0x53, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x7F, 0xAF,
  86723. +0x7E, 0x01, 0x12, 0x74, 0x3B, 0xEF, 0x60, 0x47, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x6B, 0x8B, 0x1D,
  86724. +0x8A, 0x1E, 0x89, 0x1F, 0x75, 0x20, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xE4, 0x90,
  86725. +0x8B, 0x48, 0x12, 0x43, 0x6B, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x8B, 0x45, 0x12, 0x43,
  86726. +0x6B, 0x12, 0x29, 0xD9, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x20, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2,
  86727. +0xD1, 0xE4, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0,
  86728. +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8A, 0xC5, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44,
  86729. +0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x56, 0x90, 0x8B, 0x48, 0x12, 0x43, 0x8B, 0x0B, 0x7A,
  86730. +0x8A, 0x79, 0xC5, 0xE1, 0x33, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74,
  86731. +0xC5, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0,
  86732. +0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30,
  86733. +0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF,
  86734. +0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13,
  86735. +0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x1E, 0xAF, 0x03, 0x74, 0x0F,
  86736. +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x10, 0x2F, 0xF5,
  86737. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5,
  86738. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
  86739. +0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
  86740. +0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5F, 0xC5,
  86741. +0xBF, 0x01, 0x10, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD, 0x90, 0x04, 0x1F,
  86742. +0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13,
  86743. +0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x8A, 0xC5, 0x74,
  86744. +0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF,
  86745. +0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0,
  86746. +0x79, 0x40, 0x90, 0x8A, 0xC5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59,
  86747. +0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x8A, 0xF6, 0xF0, 0x22, 0x90, 0x8A, 0xF6, 0xE0, 0x04, 0xF0,
  86748. +0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, 0x11,
  86749. +0x6D, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0,
  86750. +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90,
  86751. +0x01, 0xC4, 0x74, 0xF2, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5,
  86752. +0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55,
  86753. +0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x41, 0x89, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0,
  86754. +0x85, 0xD1, 0x4D, 0x85, 0xD2, 0x4E, 0x85, 0xD3, 0x4F, 0x85, 0xD4, 0x50, 0x85, 0xD5, 0x51, 0x85,
  86755. +0xD6, 0x52, 0x85, 0xD7, 0x53, 0x85, 0xD9, 0x54, 0xE5, 0x54, 0x54, 0x40, 0xC3, 0x13, 0xFF, 0xE5,
  86756. +0x53, 0x54, 0x20, 0x6F, 0x70, 0x02, 0x41, 0x46, 0xE5, 0x54, 0x30, 0xE5, 0x02, 0x41, 0x46, 0xE5,
  86757. +0x52, 0x54, 0x1F, 0xF5, 0x08, 0xE5, 0x4D, 0x54, 0x3F, 0xF5, 0x09, 0xE5, 0x51, 0x54, 0x1F, 0xFF,
  86758. +0xE5, 0x08, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0,
  86759. +0x12, 0x42, 0x81, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82,
  86760. +0xE4, 0x34, 0x85, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x09, 0xD3, 0x94, 0x04,
  86761. +0x40, 0x03, 0x75, 0x09, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12, 0x43, 0x5F,
  86762. +0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE5, 0x53, 0x54,
  86763. +0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12, 0x43,
  86764. +0x5F, 0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x54,
  86765. +0x20, 0xE6, 0x24, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82,
  86766. +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x4F, 0x30, 0xE7, 0x36,
  86767. +0xAF, 0x08, 0x12, 0x5C, 0xC3, 0x80, 0x2F, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0,
  86768. +0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5,
  86769. +0x4F, 0x30, 0xE7, 0x12, 0xE5, 0x4F, 0x54, 0x7F, 0xFD, 0xE5, 0x53, 0x54, 0x1F, 0xF5, 0x0D, 0xAB,
  86770. +0x09, 0xAF, 0x08, 0x12, 0x5C, 0x66, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3A, 0x90,
  86771. +0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0,
  86772. +0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x21, 0x90, 0x8B, 0x3D, 0x12, 0x4B, 0x5C, 0x90, 0x01,
  86773. +0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x80, 0x09,
  86774. +0x12, 0x4B, 0x34, 0xBF, 0x01, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2C, 0x30, 0xE1, 0x21, 0x90, 0x01,
  86775. +0x34, 0x74, 0x02, 0xF0, 0x85, 0xD1, 0x56, 0x85, 0xD2, 0x57, 0x85, 0xD3, 0x58, 0x85, 0xD4, 0x59,
  86776. +0x85, 0xD5, 0x5A, 0x85, 0xD6, 0x5B, 0x85, 0xD7, 0x5C, 0x85, 0xD9, 0x5D, 0x12, 0x5F, 0xA4, 0xE5,
  86777. +0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90,
  86778. +0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x55, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF,
  86779. +0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8,
  86780. +0x00, 0x75, 0xE8, 0x00, 0x12, 0x51, 0x9D, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x52,
  86781. +0x0E, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x2D, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0x90, 0x8B,
  86782. +0x32, 0xE0, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05, 0x90, 0x8B, 0x34, 0xE4,
  86783. +0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05,
  86784. +0x90, 0x8B, 0x2E, 0xE4, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x61, 0xE6, 0x90, 0x8B, 0x08, 0x74,
  86785. +0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x8B, 0x06, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05,
  86786. +0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30,
  86787. +0xE0, 0x2F, 0x90, 0x8B, 0x37, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54,
  86788. +0x3F, 0x30, 0xE0, 0x1D, 0x90, 0x8B, 0x34, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0x90, 0x8B, 0x33, 0xE0,
  86789. +0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x7F, 0x04, 0x12, 0x4E,
  86790. +0x89, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x55, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x4E,
  86791. +0x90, 0x8B, 0x2E, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x3E,
  86792. +0xB1, 0x5F, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60,
  86793. +0x2D, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF,
  86794. +0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  86795. +0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0xB1, 0x82, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x43,
  86796. +0xE7, 0x90, 0x8B, 0x08, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x2F, 0x90, 0x01, 0x36, 0x74, 0x02,
  86797. +0xF0, 0x43, 0x55, 0x40, 0x11, 0x84, 0x90, 0x8B, 0x37, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0x05, 0x22,
  86798. +0xE4, 0xF0, 0x90, 0x8B, 0x37, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12,
  86799. +0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x16, 0x90,
  86800. +0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x64, 0x06,
  86801. +0x60, 0x03, 0x12, 0x46, 0xB3, 0xE5, 0x2E, 0x30, 0xE3, 0x38, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0,
  86802. +0xE5, 0x21, 0x64, 0x01, 0x70, 0x2C, 0xE5, 0x24, 0x60, 0x28, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90,
  86803. +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90, 0x8B,
  86804. +0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74,
  86805. +0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x21, 0xB4,
  86806. +0x01, 0x20, 0xE5, 0x24, 0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02,
  86807. +0xF0, 0x90, 0x8B, 0x1B, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x03, 0x12,
  86808. +0x4A, 0xFC, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x21, 0xB4,
  86809. +0x01, 0x14, 0xE5, 0x24, 0x60, 0x10, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x4A,
  86810. +0x97, 0x80, 0x03, 0x12, 0x49, 0x49, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40,
  86811. +0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x10, 0xE5, 0x24, 0x60, 0x0C, 0x53, 0x25, 0xFE, 0xE5, 0x25, 0x54,
  86812. +0x07, 0x70, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2F, 0x30, 0xE1, 0x28, 0x90, 0x01, 0x37, 0x74, 0x02,
  86813. +0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x18, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x08,
  86814. +0x12, 0x48, 0xFE, 0x12, 0x7D, 0xC1, 0x80, 0x0B, 0x90, 0x8B, 0x31, 0x74, 0x01, 0xF0, 0x80, 0x03,
  86815. +0x12, 0x48, 0xFE, 0x74, 0xF2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07,
  86816. +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0,
  86817. +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x05,
  86818. +0x58, 0xE0, 0xFF, 0x90, 0x8B, 0x38, 0xE0, 0x2F, 0x24, 0xFE, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB,
  86819. +0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x22, 0x90,
  86820. +0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06,
  86821. +0x60, 0x04, 0x7F, 0x06, 0xB1, 0x82, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x03, 0x12, 0x78,
  86822. +0x35, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0x6F, 0x70,
  86823. +0x02, 0xE1, 0x4E, 0xEF, 0x12, 0x43, 0x94, 0x65, 0xB0, 0x00, 0x65, 0xEA, 0x01, 0x66, 0x30, 0x02,
  86824. +0x66, 0x6A, 0x03, 0x66, 0xA2, 0x04, 0x66, 0xDB, 0x05, 0x67, 0x16, 0x06, 0x00, 0x00, 0x67, 0x4E,
  86825. +0xEE, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1, 0x81, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0xB4,
  86826. +0x05, 0x04, 0xF1, 0x5D, 0xE1, 0x4E, 0xEF, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0x80, 0x16,
  86827. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  86828. +0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xA4, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04,
  86829. +0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D,
  86830. +0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4,
  86831. +0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0xE1, 0x4E, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53,
  86832. +0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xE1, 0x4E, 0xF1, 0x67, 0xE1, 0x4E,
  86833. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  86834. +0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0x80, 0x16,
  86835. +0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0x80, 0x08, 0xEE, 0xB4,
  86836. +0x03, 0x04, 0x7F, 0x01, 0xF1, 0x53, 0xF1, 0xD0, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04,
  86837. +0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D,
  86838. +0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4,
  86839. +0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xB9,
  86840. +0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x13,
  86841. +0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02,
  86842. +0x02, 0xF1, 0x67, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0xA4, 0x80, 0x09, 0x90, 0x8B,
  86843. +0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0xF1, 0xAF, 0x80, 0x73, 0x90, 0x8B, 0x2D, 0xE0, 0xFE,
  86844. +0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1,
  86845. +0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0x90, 0x8B, 0x2D, 0xE0,
  86846. +0xB4, 0x01, 0x04, 0xF1, 0xA4, 0x80, 0x0B, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x04, 0x7F, 0x01,
  86847. +0xF1, 0x81, 0xF1, 0xC3, 0x80, 0x38, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1,
  86848. +0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0x90, 0x8B, 0x2D, 0xE0,
  86849. +0x70, 0x04, 0xF1, 0x9A, 0x80, 0x16, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xF1,
  86850. +0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xDD, 0xD0, 0xD0,
  86851. +0x92, 0xAF, 0x22, 0x12, 0x4A, 0xB2, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22,
  86852. +0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0x04,
  86853. +0xF0, 0x22, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0,
  86854. +0x22, 0x90, 0x8B, 0x56, 0xEF, 0xF0, 0x12, 0x7D, 0x42, 0x90, 0x8B, 0x56, 0xE0, 0x60, 0x05, 0x90,
  86855. +0x05, 0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x12, 0x4A, 0xCC, 0x90, 0x8B, 0x2D,
  86856. +0x74, 0x01, 0xF0, 0x22, 0x7F, 0x01, 0x12, 0x4A, 0x7C, 0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x12,
  86857. +0x7C, 0x4A, 0x90, 0x8B, 0x2D, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x4A, 0x32, 0x90, 0x8B, 0x2D, 0x74,
  86858. +0x03, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x05, 0xF0, 0x22,
  86859. +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22,
  86860. +0x74, 0x6F, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x06, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  86861. +0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10,
  86862. +0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29,
  86863. +0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3,
  86864. +0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31,
  86865. +0x10, 0xE4, 0xF5, 0x32, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5,
  86866. +0x32, 0xF0, 0x22, 0x22, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xE0, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00,
  86867. +0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x09,
  86868. +0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22,
  86869. +0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74,
  86870. +0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0xA0, 0xF0,
  86871. +0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06,
  86872. +0xC0, 0x07, 0x7D, 0x91, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x68, 0xFF, 0xA3, 0xF0, 0x53, 0x91,
  86873. +0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52,
  86874. +0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00,
  86875. +0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5,
  86876. +0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90,
  86877. +0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0,
  86878. +0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06,
  86879. +0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08,
  86880. +0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0,
  86881. +0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30,
  86882. +0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4,
  86883. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5,
  86884. +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4,
  86885. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xAD, 0x07, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4,
  86886. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x8A, 0xDE, 0xF0, 0xE0, 0xF9, 0x54, 0x1F, 0xA3,
  86887. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0xFF, 0x90, 0x8A, 0xE1,
  86888. +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFB, 0xA3,
  86889. +0xE0, 0x90, 0x8A, 0xE2, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82,
  86890. +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE4, 0xCB, 0xF0, 0xA3, 0xEB,
  86891. +0xF0, 0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5,
  86892. +0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4,
  86893. +0x34, 0x86, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0xB9,
  86894. +0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF,
  86895. +0xF0, 0xEF, 0x04, 0x90, 0x8A, 0xE0, 0xF0, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0,
  86896. +0xFE, 0xD3, 0x9F, 0x40, 0x02, 0x41, 0xF3, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0,
  86897. +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  86898. +0xF9, 0xFF, 0x90, 0x8A, 0xE2, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x8A,
  86899. +0xE0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  86900. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE4, 0xE0, 0x5E, 0xFE, 0xA3,
  86901. +0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x8A, 0xE0, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x8A, 0xE3, 0xE0,
  86902. +0x30, 0xE7, 0x06, 0x90, 0x8A, 0xE0, 0x74, 0x17, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFF, 0x64, 0x13,
  86903. +0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x8A, 0xE2, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x8A, 0xE0,
  86904. +0x74, 0x18, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0x80,
  86905. +0x42, 0x90, 0x8A, 0xE0, 0xE0, 0x04, 0xF0, 0x41, 0x17, 0x90, 0x8A, 0xE1, 0xE0, 0xFC, 0x90, 0x8A,
  86906. +0xDF, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
  86907. +0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x29, 0x12, 0x43, 0x5F, 0xE0, 0xB4, 0x01, 0x10,
  86908. +0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x8A, 0xDF, 0xE0, 0x44, 0x40, 0x90, 0x8A, 0xDE, 0xF0, 0x80, 0x03,
  86909. +0xAF, 0x01, 0x22, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34,
  86910. +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  86911. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13,
  86912. +0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  86913. +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x8A, 0xDF, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90,
  86914. +0x8A, 0xE1, 0xE0, 0xFF, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0,
  86915. +0x90, 0x8A, 0xDF, 0xEF, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24,
  86916. +0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF,
  86917. +0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF,
  86918. +0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82,
  86919. +0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D,
  86920. +0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xDE, 0xE0, 0x44,
  86921. +0x80, 0xFD, 0x12, 0x5C, 0x4E, 0x90, 0x8A, 0xDE, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x8A,
  86922. +0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40, 0x03, 0x02, 0x72, 0x54, 0x75,
  86923. +0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A, 0x12, 0x43, 0x5F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x72,
  86924. +0x4B, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83,
  86925. +0xE0, 0xFC, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEC, 0x94, 0x00, 0x50, 0x03, 0x02, 0x72, 0x4B, 0xEF,
  86926. +0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x12, 0x01, 0xF5, 0x13,
  86927. +0x89, 0x14, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5,
  86928. +0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x8A, 0xD4, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0,
  86929. +0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xD6,
  86930. +0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34,
  86931. +0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x8A, 0xD0, 0xF0, 0xE0, 0xFD, 0x54, 0x1F, 0xA3, 0xF0,
  86932. +0x75, 0xF0, 0x09, 0xEE, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD9, 0xF0, 0x90,
  86933. +0x8A, 0xCF, 0xE0, 0xFB, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xC3, 0x94,
  86934. +0x05, 0x40, 0x02, 0xC1, 0x9C, 0x90, 0x8A, 0xD9, 0xE0, 0xFE, 0x90, 0x8A, 0xD1, 0xE0, 0x9E, 0x40,
  86935. +0x13, 0x90, 0x8A, 0xD9, 0xE0, 0x90, 0x8A, 0xD1, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0x90, 0x8A, 0xD0,
  86936. +0xF0, 0xEE, 0x4D, 0xF0, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, 0x74, 0x23,
  86937. +0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40,
  86938. +0xDA, 0x80, 0x07, 0x90, 0x8A, 0xD1, 0xE0, 0x90, 0x40, 0xF6, 0x93, 0x90, 0x8A, 0xD8, 0xF0, 0x90,
  86939. +0x8A, 0xD8, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x0F,
  86940. +0xFF, 0xF5, 0x10, 0x89, 0x11, 0x90, 0x8A, 0xD0, 0xE0, 0x90, 0x41, 0xBA, 0x93, 0xFF, 0xD3, 0x90,
  86941. +0x8A, 0xD7, 0xE0, 0x9F, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x8A, 0xCF, 0xE0,
  86942. +0xFF, 0xE4, 0xFD, 0x12, 0x5D, 0x41, 0x02, 0x71, 0xE1, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24,
  86943. +0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xD2, 0xCF,
  86944. +0xF0, 0xA3, 0xEF, 0xF0, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x12, 0x29, 0xD9, 0xFF, 0x7E, 0x00,
  86945. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x97, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90,
  86946. +0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00,
  86947. +0x01, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x02,
  86948. +0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12,
  86949. +0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x7E,
  86950. +0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0,
  86951. +0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10,
  86952. +0xA9, 0x11, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9,
  86953. +0x14, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2,
  86954. +0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x04, 0x12,
  86955. +0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x08, 0x12, 0x42,
  86956. +0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81,
  86957. +0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x05, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0x90,
  86958. +0x8A, 0xD4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x29, 0xF2, 0xD3, 0x90, 0x8A, 0xD3, 0xE0, 0x9F,
  86959. +0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x8A, 0xD2, 0xE0, 0x9E,
  86960. +0xF0, 0x80, 0x07, 0xE4, 0x90, 0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xD2, 0xE0, 0xFC, 0xA3,
  86961. +0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86,
  86962. +0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  86963. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xD3, 0xED, 0x9B,
  86964. +0xEC, 0x9A, 0x40, 0x05, 0x31, 0x78, 0x02, 0x71, 0xAF, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24,
  86965. +0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3,
  86966. +0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x03, 0x02, 0x71, 0xAF, 0x90,
  86967. +0x8A, 0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5D, 0x41, 0x02, 0x71, 0xAF, 0x90, 0x8A, 0xCF, 0xE0,
  86968. +0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x03,
  86969. +0x02, 0x70, 0x7D, 0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3,
  86970. +0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94,
  86971. +0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x8A, 0xD1,
  86972. +0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x8A, 0xD1, 0xE0, 0xC3,
  86973. +0x94, 0x03, 0x40, 0x0D, 0x90, 0x89, 0x43, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x89, 0x43,
  86974. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0,
  86975. +0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
  86976. +0xC3, 0x94, 0x30, 0x50, 0x0B, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0x02, 0x70, 0x28,
  86977. +0x90, 0x89, 0x43, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x70, 0x1D, 0x90, 0x8A, 0xCF, 0xE0, 0x24,
  86978. +0x44, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x8A, 0xCF,
  86979. +0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
  86980. +0x86, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38,
  86981. +0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x23, 0x2E, 0xF5,
  86982. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98,
  86983. +0x50, 0x16, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
  86984. +0xFF, 0x90, 0x8A, 0xD1, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x23, 0xF5, 0x82,
  86985. +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x8A, 0xDD, 0x74,
  86986. +0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x8A, 0xDD, 0x40, 0x05, 0x74, 0x03, 0xF0,
  86987. +0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34,
  86988. +0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE,
  86989. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x44, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0x80, 0x2F, 0x90, 0x8A,
  86990. +0xCF, 0xE0, 0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x44,
  86991. +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x8A,
  86992. +0xDD, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  86993. +0xF0, 0x90, 0x8A, 0xD1, 0xE0, 0xFE, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x84, 0xF5, 0x82, 0xE4,
  86994. +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFE, 0x74, 0x43, 0x2F, 0xF5, 0x82,
  86995. +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2B, 0x12, 0x43,
  86996. +0x5F, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0xF5, 0x82, 0xE4,
  86997. +0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0x21, 0xAC, 0xEC, 0x64, 0x06,
  86998. +0x60, 0x02, 0x21, 0xAF, 0x90, 0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E,
  86999. +0x00, 0x90, 0x8A, 0xD4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xDB, 0xEE,
  87000. +0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  87001. +0x83, 0xE0, 0x90, 0x8A, 0xDD, 0xF0, 0xE4, 0x90, 0x8A, 0xDA, 0xF0, 0x90, 0x8A, 0xDA, 0xE0, 0xFF,
  87002. +0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x75, 0xF0, 0x02, 0xEF, 0xA4,
  87003. +0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93,
  87004. +0xFF, 0x7E, 0x00, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0x90,
  87005. +0x8A, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2,
  87006. +0xE0, 0x9E, 0x50, 0x08, 0x90, 0x8A, 0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8A, 0xDA, 0xE0,
  87007. +0xC3, 0x13, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x8A, 0xDA, 0xE0, 0x70,
  87008. +0x5D, 0x90, 0x8A, 0xDD, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x8A, 0xDA, 0xE0,
  87009. +0xFF, 0x70, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90,
  87010. +0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x8A, 0xDD, 0xE0, 0x64, 0x05, 0x70,
  87011. +0x32, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x05, 0xF0, 0x80, 0x0F,
  87012. +0xEF, 0x90, 0x8A, 0xDD, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3,
  87013. +0x90, 0x8A, 0xD7, 0xE0, 0x94, 0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90,
  87014. +0x8A, 0xDD, 0xF0, 0xD3, 0x90, 0x8A, 0xD7, 0xE0, 0x94, 0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00,
  87015. +0x40, 0x05, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0,
  87016. +0xFF, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x69, 0x38, 0x90,
  87017. +0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xD3, 0x94,
  87018. +0x05, 0x50, 0x0F, 0x74, 0x64, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0x04, 0xF0,
  87019. +0x80, 0x0F, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  87020. +0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0xE4, 0xF5, 0xF0, 0x12, 0x42, 0xFA, 0xAB, 0x12, 0xAA,
  87021. +0x13, 0xA9, 0x14, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x04, 0xE4,
  87022. +0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00,
  87023. +0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xC0,
  87024. +0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63,
  87025. +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3,
  87026. +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04,
  87027. +0xF0, 0x02, 0x6B, 0xC2, 0x22, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xC3,
  87028. +0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0,
  87029. +0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF,
  87030. +0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40, 0x02, 0x81, 0x0E, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00,
  87031. +0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43,
  87032. +0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x5F, 0xE4,
  87033. +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3,
  87034. +0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x74,
  87035. +0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x44, 0x2F, 0xF5,
  87036. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x43, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88,
  87037. +0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83,
  87038. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  87039. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  87040. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  87041. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  87042. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  87043. +0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x44, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0,
  87044. +0x74, 0x24, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x64, 0x2F, 0xF5,
  87045. +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, 0x01, 0x93,
  87046. +0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF,
  87047. +0x13, 0xFF, 0x90, 0x8A, 0xCF, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86,
  87048. +0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x29, 0x12, 0x43,
  87049. +0x5F, 0x74, 0x01, 0xF0, 0x74, 0xC1, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0x74, 0x0C,
  87050. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0x74, 0xFF, 0xF0, 0xA3, 0xF0,
  87051. +0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x23, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0,
  87052. +0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09,
  87053. +0xED, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
  87054. +0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x41, 0x7D, 0x22, 0x12,
  87055. +0x29, 0xD9, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFE, 0x74,
  87056. +0x23, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x20, 0x0A,
  87057. +0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0x90, 0x87, 0x21, 0xF0, 0x22, 0x90, 0x8B, 0x4B, 0xEE, 0xF0,
  87058. +0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x8B, 0x4B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5,
  87059. +0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x8B, 0x4E, 0xE0, 0x94, 0xE8, 0x90, 0x8B, 0x4D,
  87060. +0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90,
  87061. +0x8B, 0x4D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x37, 0x54,
  87062. +0x80, 0xC6, 0x7F, 0x01, 0x22, 0x12, 0x29, 0xD9, 0xF5, 0x21, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
  87063. +0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x2A, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x12,
  87064. +0x42, 0x20, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x0A, 0xF0,
  87065. +0x12, 0x47, 0xFA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x30,
  87066. +0xE0, 0x25, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x10, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90,
  87067. +0x8B, 0x11, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x8B, 0x0F, 0xF0, 0x90, 0x00, 0x03, 0x12,
  87068. +0x42, 0x20, 0x90, 0x8B, 0x16, 0xF0, 0x22, 0x90, 0x8B, 0x10, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x11,
  87069. +0x74, 0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0, 0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0x22,
  87070. +0x12, 0x29, 0xD9, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x8B, 0x15, 0xF0, 0x90, 0x00,
  87071. +0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8B, 0x13, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90,
  87072. +0x8B, 0x15, 0x74, 0x05, 0xF0, 0x90, 0x8B, 0x13, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B,
  87073. +0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x12, 0xF0,
  87074. +0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x90, 0x8B, 0x12, 0xE0, 0x90, 0x01, 0xE7,
  87075. +0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x29, 0xD9, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90,
  87076. +0x8A, 0xF7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xF8, 0xF0,
  87077. +0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xF9, 0xF0, 0x90, 0x00, 0x03,
  87078. +0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xFA, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20,
  87079. +0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8A, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  87080. +0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x12, 0x29, 0xD9, 0xC3,
  87081. +0x13, 0x20, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF,
  87082. +0x54, 0x02, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF,
  87083. +0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x29, 0xD9, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7,
  87084. +0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0,
  87085. +0x12, 0x29, 0xD9, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0,
  87086. +0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xD9, 0x90, 0x8A,
  87087. +0xDD, 0x74, 0x21, 0xF0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF, 0x13, 0x13,
  87088. +0x54, 0x01, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, 0x2A, 0xEF,
  87089. +0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0E,
  87090. +0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x36, 0xE6, 0x80, 0x0B, 0xE4, 0x90,
  87091. +0x8B, 0x34, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x36, 0x75, 0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13, 0x13,
  87092. +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54,
  87093. +0x0F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x14, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xC4,
  87094. +0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8B, 0x32,
  87095. +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x40, 0xF0,
  87096. +0x90, 0x8A, 0xDD, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x70, 0x05, 0x7F, 0x01,
  87097. +0x12, 0x4E, 0x89, 0x90, 0x8B, 0x32, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F,
  87098. +0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F,
  87099. +0x02, 0x12, 0x4E, 0x89, 0x7F, 0x02, 0x02, 0x78, 0x2E, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90,
  87100. +0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x4E, 0x89, 0x7F, 0x03, 0x02, 0x78, 0x2E, 0x90, 0x8A, 0xDA,
  87101. +0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x8B, 0x2C, 0xE0, 0x54, 0xFD,
  87102. +0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x29, 0xD9,
  87103. +0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x8B, 0x2C, 0xF0, 0xEE, 0x54, 0x10,
  87104. +0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x29, 0xD9, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54,
  87105. +0xBF, 0x4D, 0xFF, 0x90, 0x8B, 0x2C, 0xF0, 0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0,
  87106. +0x20, 0xE0, 0x02, 0xE1, 0xE2, 0x90, 0x8A, 0xDD, 0x74, 0x31, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x13,
  87107. +0x13, 0x54, 0x3F, 0x20, 0xE0, 0x0B, 0xE4, 0x90, 0x8B, 0x2E, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x36,
  87108. +0x75, 0x90, 0x8B, 0x2C, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x8A,
  87109. +0xDD, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0,
  87110. +0x44, 0x04, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0x54, 0x06, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03,
  87111. +0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x37, 0x00, 0x90, 0x8A, 0xDD, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90,
  87112. +0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06,
  87113. +0x60, 0x2C, 0x7F, 0x06, 0x12, 0x65, 0x82, 0x80, 0x25, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x06, 0x1B,
  87114. +0x7F, 0x01, 0x12, 0x65, 0x82, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x09, 0x7D, 0x01, 0xAF,
  87115. +0x23, 0x12, 0x45, 0xA2, 0x80, 0x05, 0x12, 0x4E, 0x56, 0x80, 0x03, 0x12, 0x7D, 0xC1, 0x7F, 0x01,
  87116. +0x80, 0x4C, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x7D, 0x03, 0x7F, 0x02,
  87117. +0x12, 0x36, 0x92, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x06, 0x02, 0x80, 0x1B, 0x90, 0x8B, 0x2D, 0xE0,
  87118. +0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF, 0x80, 0x14,
  87119. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4,
  87120. +0x02, 0x05, 0x7F, 0x01, 0x12, 0x65, 0x82, 0x11, 0x35, 0x12, 0x4A, 0xFC, 0x7F, 0x03, 0x11, 0x42,
  87121. +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8B, 0x31, 0xE0, 0xB4, 0x01, 0x05, 0xE4, 0xF0, 0x12, 0x48,
  87122. +0xFE, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x32,
  87123. +0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  87124. +0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, 0xED, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x2C, 0xE0, 0x54,
  87125. +0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  87126. +0x22, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x38, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  87127. +0x90, 0x8A, 0xFD, 0xE0, 0x90, 0x8A, 0xE8, 0xF0, 0x90, 0x8A, 0xFE, 0xE0, 0xFF, 0xA3, 0xE0, 0x90,
  87128. +0x8A, 0xE9, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A, 0xE4, 0xE0,
  87129. +0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8B, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xEB, 0x2F, 0xF5,
  87130. +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0xE0, 0xB4,
  87131. +0x04, 0xDA, 0x90, 0x8A, 0xE8, 0xE0, 0x12, 0x43, 0x94, 0x78, 0xF8, 0x00, 0x7A, 0x6B, 0x01, 0x79,
  87132. +0x01, 0x02, 0x79, 0x01, 0x03, 0x79, 0x01, 0x04, 0x7A, 0x6B, 0x05, 0x7A, 0x35, 0x80, 0x7A, 0x4E,
  87133. +0x81, 0x7A, 0x6B, 0x82, 0x00, 0x00, 0x7A, 0x67, 0x90, 0x8A, 0xEE, 0xE0, 0xFF, 0x51, 0x72, 0x41,
  87134. +0x6B, 0x90, 0x8A, 0xE8, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0x8A, 0xE5, 0x74, 0x01, 0xF0, 0x80,
  87135. +0x0F, 0xEF, 0x90, 0x8A, 0xE5, 0xB4, 0x03, 0x05, 0x74, 0x02, 0xF0, 0x80, 0x03, 0x74, 0x04, 0xF0,
  87136. +0xC3, 0x90, 0x8A, 0xE9, 0xE0, 0x94, 0x08, 0x50, 0x78, 0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A,
  87137. +0xE5, 0xE0, 0xFF, 0x90, 0x8A, 0xE4, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xE9,
  87138. +0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xEE, 0x94, 0x01, 0x90, 0x8A, 0xE4, 0xE0, 0x50, 0x1F, 0xFE,
  87139. +0x2F, 0xFF, 0xEE, 0xFD, 0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D,
  87140. +0xF5, 0x82, 0x74, 0x8A, 0x3C, 0xF5, 0x83, 0xE0, 0xFD, 0x12, 0x51, 0x88, 0x80, 0x2B, 0xFF, 0xFD,
  87141. +0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D, 0xF5, 0x82, 0x74, 0x8A,
  87142. +0x3C, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0x8A, 0xEA, 0xE0, 0x2D, 0xFD, 0x90, 0x8A, 0xE9,
  87143. +0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0x80,
  87144. +0x8D, 0xC3, 0x90, 0x8A, 0xE9, 0xE0, 0x94, 0x10, 0x40, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xE8, 0xE0,
  87145. +0x64, 0x04, 0x60, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xEC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78,
  87146. +0x10, 0x12, 0x2A, 0x6C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xEB, 0xE0,
  87147. +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x2A, 0x6C, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
  87148. +0xD0, 0x00, 0x12, 0x43, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xED,
  87149. +0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x2A, 0x6C, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
  87150. +0x01, 0xD0, 0x00, 0x12, 0x43, 0x46, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0xA3, 0xE0,
  87151. +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x43, 0x46, 0xA3, 0x12, 0x2A, 0x7F, 0x90, 0x8A, 0xEF, 0x12,
  87152. +0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x90, 0x8A, 0xE9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
  87153. +0x12, 0x2F, 0xD9, 0x80, 0x36, 0x90, 0x8A, 0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0x24, 0x00, 0xFF, 0xE4,
  87154. +0x3E, 0xFE, 0x90, 0x8A, 0xE6, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x54, 0x80, 0x1D, 0x90, 0x8A,
  87155. +0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x8A, 0xE6, 0xF0, 0xA3,
  87156. +0xEF, 0xF0, 0x12, 0x36, 0xCB, 0x80, 0x04, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92,
  87157. +0xAF, 0x22, 0x8F, 0x0F, 0xE4, 0x90, 0x8A, 0xF3, 0xF0, 0xE5, 0x0F, 0x14, 0xFE, 0x90, 0x8A, 0xF3,
  87158. +0xE0, 0xFF, 0xC3, 0x9E, 0x50, 0x0E, 0xEF, 0x04, 0xFD, 0x12, 0x34, 0xB7, 0x90, 0x8A, 0xF3, 0xE0,
  87159. +0x04, 0xF0, 0x80, 0xE5, 0xE5, 0x0F, 0x14, 0xFF, 0x7D, 0xFF, 0x12, 0x34, 0xB7, 0x90, 0x8A, 0xF3,
  87160. +0xE5, 0x0F, 0xF0, 0x90, 0x8A, 0xF3, 0xE0, 0xC3, 0x94, 0xFF, 0x50, 0x0F, 0xE0, 0xFF, 0x04, 0xFD,
  87161. +0x12, 0x34, 0xB7, 0x90, 0x8A, 0xF3, 0xE0, 0x04, 0xF0, 0x80, 0xE8, 0xAD, 0x0F, 0x7F, 0xFF, 0x02,
  87162. +0x34, 0xB7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0xA3, 0x74,
  87163. +0x04, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x8A, 0xE2, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90,
  87164. +0x8A, 0xE1, 0xF0, 0x12, 0x29, 0xD9, 0xFF, 0x90, 0x8A, 0xE1, 0xE0, 0x2F, 0x90, 0x8A, 0xE0, 0xF0,
  87165. +0x30, 0xE0, 0x0B, 0x90, 0x8A, 0xDB, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x80, 0x07, 0xE4, 0x90,
  87166. +0x8A, 0xDB, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90,
  87167. +0x8A, 0xDD, 0xE0, 0x24, 0x20, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFC, 0x2D,
  87168. +0xFF, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xFD, 0xF0, 0x74,
  87169. +0x02, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0xEC, 0x2D, 0x24, 0x03, 0xF5,
  87170. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0x90, 0x8A, 0xFE, 0xF0,
  87171. +0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xDA, 0x74, 0x04, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFF, 0xA3,
  87172. +0xE0, 0x2F, 0xFF, 0x90, 0x8A, 0xDA, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
  87173. +0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xFC, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0,
  87174. +0x90, 0x8A, 0xDA, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCF, 0x11, 0x89, 0xEF, 0x70, 0x45, 0x90,
  87175. +0x01, 0xC3, 0xE0, 0x60, 0x2B, 0xC3, 0x90, 0x8A, 0xE3, 0xE0, 0x94, 0xE8, 0x90, 0x8A, 0xE2, 0xE0,
  87176. +0x94, 0x03, 0x40, 0x09, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x79, 0x90, 0x8A, 0xE2,
  87177. +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x37, 0x54, 0x80, 0xCF,
  87178. +0x90, 0x01, 0xC6, 0xE0, 0x90, 0x01, 0xC3, 0x30, 0xE2, 0x05, 0x74, 0xFE, 0xF0, 0x80, 0x57, 0x74,
  87179. +0xFF, 0xF0, 0x80, 0x52, 0x90, 0x8A, 0xDD, 0xE0, 0xB4, 0x78, 0x2E, 0xE4, 0xF0, 0x90, 0x8A, 0xE0,
  87180. +0xE0, 0x04, 0xF0, 0x90, 0x8A, 0xDB, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x80, 0x90, 0x8A, 0xDB,
  87181. +0x70, 0x05, 0xF0, 0xA3, 0xF0, 0x80, 0x06, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0x8A, 0xE0,
  87182. +0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x24, 0x08, 0xF0,
  87183. +0x90, 0x8A, 0xDE, 0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x42, 0x81, 0x90, 0x8A, 0xDE, 0xE0, 0x70, 0x02,
  87184. +0xA3, 0xE0, 0x60, 0x02, 0x61, 0x16, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x29, 0xD9, 0x90, 0x8B,
  87185. +0x05, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x06, 0xF0, 0x22, 0xE4, 0xF5, 0x61,
  87186. +0x22, 0x91, 0x4A, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0,
  87187. +0x7F, 0x78, 0x7E, 0x08, 0x12, 0x27, 0xDE, 0x90, 0x8B, 0x1C, 0x12, 0x2A, 0x7F, 0x7F, 0x04, 0x7E,
  87188. +0x0C, 0x12, 0x27, 0xDE, 0x90, 0x8B, 0x20, 0x12, 0x2A, 0x7F, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x27,
  87189. +0xDE, 0x90, 0x8B, 0x24, 0x12, 0x2A, 0x7F, 0x90, 0x8B, 0x09, 0xE0, 0x90, 0x8B, 0x1C, 0xB4, 0x01,
  87190. +0x0D, 0x12, 0x43, 0x53, 0xEF, 0x54, 0xC7, 0xFF, 0xED, 0x54, 0xC7, 0xFD, 0x80, 0x07, 0x12, 0x43,
  87191. +0x53, 0xEF, 0x54, 0xC7, 0xFF, 0xEC, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x78, 0x7E, 0x08,
  87192. +0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x20, 0x12, 0x43, 0x53, 0xEF, 0x54, 0x0F, 0xFF, 0xEC, 0x90, 0x80,
  87193. +0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x04, 0x7E, 0x0C, 0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x24, 0x12, 0x43,
  87194. +0x53, 0xEF, 0x44, 0x02, 0xFF, 0xEC, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x00, 0x7E, 0x08,
  87195. +0x12, 0x2F, 0xD9, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x27, 0xDE, 0x90, 0x8B, 0x28, 0x12, 0x2A, 0x7F,
  87196. +0x90, 0x80, 0x85, 0x12, 0x2A, 0x8B, 0x00, 0x1B, 0x25, 0xA0, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2F,
  87197. +0xD9, 0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x12, 0x34,
  87198. +0x81, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x11, 0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x00,
  87199. +0x00, 0x00, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x34, 0x81, 0x90, 0x00, 0x11, 0xE0, 0x54, 0xF6, 0xF0,
  87200. +0x02, 0x52, 0x0E, 0x91, 0x50, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74,
  87201. +0xFF, 0xF0, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0xB1, 0x42, 0x90, 0x8B, 0x33, 0x74, 0x04,
  87202. +0xF0, 0x22, 0x90, 0x00, 0x11, 0xE0, 0x44, 0x09, 0xF0, 0x12, 0x52, 0x0E, 0x90, 0x8B, 0x1C, 0x12,
  87203. +0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x78, 0x7E, 0x08, 0x12, 0x2F, 0xD9, 0x90,
  87204. +0x8B, 0x20, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x04, 0x7E, 0x0C, 0x12,
  87205. +0x2F, 0xD9, 0x90, 0x8B, 0x24, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x00,
  87206. +0x7E, 0x08, 0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x28, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A,
  87207. +0x7F, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2F, 0xD9, 0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x03,
  87208. +0x2D, 0x95, 0xE4, 0xFD, 0xFF, 0x12, 0x34, 0x81, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x11, 0x90,
  87209. +0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x03, 0x2D, 0x95, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x34, 0x81,
  87210. +0x22, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x3C, 0xE5, 0x22, 0x54, 0x0F, 0x14, 0x60, 0x2E,
  87211. +0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, 0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x8B, 0x2D, 0xF0,
  87212. +0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0,
  87213. +0x22, 0x90, 0x8B, 0x2D, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01,
  87214. +0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x18,
  87215. +0x90, 0x8B, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0C, 0xAF, 0x06, 0x7D, 0x01,
  87216. +0x12, 0x45, 0xA2, 0xB1, 0xC1, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60,
  87217. +0x3C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x1B, 0xE0,
  87218. +0x60, 0x07, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0x80, 0x24, 0x90, 0x8B, 0x0C, 0xE0, 0x04, 0xF0, 0x53,
  87219. +0x25, 0xEF, 0x90, 0x8B, 0x10, 0xE0, 0xFF, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5,
  87220. +0x21, 0xB4, 0x01, 0x09, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B,
  87221. +0xE0, 0x60, 0x10, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90,
  87222. +0x8B, 0x18, 0xF0, 0x90, 0x01, 0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01,
  87223. +0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x17, 0xF0, 0x22, 0xE4, 0x90, 0x8B, 0x4F, 0xF0, 0xA3,
  87224. +0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3,
  87225. +0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x8B, 0x50, 0xE0, 0x94, 0xE8, 0x90, 0x8B, 0x4F,
  87226. +0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x37, 0x54, 0x90,
  87227. +0x8B, 0x4F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x80, 0xC6, 0x00, 0x92, 0x00};
  87228. +
  87229. +// =================== v88 UMC A Cut P2PPS with CCX report C2H 2012-12-05 =====================
  87230. +u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength] = {
  87231. +0xC1, 0x88, 0x02, 0x05, 0x58, 0x00, 0x02, 0x00, 0x12, 0x05, 0x17, 0x11, 0xDE, 0x3E, 0x01, 0x00,
  87232. +0x94, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87233. +0x02, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87234. +0x00, 0x00, 0x00, 0x02, 0x60, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87235. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87236. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87237. +0x00, 0x00, 0x00, 0x02, 0x68, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4B, 0x87, 0x00, 0x00,
  87238. +0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02,
  87239. +0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09,
  87240. +0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08,
  87241. +0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18,
  87242. +0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21,
  87243. +0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20,
  87244. +0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10,
  87245. +0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20,
  87246. +0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04,
  87247. +0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05,
  87248. +0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E,
  87249. +0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E,
  87250. +0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A,
  87251. +0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04,
  87252. +0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60,
  87253. +0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40,
  87254. +0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8,
  87255. +0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C,
  87256. +0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28,
  87257. +0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64,
  87258. +0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02,
  87259. +0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E,
  87260. +0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
  87261. +0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06,
  87262. +0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00,
  87263. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87264. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87265. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87266. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87267. +0xBB, 0x01, 0x0C, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x22, 0x50,
  87268. +0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE6, 0x22, 0xBB, 0xFE, 0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0x22,
  87269. +0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE4, 0x93, 0x22, 0xBB, 0x01, 0x06,
  87270. +0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, 0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8,
  87271. +0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22,
  87272. +0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, 0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2,
  87273. +0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70,
  87274. +0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5,
  87275. +0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3,
  87276. +0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01,
  87277. +0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0,
  87278. +0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22,
  87279. +0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A,
  87280. +0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A,
  87281. +0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, 0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB,
  87282. +0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, 0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29,
  87283. +0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09,
  87284. +0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, 0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8,
  87285. +0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC,
  87286. +0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xA4,
  87287. +0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA,
  87288. +0xA3, 0xE0, 0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82,
  87289. +0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0,
  87290. +0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93,
  87291. +0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74,
  87292. +0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4,
  87293. +0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5,
  87294. +0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60,
  87295. +0xE9, 0xA3, 0xA3, 0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x8A, 0xC5, 0xF0, 0xE5, 0x24, 0x70, 0x03,
  87296. +0x02, 0x44, 0x9D, 0xE5, 0x21, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0x9D, 0xE5, 0x24, 0x14, 0x60,
  87297. +0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, 0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x8B, 0x0B,
  87298. +0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x0A,
  87299. +0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B, 0xF0, 0x80, 0x00, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0,
  87300. +0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x8A, 0xC5,
  87301. +0xF0, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x70, 0x04, 0x90, 0x8A, 0xC5, 0xF0, 0x90, 0x8A, 0xC5,
  87302. +0xE0, 0x60, 0x4A, 0x43, 0x25, 0x10, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0C, 0xE0, 0x75,
  87303. +0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x8B, 0x15, 0xE0, 0x2F, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  87304. +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x22, 0x54,
  87305. +0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x90, 0x8B, 0x2C,
  87306. +0xE0, 0x30, 0xE0, 0x09, 0x12, 0x7D, 0xC1, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0xF5,
  87307. +0x25, 0xF5, 0x24, 0x75, 0x23, 0x0C, 0x75, 0x22, 0x0C, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x8B, 0x18,
  87308. +0xF0, 0x90, 0x8B, 0x17, 0xF0, 0x90, 0x8B, 0x19, 0x04, 0xF0, 0x90, 0x8B, 0x0B, 0xF0, 0xE4, 0x90,
  87309. +0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0D, 0xF0, 0x90, 0x8B, 0x15, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x8B,
  87310. +0x0C, 0xF0, 0x90, 0x8B, 0x13, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x10, 0xF0, 0xA3, 0x74,
  87311. +0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0, 0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0xE4, 0x90,
  87312. +0x8B, 0x0E, 0xF0, 0x90, 0x8B, 0x0A, 0xF0, 0x90, 0x8B, 0x08, 0xF0, 0x90, 0x8B, 0x12, 0xF0, 0x22,
  87313. +0x7F, 0x00, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0x8E, 0x64, 0x8F, 0x65, 0xAD, 0x65, 0xAC,
  87314. +0x64, 0xAF, 0x63, 0x12, 0x4A, 0x5B, 0xAF, 0x65, 0xAE, 0x64, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F,
  87315. +0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01,
  87316. +0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC,
  87317. +0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74,
  87318. +0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74,
  87319. +0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53,
  87320. +0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74,
  87321. +0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D,
  87322. +0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01,
  87323. +0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0xE5, 0x67, 0x54,
  87324. +0x0F, 0xFF, 0xE5, 0x22, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x67, 0x30, 0xE2, 0x30, 0xE5, 0x22,
  87325. +0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x4A, 0xB2, 0xE5, 0x22, 0x30, 0xE3, 0x10, 0xE5, 0x67, 0x20,
  87326. +0xE3, 0x0B, 0x12, 0x49, 0xD5, 0xEF, 0x60, 0x53, 0x12, 0x4A, 0xCC, 0x80, 0x4E, 0xE5, 0x22, 0x20,
  87327. +0xE3, 0x49, 0xE5, 0x67, 0x30, 0xE3, 0x44, 0xAF, 0x68, 0x12, 0x4A, 0x7C, 0x80, 0x3D, 0xE5, 0x22,
  87328. +0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x67, 0x20, 0xE3, 0x09, 0x12, 0x49, 0xD5, 0xEF, 0x60,
  87329. +0x2A, 0x12, 0x4A, 0xCC, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x67, 0x20, 0xE2,
  87330. +0x09, 0x12, 0x49, 0x93, 0xEF, 0x60, 0x14, 0x12, 0x4A, 0x32, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF,
  87331. +0x02, 0x09, 0x12, 0x45, 0x00, 0xEF, 0x60, 0x03, 0x12, 0x4B, 0x10, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
  87332. +0x02, 0x46, 0x6E, 0x02, 0x50, 0xC6, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6,
  87333. +0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C,
  87334. +0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01,
  87335. +0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B,
  87336. +0x23, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F,
  87337. +0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8,
  87338. +0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA,
  87339. +0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE,
  87340. +0xE7, 0x80, 0xBE, 0xE5, 0x21, 0x64, 0x01, 0x70, 0x67, 0xE5, 0x24, 0x60, 0x63, 0xE5, 0x24, 0x64,
  87341. +0x02, 0x60, 0x06, 0xE5, 0x24, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8B, 0x0B,
  87342. +0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8B, 0x19, 0xF0, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x07, 0x90,
  87343. +0x8B, 0x19, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x8B, 0x0B, 0xE0, 0xFF, 0x90, 0x8B, 0x0B, 0xEF, 0xF0,
  87344. +0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x0C, 0xF0, 0x90, 0x05, 0x58,
  87345. +0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, 0x25,
  87346. +0xFD, 0x53, 0x25, 0xEF, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x47, 0x8E,
  87347. +0x22, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x31, 0x2C, 0x7D, 0x02, 0x7F,
  87348. +0x03, 0x12, 0x31, 0x2C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12,
  87349. +0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x7D, 0xC1, 0x90, 0x06, 0x04, 0xE0,
  87350. +0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B,
  87351. +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x31, 0x9D, 0x7D, 0x02, 0x7F, 0x03, 0x12,
  87352. +0x31, 0x9D, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0,
  87353. +0x12, 0x4B, 0x4F, 0xE5, 0x21, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x8B, 0x0D, 0xF0, 0x22, 0xE4, 0x90,
  87354. +0x8A, 0xC5, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x8A, 0xC5, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x09,
  87355. +0x53, 0x25, 0xFE, 0x53, 0x25, 0xFD, 0x12, 0x4A, 0xFC, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE6, 0x15,
  87356. +0x43, 0x25, 0x01, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x4A, 0x97, 0x80, 0x08,
  87357. +0x12, 0x49, 0x49, 0x80, 0x03, 0x53, 0x25, 0xFE, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE7, 0x27, 0x43,
  87358. +0x25, 0x02, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4,
  87359. +0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90,
  87360. +0x8B, 0x1B, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x25, 0xFD, 0x22, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x8B,
  87361. +0x12, 0x4B, 0x43, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x12, 0x24, 0x62, 0xF5, 0x24, 0x14, 0x60,
  87362. +0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90,
  87363. +0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD, 0xE4, 0xFF, 0x12, 0x4A,
  87364. +0x07, 0x80, 0x29, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD,
  87365. +0x7F, 0x01, 0x12, 0x4A, 0x07, 0x1F, 0x80, 0x14, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00,
  87366. +0x02, 0x12, 0x42, 0x20, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0x07, 0xE4, 0xFF, 0x12, 0x47, 0x21, 0x22,
  87367. +0xE4, 0x90, 0x8A, 0xCB, 0xF0, 0xE5, 0x24, 0x60, 0x49, 0x90, 0x8B, 0x1B, 0xE0, 0x60, 0x0D, 0xE4,
  87368. +0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x38, 0x80, 0x33, 0x90, 0x8B, 0x0C, 0xE0,
  87369. +0x04, 0xF0, 0x53, 0x25, 0xEF, 0x90, 0x8A, 0xCB, 0xE0, 0xFF, 0x90, 0x8B, 0x10, 0xE0, 0x2F, 0xFF,
  87370. +0xE4, 0x33, 0xFE, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98,
  87371. +0x40, 0x0D, 0xE5, 0x21, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12,
  87372. +0x4A, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x63, 0x90, 0x04, 0x1D, 0xE0,
  87373. +0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x66, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x9A, 0xBF, 0x01,
  87374. +0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD, 0x12, 0x45, 0x09, 0x90, 0x05,
  87375. +0x22, 0xE5, 0x66, 0xF0, 0x80, 0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD,
  87376. +0x12, 0x45, 0x09, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x24,
  87377. +0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x41, 0x90, 0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x12, 0x45, 0x9E,
  87378. +0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  87379. +0x7F, 0x58, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92,
  87380. +0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x22, 0xE5, 0x22, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50,
  87381. +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01,
  87382. +0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E,
  87383. +0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05,
  87384. +0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x17, 0x14, 0xF0, 0xE5, 0x22, 0x54, 0x0F,
  87385. +0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12,
  87386. +0x7D, 0xC1, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x37, 0xE5, 0x25, 0x54, 0x03, 0x70,
  87387. +0x31, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x50, 0x28, 0xE5, 0x25, 0x20, 0xE2, 0x23, 0xE5,
  87388. +0x25, 0x20, 0xE4, 0x1E, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x18, 0x90, 0x8B, 0x12, 0xE0, 0x70, 0x12,
  87389. +0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F,
  87390. +0x01, 0x22, 0x7F, 0x00, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x27, 0x90, 0x8B, 0x18,
  87391. +0xE0, 0x70, 0x21, 0x90, 0x8B, 0x17, 0xE0, 0x70, 0x1B, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x04,
  87392. +0x50, 0x12, 0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08,
  87393. +0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x22, 0x90,
  87394. +0x8B, 0x19, 0x74, 0x01, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8B, 0x16, 0xE0, 0x90, 0x8B,
  87395. +0x19, 0xF0, 0x80, 0x05, 0x90, 0x8B, 0x19, 0xED, 0xF0, 0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B,
  87396. +0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E,
  87397. +0x9A, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x31,
  87398. +0x9D, 0x12, 0x7C, 0x50, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x02, 0x22, 0xEF, 0x60, 0x0F, 0x74, 0x21,
  87399. +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x21, 0x2D,
  87400. +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0,
  87401. +0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x48, 0xB3,
  87402. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x0C, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x8A, 0xF8,
  87403. +0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5F, 0xFD, 0x8E, 0x69, 0x8F, 0x6A, 0x90, 0x04, 0x1F, 0x74, 0x20,
  87404. +0xF0, 0x22, 0x90, 0x8B, 0x52, 0xEF, 0xF0, 0x12, 0x7D, 0x42, 0x90, 0x8B, 0x52, 0xE0, 0x60, 0x05,
  87405. +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x04, 0x22, 0x90, 0x06, 0x04, 0xE0,
  87406. +0x44, 0x40, 0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0x7F, 0x01, 0x12, 0x48, 0xB3, 0x53, 0x22, 0xF0,
  87407. +0x43, 0x22, 0x04, 0x22, 0xE5, 0x23, 0x30, 0xE6, 0x12, 0xE5, 0x23, 0x54, 0x0F, 0xFF, 0x90, 0x01,
  87408. +0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, 0x53, 0x23, 0xBF, 0x22, 0x90, 0x8B, 0x2C, 0xE0,
  87409. +0x30, 0xE0, 0x05, 0xAF, 0x23, 0x02, 0x7E, 0x06, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x22,
  87410. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x01, 0x12, 0x4B, 0x5A, 0x12, 0x4B, 0x5B, 0x53, 0x22, 0xF0, 0x43,
  87411. +0x22, 0x02, 0x22, 0x41, 0x8A, 0xF6, 0x00, 0x41, 0x8B, 0x05, 0x00, 0x41, 0x8B, 0x51, 0x00, 0x41,
  87412. +0x8B, 0x53, 0x00, 0x00, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x7F, 0x64, 0x7F, 0x7F, 0x01, 0x60, 0x02,
  87413. +0x7F, 0x00, 0x22, 0xE4, 0x90, 0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0C, 0xF0, 0xF5, 0x25, 0x22, 0x90,
  87414. +0x8B, 0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x22, 0x22, 0xF0, 0x90, 0x8B, 0x0F,
  87415. +0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01,
  87416. +0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x3D, 0xE0, 0xFB, 0xA3, 0xE0, 0xF5, 0x44, 0xE4, 0xF5, 0x45, 0x12,
  87417. +0x30, 0x62, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0,
  87418. +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05,
  87419. +0xC0, 0x06, 0xC0, 0x07, 0x75, 0x0E, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x87, 0xF0, 0x74, 0x4B, 0xA3,
  87420. +0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31,
  87421. +0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34,
  87422. +0x30, 0xE0, 0x51, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x1F,
  87423. +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x34, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0,
  87424. +0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90,
  87425. +0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x1D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, 0x8B,
  87426. +0x2E, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF,
  87427. +0x70, 0x02, 0xD1, 0x56, 0xE5, 0x34, 0x30, 0xE1, 0x08, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x11,
  87428. +0x60, 0xE5, 0x34, 0x30, 0xE2, 0x28, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0,
  87429. +0x30, 0xE0, 0x14, 0x90, 0x8B, 0x3D, 0xE4, 0x71, 0x5C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90,
  87430. +0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x18, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34,
  87431. +0x30, 0xE3, 0x38, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24,
  87432. +0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  87433. +0x7F, 0x5C, 0x7E, 0x01, 0x71, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74,
  87434. +0x02, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x17, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34, 0x30, 0xE4, 0x09,
  87435. +0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x12, 0x51, 0xC9, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01,
  87436. +0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x10, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90,
  87437. +0x00, 0x83, 0xE0, 0xF5, 0x23, 0x51, 0xE4, 0x51, 0xFC, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01,
  87438. +0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90,
  87439. +0x8B, 0x05, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05,
  87440. +0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x75, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90,
  87441. +0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x36, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64,
  87442. +0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0xD1, 0x89, 0x90, 0x8B,
  87443. +0x2C, 0xE0, 0x30, 0xE0, 0x49, 0x90, 0x8B, 0x30, 0xE4, 0xF0, 0xFF, 0xB1, 0xE0, 0xEF, 0x60, 0x3E,
  87444. +0x12, 0x65, 0x5F, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60, 0x32, 0xEF, 0xB4, 0x04, 0x02,
  87445. +0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x8B, 0x2D,
  87446. +0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x05, 0x7F,
  87447. +0x01, 0x12, 0x65, 0x82, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x12, 0x7D, 0xC1, 0xE5, 0x36,
  87448. +0x30, 0xE1, 0x47, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x19,
  87449. +0x90, 0x8B, 0x36, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01,
  87450. +0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x1A,
  87451. +0x90, 0x8B, 0x30, 0x74, 0x01, 0xF0, 0x12, 0x7E, 0x2B, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60,
  87452. +0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF, 0x70, 0x02, 0xD1, 0x56, 0x74, 0x87, 0x04, 0x90, 0x01, 0xC4,
  87453. +0xF0, 0x74, 0x4B, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0,
  87454. +0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32,
  87455. +0xEF, 0x64, 0x01, 0x70, 0x3D, 0x90, 0x8B, 0x35, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B,
  87456. +0x08, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x34, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22,
  87457. +0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54,
  87458. +0x07, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x36, 0xE0, 0x7F, 0x01, 0x60, 0x36, 0x7F,
  87459. +0x00, 0x22, 0x90, 0x8B, 0x2F, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x08, 0xE0, 0x60,
  87460. +0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2E, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2C,
  87461. +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x30, 0xE0, 0x7F,
  87462. +0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x2D, 0xE0,
  87463. +0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x1A, 0x7F, 0x02,
  87464. +0x80, 0x13, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, 0x8B, 0x2D,
  87465. +0xE0, 0x70, 0x05, 0x7F, 0x04, 0x12, 0x65, 0x82, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  87466. +0x90, 0x8B, 0x33, 0xE0, 0x90, 0x8B, 0x55, 0xF0, 0x6F, 0x70, 0x02, 0xE1, 0x55, 0xEF, 0x14, 0x60,
  87467. +0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xE1, 0x30, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x55, 0x90,
  87468. +0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xC2, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x02,
  87469. +0x04, 0xF1, 0xAF, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0xC6, 0xE1, 0x55,
  87470. +0x90, 0x8B, 0x55, 0xE0, 0x64, 0x01, 0x70, 0x7D, 0xF1, 0xB1, 0x80, 0x79, 0x90, 0x8B, 0x55, 0xE0,
  87471. +0xFF, 0xB4, 0x03, 0x04, 0xF1, 0xCA, 0x80, 0x6D, 0xEF, 0xB4, 0x02, 0x04, 0xF1, 0xA1, 0x80, 0x65,
  87472. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0xD5, 0x80, 0x59, 0xEF, 0x70, 0x56, 0xF1,
  87473. +0x8E, 0x80, 0x52, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x7C, 0x41, 0x80, 0x46, 0x90,
  87474. +0x8B, 0x55, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0x72, 0x80, 0x3B, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04,
  87475. +0x05, 0x12, 0x7D, 0x23, 0x80, 0x2F, 0x90, 0x8B, 0x55, 0xE0, 0x70, 0x29, 0xF1, 0x70, 0x80, 0x25,
  87476. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xF1, 0x5A, 0x80, 0x19, 0xEF, 0xB4, 0x02, 0x04,
  87477. +0xF1, 0x6B, 0x80, 0x11, 0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0x5A, 0x80, 0x05,
  87478. +0xEF, 0x70, 0x02, 0xF1, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0,
  87479. +0x90, 0x8B, 0x33, 0x74, 0x03, 0xF0, 0x22, 0xF1, 0x8E, 0x80, 0xEF, 0x12, 0x7D, 0x42, 0x80, 0xEA,
  87480. +0xF1, 0x8E, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x9A, 0xEF, 0x70, 0x06, 0x90, 0x01,
  87481. +0xC8, 0x74, 0xFD, 0xF0, 0x12, 0x7C, 0x50, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01,
  87482. +0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x31, 0xB7, 0x90, 0x8B, 0x33, 0x74, 0x01, 0xF0,
  87483. +0x22, 0x12, 0x7D, 0x42, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22, 0xF1,
  87484. +0xA1, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x31, 0x49, 0x90, 0x05, 0x27, 0xE4, 0xF0, 0x90, 0x8B, 0x33,
  87485. +0xF0, 0x22, 0xF1, 0xCA, 0x80, 0xEB, 0xF1, 0xD5, 0x80, 0xE7, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90,
  87486. +0x8B, 0x33, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22,
  87487. +0xF1, 0x8E, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0x90,
  87488. +0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12,
  87489. +0x43, 0xBA, 0x50, 0x1A, 0x00, 0x40, 0x50, 0x42, 0x00, 0x80, 0x50, 0x6D, 0x01, 0x00, 0x50, 0x81,
  87490. +0x02, 0x00, 0x50, 0x99, 0x04, 0x00, 0x00, 0x00, 0x50, 0xB6, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE,
  87491. +0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06,
  87492. +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
  87493. +0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF,
  87494. +0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78,
  87495. +0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04,
  87496. +0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80,
  87497. +0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF,
  87498. +0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE,
  87499. +0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D,
  87500. +0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x58,
  87501. +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0xCC, 0xF0, 0xA3, 0xF0, 0x75, 0x8E, 0x02,
  87502. +0x91, 0x0E, 0x12, 0x68, 0x44, 0x90, 0x8B, 0x07, 0xEF, 0xF0, 0x12, 0x68, 0x51, 0x90, 0x8B, 0x09,
  87503. +0xEF, 0xF0, 0x12, 0x68, 0x5D, 0x90, 0x8A, 0xF4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x55,
  87504. +0xF5, 0x21, 0x12, 0x72, 0x55, 0x12, 0x44, 0x9E, 0x12, 0x2E, 0x01, 0x7F, 0x03, 0x12, 0x78, 0x42,
  87505. +0x12, 0x7C, 0x3D, 0x12, 0x68, 0x0A, 0x12, 0x68, 0x75, 0x12, 0x68, 0x8A, 0x12, 0x68, 0x28, 0x12,
  87506. +0x68, 0x43, 0x90, 0x8A, 0xCE, 0xE5, 0xD9, 0xF0, 0x31, 0x5F, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0,
  87507. +0x44, 0x40, 0xF0, 0x51, 0x0E, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x11, 0xBB, 0x90,
  87508. +0x8A, 0xCC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xC6, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x50, 0xA3, 0xF0,
  87509. +0xE5, 0x55, 0x30, 0xE4, 0x09, 0xC2, 0xAF, 0x53, 0x55, 0xEF, 0xD2, 0xAF, 0xB1, 0x59, 0xE5, 0x55,
  87510. +0x30, 0xE6, 0xDC, 0xC2, 0xAF, 0x53, 0x55, 0xBF, 0xD2, 0xAF, 0x12, 0x6B, 0xBD, 0x80, 0xD0, 0x90,
  87511. +0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3,
  87512. +0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x31, 0x88, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x88, 0x7D, 0xFF,
  87513. +0x7F, 0x56, 0x31, 0x88, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F,
  87514. +0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x51, 0x0E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30,
  87515. +0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  87516. +0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x31, 0x88, 0xE4, 0xFD, 0x7F, 0x51, 0x31, 0x88, 0xE4, 0xFD, 0x7F,
  87517. +0x52, 0x31, 0x88, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0xE5, 0x5E, 0x64, 0x01, 0x70, 0x3B, 0x71,
  87518. +0x4E, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x71, 0x42, 0x90, 0x00, 0x46, 0xE0, 0x44, 0x04, 0xFD, 0x7F,
  87519. +0x46, 0x31, 0x88, 0x90, 0x00, 0x44, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x44, 0x31, 0x88, 0x90, 0x00,
  87520. +0x46, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x46, 0x31, 0x88, 0x7F, 0x02, 0x71, 0x6A, 0x8F, 0x62, 0x90,
  87521. +0x01, 0xC9, 0xE5, 0x62, 0xF0, 0xB4, 0x01, 0x02, 0x51, 0xE2, 0x22, 0xE0, 0x5F, 0xF0, 0xD3, 0x10,
  87522. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
  87523. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xE0, 0xED, 0xF0, 0x90, 0x8A, 0xDF, 0xEF, 0xF0, 0xD3,
  87524. +0x94, 0x07, 0x50, 0x4E, 0xA3, 0xE0, 0x70, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8,
  87525. +0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x5F, 0xF0,
  87526. +0x80, 0x17, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33,
  87527. +0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x4F, 0xF0, 0x51, 0x0E, 0x90, 0x8A, 0xDF, 0xE0, 0xFF,
  87528. +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46,
  87529. +0x80, 0x59, 0x90, 0x8A, 0xDF, 0xE0, 0x24, 0xF8, 0xF0, 0xA3, 0xE0, 0x70, 0x1D, 0x90, 0x8A, 0xDF,
  87530. +0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xC4, 0x54, 0xF0,
  87531. +0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x80, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74,
  87532. +0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x00,
  87533. +0x43, 0xE0, 0x4F, 0xF0, 0x51, 0x0E, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08,
  87534. +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0x51, 0x0B, 0xD0, 0xD0, 0x92,
  87535. +0xAF, 0x22, 0x90, 0x00, 0x49, 0xE0, 0x90, 0x8B, 0x54, 0xF0, 0xE0, 0x54, 0x0F, 0xF0, 0x44, 0xF0,
  87536. +0xFD, 0x7F, 0x49, 0x31, 0x88, 0x90, 0x8B, 0x54, 0xE0, 0x44, 0xB0, 0xFD, 0x7F, 0x49, 0x21, 0x88,
  87537. +0x90, 0x8A, 0xDD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0x5E, 0x01, 0x8E, 0x5F, 0xF5, 0x60, 0xE4,
  87538. +0xFD, 0x7F, 0x0B, 0x51, 0x1E, 0xE4, 0xFD, 0x7F, 0x02, 0x51, 0x1E, 0x71, 0x4E, 0xE4, 0xFF, 0x71,
  87539. +0x42, 0xE4, 0xF5, 0x62, 0x90, 0x01, 0xC9, 0xE5, 0x62, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFC, 0xA3,
  87540. +0xE0, 0xFD, 0xEC, 0xFB, 0x8D, 0x44, 0xE4, 0xF5, 0x45, 0x7D, 0x01, 0x7F, 0x60, 0x7E, 0x01, 0x02,
  87541. +0x30, 0x62, 0x90, 0x01, 0xCA, 0xE5, 0x61, 0xF0, 0xEF, 0x60, 0x02, 0x51, 0xE2, 0x22, 0x7F, 0x0B,
  87542. +0x71, 0x6A, 0xEF, 0x65, 0x61, 0x60, 0x10, 0xE5, 0x61, 0xB4, 0x01, 0x05, 0xE4, 0xF5, 0x61, 0x80,
  87543. +0x03, 0x75, 0x61, 0x01, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  87544. +0xD0, 0x90, 0x8B, 0x57, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x43, 0xE0, 0xFF, 0x74, 0x01, 0xA8,
  87545. +0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0x51, 0x0B, 0x90,
  87546. +0x8B, 0x57, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
  87547. +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05,
  87548. +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, 0x8B,
  87549. +0x57, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33,
  87550. +0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x51, 0x0E, 0x90, 0x8B, 0x57, 0xE0,
  87551. +0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  87552. +0xF9, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06,
  87553. +0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90,
  87554. +0x8B, 0x04, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x21, 0x88, 0xD3, 0x10,
  87555. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDA, 0x12, 0x43,
  87556. +0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFA, 0xE5, 0xF0, 0x24, 0x00, 0xFF, 0xE4, 0x3A, 0xFE,
  87557. +0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEE, 0x8F, 0xF0, 0x12, 0x43, 0x19, 0x12,
  87558. +0x24, 0x62, 0xFF, 0x60, 0x2C, 0xB5, 0x5E, 0x16, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00,
  87559. +0x01, 0x12, 0x42, 0xC2, 0x65, 0x60, 0x70, 0x04, 0xE5, 0x5F, 0x65, 0xF0, 0x60, 0x22, 0x90, 0x8A,
  87560. +0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFF, 0xAE, 0xF0, 0x71, 0x00, 0x80,
  87561. +0x0F, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x24, 0x62, 0x65, 0x5E, 0x60, 0x02, 0x91, 0x95,
  87562. +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x5E, 0x7F, 0x60, 0x7E, 0x01, 0x8F, 0x82, 0x8E, 0x83,
  87563. +0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x8B, 0xEF, 0x12, 0x43, 0x94,
  87564. +0x54, 0xE7, 0x01, 0x54, 0xDE, 0x02, 0x55, 0x0B, 0x03, 0x55, 0x14, 0x05, 0x55, 0x1D, 0x06, 0x55,
  87565. +0x58, 0x07, 0x55, 0x25, 0x08, 0x55, 0x2E, 0x09, 0x55, 0x36, 0x20, 0x55, 0x3F, 0x2C, 0x54, 0xF0,
  87566. +0x2D, 0x54, 0xF9, 0x2E, 0x55, 0x02, 0x3B, 0x55, 0x48, 0x4B, 0x00, 0x00, 0x55, 0x51, 0x90, 0x8A,
  87567. +0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x85, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x8B,
  87568. +0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0xB8, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02,
  87569. +0x75, 0x00, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x75, 0x39, 0x90, 0x8A, 0xD7, 0x12, 0x43,
  87570. +0x6B, 0x02, 0x75, 0x52, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74, 0x0F, 0x90, 0x8A, 0xD7,
  87571. +0x12, 0x43, 0x6B, 0xC1, 0xA6, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x75, 0x9A, 0x90, 0x8A,
  87572. +0xD7, 0x12, 0x43, 0x6B, 0x81, 0x1E, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x78, 0x81, 0x90,
  87573. +0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x7A, 0xC2, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x7C,
  87574. +0x2B, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  87575. +0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFD, 0x70,
  87576. +0x02, 0xC1, 0xA1, 0x90, 0x8B, 0x51, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  87577. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x9A, 0x90,
  87578. +0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD0,
  87579. +0xF0, 0x75, 0x1D, 0x01, 0x75, 0x1E, 0x8A, 0x75, 0x1F, 0xD0, 0x75, 0x20, 0x01, 0x7B, 0x01, 0x7A,
  87580. +0x8A, 0x79, 0xD1, 0x12, 0x5E, 0xE4, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54,
  87581. +0x01, 0x90, 0x8B, 0x51, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43,
  87582. +0x5F, 0xE0, 0x90, 0x8A, 0xD2, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89,
  87583. +0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD3, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90,
  87584. +0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD4, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0,
  87585. +0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD5, 0xF0, 0x90, 0x8B, 0x51, 0xE0,
  87586. +0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD6, 0xF0, 0x80, 0x33,
  87587. +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD2, 0xF0, 0x90,
  87588. +0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD3,
  87589. +0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x5F, 0xE0, 0x90,
  87590. +0x8A, 0xD4, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x8A, 0x79, 0xD2, 0x91, 0xA6, 0x90,
  87591. +0x8A, 0xCF, 0xE0, 0xFF, 0x90, 0x8B, 0x51, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
  87592. +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0xFF, 0x74,
  87593. +0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x8B,
  87594. +0x51, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0xA1, 0x6A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02,
  87595. +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20, 0xFF, 0x54, 0x1F, 0xFE,
  87596. +0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x8A, 0xDA, 0xEF, 0xF0, 0xA3,
  87597. +0xED, 0xF0, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x03, 0x12,
  87598. +0x42, 0x20, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x42,
  87599. +0x20, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x8A, 0xE0, 0xF0, 0x90, 0x8A, 0xDA, 0xE0,
  87600. +0xFF, 0x75, 0xF0, 0x09, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x8A,
  87601. +0xE1, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x23, 0xF9, 0x74, 0x87,
  87602. +0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90,
  87603. +0x00, 0x03, 0x12, 0x42, 0x20, 0x54, 0x0F, 0xFF, 0x90, 0x8A, 0xE3, 0x12, 0x43, 0x6B, 0xEF, 0x12,
  87604. +0x42, 0x4D, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x90,
  87605. +0x8A, 0xE3, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x90, 0x8A, 0xDC, 0x12,
  87606. +0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8A, 0xE1, 0xE0, 0xFC, 0xA3, 0xE0,
  87607. +0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x24, 0x62, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0,
  87608. +0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x24, 0xC1, 0xF5, 0x82, 0xE4, 0x34,
  87609. +0x86, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xDB, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87,
  87610. +0x29, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A, 0x12, 0x43, 0x5F,
  87611. +0x74, 0x01, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2B, 0x12,
  87612. +0x43, 0x5F, 0xEE, 0xF0, 0x8F, 0x0F, 0xEF, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89,
  87613. +0xAF, 0x82, 0xF5, 0x10, 0x8F, 0x11, 0xE5, 0x0F, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x81, 0xF9, 0x74,
  87614. +0x86, 0x35, 0xF0, 0x75, 0x12, 0x01, 0xF5, 0x13, 0x89, 0x14, 0x75, 0xF0, 0x09, 0xE5, 0x0F, 0x90,
  87615. +0x87, 0x25, 0x12, 0x43, 0x5F, 0xAF, 0x82, 0x85, 0x83, 0x15, 0x8F, 0x16, 0xE5, 0x0F, 0x75, 0xF0,
  87616. +0x09, 0xA4, 0x24, 0x23, 0xF9, 0x74, 0x87, 0x35, 0xF0, 0x75, 0x17, 0x01, 0xF5, 0x18, 0x89, 0x19,
  87617. +0x74, 0xC1, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0x94, 0x58,
  87618. +0x34, 0x00, 0x58, 0x49, 0x01, 0x58, 0x5E, 0x02, 0x58, 0x73, 0x03, 0x58, 0x9C, 0x04, 0x58, 0xB1,
  87619. +0x05, 0x58, 0xC6, 0x06, 0x58, 0xEC, 0x0C, 0x59, 0x19, 0x0D, 0x59, 0x46, 0x0E, 0x59, 0x73, 0x0F,
  87620. +0x00, 0x00, 0x59, 0xA7, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  87621. +0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5,
  87622. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x0F,
  87623. +0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74,
  87624. +0x05, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  87625. +0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
  87626. +0x86, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x21, 0xA7, 0xE5, 0x0F, 0x25, 0xE0,
  87627. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80,
  87628. +0x27, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F,
  87629. +0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34,
  87630. +0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5,
  87631. +0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x21, 0xA7, 0x90, 0x04, 0x47, 0xE0,
  87632. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x12, 0xAA,
  87633. +0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x11, 0x82,
  87634. +0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x21, 0x9E, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x12, 0xAA,
  87635. +0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  87636. +0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83,
  87637. +0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  87638. +0x12, 0x42, 0x4D, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01,
  87639. +0x12, 0x42, 0x5F, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04,
  87640. +0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D,
  87641. +0x90, 0x04, 0x52, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F,
  87642. +0x90, 0x04, 0x51, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85,
  87643. +0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0xC0, 0x03, 0xC0,
  87644. +0x02, 0xC0, 0x01, 0x12, 0x24, 0x62, 0xFF, 0xAB, 0x17, 0xAA, 0x18, 0xA9, 0x19, 0x12, 0x24, 0x62,
  87645. +0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x4D, 0xAB, 0x12, 0xE5, 0x14, 0x24, 0x01,
  87646. +0xF9, 0xE4, 0x35, 0x13, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x24, 0x62, 0xFF, 0xAB,
  87647. +0x17, 0xAA, 0x18, 0xA9, 0x19, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x5F, 0xD0, 0x01, 0xD0, 0x02,
  87648. +0xD0, 0x03, 0x12, 0x42, 0x4D, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0,
  87649. +0xFF, 0x85, 0x16, 0x82, 0x85, 0x15, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0,
  87650. +0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x16, 0x82,
  87651. +0x85, 0x15, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0x25,
  87652. +0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60,
  87653. +0x4B, 0x90, 0x8A, 0xE6, 0x74, 0x0B, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50,
  87654. +0x02, 0x41, 0xEC, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
  87655. +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5,
  87656. +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x8A, 0xE6, 0xE0, 0x24, 0x10,
  87657. +0xA3, 0xF0, 0x80, 0x68, 0x90, 0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, 0x0F, 0x25, 0xE0,
  87658. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47,
  87659. +0x90, 0x8A, 0xE6, 0x74, 0x0F, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C,
  87660. +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
  87661. +0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E,
  87662. +0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x8A, 0xE6, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90,
  87663. +0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x8A, 0xE7, 0xF0, 0xE5, 0x0F, 0x25, 0xE0,
  87664. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46,
  87665. +0xE4, 0x90, 0x8A, 0xE6, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x61,
  87666. +0xA5, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  87667. +0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
  87668. +0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x8A, 0xE6, 0xE0, 0x80, 0x63, 0x90, 0x8A,
  87669. +0xE6, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
  87670. +0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x8A, 0xE6, 0xF0, 0x90,
  87671. +0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08,
  87672. +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81,
  87673. +0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08,
  87674. +0x90, 0x8A, 0xE6, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x8A, 0xE6, 0xE0, 0x04, 0xF0, 0x80, 0xBF,
  87675. +0xE4, 0x90, 0x8A, 0xE8, 0xF0, 0x90, 0x8A, 0xE7, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x0F, 0x90,
  87676. +0x87, 0x27, 0x12, 0x43, 0x5F, 0xEF, 0xF0, 0x90, 0x8A, 0xE8, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5,
  87677. +0x0F, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, 0x20, 0x50, 0x32,
  87678. +0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02,
  87679. +0x80, 0x18, 0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E,
  87680. +0x50, 0x08, 0x90, 0x8A, 0xE8, 0xE0, 0xA3, 0xF0, 0x80, 0x08, 0x90, 0x8A, 0xE7, 0xE0, 0x90, 0x8A,
  87681. +0xE9, 0xF0, 0x90, 0x8A, 0xE9, 0xE0, 0xFD, 0xAF, 0x0F, 0x91, 0x4E, 0x90, 0x8A, 0xE9, 0xE0, 0xFF,
  87682. +0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8A, 0xE7,
  87683. +0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3,
  87684. +0x94, 0x0B, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40,
  87685. +0x07, 0x90, 0x87, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x87, 0x22, 0xF0, 0x22, 0xD3, 0x10,
  87686. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED,
  87687. +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xED, 0x54, 0x1F, 0x90, 0x8A, 0xC7, 0xF0, 0x74,
  87688. +0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xC5, 0xF0, 0x90, 0x8A,
  87689. +0xC8, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, 0x37, 0x90, 0x8A, 0xC5, 0xE0,
  87690. +0x25, 0x0D, 0xFF, 0xA3, 0xF0, 0xA3, 0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40,
  87691. +0x10, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x04, 0x80,
  87692. +0x9D, 0x90, 0x8A, 0xC6, 0xE0, 0xFF, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  87693. +0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0,
  87694. +0xFF, 0x90, 0x8A, 0xCA, 0xF0, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
  87695. +0x54, 0x1F, 0x90, 0x8A, 0xC9, 0xF0, 0xD3, 0x9F, 0x40, 0x06, 0xA3, 0xE0, 0x90, 0x8A, 0xC9, 0xF0,
  87696. +0x90, 0x8A, 0xC9, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83,
  87697. +0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
  87698. +0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13,
  87699. +0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
  87700. +0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xC9, 0xE0, 0xFD, 0x91, 0x4E, 0x90, 0x8A, 0xC9, 0xE0, 0xFF,
  87701. +0x22, 0xAC, 0x07, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F,
  87702. +0x90, 0x8A, 0xDE, 0xF0, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x8A, 0xE1, 0xF0, 0x75, 0xF0, 0x09, 0xEC,
  87703. +0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xE3, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90,
  87704. +0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0x90, 0x8A, 0xE4, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xE4,
  87705. +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE5, 0xCB, 0xF0,
  87706. +0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0,
  87707. +0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE7, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C,
  87708. +0x90, 0x8A, 0xE4, 0xE0, 0x90, 0x8A, 0xE1, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0xED, 0x70, 0x02, 0xC1,
  87709. +0x93, 0x90, 0x8A, 0xE2, 0xED, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x8A, 0xE1,
  87710. +0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0x14, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0x70,
  87711. +0x02, 0xC1, 0x93, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xC1, 0x93, 0xE4,
  87712. +0x90, 0x8A, 0xE0, 0xF0, 0xEF, 0x14, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xE3, 0xE0, 0xFD, 0x90,
  87713. +0x8A, 0xDF, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0,
  87714. +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  87715. +0xF9, 0xFF, 0x90, 0x8A, 0xE7, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x8A,
  87716. +0xDF, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  87717. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE5, 0xE0, 0x5E, 0xFE, 0xA3,
  87718. +0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xE0,
  87719. +0xE0, 0x04, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0, 0x6F, 0x60, 0x08, 0x90,
  87720. +0x8A, 0xDF, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0,
  87721. +0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x8A, 0xDF, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x8A, 0xE3, 0xE0, 0x90,
  87722. +0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34,
  87723. +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  87724. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13,
  87725. +0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  87726. +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x8A, 0xDE, 0xE0, 0xFD, 0x91, 0x4E, 0x90, 0x8A,
  87727. +0xDE, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1A, 0x8A, 0x1B, 0x89,
  87728. +0x1C, 0x90, 0x8B, 0x3F, 0x12, 0x43, 0x8B, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0x90, 0x8B, 0x42,
  87729. +0x12, 0x43, 0x8B, 0xAF, 0x20, 0x15, 0x20, 0xEF, 0x60, 0x1E, 0x90, 0x8B, 0x42, 0xE4, 0x75, 0xF0,
  87730. +0x01, 0x12, 0x43, 0x74, 0x12, 0x24, 0x62, 0xFF, 0x90, 0x8B, 0x3F, 0xE4, 0x75, 0xF0, 0x01, 0x12,
  87731. +0x43, 0x74, 0xEF, 0x12, 0x42, 0x4D, 0x80, 0xDB, 0xAB, 0x1A, 0xAA, 0x1B, 0xA9, 0x1C, 0xD0, 0xD0,
  87732. +0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x8B,
  87733. +0x90, 0x8B, 0x53, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x7F, 0xAF,
  87734. +0x7E, 0x01, 0x12, 0x74, 0x3B, 0xEF, 0x60, 0x47, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x6B, 0x8B, 0x1D,
  87735. +0x8A, 0x1E, 0x89, 0x1F, 0x75, 0x20, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xE4, 0x90,
  87736. +0x8B, 0x48, 0x12, 0x43, 0x6B, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x8B, 0x45, 0x12, 0x43,
  87737. +0x6B, 0x12, 0x24, 0x62, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x20, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2,
  87738. +0xD1, 0xE4, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0,
  87739. +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8A, 0xC5, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44,
  87740. +0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x56, 0x90, 0x8B, 0x48, 0x12, 0x43, 0x8B, 0x0B, 0x7A,
  87741. +0x8A, 0x79, 0xC5, 0xE1, 0x33, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74,
  87742. +0xC5, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0,
  87743. +0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30,
  87744. +0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF,
  87745. +0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13,
  87746. +0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x1E, 0xAF, 0x03, 0x74, 0x0F,
  87747. +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x10, 0x2F, 0xF5,
  87748. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5,
  87749. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
  87750. +0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
  87751. +0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5F, 0xC5,
  87752. +0xBF, 0x01, 0x10, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xFD, 0x90, 0x04, 0x1F,
  87753. +0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13,
  87754. +0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x8A, 0xC5, 0x74,
  87755. +0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF,
  87756. +0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0,
  87757. +0x79, 0x40, 0x90, 0x8A, 0xC5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59,
  87758. +0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x8A, 0xF6, 0xF0, 0x22, 0x90, 0x8A, 0xF6, 0xE0, 0x04, 0xF0,
  87759. +0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, 0x11,
  87760. +0x6D, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0,
  87761. +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90,
  87762. +0x01, 0xC4, 0x74, 0xF2, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5,
  87763. +0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55,
  87764. +0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x41, 0x89, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0,
  87765. +0x85, 0xD1, 0x4D, 0x85, 0xD2, 0x4E, 0x85, 0xD3, 0x4F, 0x85, 0xD4, 0x50, 0x85, 0xD5, 0x51, 0x85,
  87766. +0xD6, 0x52, 0x85, 0xD7, 0x53, 0x85, 0xD9, 0x54, 0xE5, 0x54, 0x54, 0x40, 0xC3, 0x13, 0xFF, 0xE5,
  87767. +0x53, 0x54, 0x20, 0x6F, 0x70, 0x02, 0x41, 0x46, 0xE5, 0x54, 0x30, 0xE5, 0x02, 0x41, 0x46, 0xE5,
  87768. +0x52, 0x54, 0x1F, 0xF5, 0x08, 0xE5, 0x4D, 0x54, 0x3F, 0xF5, 0x09, 0xE5, 0x51, 0x54, 0x1F, 0xFF,
  87769. +0xE5, 0x08, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0,
  87770. +0x12, 0x42, 0x81, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82,
  87771. +0xE4, 0x34, 0x85, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x09, 0xD3, 0x94, 0x04,
  87772. +0x40, 0x03, 0x75, 0x09, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12, 0x43, 0x5F,
  87773. +0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE5, 0x53, 0x54,
  87774. +0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12, 0x43,
  87775. +0x5F, 0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x54,
  87776. +0x20, 0xE6, 0x24, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82,
  87777. +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x4F, 0x30, 0xE7, 0x36,
  87778. +0xAF, 0x08, 0x12, 0x5C, 0xC3, 0x80, 0x2F, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0,
  87779. +0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5,
  87780. +0x4F, 0x30, 0xE7, 0x12, 0xE5, 0x4F, 0x54, 0x7F, 0xFD, 0xE5, 0x53, 0x54, 0x1F, 0xF5, 0x0D, 0xAB,
  87781. +0x09, 0xAF, 0x08, 0x12, 0x5C, 0x66, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3A, 0x90,
  87782. +0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0,
  87783. +0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x21, 0x90, 0x8B, 0x3D, 0x12, 0x4B, 0x5C, 0x90, 0x01,
  87784. +0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x80, 0x09,
  87785. +0x12, 0x4B, 0x34, 0xBF, 0x01, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2C, 0x30, 0xE1, 0x21, 0x90, 0x01,
  87786. +0x34, 0x74, 0x02, 0xF0, 0x85, 0xD1, 0x56, 0x85, 0xD2, 0x57, 0x85, 0xD3, 0x58, 0x85, 0xD4, 0x59,
  87787. +0x85, 0xD5, 0x5A, 0x85, 0xD6, 0x5B, 0x85, 0xD7, 0x5C, 0x85, 0xD9, 0x5D, 0x12, 0x5F, 0xA4, 0xE5,
  87788. +0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90,
  87789. +0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x55, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF,
  87790. +0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8,
  87791. +0x00, 0x75, 0xE8, 0x00, 0x12, 0x51, 0x9D, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x52,
  87792. +0x0E, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x2D, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0x90, 0x8B,
  87793. +0x32, 0xE0, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05, 0x90, 0x8B, 0x34, 0xE4,
  87794. +0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05,
  87795. +0x90, 0x8B, 0x2E, 0xE4, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x61, 0xE6, 0x90, 0x8B, 0x08, 0x74,
  87796. +0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x8B, 0x06, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05,
  87797. +0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30,
  87798. +0xE0, 0x2F, 0x90, 0x8B, 0x37, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54,
  87799. +0x3F, 0x30, 0xE0, 0x1D, 0x90, 0x8B, 0x34, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0x90, 0x8B, 0x33, 0xE0,
  87800. +0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x7F, 0x04, 0x12, 0x4E,
  87801. +0x89, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x55, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x4E,
  87802. +0x90, 0x8B, 0x2E, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x3E,
  87803. +0xB1, 0x5F, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60,
  87804. +0x2D, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF,
  87805. +0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  87806. +0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0xB1, 0x82, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x43,
  87807. +0xE7, 0x90, 0x8B, 0x08, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x2F, 0x90, 0x01, 0x36, 0x74, 0x02,
  87808. +0xF0, 0x43, 0x55, 0x40, 0x11, 0x84, 0x90, 0x8B, 0x37, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0x05, 0x22,
  87809. +0xE4, 0xF0, 0x90, 0x8B, 0x37, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12,
  87810. +0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x16, 0x90,
  87811. +0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x64, 0x06,
  87812. +0x60, 0x03, 0x12, 0x46, 0xB3, 0xE5, 0x2E, 0x30, 0xE3, 0x38, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0,
  87813. +0xE5, 0x21, 0x64, 0x01, 0x70, 0x2C, 0xE5, 0x24, 0x60, 0x28, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90,
  87814. +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90, 0x8B,
  87815. +0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74,
  87816. +0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x21, 0xB4,
  87817. +0x01, 0x20, 0xE5, 0x24, 0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02,
  87818. +0xF0, 0x90, 0x8B, 0x1B, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x03, 0x12,
  87819. +0x4A, 0xFC, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x21, 0xB4,
  87820. +0x01, 0x14, 0xE5, 0x24, 0x60, 0x10, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x4A,
  87821. +0x97, 0x80, 0x03, 0x12, 0x49, 0x49, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40,
  87822. +0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x10, 0xE5, 0x24, 0x60, 0x0C, 0x53, 0x25, 0xFE, 0xE5, 0x25, 0x54,
  87823. +0x07, 0x70, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2F, 0x30, 0xE1, 0x28, 0x90, 0x01, 0x37, 0x74, 0x02,
  87824. +0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x18, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x08,
  87825. +0x12, 0x48, 0xFE, 0x12, 0x7D, 0xC1, 0x80, 0x0B, 0x90, 0x8B, 0x31, 0x74, 0x01, 0xF0, 0x80, 0x03,
  87826. +0x12, 0x48, 0xFE, 0x74, 0xF2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07,
  87827. +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0,
  87828. +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x05,
  87829. +0x58, 0xE0, 0xFF, 0x90, 0x8B, 0x38, 0xE0, 0x2F, 0x24, 0xFE, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB,
  87830. +0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x22, 0x90,
  87831. +0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06,
  87832. +0x60, 0x04, 0x7F, 0x06, 0xB1, 0x82, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x03, 0x12, 0x78,
  87833. +0x35, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0x6F, 0x70,
  87834. +0x02, 0xE1, 0x4E, 0xEF, 0x12, 0x43, 0x94, 0x65, 0xB0, 0x00, 0x65, 0xEA, 0x01, 0x66, 0x30, 0x02,
  87835. +0x66, 0x6A, 0x03, 0x66, 0xA2, 0x04, 0x66, 0xDB, 0x05, 0x67, 0x16, 0x06, 0x00, 0x00, 0x67, 0x4E,
  87836. +0xEE, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1, 0x81, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0xB4,
  87837. +0x05, 0x04, 0xF1, 0x5D, 0xE1, 0x4E, 0xEF, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0x80, 0x16,
  87838. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  87839. +0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xA4, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04,
  87840. +0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D,
  87841. +0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4,
  87842. +0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0xE1, 0x4E, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53,
  87843. +0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xE1, 0x4E, 0xF1, 0x67, 0xE1, 0x4E,
  87844. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  87845. +0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0x80, 0x16,
  87846. +0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xF1, 0x72, 0x80, 0x08, 0xEE, 0xB4,
  87847. +0x03, 0x04, 0x7F, 0x01, 0xF1, 0x53, 0xF1, 0xD0, 0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04,
  87848. +0x06, 0x7F, 0x01, 0xF1, 0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D,
  87849. +0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xF1, 0x9A, 0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4,
  87850. +0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xB9,
  87851. +0xE1, 0x4E, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x13,
  87852. +0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1, 0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02,
  87853. +0x02, 0xF1, 0x67, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0xA4, 0x80, 0x09, 0x90, 0x8B,
  87854. +0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0xF1, 0xAF, 0x80, 0x73, 0x90, 0x8B, 0x2D, 0xE0, 0xFE,
  87855. +0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xF1, 0x72, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xF1,
  87856. +0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0x90, 0x8B, 0x2D, 0xE0,
  87857. +0xB4, 0x01, 0x04, 0xF1, 0xA4, 0x80, 0x0B, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x04, 0x7F, 0x01,
  87858. +0xF1, 0x81, 0xF1, 0xC3, 0x80, 0x38, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xF1,
  87859. +0x81, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xF1, 0x5D, 0x90, 0x8B, 0x2D, 0xE0,
  87860. +0x70, 0x04, 0xF1, 0x9A, 0x80, 0x16, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xF1,
  87861. +0x53, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xF1, 0x67, 0xF1, 0xDD, 0xD0, 0xD0,
  87862. +0x92, 0xAF, 0x22, 0x12, 0x4A, 0xB2, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22,
  87863. +0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0x04,
  87864. +0xF0, 0x22, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0,
  87865. +0x22, 0x90, 0x8B, 0x56, 0xEF, 0xF0, 0x12, 0x7D, 0x42, 0x90, 0x8B, 0x56, 0xE0, 0x60, 0x05, 0x90,
  87866. +0x05, 0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x12, 0x4A, 0xCC, 0x90, 0x8B, 0x2D,
  87867. +0x74, 0x01, 0xF0, 0x22, 0x7F, 0x01, 0x12, 0x4A, 0x7C, 0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x12,
  87868. +0x7C, 0x4A, 0x90, 0x8B, 0x2D, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x4A, 0x32, 0x90, 0x8B, 0x2D, 0x74,
  87869. +0x03, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x05, 0xF0, 0x22,
  87870. +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22,
  87871. +0x74, 0x6F, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x06, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  87872. +0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10,
  87873. +0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29,
  87874. +0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3,
  87875. +0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31,
  87876. +0x10, 0xE4, 0xF5, 0x32, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5,
  87877. +0x32, 0xF0, 0x22, 0x22, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xE0, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00,
  87878. +0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x09,
  87879. +0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22,
  87880. +0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74,
  87881. +0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0xA0, 0xF0,
  87882. +0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06,
  87883. +0xC0, 0x07, 0x7D, 0x91, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x68, 0xFF, 0xA3, 0xF0, 0x53, 0x91,
  87884. +0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52,
  87885. +0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00,
  87886. +0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5,
  87887. +0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90,
  87888. +0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0,
  87889. +0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06,
  87890. +0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08,
  87891. +0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0,
  87892. +0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30,
  87893. +0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4,
  87894. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5,
  87895. +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4,
  87896. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xAD, 0x07, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4,
  87897. +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x8A, 0xDE, 0xF0, 0xE0, 0xF9, 0x54, 0x1F, 0xA3,
  87898. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0xFF, 0x90, 0x8A, 0xE1,
  87899. +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFB, 0xA3,
  87900. +0xE0, 0x90, 0x8A, 0xE2, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82,
  87901. +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE4, 0xCB, 0xF0, 0xA3, 0xEB,
  87902. +0xF0, 0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5,
  87903. +0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4,
  87904. +0x34, 0x86, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0xB9,
  87905. +0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF,
  87906. +0xF0, 0xEF, 0x04, 0x90, 0x8A, 0xE0, 0xF0, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0,
  87907. +0xFE, 0xD3, 0x9F, 0x40, 0x02, 0x41, 0xF3, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0,
  87908. +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
  87909. +0xF9, 0xFF, 0x90, 0x8A, 0xE2, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x8A,
  87910. +0xE0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
  87911. +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE4, 0xE0, 0x5E, 0xFE, 0xA3,
  87912. +0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x8A, 0xE0, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x8A, 0xE3, 0xE0,
  87913. +0x30, 0xE7, 0x06, 0x90, 0x8A, 0xE0, 0x74, 0x17, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFF, 0x64, 0x13,
  87914. +0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x8A, 0xE2, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x8A, 0xE0,
  87915. +0x74, 0x18, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0x80,
  87916. +0x42, 0x90, 0x8A, 0xE0, 0xE0, 0x04, 0xF0, 0x41, 0x17, 0x90, 0x8A, 0xE1, 0xE0, 0xFC, 0x90, 0x8A,
  87917. +0xDF, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
  87918. +0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x29, 0x12, 0x43, 0x5F, 0xE0, 0xB4, 0x01, 0x10,
  87919. +0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x8A, 0xDF, 0xE0, 0x44, 0x40, 0x90, 0x8A, 0xDE, 0xF0, 0x80, 0x03,
  87920. +0xAF, 0x01, 0x22, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34,
  87921. +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  87922. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13,
  87923. +0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  87924. +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x8A, 0xDF, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90,
  87925. +0x8A, 0xE1, 0xE0, 0xFF, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0,
  87926. +0x90, 0x8A, 0xDF, 0xEF, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24,
  87927. +0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF,
  87928. +0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF,
  87929. +0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82,
  87930. +0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D,
  87931. +0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xDE, 0xE0, 0x44,
  87932. +0x80, 0xFD, 0x12, 0x5C, 0x4E, 0x90, 0x8A, 0xDE, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x8A,
  87933. +0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40, 0x03, 0x02, 0x72, 0x54, 0x75,
  87934. +0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A, 0x12, 0x43, 0x5F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x72,
  87935. +0x4B, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83,
  87936. +0xE0, 0xFC, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEC, 0x94, 0x00, 0x50, 0x03, 0x02, 0x72, 0x4B, 0xEF,
  87937. +0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x12, 0x01, 0xF5, 0x13,
  87938. +0x89, 0x14, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5,
  87939. +0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x8A, 0xD4, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0,
  87940. +0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xD6,
  87941. +0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34,
  87942. +0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x8A, 0xD0, 0xF0, 0xE0, 0xFD, 0x54, 0x1F, 0xA3, 0xF0,
  87943. +0x75, 0xF0, 0x09, 0xEE, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD9, 0xF0, 0x90,
  87944. +0x8A, 0xCF, 0xE0, 0xFB, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xC3, 0x94,
  87945. +0x05, 0x40, 0x02, 0xC1, 0x9C, 0x90, 0x8A, 0xD9, 0xE0, 0xFE, 0x90, 0x8A, 0xD1, 0xE0, 0x9E, 0x40,
  87946. +0x13, 0x90, 0x8A, 0xD9, 0xE0, 0x90, 0x8A, 0xD1, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0x90, 0x8A, 0xD0,
  87947. +0xF0, 0xEE, 0x4D, 0xF0, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, 0x74, 0x23,
  87948. +0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40,
  87949. +0xDA, 0x80, 0x07, 0x90, 0x8A, 0xD1, 0xE0, 0x90, 0x40, 0xF6, 0x93, 0x90, 0x8A, 0xD8, 0xF0, 0x90,
  87950. +0x8A, 0xD8, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x0F,
  87951. +0xFF, 0xF5, 0x10, 0x89, 0x11, 0x90, 0x8A, 0xD0, 0xE0, 0x90, 0x41, 0xBA, 0x93, 0xFF, 0xD3, 0x90,
  87952. +0x8A, 0xD7, 0xE0, 0x9F, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x8A, 0xCF, 0xE0,
  87953. +0xFF, 0xE4, 0xFD, 0x12, 0x5D, 0x41, 0x02, 0x71, 0xE1, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24,
  87954. +0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xD2, 0xCF,
  87955. +0xF0, 0xA3, 0xEF, 0xF0, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x12, 0x24, 0x62, 0xFF, 0x7E, 0x00,
  87956. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x97, 0xFD, 0xAC, 0xF0, 0x12, 0x24, 0x7B, 0x90,
  87957. +0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00,
  87958. +0x01, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x02,
  87959. +0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x24, 0x7B, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12,
  87960. +0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x7E,
  87961. +0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0,
  87962. +0x12, 0x24, 0x7B, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10,
  87963. +0xA9, 0x11, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9,
  87964. +0x14, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x24, 0x7B, 0x90, 0x8A, 0xD2,
  87965. +0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x04, 0x12,
  87966. +0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x08, 0x12, 0x42,
  87967. +0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x24, 0x7B, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81,
  87968. +0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x05, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0x90,
  87969. +0x8A, 0xD4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x24, 0x7B, 0xD3, 0x90, 0x8A, 0xD3, 0xE0, 0x9F,
  87970. +0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x8A, 0xD2, 0xE0, 0x9E,
  87971. +0xF0, 0x80, 0x07, 0xE4, 0x90, 0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xD2, 0xE0, 0xFC, 0xA3,
  87972. +0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86,
  87973. +0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  87974. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xD3, 0xED, 0x9B,
  87975. +0xEC, 0x9A, 0x40, 0x05, 0x31, 0x78, 0x02, 0x71, 0xAF, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24,
  87976. +0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3,
  87977. +0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x03, 0x02, 0x71, 0xAF, 0x90,
  87978. +0x8A, 0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5D, 0x41, 0x02, 0x71, 0xAF, 0x90, 0x8A, 0xCF, 0xE0,
  87979. +0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x03,
  87980. +0x02, 0x70, 0x7D, 0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3,
  87981. +0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94,
  87982. +0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x8A, 0xD1,
  87983. +0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x8A, 0xD1, 0xE0, 0xC3,
  87984. +0x94, 0x03, 0x40, 0x0D, 0x90, 0x89, 0x43, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x89, 0x43,
  87985. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0,
  87986. +0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
  87987. +0xC3, 0x94, 0x30, 0x50, 0x0B, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0x02, 0x70, 0x28,
  87988. +0x90, 0x89, 0x43, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x70, 0x1D, 0x90, 0x8A, 0xCF, 0xE0, 0x24,
  87989. +0x44, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x8A, 0xCF,
  87990. +0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
  87991. +0x86, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38,
  87992. +0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x23, 0x2E, 0xF5,
  87993. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98,
  87994. +0x50, 0x16, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
  87995. +0xFF, 0x90, 0x8A, 0xD1, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x23, 0xF5, 0x82,
  87996. +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x8A, 0xDD, 0x74,
  87997. +0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x8A, 0xDD, 0x40, 0x05, 0x74, 0x03, 0xF0,
  87998. +0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34,
  87999. +0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE,
  88000. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x44, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0x80, 0x2F, 0x90, 0x8A,
  88001. +0xCF, 0xE0, 0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x44,
  88002. +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x8A,
  88003. +0xDD, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  88004. +0xF0, 0x90, 0x8A, 0xD1, 0xE0, 0xFE, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x84, 0xF5, 0x82, 0xE4,
  88005. +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFE, 0x74, 0x43, 0x2F, 0xF5, 0x82,
  88006. +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2B, 0x12, 0x43,
  88007. +0x5F, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0xF5, 0x82, 0xE4,
  88008. +0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0x21, 0xAC, 0xEC, 0x64, 0x06,
  88009. +0x60, 0x02, 0x21, 0xAF, 0x90, 0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E,
  88010. +0x00, 0x90, 0x8A, 0xD4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x24, 0x7B, 0x90, 0x8A, 0xDB, 0xEE,
  88011. +0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  88012. +0x83, 0xE0, 0x90, 0x8A, 0xDD, 0xF0, 0xE4, 0x90, 0x8A, 0xDA, 0xF0, 0x90, 0x8A, 0xDA, 0xE0, 0xFF,
  88013. +0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x75, 0xF0, 0x02, 0xEF, 0xA4,
  88014. +0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93,
  88015. +0xFF, 0x7E, 0x00, 0x12, 0x24, 0x7B, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0x90,
  88016. +0x8A, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2,
  88017. +0xE0, 0x9E, 0x50, 0x08, 0x90, 0x8A, 0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8A, 0xDA, 0xE0,
  88018. +0xC3, 0x13, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x8A, 0xDA, 0xE0, 0x70,
  88019. +0x5D, 0x90, 0x8A, 0xDD, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x8A, 0xDA, 0xE0,
  88020. +0xFF, 0x70, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90,
  88021. +0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x8A, 0xDD, 0xE0, 0x64, 0x05, 0x70,
  88022. +0x32, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x05, 0xF0, 0x80, 0x0F,
  88023. +0xEF, 0x90, 0x8A, 0xDD, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3,
  88024. +0x90, 0x8A, 0xD7, 0xE0, 0x94, 0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90,
  88025. +0x8A, 0xDD, 0xF0, 0xD3, 0x90, 0x8A, 0xD7, 0xE0, 0x94, 0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00,
  88026. +0x40, 0x05, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0,
  88027. +0xFF, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x69, 0x38, 0x90,
  88028. +0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xD3, 0x94,
  88029. +0x05, 0x50, 0x0F, 0x74, 0x64, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0x04, 0xF0,
  88030. +0x80, 0x0F, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  88031. +0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0xE4, 0xF5, 0xF0, 0x12, 0x42, 0xFA, 0xAB, 0x12, 0xAA,
  88032. +0x13, 0xA9, 0x14, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x04, 0xE4,
  88033. +0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00,
  88034. +0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xC0,
  88035. +0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63,
  88036. +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3,
  88037. +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04,
  88038. +0xF0, 0x02, 0x6B, 0xC2, 0x22, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xC3,
  88039. +0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0,
  88040. +0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF,
  88041. +0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40, 0x02, 0x81, 0x0E, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00,
  88042. +0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43,
  88043. +0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x5F, 0xE4,
  88044. +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3,
  88045. +0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x74,
  88046. +0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x44, 0x2F, 0xF5,
  88047. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x43, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88,
  88048. +0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83,
  88049. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  88050. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  88051. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  88052. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  88053. +0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  88054. +0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x44, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0,
  88055. +0x74, 0x24, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x64, 0x2F, 0xF5,
  88056. +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, 0x01, 0x93,
  88057. +0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF,
  88058. +0x13, 0xFF, 0x90, 0x8A, 0xCF, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86,
  88059. +0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x29, 0x12, 0x43,
  88060. +0x5F, 0x74, 0x01, 0xF0, 0x74, 0xC1, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0x74, 0x0C,
  88061. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0x74, 0xFF, 0xF0, 0xA3, 0xF0,
  88062. +0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x23, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0,
  88063. +0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09,
  88064. +0xED, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
  88065. +0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x41, 0x7D, 0x22, 0x12,
  88066. +0x24, 0x62, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFE, 0x74,
  88067. +0x23, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x20, 0x0A,
  88068. +0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0x90, 0x87, 0x21, 0xF0, 0x22, 0x90, 0x8B, 0x4B, 0xEE, 0xF0,
  88069. +0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x8B, 0x4B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5,
  88070. +0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x8B, 0x4E, 0xE0, 0x94, 0xE8, 0x90, 0x8B, 0x4D,
  88071. +0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90,
  88072. +0x8B, 0x4D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0x15,
  88073. +0x80, 0xC6, 0x7F, 0x01, 0x22, 0x12, 0x24, 0x62, 0xF5, 0x21, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
  88074. +0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x25, 0x14, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x12,
  88075. +0x42, 0x20, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x0A, 0xF0,
  88076. +0x12, 0x47, 0xFA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x30,
  88077. +0xE0, 0x25, 0x12, 0x24, 0x62, 0x90, 0x8B, 0x10, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90,
  88078. +0x8B, 0x11, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x8B, 0x0F, 0xF0, 0x90, 0x00, 0x03, 0x12,
  88079. +0x42, 0x20, 0x90, 0x8B, 0x16, 0xF0, 0x22, 0x90, 0x8B, 0x10, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x11,
  88080. +0x74, 0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0, 0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0x22,
  88081. +0x12, 0x24, 0x62, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x8B, 0x15, 0xF0, 0x90, 0x00,
  88082. +0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8B, 0x13, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90,
  88083. +0x8B, 0x15, 0x74, 0x05, 0xF0, 0x90, 0x8B, 0x13, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B,
  88084. +0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x24, 0x62, 0x90, 0x8B, 0x12, 0xF0,
  88085. +0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x90, 0x8B, 0x12, 0xE0, 0x90, 0x01, 0xE7,
  88086. +0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x24, 0x62, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90,
  88087. +0x8A, 0xF7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xF8, 0xF0,
  88088. +0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xF9, 0xF0, 0x90, 0x00, 0x03,
  88089. +0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xFA, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20,
  88090. +0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8A, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
  88091. +0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x12, 0x24, 0x62, 0xC3,
  88092. +0x13, 0x20, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x24, 0x62, 0xFF,
  88093. +0x54, 0x02, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF,
  88094. +0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x24, 0x62, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7,
  88095. +0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0,
  88096. +0x12, 0x24, 0x62, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0,
  88097. +0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xD9, 0x90, 0x8A,
  88098. +0xDD, 0x74, 0x21, 0xF0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x24, 0x62, 0xFF, 0x13, 0x13,
  88099. +0x54, 0x01, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, 0x2A, 0xEF,
  88100. +0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0E,
  88101. +0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x31, 0x9D, 0x80, 0x0B, 0xE4, 0x90,
  88102. +0x8B, 0x34, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x31, 0x2C, 0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13, 0x13,
  88103. +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54,
  88104. +0x0F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x14, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xC4,
  88105. +0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8B, 0x32,
  88106. +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x40, 0xF0,
  88107. +0x90, 0x8A, 0xDD, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x70, 0x05, 0x7F, 0x01,
  88108. +0x12, 0x4E, 0x89, 0x90, 0x8B, 0x32, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F,
  88109. +0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F,
  88110. +0x02, 0x12, 0x4E, 0x89, 0x7F, 0x02, 0x02, 0x78, 0x2E, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90,
  88111. +0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x4E, 0x89, 0x7F, 0x03, 0x02, 0x78, 0x2E, 0x90, 0x8A, 0xDA,
  88112. +0x12, 0x43, 0x6B, 0x12, 0x24, 0x62, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x8B, 0x2C, 0xE0, 0x54, 0xFD,
  88113. +0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x24, 0x62,
  88114. +0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x8B, 0x2C, 0xF0, 0xEE, 0x54, 0x10,
  88115. +0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x24, 0x62, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54,
  88116. +0xBF, 0x4D, 0xFF, 0x90, 0x8B, 0x2C, 0xF0, 0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0,
  88117. +0x20, 0xE0, 0x02, 0xE1, 0xE2, 0x90, 0x8A, 0xDD, 0x74, 0x31, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x13,
  88118. +0x13, 0x54, 0x3F, 0x20, 0xE0, 0x0B, 0xE4, 0x90, 0x8B, 0x2E, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x31,
  88119. +0x2C, 0x90, 0x8B, 0x2C, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x8A,
  88120. +0xDD, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0,
  88121. +0x44, 0x04, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0x54, 0x06, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03,
  88122. +0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x31, 0xB7, 0x90, 0x8A, 0xDD, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90,
  88123. +0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06,
  88124. +0x60, 0x2C, 0x7F, 0x06, 0x12, 0x65, 0x82, 0x80, 0x25, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x06, 0x1B,
  88125. +0x7F, 0x01, 0x12, 0x65, 0x82, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x09, 0x7D, 0x01, 0xAF,
  88126. +0x23, 0x12, 0x45, 0xA2, 0x80, 0x05, 0x12, 0x4E, 0x56, 0x80, 0x03, 0x12, 0x7D, 0xC1, 0x7F, 0x01,
  88127. +0x80, 0x4C, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x7D, 0x03, 0x7F, 0x02,
  88128. +0x12, 0x31, 0x49, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x06, 0x02, 0x80, 0x1B, 0x90, 0x8B, 0x2D, 0xE0,
  88129. +0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF, 0x80, 0x14,
  88130. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4,
  88131. +0x02, 0x05, 0x7F, 0x01, 0x12, 0x65, 0x82, 0x11, 0x35, 0x12, 0x4A, 0xFC, 0x7F, 0x03, 0x11, 0x42,
  88132. +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8B, 0x31, 0xE0, 0xB4, 0x01, 0x05, 0xE4, 0xF0, 0x12, 0x48,
  88133. +0xFE, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x32,
  88134. +0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  88135. +0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, 0xED, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x2C, 0xE0, 0x54,
  88136. +0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
  88137. +0x22, 0x12, 0x24, 0x62, 0x90, 0x8B, 0x38, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  88138. +0x90, 0x8A, 0xFD, 0xE0, 0x90, 0x8A, 0xE8, 0xF0, 0x90, 0x8A, 0xFE, 0xE0, 0xFF, 0xA3, 0xE0, 0x90,
  88139. +0x8A, 0xE9, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A, 0xE4, 0xE0,
  88140. +0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8B, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xEB, 0x2F, 0xF5,
  88141. +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0xE0, 0xB4,
  88142. +0x04, 0xDA, 0x90, 0x8A, 0xE8, 0xE0, 0x12, 0x43, 0x94, 0x78, 0xF8, 0x00, 0x7A, 0x6B, 0x01, 0x79,
  88143. +0x01, 0x02, 0x79, 0x01, 0x03, 0x79, 0x01, 0x04, 0x7A, 0x6B, 0x05, 0x7A, 0x35, 0x80, 0x7A, 0x4E,
  88144. +0x81, 0x7A, 0x6B, 0x82, 0x00, 0x00, 0x7A, 0x67, 0x90, 0x8A, 0xEE, 0xE0, 0xFF, 0x51, 0x72, 0x41,
  88145. +0x6B, 0x90, 0x8A, 0xE8, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0x8A, 0xE5, 0x74, 0x01, 0xF0, 0x80,
  88146. +0x0F, 0xEF, 0x90, 0x8A, 0xE5, 0xB4, 0x03, 0x05, 0x74, 0x02, 0xF0, 0x80, 0x03, 0x74, 0x04, 0xF0,
  88147. +0xC3, 0x90, 0x8A, 0xE9, 0xE0, 0x94, 0x08, 0x50, 0x78, 0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A,
  88148. +0xE5, 0xE0, 0xFF, 0x90, 0x8A, 0xE4, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xE9,
  88149. +0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xEE, 0x94, 0x01, 0x90, 0x8A, 0xE4, 0xE0, 0x50, 0x1F, 0xFE,
  88150. +0x2F, 0xFF, 0xEE, 0xFD, 0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D,
  88151. +0xF5, 0x82, 0x74, 0x8A, 0x3C, 0xF5, 0x83, 0xE0, 0xFD, 0x12, 0x51, 0x88, 0x80, 0x2B, 0xFF, 0xFD,
  88152. +0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D, 0xF5, 0x82, 0x74, 0x8A,
  88153. +0x3C, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0x8A, 0xEA, 0xE0, 0x2D, 0xFD, 0x90, 0x8A, 0xE9,
  88154. +0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0x80,
  88155. +0x8D, 0xC3, 0x90, 0x8A, 0xE9, 0xE0, 0x94, 0x10, 0x40, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xE8, 0xE0,
  88156. +0x64, 0x04, 0x60, 0x02, 0x41, 0x6B, 0x90, 0x8A, 0xEC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78,
  88157. +0x10, 0x12, 0x24, 0xF5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xEB, 0xE0,
  88158. +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x24, 0xF5, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
  88159. +0xD0, 0x00, 0x12, 0x43, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xED,
  88160. +0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x24, 0xF5, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
  88161. +0x01, 0xD0, 0x00, 0x12, 0x43, 0x46, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0xA3, 0xE0,
  88162. +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x43, 0x46, 0xA3, 0x12, 0x25, 0x08, 0x90, 0x8A, 0xEF, 0x12,
  88163. +0x43, 0x53, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x90, 0x8A, 0xE9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
  88164. +0x12, 0x2B, 0x08, 0x80, 0x36, 0x90, 0x8A, 0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0x24, 0x00, 0xFF, 0xE4,
  88165. +0x3E, 0xFE, 0x90, 0x8A, 0xE6, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x32, 0x15, 0x80, 0x1D, 0x90, 0x8A,
  88166. +0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x8A, 0xE6, 0xF0, 0xA3,
  88167. +0xEF, 0xF0, 0x12, 0x31, 0x82, 0x80, 0x04, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92,
  88168. +0xAF, 0x22, 0x8F, 0x0F, 0xE4, 0x90, 0x8A, 0xF3, 0xF0, 0xE5, 0x0F, 0x14, 0xFE, 0x90, 0x8A, 0xF3,
  88169. +0xE0, 0xFF, 0xC3, 0x9E, 0x50, 0x0E, 0xEF, 0x04, 0xFD, 0x12, 0x2D, 0x4D, 0x90, 0x8A, 0xF3, 0xE0,
  88170. +0x04, 0xF0, 0x80, 0xE5, 0xE5, 0x0F, 0x14, 0xFF, 0x7D, 0xFF, 0x12, 0x2D, 0x4D, 0x90, 0x8A, 0xF3,
  88171. +0xE5, 0x0F, 0xF0, 0x90, 0x8A, 0xF3, 0xE0, 0xC3, 0x94, 0xFF, 0x50, 0x0F, 0xE0, 0xFF, 0x04, 0xFD,
  88172. +0x12, 0x2D, 0x4D, 0x90, 0x8A, 0xF3, 0xE0, 0x04, 0xF0, 0x80, 0xE8, 0xAD, 0x0F, 0x7F, 0xFF, 0x02,
  88173. +0x2D, 0x4D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0xA3, 0x74,
  88174. +0x04, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x8A, 0xE2, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90,
  88175. +0x8A, 0xE1, 0xF0, 0x12, 0x24, 0x62, 0xFF, 0x90, 0x8A, 0xE1, 0xE0, 0x2F, 0x90, 0x8A, 0xE0, 0xF0,
  88176. +0x30, 0xE0, 0x0B, 0x90, 0x8A, 0xDB, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x80, 0x07, 0xE4, 0x90,
  88177. +0x8A, 0xDB, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90,
  88178. +0x8A, 0xDD, 0xE0, 0x24, 0x20, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFC, 0x2D,
  88179. +0xFF, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xFD, 0xF0, 0x74,
  88180. +0x02, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0xEC, 0x2D, 0x24, 0x03, 0xF5,
  88181. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0x90, 0x8A, 0xFE, 0xF0,
  88182. +0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xDA, 0x74, 0x04, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFF, 0xA3,
  88183. +0xE0, 0x2F, 0xFF, 0x90, 0x8A, 0xDA, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
  88184. +0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xFC, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0,
  88185. +0x90, 0x8A, 0xDA, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCF, 0x11, 0x89, 0xEF, 0x70, 0x45, 0x90,
  88186. +0x01, 0xC3, 0xE0, 0x60, 0x2B, 0xC3, 0x90, 0x8A, 0xE3, 0xE0, 0x94, 0xE8, 0x90, 0x8A, 0xE2, 0xE0,
  88187. +0x94, 0x03, 0x40, 0x09, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x79, 0x90, 0x8A, 0xE2,
  88188. +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0x15, 0x80, 0xCF,
  88189. +0x90, 0x01, 0xC6, 0xE0, 0x90, 0x01, 0xC3, 0x30, 0xE2, 0x05, 0x74, 0xFE, 0xF0, 0x80, 0x57, 0x74,
  88190. +0xFF, 0xF0, 0x80, 0x52, 0x90, 0x8A, 0xDD, 0xE0, 0xB4, 0x78, 0x2E, 0xE4, 0xF0, 0x90, 0x8A, 0xE0,
  88191. +0xE0, 0x04, 0xF0, 0x90, 0x8A, 0xDB, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x80, 0x90, 0x8A, 0xDB,
  88192. +0x70, 0x05, 0xF0, 0xA3, 0xF0, 0x80, 0x06, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0x8A, 0xE0,
  88193. +0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x24, 0x08, 0xF0,
  88194. +0x90, 0x8A, 0xDE, 0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x42, 0x81, 0x90, 0x8A, 0xDE, 0xE0, 0x70, 0x02,
  88195. +0xA3, 0xE0, 0x60, 0x02, 0x61, 0x16, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x24, 0x62, 0x90, 0x8B,
  88196. +0x05, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x06, 0xF0, 0x22, 0xE4, 0xF5, 0x61,
  88197. +0x22, 0x91, 0x4A, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0,
  88198. +0x7F, 0x78, 0x7E, 0x08, 0x12, 0x22, 0x65, 0x90, 0x8B, 0x1C, 0x12, 0x25, 0x08, 0x7F, 0x04, 0x7E,
  88199. +0x0C, 0x12, 0x22, 0x65, 0x90, 0x8B, 0x20, 0x12, 0x25, 0x08, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x22,
  88200. +0x65, 0x90, 0x8B, 0x24, 0x12, 0x25, 0x08, 0x90, 0x8B, 0x09, 0xE0, 0x90, 0x8B, 0x1C, 0xB4, 0x01,
  88201. +0x0D, 0x12, 0x43, 0x53, 0xEF, 0x54, 0xC7, 0xFF, 0xED, 0x54, 0xC7, 0xFD, 0x80, 0x07, 0x12, 0x43,
  88202. +0x53, 0xEF, 0x54, 0xC7, 0xFF, 0xEC, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x7F, 0x78, 0x7E, 0x08,
  88203. +0x12, 0x2B, 0x08, 0x90, 0x8B, 0x20, 0x12, 0x43, 0x53, 0xEF, 0x54, 0x0F, 0xFF, 0xEC, 0x90, 0x80,
  88204. +0x96, 0x12, 0x25, 0x08, 0x7F, 0x04, 0x7E, 0x0C, 0x12, 0x2B, 0x08, 0x90, 0x8B, 0x24, 0x12, 0x43,
  88205. +0x53, 0xEF, 0x44, 0x02, 0xFF, 0xEC, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x7F, 0x00, 0x7E, 0x08,
  88206. +0x12, 0x2B, 0x08, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x22, 0x65, 0x90, 0x8B, 0x28, 0x12, 0x25, 0x08,
  88207. +0x90, 0x80, 0x96, 0x12, 0x25, 0x14, 0x00, 0x1B, 0x25, 0xA0, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2B,
  88208. +0x08, 0x90, 0x80, 0x68, 0x12, 0x25, 0x14, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x12, 0x30,
  88209. +0x2C, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x11, 0x90, 0x80, 0x68, 0x12, 0x25, 0x14, 0x00, 0x00,
  88210. +0x00, 0x00, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x30, 0x2C, 0x90, 0x00, 0x11, 0xE0, 0x54, 0xF6, 0xF0,
  88211. +0x02, 0x52, 0x0E, 0x91, 0x50, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74,
  88212. +0xFF, 0xF0, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0xB1, 0x42, 0x90, 0x8B, 0x33, 0x74, 0x04,
  88213. +0xF0, 0x22, 0x90, 0x00, 0x11, 0xE0, 0x44, 0x09, 0xF0, 0x12, 0x52, 0x0E, 0x90, 0x8B, 0x1C, 0x12,
  88214. +0x43, 0x53, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x7F, 0x78, 0x7E, 0x08, 0x12, 0x2B, 0x08, 0x90,
  88215. +0x8B, 0x20, 0x12, 0x43, 0x53, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x7F, 0x04, 0x7E, 0x0C, 0x12,
  88216. +0x2B, 0x08, 0x90, 0x8B, 0x24, 0x12, 0x43, 0x53, 0x90, 0x80, 0x96, 0x12, 0x25, 0x08, 0x7F, 0x00,
  88217. +0x7E, 0x08, 0x12, 0x2B, 0x08, 0x90, 0x8B, 0x28, 0x12, 0x43, 0x53, 0x90, 0x80, 0x96, 0x12, 0x25,
  88218. +0x08, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2B, 0x08, 0x90, 0x80, 0x68, 0x12, 0x25, 0x14, 0x00, 0x03,
  88219. +0x2D, 0x95, 0xE4, 0xFD, 0xFF, 0x12, 0x30, 0x2C, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x11, 0x90,
  88220. +0x80, 0x68, 0x12, 0x25, 0x14, 0x00, 0x03, 0x2D, 0x95, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x30, 0x2C,
  88221. +0x22, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x3C, 0xE5, 0x22, 0x54, 0x0F, 0x14, 0x60, 0x2E,
  88222. +0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, 0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x8B, 0x2D, 0xF0,
  88223. +0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0,
  88224. +0x22, 0x90, 0x8B, 0x2D, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01,
  88225. +0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x18,
  88226. +0x90, 0x8B, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0C, 0xAF, 0x06, 0x7D, 0x01,
  88227. +0x12, 0x45, 0xA2, 0xB1, 0xC1, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60,
  88228. +0x3C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x1B, 0xE0,
  88229. +0x60, 0x07, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0x80, 0x24, 0x90, 0x8B, 0x0C, 0xE0, 0x04, 0xF0, 0x53,
  88230. +0x25, 0xEF, 0x90, 0x8B, 0x10, 0xE0, 0xFF, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5,
  88231. +0x21, 0xB4, 0x01, 0x09, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B,
  88232. +0xE0, 0x60, 0x10, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90,
  88233. +0x8B, 0x18, 0xF0, 0x90, 0x01, 0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01,
  88234. +0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x17, 0xF0, 0x22, 0xE4, 0x90, 0x8B, 0x4F, 0xF0, 0xA3,
  88235. +0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3,
  88236. +0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x8B, 0x50, 0xE0, 0x94, 0xE8, 0x90, 0x8B, 0x4F,
  88237. +0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0x15, 0x90,
  88238. +0x8B, 0x4F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x80, 0xC6, 0x00, 0xFB, 0x98};
  88239. +
  88240. +// =================== v88 UMC B Cut P2PPS with CCX report C2H 2012-12-05 =====================
  88241. +u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] = {
  88242. +0xC2, 0x88, 0x02, 0x05, 0x58, 0x00, 0x02, 0x00, 0x12, 0x05, 0x17, 0x10, 0xC0, 0x3E, 0x01, 0x00,
  88243. +0x94, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88244. +0x02, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88245. +0x00, 0x00, 0x00, 0x02, 0x60, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88246. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88247. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88248. +0x00, 0x00, 0x00, 0x02, 0x67, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4B, 0x87, 0x00, 0x00,
  88249. +0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02,
  88250. +0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09,
  88251. +0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08,
  88252. +0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18,
  88253. +0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21,
  88254. +0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20,
  88255. +0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10,
  88256. +0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20,
  88257. +0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04,
  88258. +0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05,
  88259. +0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E,
  88260. +0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E,
  88261. +0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A,
  88262. +0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04,
  88263. +0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60,
  88264. +0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40,
  88265. +0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8,
  88266. +0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C,
  88267. +0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28,
  88268. +0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64,
  88269. +0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02,
  88270. +0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E,
  88271. +0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
  88272. +0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06,
  88273. +0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00,
  88274. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88275. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88276. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88277. +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88278. +0xBB, 0x01, 0x0C, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x22, 0x50,
  88279. +0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE6, 0x22, 0xBB, 0xFE, 0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0x22,
  88280. +0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE4, 0x93, 0x22, 0xBB, 0x01, 0x06,
  88281. +0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, 0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8,
  88282. +0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22,
  88283. +0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, 0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2,
  88284. +0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70,
  88285. +0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5,
  88286. +0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3,
  88287. +0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01,
  88288. +0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0,
  88289. +0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22,
  88290. +0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A,
  88291. +0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A,
  88292. +0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, 0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB,
  88293. +0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, 0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29,
  88294. +0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09,
  88295. +0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, 0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8,
  88296. +0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC,
  88297. +0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xA4,
  88298. +0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA,
  88299. +0xA3, 0xE0, 0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82,
  88300. +0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0,
  88301. +0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93,
  88302. +0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74,
  88303. +0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4,
  88304. +0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5,
  88305. +0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60,
  88306. +0xE9, 0xA3, 0xA3, 0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x8A, 0xC5, 0xF0, 0xE5, 0x24, 0x70, 0x03,
  88307. +0x02, 0x44, 0x9D, 0xE5, 0x21, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0x9D, 0xE5, 0x24, 0x14, 0x60,
  88308. +0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, 0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x8B, 0x0B,
  88309. +0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x0A,
  88310. +0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B, 0xF0, 0x80, 0x00, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0,
  88311. +0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x8A, 0xC5,
  88312. +0xF0, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x70, 0x04, 0x90, 0x8A, 0xC5, 0xF0, 0x90, 0x8A, 0xC5,
  88313. +0xE0, 0x60, 0x4A, 0x43, 0x25, 0x10, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0C, 0xE0, 0x75,
  88314. +0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x8B, 0x15, 0xE0, 0x2F, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  88315. +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x22, 0x54,
  88316. +0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x90, 0x8B, 0x2C,
  88317. +0xE0, 0x30, 0xE0, 0x09, 0x12, 0x66, 0x20, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0xF5,
  88318. +0x25, 0xF5, 0x24, 0x75, 0x23, 0x0C, 0x75, 0x22, 0x0C, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x8B, 0x18,
  88319. +0xF0, 0x90, 0x8B, 0x17, 0xF0, 0x90, 0x8B, 0x19, 0x04, 0xF0, 0x90, 0x8B, 0x0B, 0xF0, 0xE4, 0x90,
  88320. +0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0D, 0xF0, 0x90, 0x8B, 0x15, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x8B,
  88321. +0x0C, 0xF0, 0x90, 0x8B, 0x13, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x10, 0xF0, 0xA3, 0x74,
  88322. +0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0, 0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0xE4, 0x90,
  88323. +0x8B, 0x0E, 0xF0, 0x90, 0x8B, 0x0A, 0xF0, 0x90, 0x8B, 0x08, 0xF0, 0x90, 0x8B, 0x12, 0xF0, 0x22,
  88324. +0x7F, 0x00, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0x8E, 0x64, 0x8F, 0x65, 0xAD, 0x65, 0xAC,
  88325. +0x64, 0xAF, 0x63, 0x12, 0x4A, 0x5B, 0xAF, 0x65, 0xAE, 0x64, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F,
  88326. +0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01,
  88327. +0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC,
  88328. +0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74,
  88329. +0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74,
  88330. +0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53,
  88331. +0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74,
  88332. +0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D,
  88333. +0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01,
  88334. +0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0xE5, 0x67, 0x54,
  88335. +0x0F, 0xFF, 0xE5, 0x22, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x67, 0x30, 0xE2, 0x30, 0xE5, 0x22,
  88336. +0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x4A, 0xB2, 0xE5, 0x22, 0x30, 0xE3, 0x10, 0xE5, 0x67, 0x20,
  88337. +0xE3, 0x0B, 0x12, 0x49, 0xD5, 0xEF, 0x60, 0x53, 0x12, 0x4A, 0xCC, 0x80, 0x4E, 0xE5, 0x22, 0x20,
  88338. +0xE3, 0x49, 0xE5, 0x67, 0x30, 0xE3, 0x44, 0xAF, 0x68, 0x12, 0x4A, 0x7C, 0x80, 0x3D, 0xE5, 0x22,
  88339. +0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x67, 0x20, 0xE3, 0x09, 0x12, 0x49, 0xD5, 0xEF, 0x60,
  88340. +0x2A, 0x12, 0x4A, 0xCC, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x67, 0x20, 0xE2,
  88341. +0x09, 0x12, 0x49, 0x93, 0xEF, 0x60, 0x14, 0x12, 0x4A, 0x32, 0xE5, 0x22, 0x54, 0x0F, 0xFF, 0xBF,
  88342. +0x02, 0x09, 0x12, 0x45, 0x00, 0xEF, 0x60, 0x03, 0x12, 0x4B, 0x10, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
  88343. +0x02, 0x46, 0x6E, 0x02, 0x51, 0x39, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6,
  88344. +0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C,
  88345. +0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01,
  88346. +0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B,
  88347. +0x23, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F,
  88348. +0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8,
  88349. +0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA,
  88350. +0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE,
  88351. +0xE7, 0x80, 0xBE, 0xE5, 0x21, 0x64, 0x01, 0x70, 0x67, 0xE5, 0x24, 0x60, 0x63, 0xE5, 0x24, 0x64,
  88352. +0x02, 0x60, 0x06, 0xE5, 0x24, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8B, 0x0B,
  88353. +0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8B, 0x19, 0xF0, 0x90, 0x8B, 0x0B, 0xE0, 0x70, 0x07, 0x90,
  88354. +0x8B, 0x19, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x8B, 0x0B, 0xE0, 0xFF, 0x90, 0x8B, 0x0B, 0xEF, 0xF0,
  88355. +0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x0C, 0xF0, 0x90, 0x05, 0x58,
  88356. +0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, 0x25,
  88357. +0xFD, 0x53, 0x25, 0xEF, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x47, 0x8E,
  88358. +0x22, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x36, 0x75, 0x7D, 0x02, 0x7F,
  88359. +0x03, 0x12, 0x36, 0x75, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12,
  88360. +0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x66, 0x20, 0x90, 0x06, 0x04, 0xE0,
  88361. +0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B,
  88362. +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x36, 0xE6, 0x7D, 0x02, 0x7F, 0x03, 0x12,
  88363. +0x36, 0xE6, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0,
  88364. +0x12, 0x4B, 0x4F, 0xE5, 0x21, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x8B, 0x0D, 0xF0, 0x22, 0xE4, 0x90,
  88365. +0x8A, 0xC5, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x8A, 0xC5, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x09,
  88366. +0x53, 0x25, 0xFE, 0x53, 0x25, 0xFD, 0x12, 0x4A, 0xFC, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE6, 0x15,
  88367. +0x43, 0x25, 0x01, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x4A, 0x97, 0x80, 0x08,
  88368. +0x12, 0x49, 0x49, 0x80, 0x03, 0x53, 0x25, 0xFE, 0x90, 0x8A, 0xC5, 0xE0, 0x30, 0xE7, 0x27, 0x43,
  88369. +0x25, 0x02, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4,
  88370. +0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90,
  88371. +0x8B, 0x1B, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x25, 0xFD, 0x22, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x8B,
  88372. +0x12, 0x4B, 0x43, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xF5, 0x24, 0x14, 0x60,
  88373. +0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90,
  88374. +0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD, 0xE4, 0xFF, 0x12, 0x4A,
  88375. +0x07, 0x80, 0x29, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFD,
  88376. +0x7F, 0x01, 0x12, 0x4A, 0x07, 0x1F, 0x80, 0x14, 0x90, 0x8A, 0xDE, 0x12, 0x43, 0x6B, 0x90, 0x00,
  88377. +0x02, 0x12, 0x42, 0x20, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0x07, 0xE4, 0xFF, 0x12, 0x47, 0x21, 0x22,
  88378. +0xE4, 0x90, 0x8A, 0xCB, 0xF0, 0xE5, 0x24, 0x60, 0x49, 0x90, 0x8B, 0x1B, 0xE0, 0x60, 0x0D, 0xE4,
  88379. +0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x38, 0x80, 0x33, 0x90, 0x8B, 0x0C, 0xE0,
  88380. +0x04, 0xF0, 0x53, 0x25, 0xEF, 0x90, 0x8A, 0xCB, 0xE0, 0xFF, 0x90, 0x8B, 0x10, 0xE0, 0x2F, 0xFF,
  88381. +0xE4, 0x33, 0xFE, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98,
  88382. +0x40, 0x0D, 0xE5, 0x21, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12,
  88383. +0x4A, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x63, 0x90, 0x04, 0x1D, 0xE0,
  88384. +0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x66, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x2D, 0xBF, 0x01,
  88385. +0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xDE, 0x12, 0x45, 0x09, 0x90, 0x05,
  88386. +0x22, 0xE5, 0x66, 0xF0, 0x80, 0x0D, 0x90, 0x8A, 0xF9, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xDE,
  88387. +0x12, 0x45, 0x09, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x24,
  88388. +0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x41, 0x90, 0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x12, 0x45, 0x9E,
  88389. +0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  88390. +0x7F, 0x58, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92,
  88391. +0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x22, 0xE5, 0x22, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50,
  88392. +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x45, 0xA2, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01,
  88393. +0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E,
  88394. +0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05,
  88395. +0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x17, 0x14, 0xF0, 0xE5, 0x22, 0x54, 0x0F,
  88396. +0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x45, 0x9E, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x03, 0x12,
  88397. +0x66, 0x20, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x37, 0xE5, 0x25, 0x54, 0x03, 0x70,
  88398. +0x31, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x50, 0x28, 0xE5, 0x25, 0x20, 0xE2, 0x23, 0xE5,
  88399. +0x25, 0x20, 0xE4, 0x1E, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x18, 0x90, 0x8B, 0x12, 0xE0, 0x70, 0x12,
  88400. +0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F,
  88401. +0x01, 0x22, 0x7F, 0x00, 0x22, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x27, 0x90, 0x8B, 0x18,
  88402. +0xE0, 0x70, 0x21, 0x90, 0x8B, 0x17, 0xE0, 0x70, 0x1B, 0xE5, 0x23, 0x54, 0x0F, 0xD3, 0x94, 0x04,
  88403. +0x50, 0x12, 0xE5, 0x26, 0x70, 0x0E, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08,
  88404. +0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x22, 0x90,
  88405. +0x8B, 0x19, 0x74, 0x01, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8B, 0x16, 0xE0, 0x90, 0x8B,
  88406. +0x19, 0xF0, 0x80, 0x05, 0x90, 0x8B, 0x19, 0xED, 0xF0, 0x90, 0x8B, 0x19, 0xE0, 0x90, 0x8B, 0x0B,
  88407. +0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E,
  88408. +0x2D, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x36,
  88409. +0xE6, 0x12, 0x7A, 0x6D, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x02, 0x22, 0xEF, 0x60, 0x0F, 0x74, 0x21,
  88410. +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x21, 0x2D,
  88411. +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0,
  88412. +0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x48, 0xB3,
  88413. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x0C, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x8A, 0xF8,
  88414. +0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5F, 0xDE, 0x8E, 0x69, 0x8F, 0x6A, 0x90, 0x04, 0x1F, 0x74, 0x20,
  88415. +0xF0, 0x22, 0x90, 0x8B, 0x52, 0xEF, 0xF0, 0x12, 0x4F, 0xED, 0x90, 0x8B, 0x52, 0xE0, 0x60, 0x05,
  88416. +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x22, 0xF0, 0x43, 0x22, 0x04, 0x22, 0x90, 0x06, 0x04, 0xE0,
  88417. +0x44, 0x40, 0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x05, 0x7F, 0x01, 0x12, 0x48, 0xB3, 0x53, 0x22, 0xF0,
  88418. +0x43, 0x22, 0x04, 0x22, 0xE5, 0x23, 0x30, 0xE6, 0x12, 0xE5, 0x23, 0x54, 0x0F, 0xFF, 0x90, 0x01,
  88419. +0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, 0x53, 0x23, 0xBF, 0x22, 0x90, 0x8B, 0x2C, 0xE0,
  88420. +0x30, 0xE0, 0x05, 0xAF, 0x23, 0x02, 0x66, 0x65, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x22,
  88421. +0x53, 0x22, 0xF0, 0x43, 0x22, 0x01, 0x12, 0x4B, 0x5A, 0x12, 0x4B, 0x5B, 0x53, 0x22, 0xF0, 0x43,
  88422. +0x22, 0x02, 0x22, 0x41, 0x8A, 0xF6, 0x00, 0x41, 0x8B, 0x05, 0x00, 0x41, 0x8B, 0x51, 0x00, 0x41,
  88423. +0x8B, 0x53, 0x00, 0x00, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x7F, 0x64, 0x7F, 0x7F, 0x01, 0x60, 0x02,
  88424. +0x7F, 0x00, 0x22, 0xE4, 0x90, 0x8B, 0x1B, 0xF0, 0x90, 0x8B, 0x0C, 0xF0, 0xF5, 0x25, 0x22, 0x90,
  88425. +0x8B, 0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x22, 0x22, 0xF0, 0x90, 0x8B, 0x0F,
  88426. +0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01,
  88427. +0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x3D, 0xE0, 0xFB, 0xA3, 0xE0, 0xF5, 0x44, 0xE4, 0xF5, 0x45, 0x12,
  88428. +0x35, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0,
  88429. +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05,
  88430. +0xC0, 0x06, 0xC0, 0x07, 0x75, 0x0E, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x87, 0xF0, 0x74, 0x4B, 0xA3,
  88431. +0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31,
  88432. +0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34,
  88433. +0x30, 0xE0, 0x51, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x1F,
  88434. +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x34, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0,
  88435. +0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90,
  88436. +0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x1D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, 0x8B,
  88437. +0x2E, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF,
  88438. +0x70, 0x02, 0xD1, 0x56, 0xE5, 0x34, 0x30, 0xE1, 0x08, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x11,
  88439. +0x60, 0xE5, 0x34, 0x30, 0xE2, 0x28, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0,
  88440. +0x30, 0xE0, 0x14, 0x90, 0x8B, 0x3D, 0xE4, 0x71, 0x5C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90,
  88441. +0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x18, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34,
  88442. +0x30, 0xE3, 0x38, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24,
  88443. +0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x0F, 0xE0, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD,
  88444. +0x7F, 0x5C, 0x7E, 0x01, 0x71, 0x6C, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74,
  88445. +0x02, 0xF0, 0x80, 0x07, 0x90, 0x8B, 0x17, 0xE4, 0xF0, 0x51, 0xFC, 0xE5, 0x34, 0x30, 0xE4, 0x09,
  88446. +0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x12, 0x52, 0x3C, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01,
  88447. +0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x10, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90,
  88448. +0x00, 0x83, 0xE0, 0xF5, 0x23, 0x51, 0xE4, 0x51, 0xFC, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01,
  88449. +0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90,
  88450. +0x8B, 0x05, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05,
  88451. +0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x75, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90,
  88452. +0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x8B, 0x36, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64,
  88453. +0x03, 0x60, 0x0B, 0x7F, 0x01, 0xB1, 0xE0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0xD1, 0x89, 0x90, 0x8B,
  88454. +0x2C, 0xE0, 0x30, 0xE0, 0x49, 0x90, 0x8B, 0x30, 0xE4, 0xF0, 0xFF, 0xB1, 0xE0, 0xEF, 0x60, 0x3E,
  88455. +0x12, 0x65, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60, 0x32, 0xEF, 0xB4, 0x04, 0x02,
  88456. +0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x8B, 0x2D,
  88457. +0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x05, 0x7F,
  88458. +0x01, 0x12, 0x7B, 0x49, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x12, 0x66, 0x20, 0xE5, 0x36,
  88459. +0x30, 0xE1, 0x47, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30, 0xE0, 0x19,
  88460. +0x90, 0x8B, 0x36, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x33, 0xE0, 0x64, 0x03, 0x60, 0x0B, 0x7F, 0x01,
  88461. +0xB1, 0xE0, 0xEF, 0x70, 0x04, 0x7F, 0x02, 0xD1, 0x89, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x1A,
  88462. +0x90, 0x8B, 0x30, 0x74, 0x01, 0xF0, 0x12, 0x7D, 0xBE, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60,
  88463. +0x09, 0xE4, 0xFF, 0xB1, 0xE0, 0xEF, 0x70, 0x02, 0xD1, 0x56, 0x74, 0x87, 0x04, 0x90, 0x01, 0xC4,
  88464. +0xF0, 0x74, 0x4B, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0,
  88465. +0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32,
  88466. +0xEF, 0x64, 0x01, 0x70, 0x3D, 0x90, 0x8B, 0x35, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B,
  88467. +0x08, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x34, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22,
  88468. +0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54,
  88469. +0x07, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x36, 0xE0, 0x7F, 0x01, 0x60, 0x36, 0x7F,
  88470. +0x00, 0x22, 0x90, 0x8B, 0x2F, 0xE0, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x08, 0xE0, 0x60,
  88471. +0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2E, 0xE0, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x2C,
  88472. +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x30, 0xE0, 0x7F,
  88473. +0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x0D, 0xE0, 0x60, 0x16, 0x90, 0x8B, 0x2D, 0xE0,
  88474. +0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x1A, 0x7F, 0x02,
  88475. +0x80, 0x13, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, 0x8B, 0x2D,
  88476. +0xE0, 0x70, 0x05, 0x7F, 0x04, 0x12, 0x7B, 0x49, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  88477. +0x90, 0x8B, 0x33, 0xE0, 0x90, 0x8B, 0x55, 0xF0, 0x6F, 0x70, 0x02, 0xE1, 0x55, 0xEF, 0x14, 0x60,
  88478. +0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xE1, 0x30, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x55, 0x90,
  88479. +0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xC0, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x02,
  88480. +0x04, 0xF1, 0xAD, 0xE1, 0x55, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0xC4, 0xE1, 0x55,
  88481. +0x90, 0x8B, 0x55, 0xE0, 0x64, 0x01, 0x70, 0x7D, 0xF1, 0xAF, 0x80, 0x79, 0x90, 0x8B, 0x55, 0xE0,
  88482. +0xFF, 0xB4, 0x03, 0x04, 0xF1, 0xC8, 0x80, 0x6D, 0xEF, 0xB4, 0x02, 0x04, 0xF1, 0xA0, 0x80, 0x65,
  88483. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0xD3, 0x80, 0x59, 0xEF, 0x70, 0x56, 0xF1,
  88484. +0x8D, 0x80, 0x52, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x7A, 0x5E, 0x80, 0x46, 0x90,
  88485. +0x8B, 0x55, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0x71, 0x80, 0x3B, 0x90, 0x8B, 0x55, 0xE0, 0xB4, 0x04,
  88486. +0x05, 0x12, 0x7B, 0x37, 0x80, 0x2F, 0x90, 0x8B, 0x55, 0xE0, 0x70, 0x29, 0xF1, 0x6F, 0x80, 0x25,
  88487. +0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xF1, 0x5A, 0x80, 0x19, 0xEF, 0xB4, 0x02, 0x04,
  88488. +0xF1, 0x6B, 0x80, 0x11, 0x90, 0x8B, 0x55, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0x5A, 0x80, 0x05,
  88489. +0xEF, 0x70, 0x02, 0xF1, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0,
  88490. +0x90, 0x8B, 0x33, 0x74, 0x03, 0xF0, 0x22, 0xF1, 0x8D, 0x80, 0xEF, 0xF1, 0xED, 0x80, 0xEB, 0xF1,
  88491. +0x8D, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x7E, 0x2D, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8,
  88492. +0x74, 0xFD, 0xF0, 0x12, 0x7A, 0x6D, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x3E,
  88493. +0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x37, 0x00, 0x90, 0x8B, 0x33, 0x74, 0x01, 0xF0, 0x22,
  88494. +0xF1, 0xED, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22, 0xF1, 0xA0, 0x7D,
  88495. +0x03, 0x7F, 0x02, 0x12, 0x36, 0x92, 0x90, 0x05, 0x27, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0xF0, 0x22,
  88496. +0xF1, 0xC8, 0x80, 0xEB, 0xF1, 0xD3, 0x80, 0xE7, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33,
  88497. +0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x33, 0x04, 0xF0, 0x22, 0xF1, 0x8D,
  88498. +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x8B, 0x1C,
  88499. +0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x78, 0x7E, 0x08, 0x12, 0x2F, 0xD9,
  88500. +0x90, 0x8B, 0x20, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x04, 0x7E, 0x0C,
  88501. +0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x24, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F,
  88502. +0x00, 0x7E, 0x08, 0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x28, 0x12, 0x43, 0x53, 0x90, 0x80, 0x85, 0x12,
  88503. +0x2A, 0x7F, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2F, 0xD9, 0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00,
  88504. +0x03, 0x2D, 0x95, 0xE4, 0xFD, 0xFF, 0x12, 0x34, 0x81, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x11,
  88505. +0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x03, 0x2D, 0x95, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x34,
  88506. +0x81, 0x22, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF,
  88507. +0x8E, 0xF0, 0x12, 0x43, 0xBA, 0x50, 0x8D, 0x00, 0x40, 0x50, 0xB5, 0x00, 0x80, 0x50, 0xE0, 0x01,
  88508. +0x00, 0x50, 0xF4, 0x02, 0x00, 0x51, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x51, 0x29, 0xED, 0x54, 0x3F,
  88509. +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE,
  88510. +0xEF, 0x78, 0x06, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33,
  88511. +0xCE, 0xD8, 0xF9, 0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00,
  88512. +0x7F, 0x80, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
  88513. +0xD8, 0xF9, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49,
  88514. +0xED, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D,
  88515. +0x00, 0xFC, 0x80, 0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02,
  88516. +0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D,
  88517. +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13,
  88518. +0x54, 0x3F, 0x7D, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01,
  88519. +0xE4, 0x74, 0x58, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0xCC, 0xF0, 0xA3, 0xF0,
  88520. +0x75, 0x8E, 0x02, 0x91, 0x81, 0x12, 0x67, 0x0E, 0x90, 0x8B, 0x07, 0xEF, 0xF0, 0x12, 0x67, 0x1B,
  88521. +0x90, 0x8B, 0x09, 0xEF, 0xF0, 0x12, 0x67, 0x27, 0x90, 0x8A, 0xF4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
  88522. +0xE4, 0xF5, 0x55, 0xF5, 0x21, 0x12, 0x71, 0x16, 0x12, 0x44, 0x9E, 0x12, 0x32, 0x3D, 0x7F, 0x03,
  88523. +0x12, 0x76, 0xAB, 0x12, 0x7A, 0x5A, 0x12, 0x66, 0xD4, 0x12, 0x67, 0x3F, 0x12, 0x67, 0x54, 0x12,
  88524. +0x66, 0xF2, 0x12, 0x67, 0x0D, 0x90, 0x8A, 0xCE, 0xE5, 0xD9, 0xF0, 0x31, 0xD2, 0xC2, 0xAF, 0x90,
  88525. +0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x51, 0x81, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF,
  88526. +0x31, 0x2E, 0x90, 0x8A, 0xCC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x39, 0x90, 0x01, 0xC4, 0xF0, 0x74,
  88527. +0x51, 0xA3, 0xF0, 0xE5, 0x55, 0x30, 0xE4, 0x09, 0xC2, 0xAF, 0x53, 0x55, 0xEF, 0xD2, 0xAF, 0xB1,
  88528. +0xCC, 0xE5, 0x55, 0x30, 0xE6, 0xDC, 0xC2, 0xAF, 0x53, 0x55, 0xBF, 0xD2, 0xAF, 0x12, 0x68, 0x42,
  88529. +0x80, 0xD0, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0,
  88530. +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x31, 0xFB, 0x7D, 0xFF, 0x7F, 0x55, 0x31,
  88531. +0xFB, 0x7D, 0xFF, 0x7F, 0x56, 0x31, 0xFB, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
  88532. +0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x51, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
  88533. +0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3,
  88534. +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x31, 0xFB, 0xE4, 0xFD, 0x7F, 0x51, 0x31, 0xFB,
  88535. +0xE4, 0xFD, 0x7F, 0x52, 0x31, 0xFB, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0xE5, 0x5E, 0x64, 0x01,
  88536. +0x70, 0x3B, 0x71, 0xC1, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x71, 0xB5, 0x90, 0x00, 0x46, 0xE0, 0x44,
  88537. +0x04, 0xFD, 0x7F, 0x46, 0x31, 0xFB, 0x90, 0x00, 0x44, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x44, 0x31,
  88538. +0xFB, 0x90, 0x00, 0x46, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x46, 0x31, 0xFB, 0x7F, 0x02, 0x71, 0xDD,
  88539. +0x8F, 0x62, 0x90, 0x01, 0xC9, 0xE5, 0x62, 0xF0, 0xB4, 0x01, 0x02, 0x71, 0x55, 0x22, 0xE0, 0x5F,
  88540. +0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF,
  88541. +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xE0, 0xED, 0xF0, 0x90, 0x8A, 0xDF,
  88542. +0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x4E, 0xA3, 0xE0, 0x70, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0xFF,
  88543. +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x47,
  88544. +0xE0, 0x5F, 0xF0, 0x80, 0x17, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80,
  88545. +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x4F, 0xF0, 0x51, 0x81, 0x90, 0x8A,
  88546. +0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF,
  88547. +0x90, 0x00, 0x46, 0x80, 0x59, 0x90, 0x8A, 0xDF, 0xE0, 0x24, 0xF8, 0xF0, 0xA3, 0xE0, 0x70, 0x1D,
  88548. +0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC,
  88549. +0xC4, 0x54, 0xF0, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x80, 0x1A, 0x90, 0x8A, 0xDF,
  88550. +0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xC4, 0x54, 0xF0,
  88551. +0xFF, 0x90, 0x00, 0x43, 0xE0, 0x4F, 0xF0, 0x51, 0x81, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0x01,
  88552. +0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0x51, 0x7E,
  88553. +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x49, 0xE0, 0x90, 0x8B, 0x54, 0xF0, 0xE0, 0x54, 0x0F,
  88554. +0xF0, 0x44, 0xF0, 0xFD, 0x7F, 0x49, 0x31, 0xFB, 0x90, 0x8B, 0x54, 0xE0, 0x44, 0xB0, 0xFD, 0x7F,
  88555. +0x49, 0x21, 0xFB, 0x90, 0x8A, 0xDD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0x5E, 0x01, 0x8E, 0x5F,
  88556. +0xF5, 0x60, 0xE4, 0xFD, 0x7F, 0x0B, 0x51, 0x91, 0xE4, 0xFD, 0x7F, 0x02, 0x51, 0x91, 0x71, 0xC1,
  88557. +0xE4, 0xFF, 0x71, 0xB5, 0xE4, 0xF5, 0x62, 0x90, 0x01, 0xC9, 0xE5, 0x62, 0xF0, 0x90, 0x8A, 0xDD,
  88558. +0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFB, 0x8D, 0x44, 0xE4, 0xF5, 0x45, 0x7D, 0x01, 0x7F, 0x60,
  88559. +0x7E, 0x01, 0x02, 0x35, 0xAB, 0x90, 0x01, 0xCA, 0xE5, 0x61, 0xF0, 0xEF, 0x60, 0x02, 0x71, 0x55,
  88560. +0x22, 0x7F, 0x0B, 0x71, 0xDD, 0xEF, 0x65, 0x61, 0x60, 0x10, 0xE5, 0x61, 0xB4, 0x01, 0x05, 0xE4,
  88561. +0xF5, 0x61, 0x80, 0x03, 0x75, 0x61, 0x01, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF,
  88562. +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x57, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x43, 0xE0, 0xFF,
  88563. +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46,
  88564. +0x51, 0x7E, 0x90, 0x8B, 0x57, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05,
  88565. +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF,
  88566. +0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80,
  88567. +0x4B, 0x90, 0x8B, 0x57, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80,
  88568. +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xF0, 0x51, 0x81, 0x90,
  88569. +0x8B, 0x57, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
  88570. +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05,
  88571. +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF,
  88572. +0x22, 0xE4, 0x90, 0x8B, 0x04, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x21,
  88573. +0xFB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0x90, 0x8A,
  88574. +0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFA, 0xE5, 0xF0, 0x24, 0x00, 0xFF,
  88575. +0xE4, 0x3A, 0xFE, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEE, 0x8F, 0xF0, 0x12,
  88576. +0x43, 0x19, 0x12, 0x29, 0xD9, 0xFF, 0x60, 0x2C, 0xB5, 0x5E, 0x16, 0x90, 0x8A, 0xDA, 0x12, 0x43,
  88577. +0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0x65, 0x60, 0x70, 0x04, 0xE5, 0x5F, 0x65, 0xF0, 0x60,
  88578. +0x22, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0xC2, 0xFF, 0xAE, 0xF0,
  88579. +0x71, 0x73, 0x80, 0x0F, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0x65, 0x5E, 0x60,
  88580. +0x02, 0xB1, 0x08, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x5E, 0x7F, 0x60, 0x7E, 0x01, 0x8F,
  88581. +0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x8B, 0xEF,
  88582. +0x12, 0x43, 0x94, 0x55, 0x5A, 0x01, 0x55, 0x51, 0x02, 0x55, 0x7E, 0x03, 0x55, 0x87, 0x05, 0x55,
  88583. +0x90, 0x06, 0x55, 0xCB, 0x07, 0x55, 0x98, 0x08, 0x55, 0xA1, 0x09, 0x55, 0xA9, 0x20, 0x55, 0xB2,
  88584. +0x2C, 0x55, 0x63, 0x2D, 0x55, 0x6C, 0x2E, 0x55, 0x75, 0x3B, 0x55, 0xBB, 0x4B, 0x00, 0x00, 0x55,
  88585. +0xC4, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x72, 0xFC, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B,
  88586. +0x02, 0x73, 0x02, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x73, 0x2F, 0x90, 0x8A, 0xD7, 0x12,
  88587. +0x43, 0x6B, 0x02, 0x73, 0x77, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x73, 0xB0, 0x90, 0x8A,
  88588. +0xD7, 0x12, 0x43, 0x6B, 0x02, 0x73, 0xC9, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x72, 0xD0,
  88589. +0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0xE1, 0x19, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x74,
  88590. +0x11, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x81, 0x91, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02,
  88591. +0x76, 0xEA, 0x90, 0x8A, 0xD7, 0x12, 0x43, 0x6B, 0x02, 0x78, 0xDE, 0x90, 0x8A, 0xD7, 0x12, 0x43,
  88592. +0x6B, 0x02, 0x7A, 0x48, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
  88593. +0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF,
  88594. +0xE0, 0xFD, 0x70, 0x02, 0xE1, 0x14, 0x90, 0x8B, 0x51, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8,
  88595. +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02,
  88596. +0xE1, 0x0D, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x5F, 0xE0,
  88597. +0x90, 0x8A, 0xD0, 0xF0, 0x75, 0x1D, 0x01, 0x75, 0x1E, 0x8A, 0x75, 0x1F, 0xD0, 0x75, 0x20, 0x01,
  88598. +0x7B, 0x01, 0x7A, 0x8A, 0x79, 0xD1, 0x12, 0x5F, 0x57, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0xC4, 0x13,
  88599. +0x13, 0x13, 0x54, 0x01, 0x90, 0x8B, 0x51, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00,
  88600. +0x88, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD2, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x02,
  88601. +0x90, 0x00, 0x89, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD3, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75,
  88602. +0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD4, 0xF0, 0x90, 0x8B, 0x51,
  88603. +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD5, 0xF0, 0x90,
  88604. +0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD6,
  88605. +0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A,
  88606. +0xD2, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x5F, 0xE0,
  88607. +0x90, 0x8A, 0xD3, 0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43,
  88608. +0x5F, 0xE0, 0x90, 0x8A, 0xD4, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x8A, 0x79, 0xD2,
  88609. +0xB1, 0x19, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x90, 0x8B, 0x51, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06,
  88610. +0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8B, 0x51,
  88611. +0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC,
  88612. +0xF0, 0x90, 0x8B, 0x51, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0xA1, 0xDD, 0x90, 0x01, 0xC6,
  88613. +0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20, 0xFF,
  88614. +0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x8A, 0xDA,
  88615. +0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90,
  88616. +0x00, 0x03, 0x12, 0x42, 0x20, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x00,
  88617. +0x04, 0x12, 0x42, 0x20, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x8A, 0xE0, 0xF0, 0x90,
  88618. +0x8A, 0xDA, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0xAD, 0x82, 0xAC,
  88619. +0x83, 0x90, 0x8A, 0xE1, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x23,
  88620. +0xF9, 0x74, 0x87, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0x8B, 0x90, 0x8A, 0xDC, 0x12,
  88621. +0x43, 0x6B, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0x54, 0x0F, 0xFF, 0x90, 0x8A, 0xE3, 0x12, 0x43,
  88622. +0x6B, 0xEF, 0x12, 0x42, 0x4D, 0x90, 0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x02, 0x12, 0x42,
  88623. +0x20, 0xFF, 0x90, 0x8A, 0xE3, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x90,
  88624. +0x8A, 0xDC, 0x12, 0x43, 0x6B, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8A, 0xE1, 0xE0,
  88625. +0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x29, 0xD9, 0x8D, 0x82, 0x8C,
  88626. +0x83, 0xA3, 0xF0, 0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x24, 0xC1, 0xF5,
  88627. +0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xDB, 0xE0, 0xFE, 0x75, 0xF0, 0x09,
  88628. +0xEF, 0x90, 0x87, 0x29, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A,
  88629. +0x12, 0x43, 0x5F, 0x74, 0x01, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90,
  88630. +0x87, 0x2B, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0x8F, 0x0F, 0xEF, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82,
  88631. +0xE4, 0x34, 0x89, 0xAF, 0x82, 0xF5, 0x10, 0x8F, 0x11, 0xE5, 0x0F, 0x75, 0xF0, 0x02, 0xA4, 0x24,
  88632. +0x81, 0xF9, 0x74, 0x86, 0x35, 0xF0, 0x75, 0x12, 0x01, 0xF5, 0x13, 0x89, 0x14, 0x75, 0xF0, 0x09,
  88633. +0xE5, 0x0F, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0xAF, 0x82, 0x85, 0x83, 0x15, 0x8F, 0x16, 0xE5,
  88634. +0x0F, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x23, 0xF9, 0x74, 0x87, 0x35, 0xF0, 0x75, 0x17, 0x01, 0xF5,
  88635. +0x18, 0x89, 0x19, 0x74, 0xC1, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x12,
  88636. +0x43, 0x94, 0x58, 0xA7, 0x00, 0x58, 0xBC, 0x01, 0x58, 0xD1, 0x02, 0x58, 0xE6, 0x03, 0x59, 0x0F,
  88637. +0x04, 0x59, 0x24, 0x05, 0x59, 0x39, 0x06, 0x59, 0x5F, 0x0C, 0x59, 0x8C, 0x0D, 0x59, 0xB9, 0x0E,
  88638. +0x59, 0xE6, 0x0F, 0x00, 0x00, 0x5A, 0x1A, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4,
  88639. +0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x0F, 0x25, 0xE0,
  88640. +0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80,
  88641. +0x27, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0xF0,
  88642. +0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34,
  88643. +0x89, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5,
  88644. +0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x41, 0x1A, 0xE5,
  88645. +0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3,
  88646. +0x74, 0xF5, 0x80, 0x27, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  88647. +0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5,
  88648. +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x0F, 0x25, 0xE0,
  88649. +0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x41, 0x1A, 0x90,
  88650. +0x04, 0x47, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x46, 0xE0,
  88651. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x45, 0xE0,
  88652. +0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x41, 0x11, 0x90, 0x04, 0x4B, 0xE0,
  88653. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x12, 0xAA,
  88654. +0x13, 0xA9, 0x14, 0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x11, 0x82,
  88655. +0x85, 0x10, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x12, 0xAA,
  88656. +0x13, 0xA9, 0x14, 0x12, 0x42, 0x4D, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  88657. +0x90, 0x00, 0x01, 0x12, 0x42, 0x5F, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83,
  88658. +0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  88659. +0x12, 0x42, 0x4D, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x01,
  88660. +0x12, 0x42, 0x5F, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xF0, 0x90, 0x04,
  88661. +0x50, 0xE0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14,
  88662. +0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x29, 0xD9, 0xFF, 0xAB, 0x17, 0xAA, 0x18, 0xA9, 0x19,
  88663. +0x12, 0x29, 0xD9, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x4D, 0xAB, 0x12, 0xE5,
  88664. +0x14, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x13, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x29,
  88665. +0xD9, 0xFF, 0xAB, 0x17, 0xAA, 0x18, 0xA9, 0x19, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x5F, 0xD0,
  88666. +0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x4D, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xC0, 0x83,
  88667. +0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x16, 0x82, 0x85, 0x15, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82,
  88668. +0xD0, 0x83, 0xF0, 0x85, 0x11, 0x82, 0x85, 0x10, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF,
  88669. +0x85, 0x16, 0x82, 0x85, 0x15, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0,
  88670. +0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
  88671. +0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x8A, 0xE6, 0x74, 0x0B, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3,
  88672. +0x94, 0x00, 0x50, 0x02, 0x61, 0x5F, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3,
  88673. +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4,
  88674. +0x34, 0x86, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x8A, 0xE6,
  88675. +0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5,
  88676. +0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0,
  88677. +0x4E, 0x60, 0x47, 0x90, 0x8A, 0xE6, 0x74, 0x0F, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94,
  88678. +0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
  88679. +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  88680. +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x8A, 0xE6, 0xE0, 0xA3, 0xF0,
  88681. +0x80, 0x0D, 0x90, 0x8A, 0xE6, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x8A, 0xE7, 0xF0, 0xE5,
  88682. +0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0,
  88683. +0x4E, 0x60, 0x46, 0xE4, 0x90, 0x8A, 0xE6, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x10,
  88684. +0x40, 0x02, 0x81, 0x18, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
  88685. +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89,
  88686. +0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x8A, 0xE6, 0xE0, 0x80,
  88687. +0x63, 0x90, 0x8A, 0xE6, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5,
  88688. +0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x8A,
  88689. +0xE6, 0xF0, 0x90, 0x8A, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00,
  88690. +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x0F, 0x25,
  88691. +0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F,
  88692. +0x4E, 0x60, 0x08, 0x90, 0x8A, 0xE6, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x8A, 0xE6, 0xE0, 0x04,
  88693. +0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x8A, 0xE8, 0xF0, 0x90, 0x8A, 0xE7, 0xE0, 0xFF, 0x75, 0xF0, 0x09,
  88694. +0xE5, 0x0F, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xEF, 0xF0, 0x90, 0x8A, 0xE8, 0xE0, 0xFE, 0x75,
  88695. +0xF0, 0x09, 0xE5, 0x0F, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xE5, 0x0F, 0xC3, 0x94,
  88696. +0x20, 0x50, 0x32, 0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3,
  88697. +0x9F, 0x40, 0x02, 0x80, 0x18, 0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83,
  88698. +0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x8A, 0xE8, 0xE0, 0xA3, 0xF0, 0x80, 0x08, 0x90, 0x8A, 0xE7,
  88699. +0xE0, 0x90, 0x8A, 0xE9, 0xF0, 0x90, 0x8A, 0xE9, 0xE0, 0xFD, 0xAF, 0x0F, 0x91, 0xC1, 0x90, 0x8A,
  88700. +0xE9, 0xE0, 0xFF, 0x74, 0x84, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0,
  88701. +0x90, 0x8A, 0xE7, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x03, 0xF0,
  88702. +0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3,
  88703. +0x94, 0x03, 0x40, 0x07, 0x90, 0x87, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x87, 0x22, 0xF0,
  88704. +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04,
  88705. +0xF5, 0x83, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xED, 0x54, 0x1F, 0x90, 0x8A,
  88706. +0xC7, 0xF0, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xC5,
  88707. +0xF0, 0x90, 0x8A, 0xC8, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, 0x37, 0x90,
  88708. +0x8A, 0xC5, 0xE0, 0x25, 0x0D, 0xFF, 0xA3, 0xF0, 0xA3, 0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF,
  88709. +0xD3, 0x9E, 0x40, 0x10, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE4, 0xF0,
  88710. +0xAF, 0x04, 0x80, 0x9D, 0x90, 0x8A, 0xC6, 0xE0, 0xFF, 0x74, 0x01, 0x2C, 0xF5, 0x82, 0xE4, 0x34,
  88711. +0x86, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12,
  88712. +0x43, 0x5F, 0xE0, 0xFF, 0x90, 0x8A, 0xCA, 0xF0, 0x74, 0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
  88713. +0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, 0x8A, 0xC9, 0xF0, 0xD3, 0x9F, 0x40, 0x06, 0xA3, 0xE0, 0x90,
  88714. +0x8A, 0xC9, 0xF0, 0x90, 0x8A, 0xC9, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34,
  88715. +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5,
  88716. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13,
  88717. +0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  88718. +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xC9, 0xE0, 0xFD, 0x91, 0xC1, 0x90, 0x8A,
  88719. +0xC9, 0xE0, 0xFF, 0x22, 0xAC, 0x07, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83,
  88720. +0xE0, 0x54, 0x7F, 0x90, 0x8A, 0xDE, 0xF0, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x8A, 0xE1, 0xF0, 0x75,
  88721. +0xF0, 0x09, 0xEC, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xE3, 0xF0, 0x75, 0xF0,
  88722. +0x09, 0xEC, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0x90, 0x8A, 0xE4, 0xF0, 0xEC, 0x25,
  88723. +0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A,
  88724. +0xE5, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x86,
  88725. +0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE7, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEF, 0xD3,
  88726. +0x9E, 0x40, 0x0C, 0x90, 0x8A, 0xE4, 0xE0, 0x90, 0x8A, 0xE1, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0xED,
  88727. +0x70, 0x02, 0xE1, 0x06, 0x90, 0x8A, 0xE2, 0xED, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0x30, 0xE6, 0x0E,
  88728. +0x90, 0x8A, 0xE1, 0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0x14, 0xF0, 0x90, 0x8A,
  88729. +0xE2, 0xE0, 0x70, 0x02, 0xE1, 0x06, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02,
  88730. +0xE1, 0x06, 0xE4, 0x90, 0x8A, 0xE0, 0xF0, 0xEF, 0x14, 0x90, 0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xE3,
  88731. +0xE0, 0xFD, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21,
  88732. +0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
  88733. +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE7, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70,
  88734. +0x27, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8,
  88735. +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE5, 0xE0,
  88736. +0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x8A, 0xDF, 0xE0, 0x90, 0x8A, 0xDE, 0xF0,
  88737. +0x90, 0x8A, 0xE0, 0xE0, 0x04, 0xF0, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0, 0x6F,
  88738. +0x60, 0x08, 0x90, 0x8A, 0xDF, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x8A, 0xE2, 0xE0, 0xFF, 0x90,
  88739. +0x8A, 0xE0, 0xE0, 0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x8A, 0xDF, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x8A,
  88740. +0xE3, 0xE0, 0x90, 0x8A, 0xDE, 0xF0, 0x90, 0x8A, 0xDE, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5,
  88741. +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0,
  88742. +0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93,
  88743. +0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34,
  88744. +0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x8A, 0xDE, 0xE0, 0xFD, 0x91,
  88745. +0xC1, 0x90, 0x8A, 0xDE, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1A,
  88746. +0x8A, 0x1B, 0x89, 0x1C, 0x90, 0x8B, 0x3F, 0x12, 0x43, 0x8B, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F,
  88747. +0x90, 0x8B, 0x42, 0x12, 0x43, 0x8B, 0xAF, 0x20, 0x15, 0x20, 0xEF, 0x60, 0x1E, 0x90, 0x8B, 0x42,
  88748. +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0x74, 0x12, 0x29, 0xD9, 0xFF, 0x90, 0x8B, 0x3F, 0xE4, 0x75,
  88749. +0xF0, 0x01, 0x12, 0x43, 0x74, 0xEF, 0x12, 0x42, 0x4D, 0x80, 0xDB, 0xAB, 0x1A, 0xAA, 0x1B, 0xA9,
  88750. +0x1C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4,
  88751. +0x74, 0xA6, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22,
  88752. +0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0,
  88753. +0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
  88754. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3,
  88755. +0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x1E, 0xAF, 0x03, 0x74,
  88756. +0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x10, 0x2F,
  88757. +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F,
  88758. +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
  88759. +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
  88760. +0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
  88761. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3,
  88762. +0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5F,
  88763. +0xA6, 0xBF, 0x01, 0x10, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5F, 0xDE, 0x90, 0x04,
  88764. +0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13,
  88765. +0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x8A, 0xC5,
  88766. +0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07,
  88767. +0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x8A, 0xC5, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D,
  88768. +0xF0, 0x79, 0x40, 0x90, 0x8A, 0xC5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0,
  88769. +0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x8A, 0xF6, 0xF0, 0x22, 0x90, 0x8A, 0xF6, 0xE0, 0x04,
  88770. +0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02,
  88771. +0x11, 0x6E, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00,
  88772. +0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
  88773. +0x90, 0x01, 0xC4, 0x74, 0xF3, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28,
  88774. +0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0,
  88775. +0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x41, 0x8A, 0x90, 0x01, 0x34, 0x74, 0x01,
  88776. +0xF0, 0x85, 0xD1, 0x4D, 0x85, 0xD2, 0x4E, 0x85, 0xD3, 0x4F, 0x85, 0xD4, 0x50, 0x85, 0xD5, 0x51,
  88777. +0x85, 0xD6, 0x52, 0x85, 0xD7, 0x53, 0x85, 0xD9, 0x54, 0xE5, 0x54, 0x54, 0x40, 0xC3, 0x13, 0xFF,
  88778. +0xE5, 0x53, 0x54, 0x20, 0x6F, 0x70, 0x02, 0x41, 0x47, 0xE5, 0x54, 0x30, 0xE5, 0x02, 0x41, 0x47,
  88779. +0xE5, 0x52, 0x54, 0x1F, 0xF5, 0x08, 0xE5, 0x4D, 0x54, 0x3F, 0xF5, 0x09, 0xE5, 0x51, 0x54, 0x1F,
  88780. +0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F,
  88781. +0xF0, 0x12, 0x42, 0x81, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0xC0, 0xF5,
  88782. +0x82, 0xE4, 0x34, 0x85, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x09, 0xD3, 0x94,
  88783. +0x04, 0x40, 0x03, 0x75, 0x09, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12, 0x43,
  88784. +0x5F, 0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE5, 0x53,
  88785. +0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x08, 0x90, 0x84, 0x00, 0x12,
  88786. +0x43, 0x5F, 0x75, 0xF0, 0x02, 0xE5, 0x09, 0x12, 0x43, 0x5F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5,
  88787. +0x54, 0x20, 0xE6, 0x24, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25, 0xE0, 0x24, 0x63, 0xF5,
  88788. +0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xE5, 0x4F, 0x30, 0xE7,
  88789. +0x36, 0xAF, 0x08, 0x12, 0x5D, 0x36, 0x80, 0x2F, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0xE5, 0x08, 0x25,
  88790. +0xE0, 0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x81,
  88791. +0xE5, 0x4F, 0x30, 0xE7, 0x12, 0xE5, 0x4F, 0x54, 0x7F, 0xFD, 0xE5, 0x53, 0x54, 0x1F, 0xF5, 0x0D,
  88792. +0xAB, 0x09, 0xAF, 0x08, 0x12, 0x5C, 0xD9, 0xE5, 0x24, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3A,
  88793. +0x90, 0x8B, 0x1A, 0xE0, 0x60, 0x2B, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04,
  88794. +0xF0, 0x12, 0x4B, 0x34, 0xEF, 0x64, 0x01, 0x70, 0x21, 0x90, 0x8B, 0x3D, 0x12, 0x4B, 0x5C, 0x90,
  88795. +0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x18, 0xF0, 0x80,
  88796. +0x09, 0x12, 0x4B, 0x34, 0xBF, 0x01, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2C, 0x30, 0xE1, 0x20, 0x90,
  88797. +0x01, 0x34, 0x74, 0x02, 0xF0, 0x85, 0xD1, 0x56, 0x85, 0xD2, 0x57, 0x85, 0xD3, 0x58, 0x85, 0xD4,
  88798. +0x59, 0x85, 0xD5, 0x5A, 0x85, 0xD6, 0x5B, 0x85, 0xD7, 0x5C, 0x85, 0xD9, 0x5D, 0xB1, 0x5F, 0xE5,
  88799. +0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90,
  88800. +0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x55, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF,
  88801. +0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8,
  88802. +0x00, 0x75, 0xE8, 0x00, 0x12, 0x52, 0x10, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x52,
  88803. +0x81, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x2D, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0x90, 0x8B,
  88804. +0x32, 0xE0, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05, 0x90, 0x8B, 0x34, 0xE4,
  88805. +0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x05,
  88806. +0x90, 0x8B, 0x2E, 0xE4, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x61, 0xE7, 0x90, 0x8B, 0x08, 0x74,
  88807. +0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x8B, 0x06, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05,
  88808. +0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0x30,
  88809. +0xE0, 0x2F, 0x90, 0x8B, 0x37, 0x74, 0x01, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xFF, 0x13, 0x13, 0x54,
  88810. +0x3F, 0x30, 0xE0, 0x1D, 0x90, 0x8B, 0x34, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0x90, 0x8B, 0x33, 0xE0,
  88811. +0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x7F, 0x04, 0x12, 0x4E,
  88812. +0x89, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0x30, 0xE0, 0x56, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x4F,
  88813. +0x90, 0x8B, 0x2E, 0x74, 0x01, 0xF0, 0xB1, 0x39, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x3F,
  88814. +0xB1, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0x64, 0x06, 0x60,
  88815. +0x2E, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x04, 0xE4, 0xFF,
  88816. +0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, 0x8B, 0x2D,
  88817. +0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x7B, 0x49, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12,
  88818. +0x43, 0xE7, 0x90, 0x8B, 0x08, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x2F, 0x90, 0x01, 0x36, 0x74,
  88819. +0x02, 0xF0, 0x43, 0x55, 0x40, 0x11, 0x85, 0x90, 0x8B, 0x37, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0x05,
  88820. +0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x37, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x0D, 0xE4, 0xFF,
  88821. +0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x16,
  88822. +0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x64,
  88823. +0x06, 0x60, 0x03, 0x12, 0x46, 0xB3, 0xE5, 0x2E, 0x30, 0xE3, 0x38, 0x90, 0x01, 0x36, 0x74, 0x08,
  88824. +0xF0, 0xE5, 0x21, 0x64, 0x01, 0x70, 0x2C, 0xE5, 0x24, 0x60, 0x28, 0x90, 0x01, 0x57, 0xE4, 0xF0,
  88825. +0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8B, 0x3D, 0xE4, 0xF0, 0x90, 0x8B, 0x11, 0xE0, 0x90,
  88826. +0x8B, 0x3E, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x57,
  88827. +0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x21,
  88828. +0xB4, 0x01, 0x20, 0xE5, 0x24, 0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74,
  88829. +0x02, 0xF0, 0x90, 0x8B, 0x1B, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0xE5, 0x25, 0x54, 0x07, 0x70, 0x03,
  88830. +0x12, 0x4A, 0xFC, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x21,
  88831. +0xB4, 0x01, 0x14, 0xE5, 0x24, 0x60, 0x10, 0x90, 0x8B, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12,
  88832. +0x4A, 0x97, 0x80, 0x03, 0x12, 0x49, 0x49, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74,
  88833. +0x40, 0xF0, 0xE5, 0x21, 0xB4, 0x01, 0x10, 0xE5, 0x24, 0x60, 0x0C, 0x53, 0x25, 0xFE, 0xE5, 0x25,
  88834. +0x54, 0x07, 0x70, 0x03, 0x12, 0x4A, 0xFC, 0xE5, 0x2F, 0x30, 0xE1, 0x27, 0x90, 0x01, 0x37, 0x74,
  88835. +0x02, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0x30, 0xE0, 0x17, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60,
  88836. +0x07, 0x12, 0x48, 0xFE, 0xD1, 0x20, 0x80, 0x0B, 0x90, 0x8B, 0x31, 0x74, 0x01, 0xF0, 0x80, 0x03,
  88837. +0x12, 0x48, 0xFE, 0x74, 0xF3, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07,
  88838. +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0,
  88839. +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0x90, 0x8B, 0x3D, 0xF0, 0x90, 0x05,
  88840. +0x58, 0xE0, 0xFF, 0x90, 0x8B, 0x38, 0xE0, 0x2F, 0x24, 0xFE, 0x90, 0x8B, 0x3E, 0xF0, 0xE4, 0xFB,
  88841. +0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x4B, 0x6C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x22, 0x90,
  88842. +0x8A, 0xC5, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A,
  88843. +0x00, 0x79, 0x56, 0x90, 0x8B, 0x48, 0x12, 0x43, 0x8B, 0x0B, 0x7A, 0x8A, 0x79, 0xC5, 0xD3, 0x10,
  88844. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x8B, 0x90, 0x8B, 0x53, 0xE0, 0xFF,
  88845. +0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x5F, 0x7F, 0xAF, 0x7E, 0x01, 0xD1, 0x8A, 0xEF,
  88846. +0x60, 0x49, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x6B, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x75, 0x20,
  88847. +0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x5F, 0x57, 0x90, 0x8B, 0x48, 0x12, 0x43, 0x6B,
  88848. +0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x8B, 0x45, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF,
  88849. +0xC4, 0x54, 0x0F, 0xF5, 0x20, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0x12, 0x5F, 0x57, 0x90, 0x01,
  88850. +0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
  88851. +0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0B, 0xA3, 0xE0, 0x64,
  88852. +0x06, 0x60, 0x05, 0x7F, 0x06, 0x12, 0x7B, 0x49, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x02,
  88853. +0xD1, 0x13, 0x22, 0x90, 0x8B, 0x31, 0xE0, 0xB4, 0x01, 0x05, 0xE4, 0xF0, 0x12, 0x48, 0xFE, 0x22,
  88854. +0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x06, 0x60, 0x3C, 0xE5, 0x22, 0x54, 0x0F, 0x14, 0x60, 0x2E, 0x14,
  88855. +0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, 0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x90,
  88856. +0x05, 0x22, 0xF0, 0x22, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22,
  88857. +0x90, 0x8B, 0x2D, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01, 0xC6,
  88858. +0xE0, 0x44, 0x08, 0xF0, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF, 0x60, 0x18, 0x90,
  88859. +0x8B, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0C, 0xAF, 0x06, 0x7D, 0x01, 0x12,
  88860. +0x45, 0xA2, 0xD1, 0x20, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8B, 0x4B, 0xEE, 0xF0, 0xA3,
  88861. +0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x8B, 0x4B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82,
  88862. +0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x8B, 0x4E, 0xE0, 0x94, 0xE8, 0x90, 0x8B, 0x4D, 0xE0,
  88863. +0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x8B,
  88864. +0x4D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x37, 0x54, 0x80,
  88865. +0xC6, 0x7F, 0x01, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90,
  88866. +0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B,
  88867. +0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x90, 0x01,
  88868. +0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x22, 0x90, 0x00,
  88869. +0x02, 0xE0, 0x54, 0xE0, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F,
  88870. +0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x8B, 0x09, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00,
  88871. +0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90,
  88872. +0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0,
  88873. +0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0xA0, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0,
  88874. +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0x5B, 0x90, 0x01,
  88875. +0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE,
  88876. +0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0,
  88877. +0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D,
  88878. +0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00,
  88879. +0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5,
  88880. +0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90,
  88881. +0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0,
  88882. +0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0,
  88883. +0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0,
  88884. +0xE0, 0x32, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0,
  88885. +0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54,
  88886. +0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83,
  88887. +0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D,
  88888. +0xF0, 0x22, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40,
  88889. +0x02, 0xC1, 0xCD, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2A, 0x12, 0x43, 0x5F, 0xE0, 0x64, 0x01,
  88890. +0x60, 0x02, 0xC1, 0xC5, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34,
  88891. +0x85, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEC, 0x94, 0x00, 0x50, 0x02, 0xC1,
  88892. +0xC5, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x12, 0x01,
  88893. +0xF5, 0x13, 0x89, 0x14, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34,
  88894. +0x85, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x8A, 0xD4, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF,
  88895. +0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90,
  88896. +0x8A, 0xD6, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFE, 0x24, 0x84, 0xF5, 0x82,
  88897. +0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x8A, 0xD0, 0xF0, 0xE0, 0xFD, 0x54, 0x1F,
  88898. +0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xEE, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0xE0, 0x90, 0x8A, 0xD9,
  88899. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFB, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
  88900. +0xC3, 0x94, 0x05, 0x40, 0x02, 0x61, 0x1A, 0x90, 0x8A, 0xD9, 0xE0, 0xFE, 0x90, 0x8A, 0xD1, 0xE0,
  88901. +0x9E, 0x40, 0x13, 0x90, 0x8A, 0xD9, 0xE0, 0x90, 0x8A, 0xD1, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0x90,
  88902. +0x8A, 0xD0, 0xF0, 0xEE, 0x4D, 0xF0, 0x90, 0x8A, 0xD1, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE,
  88903. +0x74, 0x23, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF,
  88904. +0x90, 0x40, 0xDA, 0x80, 0x07, 0x90, 0x8A, 0xD1, 0xE0, 0x90, 0x40, 0xF6, 0x93, 0x90, 0x8A, 0xD8,
  88905. +0xF0, 0x90, 0x8A, 0xD8, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, 0x40, 0x35, 0xF0,
  88906. +0x75, 0x0F, 0xFF, 0xF5, 0x10, 0x89, 0x11, 0x90, 0x8A, 0xD0, 0xE0, 0x90, 0x41, 0xBA, 0x93, 0xFF,
  88907. +0xD3, 0x90, 0x8A, 0xD7, 0xE0, 0x9F, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x0C, 0x90, 0x8A,
  88908. +0xCF, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5D, 0xB4, 0xC1, 0x5B, 0x90, 0x8A, 0xCF, 0xE0, 0x25, 0xE0,
  88909. +0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xD2,
  88910. +0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x12, 0x29, 0xD9, 0xFF, 0x7E,
  88911. +0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x12, 0x42, 0x97, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2,
  88912. +0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90,
  88913. +0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00,
  88914. +0x02, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0,
  88915. +0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF,
  88916. +0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC2, 0xFD, 0xAC,
  88917. +0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA,
  88918. +0x10, 0xA9, 0x11, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13,
  88919. +0xA9, 0x14, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A,
  88920. +0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x04,
  88921. +0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x08, 0x12,
  88922. +0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42,
  88923. +0x81, 0xAB, 0x0F, 0xAA, 0x10, 0xA9, 0x11, 0x90, 0x00, 0x05, 0x12, 0x42, 0x20, 0xFF, 0x7E, 0x00,
  88924. +0x90, 0x8A, 0xD4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x29, 0xF2, 0xD3, 0x90, 0x8A, 0xD3, 0xE0,
  88925. +0x9F, 0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x8A, 0xD2, 0xE0,
  88926. +0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xD2, 0xE0, 0xFC,
  88927. +0xA3, 0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34,
  88928. +0x86, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24, 0x2E,
  88929. +0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xD3, 0xED,
  88930. +0x9B, 0xEC, 0x9A, 0x40, 0x04, 0xD1, 0xCE, 0xC1, 0x29, 0x90, 0x8A, 0xD0, 0xE0, 0x25, 0xE0, 0x24,
  88931. +0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3,
  88932. +0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x40, 0x02, 0xC1, 0x29, 0x90, 0x8A,
  88933. +0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5D, 0xB4, 0xC1, 0x29, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24,
  88934. +0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0x81, 0xF8,
  88935. +0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94, 0x19, 0x40,
  88936. +0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E,
  88937. +0x80, 0x1F, 0x90, 0x87, 0x22, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94,
  88938. +0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x8A, 0xD1, 0xE0, 0xC3, 0x94, 0x03, 0x40,
  88939. +0x0D, 0x90, 0x89, 0x43, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x89, 0x43, 0xF0, 0x90, 0x8A,
  88940. +0xCF, 0xE0, 0xFE, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xDD,
  88941. +0xF0, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30,
  88942. +0x50, 0x0A, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0x81, 0xA3, 0x90, 0x89, 0x43, 0xE0,
  88943. +0x64, 0x01, 0x60, 0x02, 0x81, 0x98, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x44, 0xF5, 0x82, 0xE4, 0x34,
  88944. +0x89, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0xEE, 0x24, 0x05,
  88945. +0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xE0, 0xFF,
  88946. +0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x8A, 0xCF, 0xE0, 0xFE,
  88947. +0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  88948. +0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x8A, 0xCF,
  88949. +0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8A, 0xD1, 0xE0,
  88950. +0x6F, 0x60, 0x56, 0x90, 0x8A, 0xCF, 0xE0, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
  88951. +0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF,
  88952. +0xD3, 0x94, 0x39, 0x90, 0x8A, 0xDD, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0,
  88953. +0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
  88954. +0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xCF, 0xE0,
  88955. +0x24, 0x44, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0x80, 0x2F, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x64,
  88956. +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x44, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
  88957. +0x89, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x90, 0x8A, 0xCF,
  88958. +0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8A, 0xD1, 0xE0,
  88959. +0xFE, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE,
  88960. +0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFE, 0x74, 0x43, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
  88961. +0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x87, 0x2B, 0x12, 0x43, 0x5F, 0xE0, 0xB4, 0x01, 0x11,
  88962. +0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0x74, 0x64, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  88963. +0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0xC1, 0x27, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x29, 0x90,
  88964. +0x8A, 0xD2, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x8A, 0xD4, 0xE0,
  88965. +0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x29, 0xF2, 0x90, 0x8A, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
  88966. +0x8A, 0xCF, 0xE0, 0x24, 0x43, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xDD,
  88967. +0xF0, 0xE4, 0x90, 0x8A, 0xDA, 0xF0, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47,
  88968. +0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83,
  88969. +0x12, 0x42, 0xC2, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x29,
  88970. +0xF2, 0x90, 0x8A, 0xD2, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x81, 0x90, 0x8A, 0xDB, 0xE0, 0xFE, 0xA3,
  88971. +0xE0, 0xFF, 0xD3, 0x90, 0x8A, 0xD3, 0xE0, 0x9F, 0x90, 0x8A, 0xD2, 0xE0, 0x9E, 0x50, 0x08, 0x90,
  88972. +0x8A, 0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8A, 0xDA, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x8A,
  88973. +0xDD, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x8A, 0xDA, 0xE0, 0x70, 0x5D, 0x90, 0x8A, 0xDD, 0x04,
  88974. +0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x8A, 0xDA, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8A,
  88975. +0xDD, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0,
  88976. +0x80, 0x3C, 0x80, 0x35, 0x90, 0x8A, 0xDD, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x8A, 0xDA, 0xE0,
  88977. +0xFF, 0x70, 0x08, 0x90, 0x8A, 0xDD, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x8A, 0xDD, 0xB4,
  88978. +0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x8A, 0xD7, 0xE0, 0x94,
  88979. +0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0xD3, 0x90,
  88980. +0x8A, 0xD7, 0xE0, 0x94, 0x03, 0x90, 0x8A, 0xD6, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x8A,
  88981. +0xDD, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0xFD, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x43, 0xF5, 0x82,
  88982. +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xED, 0xF0, 0x11, 0x02, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x24, 0x64,
  88983. +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x64, 0x2F,
  88984. +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x8A, 0xCF, 0xE0,
  88985. +0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0xAB, 0x12, 0xAA, 0x13, 0xA9,
  88986. +0x14, 0xE4, 0xF5, 0xF0, 0x12, 0x42, 0xFA, 0xAB, 0x12, 0xAA, 0x13, 0xA9, 0x14, 0x90, 0x00, 0x02,
  88987. +0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90,
  88988. +0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x19, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43,
  88989. +0x19, 0x90, 0x8A, 0xCF, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5,
  88990. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  88991. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  88992. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x01, 0x47, 0x22, 0xAD, 0x07,
  88993. +0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x8A, 0xDE,
  88994. +0xF0, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43,
  88995. +0x5F, 0xE0, 0xFF, 0x90, 0x8A, 0xE1, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
  88996. +0x86, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x8A, 0xE2, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED,
  88997. +0x25, 0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90,
  88998. +0x8A, 0xE4, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x8A, 0xDF, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x2E,
  88999. +0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25,
  89000. +0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE,
  89001. +0xC3, 0x9F, 0x40, 0x03, 0x02, 0x70, 0x12, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x74, 0xA5, 0x2D, 0xF5,
  89002. +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x8A, 0xE0, 0xF0, 0x90, 0x8A,
  89003. +0xE1, 0xE0, 0xFF, 0x90, 0x8A, 0xE0, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x03, 0x02, 0x70, 0x4C, 0xEE,
  89004. +0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08,
  89005. +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x8A, 0xE2, 0xE0, 0x5E, 0xFE,
  89006. +0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x8A, 0xE0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59,
  89007. +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
  89008. +0xFF, 0x90, 0x8A, 0xE4, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x8A, 0xE0,
  89009. +0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x8A, 0xE3, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x8A, 0xE0, 0x74, 0x17,
  89010. +0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x8A,
  89011. +0xE2, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x8A, 0xE0, 0x74, 0x18, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0x90,
  89012. +0x8A, 0xDF, 0xF0, 0x90, 0x8A, 0xDE, 0xF0, 0x80, 0x43, 0x90, 0x8A, 0xE0, 0xE0, 0x04, 0xF0, 0x02,
  89013. +0x6F, 0x6E, 0x90, 0x8A, 0xE1, 0xE0, 0xFC, 0x90, 0x8A, 0xDF, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74,
  89014. +0xA5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90,
  89015. +0x87, 0x29, 0x12, 0x43, 0x5F, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x8A, 0xDF,
  89016. +0xE0, 0x44, 0x40, 0x90, 0x8A, 0xDE, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x8A, 0xDF, 0xE0,
  89017. +0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74,
  89018. +0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74,
  89019. +0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0,
  89020. +0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66,
  89021. +0x90, 0x8A, 0xDF, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x8A, 0xE1, 0xE0, 0xFF, 0x74, 0xA5, 0x2D,
  89022. +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8A, 0xDF, 0xEF, 0xF0, 0x90, 0x8A,
  89023. +0xDE, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5,
  89024. +0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4,
  89025. +0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF,
  89026. +0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0xEE, 0xF0,
  89027. +0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83,
  89028. +0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x8A, 0xDE, 0xE0, 0x44, 0x80, 0xFD, 0x12, 0x5C, 0xC1, 0x90, 0x8A,
  89029. +0xDE, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0xFF,
  89030. +0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4,
  89031. +0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8A, 0xCF, 0xF0, 0x90, 0x8A,
  89032. +0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x40, 0x02, 0x41, 0xCF, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84,
  89033. +0x00, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12,
  89034. +0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x5F,
  89035. +0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x5F, 0xE4, 0xF0,
  89036. +0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0xF0,
  89037. +0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x44, 0x2F,
  89038. +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x43, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
  89039. +0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x85, 0xF5,
  89040. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  89041. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  89042. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA3, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
  89043. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  89044. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
  89045. +0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x44, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4,
  89046. +0xF0, 0x74, 0x24, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x64, 0x2F,
  89047. +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, 0x01,
  89048. +0x93, 0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE,
  89049. +0xEF, 0x13, 0xFF, 0x90, 0x8A, 0xCF, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0xE1, 0xF5, 0x82, 0xE4, 0x34,
  89050. +0x86, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x29, 0x12,
  89051. +0x43, 0x5F, 0x74, 0x01, 0xF0, 0x74, 0xC1, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x86, 0xF5, 0x83, 0x74,
  89052. +0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x25, 0x12, 0x43, 0x5F, 0x74, 0xFF, 0xF0, 0xA3,
  89053. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x23, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0xA3, 0x74, 0x0F,
  89054. +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x87, 0x27, 0x12, 0x43, 0x5F, 0x74, 0x13, 0xF0, 0x75, 0xF0,
  89055. +0x09, 0xED, 0x90, 0x87, 0x28, 0x12, 0x43, 0x5F, 0xE4, 0xF0, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4,
  89056. +0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x8A, 0xCF, 0xE0, 0x04, 0xF0, 0x21, 0x3E, 0x22,
  89057. +0x12, 0x29, 0xD9, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFE,
  89058. +0x74, 0x23, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x20,
  89059. +0x0A, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0x90, 0x87, 0x21, 0xF0, 0x22, 0x12, 0x29, 0xD9, 0xF5,
  89060. +0x21, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x2A, 0x8B, 0x00,
  89061. +0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x1A, 0xF0, 0x90, 0x00, 0x03,
  89062. +0x12, 0x42, 0x20, 0x90, 0x8B, 0x0A, 0xF0, 0x12, 0x47, 0xFA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
  89063. +0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0x30, 0xE0, 0x25, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x10, 0xF0,
  89064. +0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x11, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90,
  89065. +0x8B, 0x0F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x16, 0xF0, 0x22, 0x90, 0x8B,
  89066. +0x10, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x11, 0x74, 0x05, 0xF0, 0x90, 0x8B, 0x0F, 0x74, 0x14, 0xF0,
  89067. +0x90, 0x8B, 0x16, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x29, 0xD9, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54,
  89068. +0x7F, 0x90, 0x8B, 0x15, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20, 0xFF, 0x90, 0x8B, 0x13, 0xE4,
  89069. +0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x8B, 0x15, 0x74, 0x05, 0xF0, 0x90, 0x8B, 0x13, 0xE4,
  89070. +0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x8B, 0x13, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22,
  89071. +0x12, 0x29, 0xD9, 0x90, 0x8B, 0x12, 0xF0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x45, 0xA2,
  89072. +0x90, 0x8B, 0x12, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x29,
  89073. +0xD9, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8A, 0xF7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x20,
  89074. +0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xF8, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F,
  89075. +0x90, 0x8A, 0xF9, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x42, 0x20, 0xFF, 0xED, 0x2F, 0x90, 0x8A, 0xFA,
  89076. +0xF0, 0x90, 0x00, 0x04, 0x12, 0x42, 0x20, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8A, 0xFB, 0xF0,
  89077. +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x8B, 0xE4, 0x90,
  89078. +0x8A, 0xDD, 0xF0, 0x12, 0x29, 0xD9, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xA1, 0x62, 0x90, 0x8A, 0xDA,
  89079. +0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0x54, 0xFD,
  89080. +0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x29, 0xD9,
  89081. +0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0, 0xEE, 0x54, 0x10,
  89082. +0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x29, 0xD9, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54,
  89083. +0xDF, 0x4D, 0xFF, 0x90, 0x8B, 0x32, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0,
  89084. +0x20, 0xE0, 0x02, 0xA1, 0x4F, 0x90, 0x8A, 0xDD, 0x74, 0x21, 0xF0, 0x90, 0x8A, 0xDA, 0x12, 0x43,
  89085. +0x6B, 0x12, 0x29, 0xD9, 0xFF, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13,
  89086. +0x13, 0x54, 0x01, 0x6E, 0x60, 0x2A, 0xEF, 0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0,
  89087. +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0E, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF,
  89088. +0x12, 0x36, 0xE6, 0x80, 0x0B, 0xE4, 0x90, 0x8B, 0x34, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x36, 0x75,
  89089. +0x90, 0x8B, 0x32, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD,
  89090. +0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44,
  89091. +0x14, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD,
  89092. +0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8B, 0x32, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x07,
  89093. +0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90,
  89094. +0x8B, 0x33, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x89, 0x90, 0x8B, 0x32, 0xE0, 0xC4, 0x13,
  89095. +0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x4D, 0xE0, 0xEF,
  89096. +0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x4E, 0x89, 0x7F, 0x02, 0xC1, 0xA4, 0x90,
  89097. +0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x4E, 0x89, 0x7F, 0x03,
  89098. +0xC1, 0xA4, 0x90, 0x8A, 0xDA, 0x12, 0x43, 0x6B, 0x12, 0x29, 0xD9, 0xFF, 0x54, 0x02, 0xFE, 0x90,
  89099. +0x8B, 0x2C, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F,
  89100. +0xFF, 0xF0, 0x12, 0x29, 0xD9, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x8B,
  89101. +0x2C, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x29, 0xD9, 0xFE,
  89102. +0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8B, 0x2C, 0xF0, 0xEE, 0x54, 0x04, 0xFE,
  89103. +0xEF, 0x54, 0xFB, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0x57, 0x90, 0x8A, 0xDD, 0x74, 0x31, 0xF0,
  89104. +0x90, 0x8B, 0x2C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x0B, 0xE4, 0x90, 0x8B, 0x2E, 0xF0,
  89105. +0x7D, 0x40, 0xFF, 0x12, 0x36, 0x75, 0x90, 0x8B, 0x2C, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F,
  89106. +0x30, 0xE0, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0,
  89107. +0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0x54, 0x06, 0x60, 0x0C,
  89108. +0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x37, 0x00, 0x90, 0x8A, 0xDD, 0xE0,
  89109. +0x90, 0x05, 0x27, 0xF0, 0x90, 0x8B, 0x2C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
  89110. +0x0D, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x2C, 0x7F, 0x06, 0x12, 0x7B, 0x49, 0x80, 0x25, 0x90, 0x8B,
  89111. +0x2D, 0xE0, 0xB4, 0x06, 0x1B, 0x7F, 0x01, 0x12, 0x7B, 0x49, 0xE4, 0xFF, 0x12, 0x4D, 0xE0, 0xEF,
  89112. +0x60, 0x09, 0x7D, 0x01, 0xAF, 0x23, 0x12, 0x45, 0xA2, 0x80, 0x05, 0x12, 0x4E, 0x56, 0x80, 0x03,
  89113. +0x12, 0x66, 0x20, 0x7F, 0x01, 0x80, 0x4D, 0x90, 0x8A, 0xDD, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27,
  89114. +0xF0, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x36, 0x92, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x06, 0x02, 0x80,
  89115. +0x1B, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05,
  89116. +0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09,
  89117. +0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x7B, 0x49, 0x12, 0x66, 0x13, 0x12,
  89118. +0x4A, 0xFC, 0x7F, 0x03, 0xD1, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01,
  89119. +0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x32, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0,
  89120. +0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04,
  89121. +0xED, 0xB4, 0x03, 0x15, 0x90, 0x8B, 0x2C, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3,
  89122. +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x38,
  89123. +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8A, 0xFD, 0xE0, 0x90, 0x8A, 0xE8,
  89124. +0xF0, 0x90, 0x8A, 0xFE, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8A, 0xE9, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0,
  89125. +0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
  89126. +0x8B, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xEB, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE,
  89127. +0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xDA, 0x90, 0x8A, 0xE8, 0xE0, 0x12,
  89128. +0x43, 0x94, 0x77, 0x61, 0x00, 0x78, 0xD7, 0x01, 0x77, 0x6C, 0x02, 0x77, 0x6C, 0x03, 0x77, 0x6C,
  89129. +0x04, 0x78, 0xD7, 0x05, 0x78, 0xA1, 0x80, 0x78, 0xBA, 0x81, 0x78, 0xD7, 0x82, 0x00, 0x00, 0x78,
  89130. +0xD3, 0x90, 0x8A, 0xEE, 0xE0, 0xFF, 0x12, 0x7E, 0x6E, 0x02, 0x78, 0xD7, 0x90, 0x8A, 0xE8, 0xE0,
  89131. +0xFF, 0xB4, 0x02, 0x08, 0x90, 0x8A, 0xE5, 0x74, 0x01, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x8A, 0xE5,
  89132. +0xB4, 0x03, 0x05, 0x74, 0x02, 0xF0, 0x80, 0x03, 0x74, 0x04, 0xF0, 0xC3, 0x90, 0x8A, 0xE9, 0xE0,
  89133. +0x94, 0x08, 0x50, 0x79, 0xE4, 0x90, 0x8A, 0xE4, 0xF0, 0x90, 0x8A, 0xE5, 0xE0, 0xFF, 0x90, 0x8A,
  89134. +0xE4, 0xE0, 0xC3, 0x9F, 0x40, 0x03, 0x02, 0x78, 0xD7, 0x90, 0x8A, 0xE9, 0xE0, 0xFE, 0xA3, 0xE0,
  89135. +0xFF, 0xC3, 0xEE, 0x94, 0x01, 0x90, 0x8A, 0xE4, 0xE0, 0x50, 0x1F, 0xFE, 0x2F, 0xFF, 0xEE, 0xFD,
  89136. +0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D, 0xF5, 0x82, 0x74, 0x8A,
  89137. +0x3C, 0xF5, 0x83, 0xE0, 0xFD, 0x12, 0x51, 0xFB, 0x80, 0x2B, 0xFF, 0xFD, 0xC3, 0x74, 0x03, 0x9D,
  89138. +0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0xEB, 0x2D, 0xF5, 0x82, 0x74, 0x8A, 0x3C, 0xF5, 0x83, 0xE0,
  89139. +0xFE, 0xEF, 0xFD, 0x90, 0x8A, 0xEA, 0xE0, 0x2D, 0xFD, 0x90, 0x8A, 0xE9, 0xE0, 0x34, 0x00, 0x8D,
  89140. +0x82, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8A, 0xE4, 0xE0, 0x04, 0xF0, 0x80, 0x8C, 0xC3, 0x90, 0x8A,
  89141. +0xE9, 0xE0, 0x94, 0x10, 0x40, 0x02, 0x01, 0xD7, 0x90, 0x8A, 0xE8, 0xE0, 0x64, 0x04, 0x60, 0x02,
  89142. +0x01, 0xD7, 0x90, 0x8A, 0xEC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x2A, 0x6C,
  89143. +0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xEB, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
  89144. +0xFE, 0x78, 0x18, 0x12, 0x2A, 0x6C, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43,
  89145. +0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x8A, 0xED, 0xE0, 0xFF, 0xE4, 0xFC,
  89146. +0xFD, 0xFE, 0x78, 0x08, 0x12, 0x2A, 0x6C, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12,
  89147. +0x43, 0x46, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
  89148. +0xFE, 0x12, 0x43, 0x46, 0xA3, 0x12, 0x2A, 0x7F, 0x90, 0x8A, 0xEF, 0x12, 0x43, 0x53, 0x90, 0x80,
  89149. +0x85, 0x12, 0x2A, 0x7F, 0x90, 0x8A, 0xE9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2F, 0xD9, 0x80,
  89150. +0x36, 0x90, 0x8A, 0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x8A,
  89151. +0xE6, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x54, 0x80, 0x1D, 0x90, 0x8A, 0xED, 0xE0, 0xFE, 0xA3,
  89152. +0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x8A, 0xE6, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x36,
  89153. +0xCB, 0x80, 0x04, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
  89154. +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x8A, 0xDD, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0xE4,
  89155. +0xF0, 0x90, 0x8A, 0xE2, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x8A, 0xE1, 0xF0, 0x12,
  89156. +0x29, 0xD9, 0xFF, 0x90, 0x8A, 0xE1, 0xE0, 0x2F, 0x90, 0x8A, 0xE0, 0xF0, 0x30, 0xE0, 0x0B, 0x90,
  89157. +0x8A, 0xDB, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x8A, 0xDB, 0xF0, 0xA3,
  89158. +0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x8A, 0xDD, 0xE0, 0x24,
  89159. +0x20, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFC, 0x2D, 0xFF, 0x24, 0x01, 0xF5,
  89160. +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x8A, 0xFD, 0xF0, 0x74, 0x02, 0x2F, 0xF5, 0x82,
  89161. +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0xEC, 0x2D, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
  89162. +0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xE4, 0x3E, 0x90, 0x8A, 0xFE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
  89163. +0x8A, 0xDA, 0x74, 0x04, 0xF0, 0x90, 0x8A, 0xDB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0xFF, 0x90,
  89164. +0x8A, 0xDA, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF,
  89165. +0x74, 0xFC, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8A, 0xDA, 0xE0,
  89166. +0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCF, 0x12, 0x76, 0xF2, 0xEF, 0x70, 0x45, 0x90, 0x01, 0xC3, 0xE0,
  89167. +0x60, 0x2B, 0xC3, 0x90, 0x8A, 0xE3, 0xE0, 0x94, 0xE8, 0x90, 0x8A, 0xE2, 0xE0, 0x94, 0x03, 0x40,
  89168. +0x09, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x79, 0x90, 0x8A, 0xE2, 0xE4, 0x75, 0xF0,
  89169. +0x01, 0x12, 0x42, 0x81, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x37, 0x54, 0x80, 0xCF, 0x90, 0x01, 0xC6,
  89170. +0xE0, 0x90, 0x01, 0xC3, 0x30, 0xE2, 0x05, 0x74, 0xFE, 0xF0, 0x80, 0x57, 0x74, 0xFF, 0xF0, 0x80,
  89171. +0x52, 0x90, 0x8A, 0xDD, 0xE0, 0xB4, 0x78, 0x2E, 0xE4, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0x04, 0xF0,
  89172. +0x90, 0x8A, 0xDB, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x80, 0x90, 0x8A, 0xDB, 0x70, 0x05, 0xF0,
  89173. +0xA3, 0xF0, 0x80, 0x06, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0x8A, 0xE0, 0xE0, 0xC3, 0x13,
  89174. +0x90, 0xFD, 0x10, 0xF0, 0x80, 0x07, 0x90, 0x8A, 0xDD, 0xE0, 0x24, 0x08, 0xF0, 0x90, 0x8A, 0xDE,
  89175. +0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x42, 0x81, 0x90, 0x8A, 0xDE, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60,
  89176. +0x02, 0x21, 0x32, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x29, 0xD9, 0x90, 0x8B, 0x05, 0xF0, 0x90,
  89177. +0x00, 0x01, 0x12, 0x42, 0x20, 0x90, 0x8B, 0x06, 0xF0, 0x22, 0xE4, 0xF5, 0x61, 0x22, 0x51, 0x67,
  89178. +0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x78, 0x7E,
  89179. +0x08, 0x12, 0x27, 0xDE, 0x90, 0x8B, 0x1C, 0x12, 0x2A, 0x7F, 0x7F, 0x04, 0x7E, 0x0C, 0x12, 0x27,
  89180. +0xDE, 0x90, 0x8B, 0x20, 0x12, 0x2A, 0x7F, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x27, 0xDE, 0x90, 0x8B,
  89181. +0x24, 0x12, 0x2A, 0x7F, 0x90, 0x8B, 0x09, 0xE0, 0x90, 0x8B, 0x1C, 0xB4, 0x01, 0x0D, 0x12, 0x43,
  89182. +0x53, 0xEF, 0x54, 0xC7, 0xFF, 0xED, 0x54, 0xC7, 0xFD, 0x80, 0x07, 0x12, 0x43, 0x53, 0xEF, 0x54,
  89183. +0xC7, 0xFF, 0xEC, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x78, 0x7E, 0x08, 0x12, 0x2F, 0xD9,
  89184. +0x90, 0x8B, 0x20, 0x12, 0x43, 0x53, 0xEF, 0x54, 0x0F, 0xFF, 0xEC, 0x90, 0x80, 0x85, 0x12, 0x2A,
  89185. +0x7F, 0x7F, 0x04, 0x7E, 0x0C, 0x12, 0x2F, 0xD9, 0x90, 0x8B, 0x24, 0x12, 0x43, 0x53, 0xEF, 0x44,
  89186. +0x02, 0xFF, 0xEC, 0x90, 0x80, 0x85, 0x12, 0x2A, 0x7F, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2F, 0xD9,
  89187. +0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x27, 0xDE, 0x90, 0x8B, 0x28, 0x12, 0x2A, 0x7F, 0x90, 0x80, 0x85,
  89188. +0x12, 0x2A, 0x8B, 0x00, 0x1B, 0x25, 0xA0, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2F, 0xD9, 0x90, 0x80,
  89189. +0x59, 0x12, 0x2A, 0x8B, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x12, 0x34, 0x81, 0x90, 0x8B,
  89190. +0x09, 0xE0, 0xB4, 0x01, 0x11, 0x90, 0x80, 0x59, 0x12, 0x2A, 0x8B, 0x00, 0x00, 0x00, 0x00, 0xE4,
  89191. +0xFD, 0x7F, 0x01, 0x12, 0x34, 0x81, 0x22, 0x51, 0x6D, 0x90, 0x8B, 0x33, 0x74, 0x02, 0xF0, 0x22,
  89192. +0x51, 0x67, 0x90, 0x8B, 0x2D, 0x74, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
  89193. +0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xA1, 0x15, 0xEF, 0x12, 0x43, 0x94, 0x7B, 0x77,
  89194. +0x00, 0x7B, 0xB1, 0x01, 0x7B, 0xF7, 0x02, 0x7C, 0x31, 0x03, 0x7C, 0x69, 0x04, 0x7C, 0xA2, 0x05,
  89195. +0x7C, 0xDD, 0x06, 0x00, 0x00, 0x7D, 0x15, 0xEE, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xB1, 0x48, 0xA1,
  89196. +0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xFF, 0xB4, 0x05, 0x04, 0xB1, 0x24, 0xA1, 0x15, 0xEF, 0xB4, 0x06,
  89197. +0x06, 0x7F, 0x01, 0xB1, 0x39, 0x80, 0x16, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x03, 0x06, 0x7F, 0x01,
  89198. +0xB1, 0x1A, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xB1, 0x2E, 0xB1, 0x6B, 0xA1,
  89199. +0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xB1, 0x48, 0x80, 0x09, 0x90, 0x8B,
  89200. +0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xB1, 0x24, 0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xB1, 0x61, 0xA1,
  89201. +0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xB1, 0x39, 0xA1, 0x15, 0xEE,
  89202. +0xB4, 0x03, 0x06, 0x7F, 0x01, 0xB1, 0x1A, 0xA1, 0x15, 0x90, 0x8B, 0x2D, 0xE0, 0x64, 0x02, 0x60,
  89203. +0x02, 0xA1, 0x15, 0xB1, 0x2E, 0xA1, 0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01,
  89204. +0xB1, 0x48, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xB1, 0x24, 0x90, 0x8B, 0x2D,
  89205. +0xE0, 0x70, 0x04, 0xB1, 0x61, 0x80, 0x16, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F,
  89206. +0x01, 0xB1, 0x39, 0x80, 0x08, 0xEE, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0xB1, 0x1A, 0xB1, 0x8D, 0xA1,
  89207. +0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xB1, 0x48, 0x80, 0x09, 0x90, 0x8B,
  89208. +0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xB1, 0x24, 0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xB1, 0x61, 0x80,
  89209. +0x14, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xB1, 0x39, 0x80, 0x06, 0xEE,
  89210. +0xB4, 0x02, 0x02, 0xB1, 0x2E, 0xB1, 0x76, 0xA1, 0x15, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06,
  89211. +0x06, 0xE4, 0xFF, 0xB1, 0x39, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xB1, 0x1A, 0x80,
  89212. +0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02, 0x02, 0xB1, 0x2E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01,
  89213. +0x04, 0xB1, 0x6B, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05, 0x02, 0xB1, 0x24, 0x71, 0x40,
  89214. +0x80, 0x73, 0x90, 0x8B, 0x2D, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xB1, 0x39, 0x80, 0x13,
  89215. +0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xB1, 0x1A, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02,
  89216. +0x02, 0xB1, 0x2E, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x6B, 0x80, 0x0B, 0x90, 0x8B,
  89217. +0x2D, 0xE0, 0xB4, 0x04, 0x04, 0x7F, 0x01, 0xB1, 0x48, 0xB1, 0x80, 0x80, 0x38, 0x90, 0x8B, 0x2D,
  89218. +0xE0, 0xB4, 0x04, 0x06, 0x7F, 0x01, 0xB1, 0x48, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x05,
  89219. +0x02, 0xB1, 0x24, 0x90, 0x8B, 0x2D, 0xE0, 0x70, 0x04, 0xB1, 0x61, 0x80, 0x16, 0x90, 0x8B, 0x2D,
  89220. +0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xB1, 0x1A, 0x80, 0x09, 0x90, 0x8B, 0x2D, 0xE0, 0xB4, 0x02,
  89221. +0x02, 0xB1, 0x2E, 0xB1, 0x9A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x4A, 0xB2, 0x90, 0x8B, 0x2D,
  89222. +0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x90, 0x05,
  89223. +0x22, 0xE4, 0xF0, 0x90, 0x8B, 0x2D, 0x04, 0xF0, 0x22, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4,
  89224. +0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x8B, 0x56, 0xEF, 0xF0, 0x12, 0x4F, 0xED,
  89225. +0x90, 0x8B, 0x56, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x8B, 0x2D, 0xF0,
  89226. +0x22, 0x12, 0x4A, 0xCC, 0x90, 0x8B, 0x2D, 0x74, 0x01, 0xF0, 0x22, 0x7F, 0x01, 0x12, 0x4A, 0x7C,
  89227. +0xE4, 0x90, 0x8B, 0x2D, 0xF0, 0x22, 0x12, 0x4A, 0x32, 0x90, 0x8B, 0x2D, 0x74, 0x03, 0xF0, 0x22,
  89228. +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x05, 0x22,
  89229. +0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x2D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0,
  89230. +0x90, 0x8B, 0x2D, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x8B, 0x33,
  89231. +0x74, 0x04, 0xF0, 0x22, 0x12, 0x4F, 0xED, 0x90, 0x8B, 0x33, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01,
  89232. +0x57, 0xE0, 0x60, 0x3C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90,
  89233. +0x8B, 0x1B, 0xE0, 0x60, 0x07, 0xE4, 0xF0, 0x53, 0x25, 0xFD, 0x80, 0x24, 0x90, 0x8B, 0x0C, 0xE0,
  89234. +0x04, 0xF0, 0x53, 0x25, 0xEF, 0x90, 0x8B, 0x10, 0xE0, 0xFF, 0x90, 0x8B, 0x0C, 0xE0, 0xD3, 0x9F,
  89235. +0x40, 0x0E, 0xE5, 0x21, 0xB4, 0x01, 0x09, 0x90, 0x8B, 0x0D, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0,
  89236. +0x90, 0x01, 0x5B, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04,
  89237. +0xF0, 0xE4, 0x90, 0x8B, 0x18, 0xF0, 0x90, 0x01, 0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4,
  89238. +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x8B, 0x17, 0xF0, 0x22, 0xE4, 0x90, 0x8B,
  89239. +0x4F, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0,
  89240. +0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x8B, 0x50, 0xE0, 0x94, 0xE8,
  89241. +0x90, 0x8B, 0x4F, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12,
  89242. +0x37, 0x54, 0x90, 0x8B, 0x4F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x81, 0x80, 0xC6, 0x8F, 0x0F,
  89243. +0xE4, 0x90, 0x8A, 0xF3, 0xF0, 0xE5, 0x0F, 0x14, 0xFE, 0x90, 0x8A, 0xF3, 0xE0, 0xFF, 0xC3, 0x9E,
  89244. +0x50, 0x0E, 0xEF, 0x04, 0xFD, 0x12, 0x34, 0xB7, 0x90, 0x8A, 0xF3, 0xE0, 0x04, 0xF0, 0x80, 0xE5,
  89245. +0xE5, 0x0F, 0x14, 0xFF, 0x7D, 0xFF, 0x12, 0x34, 0xB7, 0x90, 0x8A, 0xF3, 0xE5, 0x0F, 0xF0, 0x90,
  89246. +0x8A, 0xF3, 0xE0, 0xC3, 0x94, 0xFF, 0x50, 0x0F, 0xE0, 0xFF, 0x04, 0xFD, 0x12, 0x34, 0xB7, 0x90,
  89247. +0x8A, 0xF3, 0xE0, 0x04, 0xF0, 0x80, 0xE8, 0xAD, 0x0F, 0x7F, 0xFF, 0x02, 0x34, 0xB7, 0xDC, 0xD3,
  89248. +};
  89249. +#endif
  89250. +
  89251. +//8188C_Formal_All_PHYforMP_111117 2011-11-23
  89252. +//8192C_Formal_92CU_PHYforMP_110817 2011-11-23
  89253. +
  89254. +u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength] = {
  89255. +0x024,0x0011800f,
  89256. +0x028,0x00ffdb83,
  89257. +0x800,0x80040002,
  89258. +0x804,0x00000003,
  89259. +0x808,0x0000fc00,
  89260. +0x80c,0x0000000a,
  89261. +0x810,0x10000330, //for Broadcom AP IOT
  89262. +0x814,0x020c3d10,
  89263. +0x818,0x02200385,
  89264. +0x81c,0x00000000,
  89265. +0x820,0x01000100,
  89266. +0x824,0x00390004,
  89267. +0x828,0x01000100,
  89268. +0x82c,0x00390004,
  89269. +0x830,0x27272727,
  89270. +0x834,0x27272727,
  89271. +0x838,0x27272727,
  89272. +0x83c,0x27272727,
  89273. +0x840,0x00010000,
  89274. +0x844,0x00010000,
  89275. +0x848,0x27272727,
  89276. +0x84c,0x27272727,
  89277. +0x850,0x00000000,
  89278. +0x854,0x00000000,
  89279. +0x858,0x569a569a,
  89280. +0x85c,0x0c1b25a4,
  89281. +0x860,0x66e60230,
  89282. +0x864,0x061f0130,
  89283. +0x868,0x27272727,
  89284. +0x86c,0x2b2b2b27,
  89285. +0x870,0x07000700,
  89286. +0x874,0x22184000,
  89287. +0x878,0x08080808,
  89288. +0x87c,0x00000000,
  89289. +0x880,0xc0083070,
  89290. +0x884,0x000004d5,
  89291. +0x888,0x00000000,
  89292. +0x88c,0xcc0000c0,
  89293. +0x890,0x00000800,
  89294. +0x894,0xfffffffe,
  89295. +0x898,0x40302010,
  89296. +0x89c,0x00706050,
  89297. +0x900,0x00000000,
  89298. +0x904,0x00000023,
  89299. +0x908,0x00000000,
  89300. +0x90c,0x81121313,
  89301. +0xa00,0x00d047c8,
  89302. +0xa04,0x80ff000c,
  89303. +0xa08,0x8c838300,
  89304. +0xa0c,0x2e68120f,
  89305. +0xa10,0x9500bb78,
  89306. +0xa14,0x11144028,
  89307. +0xa18,0x00881117,
  89308. +0xa1c,0x89140f00,
  89309. +0xa20,0x1a1b0000,
  89310. +0xa24,0x090e1317,
  89311. +0xa28,0x00000204,
  89312. +0xa2c,0x00d30000,
  89313. +0xa70,0x101fbf00,
  89314. +0xa74,0x00000007,
  89315. +0xc00,0x48071d40,
  89316. +0xc04,0x03a05633,
  89317. +0xc08,0x000000e4,
  89318. +0xc0c,0x6c6c6c6c,
  89319. +0xc10,0x08800000,
  89320. +0xc14,0x40000100,
  89321. +0xc18,0x08800000,
  89322. +0xc1c,0x40000100,
  89323. +0xc20,0x00000000,
  89324. +0xc24,0x00000000,
  89325. +0xc28,0x00000000,
  89326. +0xc2c,0x00000000,
  89327. +0xc30,0x69e9ac44,
  89328. +0xc34,0x469652cf,
  89329. +0xc38,0x49795994,
  89330. +0xc3c,0x0a97971c,
  89331. +0xc40,0x1f7c403f,
  89332. +0xc44,0x000100b7,
  89333. +0xc48,0xec020107,
  89334. +0xc4c,0x007f037f,
  89335. +0xc50,0x69543420,
  89336. +0xc54,0x43bc0094,
  89337. +0xc58,0x69543420,
  89338. +0xc5c,0x433c0094,
  89339. +0xc60,0x00000000,
  89340. +0xc64,0x5116848b,
  89341. +0xc68,0x47c00bff,
  89342. +0xc6c,0x00000036,
  89343. +0xc70,0x2c7f000d,
  89344. +0xc74,0x2186115b,
  89345. +0xc78,0x0000001f,
  89346. +0xc7c,0x00b99612,
  89347. +0xc80,0x40000100,
  89348. +0xc84,0x20f60000,
  89349. +0xc88,0x40000100,
  89350. +0xc8c,0xa0e40000,
  89351. +0xc90,0x00121820,
  89352. +0xc94,0x00000000,
  89353. +0xc98,0x00121820,
  89354. +0xc9c,0x00007f7f,
  89355. +0xca0,0x00000000,
  89356. +0xca4,0x00000080,
  89357. +0xca8,0x00000000,
  89358. +0xcac,0x00000000,
  89359. +0xcb0,0x00000000,
  89360. +0xcb4,0x00000000,
  89361. +0xcb8,0x00000000,
  89362. +0xcbc,0x28000000,
  89363. +0xcc0,0x00000000,
  89364. +0xcc4,0x00000000,
  89365. +0xcc8,0x00000000,
  89366. +0xccc,0x00000000,
  89367. +0xcd0,0x00000000,
  89368. +0xcd4,0x00000000,
  89369. +0xcd8,0x64b22427,
  89370. +0xcdc,0x00766932,
  89371. +0xce0,0x00222222,
  89372. +0xce4,0x00000000,
  89373. +0xce8,0x37644302,
  89374. +0xcec,0x2f97d40c,
  89375. +0xd00,0x00080740,
  89376. +0xd04,0x00020403,
  89377. +0xd08,0x0000907f,
  89378. +0xd0c,0x20010201,
  89379. +0xd10,0xa0633333,
  89380. +0xd14,0x3333bc43,
  89381. +0xd18,0x7a8f5b6b,
  89382. +0xd2c,0xcc979975,
  89383. +0xd30,0x00000000,
  89384. +0xd34,0x80608000,
  89385. +0xd38,0x00000000,
  89386. +0xd3c,0x00027293,
  89387. +0xd40,0x00000000,
  89388. +0xd44,0x00000000,
  89389. +0xd48,0x00000000,
  89390. +0xd4c,0x00000000,
  89391. +0xd50,0x6437140a,
  89392. +0xd54,0x00000000,
  89393. +0xd58,0x00000000,
  89394. +0xd5c,0x30032064,
  89395. +0xd60,0x4653de68,
  89396. +0xd64,0x04518a3c,
  89397. +0xd68,0x00002101,
  89398. +0xd6c,0x2a201c16,
  89399. +0xd70,0x1812362e,
  89400. +0xd74,0x322c2220,
  89401. +0xd78,0x000e3c24,
  89402. +0xe00,0x2a2a2a2a,
  89403. +0xe04,0x2a2a2a2a,
  89404. +0xe08,0x03902a2a,
  89405. +0xe10,0x2a2a2a2a,
  89406. +0xe14,0x2a2a2a2a,
  89407. +0xe18,0x2a2a2a2a,
  89408. +0xe1c,0x2a2a2a2a,
  89409. +0xe28,0x00000000,
  89410. +0xe30,0x1000dc1f,
  89411. +0xe34,0x10008c1f,
  89412. +0xe38,0x02140102,
  89413. +0xe3c,0x681604c2,
  89414. +0xe40,0x01007c00,
  89415. +0xe44,0x01004800,
  89416. +0xe48,0xfb000000,
  89417. +0xe4c,0x000028d1,
  89418. +0xe50,0x1000dc1f,
  89419. +0xe54,0x10008c1f,
  89420. +0xe58,0x02140102,
  89421. +0xe5c,0x28160d05,
  89422. +0xe60,0x00000010,
  89423. +0xe68,0x001b25a4,
  89424. +0xe6c,0x63db25a4,
  89425. +0xe70,0x63db25a4,
  89426. +0xe74,0x0c1b25a4,
  89427. +0xe78,0x0c1b25a4,
  89428. +0xe7c,0x0c1b25a4,
  89429. +0xe80,0x0c1b25a4,
  89430. +0xe84,0x63db25a4,
  89431. +0xe88,0x0c1b25a4,
  89432. +0xe8c,0x63db25a4,
  89433. +0xed0,0x63db25a4,
  89434. +0xed4,0x63db25a4,
  89435. +0xed8,0x63db25a4,
  89436. +0xedc,0x001b25a4,
  89437. +0xee0,0x001b25a4,
  89438. +0xeec,0x6fdb25a4,
  89439. +0xf14,0x00000003,
  89440. +0xf4c,0x00000000,
  89441. +0xf00,0x00000300,
  89442. +};
  89443. +
  89444. +u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength] = {
  89445. +0x024,0x0011800f,
  89446. +0x028,0x00ffdb83,
  89447. +0x800,0x80040000,
  89448. +0x804,0x00000001,
  89449. +0x808,0x0000fc00,
  89450. +0x80c,0x0000000a,
  89451. +0x810,0x10000330, //for Broadcom AP IOT
  89452. +0x814,0x020c3d10,
  89453. +0x818,0x02200385,
  89454. +0x81c,0x00000000,
  89455. +0x820,0x01000100,
  89456. +0x824,0x00390004,
  89457. +0x828,0x00000000,
  89458. +0x82c,0x00000000,
  89459. +0x830,0x00000000,
  89460. +0x834,0x00000000,
  89461. +0x838,0x00000000,
  89462. +0x83c,0x00000000,
  89463. +0x840,0x00010000,
  89464. +0x844,0x00000000,
  89465. +0x848,0x00000000,
  89466. +0x84c,0x00000000,
  89467. +0x850,0x00000000,
  89468. +0x854,0x00000000,
  89469. +0x858,0x569a569a,
  89470. +0x85c,0x001b25a4,
  89471. +0x860,0x66e60230,
  89472. +0x864,0x061f0130,
  89473. +0x868,0x00000000,
  89474. +0x86c,0x32323200,
  89475. +0x870,0x07000700,
  89476. +0x874,0x22004000,
  89477. +0x878,0x00000808,
  89478. +0x87c,0x00000000,
  89479. +0x880,0xc0083070,
  89480. +0x884,0x000004d5,
  89481. +0x888,0x00000000,
  89482. +0x88c,0xccc000c0,
  89483. +0x890,0x00000800,
  89484. +0x894,0xfffffffe,
  89485. +0x898,0x40302010,
  89486. +0x89c,0x00706050,
  89487. +0x900,0x00000000,
  89488. +0x904,0x00000023,
  89489. +0x908,0x00000000,
  89490. +0x90c,0x81121111,
  89491. +0xa00,0x00d047c8,
  89492. +0xa04,0x80ff000c,
  89493. +0xa08,0x8c838300,
  89494. +0xa0c,0x2e68120f,
  89495. +0xa10,0x9500bb78,
  89496. +0xa14,0x11144028,
  89497. +0xa18,0x00881117,
  89498. +0xa1c,0x89140f00,
  89499. +0xa20,0x1a1b0000,
  89500. +0xa24,0x090e1317,
  89501. +0xa28,0x00000204,
  89502. +0xa2c,0x00d30000,
  89503. +0xa70,0x101fbf00,
  89504. +0xa74,0x00000007,
  89505. +0xc00,0x48071d40,
  89506. +0xc04,0x03a05611,
  89507. +0xc08,0x000000e4,
  89508. +0xc0c,0x6c6c6c6c,
  89509. +0xc10,0x08800000,
  89510. +0xc14,0x40000100,
  89511. +0xc18,0x08800000,
  89512. +0xc1c,0x40000100,
  89513. +0xc20,0x00000000,
  89514. +0xc24,0x00000000,
  89515. +0xc28,0x00000000,
  89516. +0xc2c,0x00000000,
  89517. +0xc30,0x69e9ac44,
  89518. +0xc34,0x469652cf,
  89519. +0xc38,0x49795994,
  89520. +0xc3c,0x0a97971c,
  89521. +0xc40,0x1f7c403f,
  89522. +0xc44,0x000100b7,
  89523. +0xc48,0xec020107,
  89524. +0xc4c,0x007f037f,
  89525. +0xc50,0x69543420,
  89526. +0xc54,0x43bc0094,
  89527. +0xc58,0x69543420,
  89528. +0xc5c,0x433c0094,
  89529. +0xc60,0x00000000,
  89530. +0xc64,0x5116848b,
  89531. +0xc68,0x47c00bff,
  89532. +0xc6c,0x00000036,
  89533. +0xc70,0x2c7f000d,
  89534. +0xc74,0x018610db,
  89535. +0xc78,0x0000001f,
  89536. +0xc7c,0x00b91612,
  89537. +0xc80,0x40000100,
  89538. +0xc84,0x20f60000,
  89539. +0xc88,0x40000100,
  89540. +0xc8c,0x20200000,
  89541. +0xc90,0x00121820,
  89542. +0xc94,0x00000000,
  89543. +0xc98,0x00121820,
  89544. +0xc9c,0x00007f7f,
  89545. +0xca0,0x00000000,
  89546. +0xca4,0x00000080,
  89547. +0xca8,0x00000000,
  89548. +0xcac,0x00000000,
  89549. +0xcb0,0x00000000,
  89550. +0xcb4,0x00000000,
  89551. +0xcb8,0x00000000,
  89552. +0xcbc,0x28000000,
  89553. +0xcc0,0x00000000,
  89554. +0xcc4,0x00000000,
  89555. +0xcc8,0x00000000,
  89556. +0xccc,0x00000000,
  89557. +0xcd0,0x00000000,
  89558. +0xcd4,0x00000000,
  89559. +0xcd8,0x64b22427,
  89560. +0xcdc,0x00766932,
  89561. +0xce0,0x00222222,
  89562. +0xce4,0x00000000,
  89563. +0xce8,0x37644302,
  89564. +0xcec,0x2f97d40c,
  89565. +0xd00,0x00000740,
  89566. +0xd04,0x00020401,
  89567. +0xd08,0x0000907f,
  89568. +0xd0c,0x20010201,
  89569. +0xd10,0xa0633333,
  89570. +0xd14,0x3333bc43,
  89571. +0xd18,0x7a8f5b6b,
  89572. +0xd2c,0xcc979975,
  89573. +0xd30,0x00000000,
  89574. +0xd34,0x80608000,
  89575. +0xd38,0x00000000,
  89576. +0xd3c,0x00027293,
  89577. +0xd40,0x00000000,
  89578. +0xd44,0x00000000,
  89579. +0xd48,0x00000000,
  89580. +0xd4c,0x00000000,
  89581. +0xd50,0x6437140a,
  89582. +0xd54,0x00000000,
  89583. +0xd58,0x00000000,
  89584. +0xd5c,0x30032064,
  89585. +0xd60,0x4653de68,
  89586. +0xd64,0x04518a3c,
  89587. +0xd68,0x00002101,
  89588. +0xd6c,0x2a201c16,
  89589. +0xd70,0x1812362e,
  89590. +0xd74,0x322c2220,
  89591. +0xd78,0x000e3c24,
  89592. +0xe00,0x2a2a2a2a,
  89593. +0xe04,0x2a2a2a2a,
  89594. +0xe08,0x03902a2a,
  89595. +0xe10,0x2a2a2a2a,
  89596. +0xe14,0x2a2a2a2a,
  89597. +0xe18,0x2a2a2a2a,
  89598. +0xe1c,0x2a2a2a2a,
  89599. +0xe28,0x00000000,
  89600. +0xe30,0x1000dc1f,
  89601. +0xe34,0x10008c1f,
  89602. +0xe38,0x02140102,
  89603. +0xe3c,0x681604c2,
  89604. +0xe40,0x01007c00,
  89605. +0xe44,0x01004800,
  89606. +0xe48,0xfb000000,
  89607. +0xe4c,0x000028d1,
  89608. +0xe50,0x1000dc1f,
  89609. +0xe54,0x10008c1f,
  89610. +0xe58,0x02140102,
  89611. +0xe5c,0x28160d05,
  89612. +0xe60,0x00000008,
  89613. +0xe68,0x001b25a4,
  89614. +0xe6c,0x631b25a0,
  89615. +0xe70,0x631b25a0,
  89616. +0xe74,0x081b25a0,
  89617. +0xe78,0x081b25a0,
  89618. +0xe7c,0x081b25a0,
  89619. +0xe80,0x081b25a0,
  89620. +0xe84,0x631b25a0,
  89621. +0xe88,0x081b25a0,
  89622. +0xe8c,0x631b25a0,
  89623. +0xed0,0x631b25a0,
  89624. +0xed4,0x631b25a0,
  89625. +0xed8,0x631b25a0,
  89626. +0xedc,0x001b25a0,
  89627. +0xee0,0x001b25a0,
  89628. +0xeec,0x6b1b25a0,
  89629. +0xf14,0x00000003,
  89630. +0xf4c,0x00000000,
  89631. +0xf00,0x00000300,
  89632. +};
  89633. +
  89634. +u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength] = {
  89635. +0x0, };
  89636. +
  89637. +u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength] = {
  89638. +0x0, };
  89639. +
  89640. +u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength] = {
  89641. +0x0, };
  89642. +
  89643. +u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength] = {
  89644. +0xe00,0xffffffff,0x07090c0c,
  89645. +0xe04,0xffffffff,0x01020405,
  89646. +0xe08,0x0000ff00,0x00000000,
  89647. +0x86c,0xffffff00,0x00000000,
  89648. +0xe10,0xffffffff,0x0b0c0c0e,
  89649. +0xe14,0xffffffff,0x01030506,
  89650. +0xe18,0xffffffff,0x0b0c0d0e,
  89651. +0xe1c,0xffffffff,0x01030509,
  89652. +0x830,0xffffffff,0x07090c0c,
  89653. +0x834,0xffffffff,0x01020405,
  89654. +0x838,0xffffff00,0x00000000,
  89655. +0x86c,0x000000ff,0x00000000,
  89656. +0x83c,0xffffffff,0x0b0c0d0e,
  89657. +0x848,0xffffffff,0x01030509,
  89658. +0x84c,0xffffffff,0x0b0c0d0e,
  89659. +0x868,0xffffffff,0x01030509,
  89660. +0xe00,0xffffffff,0x00000000,
  89661. +0xe04,0xffffffff,0x00000000,
  89662. +0xe08,0x0000ff00,0x00000000,
  89663. +0x86c,0xffffff00,0x00000000,
  89664. +0xe10,0xffffffff,0x00000000,
  89665. +0xe14,0xffffffff,0x00000000,
  89666. +0xe18,0xffffffff,0x00000000,
  89667. +0xe1c,0xffffffff,0x00000000,
  89668. +0x830,0xffffffff,0x00000000,
  89669. +0x834,0xffffffff,0x00000000,
  89670. +0x838,0xffffff00,0x00000000,
  89671. +0x86c,0x000000ff,0x00000000,
  89672. +0x83c,0xffffffff,0x00000000,
  89673. +0x848,0xffffffff,0x00000000,
  89674. +0x84c,0xffffffff,0x00000000,
  89675. +0x868,0xffffffff,0x00000000,
  89676. +0xe00,0xffffffff,0x04040404,
  89677. +0xe04,0xffffffff,0x00020204,
  89678. +0xe08,0x0000ff00,0x00000000,
  89679. +0x86c,0xffffff00,0x00000000,
  89680. +0xe10,0xffffffff,0x06060606,
  89681. +0xe14,0xffffffff,0x00020406,
  89682. +0xe18,0xffffffff,0x00000000,
  89683. +0xe1c,0xffffffff,0x00000000,
  89684. +0x830,0xffffffff,0x04040404,
  89685. +0x834,0xffffffff,0x00020204,
  89686. +0x838,0xffffff00,0x00000000,
  89687. +0x86c,0x000000ff,0x00000000,
  89688. +0x83c,0xffffffff,0x06060606,
  89689. +0x848,0xffffffff,0x00020406,
  89690. +0x84c,0xffffffff,0x00000000,
  89691. +0x868,0xffffffff,0x00000000,
  89692. +0xe00,0xffffffff,0x00000000,
  89693. +0xe04,0xffffffff,0x00000000,
  89694. +0xe08,0x0000ff00,0x00000000,
  89695. +0x86c,0xffffff00,0x00000000,
  89696. +0xe10,0xffffffff,0x00000000,
  89697. +0xe14,0xffffffff,0x00000000,
  89698. +0xe18,0xffffffff,0x00000000,
  89699. +0xe1c,0xffffffff,0x00000000,
  89700. +0x830,0xffffffff,0x00000000,
  89701. +0x834,0xffffffff,0x00000000,
  89702. +0x838,0xffffff00,0x00000000,
  89703. +0x86c,0x000000ff,0x00000000,
  89704. +0x83c,0xffffffff,0x00000000,
  89705. +0x848,0xffffffff,0x00000000,
  89706. +0x84c,0xffffffff,0x00000000,
  89707. +0x868,0xffffffff,0x00000000,
  89708. +0xe00,0xffffffff,0x00000000,
  89709. +0xe04,0xffffffff,0x00000000,
  89710. +0xe08,0x0000ff00,0x00000000,
  89711. +0x86c,0xffffff00,0x00000000,
  89712. +0xe10,0xffffffff,0x00000000,
  89713. +0xe14,0xffffffff,0x00000000,
  89714. +0xe18,0xffffffff,0x00000000,
  89715. +0xe1c,0xffffffff,0x00000000,
  89716. +0x830,0xffffffff,0x00000000,
  89717. +0x834,0xffffffff,0x00000000,
  89718. +0x838,0xffffff00,0x00000000,
  89719. +0x86c,0x000000ff,0x00000000,
  89720. +0x83c,0xffffffff,0x00000000,
  89721. +0x848,0xffffffff,0x00000000,
  89722. +0x84c,0xffffffff,0x00000000,
  89723. +0x868,0xffffffff,0x00000000,
  89724. +0xe00,0xffffffff,0x04040404,
  89725. +0xe04,0xffffffff,0x00020204,
  89726. +0xe08,0x0000ff00,0x00000000,
  89727. +0x86c,0xffffff00,0x00000000,
  89728. +0xe10,0xffffffff,0x00000000,
  89729. +0xe14,0xffffffff,0x00000000,
  89730. +0xe18,0xffffffff,0x00000000,
  89731. +0xe1c,0xffffffff,0x00000000,
  89732. +0x830,0xffffffff,0x04040404,
  89733. +0x834,0xffffffff,0x00020204,
  89734. +0x838,0xffffff00,0x00000000,
  89735. +0x86c,0x000000ff,0x00000000,
  89736. +0x83c,0xffffffff,0x00000000,
  89737. +0x848,0xffffffff,0x00000000,
  89738. +0x84c,0xffffffff,0x00000000,
  89739. +0x868,0xffffffff,0x00000000,
  89740. +0xe00,0xffffffff,0x00000000,
  89741. +0xe04,0xffffffff,0x00000000,
  89742. +0xe08,0x0000ff00,0x00000000,
  89743. +0x86c,0xffffff00,0x00000000,
  89744. +0xe10,0xffffffff,0x00000000,
  89745. +0xe14,0xffffffff,0x00000000,
  89746. +0xe18,0xffffffff,0x00000000,
  89747. +0xe1c,0xffffffff,0x00000000,
  89748. +0x830,0xffffffff,0x00000000,
  89749. +0x834,0xffffffff,0x00000000,
  89750. +0x838,0xffffff00,0x00000000,
  89751. +0x86c,0x000000ff,0x00000000,
  89752. +0x83c,0xffffffff,0x00000000,
  89753. +0x848,0xffffffff,0x00000000,
  89754. +0x84c,0xffffffff,0x00000000,
  89755. +0x868,0xffffffff,0x00000000,
  89756. +};
  89757. +
  89758. +u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength] = {
  89759. +0xe00,0xffffffff,0x0a0c0c0c,
  89760. +0xe04,0xffffffff,0x02040608,
  89761. +0xe08,0x0000ff00,0x00000000,
  89762. +0x86c,0xffffff00,0x00000000,
  89763. +0xe10,0xffffffff,0x0a0c0d0e,
  89764. +0xe14,0xffffffff,0x02040608,
  89765. +0xe18,0xffffffff,0x0a0c0d0e,
  89766. +0xe1c,0xffffffff,0x02040608,
  89767. +0x830,0xffffffff,0x0a0c0c0c,
  89768. +0x834,0xffffffff,0x02040608,
  89769. +0x838,0xffffff00,0x00000000,
  89770. +0x86c,0x000000ff,0x00000000,
  89771. +0x83c,0xffffffff,0x0a0c0d0e,
  89772. +0x848,0xffffffff,0x02040608,
  89773. +0x84c,0xffffffff,0x0a0c0d0e,
  89774. +0x868,0xffffffff,0x02040608,
  89775. +0xe00,0xffffffff,0x00000000,
  89776. +0xe04,0xffffffff,0x00000000,
  89777. +0xe08,0x0000ff00,0x00000000,
  89778. +0x86c,0xffffff00,0x00000000,
  89779. +0xe10,0xffffffff,0x00000000,
  89780. +0xe14,0xffffffff,0x00000000,
  89781. +0xe18,0xffffffff,0x00000000,
  89782. +0xe1c,0xffffffff,0x00000000,
  89783. +0x830,0xffffffff,0x00000000,
  89784. +0x834,0xffffffff,0x00000000,
  89785. +0x838,0xffffff00,0x00000000,
  89786. +0x86c,0x000000ff,0x00000000,
  89787. +0x83c,0xffffffff,0x00000000,
  89788. +0x848,0xffffffff,0x00000000,
  89789. +0x84c,0xffffffff,0x00000000,
  89790. +0x868,0xffffffff,0x00000000,
  89791. +0xe00,0xffffffff,0x04040404,
  89792. +0xe04,0xffffffff,0x00020204,
  89793. +0xe08,0x0000ff00,0x00000000,
  89794. +0x86c,0xffffff00,0x00000000,
  89795. +0xe10,0xffffffff,0x06060606,
  89796. +0xe14,0xffffffff,0x00020406,
  89797. +0xe18,0xffffffff,0x00000000,
  89798. +0xe1c,0xffffffff,0x00000000,
  89799. +0x830,0xffffffff,0x04040404,
  89800. +0x834,0xffffffff,0x00020204,
  89801. +0x838,0xffffff00,0x00000000,
  89802. +0x86c,0x000000ff,0x00000000,
  89803. +0x83c,0xffffffff,0x06060606,
  89804. +0x848,0xffffffff,0x00020406,
  89805. +0x84c,0xffffffff,0x00000000,
  89806. +0x868,0xffffffff,0x00000000,
  89807. +0xe00,0xffffffff,0x00000000,
  89808. +0xe04,0xffffffff,0x00000000,
  89809. +0xe08,0x0000ff00,0x00000000,
  89810. +0x86c,0xffffff00,0x00000000,
  89811. +0xe10,0xffffffff,0x00000000,
  89812. +0xe14,0xffffffff,0x00000000,
  89813. +0xe18,0xffffffff,0x00000000,
  89814. +0xe1c,0xffffffff,0x00000000,
  89815. +0x830,0xffffffff,0x00000000,
  89816. +0x834,0xffffffff,0x00000000,
  89817. +0x838,0xffffff00,0x00000000,
  89818. +0x86c,0x000000ff,0x00000000,
  89819. +0x83c,0xffffffff,0x00000000,
  89820. +0x848,0xffffffff,0x00000000,
  89821. +0x84c,0xffffffff,0x00000000,
  89822. +0x868,0xffffffff,0x00000000,
  89823. +0xe00,0xffffffff,0x00000000,
  89824. +0xe04,0xffffffff,0x00000000,
  89825. +0xe08,0x0000ff00,0x00000000,
  89826. +0x86c,0xffffff00,0x00000000,
  89827. +0xe10,0xffffffff,0x00000000,
  89828. +0xe14,0xffffffff,0x00000000,
  89829. +0xe18,0xffffffff,0x00000000,
  89830. +0xe1c,0xffffffff,0x00000000,
  89831. +0x830,0xffffffff,0x00000000,
  89832. +0x834,0xffffffff,0x00000000,
  89833. +0x838,0xffffff00,0x00000000,
  89834. +0x86c,0x000000ff,0x00000000,
  89835. +0x83c,0xffffffff,0x00000000,
  89836. +0x848,0xffffffff,0x00000000,
  89837. +0x84c,0xffffffff,0x00000000,
  89838. +0x868,0xffffffff,0x00000000,
  89839. +0xe00,0xffffffff,0x04040404,
  89840. +0xe04,0xffffffff,0x00020204,
  89841. +0xe08,0x0000ff00,0x00000000,
  89842. +0x86c,0xffffff00,0x00000000,
  89843. +0xe10,0xffffffff,0x00000000,
  89844. +0xe14,0xffffffff,0x00000000,
  89845. +0xe18,0xffffffff,0x00000000,
  89846. +0xe1c,0xffffffff,0x00000000,
  89847. +0x830,0xffffffff,0x04040404,
  89848. +0x834,0xffffffff,0x00020204,
  89849. +0x838,0xffffff00,0x00000000,
  89850. +0x86c,0x000000ff,0x00000000,
  89851. +0x83c,0xffffffff,0x00000000,
  89852. +0x848,0xffffffff,0x00000000,
  89853. +0x84c,0xffffffff,0x00000000,
  89854. +0x868,0xffffffff,0x00000000,
  89855. +0xe00,0xffffffff,0x00000000,
  89856. +0xe04,0xffffffff,0x00000000,
  89857. +0xe08,0x0000ff00,0x00000000,
  89858. +0x86c,0xffffff00,0x00000000,
  89859. +0xe10,0xffffffff,0x00000000,
  89860. +0xe14,0xffffffff,0x00000000,
  89861. +0xe18,0xffffffff,0x00000000,
  89862. +0xe1c,0xffffffff,0x00000000,
  89863. +0x830,0xffffffff,0x00000000,
  89864. +0x834,0xffffffff,0x00000000,
  89865. +0x838,0xffffff00,0x00000000,
  89866. +0x86c,0x000000ff,0x00000000,
  89867. +0x83c,0xffffffff,0x00000000,
  89868. +0x848,0xffffffff,0x00000000,
  89869. +0x84c,0xffffffff,0x00000000,
  89870. +0x868,0xffffffff,0x00000000,
  89871. +};
  89872. +
  89873. +u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength] = {
  89874. +0xc30,0x69e9ac4a,
  89875. +0xc3c,0x0a979718,
  89876. +};
  89877. +
  89878. +u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength] = {
  89879. +0x024,0x0011800f,
  89880. +0x028,0x00ffdb83,
  89881. +0x040,0x000c0004,
  89882. +0x800,0x80040000,
  89883. +0x804,0x00000001,
  89884. +0x808,0x0000fc00,
  89885. +0x80c,0x0000000a,
  89886. +0x810,0x10000330, //for Broadcom AP IOT
  89887. +0x814,0x020c3d10,
  89888. +0x818,0x02200385,
  89889. +0x81c,0x00000000,
  89890. +0x820,0x01000100,
  89891. +0x824,0x00390204,
  89892. +0x828,0x00000000,
  89893. +0x82c,0x00000000,
  89894. +0x830,0x00000000,
  89895. +0x834,0x00000000,
  89896. +0x838,0x00000000,
  89897. +0x83c,0x00000000,
  89898. +0x840,0x00010000,
  89899. +0x844,0x00000000,
  89900. +0x848,0x00000000,
  89901. +0x84c,0x00000000,
  89902. +0x850,0x00000000,
  89903. +0x854,0x00000000,
  89904. +0x858,0x569a569a,
  89905. +0x85c,0x001b25a4,
  89906. +0x860,0x66e60230,
  89907. +0x864,0x061f0130,
  89908. +0x868,0x00000000,
  89909. +0x86c,0x20202000,
  89910. +0x870,0x03000300,
  89911. +0x874,0x22004000,
  89912. +0x878,0x00000808,
  89913. +0x87c,0x00ffc3f1,
  89914. +0x880,0xc0083070,
  89915. +0x884,0x000004d5,
  89916. +0x888,0x00000000,
  89917. +0x88c,0xccc000c0,
  89918. +0x890,0x00000800,
  89919. +0x894,0xfffffffe,
  89920. +0x898,0x40302010,
  89921. +0x89c,0x00706050,
  89922. +0x900,0x00000000,
  89923. +0x904,0x00000023,
  89924. +0x908,0x00000000,
  89925. +0x90c,0x81121111,
  89926. +0xa00,0x00d047c8,
  89927. +0xa04,0x80ff000c,
  89928. +0xa08,0x8c838300,
  89929. +0xa0c,0x2e68120f,
  89930. +0xa10,0x9500bb78,
  89931. +0xa14,0x11144028,
  89932. +0xa18,0x00881117,
  89933. +0xa1c,0x89140f00,
  89934. +0xa20,0x15160000,
  89935. +0xa24,0x070b0f12,
  89936. +0xa28,0x00000104,
  89937. +0xa2c,0x00d30000,
  89938. +0xa70,0x101fbf00,
  89939. +0xa74,0x00000007,
  89940. +0xc00,0x48071d40,
  89941. +0xc04,0x03a05611,
  89942. +0xc08,0x000000e4,
  89943. +0xc0c,0x6c6c6c6c,
  89944. +0xc10,0x08800000,
  89945. +0xc14,0x40000100,
  89946. +0xc18,0x08800000,
  89947. +0xc1c,0x40000100,
  89948. +0xc20,0x00000000,
  89949. +0xc24,0x00000000,
  89950. +0xc28,0x00000000,
  89951. +0xc2c,0x00000000,
  89952. +0xc30,0x69e9ac44,
  89953. +0xc34,0x469652cf,
  89954. +0xc38,0x49795994,
  89955. +0xc3c,0x0a97971c,
  89956. +0xc40,0x1f7c403f,
  89957. +0xc44,0x000100b7,
  89958. +0xc48,0xec020107,
  89959. +0xc4c,0x007f037f,
  89960. +0xc50,0x6954342e,
  89961. +0xc54,0x43bc0094,
  89962. +0xc58,0x6954342f,
  89963. +0xc5c,0x433c0094,
  89964. +0xc60,0x00000000,
  89965. +0xc64,0x5116848b,
  89966. +0xc68,0x47c00bff,
  89967. +0xc6c,0x00000036,
  89968. +0xc70,0x2c46000d,
  89969. +0xc74,0x018610db,
  89970. +0xc78,0x0000001f,
  89971. +0xc7c,0x00b91612,
  89972. +0xc80,0x24000090,
  89973. +0xc84,0x20f60000,
  89974. +0xc88,0x24000090,
  89975. +0xc8c,0x20200000,
  89976. +0xc90,0x00121820,
  89977. +0xc94,0x00000000,
  89978. +0xc98,0x00121820,
  89979. +0xc9c,0x00007f7f,
  89980. +0xca0,0x00000000,
  89981. +0xca4,0x00000080,
  89982. +0xca8,0x00000000,
  89983. +0xcac,0x00000000,
  89984. +0xcb0,0x00000000,
  89985. +0xcb4,0x00000000,
  89986. +0xcb8,0x00000000,
  89987. +0xcbc,0x28000000,
  89988. +0xcc0,0x00000000,
  89989. +0xcc4,0x00000000,
  89990. +0xcc8,0x00000000,
  89991. +0xccc,0x00000000,
  89992. +0xcd0,0x00000000,
  89993. +0xcd4,0x00000000,
  89994. +0xcd8,0x64b22427,
  89995. +0xcdc,0x00766932,
  89996. +0xce0,0x00222222,
  89997. +0xce4,0x00000000,
  89998. +0xce8,0x37644302,
  89999. +0xcec,0x2f97d40c,
  90000. +0xd00,0x00000740,
  90001. +0xd04,0x00020401,
  90002. +0xd08,0x0000907f,
  90003. +0xd0c,0x20010201,
  90004. +0xd10,0xa0633333,
  90005. +0xd14,0x3333bc43,
  90006. +0xd18,0x7a8f5b6b,
  90007. +0xd2c,0xcc979975,
  90008. +0xd30,0x00000000,
  90009. +0xd34,0x80608000,
  90010. +0xd38,0x00000000,
  90011. +0xd3c,0x00027293,
  90012. +0xd40,0x00000000,
  90013. +0xd44,0x00000000,
  90014. +0xd48,0x00000000,
  90015. +0xd4c,0x00000000,
  90016. +0xd50,0x6437140a,
  90017. +0xd54,0x00000000,
  90018. +0xd58,0x00000000,
  90019. +0xd5c,0x30032064,
  90020. +0xd60,0x4653de68,
  90021. +0xd64,0x04518a3c,
  90022. +0xd68,0x00002101,
  90023. +0xd6c,0x2a201c16,
  90024. +0xd70,0x1812362e,
  90025. +0xd74,0x322c2220,
  90026. +0xd78,0x000e3c24,
  90027. +0xe00,0x24242424,
  90028. +0xe04,0x24242424,
  90029. +0xe08,0x03902024,
  90030. +0xe10,0x24242424,
  90031. +0xe14,0x24242424,
  90032. +0xe18,0x24242424,
  90033. +0xe1c,0x24242424,
  90034. +0xe28,0x00000000,
  90035. +0xe30,0x1000dc1f,
  90036. +0xe34,0x10008c1f,
  90037. +0xe38,0x02140102,
  90038. +0xe3c,0x681604c2,
  90039. +0xe40,0x01007c00,
  90040. +0xe44,0x01004800,
  90041. +0xe48,0xfb000000,
  90042. +0xe4c,0x000028d1,
  90043. +0xe50,0x1000dc1f,
  90044. +0xe54,0x10008c1f,
  90045. +0xe58,0x02140102,
  90046. +0xe5c,0x28160d05,
  90047. +0xe60,0x00000008,
  90048. +0xe68,0x001b25a4,
  90049. +0xe6c,0x631b25a0,
  90050. +0xe70,0x631b25a0,
  90051. +0xe74,0x081b25a0,
  90052. +0xe78,0x081b25a0,
  90053. +0xe7c,0x081b25a0,
  90054. +0xe80,0x081b25a0,
  90055. +0xe84,0x631b25a0,
  90056. +0xe88,0x081b25a0,
  90057. +0xe8c,0x631b25a0,
  90058. +0xed0,0x631b25a0,
  90059. +0xed4,0x631b25a0,
  90060. +0xed8,0x631b25a0,
  90061. +0xedc,0x001b25a0,
  90062. +0xee0,0x001b25a0,
  90063. +0xeec,0x6b1b25a0,
  90064. +0xee8,0x31555448,
  90065. +0xf14,0x00000003,
  90066. +0xf4c,0x00000000,
  90067. +0xf00,0x00000300,
  90068. +};
  90069. +
  90070. +u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength] = {
  90071. +0x024,0x0011800d,
  90072. +0x028,0x00ffdb83,
  90073. +0x800,0x80040000,
  90074. +0x804,0x00000001,
  90075. +0x808,0x0000fc00,
  90076. +0x80c,0x0000000a,
  90077. +0x810,0x10000330, //for Broadcom AP IOT
  90078. +0x814,0x020c3d10,
  90079. +0x818,0x02200385,
  90080. +0x81c,0x00000000,
  90081. +0x820,0x01000100,
  90082. +0x824,0x00390004,
  90083. +0x828,0x00000000,
  90084. +0x82c,0x00000000,
  90085. +0x830,0x00000000,
  90086. +0x834,0x00000000,
  90087. +0x838,0x00000000,
  90088. +0x83c,0x00000000,
  90089. +0x840,0x00010000,
  90090. +0x844,0x00000000,
  90091. +0x848,0x00000000,
  90092. +0x84c,0x00000000,
  90093. +0x850,0x00000000,
  90094. +0x854,0x00000000,
  90095. +0x858,0x569a569a,
  90096. +0x85c,0x001b25a4,
  90097. +0x860,0x66e60230,
  90098. +0x864,0x061f0130,
  90099. +0x868,0x00000000,
  90100. +0x86c,0x32323200,
  90101. +0x870,0x07000700,
  90102. +0x874,0x22004000,
  90103. +0x878,0x00000808,
  90104. +0x87c,0x00000000,
  90105. +0x880,0xc0083070,
  90106. +0x884,0x000004d5,
  90107. +0x888,0x00000000,
  90108. +0x88c,0xccc000c0,
  90109. +0x890,0x00000800,
  90110. +0x894,0xfffffffe,
  90111. +0x898,0x40302010,
  90112. +0x89c,0x00706050,
  90113. +0x900,0x00000000,
  90114. +0x904,0x00000023,
  90115. +0x908,0x00000000,
  90116. +0x90c,0x81121111,
  90117. +0xa00,0x00d047c8,
  90118. +0xa04,0x80ff000c,
  90119. +0xa08,0x8c838300,
  90120. +0xa0c,0x2e68120f,
  90121. +0xa10,0x9500bb78,
  90122. +0xa14,0x11144028,
  90123. +0xa18,0x00881117,
  90124. +0xa1c,0x89140f00,
  90125. +0xa20,0x1a1b0000,
  90126. +0xa24,0x090e1317,
  90127. +0xa28,0x00000204,
  90128. +0xa2c,0x00d30000,
  90129. +0xa70,0x101fbf00,
  90130. +0xa74,0x00000007,
  90131. +0xc00,0x48071d40,
  90132. +0xc04,0x03a05611,
  90133. +0xc08,0x000000e4,
  90134. +0xc0c,0x6c6c6c6c,
  90135. +0xc10,0x08800000,
  90136. +0xc14,0x40000100,
  90137. +0xc18,0x08800000,
  90138. +0xc1c,0x40000100,
  90139. +0xc20,0x00000000,
  90140. +0xc24,0x00000000,
  90141. +0xc28,0x00000000,
  90142. +0xc2c,0x00000000,
  90143. +0xc30,0x69e9ac44,
  90144. +0xc34,0x469652cf,
  90145. +0xc38,0x49795994,
  90146. +0xc3c,0x0a97971c,
  90147. +0xc40,0x1f7c403f,
  90148. +0xc44,0x000100b7,
  90149. +0xc48,0xec020107,
  90150. +0xc4c,0x007f037f,
  90151. +0xc50,0x69543420,
  90152. +0xc54,0x43bc0094,
  90153. +0xc58,0x69543420,
  90154. +0xc5c,0x433c0094,
  90155. +0xc60,0x00000000,
  90156. +0xc64,0x5116848b,
  90157. +0xc68,0x47c00bff,
  90158. +0xc6c,0x00000036,
  90159. +0xc70,0x2c7f000d,
  90160. +0xc74,0x018610db,
  90161. +0xc78,0x0000001f,
  90162. +0xc7c,0x00b91612,
  90163. +0xc80,0x40000100,
  90164. +0xc84,0x20f60000,
  90165. +0xc88,0x40000100,
  90166. +0xc8c,0x20200000,
  90167. +0xc90,0x00121820,
  90168. +0xc94,0x00000000,
  90169. +0xc98,0x00121820,
  90170. +0xc9c,0x00007f7f,
  90171. +0xca0,0x00000000,
  90172. +0xca4,0x00000080,
  90173. +0xca8,0x00000000,
  90174. +0xcac,0x00000000,
  90175. +0xcb0,0x00000000,
  90176. +0xcb4,0x00000000,
  90177. +0xcb8,0x00000000,
  90178. +0xcbc,0x28000000,
  90179. +0xcc0,0x00000000,
  90180. +0xcc4,0x00000000,
  90181. +0xcc8,0x00000000,
  90182. +0xccc,0x00000000,
  90183. +0xcd0,0x00000000,
  90184. +0xcd4,0x00000000,
  90185. +0xcd8,0x64b22427,
  90186. +0xcdc,0x00766932,
  90187. +0xce0,0x00222222,
  90188. +0xce4,0x00000000,
  90189. +0xce8,0x37644302,
  90190. +0xcec,0x2f97d40c,
  90191. +0xd00,0x00000740,
  90192. +0xd04,0x00020401,
  90193. +0xd08,0x0000907f,
  90194. +0xd0c,0x20010201,
  90195. +0xd10,0xa0633333,
  90196. +0xd14,0x3333bc43,
  90197. +0xd18,0x7a8f5b6b,
  90198. +0xd2c,0xcc979975,
  90199. +0xd30,0x00000000,
  90200. +0xd34,0x80608000,
  90201. +0xd38,0x00000000,
  90202. +0xd3c,0x00027293,
  90203. +0xd40,0x00000000,
  90204. +0xd44,0x00000000,
  90205. +0xd48,0x00000000,
  90206. +0xd4c,0x00000000,
  90207. +0xd50,0x6437140a,
  90208. +0xd54,0x00000000,
  90209. +0xd58,0x00000000,
  90210. +0xd5c,0x30032064,
  90211. +0xd60,0x4653de68,
  90212. +0xd64,0x04518a3c,
  90213. +0xd68,0x00002101,
  90214. +0xd6c,0x2a201c16,
  90215. +0xd70,0x1812362e,
  90216. +0xd74,0x322c2220,
  90217. +0xd78,0x000e3c24,
  90218. +0xe00,0x2a2a2a2a,
  90219. +0xe04,0x2a2a2a2a,
  90220. +0xe08,0x03902a2a,
  90221. +0xe10,0x2a2a2a2a,
  90222. +0xe14,0x2a2a2a2a,
  90223. +0xe18,0x2a2a2a2a,
  90224. +0xe1c,0x2a2a2a2a,
  90225. +0xe28,0x00000000,
  90226. +0xe30,0x1000dc1f,
  90227. +0xe34,0x10008c1f,
  90228. +0xe38,0x02140102,
  90229. +0xe3c,0x681604c2,
  90230. +0xe40,0x01007c00,
  90231. +0xe44,0x01004800,
  90232. +0xe48,0xfb000000,
  90233. +0xe4c,0x000028d1,
  90234. +0xe50,0x1000dc1f,
  90235. +0xe54,0x10008c1f,
  90236. +0xe58,0x02140102,
  90237. +0xe5c,0x28160d05,
  90238. +0xe60,0x00000008,
  90239. +0xe68,0x001b25a4,
  90240. +0xe6c,0x631b25a0,
  90241. +0xe70,0x631b25a0,
  90242. +0xe74,0x081b25a0,
  90243. +0xe78,0x081b25a0,
  90244. +0xe7c,0x081b25a0,
  90245. +0xe80,0x081b25a0,
  90246. +0xe84,0x631b25a0,
  90247. +0xe88,0x081b25a0,
  90248. +0xe8c,0x631b25a0,
  90249. +0xed0,0x631b25a0,
  90250. +0xed4,0x631b25a0,
  90251. +0xed8,0x631b25a0,
  90252. +0xedc,0x001b25a0,
  90253. +0xee0,0x001b25a0,
  90254. +0xeec,0x6b1b25a0,
  90255. +0xf14,0x00000003,
  90256. +0xf4c,0x00000000,
  90257. +0xf00,0x00000300,
  90258. +};
  90259. +
  90260. +u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength] = {
  90261. +0x024,0x0011800d,
  90262. +0x028,0x00ffdb83,
  90263. +0x800,0x80040002,
  90264. +0x804,0x00000003,
  90265. +0x808,0x0000fc00,
  90266. +0x80c,0x0000000a,
  90267. +0x810,0x10000330, //for Broadcom AP IOT
  90268. +0x814,0x020c3d10,
  90269. +0x818,0x02200385,
  90270. +0x81c,0x00000000,
  90271. +0x820,0x01000100,
  90272. +0x824,0x00390004,
  90273. +0x828,0x01000100,
  90274. +0x82c,0x00390004,
  90275. +0x830,0x27272727,
  90276. +0x834,0x27272727,
  90277. +0x838,0x27272727,
  90278. +0x83c,0x27272727,
  90279. +0x840,0x00010000,
  90280. +0x844,0x00010000,
  90281. +0x848,0x27272727,
  90282. +0x84c,0x27272727,
  90283. +0x850,0x00000000,
  90284. +0x854,0x00000000,
  90285. +0x858,0x569a569a,
  90286. +0x85c,0x0c1b25a4,
  90287. +0x860,0x66e60230,
  90288. +0x864,0x061f0130,
  90289. +0x868,0x27272727,
  90290. +0x86c,0x2b2b2b27,
  90291. +0x870,0x07000700,
  90292. +0x874,0x22184000,
  90293. +0x878,0x08080808,
  90294. +0x87c,0x00000000,
  90295. +0x880,0xc0083070,
  90296. +0x884,0x000004d5,
  90297. +0x888,0x00000000,
  90298. +0x88c,0xcc0000c0,
  90299. +0x890,0x00000800,
  90300. +0x894,0xfffffffe,
  90301. +0x898,0x40302010,
  90302. +0x89c,0x00706050,
  90303. +0x900,0x00000000,
  90304. +0x904,0x00000023,
  90305. +0x908,0x00000000,
  90306. +0x90c,0x81121313,
  90307. +0xa00,0x00d047c8,
  90308. +0xa04,0x80ff000c,
  90309. +0xa08,0x8c838300,
  90310. +0xa0c,0x2e68120f,
  90311. +0xa10,0x9500bb78,
  90312. +0xa14,0x11144028,
  90313. +0xa18,0x00881117,
  90314. +0xa1c,0x89140f00,
  90315. +0xa20,0x1a1b0000,
  90316. +0xa24,0x090e1317,
  90317. +0xa28,0x00000204,
  90318. +0xa2c,0x00d30000,
  90319. +0xa70,0x101fbf00,
  90320. +0xa74,0x00000007,
  90321. +0xc00,0x48071d40,
  90322. +0xc04,0x03a05633,
  90323. +0xc08,0x000000e4,
  90324. +0xc0c,0x6c6c6c6c,
  90325. +0xc10,0x08800000,
  90326. +0xc14,0x40000100,
  90327. +0xc18,0x08800000,
  90328. +0xc1c,0x40000100,
  90329. +0xc20,0x00000000,
  90330. +0xc24,0x00000000,
  90331. +0xc28,0x00000000,
  90332. +0xc2c,0x00000000,
  90333. +0xc30,0x69e9ac44,
  90334. +0xc34,0x469652cf,
  90335. +0xc38,0x49795994,
  90336. +0xc3c,0x0a97971c,
  90337. +0xc40,0x1f7c403f,
  90338. +0xc44,0x000100b7,
  90339. +0xc48,0xec020107,
  90340. +0xc4c,0x007f037f,
  90341. +0xc50,0x69543420,
  90342. +0xc54,0x43bc0094,
  90343. +0xc58,0x69543420,
  90344. +0xc5c,0x433c0094,
  90345. +0xc60,0x00000000,
  90346. +0xc64,0x5116848b,
  90347. +0xc68,0x47c00bff,
  90348. +0xc6c,0x00000036,
  90349. +0xc70,0x2c7f000d,
  90350. +0xc74,0x218610db,
  90351. +0xc78,0x0000001f,
  90352. +0xc7c,0x00b91612,
  90353. +0xc80,0x40000100,
  90354. +0xc84,0x20f60000,
  90355. +0xc88,0x40000100,
  90356. +0xc8c,0xa0e40000,
  90357. +0xc90,0x00121820,
  90358. +0xc94,0x00000000,
  90359. +0xc98,0x00121820,
  90360. +0xc9c,0x00007f7f,
  90361. +0xca0,0x00000000,
  90362. +0xca4,0x00000080,
  90363. +0xca8,0x00000000,
  90364. +0xcac,0x00000000,
  90365. +0xcb0,0x00000000,
  90366. +0xcb4,0x00000000,
  90367. +0xcb8,0x00000000,
  90368. +0xcbc,0x28000000,
  90369. +0xcc0,0x00000000,
  90370. +0xcc4,0x00000000,
  90371. +0xcc8,0x00000000,
  90372. +0xccc,0x00000000,
  90373. +0xcd0,0x00000000,
  90374. +0xcd4,0x00000000,
  90375. +0xcd8,0x64b22427,
  90376. +0xcdc,0x00766932,
  90377. +0xce0,0x00222222,
  90378. +0xce4,0x00000000,
  90379. +0xce8,0x37644302,
  90380. +0xcec,0x2f97d40c,
  90381. +0xd00,0x00080740,
  90382. +0xd04,0x00020403,
  90383. +0xd08,0x0000907f,
  90384. +0xd0c,0x20010201,
  90385. +0xd10,0xa0633333,
  90386. +0xd14,0x3333bc43,
  90387. +0xd18,0x7a8f5b6b,
  90388. +0xd2c,0xcc979975,
  90389. +0xd30,0x00000000,
  90390. +0xd34,0x80608000,
  90391. +0xd38,0x00000000,
  90392. +0xd3c,0x00027293,
  90393. +0xd40,0x00000000,
  90394. +0xd44,0x00000000,
  90395. +0xd48,0x00000000,
  90396. +0xd4c,0x00000000,
  90397. +0xd50,0x6437140a,
  90398. +0xd54,0x00000000,
  90399. +0xd58,0x00000000,
  90400. +0xd5c,0x30032064,
  90401. +0xd60,0x4653de68,
  90402. +0xd64,0x04518a3c,
  90403. +0xd68,0x00002101,
  90404. +0xd6c,0x2a201c16,
  90405. +0xd70,0x1812362e,
  90406. +0xd74,0x322c2220,
  90407. +0xd78,0x000e3c24,
  90408. +0xe00,0x2a2a2a2a,
  90409. +0xe04,0x2a2a2a2a,
  90410. +0xe08,0x03902a2a,
  90411. +0xe10,0x2a2a2a2a,
  90412. +0xe14,0x2a2a2a2a,
  90413. +0xe18,0x2a2a2a2a,
  90414. +0xe1c,0x2a2a2a2a,
  90415. +0xe28,0x00000000,
  90416. +0xe30,0x1000dc1f,
  90417. +0xe34,0x10008c1f,
  90418. +0xe38,0x02140102,
  90419. +0xe3c,0x681604c2,
  90420. +0xe40,0x01007c00,
  90421. +0xe44,0x01004800,
  90422. +0xe48,0xfb000000,
  90423. +0xe4c,0x000028d1,
  90424. +0xe50,0x1000dc1f,
  90425. +0xe54,0x10008c1f,
  90426. +0xe58,0x02140102,
  90427. +0xe5c,0x28160d05,
  90428. +0xe60,0x00000010,
  90429. +0xe68,0x001b25a4,
  90430. +0xe6c,0x63db25a4,
  90431. +0xe70,0x63db25a4,
  90432. +0xe74,0x0c1b25a4,
  90433. +0xe78,0x0c1b25a4,
  90434. +0xe7c,0x0c1b25a4,
  90435. +0xe80,0x0c1b25a4,
  90436. +0xe84,0x63db25a4,
  90437. +0xe88,0x0c1b25a4,
  90438. +0xe8c,0x63db25a4,
  90439. +0xed0,0x63db25a4,
  90440. +0xed4,0x63db25a4,
  90441. +0xed8,0x63db25a4,
  90442. +0xedc,0x001b25a4,
  90443. +0xee0,0x001b25a4,
  90444. +0xeec,0x6fdb25a4,
  90445. +0xf14,0x00000003,
  90446. +0xf4c,0x00000000,
  90447. +0xf00,0x00000300,
  90448. +};
  90449. +
  90450. +u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength] = {
  90451. +0xe00,0xffffffff,0x06080808,
  90452. +0xe04,0xffffffff,0x00040406,
  90453. +0xe08,0x0000ff00,0x00000000,
  90454. +0x86c,0xffffff00,0x00000000,
  90455. +0xe10,0xffffffff,0x04060608,
  90456. +0xe14,0xffffffff,0x00020204,
  90457. +0xe18,0xffffffff,0x04060608,
  90458. +0xe1c,0xffffffff,0x00020204,
  90459. +0x830,0xffffffff,0x06080808,
  90460. +0x834,0xffffffff,0x00040406,
  90461. +0x838,0xffffff00,0x00000000,
  90462. +0x86c,0x000000ff,0x00000000,
  90463. +0x83c,0xffffffff,0x04060608,
  90464. +0x848,0xffffffff,0x00020204,
  90465. +0x84c,0xffffffff,0x04060608,
  90466. +0x868,0xffffffff,0x00020204,
  90467. +0xe00,0xffffffff,0x00000000,
  90468. +0xe04,0xffffffff,0x00000000,
  90469. +0xe08,0x0000ff00,0x00000000,
  90470. +0x86c,0xffffff00,0x00000000,
  90471. +0xe10,0xffffffff,0x00000000,
  90472. +0xe14,0xffffffff,0x00000000,
  90473. +0xe18,0xffffffff,0x00000000,
  90474. +0xe1c,0xffffffff,0x00000000,
  90475. +0x830,0xffffffff,0x00000000,
  90476. +0x834,0xffffffff,0x00000000,
  90477. +0x838,0xffffff00,0x00000000,
  90478. +0x86c,0x000000ff,0x00000000,
  90479. +0x83c,0xffffffff,0x00000000,
  90480. +0x848,0xffffffff,0x00000000,
  90481. +0x84c,0xffffffff,0x00000000,
  90482. +0x868,0xffffffff,0x00000000,
  90483. +0xe00,0xffffffff,0x00000000,
  90484. +0xe04,0xffffffff,0x00000000,
  90485. +0xe08,0x0000ff00,0x00000000,
  90486. +0x86c,0xffffff00,0x00000000,
  90487. +0xe10,0xffffffff,0x00000000,
  90488. +0xe14,0xffffffff,0x00000000,
  90489. +0xe18,0xffffffff,0x00000000,
  90490. +0xe1c,0xffffffff,0x00000000,
  90491. +0x830,0xffffffff,0x00000000,
  90492. +0x834,0xffffffff,0x00000000,
  90493. +0x838,0xffffff00,0x00000000,
  90494. +0x86c,0x000000ff,0x00000000,
  90495. +0x83c,0xffffffff,0x00000000,
  90496. +0x848,0xffffffff,0x00000000,
  90497. +0x84c,0xffffffff,0x00000000,
  90498. +0x868,0xffffffff,0x00000000,
  90499. +0xe00,0xffffffff,0x00000000,
  90500. +0xe04,0xffffffff,0x00000000,
  90501. +0xe08,0x0000ff00,0x00000000,
  90502. +0x86c,0xffffff00,0x00000000,
  90503. +0xe10,0xffffffff,0x00000000,
  90504. +0xe14,0xffffffff,0x00000000,
  90505. +0xe18,0xffffffff,0x00000000,
  90506. +0xe1c,0xffffffff,0x00000000,
  90507. +0x830,0xffffffff,0x00000000,
  90508. +0x834,0xffffffff,0x00000000,
  90509. +0x838,0xffffff00,0x00000000,
  90510. +0x86c,0x000000ff,0x00000000,
  90511. +0x83c,0xffffffff,0x00000000,
  90512. +0x848,0xffffffff,0x00000000,
  90513. +0x84c,0xffffffff,0x00000000,
  90514. +0x868,0xffffffff,0x00000000,
  90515. +0xe00,0xffffffff,0x00000000,
  90516. +0xe04,0xffffffff,0x00000000,
  90517. +0xe08,0x0000ff00,0x00000000,
  90518. +0x86c,0xffffff00,0x00000000,
  90519. +0xe10,0xffffffff,0x00000000,
  90520. +0xe14,0xffffffff,0x00000000,
  90521. +0xe18,0xffffffff,0x00000000,
  90522. +0xe1c,0xffffffff,0x00000000,
  90523. +0x830,0xffffffff,0x00000000,
  90524. +0x834,0xffffffff,0x00000000,
  90525. +0x838,0xffffff00,0x00000000,
  90526. +0x86c,0x000000ff,0x00000000,
  90527. +0x83c,0xffffffff,0x00000000,
  90528. +0x848,0xffffffff,0x00000000,
  90529. +0x84c,0xffffffff,0x00000000,
  90530. +0x868,0xffffffff,0x00000000,
  90531. +0xe00,0xffffffff,0x00000000,
  90532. +0xe04,0xffffffff,0x00000000,
  90533. +0xe08,0x0000ff00,0x00000000,
  90534. +0x86c,0xffffff00,0x00000000,
  90535. +0xe10,0xffffffff,0x00000000,
  90536. +0xe14,0xffffffff,0x00000000,
  90537. +0xe18,0xffffffff,0x00000000,
  90538. +0xe1c,0xffffffff,0x00000000,
  90539. +0x830,0xffffffff,0x00000000,
  90540. +0x834,0xffffffff,0x00000000,
  90541. +0x838,0xffffff00,0x00000000,
  90542. +0x86c,0x000000ff,0x00000000,
  90543. +0x83c,0xffffffff,0x00000000,
  90544. +0x848,0xffffffff,0x00000000,
  90545. +0x84c,0xffffffff,0x00000000,
  90546. +0x868,0xffffffff,0x00000000,
  90547. +0xe00,0xffffffff,0x00000000,
  90548. +0xe04,0xffffffff,0x00000000,
  90549. +0xe08,0x0000ff00,0x00000000,
  90550. +0x86c,0xffffff00,0x00000000,
  90551. +0xe10,0xffffffff,0x00000000,
  90552. +0xe14,0xffffffff,0x00000000,
  90553. +0xe18,0xffffffff,0x00000000,
  90554. +0xe1c,0xffffffff,0x00000000,
  90555. +0x830,0xffffffff,0x00000000,
  90556. +0x834,0xffffffff,0x00000000,
  90557. +0x838,0xffffff00,0x00000000,
  90558. +0x86c,0x000000ff,0x00000000,
  90559. +0x83c,0xffffffff,0x00000000,
  90560. +0x848,0xffffffff,0x00000000,
  90561. +0x84c,0xffffffff,0x00000000,
  90562. +0x868,0xffffffff,0x00000000,
  90563. +};
  90564. +
  90565. +u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength] = {
  90566. +0x000,0x00030159,
  90567. +0x001,0x00031284,
  90568. +0x002,0x00098000,
  90569. +0x003,0x00018c63,
  90570. +0x004,0x000210e7,
  90571. +0x009,0x0002044f,
  90572. +0x00a,0x0001adb1,
  90573. +0x00b,0x00054867,
  90574. +0x00c,0x0008992e,
  90575. +0x00d,0x0000e52c,
  90576. +0x00e,0x00039ce7,
  90577. +0x00f,0x00000451,
  90578. +0x019,0x00000000,
  90579. +0x01a,0x00010255,
  90580. +0x01b,0x00060a00,
  90581. +0x01c,0x000fc378,
  90582. +0x01d,0x000a1250,
  90583. +0x01e,0x0004445f,
  90584. +0x01f,0x00080001,
  90585. +0x020,0x0000b614,
  90586. +0x021,0x0006c000,
  90587. +0x022,0x00000000,
  90588. +0x023,0x00001558,
  90589. +0x024,0x00000060,
  90590. +0x025,0x00000483,
  90591. +0x026,0x0004f000,
  90592. +0x027,0x000ec7d9,
  90593. +0x028,0x000577c0,
  90594. +0x029,0x00004783,
  90595. +0x02a,0x00000001,
  90596. +0x02b,0x00021334,
  90597. +0x02a,0x00000000,
  90598. +0x02b,0x00000054,
  90599. +0x02a,0x00000001,
  90600. +0x02b,0x00000808,
  90601. +0x02b,0x00053333,
  90602. +0x02c,0x0000000c,
  90603. +0x02a,0x00000002,
  90604. +0x02b,0x00000808,
  90605. +0x02b,0x0005b333,
  90606. +0x02c,0x0000000d,
  90607. +0x02a,0x00000003,
  90608. +0x02b,0x00000808,
  90609. +0x02b,0x00063333,
  90610. +0x02c,0x0000000d,
  90611. +0x02a,0x00000004,
  90612. +0x02b,0x00000808,
  90613. +0x02b,0x0006b333,
  90614. +0x02c,0x0000000d,
  90615. +0x02a,0x00000005,
  90616. +0x02b,0x00000808,
  90617. +0x02b,0x00073333,
  90618. +0x02c,0x0000000d,
  90619. +0x02a,0x00000006,
  90620. +0x02b,0x00000709,
  90621. +0x02b,0x0005b333,
  90622. +0x02c,0x0000000d,
  90623. +0x02a,0x00000007,
  90624. +0x02b,0x00000709,
  90625. +0x02b,0x00063333,
  90626. +0x02c,0x0000000d,
  90627. +0x02a,0x00000008,
  90628. +0x02b,0x0000060a,
  90629. +0x02b,0x0004b333,
  90630. +0x02c,0x0000000d,
  90631. +0x02a,0x00000009,
  90632. +0x02b,0x0000060a,
  90633. +0x02b,0x00053333,
  90634. +0x02c,0x0000000d,
  90635. +0x02a,0x0000000a,
  90636. +0x02b,0x0000060a,
  90637. +0x02b,0x0005b333,
  90638. +0x02c,0x0000000d,
  90639. +0x02a,0x0000000b,
  90640. +0x02b,0x0000060a,
  90641. +0x02b,0x00063333,
  90642. +0x02c,0x0000000d,
  90643. +0x02a,0x0000000c,
  90644. +0x02b,0x0000060a,
  90645. +0x02b,0x0006b333,
  90646. +0x02c,0x0000000d,
  90647. +0x02a,0x0000000d,
  90648. +0x02b,0x0000060a,
  90649. +0x02b,0x00073333,
  90650. +0x02c,0x0000000d,
  90651. +0x02a,0x0000000e,
  90652. +0x02b,0x0000050b,
  90653. +0x02b,0x00066666,
  90654. +0x02c,0x0000001a,
  90655. +0x02a,0x000e0000,
  90656. +0x010,0x0004000f,
  90657. +0x011,0x000e31fc,
  90658. +0x010,0x0006000f,
  90659. +0x011,0x000ff9f8,
  90660. +0x010,0x0002000f,
  90661. +0x011,0x000203f9,
  90662. +0x010,0x0003000f,
  90663. +0x011,0x000ff500,
  90664. +0x010,0x00000000,
  90665. +0x011,0x00000000,
  90666. +0x010,0x0008000f,
  90667. +0x011,0x0003f100,
  90668. +0x010,0x0009000f,
  90669. +0x011,0x00023100,
  90670. +0x012,0x00032000,
  90671. +0x012,0x00071000,
  90672. +0x012,0x000b0000,
  90673. +0x012,0x000fc000,
  90674. +0x013,0x000287b3,
  90675. +0x013,0x000244b7,
  90676. +0x013,0x000204ab,
  90677. +0x013,0x0001c49f,
  90678. +0x013,0x00018493,
  90679. +0x013,0x0001429b,
  90680. +0x013,0x00010299,
  90681. +0x013,0x0000c29c,
  90682. +0x013,0x000081a0,
  90683. +0x013,0x000040ac,
  90684. +0x013,0x00000020,
  90685. +0x014,0x0001944c,
  90686. +0x014,0x00059444,
  90687. +0x014,0x0009944c,
  90688. +0x014,0x000d9444,
  90689. +0x015,0x0000f424,
  90690. +0x015,0x0004f424,
  90691. +0x015,0x0008f424,
  90692. +0x015,0x000cf424,
  90693. +0x016,0x000e0330,
  90694. +0x016,0x000a0330,
  90695. +0x016,0x00060330,
  90696. +0x016,0x00020330,
  90697. +0x000,0x00010159,
  90698. +0x018,0x0000f401,
  90699. +0x0fe,0x00000000,
  90700. +0x0fe,0x00000000,
  90701. +0x01f,0x00080003,
  90702. +0x0fe,0x00000000,
  90703. +0x0fe,0x00000000,
  90704. +0x01e,0x00044457,
  90705. +0x01f,0x00080000,
  90706. +0x000,0x00030159,
  90707. +};
  90708. +
  90709. +u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength] = {
  90710. +0x000,0x00030159,
  90711. +0x001,0x00031284,
  90712. +0x002,0x00098000,
  90713. +0x003,0x00018c63,
  90714. +0x004,0x000210e7,
  90715. +0x009,0x0002044f,
  90716. +0x00a,0x0001adb1,
  90717. +0x00b,0x00054867,
  90718. +0x00c,0x0008992e,
  90719. +0x00d,0x0000e52c,
  90720. +0x00e,0x00039ce7,
  90721. +0x00f,0x00000451,
  90722. +0x012,0x00032000,
  90723. +0x012,0x00071000,
  90724. +0x012,0x000b0000,
  90725. +0x012,0x000fc000,
  90726. +0x013,0x000287af,
  90727. +0x013,0x000244b7,
  90728. +0x013,0x000204ab,
  90729. +0x013,0x0001c49f,
  90730. +0x013,0x00018493,
  90731. +0x013,0x00014297,
  90732. +0x013,0x00010295,
  90733. +0x013,0x0000c298,
  90734. +0x013,0x0000819c,
  90735. +0x013,0x000040a8,
  90736. +0x013,0x0000001c,
  90737. +0x014,0x0001944c,
  90738. +0x014,0x00059444,
  90739. +0x014,0x0009944c,
  90740. +0x014,0x000d9444,
  90741. +0x015,0x0000f424,
  90742. +0x015,0x0004f424,
  90743. +0x015,0x0008f424,
  90744. +0x015,0x000cf424,
  90745. +0x016,0x000e0330,
  90746. +0x016,0x000a0330,
  90747. +0x016,0x00060330,
  90748. +0x016,0x00020330,
  90749. +};
  90750. +
  90751. +u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength] = {
  90752. +0x000,0x00030159,
  90753. +0x001,0x00031284,
  90754. +0x002,0x00098000,
  90755. +0x003,0x00018c63,
  90756. +0x004,0x000210e7,
  90757. +0x009,0x0002044f,
  90758. +0x00a,0x0001adb1,
  90759. +0x00b,0x00054867,
  90760. +0x00c,0x0008992e,
  90761. +0x00d,0x0000e52c,
  90762. +0x00e,0x00039ce7,
  90763. +0x00f,0x00000451,
  90764. +0x019,0x00000000,
  90765. +0x01a,0x00010255,
  90766. +0x01b,0x00060a00,
  90767. +0x01c,0x000fc378,
  90768. +0x01d,0x000a1250,
  90769. +0x01e,0x0004445f,
  90770. +0x01f,0x00080001,
  90771. +0x020,0x0000b614,
  90772. +0x021,0x0006c000,
  90773. +0x022,0x00000000,
  90774. +0x023,0x00001558,
  90775. +0x024,0x00000060,
  90776. +0x025,0x00000483,
  90777. +0x026,0x0004f000,
  90778. +0x027,0x000ec7d9,
  90779. +0x028,0x000577c0,
  90780. +0x029,0x00004783,
  90781. +0x02a,0x00000001,
  90782. +0x02b,0x00021334,
  90783. +0x02a,0x00000000,
  90784. +0x02b,0x00000054,
  90785. +0x02a,0x00000001,
  90786. +0x02b,0x00000808,
  90787. +0x02b,0x00053333,
  90788. +0x02c,0x0000000c,
  90789. +0x02a,0x00000002,
  90790. +0x02b,0x00000808,
  90791. +0x02b,0x0005b333,
  90792. +0x02c,0x0000000d,
  90793. +0x02a,0x00000003,
  90794. +0x02b,0x00000808,
  90795. +0x02b,0x00063333,
  90796. +0x02c,0x0000000d,
  90797. +0x02a,0x00000004,
  90798. +0x02b,0x00000808,
  90799. +0x02b,0x0006b333,
  90800. +0x02c,0x0000000d,
  90801. +0x02a,0x00000005,
  90802. +0x02b,0x00000808,
  90803. +0x02b,0x00073333,
  90804. +0x02c,0x0000000d,
  90805. +0x02a,0x00000006,
  90806. +0x02b,0x00000709,
  90807. +0x02b,0x0005b333,
  90808. +0x02c,0x0000000d,
  90809. +0x02a,0x00000007,
  90810. +0x02b,0x00000709,
  90811. +0x02b,0x00063333,
  90812. +0x02c,0x0000000d,
  90813. +0x02a,0x00000008,
  90814. +0x02b,0x0000060a,
  90815. +0x02b,0x0004b333,
  90816. +0x02c,0x0000000d,
  90817. +0x02a,0x00000009,
  90818. +0x02b,0x0000060a,
  90819. +0x02b,0x00053333,
  90820. +0x02c,0x0000000d,
  90821. +0x02a,0x0000000a,
  90822. +0x02b,0x0000060a,
  90823. +0x02b,0x0005b333,
  90824. +0x02c,0x0000000d,
  90825. +0x02a,0x0000000b,
  90826. +0x02b,0x0000060a,
  90827. +0x02b,0x00063333,
  90828. +0x02c,0x0000000d,
  90829. +0x02a,0x0000000c,
  90830. +0x02b,0x0000060a,
  90831. +0x02b,0x0006b333,
  90832. +0x02c,0x0000000d,
  90833. +0x02a,0x0000000d,
  90834. +0x02b,0x0000060a,
  90835. +0x02b,0x00073333,
  90836. +0x02c,0x0000000d,
  90837. +0x02a,0x0000000e,
  90838. +0x02b,0x0000050b,
  90839. +0x02b,0x00066666,
  90840. +0x02c,0x0000001a,
  90841. +0x02a,0x000e0000,
  90842. +0x010,0x0004000f,
  90843. +0x011,0x000e31fc,
  90844. +0x010,0x0006000f,
  90845. +0x011,0x000ff9f8,
  90846. +0x010,0x0002000f,
  90847. +0x011,0x000203f9,
  90848. +0x010,0x0003000f,
  90849. +0x011,0x000ff500,
  90850. +0x010,0x00000000,
  90851. +0x011,0x00000000,
  90852. +0x010,0x0008000f,
  90853. +0x011,0x0003f100,
  90854. +0x010,0x0009000f,
  90855. +0x011,0x00023100,
  90856. +0x012,0x00032000,
  90857. +0x012,0x00071000,
  90858. +0x012,0x000b0000,
  90859. +0x012,0x000fc000,
  90860. +0x013,0x000287b3,
  90861. +0x013,0x000244b7,
  90862. +0x013,0x000204ab,
  90863. +0x013,0x0001c49f,
  90864. +0x013,0x00018493,
  90865. +0x013,0x0001429b,
  90866. +0x013,0x00010299,
  90867. +0x013,0x0000c29c,
  90868. +0x013,0x000081a0,
  90869. +0x013,0x000040ac,
  90870. +0x013,0x00000020,
  90871. +0x014,0x0001944c,
  90872. +0x014,0x00059444,
  90873. +0x014,0x0009944c,
  90874. +0x014,0x000d9444,
  90875. +0x015,0x0000f405,
  90876. +0x015,0x0004f405,
  90877. +0x015,0x0008f405,
  90878. +0x015,0x000cf405,
  90879. +0x016,0x000e0330,
  90880. +0x016,0x000a0330,
  90881. +0x016,0x00060330,
  90882. +0x016,0x00020330,
  90883. +0x000,0x00010159,
  90884. +0x018,0x0000f401,
  90885. +0x0fe,0x00000000,
  90886. +0x0fe,0x00000000,
  90887. +0x01f,0x00080003,
  90888. +0x0fe,0x00000000,
  90889. +0x0fe,0x00000000,
  90890. +0x01e,0x00044457,
  90891. +0x01f,0x00080000,
  90892. +0x000,0x00030159,
  90893. +};
  90894. +
  90895. +u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength] = {
  90896. +0x0, };
  90897. +
  90898. +
  90899. +u32 Rtl8192CURadioA_2T_mCardArray[RadioA_2T_mCardArrayLength] = {
  90900. +0x000,0x00030159,
  90901. +0x001,0x00031284,
  90902. +0x002,0x00098000,
  90903. +0x003,0x00018c63,
  90904. +0x004,0x000210e7,
  90905. +0x009,0x0002044f,
  90906. +0x00a,0x0001adb1,
  90907. +0x00b,0x00054867,
  90908. +0x00c,0x0008992e,
  90909. +0x00d,0x0000e52c,
  90910. +0x00e,0x00039ce7,
  90911. +0x00f,0x00000451,
  90912. +0x019,0x00000000,
  90913. +0x01a,0x00010255,
  90914. +0x01b,0x00060a00,
  90915. +0x01c,0x000fc378,
  90916. +0x01d,0x000a1250,
  90917. +0x01e,0x0004445f,
  90918. +0x01f,0x00080001,
  90919. +0x020,0x0000b614,
  90920. +0x021,0x0006c000,
  90921. +0x022,0x00000000,
  90922. +0x023,0x00001558,
  90923. +0x024,0x00000060,
  90924. +0x025,0x00000483,
  90925. +0x026,0x0004f000,
  90926. +0x027,0x000ec7d9,
  90927. +0x028,0x000577c0,
  90928. +0x029,0x00004783,
  90929. +0x02a,0x00000001,
  90930. +0x02b,0x00021334,
  90931. +0x02a,0x00000000,
  90932. +0x02b,0x00000054,
  90933. +0x02a,0x00000001,
  90934. +0x02b,0x00000808,
  90935. +0x02b,0x00053333,
  90936. +0x02c,0x0000000c,
  90937. +0x02a,0x00000002,
  90938. +0x02b,0x00000808,
  90939. +0x02b,0x0005b333,
  90940. +0x02c,0x0000000d,
  90941. +0x02a,0x00000003,
  90942. +0x02b,0x00000808,
  90943. +0x02b,0x00063333,
  90944. +0x02c,0x0000000d,
  90945. +0x02a,0x00000004,
  90946. +0x02b,0x00000808,
  90947. +0x02b,0x0006b333,
  90948. +0x02c,0x0000000d,
  90949. +0x02a,0x00000005,
  90950. +0x02b,0x00000808,
  90951. +0x02b,0x00073333,
  90952. +0x02c,0x0000000d,
  90953. +0x02a,0x00000006,
  90954. +0x02b,0x00000709,
  90955. +0x02b,0x0005b333,
  90956. +0x02c,0x0000000d,
  90957. +0x02a,0x00000007,
  90958. +0x02b,0x00000709,
  90959. +0x02b,0x00063333,
  90960. +0x02c,0x0000000d,
  90961. +0x02a,0x00000008,
  90962. +0x02b,0x0000060a,
  90963. +0x02b,0x0004b333,
  90964. +0x02c,0x0000000d,
  90965. +0x02a,0x00000009,
  90966. +0x02b,0x0000060a,
  90967. +0x02b,0x00053333,
  90968. +0x02c,0x0000000d,
  90969. +0x02a,0x0000000a,
  90970. +0x02b,0x0000060a,
  90971. +0x02b,0x0005b333,
  90972. +0x02c,0x0000000d,
  90973. +0x02a,0x0000000b,
  90974. +0x02b,0x0000060a,
  90975. +0x02b,0x00063333,
  90976. +0x02c,0x0000000d,
  90977. +0x02a,0x0000000c,
  90978. +0x02b,0x0000060a,
  90979. +0x02b,0x0006b333,
  90980. +0x02c,0x0000000d,
  90981. +0x02a,0x0000000d,
  90982. +0x02b,0x0000060a,
  90983. +0x02b,0x00073333,
  90984. +0x02c,0x0000000d,
  90985. +0x02a,0x0000000e,
  90986. +0x02b,0x0000050b,
  90987. +0x02b,0x00066666,
  90988. +0x02c,0x0000001a,
  90989. +0x02a,0x000e0000,
  90990. +0x010,0x0004000f,
  90991. +0x011,0x000e31fc,
  90992. +0x010,0x0006000f,
  90993. +0x011,0x000ff9f8,
  90994. +0x010,0x0002000f,
  90995. +0x011,0x000203f9,
  90996. +0x010,0x0003000f,
  90997. +0x011,0x000ff500,
  90998. +0x010,0x00000000,
  90999. +0x011,0x00000000,
  91000. +0x010,0x0008000f,
  91001. +0x011,0x0003f100,
  91002. +0x010,0x0009000f,
  91003. +0x011,0x00023100,
  91004. +0x012,0x00032000,
  91005. +0x012,0x00071000,
  91006. +0x012,0x000b0000,
  91007. +0x012,0x000fc000,
  91008. +0x013,0x000287b3,
  91009. +0x013,0x000244b7,
  91010. +0x013,0x000204ab,
  91011. +0x013,0x0001c49f,
  91012. +0x013,0x00018493,
  91013. +0x013,0x0001429b,
  91014. +0x013,0x00010299,
  91015. +0x013,0x0000c29c,
  91016. +0x013,0x000081a0,
  91017. +0x013,0x000040ac,
  91018. +0x013,0x00000020,
  91019. +0x014,0x0001944c,
  91020. +0x014,0x00059444,
  91021. +0x014,0x0009944c,
  91022. +0x014,0x000d9444,
  91023. +0x015,0x0000f424,
  91024. +0x015,0x0004f424,
  91025. +0x015,0x0008f424,
  91026. +0x015,0x000cf424,
  91027. +0x016,0x000e0330,
  91028. +0x016,0x000a0330,
  91029. +0x016,0x00060330,
  91030. +0x016,0x00020330,
  91031. +0x000,0x00010159,
  91032. +0x018,0x0000f401,
  91033. +0x0fe,0x00000000,
  91034. +0x0fe,0x00000000,
  91035. +0x01f,0x00080003,
  91036. +0x0fe,0x00000000,
  91037. +0x0fe,0x00000000,
  91038. +0x01e,0x00044457,
  91039. +0x01f,0x00080000,
  91040. +0x000,0x00030159,
  91041. +};
  91042. +
  91043. +u32 Rtl8192CURadioB_2T_mCardArray[RadioB_2T_mCardArrayLength] = {
  91044. +0x000,0x00030159,
  91045. +0x001,0x00031284,
  91046. +0x002,0x00098000,
  91047. +0x003,0x00018c63,
  91048. +0x004,0x000210e7,
  91049. +0x009,0x0002044f,
  91050. +0x00a,0x0001adb1,
  91051. +0x00b,0x00054867,
  91052. +0x00c,0x0008992e,
  91053. +0x00d,0x0000e52c,
  91054. +0x00e,0x00039ce7,
  91055. +0x00f,0x00000451,
  91056. +0x012,0x00032000,
  91057. +0x012,0x00071000,
  91058. +0x012,0x000b0000,
  91059. +0x012,0x000fc000,
  91060. +0x013,0x000287af,
  91061. +0x013,0x000244b7,
  91062. +0x013,0x000204ab,
  91063. +0x013,0x0001c49f,
  91064. +0x013,0x00018493,
  91065. +0x013,0x00014297,
  91066. +0x013,0x00010295,
  91067. +0x013,0x0000c298,
  91068. +0x013,0x0000819c,
  91069. +0x013,0x000040a8,
  91070. +0x013,0x0000001c,
  91071. +0x014,0x0001944c,
  91072. +0x014,0x00059444,
  91073. +0x014,0x0009944c,
  91074. +0x014,0x000d9444,
  91075. +0x015,0x0000f424,
  91076. +0x015,0x0004f424,
  91077. +0x015,0x0008f424,
  91078. +0x015,0x000cf424,
  91079. +0x016,0x000e0330,
  91080. +0x016,0x000a0330,
  91081. +0x016,0x00060330,
  91082. +0x016,0x00020330,
  91083. +};
  91084. +
  91085. +u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength] = {
  91086. +0x000,0x00030159,
  91087. +0x001,0x00031284,
  91088. +0x002,0x00098000,
  91089. +0x003,0x00018c63,
  91090. +0x004,0x000210e7,
  91091. +0x009,0x0002044f,
  91092. +0x00a,0x0001adb1,
  91093. +0x00b,0x00054867,
  91094. +0x00c,0x0008992e,
  91095. +0x00d,0x0000e52c,
  91096. +0x00e,0x00039ce7,
  91097. +0x00f,0x00000451,
  91098. +0x019,0x00000000,
  91099. +0x01a,0x00010255,
  91100. +0x01b,0x00060a00,
  91101. +0x01c,0x000fc378,
  91102. +0x01d,0x000a1250,
  91103. +0x01e,0x0004445f,
  91104. +0x01f,0x00080001,
  91105. +0x020,0x0000b614,
  91106. +0x021,0x0006c000,
  91107. +0x022,0x00000000,
  91108. +0x023,0x00001558,
  91109. +0x024,0x00000060,
  91110. +0x025,0x00000483,
  91111. +0x026,0x0004f200,
  91112. +0x027,0x000ec7d9,
  91113. +0x028,0x000577c0,
  91114. +0x029,0x00004783,
  91115. +0x02a,0x00000001,
  91116. +0x02b,0x00021334,
  91117. +0x02a,0x00000000,
  91118. +0x02b,0x00000054,
  91119. +0x02a,0x00000001,
  91120. +0x02b,0x00000808,
  91121. +0x02b,0x00053333,
  91122. +0x02c,0x0000000c,
  91123. +0x02a,0x00000002,
  91124. +0x02b,0x00000808,
  91125. +0x02b,0x0005b333,
  91126. +0x02c,0x0000000d,
  91127. +0x02a,0x00000003,
  91128. +0x02b,0x00000808,
  91129. +0x02b,0x00063333,
  91130. +0x02c,0x0000000d,
  91131. +0x02a,0x00000004,
  91132. +0x02b,0x00000808,
  91133. +0x02b,0x0006b333,
  91134. +0x02c,0x0000000d,
  91135. +0x02a,0x00000005,
  91136. +0x02b,0x00000808,
  91137. +0x02b,0x00073333,
  91138. +0x02c,0x0000000d,
  91139. +0x02a,0x00000006,
  91140. +0x02b,0x00000709,
  91141. +0x02b,0x0005b333,
  91142. +0x02c,0x0000000d,
  91143. +0x02a,0x00000007,
  91144. +0x02b,0x00000709,
  91145. +0x02b,0x00063333,
  91146. +0x02c,0x0000000d,
  91147. +0x02a,0x00000008,
  91148. +0x02b,0x0000060a,
  91149. +0x02b,0x0004b333,
  91150. +0x02c,0x0000000d,
  91151. +0x02a,0x00000009,
  91152. +0x02b,0x0000060a,
  91153. +0x02b,0x00053333,
  91154. +0x02c,0x0000000d,
  91155. +0x02a,0x0000000a,
  91156. +0x02b,0x0000060a,
  91157. +0x02b,0x0005b333,
  91158. +0x02c,0x0000000d,
  91159. +0x02a,0x0000000b,
  91160. +0x02b,0x0000060a,
  91161. +0x02b,0x00063333,
  91162. +0x02c,0x0000000d,
  91163. +0x02a,0x0000000c,
  91164. +0x02b,0x0000060a,
  91165. +0x02b,0x0006b333,
  91166. +0x02c,0x0000000d,
  91167. +0x02a,0x0000000d,
  91168. +0x02b,0x0000060a,
  91169. +0x02b,0x00073333,
  91170. +0x02c,0x0000000d,
  91171. +0x02a,0x0000000e,
  91172. +0x02b,0x0000050b,
  91173. +0x02b,0x00066666,
  91174. +0x02c,0x0000001a,
  91175. +0x02a,0x000e0000,
  91176. +0x010,0x0004000f,
  91177. +0x011,0x000e31fc,
  91178. +0x010,0x0006000f,
  91179. +0x011,0x000ff9f8,
  91180. +0x010,0x0002000f,
  91181. +0x011,0x000203f9,
  91182. +0x010,0x0003000f,
  91183. +0x011,0x000ff500,
  91184. +0x010,0x00000000,
  91185. +0x011,0x00000000,
  91186. +0x010,0x0008000f,
  91187. +0x011,0x0003f100,
  91188. +0x010,0x0009000f,
  91189. +0x011,0x00023100,
  91190. +0x012,0x00032000,
  91191. +0x012,0x00071000,
  91192. +0x012,0x000b0000,
  91193. +0x012,0x000fc000,
  91194. +0x013,0x000287b3,
  91195. +0x013,0x000244b7,
  91196. +0x013,0x000204ab,
  91197. +0x013,0x0001c49f,
  91198. +0x013,0x00018493,
  91199. +0x013,0x0001429b,
  91200. +0x013,0x00010299,
  91201. +0x013,0x0000c29c,
  91202. +0x013,0x000081a0,
  91203. +0x013,0x000040ac,
  91204. +0x013,0x00000020,
  91205. +0x014,0x0001944c,
  91206. +0x014,0x00059444,
  91207. +0x014,0x0009944c,
  91208. +0x014,0x000d9444,
  91209. +0x015,0x0000f424,
  91210. +0x015,0x0004f424,
  91211. +0x015,0x0008f424,
  91212. +0x015,0x000cf424,
  91213. +0x016,0x000e0330,
  91214. +0x016,0x000a0330,
  91215. +0x016,0x00060330,
  91216. +0x016,0x00020330,
  91217. +0x000,0x00010159,
  91218. +0x018,0x0000f401,
  91219. +0x0fe,0x00000000,
  91220. +0x0fe,0x00000000,
  91221. +0x01f,0x00080003,
  91222. +0x0fe,0x00000000,
  91223. +0x0fe,0x00000000,
  91224. +0x01e,0x00044457,
  91225. +0x01f,0x00080000,
  91226. +0x000,0x00030159,
  91227. +};
  91228. +
  91229. +u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength] = {
  91230. +0x0, };
  91231. +
  91232. +u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength] = {
  91233. +0x000,0x00030159,
  91234. +0x001,0x00031284,
  91235. +0x002,0x00098000,
  91236. +0x003,0x00018c63,
  91237. +0x004,0x000210e7,
  91238. +0x009,0x0002044f,
  91239. +0x00a,0x0001adb0,
  91240. +0x00b,0x00054867,
  91241. +0x00c,0x0008992e,
  91242. +0x00d,0x0000e529,
  91243. +0x00e,0x00039ce7,
  91244. +0x00f,0x00000451,
  91245. +0x019,0x00000000,
  91246. +0x01a,0x00000255,
  91247. +0x01b,0x00060a00,
  91248. +0x01c,0x000fc378,
  91249. +0x01d,0x000a1250,
  91250. +0x01e,0x0004445f,
  91251. +0x01f,0x00080001,
  91252. +0x020,0x0000b614,
  91253. +0x021,0x0006c000,
  91254. +0x022,0x0000083c,
  91255. +0x023,0x00001558,
  91256. +0x024,0x00000060,
  91257. +0x025,0x00000483,
  91258. +0x026,0x0004f000,
  91259. +0x027,0x000ec7d9,
  91260. +0x028,0x000977c0,
  91261. +0x029,0x00004783,
  91262. +0x02a,0x00000001,
  91263. +0x02b,0x00021334,
  91264. +0x02a,0x00000000,
  91265. +0x02b,0x00000054,
  91266. +0x02a,0x00000001,
  91267. +0x02b,0x00000808,
  91268. +0x02b,0x00053333,
  91269. +0x02c,0x0000000c,
  91270. +0x02a,0x00000002,
  91271. +0x02b,0x00000808,
  91272. +0x02b,0x0005b333,
  91273. +0x02c,0x0000000d,
  91274. +0x02a,0x00000003,
  91275. +0x02b,0x00000808,
  91276. +0x02b,0x00063333,
  91277. +0x02c,0x0000000d,
  91278. +0x02a,0x00000004,
  91279. +0x02b,0x00000808,
  91280. +0x02b,0x0006b333,
  91281. +0x02c,0x0000000d,
  91282. +0x02a,0x00000005,
  91283. +0x02b,0x00000808,
  91284. +0x02b,0x00073333,
  91285. +0x02c,0x0000000d,
  91286. +0x02a,0x00000006,
  91287. +0x02b,0x00000709,
  91288. +0x02b,0x0005b333,
  91289. +0x02c,0x0000000d,
  91290. +0x02a,0x00000007,
  91291. +0x02b,0x00000709,
  91292. +0x02b,0x00063333,
  91293. +0x02c,0x0000000d,
  91294. +0x02a,0x00000008,
  91295. +0x02b,0x0000060a,
  91296. +0x02b,0x0004b333,
  91297. +0x02c,0x0000000d,
  91298. +0x02a,0x00000009,
  91299. +0x02b,0x0000060a,
  91300. +0x02b,0x00053333,
  91301. +0x02c,0x0000000d,
  91302. +0x02a,0x0000000a,
  91303. +0x02b,0x0000060a,
  91304. +0x02b,0x0005b333,
  91305. +0x02c,0x0000000d,
  91306. +0x02a,0x0000000b,
  91307. +0x02b,0x0000060a,
  91308. +0x02b,0x00063333,
  91309. +0x02c,0x0000000d,
  91310. +0x02a,0x0000000c,
  91311. +0x02b,0x0000060a,
  91312. +0x02b,0x0006b333,
  91313. +0x02c,0x0000000d,
  91314. +0x02a,0x0000000d,
  91315. +0x02b,0x0000060a,
  91316. +0x02b,0x00073333,
  91317. +0x02c,0x0000000d,
  91318. +0x02a,0x0000000e,
  91319. +0x02b,0x0000050b,
  91320. +0x02b,0x00066666,
  91321. +0x02c,0x0000001a,
  91322. +0x02a,0x000e0000,
  91323. +0x010,0x0004000f,
  91324. +0x011,0x000e31fc,
  91325. +0x010,0x0006000f,
  91326. +0x011,0x000ff9f8,
  91327. +0x010,0x0002000f,
  91328. +0x011,0x000203f9,
  91329. +0x010,0x0003000f,
  91330. +0x011,0x000ff500,
  91331. +0x010,0x00000000,
  91332. +0x011,0x00000000,
  91333. +0x010,0x0008000f,
  91334. +0x011,0x0003f100,
  91335. +0x010,0x0009000f,
  91336. +0x011,0x00023100,
  91337. +0x012,0x000d8000,
  91338. +0x012,0x00090000,
  91339. +0x012,0x00051000,
  91340. +0x012,0x00012000,
  91341. +0x013,0x00028fb4,
  91342. +0x013,0x00024fa8,
  91343. +0x013,0x000207a4,
  91344. +0x013,0x0001c3b0,
  91345. +0x013,0x000183a4,
  91346. +0x013,0x00014398,
  91347. +0x013,0x000101a4,
  91348. +0x013,0x0000c198,
  91349. +0x013,0x000080a4,
  91350. +0x013,0x00004098,
  91351. +0x013,0x00000000,
  91352. +0x014,0x0001944c,
  91353. +0x014,0x00059444,
  91354. +0x014,0x0009944c,
  91355. +0x014,0x000d9444,
  91356. +0x015,0x0000f405,
  91357. +0x015,0x0004f405,
  91358. +0x015,0x0008f405,
  91359. +0x015,0x000cf405,
  91360. +0x016,0x000e0330,
  91361. +0x016,0x000a0330,
  91362. +0x016,0x00060330,
  91363. +0x016,0x00020330,
  91364. +0x000,0x00010159,
  91365. +0x018,0x0000f401,
  91366. +0x0fe,0x00000000,
  91367. +0x0fe,0x00000000,
  91368. +0x01f,0x00080003,
  91369. +0x0fe,0x00000000,
  91370. +0x0fe,0x00000000,
  91371. +0x01e,0x00044457,
  91372. +0x01f,0x00080000,
  91373. +0x000,0x00030159,
  91374. +};
  91375. +
  91376. +u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength] = {
  91377. +0x0, };
  91378. +
  91379. +// MAC reg V14 - 2011-11-23
  91380. +u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength] = {
  91381. +0x420,0x00000080,
  91382. +0x423,0x00000000,
  91383. +0x430,0x00000000,
  91384. +0x431,0x00000000,
  91385. +0x432,0x00000000,
  91386. +0x433,0x00000001,
  91387. +0x434,0x00000004,
  91388. +0x435,0x00000005,
  91389. +0x436,0x00000006,
  91390. +0x437,0x00000007,
  91391. +0x438,0x00000000,
  91392. +0x439,0x00000000,
  91393. +0x43a,0x00000000,
  91394. +0x43b,0x00000001,
  91395. +0x43c,0x00000004,
  91396. +0x43d,0x00000005,
  91397. +0x43e,0x00000006,
  91398. +0x43f,0x00000007,
  91399. +0x440,0x0000005d,
  91400. +0x441,0x00000001,
  91401. +0x442,0x00000000,
  91402. +0x444,0x00000015,
  91403. +0x445,0x000000f0,
  91404. +0x446,0x0000000f,
  91405. +0x447,0x00000000,
  91406. +0x458,0x00000041,
  91407. +0x459,0x000000a8,
  91408. +0x45a,0x00000072,
  91409. +0x45b,0x000000b9,
  91410. +0x460,0x00000066,
  91411. +0x461,0x00000066,
  91412. +0x462,0x00000008,
  91413. +0x463,0x00000003,
  91414. +0x4c8,0x000000ff,
  91415. +0x4c9,0x00000008,
  91416. +0x4cc,0x000000ff,
  91417. +0x4cd,0x000000ff,
  91418. +0x4ce,0x00000001,
  91419. +0x500,0x00000026,
  91420. +0x501,0x000000a2,
  91421. +0x502,0x0000002f,
  91422. +0x503,0x00000000,
  91423. +0x504,0x00000028,
  91424. +0x505,0x000000a3,
  91425. +0x506,0x0000005e,
  91426. +0x507,0x00000000,
  91427. +0x508,0x0000002b,
  91428. +0x509,0x000000a4,
  91429. +0x50a,0x0000005e,
  91430. +0x50b,0x00000000,
  91431. +0x50c,0x0000004f,
  91432. +0x50d,0x000000a4,
  91433. +0x50e,0x00000000,
  91434. +0x50f,0x00000000,
  91435. +0x512,0x0000001c,
  91436. +0x514,0x0000000a,
  91437. +0x515,0x00000010,
  91438. +0x516,0x0000000a,
  91439. +0x517,0x00000010,
  91440. +0x51a,0x00000016,
  91441. +0x524,0x0000000f,
  91442. +0x525,0x0000004f,
  91443. +0x546,0x00000040,
  91444. +0x547,0x00000000,
  91445. +0x550,0x00000010,
  91446. +0x551,0x00000010,
  91447. +0x559,0x00000002,
  91448. +0x55a,0x00000002,
  91449. +0x55d,0x000000ff,
  91450. +0x605,0x00000030,
  91451. +0x608,0x0000000e,
  91452. +0x609,0x0000002a,
  91453. +0x652,0x00000020,
  91454. +0x652,0x00000020,
  91455. +0x63c,0x00000008,
  91456. +0x63d,0x00000008,
  91457. +0x63e,0x0000000c,
  91458. +0x63f,0x0000000c,
  91459. +0x66e,0x00000005,
  91460. +0x700,0x00000021,
  91461. +0x701,0x00000043,
  91462. +0x702,0x00000065,
  91463. +0x703,0x00000087,
  91464. +0x708,0x00000021,
  91465. +0x709,0x00000043,
  91466. +0x70a,0x00000065,
  91467. +0x70b,0x00000087,
  91468. +};
  91469. +
  91470. +u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength] = {
  91471. +0x0, };
  91472. +
  91473. +u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength] = {
  91474. +0xc78,0x7b000001,
  91475. +0xc78,0x7b010001,
  91476. +0xc78,0x7b020001,
  91477. +0xc78,0x7b030001,
  91478. +0xc78,0x7b040001,
  91479. +0xc78,0x7b050001,
  91480. +0xc78,0x7a060001,
  91481. +0xc78,0x79070001,
  91482. +0xc78,0x78080001,
  91483. +0xc78,0x77090001,
  91484. +0xc78,0x760a0001,
  91485. +0xc78,0x750b0001,
  91486. +0xc78,0x740c0001,
  91487. +0xc78,0x730d0001,
  91488. +0xc78,0x720e0001,
  91489. +0xc78,0x710f0001,
  91490. +0xc78,0x70100001,
  91491. +0xc78,0x6f110001,
  91492. +0xc78,0x6e120001,
  91493. +0xc78,0x6d130001,
  91494. +0xc78,0x6c140001,
  91495. +0xc78,0x6b150001,
  91496. +0xc78,0x6a160001,
  91497. +0xc78,0x69170001,
  91498. +0xc78,0x68180001,
  91499. +0xc78,0x67190001,
  91500. +0xc78,0x661a0001,
  91501. +0xc78,0x651b0001,
  91502. +0xc78,0x641c0001,
  91503. +0xc78,0x631d0001,
  91504. +0xc78,0x621e0001,
  91505. +0xc78,0x611f0001,
  91506. +0xc78,0x60200001,
  91507. +0xc78,0x49210001,
  91508. +0xc78,0x48220001,
  91509. +0xc78,0x47230001,
  91510. +0xc78,0x46240001,
  91511. +0xc78,0x45250001,
  91512. +0xc78,0x44260001,
  91513. +0xc78,0x43270001,
  91514. +0xc78,0x42280001,
  91515. +0xc78,0x41290001,
  91516. +0xc78,0x402a0001,
  91517. +0xc78,0x262b0001,
  91518. +0xc78,0x252c0001,
  91519. +0xc78,0x242d0001,
  91520. +0xc78,0x232e0001,
  91521. +0xc78,0x222f0001,
  91522. +0xc78,0x21300001,
  91523. +0xc78,0x20310001,
  91524. +0xc78,0x06320001,
  91525. +0xc78,0x05330001,
  91526. +0xc78,0x04340001,
  91527. +0xc78,0x03350001,
  91528. +0xc78,0x02360001,
  91529. +0xc78,0x01370001,
  91530. +0xc78,0x00380001,
  91531. +0xc78,0x00390001,
  91532. +0xc78,0x003a0001,
  91533. +0xc78,0x003b0001,
  91534. +0xc78,0x003c0001,
  91535. +0xc78,0x003d0001,
  91536. +0xc78,0x003e0001,
  91537. +0xc78,0x003f0001,
  91538. +0xc78,0x7b400001,
  91539. +0xc78,0x7b410001,
  91540. +0xc78,0x7b420001,
  91541. +0xc78,0x7b430001,
  91542. +0xc78,0x7b440001,
  91543. +0xc78,0x7b450001,
  91544. +0xc78,0x7a460001,
  91545. +0xc78,0x79470001,
  91546. +0xc78,0x78480001,
  91547. +0xc78,0x77490001,
  91548. +0xc78,0x764a0001,
  91549. +0xc78,0x754b0001,
  91550. +0xc78,0x744c0001,
  91551. +0xc78,0x734d0001,
  91552. +0xc78,0x724e0001,
  91553. +0xc78,0x714f0001,
  91554. +0xc78,0x70500001,
  91555. +0xc78,0x6f510001,
  91556. +0xc78,0x6e520001,
  91557. +0xc78,0x6d530001,
  91558. +0xc78,0x6c540001,
  91559. +0xc78,0x6b550001,
  91560. +0xc78,0x6a560001,
  91561. +0xc78,0x69570001,
  91562. +0xc78,0x68580001,
  91563. +0xc78,0x67590001,
  91564. +0xc78,0x665a0001,
  91565. +0xc78,0x655b0001,
  91566. +0xc78,0x645c0001,
  91567. +0xc78,0x635d0001,
  91568. +0xc78,0x625e0001,
  91569. +0xc78,0x615f0001,
  91570. +0xc78,0x60600001,
  91571. +0xc78,0x49610001,
  91572. +0xc78,0x48620001,
  91573. +0xc78,0x47630001,
  91574. +0xc78,0x46640001,
  91575. +0xc78,0x45650001,
  91576. +0xc78,0x44660001,
  91577. +0xc78,0x43670001,
  91578. +0xc78,0x42680001,
  91579. +0xc78,0x41690001,
  91580. +0xc78,0x406a0001,
  91581. +0xc78,0x266b0001,
  91582. +0xc78,0x256c0001,
  91583. +0xc78,0x246d0001,
  91584. +0xc78,0x236e0001,
  91585. +0xc78,0x226f0001,
  91586. +0xc78,0x21700001,
  91587. +0xc78,0x20710001,
  91588. +0xc78,0x06720001,
  91589. +0xc78,0x05730001,
  91590. +0xc78,0x04740001,
  91591. +0xc78,0x03750001,
  91592. +0xc78,0x02760001,
  91593. +0xc78,0x01770001,
  91594. +0xc78,0x00780001,
  91595. +0xc78,0x00790001,
  91596. +0xc78,0x007a0001,
  91597. +0xc78,0x007b0001,
  91598. +0xc78,0x007c0001,
  91599. +0xc78,0x007d0001,
  91600. +0xc78,0x007e0001,
  91601. +0xc78,0x007f0001,
  91602. +0xc78,0x3800001e,
  91603. +0xc78,0x3801001e,
  91604. +0xc78,0x3802001e,
  91605. +0xc78,0x3803001e,
  91606. +0xc78,0x3804001e,
  91607. +0xc78,0x3805001e,
  91608. +0xc78,0x3806001e,
  91609. +0xc78,0x3807001e,
  91610. +0xc78,0x3808001e,
  91611. +0xc78,0x3c09001e,
  91612. +0xc78,0x3e0a001e,
  91613. +0xc78,0x400b001e,
  91614. +0xc78,0x440c001e,
  91615. +0xc78,0x480d001e,
  91616. +0xc78,0x4c0e001e,
  91617. +0xc78,0x500f001e,
  91618. +0xc78,0x5210001e,
  91619. +0xc78,0x5611001e,
  91620. +0xc78,0x5a12001e,
  91621. +0xc78,0x5e13001e,
  91622. +0xc78,0x6014001e,
  91623. +0xc78,0x6015001e,
  91624. +0xc78,0x6016001e,
  91625. +0xc78,0x6217001e,
  91626. +0xc78,0x6218001e,
  91627. +0xc78,0x6219001e,
  91628. +0xc78,0x621a001e,
  91629. +0xc78,0x621b001e,
  91630. +0xc78,0x621c001e,
  91631. +0xc78,0x621d001e,
  91632. +0xc78,0x621e001e,
  91633. +0xc78,0x621f001e,
  91634. +};
  91635. +
  91636. +u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength] = {
  91637. +0xc78,0x7b000001,
  91638. +0xc78,0x7b010001,
  91639. +0xc78,0x7b020001,
  91640. +0xc78,0x7b030001,
  91641. +0xc78,0x7b040001,
  91642. +0xc78,0x7b050001,
  91643. +0xc78,0x7a060001,
  91644. +0xc78,0x79070001,
  91645. +0xc78,0x78080001,
  91646. +0xc78,0x77090001,
  91647. +0xc78,0x760a0001,
  91648. +0xc78,0x750b0001,
  91649. +0xc78,0x740c0001,
  91650. +0xc78,0x730d0001,
  91651. +0xc78,0x720e0001,
  91652. +0xc78,0x710f0001,
  91653. +0xc78,0x70100001,
  91654. +0xc78,0x6f110001,
  91655. +0xc78,0x6e120001,
  91656. +0xc78,0x6d130001,
  91657. +0xc78,0x6c140001,
  91658. +0xc78,0x6b150001,
  91659. +0xc78,0x6a160001,
  91660. +0xc78,0x69170001,
  91661. +0xc78,0x68180001,
  91662. +0xc78,0x67190001,
  91663. +0xc78,0x661a0001,
  91664. +0xc78,0x651b0001,
  91665. +0xc78,0x641c0001,
  91666. +0xc78,0x631d0001,
  91667. +0xc78,0x621e0001,
  91668. +0xc78,0x611f0001,
  91669. +0xc78,0x60200001,
  91670. +0xc78,0x49210001,
  91671. +0xc78,0x48220001,
  91672. +0xc78,0x47230001,
  91673. +0xc78,0x46240001,
  91674. +0xc78,0x45250001,
  91675. +0xc78,0x44260001,
  91676. +0xc78,0x43270001,
  91677. +0xc78,0x42280001,
  91678. +0xc78,0x41290001,
  91679. +0xc78,0x402a0001,
  91680. +0xc78,0x262b0001,
  91681. +0xc78,0x252c0001,
  91682. +0xc78,0x242d0001,
  91683. +0xc78,0x232e0001,
  91684. +0xc78,0x222f0001,
  91685. +0xc78,0x21300001,
  91686. +0xc78,0x20310001,
  91687. +0xc78,0x06320001,
  91688. +0xc78,0x05330001,
  91689. +0xc78,0x04340001,
  91690. +0xc78,0x03350001,
  91691. +0xc78,0x02360001,
  91692. +0xc78,0x01370001,
  91693. +0xc78,0x00380001,
  91694. +0xc78,0x00390001,
  91695. +0xc78,0x003a0001,
  91696. +0xc78,0x003b0001,
  91697. +0xc78,0x003c0001,
  91698. +0xc78,0x003d0001,
  91699. +0xc78,0x003e0001,
  91700. +0xc78,0x003f0001,
  91701. +0xc78,0x7b400001,
  91702. +0xc78,0x7b410001,
  91703. +0xc78,0x7b420001,
  91704. +0xc78,0x7b430001,
  91705. +0xc78,0x7b440001,
  91706. +0xc78,0x7b450001,
  91707. +0xc78,0x7a460001,
  91708. +0xc78,0x79470001,
  91709. +0xc78,0x78480001,
  91710. +0xc78,0x77490001,
  91711. +0xc78,0x764a0001,
  91712. +0xc78,0x754b0001,
  91713. +0xc78,0x744c0001,
  91714. +0xc78,0x734d0001,
  91715. +0xc78,0x724e0001,
  91716. +0xc78,0x714f0001,
  91717. +0xc78,0x70500001,
  91718. +0xc78,0x6f510001,
  91719. +0xc78,0x6e520001,
  91720. +0xc78,0x6d530001,
  91721. +0xc78,0x6c540001,
  91722. +0xc78,0x6b550001,
  91723. +0xc78,0x6a560001,
  91724. +0xc78,0x69570001,
  91725. +0xc78,0x68580001,
  91726. +0xc78,0x67590001,
  91727. +0xc78,0x665a0001,
  91728. +0xc78,0x655b0001,
  91729. +0xc78,0x645c0001,
  91730. +0xc78,0x635d0001,
  91731. +0xc78,0x625e0001,
  91732. +0xc78,0x615f0001,
  91733. +0xc78,0x60600001,
  91734. +0xc78,0x49610001,
  91735. +0xc78,0x48620001,
  91736. +0xc78,0x47630001,
  91737. +0xc78,0x46640001,
  91738. +0xc78,0x45650001,
  91739. +0xc78,0x44660001,
  91740. +0xc78,0x43670001,
  91741. +0xc78,0x42680001,
  91742. +0xc78,0x41690001,
  91743. +0xc78,0x406a0001,
  91744. +0xc78,0x266b0001,
  91745. +0xc78,0x256c0001,
  91746. +0xc78,0x246d0001,
  91747. +0xc78,0x236e0001,
  91748. +0xc78,0x226f0001,
  91749. +0xc78,0x21700001,
  91750. +0xc78,0x20710001,
  91751. +0xc78,0x06720001,
  91752. +0xc78,0x05730001,
  91753. +0xc78,0x04740001,
  91754. +0xc78,0x03750001,
  91755. +0xc78,0x02760001,
  91756. +0xc78,0x01770001,
  91757. +0xc78,0x00780001,
  91758. +0xc78,0x00790001,
  91759. +0xc78,0x007a0001,
  91760. +0xc78,0x007b0001,
  91761. +0xc78,0x007c0001,
  91762. +0xc78,0x007d0001,
  91763. +0xc78,0x007e0001,
  91764. +0xc78,0x007f0001,
  91765. +0xc78,0x3800001e,
  91766. +0xc78,0x3801001e,
  91767. +0xc78,0x3802001e,
  91768. +0xc78,0x3803001e,
  91769. +0xc78,0x3804001e,
  91770. +0xc78,0x3805001e,
  91771. +0xc78,0x3806001e,
  91772. +0xc78,0x3807001e,
  91773. +0xc78,0x3808001e,
  91774. +0xc78,0x3c09001e,
  91775. +0xc78,0x3e0a001e,
  91776. +0xc78,0x400b001e,
  91777. +0xc78,0x440c001e,
  91778. +0xc78,0x480d001e,
  91779. +0xc78,0x4c0e001e,
  91780. +0xc78,0x500f001e,
  91781. +0xc78,0x5210001e,
  91782. +0xc78,0x5611001e,
  91783. +0xc78,0x5a12001e,
  91784. +0xc78,0x5e13001e,
  91785. +0xc78,0x6014001e,
  91786. +0xc78,0x6015001e,
  91787. +0xc78,0x6016001e,
  91788. +0xc78,0x6217001e,
  91789. +0xc78,0x6218001e,
  91790. +0xc78,0x6219001e,
  91791. +0xc78,0x621a001e,
  91792. +0xc78,0x621b001e,
  91793. +0xc78,0x621c001e,
  91794. +0xc78,0x621d001e,
  91795. +0xc78,0x621e001e,
  91796. +0xc78,0x621f001e,
  91797. +};
  91798. +
  91799. +u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength] = {
  91800. +0xc78,0x7b000001,
  91801. +0xc78,0x7b010001,
  91802. +0xc78,0x7b020001,
  91803. +0xc78,0x7b030001,
  91804. +0xc78,0x7b040001,
  91805. +0xc78,0x7b050001,
  91806. +0xc78,0x7b060001,
  91807. +0xc78,0x7b070001,
  91808. +0xc78,0x7b080001,
  91809. +0xc78,0x7a090001,
  91810. +0xc78,0x790a0001,
  91811. +0xc78,0x780b0001,
  91812. +0xc78,0x770c0001,
  91813. +0xc78,0x760d0001,
  91814. +0xc78,0x750e0001,
  91815. +0xc78,0x740f0001,
  91816. +0xc78,0x73100001,
  91817. +0xc78,0x72110001,
  91818. +0xc78,0x71120001,
  91819. +0xc78,0x70130001,
  91820. +0xc78,0x6f140001,
  91821. +0xc78,0x6e150001,
  91822. +0xc78,0x6d160001,
  91823. +0xc78,0x6c170001,
  91824. +0xc78,0x6b180001,
  91825. +0xc78,0x6a190001,
  91826. +0xc78,0x691a0001,
  91827. +0xc78,0x681b0001,
  91828. +0xc78,0x671c0001,
  91829. +0xc78,0x661d0001,
  91830. +0xc78,0x651e0001,
  91831. +0xc78,0x641f0001,
  91832. +0xc78,0x63200001,
  91833. +0xc78,0x62210001,
  91834. +0xc78,0x61220001,
  91835. +0xc78,0x60230001,
  91836. +0xc78,0x46240001,
  91837. +0xc78,0x45250001,
  91838. +0xc78,0x44260001,
  91839. +0xc78,0x43270001,
  91840. +0xc78,0x42280001,
  91841. +0xc78,0x41290001,
  91842. +0xc78,0x402a0001,
  91843. +0xc78,0x262b0001,
  91844. +0xc78,0x252c0001,
  91845. +0xc78,0x242d0001,
  91846. +0xc78,0x232e0001,
  91847. +0xc78,0x222f0001,
  91848. +0xc78,0x21300001,
  91849. +0xc78,0x20310001,
  91850. +0xc78,0x06320001,
  91851. +0xc78,0x05330001,
  91852. +0xc78,0x04340001,
  91853. +0xc78,0x03350001,
  91854. +0xc78,0x02360001,
  91855. +0xc78,0x01370001,
  91856. +0xc78,0x00380001,
  91857. +0xc78,0x00390001,
  91858. +0xc78,0x003a0001,
  91859. +0xc78,0x003b0001,
  91860. +0xc78,0x003c0001,
  91861. +0xc78,0x003d0001,
  91862. +0xc78,0x003e0001,
  91863. +0xc78,0x003f0001,
  91864. +0xc78,0x7b400001,
  91865. +0xc78,0x7b410001,
  91866. +0xc78,0x7b420001,
  91867. +0xc78,0x7b430001,
  91868. +0xc78,0x7b440001,
  91869. +0xc78,0x7b450001,
  91870. +0xc78,0x7b460001,
  91871. +0xc78,0x7b470001,
  91872. +0xc78,0x7b480001,
  91873. +0xc78,0x7a490001,
  91874. +0xc78,0x794a0001,
  91875. +0xc78,0x784b0001,
  91876. +0xc78,0x774c0001,
  91877. +0xc78,0x764d0001,
  91878. +0xc78,0x754e0001,
  91879. +0xc78,0x744f0001,
  91880. +0xc78,0x73500001,
  91881. +0xc78,0x72510001,
  91882. +0xc78,0x71520001,
  91883. +0xc78,0x70530001,
  91884. +0xc78,0x6f540001,
  91885. +0xc78,0x6e550001,
  91886. +0xc78,0x6d560001,
  91887. +0xc78,0x6c570001,
  91888. +0xc78,0x6b580001,
  91889. +0xc78,0x6a590001,
  91890. +0xc78,0x695a0001,
  91891. +0xc78,0x685b0001,
  91892. +0xc78,0x675c0001,
  91893. +0xc78,0x665d0001,
  91894. +0xc78,0x655e0001,
  91895. +0xc78,0x645f0001,
  91896. +0xc78,0x63600001,
  91897. +0xc78,0x62610001,
  91898. +0xc78,0x61620001,
  91899. +0xc78,0x60630001,
  91900. +0xc78,0x46640001,
  91901. +0xc78,0x45650001,
  91902. +0xc78,0x44660001,
  91903. +0xc78,0x43670001,
  91904. +0xc78,0x42680001,
  91905. +0xc78,0x41690001,
  91906. +0xc78,0x406a0001,
  91907. +0xc78,0x266b0001,
  91908. +0xc78,0x256c0001,
  91909. +0xc78,0x246d0001,
  91910. +0xc78,0x236e0001,
  91911. +0xc78,0x226f0001,
  91912. +0xc78,0x21700001,
  91913. +0xc78,0x20710001,
  91914. +0xc78,0x06720001,
  91915. +0xc78,0x05730001,
  91916. +0xc78,0x04740001,
  91917. +0xc78,0x03750001,
  91918. +0xc78,0x02760001,
  91919. +0xc78,0x01770001,
  91920. +0xc78,0x00780001,
  91921. +0xc78,0x00790001,
  91922. +0xc78,0x007a0001,
  91923. +0xc78,0x007b0001,
  91924. +0xc78,0x007c0001,
  91925. +0xc78,0x007d0001,
  91926. +0xc78,0x007e0001,
  91927. +0xc78,0x007f0001,
  91928. +0xc78,0x3800001e,
  91929. +0xc78,0x3801001e,
  91930. +0xc78,0x3802001e,
  91931. +0xc78,0x3803001e,
  91932. +0xc78,0x3804001e,
  91933. +0xc78,0x3805001e,
  91934. +0xc78,0x3806001e,
  91935. +0xc78,0x3807001e,
  91936. +0xc78,0x3808001e,
  91937. +0xc78,0x3c09001e,
  91938. +0xc78,0x3e0a001e,
  91939. +0xc78,0x400b001e,
  91940. +0xc78,0x440c001e,
  91941. +0xc78,0x480d001e,
  91942. +0xc78,0x4c0e001e,
  91943. +0xc78,0x500f001e,
  91944. +0xc78,0x5210001e,
  91945. +0xc78,0x5611001e,
  91946. +0xc78,0x5a12001e,
  91947. +0xc78,0x5e13001e,
  91948. +0xc78,0x6014001e,
  91949. +0xc78,0x6015001e,
  91950. +0xc78,0x6016001e,
  91951. +0xc78,0x6217001e,
  91952. +0xc78,0x6218001e,
  91953. +0xc78,0x6219001e,
  91954. +0xc78,0x621a001e,
  91955. +0xc78,0x621b001e,
  91956. +0xc78,0x621c001e,
  91957. +0xc78,0x621d001e,
  91958. +0xc78,0x621e001e,
  91959. +0xc78,0x621f001e,
  91960. +};
  91961. --- /dev/null
  91962. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c
  91963. @@ -0,0 +1,2557 @@
  91964. +/******************************************************************************
  91965. + *
  91966. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  91967. + *
  91968. + * This program is free software; you can redistribute it and/or modify it
  91969. + * under the terms of version 2 of the GNU General Public License as
  91970. + * published by the Free Software Foundation.
  91971. + *
  91972. + * This program is distributed in the hope that it will be useful, but WITHOUT
  91973. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  91974. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  91975. + * more details.
  91976. + *
  91977. + * You should have received a copy of the GNU General Public License along with
  91978. + * this program; if not, write to the Free Software Foundation, Inc.,
  91979. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  91980. + *
  91981. + *
  91982. + ******************************************************************************/
  91983. +/*Created on 2011/11/ 8, 14:15*/
  91984. +
  91985. +#include <basic_types.h>
  91986. +#include "Hal8192CUHWImg_wowlan.h"
  91987. +
  91988. +
  91989. +u8 Rtl8192CUFwTSMCWWImgArray[TSMCWWImgArrayLength] = {
  91990. +0xc1,0x88,0x02,0x00,0x51,0x00,0x00,0x00,0x03,0x23,0x16,0x43,0x72,0x34,0x00,0x00,
  91991. +0x58,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91992. +0x02,0x43,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91993. +0x00,0x00,0x00,0x02,0x57,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91994. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91995. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91996. +0x00,0x00,0x00,0x02,0x5c,0xb6,0x00,0x00,0x00,0x00,0x00,0x02,0x5d,0x99,0x00,0x00,
  91997. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91998. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91999. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92000. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92001. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92002. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92003. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92004. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92005. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92006. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92007. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92008. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92009. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92010. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92011. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92012. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92013. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92014. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92015. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92016. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92017. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92018. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92019. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92020. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92021. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92022. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92023. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92024. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92025. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92026. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  92027. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  92028. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  92029. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  92030. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  92031. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  92032. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  92033. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,
  92034. +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,
  92035. +0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,
  92036. +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xf8,
  92037. +0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,
  92038. +0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,
  92039. +0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,
  92040. +0x4a,0xfe,0xed,0x49,0xfd,0xec,0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,
  92041. +0xfe,0xa3,0xe0,0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,
  92042. +0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,
  92043. +0xf9,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,
  92044. +0x22,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,
  92045. +0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,
  92046. +0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,
  92047. +0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,
  92048. +0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,
  92049. +0x06,0x74,0x03,0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0x02,0x43,0xdb,
  92050. +0x02,0x50,0x2a,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,
  92051. +0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,
  92052. +0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,
  92053. +0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x20,0xe4,0x7e,
  92054. +0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,
  92055. +0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,
  92056. +0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,
  92057. +0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,
  92058. +0x41,0x91,0x40,0x00,0x41,0x91,0x9c,0x00,0x41,0x91,0x23,0x80,0x41,0x91,0x24,0x80,
  92059. +0x41,0x91,0x9e,0x00,0x41,0x91,0x52,0x00,0x41,0x91,0x93,0x00,0x41,0x91,0x91,0x00,
  92060. +0x41,0x91,0x90,0x00,0x41,0x91,0x92,0x00,0x00,0xf0,0x90,0x91,0x30,0xe0,0x90,0x91,
  92061. +0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  92062. +0x90,0x91,0x65,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,
  92063. +0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,
  92064. +0x08,0xf0,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,
  92065. +0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x59,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,
  92066. +0x92,0x74,0x02,0xf0,0x90,0x91,0x36,0x14,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x0c,
  92067. +0x50,0x02,0xf1,0x23,0x22,0x90,0x02,0x84,0xef,0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,
  92068. +0xf0,0x22,0x7d,0x01,0xaf,0x6f,0xe1,0x27,0xf1,0xe6,0xbf,0x01,0x10,0x90,0x91,0x42,
  92069. +0xe0,0xff,0xe4,0xfd,0x12,0x48,0x22,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x8f,0x82,
  92070. +0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x72,0x7f,0x60,0x7e,0x01,0x80,
  92071. +0xed,0x7f,0x00,0x22,0x90,0x91,0x53,0xe0,0x54,0xfe,0xf0,0x02,0x50,0xd6,0x22,0xe4,
  92072. +0xf5,0x75,0x22,0x02,0x5f,0xe2,0x02,0x5f,0xe9,0xef,0x8e,0xf0,0x71,0x70,0x45,0x26,
  92073. +0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5,
  92074. +0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  92075. +0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce,
  92076. +0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54,
  92077. +0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c,
  92078. +0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce,
  92079. +0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04,
  92080. +0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01,
  92081. +0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3,
  92082. +0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  92083. +0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25,
  92084. +0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0x90,0x91,0x09,0x12,0x2a,0x8b,0x00,0x00,0x00,
  92085. +0x00,0x90,0x06,0xa9,0xe0,0x90,0x91,0x08,0xf0,0xe0,0x54,0xc0,0x70,0x0a,0x53,0x71,
  92086. +0xfe,0x53,0x71,0xfd,0x91,0xc2,0x80,0x47,0x90,0x91,0x26,0xe0,0x60,0x41,0x90,0x91,
  92087. +0x38,0xe0,0x70,0x3b,0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x27,
  92088. +0xde,0x90,0x91,0x09,0x12,0x2a,0x7f,0x90,0x91,0x09,0x71,0x09,0xec,0x44,0x02,0xfc,
  92089. +0x90,0x91,0x09,0x12,0x2a,0x7f,0x90,0x91,0x09,0x71,0x09,0x90,0x80,0x85,0x12,0x2a,
  92090. +0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x90,
  92091. +0x91,0x08,0xe0,0x30,0xe6,0x13,0x43,0x71,0x01,0x90,0x91,0x3b,0xe0,0x64,0x02,0x60,
  92092. +0x04,0x91,0xc8,0x80,0x07,0x91,0x77,0x80,0x03,0x53,0x71,0xfe,0x90,0x91,0x08,0xe0,
  92093. +0x30,0xe7,0x16,0x43,0x71,0x02,0xe4,0x90,0x91,0x66,0x91,0x49,0x90,0x01,0x57,0x74,
  92094. +0x05,0xf0,0x90,0x91,0x3c,0x74,0x01,0xf0,0x22,0x53,0x71,0xfd,0x22,0xd3,0x10,0xaf,
  92095. +0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x91,0x68,0x71,0x41,0xab,
  92096. +0x63,0xaa,0x64,0xa9,0x65,0x90,0x91,0x6b,0x71,0x41,0xaf,0x66,0x15,0x66,0xef,0x60,
  92097. +0x1b,0x90,0x91,0x6b,0xe4,0x75,0xf0,0x01,0x71,0x2a,0x12,0x29,0xd9,0xff,0x90,0x91,
  92098. +0x68,0xe4,0x75,0xf0,0x01,0x71,0x2a,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,
  92099. +0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,
  92100. +0x6e,0x71,0x41,0x90,0x91,0x9e,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x51,0x5f,
  92101. +0x7f,0xaf,0x7e,0x01,0x12,0x64,0x1c,0xef,0x60,0x44,0x90,0x91,0x6e,0x71,0x21,0x8b,
  92102. +0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0xd1,0x6d,
  92103. +0x90,0x91,0x71,0x71,0x21,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x91,0x6e,0x71,0x21,
  92104. +0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0xd1,
  92105. +0x6d,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,
  92106. +0x92,0xaf,0x22,0x7d,0x01,0x7f,0x0c,0x90,0x91,0x95,0xed,0xf0,0x90,0x91,0x94,0xef,
  92107. +0xf0,0x54,0x0f,0xff,0xe5,0x6e,0x54,0x0f,0x6f,0x60,0x76,0x90,0x91,0x94,0xe0,0x30,
  92108. +0xe2,0x30,0xe5,0x6e,0x20,0xe2,0x05,0x7f,0x01,0x12,0x62,0x65,0xe5,0x6e,0x30,0xe3,
  92109. +0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,0x08,0x12,0x5a,0x3f,0xef,0x60,0x53,0x80,0x52,
  92110. +0xe5,0x6e,0x20,0xe3,0x4c,0x90,0x91,0x94,0xe0,0x30,0xe3,0x45,0xa3,0xe0,0xff,0x02,
  92111. +0x62,0x4a,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x0c,0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,
  92112. +0x08,0x12,0x5a,0x3f,0xef,0x60,0x2a,0xf1,0xb2,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x04,
  92113. +0x10,0x90,0x91,0x94,0xe0,0x20,0xe2,0x09,0x12,0x5b,0xb3,0xef,0x60,0x13,0x12,0x48,
  92114. +0xce,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x02,0x08,0x91,0xf1,0xef,0x60,0x03,0x12,0x63,
  92115. +0x56,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x6d,0xb4,0x01,0x04,0x7f,0x01,
  92116. +0xf1,0xc9,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x8f,0x67,0xf1,0xe6,0xbf,0x01,0x15,
  92117. +0x90,0x91,0x43,0x12,0x48,0x1e,0xad,0x07,0xac,0x06,0xaf,0x67,0x12,0x61,0xa3,0x90,
  92118. +0x04,0x1f,0x74,0x20,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x01,0xc4,
  92119. +0x74,0xe6,0xf0,0x74,0x47,0xa3,0xf0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,
  92120. +0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,
  92121. +0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,
  92122. +0x7d,0x01,0x90,0x91,0x74,0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,
  92123. +0x70,0x60,0x04,0xe4,0xff,0x11,0xb3,0x90,0x91,0x74,0xe0,0x30,0xe0,0x09,0x90,0x91,
  92124. +0x76,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90,0x91,0x74,0xe0,0xff,0xc3,0x13,0x90,0xfd,
  92125. +0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90,0x91,0x75,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,
  92126. +0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,
  92127. +0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x91,0x76,0xa3,
  92128. +0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,
  92129. +0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,
  92130. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x91,0x76,0xe0,0xfe,0xa3,
  92131. +0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x91,0x51,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,
  92132. +0x09,0x90,0x91,0x51,0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x68,0x87,0x22,0x90,0x01,
  92133. +0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x68,0x46,0xef,0x70,0x06,
  92134. +0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0xe5,0x70,0x60,
  92135. +0x04,0x7f,0x01,0x11,0xb3,0x51,0x0c,0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0xef,0x64,
  92136. +0x01,0x70,0x42,0x7d,0x78,0x7f,0x02,0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,
  92137. +0x75,0x90,0x01,0x36,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x36,0xe6,0x7d,0x10,0x7f,
  92138. +0x03,0x12,0x36,0x92,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,
  92139. +0x47,0x23,0xe4,0xff,0x11,0xb3,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,
  92140. +0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7b,0xf0,0xa3,0x74,0x02,0xf0,0x7d,
  92141. +0x7b,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0x7d,0x10,0x7f,0x03,
  92142. +0x12,0x36,0x92,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,
  92143. +0xf0,0x12,0x64,0x11,0xe5,0x6d,0x20,0xe0,0x05,0xe4,0x90,0x91,0x29,0xf0,0x22,0x8b,
  92144. +0x0e,0x8a,0x0f,0x89,0x10,0x12,0x62,0x3e,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x12,0x29,
  92145. +0xd9,0xf5,0x70,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,
  92146. +0x7f,0x01,0x80,0x3a,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,0x12,0x42,0x20,
  92147. +0xfd,0xe4,0xff,0x31,0xe1,0x80,0x27,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,
  92148. +0x12,0x42,0x20,0xfd,0x7f,0x01,0x31,0xe1,0x1f,0x80,0x13,0xab,0x0e,0xaa,0x0f,0xa9,
  92149. +0x10,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0xe1,0xe4,0xff,0x11,0xfe,
  92150. +0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x91,0x39,0x74,0x01,0xf0,0x80,
  92151. +0x16,0xed,0x70,0x0a,0x90,0x91,0x35,0xe0,0x90,0x91,0x39,0xf0,0x80,0x05,0x90,0x91,
  92152. +0x39,0xed,0xf0,0x90,0x91,0x39,0xe0,0x90,0x91,0x27,0xf0,0x22,0x7f,0x78,0x7e,0x08,
  92153. +0x12,0x27,0xde,0x90,0x90,0xd8,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,
  92154. +0x90,0x90,0xdc,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0xe0,
  92155. +0x12,0x2a,0x7f,0x90,0x91,0x51,0xe0,0x90,0x90,0xd8,0xb4,0x01,0x0d,0x12,0x43,0x09,
  92156. +0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x09,0xef,0x54,0xc7,
  92157. +0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,
  92158. +0x90,0xdc,0x12,0x43,0x09,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,
  92159. +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,0xe0,0x12,0x43,0x09,0xef,0x44,0x02,
  92160. +0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x7f,
  92161. +0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xe4,0x12,0x2a,0x7f,0x90,0x80,0x85,0x12,
  92162. +0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,
  92163. +0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x91,0x51,
  92164. +0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,
  92165. +0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x80,0x08,0xf4,0xff,
  92166. +0x90,0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,
  92167. +0xfe,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x9b,
  92168. +0xed,0xf0,0x90,0x91,0x9a,0xef,0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,0xff,0x74,0x01,
  92169. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,
  92170. +0xf0,0x51,0xe6,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,
  92171. +0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x9b,0xe0,
  92172. +0x60,0x16,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  92173. +0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x66,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,
  92174. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6b,0x90,
  92175. +0x91,0x9a,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,
  92176. +0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x51,0xde,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,
  92177. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x51,
  92178. +0xe6,0x90,0x91,0x9b,0xe0,0x60,0x1b,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,
  92179. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,
  92180. +0x80,0x1a,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  92181. +0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x51,0xe6,0xd0,
  92182. +0xd0,0x92,0xaf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd,0x7f,0x45,0xd3,0x10,
  92183. +0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0x51,0xe6,0xd0,0xd0,
  92184. +0x92,0xaf,0x22,0xef,0x14,0x60,0x30,0x14,0x60,0x66,0x24,0x02,0x60,0x02,0x81,0xaa,
  92185. +0x90,0x90,0xf3,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x71,
  92186. +0xee,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x71,0xee,0x90,0x00,0x45,0xe0,
  92187. +0x44,0x10,0xfd,0x7f,0x45,0x80,0x71,0xe4,0x90,0x90,0xf3,0xf0,0x90,0x90,0xef,0x12,
  92188. +0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,
  92189. +0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x71,0xee,0x90,0x00,0x45,0xe0,0x54,0xef,
  92190. +0xfd,0x7f,0x45,0x71,0xee,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x38,
  92191. +0x90,0x90,0xf3,0x74,0x01,0xf0,0x90,0x90,0xf9,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  92192. +0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,
  92193. +0x7f,0x45,0x71,0xee,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x71,0xee,0x90,
  92194. +0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x71,0xee,0x22,0x90,0x00,0x02,0x12,0x42,
  92195. +0x20,0x90,0x90,0xf5,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,
  92196. +0x90,0xf4,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,0xe0,0x90,0x90,0xf8,0xf0,0x90,0x05,
  92197. +0x60,0xe0,0x90,0x91,0x03,0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,
  92198. +0x62,0xe0,0x90,0x91,0x05,0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xa2,0xaf,
  92199. +0xe4,0x33,0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x90,0x90,0xf4,0xe0,0xff,0x12,0x6e,0x67,
  92200. +0x90,0x91,0x1c,0xe0,0x24,0xff,0x92,0xaf,0x90,0x90,0xf5,0xe0,0x70,0x02,0xa1,0xb2,
  92201. +0x90,0x90,0xf4,0xe0,0x70,0x02,0xa1,0xb2,0x90,0x90,0xf8,0xe0,0x70,0x02,0xa1,0xb2,
  92202. +0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x90,0x91,0x07,0x74,0x01,0xf0,
  92203. +0x90,0x91,0x1c,0xe0,0x24,0xff,0x92,0xaf,0x71,0xe5,0x90,0x00,0x46,0xe0,0x44,0x01,
  92204. +0xfd,0x7f,0x46,0x71,0xee,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,
  92205. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,
  92206. +0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x71,
  92207. +0xee,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,0x03,0xe0,0x90,0x05,0x84,0xf0,
  92208. +0x90,0x91,0x04,0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,0x05,0xe0,0x90,0x05,0x86,0xf0,
  92209. +0x90,0x91,0x06,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,0xf0,
  92210. +0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,
  92211. +0x80,0x2b,0x90,0x90,0xf5,0xe0,0x70,0x2d,0x90,0x91,0x07,0x71,0xe4,0x90,0x00,0x46,
  92212. +0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x71,0xee,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,
  92213. +0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x91,0x1c,
  92214. +0xe0,0x24,0xff,0x92,0xaf,0x22,0x8b,0x0e,0x8a,0x0f,0x89,0x10,0x90,0x00,0x02,0x12,
  92215. +0x42,0x20,0x90,0x90,0xf6,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x90,0xed,0x74,0x01,0xf0,
  92216. +0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0xef,0x12,0x2a,0x7f,0xab,0x0e,0xaa,
  92217. +0x0f,0xa9,0x10,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,
  92218. +0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x90,0xef,0x12,0x43,
  92219. +0x09,0xec,0x54,0x03,0xfc,0x12,0x42,0xfc,0x90,0x90,0xf9,0x12,0x2a,0x7f,0x90,0x05,
  92220. +0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90,0x90,0xed,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,
  92221. +0xde,0xec,0x54,0x03,0xfc,0xec,0x44,0xc0,0xfc,0x90,0x90,0xef,0x12,0x2a,0x7f,0x90,
  92222. +0x90,0xef,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,
  92223. +0x2f,0xd9,0x90,0x90,0xf6,0xe0,0x30,0xe1,0x19,0x7d,0x0c,0x7f,0x47,0x71,0xee,0x90,
  92224. +0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x71,0xee,0x90,0x00,0x46,0xe0,0x44,0x10,
  92225. +0x80,0x1c,0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x71,0xee,0x90,0x00,0x48,
  92226. +0xe0,0x54,0xf3,0xfd,0x7f,0x48,0x71,0xee,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,
  92227. +0x46,0x71,0xee,0xe4,0x90,0x90,0xf3,0xf0,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,
  92228. +0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,
  92229. +0x71,0xee,0x7d,0xff,0x7f,0x55,0x71,0xee,0x7d,0xff,0x7f,0x56,0x71,0xee,0x7d,0xff,
  92230. +0x7f,0x57,0x61,0xee,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,
  92231. +0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x71,0xee,0xe4,0xfd,
  92232. +0x7f,0x51,0x71,0xee,0xe4,0xfd,0x7f,0x52,0x71,0xee,0xe4,0xfd,0x7f,0x53,0x61,0xee,
  92233. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x22,0xed,0xf0,0x90,0x91,0x21,0xef,
  92234. +0xf0,0xd3,0x94,0x07,0x50,0x4e,0xa3,0xe0,0x70,0x1a,0x90,0x91,0x21,0xe0,0xff,0x74,
  92235. +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,
  92236. +0x5f,0xf0,0x80,0x17,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  92237. +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x21,
  92238. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,
  92239. +0x00,0x46,0x80,0x59,0x90,0x91,0x21,0xe0,0x24,0xf8,0xf0,0xa3,0xe0,0x70,0x1d,0x90,
  92240. +0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,
  92241. +0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80,0x1a,0x90,0x91,0x21,0xe0,
  92242. +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,
  92243. +0x90,0x00,0x43,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,
  92244. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,
  92245. +0x51,0xe6,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x49,0xe0,0x90,0x91,0x9f,0xf0,0xe0,
  92246. +0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x71,0xee,0x90,0x91,0x9f,0xe0,0x44,0xb0,
  92247. +0xfd,0x7f,0x49,0x61,0xee,0x12,0x47,0xe6,0xbf,0x01,0x10,0x90,0x02,0x09,0xe0,0xff,
  92248. +0x7d,0x01,0x12,0x48,0x22,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x75,0x28,0x33,0xe4,
  92249. +0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,
  92250. +0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4,0x90,0x91,0x0e,0xf0,0xa3,
  92251. +0xf0,0x75,0x8e,0x02,0xf1,0x25,0xd1,0xe8,0x90,0x91,0x4f,0xef,0xf0,0xf1,0x0b,0x90,
  92252. +0x91,0x51,0xef,0xf0,0xf1,0x60,0x90,0x91,0x3d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5,
  92253. +0x57,0xf1,0x02,0x12,0x61,0xc4,0x12,0x32,0x3d,0x12,0x44,0xff,0x11,0x0c,0xf1,0x36,
  92254. +0xd1,0xfb,0xd1,0xd0,0x12,0x44,0xfe,0x31,0x13,0x12,0x44,0xf4,0x12,0x6e,0x09,0x90,
  92255. +0x91,0x10,0xe5,0xd9,0xf0,0x12,0x4e,0xb9,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,
  92256. +0xf0,0x12,0x4a,0xe6,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x91,0x0e,0xe0,
  92257. +0x64,0x01,0xf0,0x24,0x2a,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57,0x30,
  92258. +0xe2,0x10,0x12,0x5f,0xf0,0xbf,0x01,0x0a,0xc2,0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,
  92259. +0x71,0x97,0xe5,0x57,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x12,0x60,
  92260. +0x2d,0x90,0x90,0xf7,0xe0,0x70,0x03,0x12,0x70,0x74,0x11,0xe7,0x90,0x91,0x3f,0xe0,
  92261. +0x90,0x01,0xba,0xf0,0x80,0xb6,0xe4,0x90,0x91,0x55,0xf0,0x90,0x91,0x53,0xe0,0x54,
  92262. +0x7f,0xf0,0xa3,0x74,0x0a,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x25,0x14,0x70,0x1b,
  92263. +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x67,0xe4,0xbf,0x01,0x09,
  92264. +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x04,0x80,0x00,0xe1,0x17,0xe4,0x90,0x06,
  92265. +0x34,0xf0,0x22,0x90,0x91,0x56,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x7f,0xf0,0x90,0x01,
  92266. +0x17,0xe0,0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x91,
  92267. +0x5c,0xf0,0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x91,0x1c,0xf0,0xe0,
  92268. +0xff,0x74,0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,
  92269. +0xf9,0x90,0x91,0x5b,0xf0,0xee,0x90,0x91,0x5a,0xf0,0x90,0x91,0x5e,0xe0,0x54,0xfe,
  92270. +0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0,0x54,0xef,
  92271. +0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4,0xa3,0xf0,
  92272. +0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x22,
  92273. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x12,0x29,0xd9,0x54,0x01,0xff,0x90,0x91,0x56,
  92274. +0xe0,0x54,0xfe,0x4f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x57,0xf0,0x90,
  92275. +0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x58,0xf0,0x90,0x91,0x56,0xe0,0x30,0xe0,0x1a,
  92276. +0x90,0x06,0x09,0xe0,0x54,0xfe,0xf0,0x90,0x02,0x86,0xe0,0x44,0x04,0xf0,0x43,0x57,
  92277. +0x04,0x7d,0x08,0xe4,0xff,0x12,0x36,0xe6,0x80,0x12,0x7d,0x08,0xe4,0xff,0x12,0x36,
  92278. +0x75,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x31,0xf1,0x31,0x13,0xd0,0xd0,0x92,0xaf,
  92279. +0x22,0x90,0x06,0x90,0xe4,0xf0,0x21,0x5a,0x90,0x91,0x19,0x12,0x43,0x41,0xef,0x12,
  92280. +0x43,0x4a,0x52,0x30,0x01,0x52,0x39,0x02,0x52,0x5b,0x03,0x52,0x64,0x09,0x52,0x6c,
  92281. +0x0c,0x52,0x75,0x0d,0x52,0x7d,0x0e,0x52,0x8e,0x1a,0x52,0x96,0x2c,0x52,0x41,0x2d,
  92282. +0x52,0x4a,0x2e,0x52,0x9e,0x30,0x52,0x53,0x3b,0x52,0x86,0x3c,0x00,0x00,0x52,0xa6,
  92283. +0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x64,0x72,0x90,0x91,0x19,0x12,0x43,0x21,0xc1,
  92284. +0xf5,0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x65,0x8d,0x90,0x91,0x19,0x12,0x43,0x21,
  92285. +0x02,0x65,0xd5,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x4b,0x90,0x91,0x19,0x12,0x43,
  92286. +0x21,0x02,0x66,0x0e,0x90,0x91,0x19,0x12,0x43,0x21,0x80,0x42,0x90,0x91,0x19,0x12,
  92287. +0x43,0x21,0x02,0x4c,0xab,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x98,0x90,0x91,0x19,
  92288. +0x12,0x43,0x21,0x02,0x4d,0xe6,0x90,0x91,0x19,0x12,0x43,0x21,0x21,0x90,0x90,0x91,
  92289. +0x19,0x12,0x43,0x21,0xa1,0x9b,0x90,0x91,0x19,0x12,0x43,0x21,0x81,0x7a,0x90,0x91,
  92290. +0x19,0x12,0x43,0x21,0xe1,0x78,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0xd3,0x10,
  92291. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,0x91,0x1c,0x12,0x43,
  92292. +0x21,0x90,0x00,0x01,0x12,0x42,0x97,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,
  92293. +0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x42,0xcf,0x12,
  92294. +0x29,0xd9,0xff,0x60,0x2c,0xb5,0x72,0x16,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,
  92295. +0x01,0x12,0x42,0x97,0x65,0x74,0x70,0x04,0xe5,0x73,0x65,0xf0,0x60,0x23,0x90,0x91,
  92296. +0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0x12,0x42,0x97,0xff,0xae,0xf0,0x71,0x26,0x80,
  92297. +0x10,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x29,0xd9,0x65,0x72,0x60,0x03,0x12,0x44,
  92298. +0xe8,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x1f,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x72,
  92299. +0x01,0x8e,0x73,0xf5,0x74,0xe4,0xfd,0x7f,0x0b,0x12,0x4f,0x10,0xe4,0xfd,0x7f,0x02,
  92300. +0x12,0x4f,0x10,0x71,0x6a,0xe4,0xff,0x71,0xcc,0xe4,0xf5,0x76,0x90,0x01,0xc9,0xe5,
  92301. +0x76,0xf0,0x90,0x91,0x1f,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,
  92302. +0x45,0x7d,0x01,0x7f,0x60,0x7e,0x01,0x02,0x35,0xab,0x7f,0x0b,0x71,0xd9,0xef,0x65,
  92303. +0x75,0x60,0x10,0xe5,0x75,0xb4,0x01,0x05,0xe4,0xf5,0x75,0x80,0x03,0x75,0x75,0x01,
  92304. +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe5,0x72,0x64,0x01,0x70,0x3f,0x71,0x6a,0xbf,0x01,
  92305. +0x04,0x7f,0x01,0x71,0xcc,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x12,0x4b,
  92306. +0xee,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x12,0x4b,0xee,0x90,0x00,0x46,
  92307. +0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x12,0x4b,0xee,0x7f,0x02,0x71,0xd9,0x8f,0x76,0x90,
  92308. +0x01,0xc9,0xe5,0x76,0xf0,0xb4,0x01,0x03,0x12,0x4f,0xd7,0x22,0x90,0x01,0xca,0xe5,
  92309. +0x75,0xf0,0xef,0x60,0x03,0x12,0x4f,0xd7,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  92310. +0x90,0x91,0xa0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8,0x07,
  92311. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x12,
  92312. +0x4a,0xe6,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,
  92313. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe,0xef,
  92314. +0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0x80,
  92315. +0x44,0x90,0x91,0xa0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  92316. +0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4a,0xde,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,
  92317. +0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,
  92318. +0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,
  92319. +0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  92320. +0xd0,0xe4,0xf5,0x10,0x75,0x11,0x04,0xf5,0x12,0xf5,0x14,0xf5,0x15,0x90,0x02,0x09,
  92321. +0xe0,0xff,0x12,0x29,0xd9,0xfe,0xef,0x2e,0xf5,0x13,0x30,0xe0,0x08,0x75,0x0e,0x00,
  92322. +0x75,0x0f,0x80,0x80,0x05,0xe4,0xf5,0x0e,0xf5,0x0f,0xe5,0x13,0xc3,0x13,0x90,0xfd,
  92323. +0x10,0xf0,0x74,0x20,0x25,0x10,0xf5,0x10,0xad,0x0f,0xe5,0x10,0x2d,0xff,0x24,0x01,
  92324. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0x91,0x47,0xf0,0x74,0x02,0x2f,0xf5,
  92325. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0xe5,0x10,0x2d,0x24,0x03,0xf5,0x82,0xe4,
  92326. +0x34,0xfc,0xf5,0x83,0xe0,0x24,0x00,0xff,0xe4,0x3e,0x90,0x91,0x48,0xf0,0xa3,0xef,
  92327. +0xf0,0x7f,0x04,0xe5,0x10,0x25,0x0f,0x2f,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
  92328. +0x83,0xe0,0xfe,0x74,0x46,0x2f,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xee,0xf0,0x0f,
  92329. +0xbf,0x08,0xe0,0x12,0x66,0x56,0xef,0x70,0x3f,0x90,0x01,0xc3,0xe0,0x60,0x25,0xc3,
  92330. +0xe5,0x15,0x94,0xe8,0xe5,0x14,0x94,0x03,0x40,0x09,0x90,0x01,0xc6,0xe0,0x44,0x10,
  92331. +0xf0,0x80,0x63,0x05,0x15,0xe5,0x15,0x70,0x02,0x05,0x14,0x7f,0x0a,0x7e,0x00,0x12,
  92332. +0x37,0x54,0x80,0xd5,0x90,0x01,0xc6,0xe0,0x90,0x01,0xc3,0x30,0xe2,0x05,0x74,0xfe,
  92333. +0xf0,0x80,0x43,0x74,0xff,0xf0,0x80,0x3e,0xe5,0x10,0xb4,0x78,0x23,0xe4,0xf5,0x10,
  92334. +0x05,0x13,0xe5,0x0f,0x64,0x80,0x45,0x0e,0x70,0x06,0xf5,0x0e,0xf5,0x0f,0x80,0x06,
  92335. +0x75,0x0e,0x00,0x75,0x0f,0x80,0xe5,0x13,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x80,0x06,
  92336. +0x74,0x08,0x25,0x10,0xf5,0x10,0xe5,0x12,0x15,0x12,0x70,0x02,0x15,0x11,0xe5,0x12,
  92337. +0x45,0x11,0x60,0x02,0x81,0xb8,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x1c,0x12,0x43,
  92338. +0x41,0x12,0x29,0xd9,0xff,0x54,0x01,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xfe,0x4e,0xf0,
  92339. +0xef,0x54,0x04,0xff,0xe0,0x54,0xfb,0x4f,0xf0,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,
  92340. +0x90,0x91,0x5e,0xe0,0x54,0xfd,0x4e,0xf0,0xef,0x54,0x08,0xff,0xe0,0x54,0xf7,0x4f,
  92341. +0xf0,0x12,0x29,0xd9,0xff,0x54,0x10,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xef,0x4e,0xf0,
  92342. +0xef,0x54,0x20,0xff,0xe0,0x54,0xdf,0x4f,0xf0,0x12,0x29,0xd9,0xff,0x54,0x40,0xfe,
  92343. +0x90,0x91,0x5e,0xe0,0x54,0xbf,0x4e,0xf0,0xef,0x54,0x80,0xff,0xe0,0x54,0x7f,0x4f,
  92344. +0xf0,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x60,0xf0,0x90,0x00,0x01,0x12,0x42,
  92345. +0x20,0x90,0x91,0x5f,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x54,0x01,0xfe,0x90,
  92346. +0x91,0x61,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,
  92347. +0x90,0x00,0x03,0x12,0x42,0x20,0x54,0x04,0xff,0x90,0x91,0x61,0xe0,0x54,0xfb,0x4f,
  92348. +0xf0,0x90,0x91,0x5e,0xe0,0x54,0x01,0x90,0x01,0xb8,0xf0,0x90,0x91,0x5e,0xe0,0xff,
  92349. +0xc4,0x13,0x54,0x01,0x90,0x01,0xb9,0xf0,0x90,0x91,0x61,0xe0,0x54,0x01,0x90,0x01,
  92350. +0xba,0xf0,0xa3,0x74,0xff,0xf0,0x12,0x29,0xd9,0x20,0xe0,0x02,0x21,0xf1,0xe4,0xfd,
  92351. +0x7f,0x81,0x12,0x4b,0xee,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x29,0xd9,0xff,0xc3,
  92352. +0x13,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x02,0xf0,0xef,0x13,0x13,0x54,0x3f,
  92353. +0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x04,0xf0,0x12,0x29,0xd9,0x13,0x13,0x13,
  92354. +0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x08,0xf0,0x90,0x91,0x61,0xe0,
  92355. +0x30,0xe0,0x1c,0x90,0x91,0x5e,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07,0xa3,0xe0,
  92356. +0xff,0xe4,0xfd,0x80,0x07,0x90,0x91,0x5f,0xe0,0xff,0x7d,0x01,0x12,0x4a,0xf6,0x22,
  92357. +0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,
  92358. +0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x7f,0x01,
  92359. +0x60,0x02,0x7f,0x00,0x22,0x12,0x29,0xd9,0xf5,0x6d,0x22,0x90,0x01,0x64,0x74,0xa0,
  92360. +0xf0,0x22,0x90,0x91,0x51,0xe0,0x90,0x90,0xe8,0xf0,0x22,0x90,0x00,0xf3,0xe0,0x7f,
  92361. +0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,
  92362. +0xa3,0xf0,0xa3,0xf0,0x22,0xe4,0x90,0x91,0x4e,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,
  92363. +0xfd,0x7f,0x80,0x02,0x4b,0xee,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,
  92364. +0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x22,0x12,0x29,0xd9,0x60,0x02,
  92365. +0x80,0x01,0xe4,0x90,0x91,0x31,0xf0,0x90,0x91,0x31,0xe0,0x90,0x01,0xe7,0xf0,0x22,
  92366. +0x90,0x91,0x51,0xe0,0xb4,0x01,0x0c,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x05,0x7e,0xfd,
  92367. +0x7f,0x33,0x22,0x7e,0xfd,0x7f,0x2f,0x22,0x12,0x29,0xd9,0xff,0x54,0x01,0xfe,0x90,
  92368. +0x91,0x53,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01,
  92369. +0x12,0x42,0x20,0x90,0x91,0x54,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x90,
  92370. +0xf7,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x0e,0xc2,
  92371. +0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x4b,0xee,0x7d,0x40,0x7f,
  92372. +0x01,0x12,0x36,0xaf,0xe5,0x0e,0x24,0xff,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,
  92373. +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,
  92374. +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xcb,0xf0,0x74,0x57,
  92375. +0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,
  92376. +0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5,0x2f,0xe5,0x2c,0x30,0xe0,0x5a,0x90,0x01,0x34,
  92377. +0x74,0x01,0xf0,0x85,0xd9,0x54,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,0x48,0x90,
  92378. +0x91,0x3b,0xe0,0x60,0x3a,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,
  92379. +0x51,0x30,0xef,0x64,0x01,0x70,0x30,0x90,0x91,0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,
  92380. +0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,0x59,0x90,0x01,0x5b,
  92381. +0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x91,0x37,0xf0,0x80,0x08,0x51,
  92382. +0x30,0xbf,0x01,0x03,0x12,0x44,0xc2,0xe5,0x2c,0x30,0xe1,0x20,0x90,0x01,0x34,0x74,
  92383. +0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a,0x85,0xd4,0x5b,0x85,0xd5,
  92384. +0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x71,0x5c,0xe5,0x2c,0x30,0xe3,
  92385. +0x10,0x90,0x01,0x34,0x74,0x08,0xf0,0x90,0x91,0x56,0xe0,0x30,0xe0,0x03,0x43,0x57,
  92386. +0x04,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,
  92387. +0x2c,0x30,0xe5,0x26,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1f,0xe0,0x54,0xdf,0xf0,0x90,
  92388. +0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x4e,0xe4,0x90,0x00,
  92389. +0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4a,0xe6,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,
  92390. +0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x13,0x90,0x91,0x50,0x74,0x01,0xf0,
  92391. +0x90,0x01,0x36,0xf0,0x91,0x23,0x51,0x87,0x90,0x91,0x50,0xe4,0xf0,0xe5,0x2e,0x30,
  92392. +0xe1,0x3c,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02,0xe0,0x54,
  92393. +0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,
  92394. +0x91,0x40,0xe4,0xf0,0x80,0x18,0x90,0x91,0x40,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,
  92395. +0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x4f,0xf5,0xe5,0x2e,
  92396. +0x30,0xe2,0x19,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x91,0x3a,0xe4,0xf0,0x90,0x05,
  92397. +0x58,0x74,0x03,0xf0,0x51,0xd8,0x90,0x91,0x3f,0xe0,0x04,0xf0,0xe5,0x2e,0x30,0xe3,
  92398. +0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x6d,0x64,0x01,0x70,0x1c,0xe5,0x70,0x60,
  92399. +0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x91,0x66,0xe4,
  92400. +0x12,0x44,0x49,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2b,0x90,0x01,
  92401. +0x36,0x74,0x10,0xf0,0xe5,0x6d,0xb4,0x01,0x20,0xe5,0x70,0x60,0x1c,0x90,0x01,0x57,
  92402. +0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x91,0x3c,0xe4,0xf0,0x53,0x71,0xfd,
  92403. +0xe5,0x71,0x54,0x07,0x70,0x03,0x12,0x44,0xc2,0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,
  92404. +0x36,0x74,0x20,0xf0,0xe5,0x6d,0xb4,0x01,0x14,0xe5,0x70,0x60,0x10,0x90,0x91,0x3b,
  92405. +0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xc8,0x80,0x03,0x12,0x44,0x77,0xe5,0x2e,0x30,
  92406. +0xe6,0x1b,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x6d,0xb4,0x01,0x10,0xe5,0x70,0x60,
  92407. +0x0c,0x53,0x71,0xfe,0xe5,0x71,0x54,0x07,0x70,0x03,0x12,0x44,0xc2,0xe5,0x2f,0x30,
  92408. +0xe1,0x08,0x90,0x01,0x37,0x74,0x02,0xf0,0x71,0x7e,0x74,0xcb,0x04,0x90,0x01,0xc4,
  92409. +0xf0,0x74,0x57,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,
  92410. +0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,
  92411. +0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0x51,
  92412. +0x30,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x91,
  92413. +0x37,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x91,0x36,0xe0,
  92414. +0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x6f,0x54,0x0f,0xd3,0x94,
  92415. +0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,
  92416. +0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0x90,0x91,0x53,0xe0,0x30,0xe0,0x49,0xe5,0x6d,
  92417. +0x64,0x01,0x70,0x43,0x90,0x91,0x52,0xe0,0x04,0xf0,0xe5,0x70,0x64,0x03,0x60,0x05,
  92418. +0xe5,0x70,0xb4,0x06,0x0d,0x90,0x91,0x52,0xe0,0xff,0x74,0x01,0xd3,0x9f,0x50,0x14,
  92419. +0x80,0x07,0x90,0x91,0x52,0xe0,0xb4,0x0a,0x0b,0x90,0x91,0x55,0xe0,0x04,0xf0,0xe4,
  92420. +0x90,0x91,0x52,0xf0,0x90,0x91,0x55,0xe0,0xff,0x90,0x91,0x54,0xe0,0xb5,0x07,0x07,
  92421. +0x71,0x4e,0xe4,0x90,0x91,0x55,0xf0,0x22,0xe5,0x6d,0x64,0x01,0x70,0x63,0xe5,0x70,
  92422. +0x60,0x5f,0xe5,0x70,0x64,0x02,0x60,0x06,0xe5,0x70,0x64,0x05,0x70,0x27,0x90,0x06,
  92423. +0xab,0xe0,0x90,0x91,0x27,0xf0,0x90,0x06,0xaa,0xe0,0x90,0x91,0x39,0xf0,0x90,0x91,
  92424. +0x27,0xe0,0x70,0x07,0x90,0x91,0x39,0xe0,0xff,0x80,0x05,0x90,0x91,0x27,0xe0,0xff,
  92425. +0x90,0x91,0x27,0xef,0xf0,0x90,0x91,0x29,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,
  92426. +0x91,0x28,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x71,0xfd,
  92427. +0x53,0x71,0xef,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0xc7,0x71,
  92428. +0x42,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xd0,0xd0,0x92,0xaf,0x22,0xe5,0x6e,
  92429. +0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0x02,0x47,0xc9,0x90,0x91,0x08,0xe0,
  92430. +0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,
  92431. +0x90,0x91,0x71,0x12,0x43,0x41,0x0b,0x7a,0x91,0x79,0x08,0x02,0x46,0xb7,0x90,0x91,
  92432. +0x80,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,
  92433. +0x21,0x90,0x91,0x3b,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0d,0xe5,0x6e,0x54,
  92434. +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,0xe4,0xff,0x12,
  92435. +0x48,0xb3,0x22,0x51,0x30,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,
  92436. +0x80,0x58,0xe5,0x71,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4a,
  92437. +0xe5,0x6f,0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,
  92438. +0x39,0xe5,0x71,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x2c,0xe5,0x71,
  92439. +0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x1f,0x90,0x91,0x29,0xe0,0x60,
  92440. +0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,0x11,0x90,0x91,0x31,0xe0,0x60,0x08,0x90,
  92441. +0x01,0xb9,0x74,0x80,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,
  92442. +0x7f,0x00,0x22,0xe4,0xfb,0x90,0x91,0x78,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,
  92443. +0x70,0x70,0x02,0x81,0xb5,0xe5,0x6d,0x64,0x01,0x70,0x7a,0xe5,0x70,0x14,0x60,0x2b,
  92444. +0x24,0xfd,0x60,0x27,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x21,0x90,0x91,0x27,0xe0,
  92445. +0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x14,0x90,0x91,0x27,0xe0,0x70,0x08,0x90,
  92446. +0x91,0x39,0xe0,0x90,0x91,0x27,0xf0,0x7b,0x01,0x80,0x02,0x7b,0x01,0xeb,0x60,0x45,
  92447. +0x43,0x71,0x10,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,
  92448. +0xff,0x90,0x91,0x34,0xe0,0x2f,0x12,0x44,0x4e,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,
  92449. +0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,0x90,
  92450. +0x91,0x2e,0xe0,0x60,0x10,0x90,0x91,0x2c,0xe0,0x90,0x07,0x78,0x60,0x04,0x74,0x0d,
  92451. +0xf0,0x22,0x74,0x09,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,
  92452. +0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,
  92453. +0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xb6,0xf0,0x74,0x5c,0xa3,0xf0,0x53,0x91,0xef,
  92454. +0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0x90,0x00,0x52,0xe0,
  92455. +0xff,0x90,0x00,0x56,0xe0,0x5f,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,
  92456. +0x74,0x10,0xf0,0xe5,0x3d,0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,
  92457. +0x30,0xe6,0x1b,0x90,0x00,0x55,0x74,0x40,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,
  92458. +0xbf,0x03,0x0b,0x90,0x90,0xf3,0xe0,0x60,0x05,0x7f,0x01,0x12,0x4c,0x03,0xe5,0x3d,
  92459. +0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,
  92460. +0xbf,0x03,0x05,0x7f,0x02,0x12,0x4c,0x03,0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,
  92461. +0x74,0x01,0xf0,0xe5,0x3e,0x30,0xe1,0x06,0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,
  92462. +0x30,0xe2,0x06,0x90,0x00,0x56,0x74,0x04,0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,
  92463. +0x56,0x74,0x08,0xf0,0x90,0x01,0xc4,0x74,0xb6,0xf0,0x74,0x5c,0xa3,0xf0,0xd0,0x07,
  92464. +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,
  92465. +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,
  92466. +0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,
  92467. +0xc0,0x05,0xc0,0x06,0xc0,0x07,0x75,0x0d,0x00,0x90,0x01,0xc4,0x74,0x99,0xf0,0x74,
  92468. +0x5d,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,
  92469. +0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,
  92470. +0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x08,
  92471. +0x90,0x01,0x3c,0x74,0x02,0xf0,0xf1,0x57,0xe5,0x34,0x30,0xe2,0x3a,0x90,0x01,0x3c,
  92472. +0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,
  92473. +0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,
  92474. +0x59,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90,
  92475. +0x91,0x37,0xe4,0xf0,0x12,0x44,0xc2,0xe5,0x34,0x30,0xe3,0x3a,0x90,0x01,0x3c,0x74,
  92476. +0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,0x91,
  92477. +0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12,0x44,0x59,
  92478. +0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x91,
  92479. +0x36,0xe4,0xf0,0x12,0x44,0xc2,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,
  92480. +0xf0,0x12,0x53,0x86,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,
  92481. +0x6e,0xb9,0xe5,0x35,0x30,0xe0,0x5a,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,
  92482. +0xe0,0x44,0x7f,0xf0,0x90,0x00,0x83,0xe0,0x54,0x0f,0xf5,0x0d,0xb4,0x01,0x02,0x80,
  92483. +0x1c,0xe5,0x0d,0xb4,0x02,0x05,0x90,0x00,0x83,0x80,0x12,0xe5,0x0d,0xb4,0x04,0x05,
  92484. +0x90,0x00,0x83,0x80,0x08,0xe5,0x0d,0xb4,0x0c,0x08,0x90,0x00,0x83,0xe0,0xf5,0x6f,
  92485. +0x80,0x06,0x90,0x01,0xbe,0xe0,0x04,0xf0,0x90,0x01,0xbb,0xe5,0x6f,0xf0,0xe5,0x6f,
  92486. +0x30,0xe0,0x03,0xa3,0x80,0x03,0x90,0x01,0xbd,0xe0,0x04,0xf0,0xf1,0x38,0x12,0x44,
  92487. +0xc2,0xe5,0x35,0x30,0xe2,0x06,0x90,0x01,0x3d,0x74,0x04,0xf0,0xe5,0x36,0x30,0xe0,
  92488. +0x06,0x90,0x01,0x3e,0x74,0x01,0xf0,0xe5,0x36,0x30,0xe1,0x06,0x90,0x01,0x3e,0x74,
  92489. +0x02,0xf0,0x74,0x99,0x04,0x90,0x01,0xc4,0xf0,0x74,0x5d,0xa3,0xf0,0xd0,0x07,0xd0,
  92490. +0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,
  92491. +0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xe5,0x6f,0x30,0xe6,0x19,0xe5,0x6f,0x54,
  92492. +0x0f,0xff,0x90,0x91,0x24,0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,
  92493. +0x91,0x24,0xf0,0x53,0x6f,0xbf,0x22,0xe4,0x90,0x91,0x0d,0xf0,0xe5,0x70,0x70,0x02,
  92494. +0xe1,0xe1,0x90,0x91,0x3c,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x71,0xfd,0xe5,0x71,0x54,
  92495. +0x07,0x70,0x6e,0x80,0x69,0x90,0x91,0x28,0xe0,0x04,0xf0,0x53,0x71,0xef,0x90,0x91,
  92496. +0x3a,0xe0,0x04,0xf0,0x90,0x91,0x0d,0xe0,0xf9,0xff,0x7e,0x00,0x24,0x01,0xfd,0xee,
  92497. +0x33,0xfc,0x90,0x91,0x3a,0xe0,0xb5,0x05,0x06,0xe4,0xb5,0x04,0x02,0x80,0x12,0xef,
  92498. +0x24,0x02,0xff,0xe4,0x3e,0xfe,0x90,0x91,0x3a,0xe0,0xb5,0x07,0x0a,0xe4,0xb5,0x06,
  92499. +0x06,0x90,0x05,0x58,0xe0,0x04,0xf0,0xe9,0xff,0x90,0x91,0x2f,0xe0,0x2f,0xff,0xe4,
  92500. +0x33,0xfe,0x90,0x91,0x28,0xe0,0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x40,
  92501. +0x0d,0xe5,0x6d,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,
  92502. +0xc2,0x22,0x8f,0x20,0x8c,0x21,0x8d,0x22,0x22,0x8f,0x23,0x8c,0x24,0x8d,0x25,0x22,
  92503. +0xe4,0x90,0x91,0x11,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0,0x20,0xe1,0x2c,0xc3,0x90,
  92504. +0x91,0x12,0xe0,0x94,0x20,0x90,0x91,0x11,0xe0,0x94,0x03,0x40,0x0a,0x90,0x01,0xc6,
  92505. +0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x91,0x11,0xe4,0x75,0xf0,0x01,0x12,0x42,
  92506. +0x81,0x7f,0x01,0x7e,0x00,0x12,0x37,0x54,0x80,0xcd,0x7f,0x01,0x22,0x90,0x01,0xcc,
  92507. +0xe0,0x54,0x0f,0x90,0x91,0x11,0xf0,0x90,0x91,0x11,0xe0,0xfd,0x70,0x02,0x21,0x6f,
  92508. +0x90,0x91,0x9c,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,
  92509. +0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x21,0x68,0x90,0x91,0x9c,0xe0,
  92510. +0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x15,0xe0,0x90,0x91,0x12,0xf0,0x75,0x63,
  92511. +0x01,0x75,0x64,0x91,0x75,0x65,0x12,0x75,0x66,0x01,0x7b,0x01,0x7a,0x91,0x79,0x13,
  92512. +0x12,0x46,0x6d,0x90,0x91,0x13,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,0x91,
  92513. +0x9c,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x15,0xe0,0x90,
  92514. +0x91,0x14,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,0x15,
  92515. +0xe0,0x90,0x91,0x15,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,
  92516. +0x43,0x15,0xe0,0x90,0x91,0x16,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,
  92517. +0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x17,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,
  92518. +0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,0x91,0x18,0xf0,0x80,0x33,0xe0,0x75,0xf0,
  92519. +0x04,0x90,0x01,0xd1,0x12,0x43,0x15,0xe0,0x90,0x91,0x14,0xf0,0x90,0x91,0x9c,0xe0,
  92520. +0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x15,0xf0,0x90,0x91,
  92521. +0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,0x91,0x16,0xf0,
  92522. +0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x91,0x79,0x14,0x12,0x51,0xf8,0x90,0x91,0x11,
  92523. +0xe0,0xff,0x90,0x91,0x9c,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,
  92524. +0xd8,0xfc,0xf4,0x5f,0x90,0x91,0x11,0xf0,0x90,0x91,0x9c,0xe0,0xff,0x74,0x01,0xa8,
  92525. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x91,0x9c,0xe0,
  92526. +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x01,0x37,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,
  92527. +0xad,0x07,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x01,0xf0,
  92528. +0x90,0x04,0x80,0xe0,0x54,0x0f,0xfc,0x74,0x14,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
  92529. +0x83,0xe0,0x54,0xc0,0x4c,0xfd,0x74,0x14,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  92530. +0xed,0xf0,0x22,0xef,0x60,0x0f,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  92531. +0xe0,0x44,0x10,0xf0,0x22,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,
  92532. +0x54,0xef,0xf0,0x22,0xe4,0xf5,0x6d,0xf5,0x71,0xf5,0x70,0x75,0x6f,0x0c,0x75,0x6e,
  92533. +0x0c,0x90,0x91,0x3b,0xf0,0x90,0x91,0x37,0xf0,0x90,0x91,0x36,0xf0,0x90,0x91,0x39,
  92534. +0x04,0xf0,0x90,0x91,0x27,0xf0,0xe4,0x90,0x91,0x3c,0xf0,0x90,0x91,0x29,0xf0,0x90,
  92535. +0x91,0x34,0x74,0x07,0xf0,0xe4,0x90,0x91,0x28,0xf0,0x90,0x91,0x32,0xf0,0xa3,0x74,
  92536. +0x03,0xf0,0x90,0x91,0x2f,0x74,0x0a,0xf0,0xa3,0x74,0x05,0xf0,0x90,0x91,0x2d,0x74,
  92537. +0x14,0xf0,0x90,0x91,0x35,0x74,0x05,0xf0,0xe4,0x90,0x91,0x2b,0xf0,0x90,0x91,0x25,
  92538. +0xf0,0x90,0x91,0x50,0xf0,0x90,0x91,0x31,0xf0,0x90,0x91,0x3a,0xf0,0x90,0x91,0x26,
  92539. +0xf0,0x90,0x91,0x38,0xf0,0x90,0x91,0x2e,0xf0,0x90,0x91,0x2c,0xf0,0x22,0xe4,0x90,
  92540. +0x91,0x3c,0xf0,0x90,0x91,0x28,0xf0,0xf5,0x71,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,
  92541. +0xf0,0xef,0x60,0x0a,0xe5,0x6d,0xb4,0x01,0x05,0xe4,0xff,0x12,0x47,0xc9,0x53,0x6e,
  92542. +0xf0,0x43,0x6e,0x0c,0x22,0x90,0x91,0x9d,0xef,0xf0,0x51,0x7e,0x90,0x91,0x9d,0xe0,
  92543. +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x90,0x00,
  92544. +0x11,0xe0,0x44,0x09,0xf0,0x12,0x4a,0xe6,0x90,0x90,0xd8,0x12,0x43,0x09,0x90,0x80,
  92545. +0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0xdc,0x12,0x43,
  92546. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,
  92547. +0xe0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,
  92548. +0xd9,0x90,0x90,0xe4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,
  92549. +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,
  92550. +0xff,0x12,0x34,0x81,0x90,0x91,0x51,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,
  92551. +0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x8f,0x77,0xe4,
  92552. +0x90,0x91,0x96,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,
  92553. +0x01,0xef,0x65,0x77,0x60,0x3e,0xc3,0x90,0x91,0x97,0xe0,0x94,0x88,0x90,0x91,0x96,
  92554. +0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90,0x91,0x96,
  92555. +0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,
  92556. +0x91,0x97,0xe0,0x94,0x32,0x90,0x91,0x96,0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,
  92557. +0xe0,0x30,0xe0,0xb2,0x22,0x22,0x53,0x6e,0xf0,0x43,0x6e,0x01,0x71,0x55,0x71,0x67,
  92558. +0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0x22,0x8f,0x78,0x12,0x47,0xe6,0xef,0x64,0x01,
  92559. +0x70,0x2e,0x90,0x91,0x44,0x12,0x48,0x1e,0xe5,0x78,0x60,0x10,0x74,0x21,0x2f,0xf5,
  92560. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,
  92561. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,
  92562. +0x22,0xe4,0xfb,0x90,0x91,0x7c,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x70,0x60,
  92563. +0x5f,0xe5,0x6d,0x64,0x01,0x70,0x59,0x0b,0x90,0x91,0x27,0xf0,0x04,0x60,0x51,0x43,
  92564. +0x71,0x10,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,0xff,
  92565. +0x90,0x91,0x34,0xe0,0x2f,0x90,0x91,0x67,0xf0,0xe4,0x1b,0x12,0x44,0x54,0x90,0x01,
  92566. +0x57,0x74,0x05,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,
  92567. +0x04,0x12,0x47,0x27,0x90,0x91,0x2e,0xe0,0x60,0x11,0x90,0x91,0x2c,0xe0,0x90,0x07,
  92568. +0x78,0x60,0x05,0x74,0x0d,0xf0,0x80,0x03,0x74,0x09,0xf0,0x90,0x05,0x22,0xe4,0xf0,
  92569. +0x22,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0xd3,0x10,0xaf,0x01,
  92570. +0xc3,0xc0,0xd0,0x90,0x91,0x84,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,
  92571. +0x90,0x91,0x84,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,
  92572. +0x91,0x87,0xe0,0x94,0xe8,0x90,0x91,0x86,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,
  92573. +0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x91,0x86,0xe4,0x75,0xf0,0x01,0x12,
  92574. +0x42,0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,
  92575. +0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,
  92576. +0x91,0x1f,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,
  92577. +0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x3b,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,
  92578. +0x91,0x25,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x01,0x90,0x91,0x26,0xf0,
  92579. +0xef,0xc3,0x13,0x54,0x01,0x90,0x91,0x2e,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,
  92580. +0x13,0x13,0x54,0x01,0x90,0x91,0x2c,0xf0,0x90,0x91,0x2e,0xe0,0x90,0x91,0x1f,0x70,
  92581. +0x26,0x12,0x2a,0x8b,0x00,0x00,0x02,0x10,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,
  92582. +0x85,0x12,0x2a,0x7f,0x7f,0x60,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x91,0x1f,0x12,0x2a,
  92583. +0x8b,0x00,0x00,0x03,0x10,0x80,0x24,0x12,0x2a,0x8b,0x00,0x00,0x01,0x10,0x90,0x91,
  92584. +0x1f,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x60,0x7e,0x08,0x12,0x2f,
  92585. +0xd9,0x90,0x91,0x1f,0x12,0x2a,0x8b,0x00,0x00,0x03,0x00,0x90,0x91,0x1f,0x12,0x43,
  92586. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x91,
  92587. +0x26,0xe0,0x70,0x3d,0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x27,
  92588. +0xde,0x90,0x91,0x1f,0x12,0x2a,0x7f,0x90,0x91,0x1f,0x12,0x43,0x09,0xec,0x44,0x02,
  92589. +0xfc,0x90,0x91,0x1f,0x12,0x2a,0x7f,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,0x85,
  92590. +0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x02,0x86,0xe0,0x54,0xfb,
  92591. +0xf0,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x49,0x7f,0x90,0x01,0xe5,0xe5,0x70,0xf0,
  92592. +0x90,0x91,0x3b,0xe0,0x90,0x01,0xe6,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x02,
  92593. +0x12,0x42,0x20,0xff,0x30,0xe0,0x25,0x12,0x29,0xd9,0x90,0x91,0x2f,0xf0,0x90,0x00,
  92594. +0x01,0x12,0x42,0x20,0x90,0x91,0x30,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x91,0x2d,
  92595. +0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x91,0x35,0xf0,0x22,0x90,0x91,0x2f,0x74,
  92596. +0x0a,0xf0,0x90,0x91,0x30,0x74,0x05,0xf0,0x90,0x91,0x2d,0x74,0x14,0xf0,0x90,0x91,
  92597. +0x35,0x74,0x05,0xf0,0x22,0x12,0x29,0xd9,0x30,0xe0,0x19,0xc3,0x13,0x54,0x7f,0x90,
  92598. +0x91,0x34,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x91,0x32,0xe4,0xf0,0xa3,
  92599. +0xef,0xf0,0x80,0x0f,0x90,0x91,0x34,0x74,0x07,0xf0,0x90,0x91,0x32,0xe4,0xf0,0xa3,
  92600. +0x74,0x03,0xf0,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0x90,0x02,
  92601. +0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x91,0x41,0xf0,0x90,
  92602. +0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x42,0xf0,0x90,0x00,0x02,0x12,
  92603. +0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x43,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,
  92604. +0xed,0x2f,0x90,0x91,0x44,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0xae,0x05,0xed,
  92605. +0x2f,0x90,0x91,0x45,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x47,
  92606. +0xe0,0x90,0x91,0x1d,0xf0,0x90,0x91,0x48,0xe0,0xf5,0x19,0xa3,0xe0,0xf5,0x1a,0xe4,
  92607. +0xf5,0x16,0x74,0x4a,0x25,0x16,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0x74,
  92608. +0x1b,0x25,0x16,0xf8,0xa6,0x07,0x05,0x16,0xe5,0x16,0xb4,0x04,0xe5,0x90,0x91,0x1d,
  92609. +0xe0,0x12,0x43,0x4a,0x66,0xb3,0x00,0x67,0xdc,0x01,0x66,0xba,0x02,0x66,0xba,0x03,
  92610. +0x66,0xba,0x04,0x67,0xdc,0x05,0x67,0xac,0x80,0x67,0xc2,0x81,0x67,0xdc,0x82,0x00,
  92611. +0x00,0x67,0xd8,0xaf,0x1e,0x12,0x73,0xea,0xe1,0xdc,0x90,0x91,0x1d,0xe0,0xff,0xb4,
  92612. +0x02,0x08,0x90,0x91,0x1c,0x74,0x01,0xf0,0x80,0x0f,0xef,0x90,0x91,0x1c,0xb4,0x03,
  92613. +0x05,0x74,0x02,0xf0,0x80,0x03,0x74,0x04,0xf0,0xc3,0xe5,0x19,0x94,0x08,0x50,0x49,
  92614. +0xe4,0xf5,0x16,0x90,0x91,0x1c,0xe0,0xff,0xe5,0x16,0xc3,0x9f,0x40,0x02,0xe1,0xdc,
  92615. +0xc3,0xe5,0x19,0x94,0x01,0x50,0x14,0xe5,0x16,0x25,0x1a,0xff,0xc3,0x74,0x03,0x95,
  92616. +0x16,0x24,0x1b,0xf8,0xe6,0xfd,0x12,0x4b,0xee,0x80,0x1a,0xc3,0x74,0x03,0x95,0x16,
  92617. +0x24,0x1b,0xf8,0xe6,0xff,0xe5,0x16,0x7c,0x00,0x25,0x1a,0xfd,0xec,0x35,0x19,0x8d,
  92618. +0x82,0xf5,0x83,0xef,0xf0,0x05,0x16,0x80,0xba,0xc3,0xe5,0x19,0x94,0x10,0x40,0x02,
  92619. +0xe1,0xdc,0x90,0x91,0x1d,0xe0,0x64,0x04,0x60,0x02,0xe1,0xdc,0xaf,0x1c,0xfc,0xfd,
  92620. +0xfe,0x78,0x10,0x12,0x2a,0x6c,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xaf,0x1b,
  92621. +0xe4,0xfc,0xfd,0xfe,0x78,0x18,0x12,0x2a,0x6c,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,
  92622. +0x00,0x12,0x42,0xfc,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xaf,0x1d,0xe4,0xfc,
  92623. +0xfd,0xfe,0x78,0x08,0x12,0x2a,0x6c,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,
  92624. +0x42,0xfc,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0xaf,0x1e,0xe4,0xfc,0xfd,0xfe,
  92625. +0x12,0x42,0xfc,0xa3,0x12,0x2a,0x7f,0x90,0x91,0x1e,0x12,0x43,0x09,0x90,0x80,0x85,
  92626. +0x12,0x2a,0x7f,0xaf,0x1a,0xae,0x19,0x12,0x2f,0xd9,0x80,0x30,0xe5,0x1d,0x7f,0x00,
  92627. +0xfe,0xef,0x25,0x1e,0xf5,0x18,0xe4,0x3e,0xf5,0x17,0xaf,0x18,0xfe,0x12,0x37,0x54,
  92628. +0x80,0x1a,0xe5,0x1d,0x7f,0x00,0xfe,0xef,0x25,0x1e,0xf5,0x18,0xe4,0x3e,0xf5,0x17,
  92629. +0xaf,0x18,0xfe,0x12,0x36,0xcb,0x80,0x04,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,
  92630. +0x92,0xaf,0x22,0x22,0x8e,0x0e,0x8f,0x0f,0x8b,0x10,0x8a,0x11,0x89,0x12,0xe4,0x90,
  92631. +0x91,0x11,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4a,0xe6,0xe5,0x0e,0x54,0x03,0xff,
  92632. +0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4a,0xe6,0x90,0x00,0x33,0xe0,0x54,
  92633. +0x7f,0xf0,0x12,0x4a,0xe6,0x90,0x00,0x33,0xe0,0x20,0xe7,0x0e,0x90,0x91,0x11,0xe0,
  92634. +0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90,0x91,0x11,0xe0,0xc3,0x94,
  92635. +0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x42,0x4d,
  92636. +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0x90,0x91,0x98,0xf0,0xa3,0xf0,0x90,0x05,0xf8,
  92637. +0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,
  92638. +0x01,0x22,0xd3,0x90,0x91,0x99,0xe0,0x94,0xe8,0x90,0x91,0x98,0xe0,0x94,0x03,0x40,
  92639. +0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x91,0x98,0xe4,0x75,
  92640. +0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0xef,0x70,0x02,0x41,0x3d,0x90,0x90,0xe8,0xe0,
  92641. +0x60,0x02,0xc1,0x08,0x90,0x90,0xd4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  92642. +0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x80,0x12,0x43,0x09,0x90,0x80,0x85,
  92643. +0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x84,0x12,0x43,0x09,
  92644. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x88,
  92645. +0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,
  92646. +0x90,0x90,0x8c,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,
  92647. +0x12,0x2f,0xd9,0x90,0x90,0x90,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  92648. +0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x94,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  92649. +0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x98,0x12,0x43,0x09,0x90,
  92650. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x9c,0x12,
  92651. +0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  92652. +0x90,0xa0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,
  92653. +0x2f,0xd9,0x90,0x90,0xa4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,
  92654. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xa8,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,
  92655. +0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xac,0x12,0x43,0x09,0x90,0x80,
  92656. +0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xb0,0x12,0x43,
  92657. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,
  92658. +0xb4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,
  92659. +0xd9,0x90,0x90,0xb8,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,
  92660. +0x0e,0x12,0x2f,0xd9,0x90,0x90,0xbc,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  92661. +0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xc0,0x12,0x43,0x09,0x90,0x80,0x85,
  92662. +0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xc4,0x12,0x43,0x09,
  92663. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,0xc8,
  92664. +0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,
  92665. +0x90,0x90,0xcc,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,
  92666. +0x12,0x2f,0xd9,0x90,0x90,0xd0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  92667. +0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0xe8,0x74,0x01,0xf0,0x22,0x90,0x90,0xe8,
  92668. +0xe0,0x64,0x01,0x60,0x02,0xc1,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,
  92669. +0xd4,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0x80,0x12,0x2a,
  92670. +0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0x84,0x12,0x2a,0x7f,0x7f,0x6c,
  92671. +0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x88,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,
  92672. +0x27,0xde,0x90,0x90,0x8c,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,
  92673. +0x90,0x90,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x94,0x12,
  92674. +0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x98,0x12,0x2a,0x7f,0x7f,
  92675. +0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x9c,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,
  92676. +0x12,0x27,0xde,0x90,0x90,0xa0,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,
  92677. +0x90,0x90,0xa4,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xa8,
  92678. +0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xac,0x12,0x2a,0x7f,
  92679. +0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xb0,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,
  92680. +0x0e,0x12,0x27,0xde,0x90,0x90,0xb4,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,
  92681. +0xde,0x90,0x90,0xb8,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,
  92682. +0xbc,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xc0,0x12,0x2a,
  92683. +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x90,0xc4,0x12,0x2a,0x7f,0x7f,0x04,
  92684. +0x7e,0x0d,0x12,0x27,0xde,0x90,0x90,0xc8,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,
  92685. +0x27,0xde,0x90,0x90,0xcc,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,
  92686. +0x90,0xd0,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x91,0x88,0x12,
  92687. +0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x44,0xc0,0xfd,0xec,0x90,0x91,0x88,
  92688. +0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  92689. +0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,
  92690. +0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,
  92691. +0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,
  92692. +0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,
  92693. +0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,
  92694. +0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,
  92695. +0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,
  92696. +0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,
  92697. +0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,
  92698. +0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  92699. +0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,
  92700. +0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,
  92701. +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,
  92702. +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,
  92703. +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,
  92704. +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,
  92705. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,
  92706. +0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,
  92707. +0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x91,
  92708. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,0x91,0x88,
  92709. +0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,0x90,0x91,
  92710. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  92711. +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x91,
  92712. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,
  92713. +0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,
  92714. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  92715. +0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  92716. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,
  92717. +0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,
  92718. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  92719. +0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  92720. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x54,0x0f,0xfd,
  92721. +0xec,0x54,0xf0,0xfc,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,
  92722. +0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,
  92723. +0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,
  92724. +0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,
  92725. +0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,
  92726. +0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,0x90,0x91,0x88,0x12,0x2a,0x7f,
  92727. +0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,
  92728. +0x12,0x2f,0xd9,0xe4,0x90,0x90,0xe8,0xf0,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x4b,0xee,
  92729. +0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x90,0xf7,0xf0,0x90,0x90,0xfd,0xf0,0x90,
  92730. +0x91,0x00,0xf0,0x90,0x90,0xfe,0xf0,0x90,0x91,0x01,0xf0,0x90,0x90,0xff,0xf0,0x90,
  92731. +0x91,0x02,0xf0,0x90,0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,
  92732. +0x90,0xee,0xf0,0x90,0x90,0xf3,0xf0,0x90,0x90,0xf5,0xf0,0x90,0x91,0x07,0xf0,0x90,
  92733. +0x90,0xf8,0xf0,0x90,0x90,0xf4,0xf0,0x90,0x90,0xed,0xf0,0x90,0x00,0x51,0xe0,0x44,
  92734. +0xc0,0xfd,0x7f,0x51,0x02,0x4b,0xee,0x90,0x05,0x60,0xe0,0x90,0x91,0x03,0xf0,0x90,
  92735. +0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x05,0xf0,0x90,
  92736. +0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x91,0x04,0xe0,
  92737. +0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,
  92738. +0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x91,0x06,0x80,0x03,0x90,0x91,0x05,0xe0,0x04,
  92739. +0xf0,0x22,0x90,0x91,0x04,0xe0,0x2f,0xf0,0x22,0x90,0x90,0xf5,0xe0,0x64,0x01,0x60,
  92740. +0x02,0xe1,0x6e,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x4b,0xee,0x90,
  92741. +0x91,0x07,0xe0,0x70,0x32,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,
  92742. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,
  92743. +0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x90,0xf4,0xe0,0xff,0xd1,0x67,0x90,0x91,0x07,
  92744. +0x74,0x01,0x12,0x4b,0xe4,0x80,0x40,0x90,0x91,0x07,0xe0,0x64,0x01,0x70,0x38,0x90,
  92745. +0x90,0xf8,0xe0,0xff,0xd1,0x67,0xe4,0x90,0x91,0x07,0xf0,0x90,0x00,0x45,0xe0,0x44,
  92746. +0x01,0xfd,0x7f,0x45,0x12,0x4b,0xee,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xef,
  92747. +0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,
  92748. +0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,
  92749. +0x03,0xe0,0x90,0x05,0x84,0xf0,0x90,0x91,0x04,0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,
  92750. +0x05,0xe0,0x90,0x05,0x86,0xf0,0x90,0x91,0x06,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,
  92751. +0x90,0xee,0xe0,0xc3,0x94,0x14,0x50,0x06,0xe0,0x04,0xf0,0x02,0x70,0x29,0x90,0x90,
  92752. +0xee,0xe0,0x64,0x14,0x60,0x03,0x02,0x70,0x29,0x90,0x90,0xfd,0xe0,0x70,0x25,0x90,
  92753. +0x91,0x00,0xe0,0x70,0x1f,0x90,0x90,0xfe,0xe0,0x70,0x19,0x90,0x91,0x01,0xe0,0x70,
  92754. +0x13,0x90,0x90,0xff,0xe0,0x70,0x0d,0x90,0x91,0x02,0xe0,0x70,0x07,0x90,0x04,0xfd,
  92755. +0xe0,0x54,0xfe,0xf0,0x90,0x90,0xfd,0xe0,0x90,0x04,0x44,0xf0,0x90,0x90,0xfe,0xe0,
  92756. +0x90,0x04,0x45,0xf0,0x90,0x90,0xff,0xe0,0x90,0x04,0x46,0xf0,0xa3,0xe4,0xf0,0x90,
  92757. +0x91,0x00,0xe0,0x90,0x04,0x48,0xf0,0x90,0x91,0x01,0xe0,0x90,0x04,0x49,0xf0,0x90,
  92758. +0x91,0x02,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x90,0xe9,0xe0,0x90,0x04,
  92759. +0x4c,0xf0,0x90,0x90,0xea,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x90,0xeb,0xe0,0x90,0x04,
  92760. +0x4e,0xf0,0x90,0x90,0xec,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x90,0xee,0xf0,0x90,
  92761. +0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x90,0xfd,0xf0,0xa3,
  92762. +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0,0x90,0x91,0x8c,
  92763. +0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x8d,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x8e,
  92764. +0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x8f,0xf0,0x90,0x91,0x06,0xe0,0xff,0x90,0x91,
  92765. +0x8f,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x91,0x06,0xe0,0xc3,0x9e,0xd3,0x94,0x01,
  92766. +0x40,0x11,0x90,0x90,0xf4,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x90,0xf8,0xe0,0xff,
  92767. +0x12,0x6e,0x67,0x22,0x90,0x91,0x07,0xe0,0x64,0x01,0x60,0x08,0x90,0x90,0xf5,0xe0,
  92768. +0x60,0x02,0x21,0x4b,0x90,0x90,0xe9,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,
  92769. +0x80,0x3b,0x90,0x90,0xea,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,
  92770. +0x28,0x90,0x90,0xeb,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0,0xe4,0x90,0x90,
  92771. +0xea,0xf0,0x80,0x15,0x90,0x90,0xec,0xe0,0xc3,0x94,0xff,0x50,0x10,0xe0,0x04,0xf0,
  92772. +0xe4,0x90,0x90,0xeb,0xf0,0x90,0x90,0xea,0xf0,0x90,0x90,0xe9,0xf0,0x90,0x00,0x44,
  92773. +0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x90,0xfd,0xe0,0xc3,0x94,0xff,
  92774. +0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x90,0xfe,0xe0,0xc3,0x94,0xff,0x50,0x06,
  92775. +0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x90,0xff,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,
  92776. +0x04,0xf0,0xe4,0x90,0x90,0xfe,0xf0,0x90,0x90,0xfd,0xf0,0x90,0x00,0x44,0xe0,0x30,
  92777. +0xe3,0x32,0x90,0x91,0x00,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,
  92778. +0x90,0x91,0x01,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,
  92779. +0x91,0x02,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x91,0x01,0xf0,
  92780. +0x90,0x91,0x00,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x90,0x06,0x90,0xe0,
  92781. +0x44,0x01,0xf0,0x90,0x91,0x61,0xe0,0x30,0xe0,0x3c,0x90,0x91,0x5f,0xe0,0xff,0x90,
  92782. +0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x54,0x01,0xfd,0x12,0x4a,0xf6,0x90,0x91,0x60,0xe0,
  92783. +0x75,0xf0,0x20,0xa4,0xff,0xae,0xf0,0x12,0x37,0x54,0x90,0x91,0x5e,0xe0,0xc4,0x13,
  92784. +0x54,0x07,0x30,0xe0,0x07,0xa3,0xe0,0xff,0xe4,0xfd,0x80,0x07,0x90,0x91,0x5f,0xe0,
  92785. +0xff,0x7d,0x01,0x12,0x4a,0xf6,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90,
  92786. +0x91,0x19,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0xe4,0xa3,0xf0,0x90,0x01,0x1f,0xe0,
  92787. +0xfe,0x90,0x01,0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x91,0x11,0xf0,
  92788. +0xa3,0xef,0xf0,0x90,0x02,0x87,0xe0,0x90,0x91,0x18,0xf0,0x90,0x91,0x56,0xe0,0x20,
  92789. +0xe0,0x02,0x61,0xc4,0xe4,0x90,0x91,0x17,0xf0,0x90,0x91,0x18,0xe0,0xff,0x90,0x91,
  92790. +0x17,0xe0,0xc3,0x9f,0x40,0x02,0x61,0xc4,0x90,0x91,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,
  92791. +0xec,0xff,0x90,0xfd,0x11,0xf0,0x90,0x91,0x1c,0xef,0xf0,0x74,0x02,0x2d,0xf5,0x82,
  92792. +0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc,0x33,0x33,0x33,0x54,0xf8,0xff,0xed,
  92793. +0x24,0x18,0x2f,0x90,0x91,0x15,0xf0,0xe0,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  92794. +0x83,0xe0,0x54,0xfc,0x90,0x91,0x16,0xf0,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,
  92795. +0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,
  92796. +0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab,0x07,0xfa,0x90,0x91,0x13,0xf0,0xa3,
  92797. +0xeb,0xf0,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe,
  92798. +0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x91,0x5a,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03,
  92799. +0xac,0x02,0x12,0x45,0x09,0xaa,0x06,0xab,0x07,0x90,0x91,0x15,0xe0,0x24,0x00,0xf5,
  92800. +0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x30,0xe7,0x08,0x90,0x91,0x19,0x74,0x02,0xf0,
  92801. +0x80,0x05,0xe4,0x90,0x91,0x19,0xf0,0xaf,0x03,0x90,0x91,0x11,0xea,0x8f,0xf0,0x12,
  92802. +0x42,0x81,0x90,0x91,0x5c,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x91,0x11,0xe0,0xfc,0xa3,
  92803. +0xe0,0xfd,0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x91,0x5d,0xe0,0x24,0x01,0xff,0x90,
  92804. +0x91,0x5c,0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x91,0x11,0xf0,
  92805. +0xa3,0xef,0xf0,0x90,0x91,0x16,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x27,
  92806. +0x90,0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x20,0xe0,0x02,0x61,0x9c,
  92807. +0xef,0x90,0x00,0x81,0xb4,0xa0,0x05,0xe0,0x44,0x04,0x80,0x03,0xe0,0x44,0x08,0xfd,
  92808. +0x7f,0x81,0x12,0x4b,0xee,0x61,0x95,0x90,0x91,0x5e,0xe0,0xc4,0x13,0x13,0x54,0x03,
  92809. +0x20,0xe0,0x02,0x61,0x9c,0x90,0x91,0x15,0xe0,0xff,0x24,0x00,0xf5,0x82,0xe4,0x34,
  92810. +0xfb,0xf5,0x83,0xe0,0x54,0x0c,0x64,0x08,0x70,0x72,0x90,0x91,0x19,0xe0,0xfe,0xef,
  92811. +0x2e,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x1e,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,
  92812. +0x64,0x88,0x70,0x58,0x74,0x1f,0x2f,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x64,
  92813. +0x8e,0x70,0x49,0x90,0x91,0x19,0xe0,0xff,0x90,0x91,0x15,0xe0,0x2f,0xff,0x90,0x91,
  92814. +0x1a,0xe0,0x2f,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x19,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  92815. +0x83,0xe0,0x64,0x03,0x70,0x26,0x74,0x1e,0x2f,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,
  92816. +0xe0,0x90,0x00,0x81,0x30,0xe3,0x05,0xe0,0x44,0x01,0x80,0x03,0xe0,0x44,0x02,0xfd,
  92817. +0x7f,0x81,0x12,0x4b,0xee,0x90,0x91,0x56,0xe0,0x44,0x80,0xf0,0x90,0x91,0x56,0xe0,
  92818. +0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x31,0x4c,0x71,0xc9,0xbf,0x01,
  92819. +0x13,0x90,0x91,0x11,0xe0,0xfe,0xa3,0xe0,0xff,0x12,0x44,0xb5,0x90,0x91,0x17,0xe0,
  92820. +0x04,0xf0,0x21,0xd9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x56,0xe0,0xc4,0x13,0x13,
  92821. +0x13,0x54,0x01,0x30,0xe0,0x11,0xe0,0x44,0x80,0xf0,0x90,0x91,0x5e,0xe0,0xc4,0x54,
  92822. +0x0f,0x20,0xe0,0x03,0x7f,0x00,0x22,0x7f,0x01,0x22,0x8f,0x1f,0xe4,0x90,0x91,0x22,
  92823. +0xf0,0xe5,0x1f,0x14,0xfe,0x90,0x91,0x22,0xe0,0xff,0xc3,0x9e,0x50,0x0e,0xef,0x04,
  92824. +0xfd,0x12,0x34,0xb7,0x90,0x91,0x22,0xe0,0x04,0xf0,0x80,0xe5,0xe5,0x1f,0x14,0xff,
  92825. +0x7d,0xff,0x12,0x34,0xb7,0x90,0x91,0x22,0xe5,0x1f,0xf0,0x90,0x91,0x22,0xe0,0xc3,
  92826. +0x94,0xff,0x50,0x0f,0xe0,0xff,0x04,0xfd,0x12,0x34,0xb7,0x90,0x91,0x22,0xe0,0x04,
  92827. +0xf0,0x80,0xe8,0xad,0x1f,0x7f,0xff,0x02,0x34,0xb7,0xc3,0xee,0x94,0x01,0x40,0x0a,
  92828. +0x0d,0xed,0x13,0x90,0xfd,0x10,0xf0,0xe4,0x2f,0xff,0x22,0xc3,0xee,0x94,0x01,0x40,
  92829. +0x1e,0x90,0xfd,0x11,0xe0,0xb5,0x05,0x14,0x90,0x01,0x17,0xe0,0xb5,0x05,0x07,0x90,
  92830. +0xfd,0x11,0xe4,0xf0,0x80,0x06,0xed,0x04,0x90,0xfd,0x11,0xf0,0xe4,0x2f,0xff,0x22,
  92831. +0x0f,0x75,};
  92832. +
  92833. +u8 Rtl8192CUFwUMCACutWWImgArray[UMCACutWWImgArrayLength] = {
  92834. +0xc1,0x88,0x02,0x00,0x51,0x00,0x00,0x00,0x03,0x23,0x16,0x44,0x72,0x34,0x01,0x00,
  92835. +0x58,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92836. +0x02,0x43,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92837. +0x00,0x00,0x00,0x02,0x57,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92838. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92839. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92840. +0x00,0x00,0x00,0x02,0x5c,0xb6,0x00,0x00,0x00,0x00,0x00,0x02,0x5d,0x99,0x00,0x00,
  92841. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92842. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92843. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92844. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92845. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92846. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92847. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92848. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92849. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92850. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92851. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92852. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92853. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92854. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92855. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92856. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92857. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92858. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92859. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92860. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92861. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92862. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92863. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92864. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92865. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92866. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92867. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92868. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92869. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92870. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  92871. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  92872. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  92873. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  92874. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  92875. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  92876. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  92877. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,
  92878. +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,
  92879. +0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,
  92880. +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xf8,
  92881. +0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,
  92882. +0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,
  92883. +0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,
  92884. +0x4a,0xfe,0xed,0x49,0xfd,0xec,0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,
  92885. +0xfe,0xa3,0xe0,0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,
  92886. +0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,
  92887. +0xf9,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,
  92888. +0x22,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,
  92889. +0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,
  92890. +0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,
  92891. +0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,
  92892. +0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,
  92893. +0x06,0x74,0x03,0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0x02,0x43,0xdb,
  92894. +0x02,0x50,0x2a,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,
  92895. +0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,
  92896. +0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,
  92897. +0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x20,0xe4,0x7e,
  92898. +0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,
  92899. +0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,
  92900. +0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,
  92901. +0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,
  92902. +0x41,0x91,0x40,0x00,0x41,0x91,0x9c,0x00,0x41,0x91,0x23,0x80,0x41,0x91,0x24,0x80,
  92903. +0x41,0x91,0x9e,0x00,0x41,0x91,0x52,0x00,0x41,0x91,0x93,0x00,0x41,0x91,0x91,0x00,
  92904. +0x41,0x91,0x90,0x00,0x41,0x91,0x92,0x00,0x00,0xf0,0x90,0x91,0x30,0xe0,0x90,0x91,
  92905. +0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  92906. +0x90,0x91,0x65,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,
  92907. +0x30,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,
  92908. +0x08,0xf0,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,
  92909. +0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x59,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,
  92910. +0x92,0x74,0x02,0xf0,0x90,0x91,0x36,0x14,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x0c,
  92911. +0x50,0x02,0xf1,0x23,0x22,0x90,0x02,0x84,0xef,0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,
  92912. +0xf0,0x22,0x7d,0x01,0xaf,0x6f,0xe1,0x27,0xf1,0xe6,0xbf,0x01,0x10,0x90,0x91,0x42,
  92913. +0xe0,0xff,0xe4,0xfd,0x12,0x48,0x22,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x8f,0x82,
  92914. +0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x72,0x7f,0x60,0x7e,0x01,0x80,
  92915. +0xed,0x7f,0x00,0x22,0x90,0x91,0x53,0xe0,0x54,0xfe,0xf0,0x02,0x50,0xd6,0x22,0xe4,
  92916. +0xf5,0x75,0x22,0x02,0x5f,0xe2,0x02,0x5f,0xe9,0xef,0x8e,0xf0,0x71,0x70,0x45,0x26,
  92917. +0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5,
  92918. +0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  92919. +0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce,
  92920. +0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54,
  92921. +0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c,
  92922. +0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce,
  92923. +0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04,
  92924. +0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01,
  92925. +0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3,
  92926. +0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  92927. +0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25,
  92928. +0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0x90,0x91,0x09,0x12,0x25,0x14,0x00,0x00,0x00,
  92929. +0x00,0x90,0x06,0xa9,0xe0,0x90,0x91,0x08,0xf0,0xe0,0x54,0xc0,0x70,0x0a,0x53,0x71,
  92930. +0xfe,0x53,0x71,0xfd,0x91,0xc2,0x80,0x47,0x90,0x91,0x26,0xe0,0x60,0x41,0x90,0x91,
  92931. +0x38,0xe0,0x70,0x3b,0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x22,
  92932. +0x65,0x90,0x91,0x09,0x12,0x25,0x08,0x90,0x91,0x09,0x71,0x09,0xec,0x44,0x02,0xfc,
  92933. +0x90,0x91,0x09,0x12,0x25,0x08,0x90,0x91,0x09,0x71,0x09,0x90,0x80,0x96,0x12,0x25,
  92934. +0x08,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x08,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x90,
  92935. +0x91,0x08,0xe0,0x30,0xe6,0x13,0x43,0x71,0x01,0x90,0x91,0x3b,0xe0,0x64,0x02,0x60,
  92936. +0x04,0x91,0xc8,0x80,0x07,0x91,0x77,0x80,0x03,0x53,0x71,0xfe,0x90,0x91,0x08,0xe0,
  92937. +0x30,0xe7,0x16,0x43,0x71,0x02,0xe4,0x90,0x91,0x66,0x91,0x49,0x90,0x01,0x57,0x74,
  92938. +0x05,0xf0,0x90,0x91,0x3c,0x74,0x01,0xf0,0x22,0x53,0x71,0xfd,0x22,0xd3,0x10,0xaf,
  92939. +0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x91,0x68,0x71,0x41,0xab,
  92940. +0x63,0xaa,0x64,0xa9,0x65,0x90,0x91,0x6b,0x71,0x41,0xaf,0x66,0x15,0x66,0xef,0x60,
  92941. +0x1b,0x90,0x91,0x6b,0xe4,0x75,0xf0,0x01,0x71,0x2a,0x12,0x24,0x62,0xff,0x90,0x91,
  92942. +0x68,0xe4,0x75,0xf0,0x01,0x71,0x2a,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,
  92943. +0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,
  92944. +0x6e,0x71,0x41,0x90,0x91,0x9e,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x51,0x5f,
  92945. +0x7f,0xaf,0x7e,0x01,0x12,0x64,0x1c,0xef,0x60,0x44,0x90,0x91,0x6e,0x71,0x21,0x8b,
  92946. +0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0xd1,0x6d,
  92947. +0x90,0x91,0x71,0x71,0x21,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x91,0x6e,0x71,0x21,
  92948. +0x12,0x24,0x62,0xff,0xc4,0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0xd1,
  92949. +0x6d,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,
  92950. +0x92,0xaf,0x22,0x7d,0x01,0x7f,0x0c,0x90,0x91,0x95,0xed,0xf0,0x90,0x91,0x94,0xef,
  92951. +0xf0,0x54,0x0f,0xff,0xe5,0x6e,0x54,0x0f,0x6f,0x60,0x76,0x90,0x91,0x94,0xe0,0x30,
  92952. +0xe2,0x30,0xe5,0x6e,0x20,0xe2,0x05,0x7f,0x01,0x12,0x62,0x65,0xe5,0x6e,0x30,0xe3,
  92953. +0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,0x08,0x12,0x5a,0x3f,0xef,0x60,0x53,0x80,0x52,
  92954. +0xe5,0x6e,0x20,0xe3,0x4c,0x90,0x91,0x94,0xe0,0x30,0xe3,0x45,0xa3,0xe0,0xff,0x02,
  92955. +0x62,0x4a,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x0c,0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,
  92956. +0x08,0x12,0x5a,0x3f,0xef,0x60,0x2a,0xf1,0xb2,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x04,
  92957. +0x10,0x90,0x91,0x94,0xe0,0x20,0xe2,0x09,0x12,0x5b,0xb3,0xef,0x60,0x13,0x12,0x48,
  92958. +0xce,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x02,0x08,0x91,0xf1,0xef,0x60,0x03,0x12,0x63,
  92959. +0x56,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x6d,0xb4,0x01,0x04,0x7f,0x01,
  92960. +0xf1,0xc9,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x8f,0x67,0xf1,0xe6,0xbf,0x01,0x15,
  92961. +0x90,0x91,0x43,0x12,0x48,0x1e,0xad,0x07,0xac,0x06,0xaf,0x67,0x12,0x61,0xa3,0x90,
  92962. +0x04,0x1f,0x74,0x20,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x01,0xc4,
  92963. +0x74,0xe6,0xf0,0x74,0x47,0xa3,0xf0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,
  92964. +0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,
  92965. +0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,
  92966. +0x7d,0x01,0x90,0x91,0x74,0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,
  92967. +0x70,0x60,0x04,0xe4,0xff,0x11,0xb3,0x90,0x91,0x74,0xe0,0x30,0xe0,0x09,0x90,0x91,
  92968. +0x76,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90,0x91,0x74,0xe0,0xff,0xc3,0x13,0x90,0xfd,
  92969. +0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90,0x91,0x75,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,
  92970. +0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,
  92971. +0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x91,0x76,0xa3,
  92972. +0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,
  92973. +0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,
  92974. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x91,0x76,0xe0,0xfe,0xa3,
  92975. +0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x91,0x51,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,
  92976. +0x09,0x90,0x91,0x51,0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x68,0x87,0x22,0x90,0x01,
  92977. +0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x68,0x46,0xef,0x70,0x06,
  92978. +0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d,0xe5,0x70,0x60,
  92979. +0x04,0x7f,0x01,0x11,0xb3,0x51,0x0c,0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0xef,0x64,
  92980. +0x01,0x70,0x42,0x7d,0x78,0x7f,0x02,0x12,0x31,0x2c,0x7d,0x02,0x7f,0x03,0x12,0x31,
  92981. +0x2c,0x90,0x01,0x36,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x31,0x9d,0x7d,0x10,0x7f,
  92982. +0x03,0x12,0x31,0x49,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,
  92983. +0x47,0x23,0xe4,0xff,0x11,0xb3,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,
  92984. +0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7b,0xf0,0xa3,0x74,0x02,0xf0,0x7d,
  92985. +0x7b,0xff,0x12,0x31,0x9d,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d,0x7d,0x10,0x7f,0x03,
  92986. +0x12,0x31,0x49,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,
  92987. +0xf0,0x12,0x64,0x11,0xe5,0x6d,0x20,0xe0,0x05,0xe4,0x90,0x91,0x29,0xf0,0x22,0x8b,
  92988. +0x0e,0x8a,0x0f,0x89,0x10,0x12,0x62,0x3e,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x12,0x24,
  92989. +0x62,0xf5,0x70,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,
  92990. +0x7f,0x01,0x80,0x3a,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,0x12,0x42,0x20,
  92991. +0xfd,0xe4,0xff,0x31,0xe1,0x80,0x27,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,
  92992. +0x12,0x42,0x20,0xfd,0x7f,0x01,0x31,0xe1,0x1f,0x80,0x13,0xab,0x0e,0xaa,0x0f,0xa9,
  92993. +0x10,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0xe1,0xe4,0xff,0x11,0xfe,
  92994. +0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x91,0x39,0x74,0x01,0xf0,0x80,
  92995. +0x16,0xed,0x70,0x0a,0x90,0x91,0x35,0xe0,0x90,0x91,0x39,0xf0,0x80,0x05,0x90,0x91,
  92996. +0x39,0xed,0xf0,0x90,0x91,0x39,0xe0,0x90,0x91,0x27,0xf0,0x22,0x7f,0x78,0x7e,0x08,
  92997. +0x12,0x22,0x65,0x90,0x90,0xd8,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,
  92998. +0x90,0x90,0xdc,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x22,0x65,0x90,0x90,0xe0,
  92999. +0x12,0x25,0x08,0x90,0x91,0x51,0xe0,0x90,0x90,0xd8,0xb4,0x01,0x0d,0x12,0x43,0x09,
  93000. +0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x09,0xef,0x54,0xc7,
  93001. +0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,
  93002. +0x90,0xdc,0x12,0x43,0x09,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,
  93003. +0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x90,0xe0,0x12,0x43,0x09,0xef,0x44,0x02,
  93004. +0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x08,0x7f,
  93005. +0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0xe4,0x12,0x25,0x08,0x90,0x80,0x96,0x12,
  93006. +0x25,0x14,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,
  93007. +0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x30,0x2c,0x90,0x91,0x51,
  93008. +0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,
  93009. +0x7f,0x01,0x12,0x30,0x2c,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x80,0x08,0xf4,0xff,
  93010. +0x90,0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,
  93011. +0xfe,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x9b,
  93012. +0xed,0xf0,0x90,0x91,0x9a,0xef,0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,0xff,0x74,0x01,
  93013. +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,
  93014. +0xf0,0x51,0xe6,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,
  93015. +0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x9b,0xe0,
  93016. +0x60,0x16,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  93017. +0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x66,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,
  93018. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6b,0x90,
  93019. +0x91,0x9a,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,
  93020. +0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x51,0xde,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,
  93021. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x51,
  93022. +0xe6,0x90,0x91,0x9b,0xe0,0x60,0x1b,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,
  93023. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,
  93024. +0x80,0x1a,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  93025. +0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x51,0xe6,0xd0,
  93026. +0xd0,0x92,0xaf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd,0x7f,0x45,0xd3,0x10,
  93027. +0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0x51,0xe6,0xd0,0xd0,
  93028. +0x92,0xaf,0x22,0xef,0x14,0x60,0x30,0x14,0x60,0x66,0x24,0x02,0x60,0x02,0x81,0xaa,
  93029. +0x90,0x90,0xf3,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x71,
  93030. +0xee,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x71,0xee,0x90,0x00,0x45,0xe0,
  93031. +0x44,0x10,0xfd,0x7f,0x45,0x80,0x71,0xe4,0x90,0x90,0xf3,0xf0,0x90,0x90,0xef,0x12,
  93032. +0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,
  93033. +0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x71,0xee,0x90,0x00,0x45,0xe0,0x54,0xef,
  93034. +0xfd,0x7f,0x45,0x71,0xee,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x38,
  93035. +0x90,0x90,0xf3,0x74,0x01,0xf0,0x90,0x90,0xf9,0x12,0x43,0x09,0x90,0x80,0x96,0x12,
  93036. +0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,
  93037. +0x7f,0x45,0x71,0xee,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x71,0xee,0x90,
  93038. +0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x71,0xee,0x22,0x90,0x00,0x02,0x12,0x42,
  93039. +0x20,0x90,0x90,0xf5,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,
  93040. +0x90,0xf4,0xf0,0x12,0x24,0x62,0x25,0xe0,0x25,0xe0,0x90,0x90,0xf8,0xf0,0x90,0x05,
  93041. +0x60,0xe0,0x90,0x91,0x03,0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,
  93042. +0x62,0xe0,0x90,0x91,0x05,0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xa2,0xaf,
  93043. +0xe4,0x33,0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x90,0x90,0xf4,0xe0,0xff,0x12,0x6e,0x67,
  93044. +0x90,0x91,0x1c,0xe0,0x24,0xff,0x92,0xaf,0x90,0x90,0xf5,0xe0,0x70,0x02,0xa1,0xb2,
  93045. +0x90,0x90,0xf4,0xe0,0x70,0x02,0xa1,0xb2,0x90,0x90,0xf8,0xe0,0x70,0x02,0xa1,0xb2,
  93046. +0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x90,0x91,0x07,0x74,0x01,0xf0,
  93047. +0x90,0x91,0x1c,0xe0,0x24,0xff,0x92,0xaf,0x71,0xe5,0x90,0x00,0x46,0xe0,0x44,0x01,
  93048. +0xfd,0x7f,0x46,0x71,0xee,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,
  93049. +0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,
  93050. +0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x71,
  93051. +0xee,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,0x03,0xe0,0x90,0x05,0x84,0xf0,
  93052. +0x90,0x91,0x04,0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,0x05,0xe0,0x90,0x05,0x86,0xf0,
  93053. +0x90,0x91,0x06,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,0xf0,
  93054. +0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x31,0xb7,
  93055. +0x80,0x2b,0x90,0x90,0xf5,0xe0,0x70,0x2d,0x90,0x91,0x07,0x71,0xe4,0x90,0x00,0x46,
  93056. +0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x71,0xee,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,
  93057. +0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x31,0x49,0x90,0x91,0x1c,
  93058. +0xe0,0x24,0xff,0x92,0xaf,0x22,0x8b,0x0e,0x8a,0x0f,0x89,0x10,0x90,0x00,0x02,0x12,
  93059. +0x42,0x20,0x90,0x90,0xf6,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x90,0xed,0x74,0x01,0xf0,
  93060. +0x7f,0x80,0x7e,0x08,0x12,0x22,0x65,0x90,0x90,0xef,0x12,0x25,0x08,0xab,0x0e,0xaa,
  93061. +0x0f,0xa9,0x10,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,
  93062. +0x12,0x24,0xf5,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x90,0xef,0x12,0x43,
  93063. +0x09,0xec,0x54,0x03,0xfc,0x12,0x42,0xfc,0x90,0x90,0xf9,0x12,0x25,0x08,0x90,0x05,
  93064. +0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90,0x90,0xed,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x22,
  93065. +0x65,0xec,0x54,0x03,0xfc,0xec,0x44,0xc0,0xfc,0x90,0x90,0xef,0x12,0x25,0x08,0x90,
  93066. +0x90,0xef,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,
  93067. +0x2b,0x08,0x90,0x90,0xf6,0xe0,0x30,0xe1,0x19,0x7d,0x0c,0x7f,0x47,0x71,0xee,0x90,
  93068. +0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x71,0xee,0x90,0x00,0x46,0xe0,0x44,0x10,
  93069. +0x80,0x1c,0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x71,0xee,0x90,0x00,0x48,
  93070. +0xe0,0x54,0xf3,0xfd,0x7f,0x48,0x71,0xee,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,
  93071. +0x46,0x71,0xee,0xe4,0x90,0x90,0xf3,0xf0,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,
  93072. +0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,
  93073. +0x71,0xee,0x7d,0xff,0x7f,0x55,0x71,0xee,0x7d,0xff,0x7f,0x56,0x71,0xee,0x7d,0xff,
  93074. +0x7f,0x57,0x61,0xee,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,
  93075. +0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x71,0xee,0xe4,0xfd,
  93076. +0x7f,0x51,0x71,0xee,0xe4,0xfd,0x7f,0x52,0x71,0xee,0xe4,0xfd,0x7f,0x53,0x61,0xee,
  93077. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x22,0xed,0xf0,0x90,0x91,0x21,0xef,
  93078. +0xf0,0xd3,0x94,0x07,0x50,0x4e,0xa3,0xe0,0x70,0x1a,0x90,0x91,0x21,0xe0,0xff,0x74,
  93079. +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,
  93080. +0x5f,0xf0,0x80,0x17,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  93081. +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x21,
  93082. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,
  93083. +0x00,0x46,0x80,0x59,0x90,0x91,0x21,0xe0,0x24,0xf8,0xf0,0xa3,0xe0,0x70,0x1d,0x90,
  93084. +0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,
  93085. +0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80,0x1a,0x90,0x91,0x21,0xe0,
  93086. +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,
  93087. +0x90,0x00,0x43,0xe0,0x4f,0xf0,0x51,0xe6,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,
  93088. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,
  93089. +0x51,0xe6,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x49,0xe0,0x90,0x91,0x9f,0xf0,0xe0,
  93090. +0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x71,0xee,0x90,0x91,0x9f,0xe0,0x44,0xb0,
  93091. +0xfd,0x7f,0x49,0x61,0xee,0x12,0x47,0xe6,0xbf,0x01,0x10,0x90,0x02,0x09,0xe0,0xff,
  93092. +0x7d,0x01,0x12,0x48,0x22,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x75,0x28,0x33,0xe4,
  93093. +0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,
  93094. +0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4,0x90,0x91,0x0e,0xf0,0xa3,
  93095. +0xf0,0x75,0x8e,0x02,0xf1,0x25,0xd1,0xe8,0x90,0x91,0x4f,0xef,0xf0,0xf1,0x0b,0x90,
  93096. +0x91,0x51,0xef,0xf0,0xf1,0x60,0x90,0x91,0x3d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5,
  93097. +0x57,0xf1,0x02,0x12,0x61,0xc4,0x12,0x2e,0x01,0x12,0x44,0xff,0x11,0x0c,0xf1,0x36,
  93098. +0xd1,0xfb,0xd1,0xd0,0x12,0x44,0xfe,0x31,0x13,0x12,0x44,0xf4,0x12,0x6e,0x09,0x90,
  93099. +0x91,0x10,0xe5,0xd9,0xf0,0x12,0x4e,0xb9,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,
  93100. +0xf0,0x12,0x4a,0xe6,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x91,0x0e,0xe0,
  93101. +0x64,0x01,0xf0,0x24,0x2a,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57,0x30,
  93102. +0xe2,0x10,0x12,0x5f,0xf0,0xbf,0x01,0x0a,0xc2,0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,
  93103. +0x71,0x97,0xe5,0x57,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x12,0x60,
  93104. +0x2d,0x90,0x90,0xf7,0xe0,0x70,0x03,0x12,0x70,0x74,0x11,0xe7,0x90,0x91,0x3f,0xe0,
  93105. +0x90,0x01,0xba,0xf0,0x80,0xb6,0xe4,0x90,0x91,0x55,0xf0,0x90,0x91,0x53,0xe0,0x54,
  93106. +0x7f,0xf0,0xa3,0x74,0x0a,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x25,0x14,0x70,0x1b,
  93107. +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x67,0xe4,0xbf,0x01,0x09,
  93108. +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x04,0x80,0x00,0xe1,0x17,0xe4,0x90,0x06,
  93109. +0x34,0xf0,0x22,0x90,0x91,0x56,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x7f,0xf0,0x90,0x01,
  93110. +0x17,0xe0,0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x91,
  93111. +0x5c,0xf0,0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x91,0x1c,0xf0,0xe0,
  93112. +0xff,0x74,0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,
  93113. +0xf9,0x90,0x91,0x5b,0xf0,0xee,0x90,0x91,0x5a,0xf0,0x90,0x91,0x5e,0xe0,0x54,0xfe,
  93114. +0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0,0x54,0xef,
  93115. +0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4,0xa3,0xf0,
  93116. +0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x22,
  93117. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x12,0x24,0x62,0x54,0x01,0xff,0x90,0x91,0x56,
  93118. +0xe0,0x54,0xfe,0x4f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x57,0xf0,0x90,
  93119. +0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x58,0xf0,0x90,0x91,0x56,0xe0,0x30,0xe0,0x1a,
  93120. +0x90,0x06,0x09,0xe0,0x54,0xfe,0xf0,0x90,0x02,0x86,0xe0,0x44,0x04,0xf0,0x43,0x57,
  93121. +0x04,0x7d,0x08,0xe4,0xff,0x12,0x31,0x9d,0x80,0x12,0x7d,0x08,0xe4,0xff,0x12,0x31,
  93122. +0x2c,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x31,0xf1,0x31,0x13,0xd0,0xd0,0x92,0xaf,
  93123. +0x22,0x90,0x06,0x90,0xe4,0xf0,0x21,0x5a,0x90,0x91,0x19,0x12,0x43,0x41,0xef,0x12,
  93124. +0x43,0x4a,0x52,0x30,0x01,0x52,0x39,0x02,0x52,0x5b,0x03,0x52,0x64,0x09,0x52,0x6c,
  93125. +0x0c,0x52,0x75,0x0d,0x52,0x7d,0x0e,0x52,0x8e,0x1a,0x52,0x96,0x2c,0x52,0x41,0x2d,
  93126. +0x52,0x4a,0x2e,0x52,0x9e,0x30,0x52,0x53,0x3b,0x52,0x86,0x3c,0x00,0x00,0x52,0xa6,
  93127. +0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x64,0x72,0x90,0x91,0x19,0x12,0x43,0x21,0xc1,
  93128. +0xf5,0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x65,0x8d,0x90,0x91,0x19,0x12,0x43,0x21,
  93129. +0x02,0x65,0xd5,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x4b,0x90,0x91,0x19,0x12,0x43,
  93130. +0x21,0x02,0x66,0x0e,0x90,0x91,0x19,0x12,0x43,0x21,0x80,0x42,0x90,0x91,0x19,0x12,
  93131. +0x43,0x21,0x02,0x4c,0xab,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x98,0x90,0x91,0x19,
  93132. +0x12,0x43,0x21,0x02,0x4d,0xe6,0x90,0x91,0x19,0x12,0x43,0x21,0x21,0x90,0x90,0x91,
  93133. +0x19,0x12,0x43,0x21,0xa1,0x9b,0x90,0x91,0x19,0x12,0x43,0x21,0x81,0x7a,0x90,0x91,
  93134. +0x19,0x12,0x43,0x21,0xe1,0x78,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0xd3,0x10,
  93135. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,0x91,0x1c,0x12,0x43,
  93136. +0x21,0x90,0x00,0x01,0x12,0x42,0x97,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,
  93137. +0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x42,0xcf,0x12,
  93138. +0x24,0x62,0xff,0x60,0x2c,0xb5,0x72,0x16,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,
  93139. +0x01,0x12,0x42,0x97,0x65,0x74,0x70,0x04,0xe5,0x73,0x65,0xf0,0x60,0x23,0x90,0x91,
  93140. +0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0x12,0x42,0x97,0xff,0xae,0xf0,0x71,0x26,0x80,
  93141. +0x10,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x24,0x62,0x65,0x72,0x60,0x03,0x12,0x44,
  93142. +0xe8,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x1f,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x72,
  93143. +0x01,0x8e,0x73,0xf5,0x74,0xe4,0xfd,0x7f,0x0b,0x12,0x4f,0x10,0xe4,0xfd,0x7f,0x02,
  93144. +0x12,0x4f,0x10,0x71,0x6a,0xe4,0xff,0x71,0xcc,0xe4,0xf5,0x76,0x90,0x01,0xc9,0xe5,
  93145. +0x76,0xf0,0x90,0x91,0x1f,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,
  93146. +0x45,0x7d,0x01,0x7f,0x60,0x7e,0x01,0x02,0x30,0x62,0x7f,0x0b,0x71,0xd9,0xef,0x65,
  93147. +0x75,0x60,0x10,0xe5,0x75,0xb4,0x01,0x05,0xe4,0xf5,0x75,0x80,0x03,0x75,0x75,0x01,
  93148. +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe5,0x72,0x64,0x01,0x70,0x3f,0x71,0x6a,0xbf,0x01,
  93149. +0x04,0x7f,0x01,0x71,0xcc,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x12,0x4b,
  93150. +0xee,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x12,0x4b,0xee,0x90,0x00,0x46,
  93151. +0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x12,0x4b,0xee,0x7f,0x02,0x71,0xd9,0x8f,0x76,0x90,
  93152. +0x01,0xc9,0xe5,0x76,0xf0,0xb4,0x01,0x03,0x12,0x4f,0xd7,0x22,0x90,0x01,0xca,0xe5,
  93153. +0x75,0xf0,0xef,0x60,0x03,0x12,0x4f,0xd7,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  93154. +0x90,0x91,0xa0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8,0x07,
  93155. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x12,
  93156. +0x4a,0xe6,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,
  93157. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe,0xef,
  93158. +0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0x80,
  93159. +0x44,0x90,0x91,0xa0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  93160. +0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4a,0xde,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,
  93161. +0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,
  93162. +0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,
  93163. +0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  93164. +0xd0,0xe4,0xf5,0x10,0x75,0x11,0x04,0xf5,0x12,0xf5,0x14,0xf5,0x15,0x90,0x02,0x09,
  93165. +0xe0,0xff,0x12,0x24,0x62,0xfe,0xef,0x2e,0xf5,0x13,0x30,0xe0,0x08,0x75,0x0e,0x00,
  93166. +0x75,0x0f,0x80,0x80,0x05,0xe4,0xf5,0x0e,0xf5,0x0f,0xe5,0x13,0xc3,0x13,0x90,0xfd,
  93167. +0x10,0xf0,0x74,0x20,0x25,0x10,0xf5,0x10,0xad,0x0f,0xe5,0x10,0x2d,0xff,0x24,0x01,
  93168. +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0x91,0x47,0xf0,0x74,0x02,0x2f,0xf5,
  93169. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0xe5,0x10,0x2d,0x24,0x03,0xf5,0x82,0xe4,
  93170. +0x34,0xfc,0xf5,0x83,0xe0,0x24,0x00,0xff,0xe4,0x3e,0x90,0x91,0x48,0xf0,0xa3,0xef,
  93171. +0xf0,0x7f,0x04,0xe5,0x10,0x25,0x0f,0x2f,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
  93172. +0x83,0xe0,0xfe,0x74,0x46,0x2f,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xee,0xf0,0x0f,
  93173. +0xbf,0x08,0xe0,0x12,0x66,0x56,0xef,0x70,0x3f,0x90,0x01,0xc3,0xe0,0x60,0x25,0xc3,
  93174. +0xe5,0x15,0x94,0xe8,0xe5,0x14,0x94,0x03,0x40,0x09,0x90,0x01,0xc6,0xe0,0x44,0x10,
  93175. +0xf0,0x80,0x63,0x05,0x15,0xe5,0x15,0x70,0x02,0x05,0x14,0x7f,0x0a,0x7e,0x00,0x12,
  93176. +0x32,0x15,0x80,0xd5,0x90,0x01,0xc6,0xe0,0x90,0x01,0xc3,0x30,0xe2,0x05,0x74,0xfe,
  93177. +0xf0,0x80,0x43,0x74,0xff,0xf0,0x80,0x3e,0xe5,0x10,0xb4,0x78,0x23,0xe4,0xf5,0x10,
  93178. +0x05,0x13,0xe5,0x0f,0x64,0x80,0x45,0x0e,0x70,0x06,0xf5,0x0e,0xf5,0x0f,0x80,0x06,
  93179. +0x75,0x0e,0x00,0x75,0x0f,0x80,0xe5,0x13,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x80,0x06,
  93180. +0x74,0x08,0x25,0x10,0xf5,0x10,0xe5,0x12,0x15,0x12,0x70,0x02,0x15,0x11,0xe5,0x12,
  93181. +0x45,0x11,0x60,0x02,0x81,0xb8,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x1c,0x12,0x43,
  93182. +0x41,0x12,0x24,0x62,0xff,0x54,0x01,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xfe,0x4e,0xf0,
  93183. +0xef,0x54,0x04,0xff,0xe0,0x54,0xfb,0x4f,0xf0,0x12,0x24,0x62,0xff,0x54,0x02,0xfe,
  93184. +0x90,0x91,0x5e,0xe0,0x54,0xfd,0x4e,0xf0,0xef,0x54,0x08,0xff,0xe0,0x54,0xf7,0x4f,
  93185. +0xf0,0x12,0x24,0x62,0xff,0x54,0x10,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xef,0x4e,0xf0,
  93186. +0xef,0x54,0x20,0xff,0xe0,0x54,0xdf,0x4f,0xf0,0x12,0x24,0x62,0xff,0x54,0x40,0xfe,
  93187. +0x90,0x91,0x5e,0xe0,0x54,0xbf,0x4e,0xf0,0xef,0x54,0x80,0xff,0xe0,0x54,0x7f,0x4f,
  93188. +0xf0,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x60,0xf0,0x90,0x00,0x01,0x12,0x42,
  93189. +0x20,0x90,0x91,0x5f,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x54,0x01,0xfe,0x90,
  93190. +0x91,0x61,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,
  93191. +0x90,0x00,0x03,0x12,0x42,0x20,0x54,0x04,0xff,0x90,0x91,0x61,0xe0,0x54,0xfb,0x4f,
  93192. +0xf0,0x90,0x91,0x5e,0xe0,0x54,0x01,0x90,0x01,0xb8,0xf0,0x90,0x91,0x5e,0xe0,0xff,
  93193. +0xc4,0x13,0x54,0x01,0x90,0x01,0xb9,0xf0,0x90,0x91,0x61,0xe0,0x54,0x01,0x90,0x01,
  93194. +0xba,0xf0,0xa3,0x74,0xff,0xf0,0x12,0x24,0x62,0x20,0xe0,0x02,0x21,0xf1,0xe4,0xfd,
  93195. +0x7f,0x81,0x12,0x4b,0xee,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x24,0x62,0xff,0xc3,
  93196. +0x13,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x02,0xf0,0xef,0x13,0x13,0x54,0x3f,
  93197. +0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x04,0xf0,0x12,0x24,0x62,0x13,0x13,0x13,
  93198. +0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x08,0xf0,0x90,0x91,0x61,0xe0,
  93199. +0x30,0xe0,0x1c,0x90,0x91,0x5e,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07,0xa3,0xe0,
  93200. +0xff,0xe4,0xfd,0x80,0x07,0x90,0x91,0x5f,0xe0,0xff,0x7d,0x01,0x12,0x4a,0xf6,0x22,
  93201. +0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,
  93202. +0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x7f,0x01,
  93203. +0x60,0x02,0x7f,0x00,0x22,0x12,0x24,0x62,0xf5,0x6d,0x22,0x90,0x01,0x64,0x74,0xa0,
  93204. +0xf0,0x22,0x90,0x91,0x51,0xe0,0x90,0x90,0xe8,0xf0,0x22,0x90,0x00,0xf3,0xe0,0x7f,
  93205. +0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,
  93206. +0xa3,0xf0,0xa3,0xf0,0x22,0xe4,0x90,0x91,0x4e,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,
  93207. +0xfd,0x7f,0x80,0x02,0x4b,0xee,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,
  93208. +0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x22,0x12,0x24,0x62,0x60,0x02,
  93209. +0x80,0x01,0xe4,0x90,0x91,0x31,0xf0,0x90,0x91,0x31,0xe0,0x90,0x01,0xe7,0xf0,0x22,
  93210. +0x90,0x91,0x51,0xe0,0xb4,0x01,0x0c,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x05,0x7e,0xfd,
  93211. +0x7f,0x33,0x22,0x7e,0xfd,0x7f,0x2f,0x22,0x12,0x24,0x62,0xff,0x54,0x01,0xfe,0x90,
  93212. +0x91,0x53,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01,
  93213. +0x12,0x42,0x20,0x90,0x91,0x54,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x90,
  93214. +0xf7,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x0e,0xc2,
  93215. +0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x4b,0xee,0x7d,0x40,0x7f,
  93216. +0x01,0x12,0x31,0x66,0xe5,0x0e,0x24,0xff,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,
  93217. +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,
  93218. +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xcb,0xf0,0x74,0x57,
  93219. +0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,
  93220. +0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5,0x2f,0xe5,0x2c,0x30,0xe0,0x5a,0x90,0x01,0x34,
  93221. +0x74,0x01,0xf0,0x85,0xd9,0x54,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,0x48,0x90,
  93222. +0x91,0x3b,0xe0,0x60,0x3a,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,
  93223. +0x51,0x30,0xef,0x64,0x01,0x70,0x30,0x90,0x91,0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,
  93224. +0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,0x59,0x90,0x01,0x5b,
  93225. +0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x91,0x37,0xf0,0x80,0x08,0x51,
  93226. +0x30,0xbf,0x01,0x03,0x12,0x44,0xc2,0xe5,0x2c,0x30,0xe1,0x20,0x90,0x01,0x34,0x74,
  93227. +0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a,0x85,0xd4,0x5b,0x85,0xd5,
  93228. +0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x71,0x5c,0xe5,0x2c,0x30,0xe3,
  93229. +0x10,0x90,0x01,0x34,0x74,0x08,0xf0,0x90,0x91,0x56,0xe0,0x30,0xe0,0x03,0x43,0x57,
  93230. +0x04,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,
  93231. +0x2c,0x30,0xe5,0x26,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1f,0xe0,0x54,0xdf,0xf0,0x90,
  93232. +0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x4e,0xe4,0x90,0x00,
  93233. +0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4a,0xe6,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,
  93234. +0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x13,0x90,0x91,0x50,0x74,0x01,0xf0,
  93235. +0x90,0x01,0x36,0xf0,0x91,0x23,0x51,0x87,0x90,0x91,0x50,0xe4,0xf0,0xe5,0x2e,0x30,
  93236. +0xe1,0x3c,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02,0xe0,0x54,
  93237. +0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,
  93238. +0x91,0x40,0xe4,0xf0,0x80,0x18,0x90,0x91,0x40,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,
  93239. +0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x4f,0xf5,0xe5,0x2e,
  93240. +0x30,0xe2,0x19,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x91,0x3a,0xe4,0xf0,0x90,0x05,
  93241. +0x58,0x74,0x03,0xf0,0x51,0xd8,0x90,0x91,0x3f,0xe0,0x04,0xf0,0xe5,0x2e,0x30,0xe3,
  93242. +0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x6d,0x64,0x01,0x70,0x1c,0xe5,0x70,0x60,
  93243. +0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x91,0x66,0xe4,
  93244. +0x12,0x44,0x49,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2b,0x90,0x01,
  93245. +0x36,0x74,0x10,0xf0,0xe5,0x6d,0xb4,0x01,0x20,0xe5,0x70,0x60,0x1c,0x90,0x01,0x57,
  93246. +0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x91,0x3c,0xe4,0xf0,0x53,0x71,0xfd,
  93247. +0xe5,0x71,0x54,0x07,0x70,0x03,0x12,0x44,0xc2,0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,
  93248. +0x36,0x74,0x20,0xf0,0xe5,0x6d,0xb4,0x01,0x14,0xe5,0x70,0x60,0x10,0x90,0x91,0x3b,
  93249. +0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xc8,0x80,0x03,0x12,0x44,0x77,0xe5,0x2e,0x30,
  93250. +0xe6,0x1b,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x6d,0xb4,0x01,0x10,0xe5,0x70,0x60,
  93251. +0x0c,0x53,0x71,0xfe,0xe5,0x71,0x54,0x07,0x70,0x03,0x12,0x44,0xc2,0xe5,0x2f,0x30,
  93252. +0xe1,0x08,0x90,0x01,0x37,0x74,0x02,0xf0,0x71,0x7e,0x74,0xcb,0x04,0x90,0x01,0xc4,
  93253. +0xf0,0x74,0x57,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,
  93254. +0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,
  93255. +0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0x51,
  93256. +0x30,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x91,
  93257. +0x37,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x91,0x36,0xe0,
  93258. +0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x6f,0x54,0x0f,0xd3,0x94,
  93259. +0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,
  93260. +0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0x90,0x91,0x53,0xe0,0x30,0xe0,0x49,0xe5,0x6d,
  93261. +0x64,0x01,0x70,0x43,0x90,0x91,0x52,0xe0,0x04,0xf0,0xe5,0x70,0x64,0x03,0x60,0x05,
  93262. +0xe5,0x70,0xb4,0x06,0x0d,0x90,0x91,0x52,0xe0,0xff,0x74,0x01,0xd3,0x9f,0x50,0x14,
  93263. +0x80,0x07,0x90,0x91,0x52,0xe0,0xb4,0x0a,0x0b,0x90,0x91,0x55,0xe0,0x04,0xf0,0xe4,
  93264. +0x90,0x91,0x52,0xf0,0x90,0x91,0x55,0xe0,0xff,0x90,0x91,0x54,0xe0,0xb5,0x07,0x07,
  93265. +0x71,0x4e,0xe4,0x90,0x91,0x55,0xf0,0x22,0xe5,0x6d,0x64,0x01,0x70,0x63,0xe5,0x70,
  93266. +0x60,0x5f,0xe5,0x70,0x64,0x02,0x60,0x06,0xe5,0x70,0x64,0x05,0x70,0x27,0x90,0x06,
  93267. +0xab,0xe0,0x90,0x91,0x27,0xf0,0x90,0x06,0xaa,0xe0,0x90,0x91,0x39,0xf0,0x90,0x91,
  93268. +0x27,0xe0,0x70,0x07,0x90,0x91,0x39,0xe0,0xff,0x80,0x05,0x90,0x91,0x27,0xe0,0xff,
  93269. +0x90,0x91,0x27,0xef,0xf0,0x90,0x91,0x29,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,
  93270. +0x91,0x28,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x71,0xfd,
  93271. +0x53,0x71,0xef,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0xc7,0x71,
  93272. +0x42,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xd0,0xd0,0x92,0xaf,0x22,0xe5,0x6e,
  93273. +0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0x02,0x47,0xc9,0x90,0x91,0x08,0xe0,
  93274. +0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,
  93275. +0x90,0x91,0x71,0x12,0x43,0x41,0x0b,0x7a,0x91,0x79,0x08,0x02,0x46,0xb7,0x90,0x91,
  93276. +0x80,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,
  93277. +0x21,0x90,0x91,0x3b,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0d,0xe5,0x6e,0x54,
  93278. +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,0xe4,0xff,0x12,
  93279. +0x48,0xb3,0x22,0x51,0x30,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,
  93280. +0x80,0x58,0xe5,0x71,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4a,
  93281. +0xe5,0x6f,0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,
  93282. +0x39,0xe5,0x71,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x2c,0xe5,0x71,
  93283. +0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x1f,0x90,0x91,0x29,0xe0,0x60,
  93284. +0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,0x11,0x90,0x91,0x31,0xe0,0x60,0x08,0x90,
  93285. +0x01,0xb9,0x74,0x80,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,
  93286. +0x7f,0x00,0x22,0xe4,0xfb,0x90,0x91,0x78,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe5,
  93287. +0x70,0x70,0x02,0x81,0xb5,0xe5,0x6d,0x64,0x01,0x70,0x7a,0xe5,0x70,0x14,0x60,0x2b,
  93288. +0x24,0xfd,0x60,0x27,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x21,0x90,0x91,0x27,0xe0,
  93289. +0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x14,0x90,0x91,0x27,0xe0,0x70,0x08,0x90,
  93290. +0x91,0x39,0xe0,0x90,0x91,0x27,0xf0,0x7b,0x01,0x80,0x02,0x7b,0x01,0xeb,0x60,0x45,
  93291. +0x43,0x71,0x10,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,
  93292. +0xff,0x90,0x91,0x34,0xe0,0x2f,0x12,0x44,0x4e,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,
  93293. +0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,0x90,
  93294. +0x91,0x2e,0xe0,0x60,0x10,0x90,0x91,0x2c,0xe0,0x90,0x07,0x78,0x60,0x04,0x74,0x0d,
  93295. +0xf0,0x22,0x74,0x09,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,
  93296. +0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,
  93297. +0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xb6,0xf0,0x74,0x5c,0xa3,0xf0,0x53,0x91,0xef,
  93298. +0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0x90,0x00,0x52,0xe0,
  93299. +0xff,0x90,0x00,0x56,0xe0,0x5f,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,
  93300. +0x74,0x10,0xf0,0xe5,0x3d,0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,
  93301. +0x30,0xe6,0x1b,0x90,0x00,0x55,0x74,0x40,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,
  93302. +0xbf,0x03,0x0b,0x90,0x90,0xf3,0xe0,0x60,0x05,0x7f,0x01,0x12,0x4c,0x03,0xe5,0x3d,
  93303. +0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,
  93304. +0xbf,0x03,0x05,0x7f,0x02,0x12,0x4c,0x03,0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,
  93305. +0x74,0x01,0xf0,0xe5,0x3e,0x30,0xe1,0x06,0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,
  93306. +0x30,0xe2,0x06,0x90,0x00,0x56,0x74,0x04,0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,
  93307. +0x56,0x74,0x08,0xf0,0x90,0x01,0xc4,0x74,0xb6,0xf0,0x74,0x5c,0xa3,0xf0,0xd0,0x07,
  93308. +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,
  93309. +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,
  93310. +0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,
  93311. +0xc0,0x05,0xc0,0x06,0xc0,0x07,0x75,0x0d,0x00,0x90,0x01,0xc4,0x74,0x99,0xf0,0x74,
  93312. +0x5d,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,
  93313. +0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,
  93314. +0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x08,
  93315. +0x90,0x01,0x3c,0x74,0x02,0xf0,0xf1,0x57,0xe5,0x34,0x30,0xe2,0x3a,0x90,0x01,0x3c,
  93316. +0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,
  93317. +0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,
  93318. +0x59,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90,
  93319. +0x91,0x37,0xe4,0xf0,0x12,0x44,0xc2,0xe5,0x34,0x30,0xe3,0x3a,0x90,0x01,0x3c,0x74,
  93320. +0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,0x91,
  93321. +0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12,0x44,0x59,
  93322. +0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x91,
  93323. +0x36,0xe4,0xf0,0x12,0x44,0xc2,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,
  93324. +0xf0,0x12,0x53,0x86,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,
  93325. +0x6e,0xb9,0xe5,0x35,0x30,0xe0,0x5a,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,
  93326. +0xe0,0x44,0x7f,0xf0,0x90,0x00,0x83,0xe0,0x54,0x0f,0xf5,0x0d,0xb4,0x01,0x02,0x80,
  93327. +0x1c,0xe5,0x0d,0xb4,0x02,0x05,0x90,0x00,0x83,0x80,0x12,0xe5,0x0d,0xb4,0x04,0x05,
  93328. +0x90,0x00,0x83,0x80,0x08,0xe5,0x0d,0xb4,0x0c,0x08,0x90,0x00,0x83,0xe0,0xf5,0x6f,
  93329. +0x80,0x06,0x90,0x01,0xbe,0xe0,0x04,0xf0,0x90,0x01,0xbb,0xe5,0x6f,0xf0,0xe5,0x6f,
  93330. +0x30,0xe0,0x03,0xa3,0x80,0x03,0x90,0x01,0xbd,0xe0,0x04,0xf0,0xf1,0x38,0x12,0x44,
  93331. +0xc2,0xe5,0x35,0x30,0xe2,0x06,0x90,0x01,0x3d,0x74,0x04,0xf0,0xe5,0x36,0x30,0xe0,
  93332. +0x06,0x90,0x01,0x3e,0x74,0x01,0xf0,0xe5,0x36,0x30,0xe1,0x06,0x90,0x01,0x3e,0x74,
  93333. +0x02,0xf0,0x74,0x99,0x04,0x90,0x01,0xc4,0xf0,0x74,0x5d,0xa3,0xf0,0xd0,0x07,0xd0,
  93334. +0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,
  93335. +0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xe5,0x6f,0x30,0xe6,0x19,0xe5,0x6f,0x54,
  93336. +0x0f,0xff,0x90,0x91,0x24,0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,
  93337. +0x91,0x24,0xf0,0x53,0x6f,0xbf,0x22,0xe4,0x90,0x91,0x0d,0xf0,0xe5,0x70,0x70,0x02,
  93338. +0xe1,0xe1,0x90,0x91,0x3c,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x71,0xfd,0xe5,0x71,0x54,
  93339. +0x07,0x70,0x6e,0x80,0x69,0x90,0x91,0x28,0xe0,0x04,0xf0,0x53,0x71,0xef,0x90,0x91,
  93340. +0x3a,0xe0,0x04,0xf0,0x90,0x91,0x0d,0xe0,0xf9,0xff,0x7e,0x00,0x24,0x01,0xfd,0xee,
  93341. +0x33,0xfc,0x90,0x91,0x3a,0xe0,0xb5,0x05,0x06,0xe4,0xb5,0x04,0x02,0x80,0x12,0xef,
  93342. +0x24,0x02,0xff,0xe4,0x3e,0xfe,0x90,0x91,0x3a,0xe0,0xb5,0x07,0x0a,0xe4,0xb5,0x06,
  93343. +0x06,0x90,0x05,0x58,0xe0,0x04,0xf0,0xe9,0xff,0x90,0x91,0x2f,0xe0,0x2f,0xff,0xe4,
  93344. +0x33,0xfe,0x90,0x91,0x28,0xe0,0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x40,
  93345. +0x0d,0xe5,0x6d,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,
  93346. +0xc2,0x22,0x8f,0x20,0x8c,0x21,0x8d,0x22,0x22,0x8f,0x23,0x8c,0x24,0x8d,0x25,0x22,
  93347. +0xe4,0x90,0x91,0x11,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0,0x20,0xe1,0x2c,0xc3,0x90,
  93348. +0x91,0x12,0xe0,0x94,0x20,0x90,0x91,0x11,0xe0,0x94,0x03,0x40,0x0a,0x90,0x01,0xc6,
  93349. +0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x91,0x11,0xe4,0x75,0xf0,0x01,0x12,0x42,
  93350. +0x81,0x7f,0x01,0x7e,0x00,0x12,0x32,0x15,0x80,0xcd,0x7f,0x01,0x22,0x90,0x01,0xcc,
  93351. +0xe0,0x54,0x0f,0x90,0x91,0x11,0xf0,0x90,0x91,0x11,0xe0,0xfd,0x70,0x02,0x21,0x6f,
  93352. +0x90,0x91,0x9c,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,
  93353. +0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x21,0x68,0x90,0x91,0x9c,0xe0,
  93354. +0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x15,0xe0,0x90,0x91,0x12,0xf0,0x75,0x63,
  93355. +0x01,0x75,0x64,0x91,0x75,0x65,0x12,0x75,0x66,0x01,0x7b,0x01,0x7a,0x91,0x79,0x13,
  93356. +0x12,0x46,0x6d,0x90,0x91,0x13,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,0x91,
  93357. +0x9c,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x15,0xe0,0x90,
  93358. +0x91,0x14,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,0x15,
  93359. +0xe0,0x90,0x91,0x15,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,
  93360. +0x43,0x15,0xe0,0x90,0x91,0x16,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,
  93361. +0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x17,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,
  93362. +0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,0x91,0x18,0xf0,0x80,0x33,0xe0,0x75,0xf0,
  93363. +0x04,0x90,0x01,0xd1,0x12,0x43,0x15,0xe0,0x90,0x91,0x14,0xf0,0x90,0x91,0x9c,0xe0,
  93364. +0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x15,0xf0,0x90,0x91,
  93365. +0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,0x91,0x16,0xf0,
  93366. +0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x91,0x79,0x14,0x12,0x51,0xf8,0x90,0x91,0x11,
  93367. +0xe0,0xff,0x90,0x91,0x9c,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,
  93368. +0xd8,0xfc,0xf4,0x5f,0x90,0x91,0x11,0xf0,0x90,0x91,0x9c,0xe0,0xff,0x74,0x01,0xa8,
  93369. +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x91,0x9c,0xe0,
  93370. +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x01,0x37,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,
  93371. +0xad,0x07,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x01,0xf0,
  93372. +0x90,0x04,0x80,0xe0,0x54,0x0f,0xfc,0x74,0x14,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,
  93373. +0x83,0xe0,0x54,0xc0,0x4c,0xfd,0x74,0x14,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  93374. +0xed,0xf0,0x22,0xef,0x60,0x0f,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,
  93375. +0xe0,0x44,0x10,0xf0,0x22,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,
  93376. +0x54,0xef,0xf0,0x22,0xe4,0xf5,0x6d,0xf5,0x71,0xf5,0x70,0x75,0x6f,0x0c,0x75,0x6e,
  93377. +0x0c,0x90,0x91,0x3b,0xf0,0x90,0x91,0x37,0xf0,0x90,0x91,0x36,0xf0,0x90,0x91,0x39,
  93378. +0x04,0xf0,0x90,0x91,0x27,0xf0,0xe4,0x90,0x91,0x3c,0xf0,0x90,0x91,0x29,0xf0,0x90,
  93379. +0x91,0x34,0x74,0x07,0xf0,0xe4,0x90,0x91,0x28,0xf0,0x90,0x91,0x32,0xf0,0xa3,0x74,
  93380. +0x03,0xf0,0x90,0x91,0x2f,0x74,0x0a,0xf0,0xa3,0x74,0x05,0xf0,0x90,0x91,0x2d,0x74,
  93381. +0x14,0xf0,0x90,0x91,0x35,0x74,0x05,0xf0,0xe4,0x90,0x91,0x2b,0xf0,0x90,0x91,0x25,
  93382. +0xf0,0x90,0x91,0x50,0xf0,0x90,0x91,0x31,0xf0,0x90,0x91,0x3a,0xf0,0x90,0x91,0x26,
  93383. +0xf0,0x90,0x91,0x38,0xf0,0x90,0x91,0x2e,0xf0,0x90,0x91,0x2c,0xf0,0x22,0xe4,0x90,
  93384. +0x91,0x3c,0xf0,0x90,0x91,0x28,0xf0,0xf5,0x71,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,
  93385. +0xf0,0xef,0x60,0x0a,0xe5,0x6d,0xb4,0x01,0x05,0xe4,0xff,0x12,0x47,0xc9,0x53,0x6e,
  93386. +0xf0,0x43,0x6e,0x0c,0x22,0x90,0x91,0x9d,0xef,0xf0,0x51,0x7e,0x90,0x91,0x9d,0xe0,
  93387. +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x90,0x00,
  93388. +0x11,0xe0,0x44,0x09,0xf0,0x12,0x4a,0xe6,0x90,0x90,0xd8,0x12,0x43,0x09,0x90,0x80,
  93389. +0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,0x90,0xdc,0x12,0x43,
  93390. +0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x90,
  93391. +0xe0,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x2b,
  93392. +0x08,0x90,0x90,0xe4,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x70,0x7e,
  93393. +0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,
  93394. +0xff,0x12,0x30,0x2c,0x90,0x91,0x51,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,
  93395. +0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x22,0x8f,0x77,0xe4,
  93396. +0x90,0x91,0x96,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,
  93397. +0x01,0xef,0x65,0x77,0x60,0x3e,0xc3,0x90,0x91,0x97,0xe0,0x94,0x88,0x90,0x91,0x96,
  93398. +0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90,0x91,0x96,
  93399. +0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e,0x00,0x12,0x32,0x15,0xd3,0x90,
  93400. +0x91,0x97,0xe0,0x94,0x32,0x90,0x91,0x96,0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,
  93401. +0xe0,0x30,0xe0,0xb2,0x22,0x22,0x53,0x6e,0xf0,0x43,0x6e,0x01,0x71,0x55,0x71,0x67,
  93402. +0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0x22,0x8f,0x78,0x12,0x47,0xe6,0xef,0x64,0x01,
  93403. +0x70,0x2e,0x90,0x91,0x44,0x12,0x48,0x1e,0xe5,0x78,0x60,0x10,0x74,0x21,0x2f,0xf5,
  93404. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,
  93405. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,
  93406. +0x22,0xe4,0xfb,0x90,0x91,0x7c,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe5,0x70,0x60,
  93407. +0x5f,0xe5,0x6d,0x64,0x01,0x70,0x59,0x0b,0x90,0x91,0x27,0xf0,0x04,0x60,0x51,0x43,
  93408. +0x71,0x10,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,0xff,
  93409. +0x90,0x91,0x34,0xe0,0x2f,0x90,0x91,0x67,0xf0,0xe4,0x1b,0x12,0x44,0x54,0x90,0x01,
  93410. +0x57,0x74,0x05,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,
  93411. +0x04,0x12,0x47,0x27,0x90,0x91,0x2e,0xe0,0x60,0x11,0x90,0x91,0x2c,0xe0,0x90,0x07,
  93412. +0x78,0x60,0x05,0x74,0x0d,0xf0,0x80,0x03,0x74,0x09,0xf0,0x90,0x05,0x22,0xe4,0xf0,
  93413. +0x22,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0xd3,0x10,0xaf,0x01,
  93414. +0xc3,0xc0,0xd0,0x90,0x91,0x84,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,
  93415. +0x90,0x91,0x84,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,
  93416. +0x91,0x87,0xe0,0x94,0xe8,0x90,0x91,0x86,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,
  93417. +0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x91,0x86,0xe4,0x75,0xf0,0x01,0x12,
  93418. +0x42,0x81,0x7f,0x0a,0x7e,0x00,0x12,0x32,0x15,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,
  93419. +0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,
  93420. +0x91,0x1f,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,
  93421. +0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x3b,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,
  93422. +0x91,0x25,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x01,0x90,0x91,0x26,0xf0,
  93423. +0xef,0xc3,0x13,0x54,0x01,0x90,0x91,0x2e,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,
  93424. +0x13,0x13,0x54,0x01,0x90,0x91,0x2c,0xf0,0x90,0x91,0x2e,0xe0,0x90,0x91,0x1f,0x70,
  93425. +0x26,0x12,0x25,0x14,0x00,0x00,0x02,0x10,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,
  93426. +0x96,0x12,0x25,0x08,0x7f,0x60,0x7e,0x08,0x12,0x2b,0x08,0x90,0x91,0x1f,0x12,0x25,
  93427. +0x14,0x00,0x00,0x03,0x10,0x80,0x24,0x12,0x25,0x14,0x00,0x00,0x01,0x10,0x90,0x91,
  93428. +0x1f,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x60,0x7e,0x08,0x12,0x2b,
  93429. +0x08,0x90,0x91,0x1f,0x12,0x25,0x14,0x00,0x00,0x03,0x00,0x90,0x91,0x1f,0x12,0x43,
  93430. +0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x70,0x7e,0x08,0x12,0x2b,0x08,0x90,0x91,
  93431. +0x26,0xe0,0x70,0x3d,0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x22,
  93432. +0x65,0x90,0x91,0x1f,0x12,0x25,0x08,0x90,0x91,0x1f,0x12,0x43,0x09,0xec,0x44,0x02,
  93433. +0xfc,0x90,0x91,0x1f,0x12,0x25,0x08,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,0x96,
  93434. +0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x08,0x90,0x02,0x86,0xe0,0x54,0xfb,
  93435. +0xf0,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x49,0x7f,0x90,0x01,0xe5,0xe5,0x70,0xf0,
  93436. +0x90,0x91,0x3b,0xe0,0x90,0x01,0xe6,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x02,
  93437. +0x12,0x42,0x20,0xff,0x30,0xe0,0x25,0x12,0x24,0x62,0x90,0x91,0x2f,0xf0,0x90,0x00,
  93438. +0x01,0x12,0x42,0x20,0x90,0x91,0x30,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x91,0x2d,
  93439. +0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x91,0x35,0xf0,0x22,0x90,0x91,0x2f,0x74,
  93440. +0x0a,0xf0,0x90,0x91,0x30,0x74,0x05,0xf0,0x90,0x91,0x2d,0x74,0x14,0xf0,0x90,0x91,
  93441. +0x35,0x74,0x05,0xf0,0x22,0x12,0x24,0x62,0x30,0xe0,0x19,0xc3,0x13,0x54,0x7f,0x90,
  93442. +0x91,0x34,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x91,0x32,0xe4,0xf0,0xa3,
  93443. +0xef,0xf0,0x80,0x0f,0x90,0x91,0x34,0x74,0x07,0xf0,0x90,0x91,0x32,0xe4,0xf0,0xa3,
  93444. +0x74,0x03,0xf0,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0x90,0x02,
  93445. +0x09,0xe0,0xfd,0x12,0x24,0x62,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x91,0x41,0xf0,0x90,
  93446. +0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x42,0xf0,0x90,0x00,0x02,0x12,
  93447. +0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x43,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,
  93448. +0xed,0x2f,0x90,0x91,0x44,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0xae,0x05,0xed,
  93449. +0x2f,0x90,0x91,0x45,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x47,
  93450. +0xe0,0x90,0x91,0x1d,0xf0,0x90,0x91,0x48,0xe0,0xf5,0x19,0xa3,0xe0,0xf5,0x1a,0xe4,
  93451. +0xf5,0x16,0x74,0x4a,0x25,0x16,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0x74,
  93452. +0x1b,0x25,0x16,0xf8,0xa6,0x07,0x05,0x16,0xe5,0x16,0xb4,0x04,0xe5,0x90,0x91,0x1d,
  93453. +0xe0,0x12,0x43,0x4a,0x66,0xb3,0x00,0x67,0xdc,0x01,0x66,0xba,0x02,0x66,0xba,0x03,
  93454. +0x66,0xba,0x04,0x67,0xdc,0x05,0x67,0xac,0x80,0x67,0xc2,0x81,0x67,0xdc,0x82,0x00,
  93455. +0x00,0x67,0xd8,0xaf,0x1e,0x12,0x73,0xea,0xe1,0xdc,0x90,0x91,0x1d,0xe0,0xff,0xb4,
  93456. +0x02,0x08,0x90,0x91,0x1c,0x74,0x01,0xf0,0x80,0x0f,0xef,0x90,0x91,0x1c,0xb4,0x03,
  93457. +0x05,0x74,0x02,0xf0,0x80,0x03,0x74,0x04,0xf0,0xc3,0xe5,0x19,0x94,0x08,0x50,0x49,
  93458. +0xe4,0xf5,0x16,0x90,0x91,0x1c,0xe0,0xff,0xe5,0x16,0xc3,0x9f,0x40,0x02,0xe1,0xdc,
  93459. +0xc3,0xe5,0x19,0x94,0x01,0x50,0x14,0xe5,0x16,0x25,0x1a,0xff,0xc3,0x74,0x03,0x95,
  93460. +0x16,0x24,0x1b,0xf8,0xe6,0xfd,0x12,0x4b,0xee,0x80,0x1a,0xc3,0x74,0x03,0x95,0x16,
  93461. +0x24,0x1b,0xf8,0xe6,0xff,0xe5,0x16,0x7c,0x00,0x25,0x1a,0xfd,0xec,0x35,0x19,0x8d,
  93462. +0x82,0xf5,0x83,0xef,0xf0,0x05,0x16,0x80,0xba,0xc3,0xe5,0x19,0x94,0x10,0x40,0x02,
  93463. +0xe1,0xdc,0x90,0x91,0x1d,0xe0,0x64,0x04,0x60,0x02,0xe1,0xdc,0xaf,0x1c,0xfc,0xfd,
  93464. +0xfe,0x78,0x10,0x12,0x24,0xf5,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xaf,0x1b,
  93465. +0xe4,0xfc,0xfd,0xfe,0x78,0x18,0x12,0x24,0xf5,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,
  93466. +0x00,0x12,0x42,0xfc,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xaf,0x1d,0xe4,0xfc,
  93467. +0xfd,0xfe,0x78,0x08,0x12,0x24,0xf5,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,
  93468. +0x42,0xfc,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0xaf,0x1e,0xe4,0xfc,0xfd,0xfe,
  93469. +0x12,0x42,0xfc,0xa3,0x12,0x25,0x08,0x90,0x91,0x1e,0x12,0x43,0x09,0x90,0x80,0x96,
  93470. +0x12,0x25,0x08,0xaf,0x1a,0xae,0x19,0x12,0x2b,0x08,0x80,0x30,0xe5,0x1d,0x7f,0x00,
  93471. +0xfe,0xef,0x25,0x1e,0xf5,0x18,0xe4,0x3e,0xf5,0x17,0xaf,0x18,0xfe,0x12,0x32,0x15,
  93472. +0x80,0x1a,0xe5,0x1d,0x7f,0x00,0xfe,0xef,0x25,0x1e,0xf5,0x18,0xe4,0x3e,0xf5,0x17,
  93473. +0xaf,0x18,0xfe,0x12,0x31,0x82,0x80,0x04,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,
  93474. +0x92,0xaf,0x22,0x22,0x8e,0x0e,0x8f,0x0f,0x8b,0x10,0x8a,0x11,0x89,0x12,0xe4,0x90,
  93475. +0x91,0x11,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4a,0xe6,0xe5,0x0e,0x54,0x03,0xff,
  93476. +0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4a,0xe6,0x90,0x00,0x33,0xe0,0x54,
  93477. +0x7f,0xf0,0x12,0x4a,0xe6,0x90,0x00,0x33,0xe0,0x20,0xe7,0x0e,0x90,0x91,0x11,0xe0,
  93478. +0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90,0x91,0x11,0xe0,0xc3,0x94,
  93479. +0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x42,0x4d,
  93480. +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0x90,0x91,0x98,0xf0,0xa3,0xf0,0x90,0x05,0xf8,
  93481. +0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,
  93482. +0x01,0x22,0xd3,0x90,0x91,0x99,0xe0,0x94,0xe8,0x90,0x91,0x98,0xe0,0x94,0x03,0x40,
  93483. +0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x32,0x15,0x90,0x91,0x98,0xe4,0x75,
  93484. +0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0xef,0x70,0x02,0x41,0x3d,0x90,0x90,0xe8,0xe0,
  93485. +0x60,0x02,0xc1,0x08,0x90,0x90,0xd4,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,
  93486. +0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x90,0x80,0x12,0x43,0x09,0x90,0x80,0x96,
  93487. +0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x90,0x84,0x12,0x43,0x09,
  93488. +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x90,0x88,
  93489. +0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,
  93490. +0x90,0x90,0x8c,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x70,0x7e,0x0e,
  93491. +0x12,0x2b,0x08,0x90,0x90,0x90,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,
  93492. +0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0x94,0x12,0x43,0x09,0x90,0x80,0x96,0x12,
  93493. +0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0x98,0x12,0x43,0x09,0x90,
  93494. +0x80,0x96,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0x9c,0x12,
  93495. +0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x08,0x90,
  93496. +0x90,0xa0,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x84,0x7e,0x0e,0x12,
  93497. +0x2b,0x08,0x90,0x90,0xa4,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x88,
  93498. +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0xa8,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,
  93499. +0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0xac,0x12,0x43,0x09,0x90,0x80,
  93500. +0x96,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0xb0,0x12,0x43,
  93501. +0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,
  93502. +0xb4,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,
  93503. +0x08,0x90,0x90,0xb8,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xdc,0x7e,
  93504. +0x0e,0x12,0x2b,0x08,0x90,0x90,0xbc,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,
  93505. +0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0xc0,0x12,0x43,0x09,0x90,0x80,0x96,
  93506. +0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x90,0xc4,0x12,0x43,0x09,
  93507. +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x90,0xc8,
  93508. +0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,
  93509. +0x90,0x90,0xcc,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,
  93510. +0x12,0x2b,0x08,0x90,0x90,0xd0,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,
  93511. +0x04,0x7e,0x08,0x12,0x2b,0x08,0x90,0x90,0xe8,0x74,0x01,0xf0,0x22,0x90,0x90,0xe8,
  93512. +0xe0,0x64,0x01,0x60,0x02,0xc1,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x22,0x65,0x90,0x90,
  93513. +0xd4,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x22,0x65,0x90,0x90,0x80,0x12,0x25,
  93514. +0x08,0x7f,0x5c,0x7e,0x08,0x12,0x22,0x65,0x90,0x90,0x84,0x12,0x25,0x08,0x7f,0x6c,
  93515. +0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0x88,0x12,0x25,0x08,0x7f,0x70,0x7e,0x0e,0x12,
  93516. +0x22,0x65,0x90,0x90,0x8c,0x12,0x25,0x08,0x7f,0x74,0x7e,0x0e,0x12,0x22,0x65,0x90,
  93517. +0x90,0x90,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0x94,0x12,
  93518. +0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0x98,0x12,0x25,0x08,0x7f,
  93519. +0x80,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0x9c,0x12,0x25,0x08,0x7f,0x84,0x7e,0x0e,
  93520. +0x12,0x22,0x65,0x90,0x90,0xa0,0x12,0x25,0x08,0x7f,0x88,0x7e,0x0e,0x12,0x22,0x65,
  93521. +0x90,0x90,0xa4,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0xa8,
  93522. +0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0xac,0x12,0x25,0x08,
  93523. +0x7f,0xd4,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0xb0,0x12,0x25,0x08,0x7f,0xd8,0x7e,
  93524. +0x0e,0x12,0x22,0x65,0x90,0x90,0xb4,0x12,0x25,0x08,0x7f,0xdc,0x7e,0x0e,0x12,0x22,
  93525. +0x65,0x90,0x90,0xb8,0x12,0x25,0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,
  93526. +0xbc,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x22,0x65,0x90,0x90,0xc0,0x12,0x25,
  93527. +0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x90,0xc4,0x12,0x25,0x08,0x7f,0x04,
  93528. +0x7e,0x0d,0x12,0x22,0x65,0x90,0x90,0xc8,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,
  93529. +0x22,0x65,0x90,0x90,0xcc,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,
  93530. +0x90,0xd0,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x22,0x65,0x90,0x91,0x88,0x12,
  93531. +0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x44,0xc0,0xfd,0xec,0x90,0x91,0x88,
  93532. +0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,
  93533. +0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x01,0x00,0x00,
  93534. +0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0xdb,0x25,
  93535. +0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,
  93536. +0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,
  93537. +0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,
  93538. +0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,
  93539. +0x14,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,
  93540. +0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,
  93541. +0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,
  93542. +0x96,0x12,0x25,0x14,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x08,0x90,
  93543. +0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x08,
  93544. +0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,
  93545. +0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,
  93546. +0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,
  93547. +0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,
  93548. +0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa4,0x7f,0xdc,
  93549. +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa4,0x7f,
  93550. +0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x24,0xdb,0x25,0xa4,
  93551. +0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x91,
  93552. +0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,0x91,0x88,
  93553. +0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,0x90,0x91,
  93554. +0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,
  93555. +0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,0x91,
  93556. +0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,
  93557. +0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,
  93558. +0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,
  93559. +0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,0x65,
  93560. +0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,
  93561. +0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,
  93562. +0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,
  93563. +0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,0x65,
  93564. +0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x54,0x0f,0xfd,
  93565. +0xec,0x54,0xf0,0xfc,0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,0x88,0x12,0x43,0x09,
  93566. +0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,
  93567. +0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,
  93568. +0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,0x91,0x88,0x12,0x25,0x08,0x90,0x91,
  93569. +0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,0x91,0x88,0x12,0x25,0x08,0x90,
  93570. +0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,0x90,0x91,0x88,0x12,0x25,0x08,
  93571. +0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,
  93572. +0x12,0x2b,0x08,0xe4,0x90,0x90,0xe8,0xf0,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x4b,0xee,
  93573. +0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x90,0xf7,0xf0,0x90,0x90,0xfd,0xf0,0x90,
  93574. +0x91,0x00,0xf0,0x90,0x90,0xfe,0xf0,0x90,0x91,0x01,0xf0,0x90,0x90,0xff,0xf0,0x90,
  93575. +0x91,0x02,0xf0,0x90,0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,
  93576. +0x90,0xee,0xf0,0x90,0x90,0xf3,0xf0,0x90,0x90,0xf5,0xf0,0x90,0x91,0x07,0xf0,0x90,
  93577. +0x90,0xf8,0xf0,0x90,0x90,0xf4,0xf0,0x90,0x90,0xed,0xf0,0x90,0x00,0x51,0xe0,0x44,
  93578. +0xc0,0xfd,0x7f,0x51,0x02,0x4b,0xee,0x90,0x05,0x60,0xe0,0x90,0x91,0x03,0xf0,0x90,
  93579. +0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x05,0xf0,0x90,
  93580. +0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x91,0x04,0xe0,
  93581. +0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,
  93582. +0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x91,0x06,0x80,0x03,0x90,0x91,0x05,0xe0,0x04,
  93583. +0xf0,0x22,0x90,0x91,0x04,0xe0,0x2f,0xf0,0x22,0x90,0x90,0xf5,0xe0,0x64,0x01,0x60,
  93584. +0x02,0xe1,0x6e,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x4b,0xee,0x90,
  93585. +0x91,0x07,0xe0,0x70,0x32,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,
  93586. +0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,
  93587. +0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x90,0xf4,0xe0,0xff,0xd1,0x67,0x90,0x91,0x07,
  93588. +0x74,0x01,0x12,0x4b,0xe4,0x80,0x40,0x90,0x91,0x07,0xe0,0x64,0x01,0x70,0x38,0x90,
  93589. +0x90,0xf8,0xe0,0xff,0xd1,0x67,0xe4,0x90,0x91,0x07,0xf0,0x90,0x00,0x45,0xe0,0x44,
  93590. +0x01,0xfd,0x7f,0x45,0x12,0x4b,0xee,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xef,
  93591. +0x12,0x43,0x09,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,
  93592. +0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,
  93593. +0x03,0xe0,0x90,0x05,0x84,0xf0,0x90,0x91,0x04,0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,
  93594. +0x05,0xe0,0x90,0x05,0x86,0xf0,0x90,0x91,0x06,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,
  93595. +0x90,0xee,0xe0,0xc3,0x94,0x14,0x50,0x06,0xe0,0x04,0xf0,0x02,0x70,0x29,0x90,0x90,
  93596. +0xee,0xe0,0x64,0x14,0x60,0x03,0x02,0x70,0x29,0x90,0x90,0xfd,0xe0,0x70,0x25,0x90,
  93597. +0x91,0x00,0xe0,0x70,0x1f,0x90,0x90,0xfe,0xe0,0x70,0x19,0x90,0x91,0x01,0xe0,0x70,
  93598. +0x13,0x90,0x90,0xff,0xe0,0x70,0x0d,0x90,0x91,0x02,0xe0,0x70,0x07,0x90,0x04,0xfd,
  93599. +0xe0,0x54,0xfe,0xf0,0x90,0x90,0xfd,0xe0,0x90,0x04,0x44,0xf0,0x90,0x90,0xfe,0xe0,
  93600. +0x90,0x04,0x45,0xf0,0x90,0x90,0xff,0xe0,0x90,0x04,0x46,0xf0,0xa3,0xe4,0xf0,0x90,
  93601. +0x91,0x00,0xe0,0x90,0x04,0x48,0xf0,0x90,0x91,0x01,0xe0,0x90,0x04,0x49,0xf0,0x90,
  93602. +0x91,0x02,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x90,0xe9,0xe0,0x90,0x04,
  93603. +0x4c,0xf0,0x90,0x90,0xea,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x90,0xeb,0xe0,0x90,0x04,
  93604. +0x4e,0xf0,0x90,0x90,0xec,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x90,0xee,0xf0,0x90,
  93605. +0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x90,0xfd,0xf0,0xa3,
  93606. +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0,0x90,0x91,0x8c,
  93607. +0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x8d,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x8e,
  93608. +0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x8f,0xf0,0x90,0x91,0x06,0xe0,0xff,0x90,0x91,
  93609. +0x8f,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x91,0x06,0xe0,0xc3,0x9e,0xd3,0x94,0x01,
  93610. +0x40,0x11,0x90,0x90,0xf4,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x90,0xf8,0xe0,0xff,
  93611. +0x12,0x6e,0x67,0x22,0x90,0x91,0x07,0xe0,0x64,0x01,0x60,0x08,0x90,0x90,0xf5,0xe0,
  93612. +0x60,0x02,0x21,0x4b,0x90,0x90,0xe9,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,
  93613. +0x80,0x3b,0x90,0x90,0xea,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,
  93614. +0x28,0x90,0x90,0xeb,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0,0xe4,0x90,0x90,
  93615. +0xea,0xf0,0x80,0x15,0x90,0x90,0xec,0xe0,0xc3,0x94,0xff,0x50,0x10,0xe0,0x04,0xf0,
  93616. +0xe4,0x90,0x90,0xeb,0xf0,0x90,0x90,0xea,0xf0,0x90,0x90,0xe9,0xf0,0x90,0x00,0x44,
  93617. +0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x90,0xfd,0xe0,0xc3,0x94,0xff,
  93618. +0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x90,0xfe,0xe0,0xc3,0x94,0xff,0x50,0x06,
  93619. +0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x90,0xff,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,
  93620. +0x04,0xf0,0xe4,0x90,0x90,0xfe,0xf0,0x90,0x90,0xfd,0xf0,0x90,0x00,0x44,0xe0,0x30,
  93621. +0xe3,0x32,0x90,0x91,0x00,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,
  93622. +0x90,0x91,0x01,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,
  93623. +0x91,0x02,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x91,0x01,0xf0,
  93624. +0x90,0x91,0x00,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x90,0x06,0x90,0xe0,
  93625. +0x44,0x01,0xf0,0x90,0x91,0x61,0xe0,0x30,0xe0,0x3c,0x90,0x91,0x5f,0xe0,0xff,0x90,
  93626. +0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x54,0x01,0xfd,0x12,0x4a,0xf6,0x90,0x91,0x60,0xe0,
  93627. +0x75,0xf0,0x20,0xa4,0xff,0xae,0xf0,0x12,0x32,0x15,0x90,0x91,0x5e,0xe0,0xc4,0x13,
  93628. +0x54,0x07,0x30,0xe0,0x07,0xa3,0xe0,0xff,0xe4,0xfd,0x80,0x07,0x90,0x91,0x5f,0xe0,
  93629. +0xff,0x7d,0x01,0x12,0x4a,0xf6,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90,
  93630. +0x91,0x19,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0xe4,0xa3,0xf0,0x90,0x01,0x1f,0xe0,
  93631. +0xfe,0x90,0x01,0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x91,0x11,0xf0,
  93632. +0xa3,0xef,0xf0,0x90,0x02,0x87,0xe0,0x90,0x91,0x18,0xf0,0x90,0x91,0x56,0xe0,0x20,
  93633. +0xe0,0x02,0x61,0xc4,0xe4,0x90,0x91,0x17,0xf0,0x90,0x91,0x18,0xe0,0xff,0x90,0x91,
  93634. +0x17,0xe0,0xc3,0x9f,0x40,0x02,0x61,0xc4,0x90,0x91,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,
  93635. +0xec,0xff,0x90,0xfd,0x11,0xf0,0x90,0x91,0x1c,0xef,0xf0,0x74,0x02,0x2d,0xf5,0x82,
  93636. +0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc,0x33,0x33,0x33,0x54,0xf8,0xff,0xed,
  93637. +0x24,0x18,0x2f,0x90,0x91,0x15,0xf0,0xe0,0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  93638. +0x83,0xe0,0x54,0xfc,0x90,0x91,0x16,0xf0,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,
  93639. +0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,
  93640. +0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab,0x07,0xfa,0x90,0x91,0x13,0xf0,0xa3,
  93641. +0xeb,0xf0,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe,
  93642. +0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x91,0x5a,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03,
  93643. +0xac,0x02,0x12,0x45,0x09,0xaa,0x06,0xab,0x07,0x90,0x91,0x15,0xe0,0x24,0x00,0xf5,
  93644. +0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x30,0xe7,0x08,0x90,0x91,0x19,0x74,0x02,0xf0,
  93645. +0x80,0x05,0xe4,0x90,0x91,0x19,0xf0,0xaf,0x03,0x90,0x91,0x11,0xea,0x8f,0xf0,0x12,
  93646. +0x42,0x81,0x90,0x91,0x5c,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x91,0x11,0xe0,0xfc,0xa3,
  93647. +0xe0,0xfd,0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x91,0x5d,0xe0,0x24,0x01,0xff,0x90,
  93648. +0x91,0x5c,0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x91,0x11,0xf0,
  93649. +0xa3,0xef,0xf0,0x90,0x91,0x16,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x27,
  93650. +0x90,0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x20,0xe0,0x02,0x61,0x9c,
  93651. +0xef,0x90,0x00,0x81,0xb4,0xa0,0x05,0xe0,0x44,0x04,0x80,0x03,0xe0,0x44,0x08,0xfd,
  93652. +0x7f,0x81,0x12,0x4b,0xee,0x61,0x95,0x90,0x91,0x5e,0xe0,0xc4,0x13,0x13,0x54,0x03,
  93653. +0x20,0xe0,0x02,0x61,0x9c,0x90,0x91,0x15,0xe0,0xff,0x24,0x00,0xf5,0x82,0xe4,0x34,
  93654. +0xfb,0xf5,0x83,0xe0,0x54,0x0c,0x64,0x08,0x70,0x72,0x90,0x91,0x19,0xe0,0xfe,0xef,
  93655. +0x2e,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x1e,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,
  93656. +0x64,0x88,0x70,0x58,0x74,0x1f,0x2f,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x64,
  93657. +0x8e,0x70,0x49,0x90,0x91,0x19,0xe0,0xff,0x90,0x91,0x15,0xe0,0x2f,0xff,0x90,0x91,
  93658. +0x1a,0xe0,0x2f,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x19,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  93659. +0x83,0xe0,0x64,0x03,0x70,0x26,0x74,0x1e,0x2f,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,
  93660. +0xe0,0x90,0x00,0x81,0x30,0xe3,0x05,0xe0,0x44,0x01,0x80,0x03,0xe0,0x44,0x02,0xfd,
  93661. +0x7f,0x81,0x12,0x4b,0xee,0x90,0x91,0x56,0xe0,0x44,0x80,0xf0,0x90,0x91,0x56,0xe0,
  93662. +0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x31,0x4c,0x71,0xc9,0xbf,0x01,
  93663. +0x13,0x90,0x91,0x11,0xe0,0xfe,0xa3,0xe0,0xff,0x12,0x44,0xb5,0x90,0x91,0x17,0xe0,
  93664. +0x04,0xf0,0x21,0xd9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x56,0xe0,0xc4,0x13,0x13,
  93665. +0x13,0x54,0x01,0x30,0xe0,0x11,0xe0,0x44,0x80,0xf0,0x90,0x91,0x5e,0xe0,0xc4,0x54,
  93666. +0x0f,0x20,0xe0,0x03,0x7f,0x00,0x22,0x7f,0x01,0x22,0x8f,0x1f,0xe4,0x90,0x91,0x22,
  93667. +0xf0,0xe5,0x1f,0x14,0xfe,0x90,0x91,0x22,0xe0,0xff,0xc3,0x9e,0x50,0x0e,0xef,0x04,
  93668. +0xfd,0x12,0x2d,0x4d,0x90,0x91,0x22,0xe0,0x04,0xf0,0x80,0xe5,0xe5,0x1f,0x14,0xff,
  93669. +0x7d,0xff,0x12,0x2d,0x4d,0x90,0x91,0x22,0xe5,0x1f,0xf0,0x90,0x91,0x22,0xe0,0xc3,
  93670. +0x94,0xff,0x50,0x0f,0xe0,0xff,0x04,0xfd,0x12,0x2d,0x4d,0x90,0x91,0x22,0xe0,0x04,
  93671. +0xf0,0x80,0xe8,0xad,0x1f,0x7f,0xff,0x02,0x2d,0x4d,0xc3,0xee,0x94,0x01,0x40,0x0a,
  93672. +0x0d,0xed,0x13,0x90,0xfd,0x10,0xf0,0xe4,0x2f,0xff,0x22,0xc3,0xee,0x94,0x01,0x40,
  93673. +0x1e,0x90,0xfd,0x11,0xe0,0xb5,0x05,0x14,0x90,0x01,0x17,0xe0,0xb5,0x05,0x07,0x90,
  93674. +0xfd,0x11,0xe4,0xf0,0x80,0x06,0xed,0x04,0x90,0xfd,0x11,0xf0,0xe4,0x2f,0xff,0x22,
  93675. +0x14,0x25,};
  93676. +
  93677. +
  93678. +
  93679. +u8 Rtl8192CUFwUMCBCutWWImgArray[UMCBCutWWImgArrayLength] = {
  93680. +0xc2,0x88,0x02,0x00,0x51,0x00,0x00,0x00,0x03,0x23,0x16,0x45,0x66,0x34,0x01,0x00,
  93681. +0x58,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93682. +0x02,0x43,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93683. +0x00,0x00,0x00,0x02,0x4a,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93684. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93685. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93686. +0x00,0x00,0x00,0x02,0x57,0xe1,0x00,0x00,0x00,0x00,0x00,0x02,0x58,0xc4,0x00,0x00,
  93687. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93688. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93689. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93690. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93691. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93692. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93693. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93694. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93695. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93696. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93697. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93698. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93699. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93700. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93701. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93702. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93703. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93704. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93705. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93706. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93707. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93708. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93709. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93710. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93711. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93712. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93713. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93714. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93715. +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93716. +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50,
  93717. +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22,
  93718. +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06,
  93719. +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,
  93720. +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,
  93721. +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,
  93722. +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,
  93723. +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,
  93724. +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,
  93725. +0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,
  93726. +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xf8,
  93727. +0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,
  93728. +0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,
  93729. +0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,
  93730. +0x4a,0xfe,0xed,0x49,0xfd,0xec,0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,
  93731. +0xfe,0xa3,0xe0,0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,
  93732. +0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,
  93733. +0xf9,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,
  93734. +0x22,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,
  93735. +0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,
  93736. +0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,
  93737. +0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,
  93738. +0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,
  93739. +0x06,0x74,0x03,0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0x02,0x43,0xdb,
  93740. +0x02,0x50,0x34,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,
  93741. +0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,
  93742. +0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,
  93743. +0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x20,0xe4,0x7e,
  93744. +0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,
  93745. +0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,
  93746. +0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,
  93747. +0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,
  93748. +0x41,0x91,0x40,0x00,0x41,0x91,0x9c,0x00,0x41,0x91,0x23,0x80,0x41,0x91,0x24,0x80,
  93749. +0x41,0x91,0x9e,0x00,0x41,0x91,0x52,0x00,0x41,0x91,0x93,0x00,0x41,0x91,0x91,0x00,
  93750. +0x41,0x91,0x90,0x00,0x41,0x91,0x92,0x00,0x00,0xf0,0x90,0x91,0x30,0xe0,0x90,0x91,
  93751. +0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  93752. +0x90,0x91,0x65,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,
  93753. +0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,
  93754. +0x08,0xf0,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,
  93755. +0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x59,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,
  93756. +0x92,0x74,0x02,0xf0,0x90,0x91,0x36,0x14,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x0c,
  93757. +0x50,0x02,0xf1,0x23,0x22,0x90,0x02,0x84,0xef,0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,
  93758. +0xf0,0x22,0x7d,0x01,0xaf,0x6f,0xe1,0x27,0xf1,0xe6,0xbf,0x01,0x10,0x90,0x91,0x42,
  93759. +0xe0,0xff,0xe4,0xfd,0x12,0x48,0x22,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x8f,0x82,
  93760. +0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x72,0x7f,0x60,0x7e,0x01,0x80,
  93761. +0xed,0x7f,0x00,0x22,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0x22,0x22,
  93762. +0x22,0x22,0x22,0x02,0x5e,0x55,0x02,0x5e,0x5c,0xef,0x8e,0xf0,0x71,0x70,0x45,0x26,
  93763. +0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5,
  93764. +0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  93765. +0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce,
  93766. +0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54,
  93767. +0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c,
  93768. +0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce,
  93769. +0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04,
  93770. +0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01,
  93771. +0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3,
  93772. +0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,
  93773. +0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25,
  93774. +0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0x90,0x91,0x09,0x12,0x2a,0x8b,0x00,0x00,0x00,
  93775. +0x00,0x90,0x06,0xa9,0xe0,0x90,0x91,0x08,0xf0,0xe0,0x54,0xc0,0x70,0x0a,0x53,0x71,
  93776. +0xfe,0x53,0x71,0xfd,0x91,0xc2,0x80,0x47,0x90,0x91,0x26,0xe0,0x60,0x41,0x90,0x91,
  93777. +0x38,0xe0,0x70,0x3b,0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x27,
  93778. +0xde,0x90,0x91,0x09,0x12,0x2a,0x7f,0x90,0x91,0x09,0x71,0x09,0xec,0x44,0x02,0xfc,
  93779. +0x90,0x91,0x09,0x12,0x2a,0x7f,0x90,0x91,0x09,0x71,0x09,0x90,0x80,0x85,0x12,0x2a,
  93780. +0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x90,
  93781. +0x91,0x08,0xe0,0x30,0xe6,0x13,0x43,0x71,0x01,0x90,0x91,0x3b,0xe0,0x64,0x02,0x60,
  93782. +0x04,0x91,0xc8,0x80,0x07,0x91,0x77,0x80,0x03,0x53,0x71,0xfe,0x90,0x91,0x08,0xe0,
  93783. +0x30,0xe7,0x16,0x43,0x71,0x02,0xe4,0x90,0x91,0x66,0x91,0x49,0x90,0x01,0x57,0x74,
  93784. +0x05,0xf0,0x90,0x91,0x3c,0x74,0x01,0xf0,0x22,0x53,0x71,0xfd,0x22,0xd3,0x10,0xaf,
  93785. +0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x91,0x68,0x71,0x41,0xab,
  93786. +0x63,0xaa,0x64,0xa9,0x65,0x90,0x91,0x6b,0x71,0x41,0xaf,0x66,0x15,0x66,0xef,0x60,
  93787. +0x1b,0x90,0x91,0x6b,0xe4,0x75,0xf0,0x01,0x71,0x2a,0x12,0x29,0xd9,0xff,0x90,0x91,
  93788. +0x68,0xe4,0x75,0xf0,0x01,0x71,0x2a,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,
  93789. +0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,
  93790. +0x6e,0x71,0x41,0x90,0x91,0x9e,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x51,0x5f,
  93791. +0x7f,0xaf,0x7e,0x01,0x12,0x64,0x88,0xef,0x60,0x44,0x90,0x91,0x6e,0x71,0x21,0x8b,
  93792. +0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0xd1,0x6d,
  93793. +0x90,0x91,0x71,0x71,0x21,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x91,0x6e,0x71,0x21,
  93794. +0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0xd1,
  93795. +0x6d,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,
  93796. +0x92,0xaf,0x22,0x7d,0x01,0x7f,0x0c,0x90,0x91,0x95,0xed,0xf0,0x90,0x91,0x94,0xef,
  93797. +0xf0,0x54,0x0f,0xff,0xe5,0x6e,0x54,0x0f,0x6f,0x60,0x76,0x90,0x91,0x94,0xe0,0x30,
  93798. +0xe2,0x30,0xe5,0x6e,0x20,0xe2,0x05,0x7f,0x01,0x12,0x61,0x86,0xe5,0x6e,0x30,0xe3,
  93799. +0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,0x08,0x12,0x60,0xb1,0xef,0x60,0x53,0x80,0x52,
  93800. +0xe5,0x6e,0x20,0xe3,0x4c,0x90,0x91,0x94,0xe0,0x30,0xe3,0x45,0xa3,0xe0,0xff,0x02,
  93801. +0x61,0x6b,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x0c,0x0f,0x90,0x91,0x94,0xe0,0x20,0xe3,
  93802. +0x08,0x12,0x60,0xb1,0xef,0x60,0x2a,0xf1,0xb2,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x04,
  93803. +0x10,0x90,0x91,0x94,0xe0,0x20,0xe2,0x09,0x12,0x60,0xfa,0xef,0x60,0x13,0x12,0x48,
  93804. +0xce,0xe5,0x6e,0x54,0x0f,0xff,0xbf,0x02,0x08,0x91,0xf1,0xef,0x60,0x03,0x12,0x62,
  93805. +0x6c,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x6d,0xb4,0x01,0x04,0x7f,0x01,
  93806. +0xf1,0xc9,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x8f,0x67,0xf1,0xe6,0xbf,0x01,0x15,
  93807. +0x90,0x91,0x43,0x12,0x48,0x1e,0xad,0x07,0xac,0x06,0xaf,0x67,0x12,0x60,0x16,0x90,
  93808. +0x04,0x1f,0x74,0x20,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x01,0xc4,
  93809. +0x74,0xe6,0xf0,0x74,0x47,0xa3,0xf0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,
  93810. +0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,
  93811. +0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,
  93812. +0x7d,0x01,0x90,0x91,0x74,0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,
  93813. +0x70,0x60,0x04,0xe4,0xff,0x11,0xb3,0x90,0x91,0x74,0xe0,0x30,0xe0,0x09,0x90,0x91,
  93814. +0x76,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90,0x91,0x74,0xe0,0xff,0xc3,0x13,0x90,0xfd,
  93815. +0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90,0x91,0x75,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,
  93816. +0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,
  93817. +0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x91,0x76,0xa3,
  93818. +0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,
  93819. +0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,
  93820. +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x91,0x76,0xe0,0xfe,0xa3,
  93821. +0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x91,0x51,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,
  93822. +0x09,0x90,0x91,0x51,0xe0,0xb4,0x01,0x05,0x7f,0x01,0x12,0x69,0x87,0x22,0x90,0x01,
  93823. +0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x68,0x7c,0xef,0x70,0x06,
  93824. +0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0xe5,0x70,0x60,
  93825. +0x04,0x7f,0x01,0x11,0xb3,0x12,0x68,0xbd,0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0xef,
  93826. +0x64,0x01,0x70,0x42,0x7d,0x78,0x7f,0x02,0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,
  93827. +0x36,0x75,0x90,0x01,0x36,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x36,0xe6,0x7d,0x10,
  93828. +0x7f,0x03,0x12,0x36,0x92,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,
  93829. +0x12,0x47,0x23,0xe4,0xff,0x11,0xb3,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,
  93830. +0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7b,0xf0,0xa3,0x74,0x02,0xf0,
  93831. +0x7d,0x7b,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0x7d,0x10,0x7f,
  93832. +0x03,0x12,0x36,0x92,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,
  93833. +0x07,0xf0,0x12,0x44,0xf4,0xe5,0x6d,0x20,0xe0,0x05,0xe4,0x90,0x91,0x29,0xf0,0x22,
  93834. +0x8b,0x0e,0x8a,0x0f,0x89,0x10,0xf1,0xf2,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x12,0x29,
  93835. +0xd9,0xf5,0x70,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,
  93836. +0x7f,0x01,0x80,0x3a,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,0x12,0x42,0x20,
  93837. +0xfd,0xe4,0xff,0x31,0xe1,0x80,0x27,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,0x02,
  93838. +0x12,0x42,0x20,0xfd,0x7f,0x01,0x31,0xe1,0x1f,0x80,0x13,0xab,0x0e,0xaa,0x0f,0xa9,
  93839. +0x10,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0xe1,0xe4,0xff,0x11,0xff,
  93840. +0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x22,0x90,0x91,0x39,0x74,0x01,0xf0,0x80,
  93841. +0x16,0xed,0x70,0x0a,0x90,0x91,0x35,0xe0,0x90,0x91,0x39,0xf0,0x80,0x05,0x90,0x91,
  93842. +0x39,0xed,0xf0,0x90,0x91,0x39,0xe0,0x90,0x91,0x27,0xf0,0x22,0x12,0x47,0xe6,0xbf,
  93843. +0x01,0x0f,0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x11,0x22,0x90,0x04,0x1f,0x74,0x20,
  93844. +0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,
  93845. +0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,
  93846. +0x01,0xc4,0x74,0x22,0xf0,0x74,0x4a,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28,0xf5,
  93847. +0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5,0x2f,0xe5,
  93848. +0x2c,0x30,0xe0,0x5a,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd9,0x54,0xe5,0x70,0x14,
  93849. +0x24,0xfd,0x50,0x02,0x80,0x48,0x90,0x91,0x3b,0xe0,0x60,0x3a,0x90,0x01,0x5b,0xe4,
  93850. +0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x91,0x89,0xef,0x64,0x01,0x70,0x30,0x90,0x91,
  93851. +0x66,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,
  93852. +0x01,0x12,0x44,0x59,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,
  93853. +0x90,0x91,0x37,0xf0,0x80,0x08,0x91,0x89,0xbf,0x01,0x03,0x12,0x44,0xc2,0xe5,0x2c,
  93854. +0x30,0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,
  93855. +0xd3,0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,
  93856. +0x5f,0x12,0x64,0x66,0xe5,0x2c,0x30,0xe3,0x10,0x90,0x01,0x34,0x74,0x08,0xf0,0x90,
  93857. +0x91,0x56,0xe0,0x30,0xe0,0x03,0x43,0x57,0x04,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,
  93858. +0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x24,0x90,0x01,0xcf,0xe0,
  93859. +0x30,0xe5,0x1d,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,
  93860. +0x75,0xe8,0x00,0xd1,0x65,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x91,0xa0,0x80,0xfe,
  93861. +0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x15,
  93862. +0x90,0x91,0x50,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0,0x12,0x63,0x2e,0x12,0x70,0xee,
  93863. +0x90,0x91,0x50,0xe4,0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,
  93864. +0x43,0x57,0x40,0x90,0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,
  93865. +0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,0x91,0x40,0xe4,0xf0,0x80,0x17,0x90,0x91,
  93866. +0x40,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,
  93867. +0x30,0xe0,0x02,0x51,0x0c,0xe5,0x2e,0x30,0xe2,0x1a,0x90,0x01,0x36,0x74,0x04,0xf0,
  93868. +0x90,0x91,0x3a,0xe4,0xf0,0x90,0x05,0x58,0x74,0x03,0xf0,0x12,0x62,0xb8,0x90,0x91,
  93869. +0x3f,0xe0,0x04,0xf0,0xe5,0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,
  93870. +0x6d,0x64,0x01,0x70,0x1c,0xe5,0x70,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,
  93871. +0x3c,0x74,0x02,0xf0,0x90,0x91,0x66,0xe4,0x12,0x44,0x49,0x90,0x01,0x57,0x74,0x05,
  93872. +0xf0,0xe5,0x2e,0x30,0xe4,0x2b,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x6d,0xb4,0x01,
  93873. +0x20,0xe5,0x70,0x60,0x1c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,
  93874. +0x90,0x91,0x3c,0xe4,0xf0,0x53,0x71,0xfd,0xe5,0x71,0x54,0x07,0x70,0x03,0x12,0x44,
  93875. +0xc2,0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x6d,0xb4,0x01,
  93876. +0x14,0xe5,0x70,0x60,0x10,0x90,0x91,0x3b,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xc8,
  93877. +0x80,0x03,0x12,0x44,0x77,0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01,0x36,0x74,0x40,0xf0,
  93878. +0xe5,0x6d,0xb4,0x01,0x10,0xe5,0x70,0x60,0x0c,0x53,0x71,0xfe,0xe5,0x71,0x54,0x07,
  93879. +0x70,0x03,0x12,0x44,0xc2,0xe5,0x2f,0x30,0xe1,0x09,0x90,0x01,0x37,0x74,0x02,0xf0,
  93880. +0x12,0x64,0x31,0x74,0x22,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4a,0xa3,0xf0,0xd0,0x07,
  93881. +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,
  93882. +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,
  93883. +0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,
  93884. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92,0xaf,0x22,
  93885. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x9b,0xed,0xf0,0x90,0x91,0x9a,0xef,
  93886. +0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,
  93887. +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x91,0xa0,0x90,0x91,0x9a,
  93888. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,
  93889. +0x46,0xe0,0x4f,0xf0,0x91,0xa0,0x90,0x91,0x9b,0xe0,0x60,0x16,0x90,0x91,0x9a,0xe0,
  93890. +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,
  93891. +0x80,0x66,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  93892. +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6b,0x90,0x91,0x9a,0xe0,0x24,0xf8,0xf0,
  93893. +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,
  93894. +0x91,0x98,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,
  93895. +0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x91,0xa0,0x90,0x91,0x9b,0xe0,0x60,
  93896. +0x1b,0x90,0x91,0x9a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  93897. +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x91,0x9a,0xe0,
  93898. +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,
  93899. +0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x91,0xa0,0xd0,0xd0,0x92,0xaf,0x22,0xf0,0x90,
  93900. +0x00,0x45,0xe0,0x54,0xfe,0xfd,0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,
  93901. +0x82,0x75,0x83,0x00,0xed,0xf0,0x91,0xa0,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x14,0x60,
  93902. +0x30,0x14,0x60,0x66,0x24,0x02,0x60,0x02,0xc1,0x64,0x90,0x90,0xf3,0x74,0x02,0xf0,
  93903. +0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd,0x7f,0x48,0xb1,0xa8,0x90,0x00,0x47,0xe0,0x44,
  93904. +0x08,0xfd,0x7f,0x47,0xb1,0xa8,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,
  93905. +0x71,0xe4,0x90,0x90,0xf3,0xf0,0x90,0x90,0xef,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  93906. +0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,
  93907. +0x7f,0x45,0xb1,0xa8,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0xb1,0xa8,0x90,
  93908. +0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x38,0x90,0x90,0xf3,0x74,0x01,0xf0,
  93909. +0x90,0x90,0xf9,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,
  93910. +0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0xb1,0xa8,0x90,0x00,
  93911. +0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0xb1,0xa8,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,
  93912. +0x7f,0x46,0xb1,0xa8,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,
  93913. +0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xb1,0xa8,0xe4,
  93914. +0xfd,0x7f,0x51,0xb1,0xa8,0xe4,0xfd,0x7f,0x52,0xb1,0xa8,0xe4,0xfd,0x7f,0x53,0xa1,
  93915. +0xa8,0x8b,0x0e,0x8a,0x0f,0x89,0x10,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x90,0xf6,
  93916. +0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x90,0xed,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,
  93917. +0x27,0xde,0x90,0x90,0xef,0x12,0x2a,0x7f,0xab,0x0e,0xaa,0x0f,0xa9,0x10,0x90,0x00,
  93918. +0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,
  93919. +0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x90,0xef,0x12,0x43,0x09,0xec,0x54,0x03,0xfc,
  93920. +0x12,0x42,0xfc,0x90,0x90,0xf9,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,
  93921. +0xe4,0x90,0x90,0xed,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,
  93922. +0xec,0x44,0xc0,0xfc,0x90,0x90,0xef,0x12,0x2a,0x7f,0x90,0x90,0xef,0x12,0x43,0x09,
  93923. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0xf6,
  93924. +0xe0,0x30,0xe1,0x19,0x7d,0x0c,0x7f,0x47,0xb1,0xa8,0x90,0x00,0x48,0xe0,0x44,0x0c,
  93925. +0xfd,0x7f,0x48,0xb1,0xa8,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1c,0x90,0x00,0x47,
  93926. +0xe0,0x54,0xf3,0xfd,0x7f,0x47,0xb1,0xa8,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd,0x7f,
  93927. +0x48,0xb1,0xa8,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0xb1,0xa8,0xe4,0x90,
  93928. +0x90,0xf3,0xf0,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,
  93929. +0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xb1,0xa8,0x7d,0xff,0x7f,
  93930. +0x55,0xb1,0xa8,0x7d,0xff,0x7f,0x56,0xb1,0xa8,0x7d,0xff,0x7f,0x57,0xa1,0xa8,0xe5,
  93931. +0x72,0x64,0x01,0x70,0x3e,0x12,0x54,0x41,0xbf,0x01,0x05,0x7f,0x01,0x12,0x56,0xe7,
  93932. +0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xb1,0xa8,0x90,0x00,0x44,0xe0,0x54,
  93933. +0xfb,0xfd,0x7f,0x44,0xb1,0xa8,0x90,0x00,0x46,0xe0,0x54,0xfb,0xfd,0x7f,0x46,0xb1,
  93934. +0xa8,0x7f,0x02,0x12,0x6f,0x09,0x8f,0x76,0x90,0x01,0xc9,0xe5,0x76,0xf0,0xb4,0x01,
  93935. +0x02,0xf1,0xd4,0x22,0x90,0x00,0x49,0xe0,0x90,0x91,0x9f,0xf0,0xe0,0x54,0x0f,0xf0,
  93936. +0x44,0xf0,0xfd,0x7f,0x49,0xb1,0xa8,0x90,0x91,0x9f,0xe0,0x44,0xb0,0xfd,0x7f,0x49,
  93937. +0xa1,0xa8,0xe4,0x90,0x91,0x3c,0xf0,0x90,0x91,0x28,0xf0,0xf5,0x71,0x22,0x75,0x28,
  93938. +0x33,0xe4,0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,
  93939. +0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0x75,0x30,0x1f,0x75,
  93940. +0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,
  93941. +0xe5,0x32,0xf0,0x22,0xe4,0x90,0x91,0x0e,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0xf1,0x02,
  93942. +0xd1,0xb4,0x90,0x91,0x4f,0xef,0xf0,0xd1,0xdb,0x90,0x91,0x51,0xef,0xf0,0xf1,0x3d,
  93943. +0x90,0x91,0x3d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5,0x57,0xd1,0xd2,0x12,0x60,0x37,
  93944. +0x12,0x32,0x3d,0xd1,0xc1,0x12,0x4f,0xfe,0xf1,0x13,0xd1,0xcb,0x11,0x1c,0x12,0x44,
  93945. +0xff,0x31,0x23,0x11,0xdf,0x12,0x6f,0xaa,0x90,0x91,0x10,0xe5,0xd9,0xf0,0x12,0x4f,
  93946. +0x64,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0x12,0x4c,0xa0,0x75,0xe8,0x03,
  93947. +0x43,0xa8,0x85,0xd2,0xaf,0x90,0x91,0x0e,0xe0,0x64,0x01,0xf0,0x24,0x34,0x90,0x01,
  93948. +0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57,0x30,0xe2,0x10,0x12,0x5e,0x63,0xbf,0x01,
  93949. +0x0a,0xc2,0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,0x71,0x8a,0xe5,0x57,0x30,0xe4,0x0a,
  93950. +0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x12,0x5e,0xa0,0x90,0x90,0xf7,0xe0,0x70,0x03,
  93951. +0x12,0x70,0x08,0x11,0xf7,0x90,0x91,0x3f,0xe0,0x90,0x01,0xba,0xf0,0x80,0xb6,0x90,
  93952. +0x91,0x53,0xe0,0x54,0xfe,0xf0,0xe4,0x90,0x91,0x55,0xf0,0x90,0x91,0x53,0xe0,0x54,
  93953. +0x7f,0xf0,0xa3,0x74,0x0a,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x25,0x14,0x70,0x1b,
  93954. +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x68,0x1a,0xbf,0x01,0x09,
  93955. +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x04,0x80,0x00,0xc1,0xf4,0xe4,0x90,0x06,
  93956. +0x34,0xf0,0x22,0x90,0x91,0x56,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x7f,0xf0,0x90,0x01,
  93957. +0x17,0xe0,0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x91,
  93958. +0x5c,0xf0,0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x91,0x1c,0xf0,0xe0,
  93959. +0xff,0x74,0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,
  93960. +0xf9,0x90,0x91,0x5b,0xf0,0xee,0x90,0x91,0x5a,0xf0,0x90,0x91,0x5e,0xe0,0x54,0xfe,
  93961. +0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0,0x54,0xef,
  93962. +0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4,0xa3,0xf0,
  93963. +0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x22,
  93964. +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x12,0x29,0xd9,0x54,0x01,0xff,0x90,0x91,0x56,
  93965. +0xe0,0x54,0xfe,0x4f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x57,0xf0,0x90,
  93966. +0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x58,0xf0,0x90,0x91,0x56,0xe0,0x30,0xe0,0x1a,
  93967. +0x90,0x06,0x09,0xe0,0x54,0xfe,0xf0,0x90,0x02,0x86,0xe0,0x44,0x04,0xf0,0x43,0x57,
  93968. +0x04,0x7d,0x08,0xe4,0xff,0x12,0x36,0xe6,0x80,0x12,0x7d,0x08,0xe4,0xff,0x12,0x36,
  93969. +0x75,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x51,0x01,0x31,0x23,0xd0,0xd0,0x92,0xaf,
  93970. +0x22,0x90,0x06,0x90,0xe4,0xf0,0x21,0x6a,0x90,0x91,0x19,0x12,0x43,0x41,0xef,0x12,
  93971. +0x43,0x4a,0x52,0x40,0x01,0x52,0x49,0x02,0x52,0x6a,0x03,0x52,0x73,0x09,0x52,0x7b,
  93972. +0x0c,0x52,0x84,0x0d,0x52,0x8c,0x0e,0x52,0x9d,0x1a,0x52,0xa5,0x2c,0x52,0x51,0x2d,
  93973. +0x52,0x5a,0x2e,0x52,0xad,0x30,0x52,0x62,0x3b,0x52,0x95,0x3c,0x00,0x00,0x52,0xb5,
  93974. +0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x64,0xde,0x90,0x91,0x19,0x12,0x43,0x21,0xc1,
  93975. +0xc5,0x90,0x91,0x19,0x12,0x43,0x21,0x02,0x65,0xf9,0x90,0x91,0x19,0x12,0x43,0x21,
  93976. +0xe1,0xa8,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x28,0x90,0x91,0x19,0x12,0x43,0x21,
  93977. +0x02,0x66,0x41,0x90,0x91,0x19,0x12,0x43,0x21,0x80,0x42,0x90,0x91,0x19,0x12,0x43,
  93978. +0x21,0x02,0x5d,0x16,0x90,0x91,0x19,0x12,0x43,0x21,0xe1,0x75,0x90,0x91,0x19,0x12,
  93979. +0x43,0x21,0x02,0x4e,0x91,0x90,0x91,0x19,0x12,0x43,0x21,0x21,0xa0,0x90,0x91,0x19,
  93980. +0x12,0x43,0x21,0xa1,0x7f,0x90,0x91,0x19,0x12,0x43,0x21,0x81,0x5e,0x90,0x91,0x19,
  93981. +0x12,0x43,0x21,0xe1,0x55,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0xd3,0x10,0xaf,
  93982. +0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,0x91,0x1c,0x12,0x43,0x21,
  93983. +0x90,0x00,0x01,0x12,0x42,0x97,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,
  93984. +0x91,0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x42,0xcf,0x12,0x29,
  93985. +0xd9,0xff,0x60,0x2c,0xb5,0x72,0x16,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,0x01,
  93986. +0x12,0x42,0x97,0x65,0x74,0x70,0x04,0xe5,0x73,0x65,0xf0,0x60,0x23,0x90,0x91,0x1c,
  93987. +0x12,0x43,0x21,0x90,0x00,0x01,0x12,0x42,0x97,0xff,0xae,0xf0,0x71,0x35,0x80,0x10,
  93988. +0x90,0x91,0x1c,0x12,0x43,0x21,0x12,0x29,0xd9,0x65,0x72,0x60,0x03,0x12,0x44,0xe8,
  93989. +0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x1f,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x72,0x01,
  93990. +0x8e,0x73,0xf5,0x74,0xe4,0xfd,0x7f,0x0b,0x71,0x77,0xe4,0xfd,0x7f,0x02,0x71,0x77,
  93991. +0x91,0x41,0xe4,0xff,0xd1,0xe7,0xe4,0xf5,0x76,0x90,0x01,0xc9,0xe5,0x76,0xf0,0x90,
  93992. +0x91,0x1f,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,
  93993. +0x7f,0x60,0x7e,0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,
  93994. +0x22,0xed,0xf0,0x90,0x91,0x21,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,
  93995. +0x1a,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  93996. +0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x91,0x21,0xe0,0xff,
  93997. +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,
  93998. +0x4f,0xf0,0x12,0x4c,0xa0,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  93999. +0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x91,0x21,0xe0,
  94000. +0x24,0xf8,0xf0,0xa3,0xe0,0x70,0x1d,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,
  94001. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,
  94002. +0x5f,0xf0,0x80,0x1a,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,
  94003. +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4c,
  94004. +0xa0,0x90,0x91,0x21,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,
  94005. +0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4c,0xa0,0xd0,0xd0,0x92,0xaf,
  94006. +0x22,0x7f,0x0b,0x12,0x6f,0x09,0xef,0x65,0x75,0x60,0x10,0xe5,0x75,0xb4,0x01,0x05,
  94007. +0xe4,0xf5,0x75,0x80,0x03,0x75,0x75,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,
  94008. +0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0xf5,0x10,0x75,0x11,0x04,0xf5,0x12,0xf5,0x14,0xf5,
  94009. +0x15,0x90,0x02,0x09,0xe0,0xff,0x12,0x29,0xd9,0xfe,0xef,0x2e,0xf5,0x13,0x30,0xe0,
  94010. +0x08,0x75,0x0e,0x00,0x75,0x0f,0x80,0x80,0x05,0xe4,0xf5,0x0e,0xf5,0x0f,0xe5,0x13,
  94011. +0xc3,0x13,0x90,0xfd,0x10,0xf0,0x74,0x20,0x25,0x10,0xf5,0x10,0xad,0x0f,0xe5,0x10,
  94012. +0x2d,0xff,0x24,0x01,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0x91,0x47,0xf0,
  94013. +0x74,0x02,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0xe5,0x10,0x2d,0x24,
  94014. +0x03,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x24,0x00,0xff,0xe4,0x3e,0x90,0x91,
  94015. +0x48,0xf0,0xa3,0xef,0xf0,0x7f,0x04,0xe5,0x10,0x25,0x0f,0x2f,0x24,0x00,0xf5,0x82,
  94016. +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0x74,0x46,0x2f,0xf5,0x82,0xe4,0x34,0x91,0xf5,
  94017. +0x83,0xee,0xf0,0x0f,0xbf,0x08,0xe0,0x12,0x66,0x89,0xef,0x70,0x3f,0x90,0x01,0xc3,
  94018. +0xe0,0x60,0x25,0xc3,0xe5,0x15,0x94,0xe8,0xe5,0x14,0x94,0x03,0x40,0x09,0x90,0x01,
  94019. +0xc6,0xe0,0x44,0x10,0xf0,0x80,0x63,0x05,0x15,0xe5,0x15,0x70,0x02,0x05,0x14,0x7f,
  94020. +0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xd5,0x90,0x01,0xc6,0xe0,0x90,0x01,0xc3,0x30,
  94021. +0xe2,0x05,0x74,0xfe,0xf0,0x80,0x43,0x74,0xff,0xf0,0x80,0x3e,0xe5,0x10,0xb4,0x78,
  94022. +0x23,0xe4,0xf5,0x10,0x05,0x13,0xe5,0x0f,0x64,0x80,0x45,0x0e,0x70,0x06,0xf5,0x0e,
  94023. +0xf5,0x0f,0x80,0x06,0x75,0x0e,0x00,0x75,0x0f,0x80,0xe5,0x13,0xc3,0x13,0x90,0xfd,
  94024. +0x10,0xf0,0x80,0x06,0x74,0x08,0x25,0x10,0xf5,0x10,0xe5,0x12,0x15,0x12,0x70,0x02,
  94025. +0x15,0x11,0xe5,0x12,0x45,0x11,0x60,0x02,0x81,0x9c,0xd0,0xd0,0x92,0xaf,0x22,0x90,
  94026. +0x91,0x1c,0x12,0x43,0x41,0x12,0x29,0xd9,0xff,0x54,0x01,0xfe,0x90,0x91,0x5e,0xe0,
  94027. +0x54,0xfe,0x4e,0xf0,0xef,0x54,0x04,0xff,0xe0,0x54,0xfb,0x4f,0xf0,0x12,0x29,0xd9,
  94028. +0xff,0x54,0x02,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xfd,0x4e,0xf0,0xef,0x54,0x08,0xff,
  94029. +0xe0,0x54,0xf7,0x4f,0xf0,0x12,0x29,0xd9,0xff,0x54,0x10,0xfe,0x90,0x91,0x5e,0xe0,
  94030. +0x54,0xef,0x4e,0xf0,0xef,0x54,0x20,0xff,0xe0,0x54,0xdf,0x4f,0xf0,0x12,0x29,0xd9,
  94031. +0xff,0x54,0x40,0xfe,0x90,0x91,0x5e,0xe0,0x54,0xbf,0x4e,0xf0,0xef,0x54,0x80,0xff,
  94032. +0xe0,0x54,0x7f,0x4f,0xf0,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x91,0x60,0xf0,0x90,
  94033. +0x00,0x01,0x12,0x42,0x20,0x90,0x91,0x5f,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0xff,
  94034. +0x54,0x01,0xfe,0x90,0x91,0x61,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,
  94035. +0x54,0xfd,0x4f,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0x04,0xff,0x90,0x91,0x61,
  94036. +0xe0,0x54,0xfb,0x4f,0xf0,0x90,0x91,0x5e,0xe0,0x54,0x01,0x90,0x01,0xb8,0xf0,0x90,
  94037. +0x91,0x5e,0xe0,0xff,0xc4,0x13,0x54,0x01,0x90,0x01,0xb9,0xf0,0x90,0x91,0x61,0xe0,
  94038. +0x54,0x01,0x90,0x01,0xba,0xf0,0xa3,0x74,0xff,0xf0,0x12,0x29,0xd9,0x20,0xe0,0x02,
  94039. +0x41,0x01,0xe4,0xfd,0x7f,0x81,0x12,0x4d,0xa8,0x90,0x91,0x1c,0x12,0x43,0x21,0x12,
  94040. +0x29,0xd9,0xff,0xc3,0x13,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x02,0xf0,0xef,
  94041. +0x13,0x13,0x54,0x3f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x04,0xf0,0x12,0x29,
  94042. +0xd9,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x08,0xf0,
  94043. +0x90,0x91,0x61,0xe0,0x30,0xe0,0x1c,0x90,0x91,0x5e,0xe0,0xc4,0x13,0x54,0x07,0x30,
  94044. +0xe0,0x07,0xa3,0xe0,0xff,0xe4,0xfd,0x80,0x07,0x90,0x91,0x5f,0xe0,0xff,0x7d,0x01,
  94045. +0x12,0x4c,0xb0,0x22,0x90,0x00,0x02,0xe0,0x54,0xe0,0x7f,0x01,0x60,0x02,0x7f,0x00,
  94046. +0x22,0xe4,0xf5,0x75,0x22,0x12,0x29,0xd9,0xf5,0x6d,0x22,0x90,0x01,0x64,0x74,0xa0,
  94047. +0xf0,0x22,0x90,0x91,0x51,0xe0,0x90,0x90,0xe8,0xf0,0x22,0x90,0x00,0xf3,0xe0,0x7f,
  94048. +0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x01,0xca,0xe5,0x75,0xf0,0xef,0x60,0x03,
  94049. +0x12,0x4f,0xd4,0x22,0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,
  94050. +0xf0,0x22,0xe4,0x90,0x91,0x4e,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,
  94051. +0x02,0x4d,0xa8,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,
  94052. +0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x22,0x12,0x29,0xd9,0x60,0x02,0x80,0x01,0xe4,
  94053. +0x90,0x91,0x31,0xf0,0x90,0x91,0x31,0xe0,0x90,0x01,0xe7,0xf0,0x22,0x90,0x91,0x51,
  94054. +0xe0,0xb4,0x01,0x0c,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x05,0x7e,0xfd,0x7f,0x33,0x22,
  94055. +0x7e,0xfd,0x7f,0x2f,0x22,0x12,0x29,0xd9,0xff,0x54,0x01,0xfe,0x90,0x91,0x53,0xe0,
  94056. +0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01,0x12,0x42,0x20,
  94057. +0x90,0x91,0x54,0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x90,0xf7,0xf0,0xe0,
  94058. +0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x0e,0xc2,0xaf,0x90,0x00,
  94059. +0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x4d,0xa8,0x7d,0x40,0x7f,0x01,0x12,0x36,
  94060. +0xaf,0xe5,0x0e,0x24,0xff,0x92,0xaf,0x22,0x12,0x29,0xd9,0x30,0xe0,0x19,0xc3,0x13,
  94061. +0x54,0x7f,0x90,0x91,0x34,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x91,0x32,
  94062. +0xe4,0xf0,0xa3,0xef,0xf0,0x80,0x0f,0x90,0x91,0x34,0x74,0x07,0xf0,0x90,0x91,0x32,
  94063. +0xe4,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x91,0x32,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,
  94064. +0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,
  94065. +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,
  94066. +0xc4,0x74,0xe1,0xf0,0x74,0x57,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,
  94067. +0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0x90,0x00,0x52,0xe0,0xff,0x90,0x00,0x56,0xe0,
  94068. +0x5f,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,0x74,0x10,0xf0,0xe5,0x3d,
  94069. +0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,0x30,0xe6,0x1b,0x90,0x00,
  94070. +0x55,0x74,0x40,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x90,
  94071. +0xf3,0xe0,0x60,0x05,0x7f,0x01,0x12,0x4d,0xbd,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,
  94072. +0x55,0x74,0x80,0xf0,0x90,0x90,0xf6,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,
  94073. +0x12,0x4d,0xbd,0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,0x74,0x01,0xf0,0xe5,0x3e,
  94074. +0x30,0xe1,0x06,0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,0x30,0xe2,0x06,0x90,0x00,
  94075. +0x56,0x74,0x04,0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,0x56,0x74,0x08,0xf0,0x90,
  94076. +0x01,0xc4,0x74,0xe1,0xf0,0x74,0x57,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,
  94077. +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,
  94078. +0xf0,0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,
  94079. +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,
  94080. +0x07,0x75,0x0d,0x00,0x90,0x01,0xc4,0x74,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0x53,0x91,
  94081. +0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,
  94082. +0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,
  94083. +0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x08,0x90,0x01,0x3c,0x74,0x02,
  94084. +0xf0,0x71,0x89,0xe5,0x34,0x30,0xe2,0x3a,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,
  94085. +0x92,0xe0,0x30,0xe0,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,
  94086. +0x67,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x44,0x59,0x90,0x01,0x5b,0x74,
  94087. +0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90,0x91,0x37,0xe4,0xf0,0x12,
  94088. +0x44,0xc2,0xe5,0x34,0x30,0xe3,0x3a,0x90,0x01,0x3c,0x74,0x08,0xf0,0x90,0x06,0x92,
  94089. +0xe0,0x30,0xe1,0x25,0x90,0x91,0x66,0xe4,0xf0,0x90,0x91,0x2d,0xe0,0x90,0x91,0x67,
  94090. +0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12,0x44,0x59,0x90,0x01,0x5f,0x74,0x05,
  94091. +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x91,0x36,0xe4,0xf0,0x12,0x44,
  94092. +0xc2,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x4f,0x8f,0xe5,
  94093. +0x34,0x30,0xe5,0x08,0x90,0x01,0x3c,0x74,0x20,0xf0,0x51,0x62,0xe5,0x35,0x30,0xe0,
  94094. +0x5a,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,0x44,0x7f,0xf0,0x90,0x00,
  94095. +0x83,0xe0,0x54,0x0f,0xf5,0x0d,0xb4,0x01,0x02,0x80,0x1c,0xe5,0x0d,0xb4,0x02,0x05,
  94096. +0x90,0x00,0x83,0x80,0x12,0xe5,0x0d,0xb4,0x04,0x05,0x90,0x00,0x83,0x80,0x08,0xe5,
  94097. +0x0d,0xb4,0x0c,0x08,0x90,0x00,0x83,0xe0,0xf5,0x6f,0x80,0x06,0x90,0x01,0xbe,0xe0,
  94098. +0x04,0xf0,0x90,0x01,0xbb,0xe5,0x6f,0xf0,0xe5,0x6f,0x30,0xe0,0x03,0xa3,0x80,0x03,
  94099. +0x90,0x01,0xbd,0xe0,0x04,0xf0,0x71,0x6a,0x12,0x44,0xc2,0xe5,0x35,0x30,0xe2,0x06,
  94100. +0x90,0x01,0x3d,0x74,0x04,0xf0,0xe5,0x36,0x30,0xe0,0x06,0x90,0x01,0x3e,0x74,0x01,
  94101. +0xf0,0xe5,0x36,0x30,0xe1,0x06,0x90,0x01,0x3e,0x74,0x02,0xf0,0x74,0xc4,0x04,0x90,
  94102. +0x01,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,
  94103. +0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,
  94104. +0xe0,0x32,0x90,0x90,0xf5,0xe0,0x64,0x01,0x60,0x02,0x61,0x17,0x90,0x00,0x46,0xe0,
  94105. +0x44,0x01,0xfd,0x7f,0x46,0x12,0x4d,0xa8,0x90,0x91,0x07,0xe0,0x70,0x32,0x90,0x90,
  94106. +0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  94107. +0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,
  94108. +0x90,0xf4,0xe0,0xff,0x71,0x18,0x90,0x91,0x07,0x74,0x01,0x12,0x4d,0x9e,0x80,0x40,
  94109. +0x90,0x91,0x07,0xe0,0x64,0x01,0x70,0x38,0x90,0x90,0xf8,0xe0,0xff,0x71,0x18,0xe4,
  94110. +0x90,0x91,0x07,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01,0xfd,0x7f,0x45,0x12,0x4d,0xa8,
  94111. +0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xef,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  94112. +0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,
  94113. +0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,0x03,0xe0,0x90,0x05,0x84,0xf0,0x90,
  94114. +0x91,0x04,0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,0x05,0xe0,0x90,0x05,0x86,0xf0,0x90,
  94115. +0x91,0x06,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x05,0x60,0xe0,0x90,0x91,0x03,0xf0,
  94116. +0x90,0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x05,0xf0,
  94117. +0x90,0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x91,0x04,
  94118. +0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,
  94119. +0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x91,0x06,0x80,0x03,0x90,0x91,0x05,0xe0,
  94120. +0x04,0xf0,0x22,0x90,0x91,0x04,0xe0,0x2f,0xf0,0x22,0xe5,0x6f,0x30,0xe6,0x19,0xe5,
  94121. +0x6f,0x54,0x0f,0xff,0x90,0x91,0x24,0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,
  94122. +0x80,0x90,0x91,0x24,0xf0,0x53,0x6f,0xbf,0x22,0xe4,0x90,0x91,0x0d,0xf0,0xe5,0x70,
  94123. +0x70,0x02,0x81,0x13,0x90,0x91,0x3c,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x71,0xfd,0xe5,
  94124. +0x71,0x54,0x07,0x70,0x6e,0x80,0x69,0x90,0x91,0x28,0xe0,0x04,0xf0,0x53,0x71,0xef,
  94125. +0x90,0x91,0x3a,0xe0,0x04,0xf0,0x90,0x91,0x0d,0xe0,0xf9,0xff,0x7e,0x00,0x24,0x01,
  94126. +0xfd,0xee,0x33,0xfc,0x90,0x91,0x3a,0xe0,0xb5,0x05,0x06,0xe4,0xb5,0x04,0x02,0x80,
  94127. +0x12,0xef,0x24,0x02,0xff,0xe4,0x3e,0xfe,0x90,0x91,0x3a,0xe0,0xb5,0x07,0x0a,0xe4,
  94128. +0xb5,0x06,0x06,0x90,0x05,0x58,0xe0,0x04,0xf0,0xe9,0xff,0x90,0x91,0x2f,0xe0,0x2f,
  94129. +0xff,0xe4,0x33,0xfe,0x90,0x91,0x28,0xe0,0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,
  94130. +0x98,0x40,0x0d,0xe5,0x6d,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,
  94131. +0x12,0x44,0xc2,0x22,0x90,0x90,0xee,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0,
  94132. +0x81,0xcc,0x90,0x90,0xee,0xe0,0x64,0x14,0x60,0x02,0x81,0xcc,0x90,0x90,0xfd,0xe0,
  94133. +0x70,0x25,0x90,0x91,0x00,0xe0,0x70,0x1f,0x90,0x90,0xfe,0xe0,0x70,0x19,0x90,0x91,
  94134. +0x01,0xe0,0x70,0x13,0x90,0x90,0xff,0xe0,0x70,0x0d,0x90,0x91,0x02,0xe0,0x70,0x07,
  94135. +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x90,0xfd,0xe0,0x90,0x04,0x44,0xf0,0x90,
  94136. +0x90,0xfe,0xe0,0x90,0x04,0x45,0xf0,0x90,0x90,0xff,0xe0,0x90,0x04,0x46,0xf0,0xa3,
  94137. +0xe4,0xf0,0x90,0x91,0x00,0xe0,0x90,0x04,0x48,0xf0,0x90,0x91,0x01,0xe0,0x90,0x04,
  94138. +0x49,0xf0,0x90,0x91,0x02,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x90,0xe9,
  94139. +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x90,0xea,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x90,0xeb,
  94140. +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x90,0xec,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x90,
  94141. +0xee,0xf0,0x90,0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x90,
  94142. +0xfd,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0,
  94143. +0x90,0x91,0x8c,0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x8d,0xf0,0x90,0x05,0x62,0xe0,
  94144. +0x90,0x91,0x8e,0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x8f,0xf0,0x90,0x91,0x06,0xe0,
  94145. +0xff,0x90,0x91,0x8f,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x91,0x06,0xe0,0xc3,0x9e,
  94146. +0xd3,0x94,0x01,0x40,0x10,0x90,0x90,0xf4,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x90,
  94147. +0xf8,0xe0,0xff,0x71,0x18,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x90,0xf5,0xf0,
  94148. +0x90,0x00,0x01,0x12,0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x90,0xf4,0xf0,0x12,0x29,
  94149. +0xd9,0x25,0xe0,0x25,0xe0,0x90,0x90,0xf8,0xf0,0x90,0x05,0x60,0xe0,0x90,0x91,0x03,
  94150. +0xf0,0x90,0x05,0x61,0xe0,0x90,0x91,0x04,0xf0,0x90,0x05,0x62,0xe0,0x90,0x91,0x05,
  94151. +0xf0,0x90,0x05,0x63,0xe0,0x90,0x91,0x06,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,
  94152. +0xf0,0xc2,0xaf,0x90,0x90,0xf4,0xe0,0xff,0x71,0x18,0x90,0x91,0x1c,0xe0,0x24,0xff,
  94153. +0x92,0xaf,0x90,0x90,0xf5,0xe0,0x70,0x02,0xc1,0x1f,0x90,0x90,0xf4,0xe0,0x70,0x02,
  94154. +0xc1,0x1f,0x90,0x90,0xf8,0xe0,0x70,0x02,0xc1,0x1f,0xa2,0xaf,0xe4,0x33,0x90,0x91,
  94155. +0x1c,0xf0,0xc2,0xaf,0x90,0x91,0x07,0x74,0x01,0xf0,0x90,0x91,0x1c,0xe0,0x24,0xff,
  94156. +0x92,0xaf,0x12,0x4d,0x9f,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x4d,
  94157. +0xa8,0x90,0x90,0xed,0xe0,0x60,0x15,0x90,0x90,0xf9,0x12,0x43,0x09,0x90,0x80,0x85,
  94158. +0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,
  94159. +0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x4d,0xa8,0x90,0x05,
  94160. +0x87,0xe0,0x64,0x80,0xf0,0x90,0x91,0x03,0xe0,0x90,0x05,0x84,0xf0,0x90,0x91,0x04,
  94161. +0xe0,0x90,0x05,0x85,0xf0,0x90,0x91,0x05,0xe0,0x90,0x05,0x86,0xf0,0x90,0x91,0x06,
  94162. +0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x91,0x1c,0xf0,0xc2,0xaf,0x90,
  94163. +0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,
  94164. +0x90,0xf5,0xe0,0x70,0x2f,0x90,0x91,0x07,0x12,0x4d,0x9e,0x90,0x00,0x46,0xe0,0x54,
  94165. +0xfe,0xfd,0x7f,0x46,0x12,0x4d,0xa8,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,
  94166. +0x91,0x1c,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x91,0x1c,0xe0,
  94167. +0x24,0xff,0x92,0xaf,0x22,0x8f,0x20,0x8c,0x21,0x8d,0x22,0x22,0x8f,0x23,0x8c,0x24,
  94168. +0x8d,0x25,0x22,0xe4,0x90,0x91,0x11,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0,0x20,0xe1,
  94169. +0x2c,0xc3,0x90,0x91,0x12,0xe0,0x94,0x20,0x90,0x91,0x11,0xe0,0x94,0x03,0x40,0x0a,
  94170. +0x90,0x01,0xc6,0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x91,0x11,0xe4,0x75,0xf0,
  94171. +0x01,0x12,0x42,0x81,0x7f,0x01,0x7e,0x00,0x12,0x37,0x54,0x80,0xcd,0x7f,0x01,0x22,
  94172. +0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x91,0x11,0xf0,0x90,0x91,0x11,0xe0,0xfd,0x70,
  94173. +0x02,0xe1,0xe2,0x90,0x91,0x9c,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,
  94174. +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0xe1,0xdb,0x90,
  94175. +0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x15,0xe0,0x90,0x91,0x12,
  94176. +0xf0,0x75,0x63,0x01,0x75,0x64,0x91,0x75,0x65,0x12,0x75,0x66,0x01,0x7b,0x01,0x7a,
  94177. +0x91,0x79,0x13,0x12,0x46,0x6d,0x90,0x91,0x13,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,
  94178. +0x01,0x90,0x91,0x9c,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,
  94179. +0x15,0xe0,0x90,0x91,0x14,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,
  94180. +0x12,0x43,0x15,0xe0,0x90,0x91,0x15,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,
  94181. +0x01,0xd1,0x12,0x43,0x15,0xe0,0x90,0x91,0x16,0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,
  94182. +0x04,0x90,0x01,0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x17,0xf0,0x90,0x91,0x9c,0xe0,
  94183. +0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,0x91,0x18,0xf0,0x80,0x33,
  94184. +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x15,0xe0,0x90,0x91,0x14,0xf0,0x90,
  94185. +0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x15,0xe0,0x90,0x91,0x15,
  94186. +0xf0,0x90,0x91,0x9c,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x15,0xe0,0x90,
  94187. +0x91,0x16,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x91,0x79,0x14,0x12,0x52,0x08,
  94188. +0x90,0x91,0x11,0xe0,0xff,0x90,0x91,0x9c,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,
  94189. +0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x91,0x11,0xf0,0x90,0x91,0x9c,0xe0,0xff,
  94190. +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,
  94191. +0x91,0x9c,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0xc1,0xaa,0x90,0x01,0xc6,0xe0,0x44,
  94192. +0x02,0xf0,0x22,0xad,0x07,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,
  94193. +0x44,0x01,0xf0,0x90,0x04,0x80,0xe0,0x54,0x0f,0xfc,0x74,0x14,0x2d,0xf5,0x82,0xe4,
  94194. +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xc0,0x4c,0xfd,0x74,0x14,0x2f,0xf5,0x82,0xe4,0x34,
  94195. +0xfc,0xf5,0x83,0xed,0xf0,0x22,0xef,0x60,0x0f,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,
  94196. +0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x22,0x74,0x21,0x2d,0xf5,0x82,0xe4,0x34,0xfc,
  94197. +0xf5,0x83,0xe0,0x54,0xef,0xf0,0x22,0xe4,0xf5,0x6d,0xf5,0x71,0xf5,0x70,0x75,0x6f,
  94198. +0x0c,0x75,0x6e,0x0c,0x90,0x91,0x3b,0xf0,0x90,0x91,0x37,0xf0,0x90,0x91,0x36,0xf0,
  94199. +0x90,0x91,0x39,0x04,0xf0,0x90,0x91,0x27,0xf0,0xe4,0x90,0x91,0x3c,0xf0,0x90,0x91,
  94200. +0x29,0xf0,0x90,0x91,0x34,0x74,0x07,0xf0,0xe4,0x90,0x91,0x28,0xf0,0x90,0x91,0x32,
  94201. +0xf0,0xa3,0x74,0x03,0xf0,0x90,0x91,0x2f,0x74,0x0a,0xf0,0xa3,0x74,0x05,0xf0,0x90,
  94202. +0x91,0x2d,0x74,0x14,0xf0,0x90,0x91,0x35,0x74,0x05,0xf0,0xe4,0x90,0x91,0x2b,0xf0,
  94203. +0x90,0x91,0x25,0xf0,0x90,0x91,0x50,0xf0,0x90,0x91,0x31,0xf0,0x90,0x91,0x3a,0xf0,
  94204. +0x90,0x91,0x26,0xf0,0x90,0x91,0x38,0xf0,0x90,0x91,0x2e,0xf0,0x90,0x91,0x2c,0xf0,
  94205. +0x22,0x12,0x4c,0x89,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,
  94206. +0x30,0x90,0x91,0x37,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,
  94207. +0x91,0x36,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x6f,0x54,
  94208. +0x0f,0xd3,0x94,0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,
  94209. +0x22,0x90,0x01,0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0x12,0x4c,0x89,0xef,0x64,0x01,
  94210. +0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x58,0xe5,0x71,0x54,0x03,0x60,0x08,
  94211. +0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x4a,0xe5,0x6f,0x54,0x0f,0xd3,0x94,0x02,0x40,
  94212. +0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x39,0xe5,0x71,0x30,0xe2,0x08,0x90,0x01,
  94213. +0xb9,0x74,0x08,0xf0,0x80,0x2c,0xe5,0x71,0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,
  94214. +0xf0,0x80,0x1f,0x90,0x91,0x29,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,
  94215. +0x11,0x90,0x91,0x31,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x80,0xf0,0x80,0x03,0x7f,
  94216. +0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x54,
  94217. +0xbf,0xf0,0xef,0x60,0x0a,0xe5,0x6d,0xb4,0x01,0x05,0xe4,0xff,0x12,0x47,0xc9,0x53,
  94218. +0x6e,0xf0,0x43,0x6e,0x0c,0x22,0x90,0x91,0x9d,0xef,0xf0,0x31,0x9f,0x90,0x91,0x9d,
  94219. +0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x53,0x6e,0xf0,0x43,0x6e,0x04,0x22,0x90,
  94220. +0x90,0xd8,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,
  94221. +0x2f,0xd9,0x90,0x90,0xdc,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,
  94222. +0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,0xe0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,
  94223. +0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0xe4,0x12,0x43,0x09,0x90,0x80,
  94224. +0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,
  94225. +0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x91,0x51,0xe0,0xb4,
  94226. +0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,
  94227. +0x12,0x34,0x81,0x22,0x8f,0x77,0xe4,0x90,0x91,0x96,0xf0,0xa3,0xf0,0x90,0x01,0x09,
  94228. +0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x77,0x60,0x3e,0xc3,0x90,0x91,
  94229. +0x97,0xe0,0x94,0x88,0x90,0x91,0x96,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,
  94230. +0x44,0x80,0xf0,0x22,0x90,0x91,0x96,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,
  94231. +0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x91,0x97,0xe0,0x94,0x32,0x90,0x91,0x96,0xe0,
  94232. +0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x53,0x6e,0xf0,0x43,
  94233. +0x6e,0x01,0x12,0x45,0x00,0x12,0x45,0x01,0x53,0x6e,0xf0,0x43,0x6e,0x02,0x22,0x8f,
  94234. +0x78,0x12,0x47,0xe6,0xef,0x64,0x01,0x70,0x2e,0x90,0x91,0x44,0x12,0x48,0x1e,0xe5,
  94235. +0x78,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,
  94236. +0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,
  94237. +0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xe5,0x6d,0x64,0x01,0x70,0x63,0xe5,0x70,
  94238. +0x60,0x5f,0xe5,0x70,0x64,0x02,0x60,0x06,0xe5,0x70,0x64,0x05,0x70,0x27,0x90,0x06,
  94239. +0xab,0xe0,0x90,0x91,0x27,0xf0,0x90,0x06,0xaa,0xe0,0x90,0x91,0x39,0xf0,0x90,0x91,
  94240. +0x27,0xe0,0x70,0x07,0x90,0x91,0x39,0xe0,0xff,0x80,0x05,0x90,0x91,0x27,0xe0,0xff,
  94241. +0x90,0x91,0x27,0xef,0xf0,0x90,0x91,0x29,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,
  94242. +0x91,0x28,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x71,0xfd,
  94243. +0x53,0x71,0xef,0xe5,0x70,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0xc7,0x71,
  94244. +0x22,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xd0,0xd0,0x92,0xaf,0x22,0xe4,0xfb,
  94245. +0x90,0x91,0x78,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x70,0x70,0x02,0x61,0xc0,
  94246. +0xe5,0x6d,0x64,0x01,0x70,0x7a,0xe5,0x70,0x14,0x60,0x2b,0x24,0xfd,0x60,0x27,0x24,
  94247. +0x02,0x24,0xfb,0x50,0x02,0x80,0x21,0x90,0x91,0x27,0xe0,0x14,0xf0,0xe0,0x60,0x04,
  94248. +0xa3,0xe0,0x60,0x14,0x90,0x91,0x27,0xe0,0x70,0x08,0x90,0x91,0x39,0xe0,0x90,0x91,
  94249. +0x27,0xf0,0x7b,0x01,0x80,0x02,0x7b,0x01,0xeb,0x60,0x45,0x43,0x71,0x10,0xe4,0x90,
  94250. +0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,0xff,0x90,0x91,0x34,0xe0,
  94251. +0x2f,0x12,0x44,0x4e,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,
  94252. +0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,0x90,0x91,0x2e,0xe0,0x60,0x10,
  94253. +0x90,0x91,0x2c,0xe0,0x90,0x07,0x78,0x60,0x04,0x74,0x0d,0xf0,0x22,0x74,0x09,0xf0,
  94254. +0x22,0xe4,0xfb,0x90,0x91,0x7c,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x70,0x60,
  94255. +0x5f,0xe5,0x6d,0x64,0x01,0x70,0x59,0x0b,0x90,0x91,0x27,0xf0,0x04,0x60,0x51,0x43,
  94256. +0x71,0x10,0xe4,0x90,0x91,0x66,0xf0,0x90,0x91,0x3a,0xe0,0x75,0xf0,0x05,0xa4,0xff,
  94257. +0x90,0x91,0x34,0xe0,0x2f,0x90,0x91,0x67,0xf0,0xe4,0x1b,0x12,0x44,0x54,0x90,0x01,
  94258. +0x57,0x74,0x05,0xf0,0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,
  94259. +0x04,0x12,0x47,0x27,0x90,0x91,0x2e,0xe0,0x60,0x11,0x90,0x91,0x2c,0xe0,0x90,0x07,
  94260. +0x78,0x60,0x05,0x74,0x0d,0xf0,0x80,0x03,0x74,0x09,0xf0,0x90,0x05,0x22,0xe4,0xf0,
  94261. +0x22,0x90,0x91,0x80,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe5,0x70,0x14,0x24,0xfd,
  94262. +0x50,0x02,0x80,0x21,0x90,0x91,0x3b,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0d,
  94263. +0xe5,0x6e,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x47,0x27,
  94264. +0xe4,0xff,0x12,0x48,0xb3,0x22,0x90,0x91,0x08,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,
  94265. +0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x91,0x71,0x12,0x43,0x41,
  94266. +0x0b,0x7a,0x91,0x79,0x08,0x02,0x46,0xb7,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,
  94267. +0x91,0x84,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x91,0x84,0xe0,
  94268. +0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x91,0x87,0xe0,0x94,
  94269. +0xe8,0x90,0x91,0x86,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,0x10,0xf0,
  94270. +0x7f,0x00,0x80,0x15,0x90,0x91,0x86,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x0a,
  94271. +0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,
  94272. +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x91,0x1c,0x12,0x43,0x41,0x90,0x91,0x1f,0x12,0x2a,
  94273. +0x8b,0x00,0x00,0x00,0x00,0x90,0x91,0x1c,0x12,0x43,0x21,0x90,0x00,0x01,0x12,0x42,
  94274. +0x20,0x90,0x91,0x3b,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x91,0x25,0xf0,0x90,
  94275. +0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x01,0x90,0x91,0x26,0xf0,0xef,0xc3,0x13,0x54,
  94276. +0x01,0x90,0x91,0x2e,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x13,0x13,0x54,0x01,
  94277. +0x90,0x91,0x2c,0xf0,0x90,0x91,0x2e,0xe0,0x90,0x91,0x1f,0x70,0x26,0x12,0x2a,0x8b,
  94278. +0x00,0x00,0x02,0x10,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  94279. +0x7f,0x60,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x91,0x1f,0x12,0x2a,0x8b,0x00,0x00,0x03,
  94280. +0x10,0x80,0x24,0x12,0x2a,0x8b,0x00,0x00,0x01,0x10,0x90,0x91,0x1f,0x12,0x43,0x09,
  94281. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x60,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x91,0x1f,
  94282. +0x12,0x2a,0x8b,0x00,0x00,0x03,0x00,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,0x85,
  94283. +0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x91,0x26,0xe0,0x70,0x3d,
  94284. +0x90,0x91,0x38,0x74,0x01,0xf0,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x91,0x1f,
  94285. +0x12,0x2a,0x7f,0x90,0x91,0x1f,0x12,0x43,0x09,0xec,0x44,0x02,0xfc,0x90,0x91,0x1f,
  94286. +0x12,0x2a,0x7f,0x90,0x91,0x1f,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  94287. +0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x90,0x91,0x1c,
  94288. +0x12,0x43,0x21,0x12,0x49,0x80,0x90,0x01,0xe5,0xe5,0x70,0xf0,0x90,0x91,0x3b,0xe0,
  94289. +0x90,0x01,0xe6,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0xff,
  94290. +0x30,0xe0,0x25,0x12,0x29,0xd9,0x90,0x91,0x2f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,
  94291. +0x90,0x91,0x30,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x91,0x2d,0xf0,0x90,0x00,0x03,
  94292. +0x12,0x42,0x20,0x90,0x91,0x35,0xf0,0x22,0x90,0x91,0x2f,0x74,0x0a,0xf0,0x90,0x91,
  94293. +0x30,0x74,0x05,0xf0,0x90,0x91,0x2d,0x74,0x14,0xf0,0x90,0x91,0x35,0x74,0x05,0xf0,
  94294. +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x91,
  94295. +0x41,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x42,0xf0,0x90,
  94296. +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x43,0xf0,0x90,0x00,0x03,0x12,
  94297. +0x42,0x20,0xff,0xed,0x2f,0x90,0x91,0x44,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff,
  94298. +0xae,0x05,0xed,0x2f,0x90,0x91,0x45,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  94299. +0x90,0x91,0x47,0xe0,0x90,0x91,0x1d,0xf0,0x90,0x91,0x48,0xe0,0xf5,0x19,0xa3,0xe0,
  94300. +0xf5,0x1a,0xe4,0xf5,0x16,0x74,0x4a,0x25,0x16,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,
  94301. +0xe0,0xff,0x74,0x1b,0x25,0x16,0xf8,0xa6,0x07,0x05,0x16,0xe5,0x16,0xb4,0x04,0xe5,
  94302. +0x90,0x91,0x1d,0xe0,0x12,0x43,0x4a,0x66,0xe6,0x00,0x68,0x13,0x01,0x66,0xee,0x02,
  94303. +0x66,0xee,0x03,0x66,0xee,0x04,0x68,0x13,0x05,0x67,0xe3,0x80,0x67,0xf9,0x81,0x68,
  94304. +0x13,0x82,0x00,0x00,0x68,0x0f,0xaf,0x1e,0x12,0x73,0xdd,0x02,0x68,0x13,0x90,0x91,
  94305. +0x1d,0xe0,0xff,0xb4,0x02,0x08,0x90,0x91,0x1c,0x74,0x01,0xf0,0x80,0x0f,0xef,0x90,
  94306. +0x91,0x1c,0xb4,0x03,0x05,0x74,0x02,0xf0,0x80,0x03,0x74,0x04,0xf0,0xc3,0xe5,0x19,
  94307. +0x94,0x08,0x50,0x4a,0xe4,0xf5,0x16,0x90,0x91,0x1c,0xe0,0xff,0xe5,0x16,0xc3,0x9f,
  94308. +0x40,0x03,0x02,0x68,0x13,0xc3,0xe5,0x19,0x94,0x01,0x50,0x14,0xe5,0x16,0x25,0x1a,
  94309. +0xff,0xc3,0x74,0x03,0x95,0x16,0x24,0x1b,0xf8,0xe6,0xfd,0x12,0x4d,0xa8,0x80,0x1a,
  94310. +0xc3,0x74,0x03,0x95,0x16,0x24,0x1b,0xf8,0xe6,0xff,0xe5,0x16,0x7c,0x00,0x25,0x1a,
  94311. +0xfd,0xec,0x35,0x19,0x8d,0x82,0xf5,0x83,0xef,0xf0,0x05,0x16,0x80,0xb9,0xc3,0xe5,
  94312. +0x19,0x94,0x10,0x40,0x03,0x02,0x68,0x13,0x90,0x91,0x1d,0xe0,0x64,0x04,0x60,0x03,
  94313. +0x02,0x68,0x13,0xaf,0x1c,0xfc,0xfd,0xfe,0x78,0x10,0x12,0x2a,0x6c,0xc0,0x04,0xc0,
  94314. +0x05,0xc0,0x06,0xc0,0x07,0xaf,0x1b,0xe4,0xfc,0xfd,0xfe,0x78,0x18,0x12,0x2a,0x6c,
  94315. +0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,0x42,0xfc,0xc0,0x04,0xc0,0x05,0xc0,
  94316. +0x06,0xc0,0x07,0xaf,0x1d,0xe4,0xfc,0xfd,0xfe,0x78,0x08,0x12,0x2a,0x6c,0xd0,0x03,
  94317. +0xd0,0x02,0xd0,0x01,0xd0,0x00,0x12,0x42,0xfc,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,
  94318. +0x07,0xaf,0x1e,0xe4,0xfc,0xfd,0xfe,0x12,0x42,0xfc,0xa3,0x12,0x2a,0x7f,0x90,0x91,
  94319. +0x1e,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0xaf,0x1a,0xae,0x19,0x12,0x2f,
  94320. +0xd9,0x80,0x30,0xe5,0x1d,0x7f,0x00,0xfe,0xef,0x25,0x1e,0xf5,0x18,0xe4,0x3e,0xf5,
  94321. +0x17,0xaf,0x18,0xfe,0x12,0x37,0x54,0x80,0x1a,0xe5,0x1d,0x7f,0x00,0xfe,0xef,0x25,
  94322. +0x1e,0xf5,0x18,0xe4,0x3e,0xf5,0x17,0xaf,0x18,0xfe,0x12,0x36,0xcb,0x80,0x04,0x7f,
  94323. +0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0x8e,0x0e,0x8f,0x0f,0x8b,0x10,
  94324. +0x8a,0x11,0x89,0x12,0xe4,0x90,0x91,0x11,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4c,
  94325. +0xa0,0xe5,0x0e,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4c,
  94326. +0xa0,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4c,0xa0,0x90,0x00,0x33,0xe0,0x20,
  94327. +0xe7,0x0e,0x90,0x91,0x11,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,
  94328. +0x90,0x91,0x11,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x10,0xaa,
  94329. +0x11,0xa9,0x12,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0x90,0x91,0x98,
  94330. +0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,
  94331. +0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x91,0x99,0xe0,0x94,0xe8,0x90,
  94332. +0x91,0x98,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x37,
  94333. +0x54,0x90,0x91,0x98,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0x7f,0x78,0x7e,
  94334. +0x08,0x12,0x27,0xde,0x90,0x90,0xd8,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,
  94335. +0xde,0x90,0x90,0xdc,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,
  94336. +0xe0,0x12,0x2a,0x7f,0x90,0x91,0x51,0xe0,0x90,0x90,0xd8,0xb4,0x01,0x0d,0x12,0x43,
  94337. +0x09,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x09,0xef,0x54,
  94338. +0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,
  94339. +0x90,0x90,0xdc,0x12,0x43,0x09,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,
  94340. +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,0xe0,0x12,0x43,0x09,0xef,0x44,
  94341. +0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,
  94342. +0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xe4,0x12,0x2a,0x7f,0x90,0x80,0x85,
  94343. +0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,
  94344. +0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x91,
  94345. +0x51,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,
  94346. +0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0xef,0x70,0x02,0x61,0x3d,0x90,0x90,0xe8,0xe0,
  94347. +0x60,0x02,0xe1,0x08,0x90,0x90,0xd4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  94348. +0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x80,0x12,0x43,0x09,0x90,0x80,0x85,
  94349. +0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x84,0x12,0x43,0x09,
  94350. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0x88,
  94351. +0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,
  94352. +0x90,0x90,0x8c,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,
  94353. +0x12,0x2f,0xd9,0x90,0x90,0x90,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  94354. +0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x94,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  94355. +0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x98,0x12,0x43,0x09,0x90,
  94356. +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0x9c,0x12,
  94357. +0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  94358. +0x90,0xa0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,
  94359. +0x2f,0xd9,0x90,0x90,0xa4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,
  94360. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xa8,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,
  94361. +0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xac,0x12,0x43,0x09,0x90,0x80,
  94362. +0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xb0,0x12,0x43,
  94363. +0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,
  94364. +0xb4,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,
  94365. +0xd9,0x90,0x90,0xb8,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,
  94366. +0x0e,0x12,0x2f,0xd9,0x90,0x90,0xbc,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  94367. +0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xc0,0x12,0x43,0x09,0x90,0x80,0x85,
  94368. +0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x90,0xc4,0x12,0x43,0x09,
  94369. +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x90,0xc8,
  94370. +0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,
  94371. +0x90,0x90,0xcc,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,
  94372. +0x12,0x2f,0xd9,0x90,0x90,0xd0,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  94373. +0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x90,0xe8,0x74,0x01,0xf0,0x22,0x90,0x90,0xe8,
  94374. +0xe0,0x64,0x01,0x60,0x02,0xe1,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,
  94375. +0xd4,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0x80,0x12,0x2a,
  94376. +0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x90,0x84,0x12,0x2a,0x7f,0x7f,0x6c,
  94377. +0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x88,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,
  94378. +0x27,0xde,0x90,0x90,0x8c,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,
  94379. +0x90,0x90,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x94,0x12,
  94380. +0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x98,0x12,0x2a,0x7f,0x7f,
  94381. +0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0x9c,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,
  94382. +0x12,0x27,0xde,0x90,0x90,0xa0,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,
  94383. +0x90,0x90,0xa4,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xa8,
  94384. +0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xac,0x12,0x2a,0x7f,
  94385. +0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xb0,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,
  94386. +0x0e,0x12,0x27,0xde,0x90,0x90,0xb4,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,
  94387. +0xde,0x90,0x90,0xb8,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,
  94388. +0xbc,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x90,0xc0,0x12,0x2a,
  94389. +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x90,0xc4,0x12,0x2a,0x7f,0x7f,0x04,
  94390. +0x7e,0x0d,0x12,0x27,0xde,0x90,0x90,0xc8,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,
  94391. +0x27,0xde,0x90,0x90,0xcc,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,
  94392. +0x90,0xd0,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x91,0x88,0x12,
  94393. +0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x44,0xc0,0xfd,0xec,0x90,0x91,0x88,
  94394. +0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,
  94395. +0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,
  94396. +0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,
  94397. +0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,
  94398. +0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,
  94399. +0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,
  94400. +0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,
  94401. +0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,
  94402. +0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,
  94403. +0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,
  94404. +0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,
  94405. +0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,
  94406. +0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,
  94407. +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,
  94408. +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,
  94409. +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,
  94410. +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,
  94411. +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,
  94412. +0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,
  94413. +0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x91,
  94414. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,0x91,0x88,
  94415. +0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,0x90,0x91,
  94416. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,
  94417. +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x91,
  94418. +0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,
  94419. +0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,
  94420. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  94421. +0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  94422. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xe4,0xff,0xec,0x90,
  94423. +0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x11,0xff,0xec,
  94424. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,
  94425. +0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,
  94426. +0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,0xed,0x54,0x0f,0xfd,
  94427. +0xec,0x54,0xf0,0xfc,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,0x88,0x12,0x43,0x09,
  94428. +0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,
  94429. +0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,
  94430. +0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,0x91,
  94431. +0x88,0x12,0x43,0x09,0xef,0x54,0xf0,0xff,0xec,0x90,0x91,0x88,0x12,0x2a,0x7f,0x90,
  94432. +0x91,0x88,0x12,0x43,0x09,0xef,0x44,0x01,0xff,0xec,0x90,0x91,0x88,0x12,0x2a,0x7f,
  94433. +0x90,0x91,0x88,0x12,0x43,0x09,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,
  94434. +0x12,0x2f,0xd9,0xe4,0x90,0x90,0xe8,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,
  94435. +0x90,0x91,0xa0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8,0x07,
  94436. +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x12,
  94437. +0x4c,0xa0,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,
  94438. +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe,0xef,
  94439. +0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0x80,
  94440. +0x44,0x90,0x91,0xa0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,
  94441. +0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4c,0x98,0x90,0x91,0xa0,0xe0,0xfd,0x74,0x01,0x7e,
  94442. +0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,
  94443. +0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,
  94444. +0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x4d,
  94445. +0xa8,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x90,0xf7,0xf0,0x90,0x90,0xfd,0xf0,
  94446. +0x90,0x91,0x00,0xf0,0x90,0x90,0xfe,0xf0,0x90,0x91,0x01,0xf0,0x90,0x90,0xff,0xf0,
  94447. +0x90,0x91,0x02,0xf0,0x90,0x90,0xe9,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,
  94448. +0x90,0x90,0xee,0xf0,0x90,0x90,0xf3,0xf0,0x90,0x90,0xf5,0xf0,0x90,0x91,0x07,0xf0,
  94449. +0x90,0x90,0xf8,0xf0,0x90,0x90,0xf4,0xf0,0x90,0x90,0xed,0xf0,0x90,0x00,0x51,0xe0,
  94450. +0x44,0xc0,0xfd,0x7f,0x51,0x02,0x4d,0xa8,0x90,0x91,0x07,0xe0,0x64,0x01,0x60,0x08,
  94451. +0x90,0x90,0xf5,0xe0,0x60,0x02,0x01,0xdf,0x90,0x90,0xe9,0xe0,0xc3,0x94,0xff,0x50,
  94452. +0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x90,0xea,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,
  94453. +0x04,0xf0,0xe4,0x80,0x28,0x90,0x90,0xeb,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,
  94454. +0xf0,0xe4,0x90,0x90,0xea,0xf0,0x80,0x15,0x90,0x90,0xec,0xe0,0xc3,0x94,0xff,0x50,
  94455. +0x10,0xe0,0x04,0xf0,0xe4,0x90,0x90,0xeb,0xf0,0x90,0x90,0xea,0xf0,0x90,0x90,0xe9,
  94456. +0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x90,0xfd,
  94457. +0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x90,0xfe,0xe0,0xc3,
  94458. +0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x90,0xff,0xe0,0xc3,0x94,
  94459. +0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x90,0xfe,0xf0,0x90,0x90,0xfd,0xf0,0x90,
  94460. +0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x91,0x00,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,
  94461. +0x04,0xf0,0x80,0x24,0x90,0x91,0x01,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,
  94462. +0xe4,0x80,0x11,0x90,0x91,0x02,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,
  94463. +0x90,0x91,0x01,0xf0,0x90,0x91,0x00,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,
  94464. +0xe5,0x6e,0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0x02,0x47,0xc9,0x90,0x91,
  94465. +0x53,0xe0,0x30,0xe0,0x49,0xe5,0x6d,0x64,0x01,0x70,0x43,0x90,0x91,0x52,0xe0,0x04,
  94466. +0xf0,0xe5,0x70,0x64,0x03,0x60,0x05,0xe5,0x70,0xb4,0x06,0x0d,0x90,0x91,0x52,0xe0,
  94467. +0xff,0x74,0x01,0xd3,0x9f,0x50,0x14,0x80,0x07,0x90,0x91,0x52,0xe0,0xb4,0x0a,0x0b,
  94468. +0x90,0x91,0x55,0xe0,0x04,0xf0,0xe4,0x90,0x91,0x52,0xf0,0x90,0x91,0x55,0xe0,0xff,
  94469. +0x90,0x91,0x54,0xe0,0xb5,0x07,0x07,0x11,0xe0,0xe4,0x90,0x91,0x55,0xf0,0x22,0x90,
  94470. +0x06,0x90,0xe0,0x44,0x01,0xf0,0x90,0x91,0x61,0xe0,0x30,0xe0,0x3c,0x90,0x91,0x5f,
  94471. +0xe0,0xff,0x90,0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x54,0x01,0xfd,0x12,0x4c,0xb0,0x90,
  94472. +0x91,0x60,0xe0,0x75,0xf0,0x20,0xa4,0xff,0xae,0xf0,0x12,0x37,0x54,0x90,0x91,0x5e,
  94473. +0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07,0xa3,0xe0,0xff,0xe4,0xfd,0x80,0x07,0x90,
  94474. +0x91,0x5f,0xe0,0xff,0x7d,0x01,0x12,0x4c,0xb0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,
  94475. +0xd0,0xe4,0x90,0x91,0x19,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0xe4,0xa3,0xf0,0x90,
  94476. +0x01,0x1f,0xe0,0xfe,0x90,0x01,0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,
  94477. +0x91,0x11,0xf0,0xa3,0xef,0xf0,0x90,0x02,0x87,0xe0,0x90,0x91,0x18,0xf0,0x90,0x91,
  94478. +0x56,0xe0,0x20,0xe0,0x02,0x61,0xb7,0xe4,0x90,0x91,0x17,0xf0,0x90,0x91,0x18,0xe0,
  94479. +0xff,0x90,0x91,0x17,0xe0,0xc3,0x9f,0x40,0x02,0x61,0xb7,0x90,0x91,0x11,0xe0,0xfc,
  94480. +0xa3,0xe0,0xfd,0xec,0xff,0x90,0xfd,0x11,0xf0,0x90,0x91,0x1c,0xef,0xf0,0x74,0x02,
  94481. +0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc,0x33,0x33,0x33,0x54,
  94482. +0xf8,0xff,0xed,0x24,0x18,0x2f,0x90,0x91,0x15,0xf0,0xe0,0x24,0x00,0xf5,0x82,0xe4,
  94483. +0x34,0xfb,0xf5,0x83,0xe0,0x54,0xfc,0x90,0x91,0x16,0xf0,0x74,0x01,0x2d,0xf5,0x82,
  94484. +0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  94485. +0x83,0xe0,0x7a,0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab,0x07,0xfa,0x90,0x91,
  94486. +0x13,0xf0,0xa3,0xeb,0xf0,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,
  94487. +0x35,0xf0,0xfe,0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x91,0x5a,0xe0,0xfe,0xa3,0xe0,
  94488. +0xff,0xad,0x03,0xac,0x02,0x12,0x45,0x09,0xaa,0x06,0xab,0x07,0x90,0x91,0x15,0xe0,
  94489. +0x24,0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x30,0xe7,0x08,0x90,0x91,0x19,
  94490. +0x74,0x02,0xf0,0x80,0x05,0xe4,0x90,0x91,0x19,0xf0,0xaf,0x03,0x90,0x91,0x11,0xea,
  94491. +0x8f,0xf0,0x12,0x42,0x81,0x90,0x91,0x5c,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x91,0x11,
  94492. +0xe0,0xfc,0xa3,0xe0,0xfd,0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x91,0x5d,0xe0,0x24,
  94493. +0x01,0xff,0x90,0x91,0x5c,0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,
  94494. +0x91,0x11,0xf0,0xa3,0xef,0xf0,0x90,0x91,0x16,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,
  94495. +0x20,0x70,0x27,0x90,0x91,0x5e,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x20,0xe0,
  94496. +0x02,0x61,0x8f,0xef,0x90,0x00,0x81,0xb4,0xa0,0x05,0xe0,0x44,0x04,0x80,0x03,0xe0,
  94497. +0x44,0x08,0xfd,0x7f,0x81,0x12,0x4d,0xa8,0x61,0x88,0x90,0x91,0x5e,0xe0,0xc4,0x13,
  94498. +0x13,0x54,0x03,0x20,0xe0,0x02,0x61,0x8f,0x90,0x91,0x15,0xe0,0xff,0x24,0x00,0xf5,
  94499. +0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0c,0x64,0x08,0x70,0x72,0x90,0x91,0x19,
  94500. +0xe0,0xfe,0xef,0x2e,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x1e,0xf5,0x82,0xe4,0x34,0xfb,
  94501. +0xf5,0x83,0xe0,0x64,0x88,0x70,0x58,0x74,0x1f,0x2f,0xf5,0x82,0xe4,0x34,0xfb,0xf5,
  94502. +0x83,0xe0,0x64,0x8e,0x70,0x49,0x90,0x91,0x19,0xe0,0xff,0x90,0x91,0x15,0xe0,0x2f,
  94503. +0xff,0x90,0x91,0x1a,0xe0,0x2f,0xff,0xa3,0xe0,0x2f,0xff,0x24,0x19,0xf5,0x82,0xe4,
  94504. +0x34,0xfb,0xf5,0x83,0xe0,0x64,0x03,0x70,0x26,0x74,0x1e,0x2f,0xf5,0x82,0xe4,0x34,
  94505. +0xfb,0xf5,0x83,0xe0,0x90,0x00,0x81,0x30,0xe3,0x05,0xe0,0x44,0x01,0x80,0x03,0xe0,
  94506. +0x44,0x02,0xfd,0x7f,0x81,0x12,0x4d,0xa8,0x90,0x91,0x56,0xe0,0x44,0x80,0xf0,0x90,
  94507. +0x91,0x56,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x31,0x3f,0x71,
  94508. +0xbc,0xbf,0x01,0x13,0x90,0x91,0x11,0xe0,0xfe,0xa3,0xe0,0xff,0x12,0x44,0xb5,0x90,
  94509. +0x91,0x17,0xe0,0x04,0xf0,0x21,0xcc,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x91,0x56,0xe0,
  94510. +0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x11,0xe0,0x44,0x80,0xf0,0x90,0x91,0x5e,
  94511. +0xe0,0xc4,0x54,0x0f,0x20,0xe0,0x03,0x7f,0x00,0x22,0x7f,0x01,0x22,0x8f,0x1f,0xe4,
  94512. +0x90,0x91,0x22,0xf0,0xe5,0x1f,0x14,0xfe,0x90,0x91,0x22,0xe0,0xff,0xc3,0x9e,0x50,
  94513. +0x0e,0xef,0x04,0xfd,0x12,0x34,0xb7,0x90,0x91,0x22,0xe0,0x04,0xf0,0x80,0xe5,0xe5,
  94514. +0x1f,0x14,0xff,0x7d,0xff,0x12,0x34,0xb7,0x90,0x91,0x22,0xe5,0x1f,0xf0,0x90,0x91,
  94515. +0x22,0xe0,0xc3,0x94,0xff,0x50,0x0f,0xe0,0xff,0x04,0xfd,0x12,0x34,0xb7,0x90,0x91,
  94516. +0x22,0xe0,0x04,0xf0,0x80,0xe8,0xad,0x1f,0x7f,0xff,0x02,0x34,0xb7,0xc3,0xee,0x94,
  94517. +0x01,0x40,0x0a,0x0d,0xed,0x13,0x90,0xfd,0x10,0xf0,0xe4,0x2f,0xff,0x22,0xc3,0xee,
  94518. +0x94,0x01,0x40,0x1e,0x90,0xfd,0x11,0xe0,0xb5,0x05,0x14,0x90,0x01,0x17,0xe0,0xb5,
  94519. +0x05,0x07,0x90,0xfd,0x11,0xe4,0xf0,0x80,0x06,0xed,0x04,0x90,0xfd,0x11,0xf0,0xe4,
  94520. +0x2f,0xff,0x22,0x00,0x18,0x58,};
  94521. --- /dev/null
  94522. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c
  94523. @@ -0,0 +1,2674 @@
  94524. +/******************************************************************************
  94525. + *
  94526. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  94527. + *
  94528. + * This program is free software; you can redistribute it and/or modify it
  94529. + * under the terms of version 2 of the GNU General Public License as
  94530. + * published by the Free Software Foundation.
  94531. + *
  94532. + * This program is distributed in the hope that it will be useful, but WITHOUT
  94533. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  94534. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  94535. + * more details.
  94536. + *
  94537. + * You should have received a copy of the GNU General Public License along with
  94538. + * this program; if not, write to the Free Software Foundation, Inc.,
  94539. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  94540. + *
  94541. + *
  94542. + ******************************************************************************/
  94543. +
  94544. +#include "drv_types.h"
  94545. +#include "rtl8192c_hal.h"
  94546. +
  94547. +//================================================================================
  94548. +// Constant.
  94549. +//================================================================================
  94550. +
  94551. +//
  94552. +// Default LED behavior.
  94553. +//
  94554. +#define LED_BLINK_NORMAL_INTERVAL 100
  94555. +#define LED_BLINK_SLOWLY_INTERVAL 200
  94556. +#define LED_BLINK_LONG_INTERVAL 400
  94557. +
  94558. +#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000
  94559. +#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500
  94560. +#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150
  94561. +#define LED_BLINK_FASTER_INTERVAL_ALPHA 50
  94562. +#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000
  94563. +
  94564. +//================================================================================
  94565. +// LED object.
  94566. +//================================================================================
  94567. +
  94568. +
  94569. +//================================================================================
  94570. +// Prototype of protected function.
  94571. +//================================================================================
  94572. +
  94573. +
  94574. +static void
  94575. +BlinkTimerCallback(
  94576. + unsigned long data
  94577. + );
  94578. +
  94579. +static void
  94580. +BlinkWorkItemCallback(
  94581. + struct work_struct *work
  94582. + );
  94583. +
  94584. +//
  94585. +// Description:
  94586. +// Reset blinking status of LED_871x object.
  94587. +//
  94588. +static void
  94589. +ResetLedStatus(PLED_871x pLed) {
  94590. + pLed->CurrLedState = RTW_LED_OFF; // Current LED state.
  94591. + pLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF.
  94592. +
  94593. + pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w..
  94594. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  94595. + pLed->bLedLinkBlinkInProgress = _FALSE;
  94596. + pLed->bLedStartToLinkBlinkInProgress = _FALSE;
  94597. + pLed->bLedScanBlinkInProgress = _FALSE;
  94598. + pLed->bLedWPSBlinkInProgress = _FALSE;
  94599. + pLed->BlinkTimes = 0; // Number of times to toggle led state for blinking.
  94600. + pLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are.
  94601. +}
  94602. +
  94603. +//================================================================================
  94604. +// LED_819xUsb routines.
  94605. +//================================================================================
  94606. +
  94607. +//
  94608. +// Description:
  94609. +// Initialize an LED_871x object.
  94610. +//
  94611. +static void
  94612. +InitLed871x(
  94613. + _adapter *padapter,
  94614. + PLED_871x pLed,
  94615. + LED_PIN_871x LedPin
  94616. + )
  94617. +{
  94618. + pLed->padapter = padapter;
  94619. + pLed->LedPin = LedPin;
  94620. +
  94621. + ResetLedStatus(pLed);
  94622. +
  94623. + _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed);
  94624. + _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);
  94625. +}
  94626. +
  94627. +
  94628. +//
  94629. +// Description:
  94630. +// DeInitialize an LED_871x object.
  94631. +//
  94632. +static void
  94633. +DeInitLed871x(
  94634. + PLED_871x pLed
  94635. + )
  94636. +{
  94637. + //call _cancel_workitem_sync(&(pLed->BlinkWorkItem))
  94638. + //before _cancel_timer_ex(&(pLed->BlinkTimer)) to
  94639. + //avoid led timer restarting when driver is removed
  94640. +
  94641. + _cancel_workitem_sync(&(pLed->BlinkWorkItem));
  94642. +
  94643. + _cancel_timer_ex(&(pLed->BlinkTimer));
  94644. +
  94645. + // We should reset bLedBlinkInProgress if we cancel the LedControlTimer, 2005.03.10, by rcnjko.
  94646. + ResetLedStatus(pLed);
  94647. +}
  94648. +
  94649. +//
  94650. +// Description:
  94651. +// Turn on LED according to LedPin specified.
  94652. +//
  94653. +static void
  94654. +SwLedOn(
  94655. + _adapter *padapter,
  94656. + PLED_871x pLed
  94657. +)
  94658. +{
  94659. + u8 LedCfg;
  94660. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  94661. +
  94662. + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
  94663. + {
  94664. + return;
  94665. + }
  94666. +
  94667. + if( (BOARD_MINICARD == pHalData->BoardType )||
  94668. + (BOARD_USB_SOLO == pHalData->BoardType)||
  94669. + (BOARD_USB_COMBO == pHalData->BoardType))
  94670. + {
  94671. + LedCfg = rtw_read8(padapter, REG_LEDCFG2);
  94672. + switch(pLed->LedPin)
  94673. + {
  94674. + case LED_PIN_GPIO0:
  94675. + break;
  94676. +
  94677. + case LED_PIN_LED0:
  94678. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xf0)|BIT5|BIT6); // SW control led0 on.
  94679. + break;
  94680. +
  94681. + case LED_PIN_LED1:
  94682. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0x0f)|BIT5); // SW control led1 on.
  94683. + break;
  94684. +
  94685. + default:
  94686. + break;
  94687. +
  94688. + }
  94689. + }
  94690. + else
  94691. + {
  94692. + switch(pLed->LedPin)
  94693. + {
  94694. + case LED_PIN_GPIO0:
  94695. + break;
  94696. +
  94697. + case LED_PIN_LED0:
  94698. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  94699. + if(pHalData->AntDivCfg)
  94700. + {
  94701. + LedCfg = rtw_read8(padapter, REG_LEDCFG2);
  94702. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xe0)|BIT7|BIT6|BIT5); // SW control led0 on.
  94703. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2)));
  94704. + }
  94705. + else
  94706. +#endif
  94707. + {
  94708. + LedCfg = rtw_read8(padapter, REG_LEDCFG0);
  94709. + rtw_write8(padapter,REG_LEDCFG0, LedCfg&0x70); // SW control led0 on.
  94710. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0)));
  94711. + }
  94712. + break;
  94713. +
  94714. + case LED_PIN_LED1:
  94715. + LedCfg = rtw_read8(padapter,(REG_LEDCFG1));
  94716. + rtw_write8(padapter,(REG_LEDCFG1), LedCfg&0x70); // SW control led1 on.
  94717. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0)));
  94718. +
  94719. + break;
  94720. +
  94721. + default:
  94722. + break;
  94723. + }
  94724. + }
  94725. + pLed->bLedOn = _TRUE;
  94726. +
  94727. +}
  94728. +
  94729. +
  94730. +//
  94731. +// Description:
  94732. +// Turn off LED according to LedPin specified.
  94733. +//
  94734. +static void
  94735. +SwLedOff(
  94736. + _adapter *padapter,
  94737. + PLED_871x pLed
  94738. +)
  94739. +{
  94740. + u8 LedCfg;
  94741. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  94742. +
  94743. + if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
  94744. + {
  94745. + goto exit;
  94746. + }
  94747. +
  94748. + if( (BOARD_MINICARD == pHalData->BoardType )||
  94749. + (BOARD_USB_SOLO == pHalData->BoardType)||
  94750. + (BOARD_USB_COMBO == pHalData->BoardType))
  94751. + {
  94752. + LedCfg = rtw_read8(padapter, REG_LEDCFG2);//0x4E
  94753. +
  94754. + switch(pLed->LedPin)
  94755. + {
  94756. +
  94757. + case LED_PIN_GPIO0:
  94758. + break;
  94759. +
  94760. + case LED_PIN_LED0:
  94761. + if(BOARD_USB_COMBO == pHalData->BoardType)
  94762. + {
  94763. + LedCfg &= 0x90; // Set to software control.
  94764. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3));
  94765. + LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG);
  94766. + LedCfg &= 0xFE;
  94767. + rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg);
  94768. + }
  94769. + else
  94770. + {
  94771. + LedCfg &= 0xf0; // Set to software control.
  94772. + if(pHalData->bLedOpenDrain == _TRUE) // Open-drain arrangement for controlling the LED
  94773. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT1|BIT5|BIT6));
  94774. + else
  94775. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT5|BIT6));
  94776. + }
  94777. + break;
  94778. +
  94779. + case LED_PIN_LED1:
  94780. + LedCfg &= 0x0f; // Set to software control.
  94781. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3));
  94782. + break;
  94783. +
  94784. + default:
  94785. + break;
  94786. + }
  94787. + }
  94788. + else
  94789. + {
  94790. + switch(pLed->LedPin)
  94791. + {
  94792. + case LED_PIN_GPIO0:
  94793. + break;
  94794. +
  94795. + case LED_PIN_LED0:
  94796. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  94797. + if(pHalData->AntDivCfg)
  94798. + {
  94799. + LedCfg = rtw_read8(padapter, REG_LEDCFG2);
  94800. + LedCfg &= 0xe0; // Set to software control.
  94801. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT7|BIT6|BIT5));
  94802. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2)));
  94803. + }
  94804. + else
  94805. +#endif
  94806. + {
  94807. + LedCfg = rtw_read8(padapter, REG_LEDCFG0);
  94808. + LedCfg &= 0x70; // Set to software control.
  94809. + rtw_write8(padapter, REG_LEDCFG0, (LedCfg|BIT3));
  94810. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0)));
  94811. + }
  94812. + break;
  94813. +
  94814. + case LED_PIN_LED1:
  94815. + LedCfg = rtw_read8(padapter, (REG_LEDCFG1));
  94816. + LedCfg &= 0x70; // Set to software control.
  94817. + rtw_write8(padapter, (REG_LEDCFG1), (LedCfg|BIT3));
  94818. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0)));
  94819. + break;
  94820. +
  94821. + default:
  94822. + break;
  94823. + }
  94824. + }
  94825. +
  94826. +exit:
  94827. + pLed->bLedOn = _FALSE;
  94828. +
  94829. +}
  94830. +
  94831. +//================================================================================
  94832. +// Interface to manipulate LED objects.
  94833. +//================================================================================
  94834. +
  94835. +
  94836. +//
  94837. +// Description:
  94838. +// Implementation of LED blinking behavior.
  94839. +// It toggle off LED and schedule corresponding timer if necessary.
  94840. +//
  94841. +static void
  94842. +SwLedBlink(
  94843. + PLED_871x pLed
  94844. + )
  94845. +{
  94846. + _adapter *padapter = pLed->padapter;
  94847. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  94848. + u8 bStopBlinking = _FALSE;
  94849. +
  94850. + // Change LED according to BlinkingLedState specified.
  94851. + if( pLed->BlinkingLedState == RTW_LED_ON )
  94852. + {
  94853. + SwLedOn(padapter, pLed);
  94854. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  94855. + }
  94856. + else
  94857. + {
  94858. + SwLedOff(padapter, pLed);
  94859. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  94860. + }
  94861. +
  94862. + // Determine if we shall change LED state again.
  94863. + pLed->BlinkTimes--;
  94864. + switch(pLed->CurrLedState)
  94865. + {
  94866. +
  94867. + case LED_BLINK_NORMAL:
  94868. + if(pLed->BlinkTimes == 0)
  94869. + {
  94870. + bStopBlinking = _TRUE;
  94871. + }
  94872. + break;
  94873. +
  94874. + case LED_BLINK_StartToBlink:
  94875. + if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) )
  94876. + {
  94877. + bStopBlinking = _TRUE;
  94878. + }
  94879. + if( check_fwstate(pmlmepriv, _FW_LINKED) &&
  94880. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) )
  94881. + {
  94882. + bStopBlinking = _TRUE;
  94883. + }
  94884. + else if(pLed->BlinkTimes == 0)
  94885. + {
  94886. + bStopBlinking = _TRUE;
  94887. + }
  94888. + break;
  94889. +
  94890. + case LED_BLINK_WPS:
  94891. + if( pLed->BlinkTimes == 0 )
  94892. + {
  94893. + bStopBlinking = _TRUE;
  94894. + }
  94895. + break;
  94896. +
  94897. +
  94898. + default:
  94899. + bStopBlinking = _TRUE;
  94900. + break;
  94901. +
  94902. + }
  94903. +
  94904. + if(bStopBlinking)
  94905. + {
  94906. + //if( padapter->pwrctrlpriv.cpwm >= PS_STATE_S2)
  94907. + if(0)
  94908. + {
  94909. + SwLedOff(padapter, pLed);
  94910. + }
  94911. + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE))
  94912. + {
  94913. + SwLedOn(padapter, pLed);
  94914. + }
  94915. + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE)
  94916. + {
  94917. + SwLedOff(padapter, pLed);
  94918. + }
  94919. +
  94920. + pLed->BlinkTimes = 0;
  94921. + pLed->bLedBlinkInProgress = _FALSE;
  94922. + }
  94923. + else
  94924. + {
  94925. + // Assign LED state to toggle.
  94926. + if( pLed->BlinkingLedState == RTW_LED_ON )
  94927. + pLed->BlinkingLedState = RTW_LED_OFF;
  94928. + else
  94929. + pLed->BlinkingLedState = RTW_LED_ON;
  94930. +
  94931. + // Schedule a timer to toggle LED state.
  94932. + switch( pLed->CurrLedState )
  94933. + {
  94934. + case LED_BLINK_NORMAL:
  94935. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  94936. + break;
  94937. +
  94938. + case LED_BLINK_SLOWLY:
  94939. + case LED_BLINK_StartToBlink:
  94940. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  94941. + break;
  94942. +
  94943. + case LED_BLINK_WPS:
  94944. + {
  94945. + if( pLed->BlinkingLedState == RTW_LED_ON )
  94946. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
  94947. + else
  94948. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
  94949. + }
  94950. + break;
  94951. +
  94952. + default:
  94953. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  94954. + break;
  94955. + }
  94956. + }
  94957. +}
  94958. +
  94959. +
  94960. +static void
  94961. +SwLedBlink1(
  94962. + PLED_871x pLed
  94963. + )
  94964. +{
  94965. + _adapter *padapter = pLed->padapter;
  94966. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  94967. + struct led_priv *ledpriv = &(padapter->ledpriv);
  94968. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  94969. + PLED_871x pLed1 = &(ledpriv->SwLed1);
  94970. + u8 bStopBlinking = _FALSE;
  94971. +
  94972. + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
  94973. + pLed = &(ledpriv->SwLed1);
  94974. +
  94975. + // Change LED according to BlinkingLedState specified.
  94976. + if( pLed->BlinkingLedState == RTW_LED_ON )
  94977. + {
  94978. + SwLedOn(padapter, pLed);
  94979. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  94980. + }
  94981. + else
  94982. + {
  94983. + SwLedOff(padapter, pLed);
  94984. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  94985. + }
  94986. +
  94987. +
  94988. + if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT)
  94989. + {
  94990. + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  94991. + {
  94992. + if(!pLed1->bSWLedCtrl)
  94993. + {
  94994. + SwLedOn(padapter, pLed1);
  94995. + pLed1->bSWLedCtrl = _TRUE;
  94996. + }
  94997. + else if(!pLed1->bLedOn)
  94998. + SwLedOn(padapter, pLed1);
  94999. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n"));
  95000. + }
  95001. + else
  95002. + {
  95003. + if(!pLed1->bSWLedCtrl)
  95004. + {
  95005. + SwLedOff(padapter, pLed1);
  95006. + pLed1->bSWLedCtrl = _TRUE;
  95007. + }
  95008. + else if(pLed1->bLedOn)
  95009. + SwLedOff(padapter, pLed1);
  95010. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n"));
  95011. + }
  95012. + }
  95013. +
  95014. +
  95015. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95016. + {
  95017. + SwLedOff(padapter, pLed);
  95018. + ResetLedStatus(pLed);
  95019. + return;
  95020. + }
  95021. +
  95022. +
  95023. + switch(pLed->CurrLedState)
  95024. + {
  95025. + case LED_BLINK_SLOWLY:
  95026. + if( pLed->bLedOn )
  95027. + pLed->BlinkingLedState = RTW_LED_OFF;
  95028. + else
  95029. + pLed->BlinkingLedState = RTW_LED_ON;
  95030. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95031. + break;
  95032. +
  95033. + case LED_BLINK_NORMAL:
  95034. + if( pLed->bLedOn )
  95035. + pLed->BlinkingLedState = RTW_LED_OFF;
  95036. + else
  95037. + pLed->BlinkingLedState = RTW_LED_ON;
  95038. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  95039. + break;
  95040. +
  95041. + case LED_SCAN_BLINK:
  95042. + pLed->BlinkTimes--;
  95043. + if( pLed->BlinkTimes == 0 )
  95044. + {
  95045. + bStopBlinking = _TRUE;
  95046. + }
  95047. +
  95048. + if(bStopBlinking)
  95049. + {
  95050. + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95051. + {
  95052. + pLed->bLedLinkBlinkInProgress = _TRUE;
  95053. + pLed->CurrLedState = LED_BLINK_NORMAL;
  95054. + if( pLed->bLedOn )
  95055. + pLed->BlinkingLedState = RTW_LED_OFF;
  95056. + else
  95057. + pLed->BlinkingLedState = RTW_LED_ON;
  95058. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  95059. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95060. +
  95061. + }
  95062. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95063. + {
  95064. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  95065. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  95066. + if( pLed->bLedOn )
  95067. + pLed->BlinkingLedState = RTW_LED_OFF;
  95068. + else
  95069. + pLed->BlinkingLedState = RTW_LED_ON;
  95070. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95071. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95072. + }
  95073. + pLed->bLedScanBlinkInProgress = _FALSE;
  95074. + }
  95075. + else
  95076. + {
  95077. + if( pLed->bLedOn )
  95078. + pLed->BlinkingLedState = RTW_LED_OFF;
  95079. + else
  95080. + pLed->BlinkingLedState = RTW_LED_ON;
  95081. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95082. + }
  95083. + break;
  95084. +
  95085. + case LED_TXRX_BLINK:
  95086. + pLed->BlinkTimes--;
  95087. + if( pLed->BlinkTimes == 0 )
  95088. + {
  95089. + bStopBlinking = _TRUE;
  95090. + }
  95091. + if(bStopBlinking)
  95092. + {
  95093. + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95094. + {
  95095. + pLed->bLedLinkBlinkInProgress = _TRUE;
  95096. + pLed->CurrLedState = LED_BLINK_NORMAL;
  95097. + if( pLed->bLedOn )
  95098. + pLed->BlinkingLedState = RTW_LED_OFF;
  95099. + else
  95100. + pLed->BlinkingLedState = RTW_LED_ON;
  95101. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  95102. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95103. + }
  95104. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95105. + {
  95106. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  95107. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  95108. + if( pLed->bLedOn )
  95109. + pLed->BlinkingLedState = RTW_LED_OFF;
  95110. + else
  95111. + pLed->BlinkingLedState = RTW_LED_ON;
  95112. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95113. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95114. + }
  95115. + pLed->BlinkTimes = 0;
  95116. + pLed->bLedBlinkInProgress = _FALSE;
  95117. + }
  95118. + else
  95119. + {
  95120. + if( pLed->bLedOn )
  95121. + pLed->BlinkingLedState = RTW_LED_OFF;
  95122. + else
  95123. + pLed->BlinkingLedState = RTW_LED_ON;
  95124. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95125. + }
  95126. + break;
  95127. +
  95128. + case LED_BLINK_WPS:
  95129. + if( pLed->bLedOn )
  95130. + pLed->BlinkingLedState = RTW_LED_OFF;
  95131. + else
  95132. + pLed->BlinkingLedState = RTW_LED_ON;
  95133. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95134. + break;
  95135. +
  95136. + case LED_BLINK_WPS_STOP: //WPS success
  95137. + if(pLed->BlinkingLedState == RTW_LED_ON)
  95138. + bStopBlinking = _FALSE;
  95139. + else
  95140. + bStopBlinking = _TRUE;
  95141. +
  95142. + if(bStopBlinking)
  95143. + {
  95144. + pLed->bLedLinkBlinkInProgress = _TRUE;
  95145. + pLed->CurrLedState = LED_BLINK_NORMAL;
  95146. + if( pLed->bLedOn )
  95147. + pLed->BlinkingLedState = RTW_LED_OFF;
  95148. + else
  95149. + pLed->BlinkingLedState = RTW_LED_ON;
  95150. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  95151. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95152. +
  95153. + pLed->bLedWPSBlinkInProgress = _FALSE;
  95154. + }
  95155. + else
  95156. + {
  95157. + pLed->BlinkingLedState = RTW_LED_OFF;
  95158. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
  95159. + }
  95160. + break;
  95161. +
  95162. + default:
  95163. + break;
  95164. + }
  95165. +
  95166. +}
  95167. +
  95168. +static void
  95169. +SwLedBlink2(
  95170. + PLED_871x pLed
  95171. + )
  95172. +{
  95173. + _adapter *padapter = pLed->padapter;
  95174. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  95175. + u8 bStopBlinking = _FALSE;
  95176. +
  95177. + // Change LED according to BlinkingLedState specified.
  95178. + if( pLed->BlinkingLedState == RTW_LED_ON)
  95179. + {
  95180. + SwLedOn(padapter, pLed);
  95181. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  95182. + }
  95183. + else
  95184. + {
  95185. + SwLedOff(padapter, pLed);
  95186. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  95187. + }
  95188. +
  95189. + switch(pLed->CurrLedState)
  95190. + {
  95191. + case LED_SCAN_BLINK:
  95192. + pLed->BlinkTimes--;
  95193. + if( pLed->BlinkTimes == 0 )
  95194. + {
  95195. + bStopBlinking = _TRUE;
  95196. + }
  95197. +
  95198. + if(bStopBlinking)
  95199. + {
  95200. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95201. + {
  95202. + SwLedOff(padapter, pLed);
  95203. + }
  95204. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95205. + {
  95206. + pLed->CurrLedState = RTW_LED_ON;
  95207. + pLed->BlinkingLedState = RTW_LED_ON;
  95208. + SwLedOn(padapter, pLed);
  95209. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
  95210. +
  95211. + }
  95212. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95213. + {
  95214. + pLed->CurrLedState = RTW_LED_OFF;
  95215. + pLed->BlinkingLedState = RTW_LED_OFF;
  95216. + SwLedOff(padapter, pLed);
  95217. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState));
  95218. + }
  95219. + pLed->bLedScanBlinkInProgress = _FALSE;
  95220. + }
  95221. + else
  95222. + {
  95223. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95224. + {
  95225. + SwLedOff(padapter, pLed);
  95226. + }
  95227. + else
  95228. + {
  95229. + if( pLed->bLedOn )
  95230. + pLed->BlinkingLedState = RTW_LED_OFF;
  95231. + else
  95232. + pLed->BlinkingLedState = RTW_LED_ON;
  95233. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95234. + }
  95235. + }
  95236. + break;
  95237. +
  95238. + case LED_TXRX_BLINK:
  95239. + pLed->BlinkTimes--;
  95240. + if( pLed->BlinkTimes == 0 )
  95241. + {
  95242. + bStopBlinking = _TRUE;
  95243. + }
  95244. + if(bStopBlinking)
  95245. + {
  95246. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95247. + {
  95248. + SwLedOff(padapter, pLed);
  95249. + }
  95250. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95251. + {
  95252. + pLed->CurrLedState = RTW_LED_ON;
  95253. + pLed->BlinkingLedState = RTW_LED_ON;
  95254. + SwLedOn(padapter, pLed);
  95255. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState));
  95256. +
  95257. + }
  95258. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95259. + {
  95260. + pLed->CurrLedState = RTW_LED_OFF;
  95261. + pLed->BlinkingLedState = RTW_LED_OFF;
  95262. + SwLedOff(padapter, pLed);
  95263. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState));
  95264. + }
  95265. + pLed->bLedBlinkInProgress = _FALSE;
  95266. + }
  95267. + else
  95268. + {
  95269. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95270. + {
  95271. + SwLedOff(padapter, pLed);
  95272. + }
  95273. + else
  95274. + {
  95275. + if( pLed->bLedOn )
  95276. + pLed->BlinkingLedState = RTW_LED_OFF;
  95277. + else
  95278. + pLed->BlinkingLedState = RTW_LED_ON;
  95279. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95280. + }
  95281. + }
  95282. + break;
  95283. +
  95284. + default:
  95285. + break;
  95286. + }
  95287. +
  95288. +}
  95289. +
  95290. +static void
  95291. +SwLedBlink3(
  95292. + PLED_871x pLed
  95293. + )
  95294. +{
  95295. + _adapter *padapter = pLed->padapter;
  95296. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  95297. + u8 bStopBlinking = _FALSE;
  95298. +
  95299. + // Change LED according to BlinkingLedState specified.
  95300. + if( pLed->BlinkingLedState == RTW_LED_ON )
  95301. + {
  95302. + SwLedOn(padapter, pLed);
  95303. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  95304. + }
  95305. + else
  95306. + {
  95307. + if(pLed->CurrLedState != LED_BLINK_WPS_STOP)
  95308. + SwLedOff(padapter, pLed);
  95309. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  95310. + }
  95311. +
  95312. + switch(pLed->CurrLedState)
  95313. + {
  95314. + case LED_SCAN_BLINK:
  95315. + pLed->BlinkTimes--;
  95316. + if( pLed->BlinkTimes == 0 )
  95317. + {
  95318. + bStopBlinking = _TRUE;
  95319. + }
  95320. +
  95321. + if(bStopBlinking)
  95322. + {
  95323. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95324. + {
  95325. + SwLedOff(padapter, pLed);
  95326. + }
  95327. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95328. + {
  95329. + pLed->CurrLedState = RTW_LED_ON;
  95330. + pLed->BlinkingLedState = RTW_LED_ON;
  95331. + if( !pLed->bLedOn )
  95332. + SwLedOn(padapter, pLed);
  95333. +
  95334. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95335. + }
  95336. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95337. + {
  95338. + pLed->CurrLedState = RTW_LED_OFF;
  95339. + pLed->BlinkingLedState = RTW_LED_OFF;
  95340. + if( pLed->bLedOn )
  95341. + SwLedOff(padapter, pLed);
  95342. +
  95343. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95344. + }
  95345. + pLed->bLedScanBlinkInProgress = _FALSE;
  95346. + }
  95347. + else
  95348. + {
  95349. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95350. + {
  95351. + SwLedOff(padapter, pLed);
  95352. + }
  95353. + else
  95354. + {
  95355. + if( pLed->bLedOn )
  95356. + pLed->BlinkingLedState = RTW_LED_OFF;
  95357. + else
  95358. + pLed->BlinkingLedState = RTW_LED_ON;
  95359. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95360. + }
  95361. + }
  95362. + break;
  95363. +
  95364. + case LED_TXRX_BLINK:
  95365. + pLed->BlinkTimes--;
  95366. + if( pLed->BlinkTimes == 0 )
  95367. + {
  95368. + bStopBlinking = _TRUE;
  95369. + }
  95370. + if(bStopBlinking)
  95371. + {
  95372. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95373. + {
  95374. + SwLedOff(padapter, pLed);
  95375. + }
  95376. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
  95377. + {
  95378. + pLed->CurrLedState = RTW_LED_ON;
  95379. + pLed->BlinkingLedState = RTW_LED_ON;
  95380. +
  95381. + if( !pLed->bLedOn )
  95382. + SwLedOn(padapter, pLed);
  95383. +
  95384. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95385. + }
  95386. + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)
  95387. + {
  95388. + pLed->CurrLedState = RTW_LED_OFF;
  95389. + pLed->BlinkingLedState = RTW_LED_OFF;
  95390. +
  95391. + if( pLed->bLedOn )
  95392. + SwLedOff(padapter, pLed);
  95393. +
  95394. +
  95395. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95396. + }
  95397. + pLed->bLedBlinkInProgress = _FALSE;
  95398. + }
  95399. + else
  95400. + {
  95401. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95402. + {
  95403. + SwLedOff(padapter, pLed);
  95404. + }
  95405. + else
  95406. + {
  95407. + if( pLed->bLedOn )
  95408. + pLed->BlinkingLedState = RTW_LED_OFF;
  95409. + else
  95410. + pLed->BlinkingLedState = RTW_LED_ON;
  95411. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95412. + }
  95413. + }
  95414. + break;
  95415. +
  95416. + case LED_BLINK_WPS:
  95417. + if( pLed->bLedOn )
  95418. + pLed->BlinkingLedState = RTW_LED_OFF;
  95419. + else
  95420. + pLed->BlinkingLedState = RTW_LED_ON;
  95421. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95422. + break;
  95423. +
  95424. + case LED_BLINK_WPS_STOP: //WPS success
  95425. + if(pLed->BlinkingLedState == RTW_LED_ON)
  95426. + {
  95427. + pLed->BlinkingLedState = RTW_LED_OFF;
  95428. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
  95429. + bStopBlinking = _FALSE;
  95430. + }
  95431. + else
  95432. + {
  95433. + bStopBlinking = _TRUE;
  95434. + }
  95435. +
  95436. + if(bStopBlinking)
  95437. + {
  95438. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on )
  95439. + {
  95440. + SwLedOff(padapter, pLed);
  95441. + }
  95442. + else
  95443. + {
  95444. + pLed->CurrLedState = RTW_LED_ON;
  95445. + pLed->BlinkingLedState = RTW_LED_ON;
  95446. + SwLedOn(padapter, pLed);
  95447. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  95448. + }
  95449. + pLed->bLedWPSBlinkInProgress = _FALSE;
  95450. + }
  95451. + break;
  95452. +
  95453. +
  95454. + default:
  95455. + break;
  95456. + }
  95457. +
  95458. +}
  95459. +
  95460. +
  95461. +static void
  95462. +SwLedBlink4(
  95463. + PLED_871x pLed
  95464. + )
  95465. +{
  95466. + _adapter *padapter = pLed->padapter;
  95467. + struct led_priv *ledpriv = &(padapter->ledpriv);
  95468. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  95469. + PLED_871x pLed1 = &(ledpriv->SwLed1);
  95470. + u8 bStopBlinking = _FALSE;
  95471. +
  95472. + // Change LED according to BlinkingLedState specified.
  95473. + if( pLed->BlinkingLedState == RTW_LED_ON )
  95474. + {
  95475. + SwLedOn(padapter, pLed);
  95476. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  95477. + }
  95478. + else
  95479. + {
  95480. + SwLedOff(padapter, pLed);
  95481. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  95482. + }
  95483. +
  95484. + if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN)
  95485. + {
  95486. + pLed1->BlinkingLedState = RTW_LED_OFF;
  95487. + pLed1->CurrLedState = RTW_LED_OFF;
  95488. + SwLedOff(padapter, pLed1);
  95489. + }
  95490. +
  95491. + switch(pLed->CurrLedState)
  95492. + {
  95493. + case LED_BLINK_SLOWLY:
  95494. + if( pLed->bLedOn )
  95495. + pLed->BlinkingLedState = RTW_LED_OFF;
  95496. + else
  95497. + pLed->BlinkingLedState = RTW_LED_ON;
  95498. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95499. + break;
  95500. +
  95501. + case LED_BLINK_StartToBlink:
  95502. + if( pLed->bLedOn )
  95503. + {
  95504. + pLed->BlinkingLedState = RTW_LED_OFF;
  95505. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  95506. + }
  95507. + else
  95508. + {
  95509. + pLed->BlinkingLedState = RTW_LED_ON;
  95510. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  95511. + }
  95512. + break;
  95513. +
  95514. + case LED_SCAN_BLINK:
  95515. + pLed->BlinkTimes--;
  95516. + if( pLed->BlinkTimes == 0 )
  95517. + {
  95518. + bStopBlinking = _FALSE;
  95519. + }
  95520. +
  95521. + if(bStopBlinking)
  95522. + {
  95523. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95524. + {
  95525. + SwLedOff(padapter, pLed);
  95526. + }
  95527. + else
  95528. + {
  95529. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  95530. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  95531. + if( pLed->bLedOn )
  95532. + pLed->BlinkingLedState = RTW_LED_OFF;
  95533. + else
  95534. + pLed->BlinkingLedState = RTW_LED_ON;
  95535. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95536. + }
  95537. + pLed->bLedScanBlinkInProgress = _FALSE;
  95538. + }
  95539. + else
  95540. + {
  95541. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95542. + {
  95543. + SwLedOff(padapter, pLed);
  95544. + }
  95545. + else
  95546. + {
  95547. + if( pLed->bLedOn )
  95548. + pLed->BlinkingLedState = RTW_LED_OFF;
  95549. + else
  95550. + pLed->BlinkingLedState = RTW_LED_ON;
  95551. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95552. + }
  95553. + }
  95554. + break;
  95555. +
  95556. + case LED_TXRX_BLINK:
  95557. + pLed->BlinkTimes--;
  95558. + if( pLed->BlinkTimes == 0 )
  95559. + {
  95560. + bStopBlinking = _TRUE;
  95561. + }
  95562. + if(bStopBlinking)
  95563. + {
  95564. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95565. + {
  95566. + SwLedOff(padapter, pLed);
  95567. + }
  95568. + else
  95569. + {
  95570. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  95571. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  95572. + if( pLed->bLedOn )
  95573. + pLed->BlinkingLedState = RTW_LED_OFF;
  95574. + else
  95575. + pLed->BlinkingLedState = RTW_LED_ON;
  95576. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  95577. + }
  95578. + pLed->bLedBlinkInProgress = _FALSE;
  95579. + }
  95580. + else
  95581. + {
  95582. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95583. + {
  95584. + SwLedOff(padapter, pLed);
  95585. + }
  95586. + else
  95587. + {
  95588. + if( pLed->bLedOn )
  95589. + pLed->BlinkingLedState = RTW_LED_OFF;
  95590. + else
  95591. + pLed->BlinkingLedState = RTW_LED_ON;
  95592. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95593. + }
  95594. + }
  95595. + break;
  95596. +
  95597. + case LED_BLINK_WPS:
  95598. + if( pLed->bLedOn )
  95599. + {
  95600. + pLed->BlinkingLedState = RTW_LED_OFF;
  95601. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  95602. + }
  95603. + else
  95604. + {
  95605. + pLed->BlinkingLedState = RTW_LED_ON;
  95606. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  95607. + }
  95608. + break;
  95609. +
  95610. + case LED_BLINK_WPS_STOP: //WPS authentication fail
  95611. + if( pLed->bLedOn )
  95612. + pLed->BlinkingLedState = RTW_LED_OFF;
  95613. + else
  95614. + pLed->BlinkingLedState = RTW_LED_ON;
  95615. +
  95616. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  95617. + break;
  95618. +
  95619. + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap
  95620. + pLed->BlinkTimes--;
  95621. + if(pLed->BlinkTimes == 0)
  95622. + {
  95623. + if(pLed->bLedOn)
  95624. + {
  95625. + pLed->BlinkTimes = 1;
  95626. + }
  95627. + else
  95628. + {
  95629. + bStopBlinking = _TRUE;
  95630. + }
  95631. + }
  95632. +
  95633. + if(bStopBlinking)
  95634. + {
  95635. + pLed->BlinkTimes = 10;
  95636. + pLed->BlinkingLedState = RTW_LED_ON;
  95637. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  95638. + }
  95639. + else
  95640. + {
  95641. + if( pLed->bLedOn )
  95642. + pLed->BlinkingLedState = RTW_LED_OFF;
  95643. + else
  95644. + pLed->BlinkingLedState = RTW_LED_ON;
  95645. +
  95646. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  95647. + }
  95648. + break;
  95649. +
  95650. +
  95651. + default:
  95652. + break;
  95653. + }
  95654. +
  95655. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState));
  95656. +
  95657. +
  95658. +}
  95659. +
  95660. +static void
  95661. +SwLedBlink5(
  95662. + PLED_871x pLed
  95663. + )
  95664. +{
  95665. + _adapter *padapter = pLed->padapter;
  95666. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  95667. + u8 bStopBlinking = _FALSE;
  95668. +
  95669. + // Change LED according to BlinkingLedState specified.
  95670. + if( pLed->BlinkingLedState == RTW_LED_ON )
  95671. + {
  95672. + SwLedOn(padapter, pLed);
  95673. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  95674. + }
  95675. + else
  95676. + {
  95677. + SwLedOff(padapter, pLed);
  95678. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  95679. + }
  95680. +
  95681. + switch(pLed->CurrLedState)
  95682. + {
  95683. + case LED_SCAN_BLINK:
  95684. + pLed->BlinkTimes--;
  95685. + if( pLed->BlinkTimes == 0 )
  95686. + {
  95687. + bStopBlinking = _TRUE;
  95688. + }
  95689. +
  95690. + if(bStopBlinking)
  95691. + {
  95692. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95693. + {
  95694. + pLed->CurrLedState = RTW_LED_OFF;
  95695. + pLed->BlinkingLedState = RTW_LED_OFF;
  95696. + if(pLed->bLedOn)
  95697. + SwLedOff(padapter, pLed);
  95698. + }
  95699. + else
  95700. + { pLed->CurrLedState = RTW_LED_ON;
  95701. + pLed->BlinkingLedState = RTW_LED_ON;
  95702. + if(!pLed->bLedOn)
  95703. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95704. + }
  95705. +
  95706. + pLed->bLedScanBlinkInProgress = _FALSE;
  95707. + }
  95708. + else
  95709. + {
  95710. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95711. + {
  95712. + SwLedOff(padapter, pLed);
  95713. + }
  95714. + else
  95715. + {
  95716. + if( pLed->bLedOn )
  95717. + pLed->BlinkingLedState = RTW_LED_OFF;
  95718. + else
  95719. + pLed->BlinkingLedState = RTW_LED_ON;
  95720. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  95721. + }
  95722. + }
  95723. + break;
  95724. +
  95725. +
  95726. + case LED_TXRX_BLINK:
  95727. + pLed->BlinkTimes--;
  95728. + if( pLed->BlinkTimes == 0 )
  95729. + {
  95730. + bStopBlinking = _TRUE;
  95731. + }
  95732. +
  95733. + if(bStopBlinking)
  95734. + {
  95735. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95736. + {
  95737. + pLed->CurrLedState = RTW_LED_OFF;
  95738. + pLed->BlinkingLedState = RTW_LED_OFF;
  95739. + if(pLed->bLedOn)
  95740. + SwLedOff(padapter, pLed);
  95741. + }
  95742. + else
  95743. + {
  95744. + pLed->CurrLedState = RTW_LED_ON;
  95745. + pLed->BlinkingLedState = RTW_LED_ON;
  95746. + if(!pLed->bLedOn)
  95747. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95748. + }
  95749. +
  95750. + pLed->bLedBlinkInProgress = _FALSE;
  95751. + }
  95752. + else
  95753. + {
  95754. + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS)
  95755. + {
  95756. + SwLedOff(padapter, pLed);
  95757. + }
  95758. + else
  95759. + {
  95760. + if( pLed->bLedOn )
  95761. + pLed->BlinkingLedState = RTW_LED_OFF;
  95762. + else
  95763. + pLed->BlinkingLedState = RTW_LED_ON;
  95764. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  95765. + }
  95766. + }
  95767. + break;
  95768. +
  95769. + default:
  95770. + break;
  95771. + }
  95772. +
  95773. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState));
  95774. +
  95775. +
  95776. +}
  95777. +
  95778. +static void
  95779. +SwLedBlink6(
  95780. + PLED_871x pLed
  95781. + )
  95782. +{
  95783. + _adapter *padapter = pLed->padapter;
  95784. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  95785. + u8 bStopBlinking = _FALSE;
  95786. +
  95787. + // Change LED according to BlinkingLedState specified.
  95788. + if( pLed->BlinkingLedState == RTW_LED_ON )
  95789. + {
  95790. + SwLedOn(padapter, pLed);
  95791. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes));
  95792. + }
  95793. + else
  95794. + {
  95795. + SwLedOff(padapter, pLed);
  95796. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));
  95797. + }
  95798. +
  95799. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n"));
  95800. +}
  95801. +
  95802. +
  95803. +//
  95804. +// Description:
  95805. +// Callback function of LED BlinkTimer,
  95806. +// it just schedules to corresponding BlinkWorkItem.
  95807. +//
  95808. +static void
  95809. +BlinkTimerCallback(
  95810. + unsigned long data
  95811. + )
  95812. +{
  95813. + PLED_871x pLed = (PLED_871x)data;
  95814. + _adapter *padapter = pLed->padapter;
  95815. +
  95816. + //DBG_871X("%s\n", __FUNCTION__);
  95817. +
  95818. + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
  95819. + {
  95820. + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped);
  95821. + return;
  95822. + }
  95823. +
  95824. +#ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD
  95825. + rtw_led_blink_cmd(padapter, pLed);
  95826. +#else
  95827. + _set_workitem(&(pLed->BlinkWorkItem));
  95828. +#endif
  95829. +}
  95830. +
  95831. +//
  95832. +// Description:
  95833. +// Handler function of LED Blinking.
  95834. +// We dispatch acture LED blink action according to LedStrategy.
  95835. +//
  95836. +void BlinkHandler(PLED_871x pLed)
  95837. +{
  95838. + struct led_priv *ledpriv = &(pLed->padapter->ledpriv);
  95839. + _adapter *padapter = pLed->padapter;
  95840. +
  95841. + //DBG_871X("%s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
  95842. +
  95843. + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
  95844. + {
  95845. + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped);
  95846. + return;
  95847. + }
  95848. +
  95849. + switch(ledpriv->LedStrategy)
  95850. + {
  95851. + case SW_LED_MODE0:
  95852. + SwLedBlink(pLed);
  95853. + break;
  95854. +
  95855. + case SW_LED_MODE1:
  95856. + SwLedBlink1(pLed);
  95857. + break;
  95858. +
  95859. + case SW_LED_MODE2:
  95860. + SwLedBlink2(pLed);
  95861. + break;
  95862. +
  95863. + case SW_LED_MODE3:
  95864. + SwLedBlink3(pLed);
  95865. + break;
  95866. +
  95867. + case SW_LED_MODE4:
  95868. + SwLedBlink4(pLed);
  95869. + break;
  95870. +
  95871. + case SW_LED_MODE5:
  95872. + SwLedBlink5(pLed);
  95873. + break;
  95874. +
  95875. + case SW_LED_MODE6:
  95876. + SwLedBlink6(pLed);
  95877. + break;
  95878. +
  95879. + default:
  95880. + //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy));
  95881. + //SwLedBlink(pLed);
  95882. + break;
  95883. + }
  95884. +}
  95885. +
  95886. +//
  95887. +// Description:
  95888. +// Callback function of LED BlinkWorkItem.
  95889. +// We dispatch acture LED blink action according to LedStrategy.
  95890. +//
  95891. +static void BlinkWorkItemCallback(struct work_struct *work)
  95892. +{
  95893. + PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem);
  95894. + BlinkHandler(pLed);
  95895. +}
  95896. +
  95897. +
  95898. +
  95899. +//================================================================================
  95900. +// Default LED behavior.
  95901. +//================================================================================
  95902. +
  95903. +//
  95904. +// Description:
  95905. +// Implement each led action for SW_LED_MODE0.
  95906. +// This is default strategy.
  95907. +//
  95908. +static void
  95909. +SwLedControlMode0(
  95910. + _adapter *padapter,
  95911. + LED_CTL_MODE LedAction
  95912. +)
  95913. +{
  95914. + struct led_priv *ledpriv = &(padapter->ledpriv);
  95915. + PLED_871x pLed = &(ledpriv->SwLed1);
  95916. +
  95917. + // Decide led state
  95918. + switch(LedAction)
  95919. + {
  95920. + case LED_CTL_TX:
  95921. + case LED_CTL_RX:
  95922. + if( pLed->bLedBlinkInProgress == _FALSE )
  95923. + {
  95924. + pLed->bLedBlinkInProgress = _TRUE;
  95925. +
  95926. + pLed->CurrLedState = LED_BLINK_NORMAL;
  95927. + pLed->BlinkTimes = 2;
  95928. +
  95929. + if( pLed->bLedOn )
  95930. + pLed->BlinkingLedState = RTW_LED_OFF;
  95931. + else
  95932. + pLed->BlinkingLedState = RTW_LED_ON;
  95933. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  95934. + }
  95935. + break;
  95936. +
  95937. + case LED_CTL_START_TO_LINK:
  95938. + if( pLed->bLedBlinkInProgress == _FALSE )
  95939. + {
  95940. + pLed->bLedBlinkInProgress = _TRUE;
  95941. +
  95942. + pLed->CurrLedState = LED_BLINK_StartToBlink;
  95943. + pLed->BlinkTimes = 24;
  95944. +
  95945. + if( pLed->bLedOn )
  95946. + pLed->BlinkingLedState = RTW_LED_OFF;
  95947. + else
  95948. + pLed->BlinkingLedState = RTW_LED_ON;
  95949. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  95950. + }
  95951. + else
  95952. + {
  95953. + pLed->CurrLedState = LED_BLINK_StartToBlink;
  95954. + }
  95955. + break;
  95956. +
  95957. + case LED_CTL_LINK:
  95958. + pLed->CurrLedState = RTW_LED_ON;
  95959. + if( pLed->bLedBlinkInProgress == _FALSE )
  95960. + {
  95961. + SwLedOn(padapter, pLed);
  95962. + }
  95963. + break;
  95964. +
  95965. + case LED_CTL_NO_LINK:
  95966. + pLed->CurrLedState = RTW_LED_OFF;
  95967. + if( pLed->bLedBlinkInProgress == _FALSE )
  95968. + {
  95969. + SwLedOff(padapter, pLed);
  95970. + }
  95971. + break;
  95972. +
  95973. + case LED_CTL_POWER_OFF:
  95974. + pLed->CurrLedState = RTW_LED_OFF;
  95975. + if(pLed->bLedBlinkInProgress)
  95976. + {
  95977. + _cancel_timer_ex(&(pLed->BlinkTimer));
  95978. + pLed->bLedBlinkInProgress = _FALSE;
  95979. + }
  95980. + SwLedOff(padapter, pLed);
  95981. + break;
  95982. +
  95983. + case LED_CTL_START_WPS:
  95984. + if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON)
  95985. + {
  95986. + pLed->bLedBlinkInProgress = _TRUE;
  95987. +
  95988. + pLed->CurrLedState = LED_BLINK_WPS;
  95989. + pLed->BlinkTimes = 20;
  95990. +
  95991. + if( pLed->bLedOn )
  95992. + {
  95993. + pLed->BlinkingLedState = RTW_LED_OFF;
  95994. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
  95995. + }
  95996. + else
  95997. + {
  95998. + pLed->BlinkingLedState = RTW_LED_ON;
  95999. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);
  96000. + }
  96001. + }
  96002. + break;
  96003. +
  96004. + case LED_CTL_STOP_WPS:
  96005. + if(pLed->bLedBlinkInProgress)
  96006. + {
  96007. + pLed->CurrLedState = RTW_LED_OFF;
  96008. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96009. + pLed->bLedBlinkInProgress = _FALSE;
  96010. + }
  96011. + break;
  96012. +
  96013. +
  96014. + default:
  96015. + break;
  96016. + }
  96017. +
  96018. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState));
  96019. +
  96020. +}
  96021. +
  96022. + //ALPHA, added by chiyoko, 20090106
  96023. +static void
  96024. +SwLedControlMode1(
  96025. + _adapter *padapter,
  96026. + LED_CTL_MODE LedAction
  96027. +)
  96028. +{
  96029. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  96030. + struct led_priv *ledpriv = &(padapter->ledpriv);
  96031. + PLED_871x pLed = &(ledpriv->SwLed0);
  96032. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  96033. +
  96034. + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
  96035. + pLed = &(ledpriv->SwLed1);
  96036. +
  96037. + switch(LedAction)
  96038. + {
  96039. + case LED_CTL_POWER_ON:
  96040. + case LED_CTL_START_TO_LINK:
  96041. + case LED_CTL_NO_LINK:
  96042. + if( pLed->bLedNoLinkBlinkInProgress == _FALSE )
  96043. + {
  96044. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96045. + {
  96046. + return;
  96047. + }
  96048. + if( pLed->bLedLinkBlinkInProgress == _TRUE )
  96049. + {
  96050. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96051. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96052. + }
  96053. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96054. + {
  96055. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96056. + pLed->bLedBlinkInProgress = _FALSE;
  96057. + }
  96058. +
  96059. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96060. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96061. + if( pLed->bLedOn )
  96062. + pLed->BlinkingLedState = RTW_LED_OFF;
  96063. + else
  96064. + pLed->BlinkingLedState = RTW_LED_ON;
  96065. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96066. + }
  96067. + break;
  96068. +
  96069. + case LED_CTL_LINK:
  96070. + if( pLed->bLedLinkBlinkInProgress == _FALSE )
  96071. + {
  96072. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96073. + {
  96074. + return;
  96075. + }
  96076. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96077. + {
  96078. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96079. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96080. + }
  96081. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96082. + {
  96083. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96084. + pLed->bLedBlinkInProgress = _FALSE;
  96085. + }
  96086. + pLed->bLedLinkBlinkInProgress = _TRUE;
  96087. + pLed->CurrLedState = LED_BLINK_NORMAL;
  96088. + if( pLed->bLedOn )
  96089. + pLed->BlinkingLedState = RTW_LED_OFF;
  96090. + else
  96091. + pLed->BlinkingLedState = RTW_LED_ON;
  96092. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);
  96093. + }
  96094. + break;
  96095. +
  96096. + case LED_CTL_SITE_SURVEY:
  96097. + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
  96098. + ;
  96099. + else if(pLed->bLedScanBlinkInProgress ==_FALSE)
  96100. + {
  96101. + if(IS_LED_WPS_BLINKING(pLed))
  96102. + return;
  96103. +
  96104. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96105. + {
  96106. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96107. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96108. + }
  96109. + if( pLed->bLedLinkBlinkInProgress == _TRUE )
  96110. + {
  96111. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96112. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96113. + }
  96114. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96115. + {
  96116. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96117. + pLed->bLedBlinkInProgress = _FALSE;
  96118. + }
  96119. + pLed->bLedScanBlinkInProgress = _TRUE;
  96120. + pLed->CurrLedState = LED_SCAN_BLINK;
  96121. + pLed->BlinkTimes = 24;
  96122. + if( pLed->bLedOn )
  96123. + pLed->BlinkingLedState = RTW_LED_OFF;
  96124. + else
  96125. + pLed->BlinkingLedState = RTW_LED_ON;
  96126. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96127. + }
  96128. + break;
  96129. +
  96130. + case LED_CTL_TX:
  96131. + case LED_CTL_RX:
  96132. + if(pLed->bLedBlinkInProgress ==_FALSE)
  96133. + {
  96134. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96135. + {
  96136. + return;
  96137. + }
  96138. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96139. + {
  96140. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96141. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96142. + }
  96143. + if( pLed->bLedLinkBlinkInProgress == _TRUE )
  96144. + {
  96145. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96146. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96147. + }
  96148. + pLed->bLedBlinkInProgress = _TRUE;
  96149. + pLed->CurrLedState = LED_TXRX_BLINK;
  96150. + pLed->BlinkTimes = 2;
  96151. + if( pLed->bLedOn )
  96152. + pLed->BlinkingLedState = RTW_LED_OFF;
  96153. + else
  96154. + pLed->BlinkingLedState = RTW_LED_ON;
  96155. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  96156. + }
  96157. + break;
  96158. +
  96159. + case LED_CTL_START_WPS: //wait until xinpin finish
  96160. + case LED_CTL_START_WPS_BOTTON:
  96161. + if(pLed->bLedWPSBlinkInProgress ==_FALSE)
  96162. + {
  96163. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96164. + {
  96165. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96166. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96167. + }
  96168. + if( pLed->bLedLinkBlinkInProgress == _TRUE )
  96169. + {
  96170. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96171. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96172. + }
  96173. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96174. + {
  96175. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96176. + pLed->bLedBlinkInProgress = _FALSE;
  96177. + }
  96178. + if(pLed->bLedScanBlinkInProgress ==_TRUE)
  96179. + {
  96180. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96181. + pLed->bLedScanBlinkInProgress = _FALSE;
  96182. + }
  96183. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96184. + pLed->CurrLedState = LED_BLINK_WPS;
  96185. + if( pLed->bLedOn )
  96186. + pLed->BlinkingLedState = RTW_LED_OFF;
  96187. + else
  96188. + pLed->BlinkingLedState = RTW_LED_ON;
  96189. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96190. + }
  96191. + break;
  96192. +
  96193. +
  96194. + case LED_CTL_STOP_WPS:
  96195. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96196. + {
  96197. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96198. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96199. + }
  96200. + if( pLed->bLedLinkBlinkInProgress == _TRUE )
  96201. + {
  96202. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96203. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96204. + }
  96205. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96206. + {
  96207. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96208. + pLed->bLedBlinkInProgress = _FALSE;
  96209. + }
  96210. + if(pLed->bLedScanBlinkInProgress ==_TRUE)
  96211. + {
  96212. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96213. + pLed->bLedScanBlinkInProgress = _FALSE;
  96214. + }
  96215. + if(pLed->bLedWPSBlinkInProgress)
  96216. + {
  96217. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96218. + }
  96219. + else
  96220. + {
  96221. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96222. + }
  96223. +
  96224. + pLed->CurrLedState = LED_BLINK_WPS_STOP;
  96225. + if(pLed->bLedOn)
  96226. + {
  96227. + pLed->BlinkingLedState = RTW_LED_OFF;
  96228. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
  96229. + }
  96230. + else
  96231. + {
  96232. + pLed->BlinkingLedState = RTW_LED_ON;
  96233. + _set_timer(&(pLed->BlinkTimer), 0);
  96234. + }
  96235. + break;
  96236. +
  96237. + case LED_CTL_STOP_WPS_FAIL:
  96238. + if(pLed->bLedWPSBlinkInProgress)
  96239. + {
  96240. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96241. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96242. + }
  96243. +
  96244. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96245. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96246. + if( pLed->bLedOn )
  96247. + pLed->BlinkingLedState = RTW_LED_OFF;
  96248. + else
  96249. + pLed->BlinkingLedState = RTW_LED_ON;
  96250. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96251. + break;
  96252. +
  96253. + case LED_CTL_POWER_OFF:
  96254. + pLed->CurrLedState = RTW_LED_OFF;
  96255. + pLed->BlinkingLedState = RTW_LED_OFF;
  96256. + if( pLed->bLedNoLinkBlinkInProgress)
  96257. + {
  96258. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96259. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96260. + }
  96261. + if( pLed->bLedLinkBlinkInProgress)
  96262. + {
  96263. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96264. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96265. + }
  96266. + if( pLed->bLedBlinkInProgress)
  96267. + {
  96268. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96269. + pLed->bLedBlinkInProgress = _FALSE;
  96270. + }
  96271. + if( pLed->bLedWPSBlinkInProgress )
  96272. + {
  96273. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96274. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96275. + }
  96276. + if( pLed->bLedScanBlinkInProgress)
  96277. + {
  96278. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96279. + pLed->bLedScanBlinkInProgress = _FALSE;
  96280. + }
  96281. +
  96282. + SwLedOff(padapter, pLed);
  96283. + break;
  96284. +
  96285. + default:
  96286. + break;
  96287. +
  96288. + }
  96289. +
  96290. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState));
  96291. +}
  96292. +
  96293. + //Arcadyan/Sitecom , added by chiyoko, 20090216
  96294. +static void
  96295. +SwLedControlMode2(
  96296. + _adapter *padapter,
  96297. + LED_CTL_MODE LedAction
  96298. +)
  96299. +{
  96300. + struct led_priv *ledpriv = &(padapter->ledpriv);
  96301. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  96302. + PLED_871x pLed = &(ledpriv->SwLed0);
  96303. +
  96304. + switch(LedAction)
  96305. + {
  96306. + case LED_CTL_SITE_SURVEY:
  96307. + if(pmlmepriv->LinkDetectInfo.bBusyTraffic)
  96308. + ;
  96309. + else if(pLed->bLedScanBlinkInProgress ==_FALSE)
  96310. + {
  96311. + if(IS_LED_WPS_BLINKING(pLed))
  96312. + return;
  96313. +
  96314. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96315. + {
  96316. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96317. + pLed->bLedBlinkInProgress = _FALSE;
  96318. + }
  96319. + pLed->bLedScanBlinkInProgress = _TRUE;
  96320. + pLed->CurrLedState = LED_SCAN_BLINK;
  96321. + pLed->BlinkTimes = 24;
  96322. + if( pLed->bLedOn )
  96323. + pLed->BlinkingLedState = RTW_LED_OFF;
  96324. + else
  96325. + pLed->BlinkingLedState = RTW_LED_ON;
  96326. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96327. + }
  96328. + break;
  96329. +
  96330. + case LED_CTL_TX:
  96331. + case LED_CTL_RX:
  96332. + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
  96333. + {
  96334. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96335. + {
  96336. + return;
  96337. + }
  96338. +
  96339. + pLed->bLedBlinkInProgress = _TRUE;
  96340. + pLed->CurrLedState = LED_TXRX_BLINK;
  96341. + pLed->BlinkTimes = 2;
  96342. + if( pLed->bLedOn )
  96343. + pLed->BlinkingLedState = RTW_LED_OFF;
  96344. + else
  96345. + pLed->BlinkingLedState = RTW_LED_ON;
  96346. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  96347. + }
  96348. + break;
  96349. +
  96350. + case LED_CTL_LINK:
  96351. + pLed->CurrLedState = RTW_LED_ON;
  96352. + pLed->BlinkingLedState = RTW_LED_ON;
  96353. + if( pLed->bLedBlinkInProgress)
  96354. + {
  96355. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96356. + pLed->bLedBlinkInProgress = _FALSE;
  96357. + }
  96358. + if( pLed->bLedScanBlinkInProgress)
  96359. + {
  96360. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96361. + pLed->bLedScanBlinkInProgress = _FALSE;
  96362. + }
  96363. +
  96364. + _set_timer(&(pLed->BlinkTimer), 0);
  96365. + break;
  96366. +
  96367. + case LED_CTL_START_WPS: //wait until xinpin finish
  96368. + case LED_CTL_START_WPS_BOTTON:
  96369. + if(pLed->bLedWPSBlinkInProgress ==_FALSE)
  96370. + {
  96371. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96372. + {
  96373. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96374. + pLed->bLedBlinkInProgress = _FALSE;
  96375. + }
  96376. + if(pLed->bLedScanBlinkInProgress ==_TRUE)
  96377. + {
  96378. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96379. + pLed->bLedScanBlinkInProgress = _FALSE;
  96380. + }
  96381. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96382. + pLed->CurrLedState = RTW_LED_ON;
  96383. + pLed->BlinkingLedState = RTW_LED_ON;
  96384. + _set_timer(&(pLed->BlinkTimer), 0);
  96385. + }
  96386. + break;
  96387. +
  96388. + case LED_CTL_STOP_WPS:
  96389. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96390. + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on)
  96391. + {
  96392. + SwLedOff(padapter, pLed);
  96393. + }
  96394. + else
  96395. + {
  96396. + pLed->CurrLedState = RTW_LED_ON;
  96397. + pLed->BlinkingLedState = RTW_LED_ON;
  96398. + _set_timer(&(pLed->BlinkTimer), 0);
  96399. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  96400. + }
  96401. + break;
  96402. +
  96403. + case LED_CTL_STOP_WPS_FAIL:
  96404. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96405. + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on)
  96406. + {
  96407. + SwLedOff(padapter, pLed);
  96408. + }
  96409. + else
  96410. + {
  96411. + pLed->CurrLedState = RTW_LED_OFF;
  96412. + pLed->BlinkingLedState = RTW_LED_OFF;
  96413. + _set_timer(&(pLed->BlinkTimer), 0);
  96414. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  96415. + }
  96416. + break;
  96417. +
  96418. + case LED_CTL_START_TO_LINK:
  96419. + case LED_CTL_NO_LINK:
  96420. + if(!IS_LED_BLINKING(pLed))
  96421. + {
  96422. + pLed->CurrLedState = RTW_LED_OFF;
  96423. + pLed->BlinkingLedState = RTW_LED_OFF;
  96424. + _set_timer(&(pLed->BlinkTimer), 0);
  96425. + }
  96426. + break;
  96427. +
  96428. + case LED_CTL_POWER_OFF:
  96429. + pLed->CurrLedState = RTW_LED_OFF;
  96430. + pLed->BlinkingLedState = RTW_LED_OFF;
  96431. + if( pLed->bLedBlinkInProgress)
  96432. + {
  96433. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96434. + pLed->bLedBlinkInProgress = _FALSE;
  96435. + }
  96436. + if( pLed->bLedScanBlinkInProgress)
  96437. + {
  96438. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96439. + pLed->bLedScanBlinkInProgress = _FALSE;
  96440. + }
  96441. + if( pLed->bLedWPSBlinkInProgress )
  96442. + {
  96443. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96444. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96445. + }
  96446. +
  96447. + _set_timer(&(pLed->BlinkTimer), 0);
  96448. + break;
  96449. +
  96450. + default:
  96451. + break;
  96452. +
  96453. + }
  96454. +
  96455. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  96456. +}
  96457. +
  96458. + //COREGA, added by chiyoko, 20090316
  96459. + static void
  96460. + SwLedControlMode3(
  96461. + _adapter *padapter,
  96462. + LED_CTL_MODE LedAction
  96463. +)
  96464. +{
  96465. + struct led_priv *ledpriv = &(padapter->ledpriv);
  96466. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  96467. + PLED_871x pLed = &(ledpriv->SwLed0);
  96468. +
  96469. + switch(LedAction)
  96470. + {
  96471. + case LED_CTL_SITE_SURVEY:
  96472. + if(pmlmepriv->LinkDetectInfo.bBusyTraffic)
  96473. + ;
  96474. + else if(pLed->bLedScanBlinkInProgress ==_FALSE)
  96475. + {
  96476. + if(IS_LED_WPS_BLINKING(pLed))
  96477. + return;
  96478. +
  96479. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96480. + {
  96481. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96482. + pLed->bLedBlinkInProgress = _FALSE;
  96483. + }
  96484. + pLed->bLedScanBlinkInProgress = _TRUE;
  96485. + pLed->CurrLedState = LED_SCAN_BLINK;
  96486. + pLed->BlinkTimes = 24;
  96487. + if( pLed->bLedOn )
  96488. + pLed->BlinkingLedState = RTW_LED_OFF;
  96489. + else
  96490. + pLed->BlinkingLedState = RTW_LED_ON;
  96491. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96492. + }
  96493. + break;
  96494. +
  96495. + case LED_CTL_TX:
  96496. + case LED_CTL_RX:
  96497. + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
  96498. + {
  96499. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96500. + {
  96501. + return;
  96502. + }
  96503. +
  96504. + pLed->bLedBlinkInProgress = _TRUE;
  96505. + pLed->CurrLedState = LED_TXRX_BLINK;
  96506. + pLed->BlinkTimes = 2;
  96507. + if( pLed->bLedOn )
  96508. + pLed->BlinkingLedState = RTW_LED_OFF;
  96509. + else
  96510. + pLed->BlinkingLedState = RTW_LED_ON;
  96511. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  96512. + }
  96513. + break;
  96514. +
  96515. + case LED_CTL_LINK:
  96516. + if(IS_LED_WPS_BLINKING(pLed))
  96517. + return;
  96518. +
  96519. + pLed->CurrLedState = RTW_LED_ON;
  96520. + pLed->BlinkingLedState = RTW_LED_ON;
  96521. + if( pLed->bLedBlinkInProgress)
  96522. + {
  96523. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96524. + pLed->bLedBlinkInProgress = _FALSE;
  96525. + }
  96526. + if( pLed->bLedScanBlinkInProgress)
  96527. + {
  96528. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96529. + pLed->bLedScanBlinkInProgress = _FALSE;
  96530. + }
  96531. +
  96532. + _set_timer(&(pLed->BlinkTimer), 0);
  96533. + break;
  96534. +
  96535. + case LED_CTL_START_WPS: //wait until xinpin finish
  96536. + case LED_CTL_START_WPS_BOTTON:
  96537. + if(pLed->bLedWPSBlinkInProgress ==_FALSE)
  96538. + {
  96539. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96540. + {
  96541. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96542. + pLed->bLedBlinkInProgress = _FALSE;
  96543. + }
  96544. + if(pLed->bLedScanBlinkInProgress ==_TRUE)
  96545. + {
  96546. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96547. + pLed->bLedScanBlinkInProgress = _FALSE;
  96548. + }
  96549. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96550. + pLed->CurrLedState = LED_BLINK_WPS;
  96551. + if( pLed->bLedOn )
  96552. + pLed->BlinkingLedState = RTW_LED_OFF;
  96553. + else
  96554. + pLed->BlinkingLedState = RTW_LED_ON;
  96555. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96556. + }
  96557. + break;
  96558. +
  96559. + case LED_CTL_STOP_WPS:
  96560. + if(pLed->bLedWPSBlinkInProgress)
  96561. + {
  96562. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96563. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96564. + }
  96565. + else
  96566. + {
  96567. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96568. + }
  96569. +
  96570. + pLed->CurrLedState = LED_BLINK_WPS_STOP;
  96571. + if(pLed->bLedOn)
  96572. + {
  96573. + pLed->BlinkingLedState = RTW_LED_OFF;
  96574. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);
  96575. + }
  96576. + else
  96577. + {
  96578. + pLed->BlinkingLedState = RTW_LED_ON;
  96579. + _set_timer(&(pLed->BlinkTimer), 0);
  96580. + }
  96581. +
  96582. + break;
  96583. +
  96584. + case LED_CTL_STOP_WPS_FAIL:
  96585. + if(pLed->bLedWPSBlinkInProgress)
  96586. + {
  96587. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96588. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96589. + }
  96590. +
  96591. + pLed->CurrLedState = RTW_LED_OFF;
  96592. + pLed->BlinkingLedState = RTW_LED_OFF;
  96593. + _set_timer(&(pLed->BlinkTimer), 0);
  96594. + break;
  96595. +
  96596. + case LED_CTL_START_TO_LINK:
  96597. + case LED_CTL_NO_LINK:
  96598. + if(!IS_LED_BLINKING(pLed))
  96599. + {
  96600. + pLed->CurrLedState = RTW_LED_OFF;
  96601. + pLed->BlinkingLedState = RTW_LED_OFF;
  96602. + _set_timer(&(pLed->BlinkTimer), 0);
  96603. + }
  96604. + break;
  96605. +
  96606. + case LED_CTL_POWER_OFF:
  96607. + pLed->CurrLedState = RTW_LED_OFF;
  96608. + pLed->BlinkingLedState = RTW_LED_OFF;
  96609. + if( pLed->bLedBlinkInProgress)
  96610. + {
  96611. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96612. + pLed->bLedBlinkInProgress = _FALSE;
  96613. + }
  96614. + if( pLed->bLedScanBlinkInProgress)
  96615. + {
  96616. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96617. + pLed->bLedScanBlinkInProgress = _FALSE;
  96618. + }
  96619. + if( pLed->bLedWPSBlinkInProgress )
  96620. + {
  96621. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96622. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96623. + }
  96624. +
  96625. + _set_timer(&(pLed->BlinkTimer), 0);
  96626. + break;
  96627. +
  96628. + default:
  96629. + break;
  96630. +
  96631. + }
  96632. +
  96633. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));
  96634. +}
  96635. +
  96636. +
  96637. + //Edimax-Belkin, added by chiyoko, 20090413
  96638. +static void
  96639. +SwLedControlMode4(
  96640. + _adapter *padapter,
  96641. + LED_CTL_MODE LedAction
  96642. +)
  96643. +{
  96644. + struct led_priv *ledpriv = &(padapter->ledpriv);
  96645. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  96646. + PLED_871x pLed = &(ledpriv->SwLed0);
  96647. + PLED_871x pLed1 = &(ledpriv->SwLed1);
  96648. +
  96649. + switch(LedAction)
  96650. + {
  96651. + case LED_CTL_START_TO_LINK:
  96652. + if(pLed1->bLedWPSBlinkInProgress)
  96653. + {
  96654. + pLed1->bLedWPSBlinkInProgress = _FALSE;
  96655. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96656. +
  96657. + pLed1->BlinkingLedState = RTW_LED_OFF;
  96658. + pLed1->CurrLedState = RTW_LED_OFF;
  96659. +
  96660. + if(pLed1->bLedOn)
  96661. + _set_timer(&(pLed->BlinkTimer), 0);
  96662. + }
  96663. +
  96664. + if( pLed->bLedStartToLinkBlinkInProgress == _FALSE )
  96665. + {
  96666. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96667. + {
  96668. + return;
  96669. + }
  96670. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96671. + {
  96672. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96673. + pLed->bLedBlinkInProgress = _FALSE;
  96674. + }
  96675. + if(pLed->bLedNoLinkBlinkInProgress ==_TRUE)
  96676. + {
  96677. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96678. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96679. + }
  96680. +
  96681. + pLed->bLedStartToLinkBlinkInProgress = _TRUE;
  96682. + pLed->CurrLedState = LED_BLINK_StartToBlink;
  96683. + if( pLed->bLedOn )
  96684. + {
  96685. + pLed->BlinkingLedState = RTW_LED_OFF;
  96686. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  96687. + }
  96688. + else
  96689. + {
  96690. + pLed->BlinkingLedState = RTW_LED_ON;
  96691. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  96692. + }
  96693. + }
  96694. + break;
  96695. +
  96696. + case LED_CTL_LINK:
  96697. + case LED_CTL_NO_LINK:
  96698. + //LED1 settings
  96699. + if(LedAction == LED_CTL_LINK)
  96700. + {
  96701. + if(pLed1->bLedWPSBlinkInProgress)
  96702. + {
  96703. + pLed1->bLedWPSBlinkInProgress = _FALSE;
  96704. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96705. +
  96706. + pLed1->BlinkingLedState = RTW_LED_OFF;
  96707. + pLed1->CurrLedState = RTW_LED_OFF;
  96708. +
  96709. + if(pLed1->bLedOn)
  96710. + _set_timer(&(pLed->BlinkTimer), 0);
  96711. + }
  96712. + }
  96713. +
  96714. + if( pLed->bLedNoLinkBlinkInProgress == _FALSE )
  96715. + {
  96716. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96717. + {
  96718. + return;
  96719. + }
  96720. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96721. + {
  96722. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96723. + pLed->bLedBlinkInProgress = _FALSE;
  96724. + }
  96725. +
  96726. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96727. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96728. + if( pLed->bLedOn )
  96729. + pLed->BlinkingLedState = RTW_LED_OFF;
  96730. + else
  96731. + pLed->BlinkingLedState = RTW_LED_ON;
  96732. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96733. + }
  96734. + break;
  96735. +
  96736. + case LED_CTL_SITE_SURVEY:
  96737. + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
  96738. + ;
  96739. + else if(pLed->bLedScanBlinkInProgress ==_FALSE)
  96740. + {
  96741. + if(IS_LED_WPS_BLINKING(pLed))
  96742. + return;
  96743. +
  96744. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96745. + {
  96746. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96747. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96748. + }
  96749. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96750. + {
  96751. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96752. + pLed->bLedBlinkInProgress = _FALSE;
  96753. + }
  96754. + pLed->bLedScanBlinkInProgress = _TRUE;
  96755. + pLed->CurrLedState = LED_SCAN_BLINK;
  96756. + pLed->BlinkTimes = 24;
  96757. + if( pLed->bLedOn )
  96758. + pLed->BlinkingLedState = RTW_LED_OFF;
  96759. + else
  96760. + pLed->BlinkingLedState = RTW_LED_ON;
  96761. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  96762. + }
  96763. + break;
  96764. +
  96765. + case LED_CTL_TX:
  96766. + case LED_CTL_RX:
  96767. + if(pLed->bLedBlinkInProgress ==_FALSE)
  96768. + {
  96769. + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed))
  96770. + {
  96771. + return;
  96772. + }
  96773. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96774. + {
  96775. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96776. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96777. + }
  96778. + pLed->bLedBlinkInProgress = _TRUE;
  96779. + pLed->CurrLedState = LED_TXRX_BLINK;
  96780. + pLed->BlinkTimes = 2;
  96781. + if( pLed->bLedOn )
  96782. + pLed->BlinkingLedState = RTW_LED_OFF;
  96783. + else
  96784. + pLed->BlinkingLedState = RTW_LED_ON;
  96785. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  96786. + }
  96787. + break;
  96788. +
  96789. + case LED_CTL_START_WPS: //wait until xinpin finish
  96790. + case LED_CTL_START_WPS_BOTTON:
  96791. + if(pLed1->bLedWPSBlinkInProgress)
  96792. + {
  96793. + pLed1->bLedWPSBlinkInProgress = _FALSE;
  96794. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96795. +
  96796. + pLed1->BlinkingLedState = RTW_LED_OFF;
  96797. + pLed1->CurrLedState = RTW_LED_OFF;
  96798. +
  96799. + if(pLed1->bLedOn)
  96800. + _set_timer(&(pLed->BlinkTimer), 0);
  96801. + }
  96802. +
  96803. + if(pLed->bLedWPSBlinkInProgress ==_FALSE)
  96804. + {
  96805. + if(pLed->bLedNoLinkBlinkInProgress == _TRUE)
  96806. + {
  96807. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96808. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96809. + }
  96810. + if(pLed->bLedBlinkInProgress ==_TRUE)
  96811. + {
  96812. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96813. + pLed->bLedBlinkInProgress = _FALSE;
  96814. + }
  96815. + if(pLed->bLedScanBlinkInProgress ==_TRUE)
  96816. + {
  96817. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96818. + pLed->bLedScanBlinkInProgress = _FALSE;
  96819. + }
  96820. + pLed->bLedWPSBlinkInProgress = _TRUE;
  96821. + pLed->CurrLedState = LED_BLINK_WPS;
  96822. + if( pLed->bLedOn )
  96823. + {
  96824. + pLed->BlinkingLedState = RTW_LED_OFF;
  96825. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
  96826. + }
  96827. + else
  96828. + {
  96829. + pLed->BlinkingLedState = RTW_LED_ON;
  96830. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  96831. + }
  96832. + }
  96833. + break;
  96834. +
  96835. + case LED_CTL_STOP_WPS: //WPS connect success
  96836. + if(pLed->bLedWPSBlinkInProgress)
  96837. + {
  96838. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96839. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96840. + }
  96841. +
  96842. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96843. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96844. + if( pLed->bLedOn )
  96845. + pLed->BlinkingLedState = RTW_LED_OFF;
  96846. + else
  96847. + pLed->BlinkingLedState = RTW_LED_ON;
  96848. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96849. +
  96850. + break;
  96851. +
  96852. + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail
  96853. + if(pLed->bLedWPSBlinkInProgress)
  96854. + {
  96855. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96856. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96857. + }
  96858. +
  96859. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96860. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96861. + if( pLed->bLedOn )
  96862. + pLed->BlinkingLedState = RTW_LED_OFF;
  96863. + else
  96864. + pLed->BlinkingLedState = RTW_LED_ON;
  96865. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96866. +
  96867. + //LED1 settings
  96868. + if(pLed1->bLedWPSBlinkInProgress)
  96869. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96870. + else
  96871. + pLed1->bLedWPSBlinkInProgress = _TRUE;
  96872. +
  96873. + pLed1->CurrLedState = LED_BLINK_WPS_STOP;
  96874. + if( pLed1->bLedOn )
  96875. + pLed1->BlinkingLedState = RTW_LED_OFF;
  96876. + else
  96877. + pLed1->BlinkingLedState = RTW_LED_ON;
  96878. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  96879. +
  96880. + break;
  96881. +
  96882. + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap
  96883. + if(pLed->bLedWPSBlinkInProgress)
  96884. + {
  96885. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96886. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96887. + }
  96888. +
  96889. + pLed->bLedNoLinkBlinkInProgress = _TRUE;
  96890. + pLed->CurrLedState = LED_BLINK_SLOWLY;
  96891. + if( pLed->bLedOn )
  96892. + pLed->BlinkingLedState = RTW_LED_OFF;
  96893. + else
  96894. + pLed->BlinkingLedState = RTW_LED_ON;
  96895. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);
  96896. +
  96897. + //LED1 settings
  96898. + if(pLed1->bLedWPSBlinkInProgress)
  96899. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96900. + else
  96901. + pLed1->bLedWPSBlinkInProgress = _TRUE;
  96902. +
  96903. + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
  96904. + pLed1->BlinkTimes = 10;
  96905. + if( pLed1->bLedOn )
  96906. + pLed1->BlinkingLedState = RTW_LED_OFF;
  96907. + else
  96908. + pLed1->BlinkingLedState = RTW_LED_ON;
  96909. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
  96910. +
  96911. + break;
  96912. +
  96913. + case LED_CTL_POWER_OFF:
  96914. + pLed->CurrLedState = RTW_LED_OFF;
  96915. + pLed->BlinkingLedState = RTW_LED_OFF;
  96916. +
  96917. + if( pLed->bLedNoLinkBlinkInProgress)
  96918. + {
  96919. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96920. + pLed->bLedNoLinkBlinkInProgress = _FALSE;
  96921. + }
  96922. + if( pLed->bLedLinkBlinkInProgress)
  96923. + {
  96924. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96925. + pLed->bLedLinkBlinkInProgress = _FALSE;
  96926. + }
  96927. + if( pLed->bLedBlinkInProgress)
  96928. + {
  96929. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96930. + pLed->bLedBlinkInProgress = _FALSE;
  96931. + }
  96932. + if( pLed->bLedWPSBlinkInProgress )
  96933. + {
  96934. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96935. + pLed->bLedWPSBlinkInProgress = _FALSE;
  96936. + }
  96937. + if( pLed->bLedScanBlinkInProgress)
  96938. + {
  96939. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96940. + pLed->bLedScanBlinkInProgress = _FALSE;
  96941. + }
  96942. + if( pLed->bLedStartToLinkBlinkInProgress)
  96943. + {
  96944. + _cancel_timer_ex(&(pLed->BlinkTimer));
  96945. + pLed->bLedStartToLinkBlinkInProgress = _FALSE;
  96946. + }
  96947. +
  96948. + if( pLed1->bLedWPSBlinkInProgress )
  96949. + {
  96950. + _cancel_timer_ex(&(pLed1->BlinkTimer));
  96951. + pLed1->bLedWPSBlinkInProgress = _FALSE;
  96952. + }
  96953. +
  96954. + pLed1->BlinkingLedState = LED_UNKNOWN;
  96955. + SwLedOff(padapter, pLed);
  96956. + SwLedOff(padapter, pLed1);
  96957. + break;
  96958. +
  96959. + default:
  96960. + break;
  96961. +
  96962. + }
  96963. +
  96964. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState));
  96965. +}
  96966. +
  96967. +
  96968. +
  96969. + //Sercomm-Belkin, added by chiyoko, 20090415
  96970. +static void
  96971. +SwLedControlMode5(
  96972. + _adapter *padapter,
  96973. + LED_CTL_MODE LedAction
  96974. +)
  96975. +{
  96976. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  96977. + struct led_priv *ledpriv = &(padapter->ledpriv);
  96978. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  96979. + PLED_871x pLed = &(ledpriv->SwLed0);
  96980. +
  96981. + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO)
  96982. + pLed = &(ledpriv->SwLed1);
  96983. +
  96984. + switch(LedAction)
  96985. + {
  96986. + case LED_CTL_POWER_ON:
  96987. + case LED_CTL_NO_LINK:
  96988. + case LED_CTL_LINK: //solid blue
  96989. + pLed->CurrLedState = RTW_LED_ON;
  96990. + pLed->BlinkingLedState = RTW_LED_ON;
  96991. +
  96992. + _set_timer(&(pLed->BlinkTimer), 0);
  96993. + break;
  96994. +
  96995. + case LED_CTL_SITE_SURVEY:
  96996. + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
  96997. + ;
  96998. + else if(pLed->bLedScanBlinkInProgress ==_FALSE)
  96999. + {
  97000. + if(pLed->bLedBlinkInProgress ==_TRUE)
  97001. + {
  97002. + _cancel_timer_ex(&(pLed->BlinkTimer));
  97003. + pLed->bLedBlinkInProgress = _FALSE;
  97004. + }
  97005. + pLed->bLedScanBlinkInProgress = _TRUE;
  97006. + pLed->CurrLedState = LED_SCAN_BLINK;
  97007. + pLed->BlinkTimes = 24;
  97008. + if( pLed->bLedOn )
  97009. + pLed->BlinkingLedState = RTW_LED_OFF;
  97010. + else
  97011. + pLed->BlinkingLedState = RTW_LED_ON;
  97012. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);
  97013. + }
  97014. + break;
  97015. +
  97016. + case LED_CTL_TX:
  97017. + case LED_CTL_RX:
  97018. + if(pLed->bLedBlinkInProgress ==_FALSE)
  97019. + {
  97020. + if(pLed->CurrLedState == LED_SCAN_BLINK)
  97021. + {
  97022. + return;
  97023. + }
  97024. + pLed->bLedBlinkInProgress = _TRUE;
  97025. + pLed->CurrLedState = LED_TXRX_BLINK;
  97026. + pLed->BlinkTimes = 2;
  97027. + if( pLed->bLedOn )
  97028. + pLed->BlinkingLedState = RTW_LED_OFF;
  97029. + else
  97030. + pLed->BlinkingLedState = RTW_LED_ON;
  97031. + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
  97032. + }
  97033. + break;
  97034. +
  97035. + case LED_CTL_POWER_OFF:
  97036. + pLed->CurrLedState = RTW_LED_OFF;
  97037. + pLed->BlinkingLedState = RTW_LED_OFF;
  97038. +
  97039. + if( pLed->bLedBlinkInProgress)
  97040. + {
  97041. + _cancel_timer_ex(&(pLed->BlinkTimer));
  97042. + pLed->bLedBlinkInProgress = _FALSE;
  97043. + }
  97044. +
  97045. + SwLedOff(padapter, pLed);
  97046. + break;
  97047. +
  97048. + default:
  97049. + break;
  97050. +
  97051. + }
  97052. +
  97053. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState));
  97054. +}
  97055. +
  97056. + //WNC-Corega, added by chiyoko, 20090902
  97057. +static void
  97058. +SwLedControlMode6(
  97059. + _adapter *padapter,
  97060. + LED_CTL_MODE LedAction
  97061. +)
  97062. +{
  97063. + struct led_priv *ledpriv = &(padapter->ledpriv);
  97064. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  97065. + PLED_871x pLed0 = &(ledpriv->SwLed0);
  97066. +
  97067. + switch(LedAction)
  97068. + {
  97069. + case LED_CTL_POWER_ON:
  97070. + case LED_CTL_LINK:
  97071. + case LED_CTL_NO_LINK:
  97072. + _cancel_timer_ex(&(pLed0->BlinkTimer));
  97073. + pLed0->CurrLedState = RTW_LED_ON;
  97074. + pLed0->BlinkingLedState = RTW_LED_ON;
  97075. + _set_timer(&(pLed0->BlinkTimer), 0);
  97076. + break;
  97077. +
  97078. + case LED_CTL_POWER_OFF:
  97079. + SwLedOff(padapter, pLed0);
  97080. + break;
  97081. +
  97082. + default:
  97083. + break;
  97084. + }
  97085. +
  97086. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed0->CurrLedState));
  97087. +}
  97088. +
  97089. +
  97090. +//
  97091. +// Description:
  97092. +// Dispatch LED action according to pHalData->LedStrategy.
  97093. +//
  97094. +static void
  97095. +LedControl871x(
  97096. + _adapter *padapter,
  97097. + LED_CTL_MODE LedAction
  97098. + )
  97099. +{
  97100. + struct led_priv *ledpriv = &(padapter->ledpriv);
  97101. +
  97102. + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)
  97103. + ||(padapter->hw_init_completed == _FALSE) )
  97104. + {
  97105. + return;
  97106. + }
  97107. +
  97108. +
  97109. + if( ledpriv->bRegUseLed == _FALSE)
  97110. + return;
  97111. +
  97112. + //if (!priv->up)
  97113. + // return;
  97114. +
  97115. + //if(priv->bInHctTest)
  97116. + // return;
  97117. +
  97118. + if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on &&
  97119. + padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) &&
  97120. + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
  97121. + LedAction == LED_CTL_SITE_SURVEY ||
  97122. + LedAction == LED_CTL_LINK ||
  97123. + LedAction == LED_CTL_NO_LINK ||
  97124. + LedAction == LED_CTL_POWER_ON) )
  97125. + {
  97126. + return;
  97127. + }
  97128. +
  97129. + switch(ledpriv->LedStrategy)
  97130. + {
  97131. + case SW_LED_MODE0:
  97132. + //SwLedControlMode0(padapter, LedAction);
  97133. + break;
  97134. +
  97135. + case SW_LED_MODE1:
  97136. + SwLedControlMode1(padapter, LedAction);
  97137. + break;
  97138. + case SW_LED_MODE2:
  97139. + SwLedControlMode2(padapter, LedAction);
  97140. + break;
  97141. +
  97142. + case SW_LED_MODE3:
  97143. + SwLedControlMode3(padapter, LedAction);
  97144. + break;
  97145. +
  97146. + case SW_LED_MODE4:
  97147. + SwLedControlMode4(padapter, LedAction);
  97148. + break;
  97149. +
  97150. + case SW_LED_MODE5:
  97151. + SwLedControlMode5(padapter, LedAction);
  97152. + break;
  97153. +
  97154. + case SW_LED_MODE6:
  97155. + SwLedControlMode6(padapter, LedAction);
  97156. + break;
  97157. +
  97158. + default:
  97159. + break;
  97160. + }
  97161. +
  97162. + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction));
  97163. +}
  97164. +
  97165. +//
  97166. +// Description:
  97167. +// Initialize all LED_871x objects.
  97168. +//
  97169. +void
  97170. +rtl8192cu_InitSwLeds(
  97171. + _adapter *padapter
  97172. + )
  97173. +{
  97174. + struct led_priv *pledpriv = &(padapter->ledpriv);
  97175. +
  97176. + pledpriv->LedControlHandler = LedControl871x;
  97177. +
  97178. + InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0);
  97179. +
  97180. + InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1);
  97181. +}
  97182. +
  97183. +
  97184. +//
  97185. +// Description:
  97186. +// DeInitialize all LED_819xUsb objects.
  97187. +//
  97188. +void
  97189. +rtl8192cu_DeInitSwLeds(
  97190. + _adapter *padapter
  97191. + )
  97192. +{
  97193. + struct led_priv *ledpriv = &(padapter->ledpriv);
  97194. +
  97195. + DeInitLed871x( &(ledpriv->SwLed0) );
  97196. + DeInitLed871x( &(ledpriv->SwLed1) );
  97197. +}
  97198. --- /dev/null
  97199. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c
  97200. @@ -0,0 +1,227 @@
  97201. +/******************************************************************************
  97202. + *
  97203. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  97204. + *
  97205. + * This program is free software; you can redistribute it and/or modify it
  97206. + * under the terms of version 2 of the GNU General Public License as
  97207. + * published by the Free Software Foundation.
  97208. + *
  97209. + * This program is distributed in the hope that it will be useful, but WITHOUT
  97210. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  97211. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  97212. + * more details.
  97213. + *
  97214. + * You should have received a copy of the GNU General Public License along with
  97215. + * this program; if not, write to the Free Software Foundation, Inc.,
  97216. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  97217. + *
  97218. + *
  97219. + ******************************************************************************/
  97220. +#define _RTL8192CU_RECV_C_
  97221. +#include <drv_conf.h>
  97222. +#include <osdep_service.h>
  97223. +#include <drv_types.h>
  97224. +#include <recv_osdep.h>
  97225. +#include <mlme_osdep.h>
  97226. +#include <ip.h>
  97227. +#include <if_ether.h>
  97228. +#include <ethernet.h>
  97229. +
  97230. +#include <usb_ops.h>
  97231. +
  97232. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  97233. +
  97234. +#error "Shall be Linux or Windows, but not both!\n"
  97235. +
  97236. +#endif
  97237. +
  97238. +#include <wifi.h>
  97239. +#include <circ_buf.h>
  97240. +
  97241. +#include <rtl8192c_hal.h>
  97242. +
  97243. +
  97244. +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf)
  97245. +{
  97246. +
  97247. + precvbuf->transfer_len = 0;
  97248. +
  97249. + precvbuf->len = 0;
  97250. +
  97251. + precvbuf->ref_cnt = 0;
  97252. +
  97253. + if(precvbuf->pbuf)
  97254. + {
  97255. + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf;
  97256. + precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;
  97257. + }
  97258. +
  97259. +}
  97260. +
  97261. +int rtl8192cu_init_recv_priv(_adapter *padapter)
  97262. +{
  97263. + struct recv_priv *precvpriv = &padapter->recvpriv;
  97264. + int i, res = _SUCCESS;
  97265. + struct recv_buf *precvbuf;
  97266. +
  97267. +#ifdef CONFIG_RECV_THREAD_MODE
  97268. + _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed
  97269. + _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed
  97270. +#endif
  97271. +
  97272. +#ifdef PLATFORM_LINUX
  97273. + tasklet_init(&precvpriv->recv_tasklet,
  97274. + (void(*)(unsigned long))rtl8192cu_recv_tasklet,
  97275. + (unsigned long)padapter);
  97276. +#endif
  97277. +
  97278. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  97279. +#ifdef PLATFORM_LINUX
  97280. + precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
  97281. + if(precvpriv->int_in_urb == NULL){
  97282. + DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n");
  97283. + }
  97284. +#endif
  97285. + precvpriv->int_in_buf = rtw_zmalloc(sizeof(INTERRUPT_MSG_FORMAT_EX));
  97286. + if(precvpriv->int_in_buf == NULL){
  97287. + DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n");
  97288. + }
  97289. +#endif
  97290. +
  97291. + //init recv_buf
  97292. + _rtw_init_queue(&precvpriv->free_recv_buf_queue);
  97293. +
  97294. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  97295. + _rtw_init_queue(&precvpriv->recv_buf_pending_queue);
  97296. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
  97297. +
  97298. + precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4);
  97299. + if(precvpriv->pallocated_recv_buf==NULL){
  97300. + res= _FAIL;
  97301. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n"));
  97302. + goto exit;
  97303. + }
  97304. + _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *sizeof(struct recv_buf) + 4);
  97305. +
  97306. + precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4);
  97307. + //precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 -
  97308. + // ((uint) (precvpriv->pallocated_recv_buf) &(4-1));
  97309. +
  97310. +
  97311. + precvbuf = (struct recv_buf*)precvpriv->precv_buf;
  97312. +
  97313. + for(i=0; i < NR_RECVBUFF ; i++)
  97314. + {
  97315. + _rtw_init_listhead(&precvbuf->list);
  97316. +
  97317. + _rtw_spinlock_init(&precvbuf->recvbuf_lock);
  97318. +
  97319. + precvbuf->alloc_sz = MAX_RECVBUF_SZ;
  97320. +
  97321. + res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf);
  97322. + if(res==_FAIL)
  97323. + break;
  97324. +
  97325. + precvbuf->ref_cnt = 0;
  97326. + precvbuf->adapter =padapter;
  97327. +
  97328. +
  97329. + //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue));
  97330. +
  97331. + precvbuf++;
  97332. +
  97333. + }
  97334. +
  97335. + precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF;
  97336. +
  97337. +#ifdef PLATFORM_LINUX
  97338. +
  97339. + skb_queue_head_init(&precvpriv->rx_skb_queue);
  97340. +
  97341. +#ifdef CONFIG_PREALLOC_RECV_SKB
  97342. + {
  97343. + int i;
  97344. + SIZE_PTR tmpaddr=0;
  97345. + SIZE_PTR alignment=0;
  97346. + struct sk_buff *pskb=NULL;
  97347. +
  97348. + skb_queue_head_init(&precvpriv->free_recv_skb_queue);
  97349. +
  97350. + for(i=0; i<NR_PREALLOC_RECV_SKB; i++)
  97351. + {
  97352. + pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
  97353. +
  97354. + if(pskb)
  97355. + {
  97356. + pskb->dev = padapter->pnetdev;
  97357. +
  97358. + tmpaddr = (SIZE_PTR)pskb->data;
  97359. + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
  97360. + skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
  97361. +
  97362. + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
  97363. + }
  97364. +
  97365. + pskb=NULL;
  97366. +
  97367. + }
  97368. + }
  97369. +#endif
  97370. +
  97371. +#endif
  97372. +
  97373. +exit:
  97374. +
  97375. + return res;
  97376. +
  97377. +}
  97378. +
  97379. +void rtl8192cu_free_recv_priv (_adapter *padapter)
  97380. +{
  97381. + int i;
  97382. + struct recv_buf *precvbuf;
  97383. + struct recv_priv *precvpriv = &padapter->recvpriv;
  97384. +
  97385. + precvbuf = (struct recv_buf *)precvpriv->precv_buf;
  97386. +
  97387. + for(i=0; i < NR_RECVBUFF ; i++)
  97388. + {
  97389. + rtw_os_recvbuf_resource_free(padapter, precvbuf);
  97390. + precvbuf++;
  97391. + }
  97392. +
  97393. + if(precvpriv->pallocated_recv_buf)
  97394. + rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4);
  97395. +
  97396. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  97397. +#ifdef PLATFORM_LINUX
  97398. + if(precvpriv->int_in_urb)
  97399. + {
  97400. + usb_free_urb(precvpriv->int_in_urb);
  97401. + }
  97402. +#endif
  97403. + if(precvpriv->int_in_buf)
  97404. + rtw_mfree(precvpriv->int_in_buf, sizeof(INTERRUPT_MSG_FORMAT_EX));
  97405. +#endif
  97406. +
  97407. +#ifdef PLATFORM_LINUX
  97408. +
  97409. + if (skb_queue_len(&precvpriv->rx_skb_queue)) {
  97410. + DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n");
  97411. + }
  97412. +
  97413. + rtw_skb_queue_purge(&precvpriv->rx_skb_queue);
  97414. +
  97415. +#ifdef CONFIG_PREALLOC_RECV_SKB
  97416. +
  97417. + if (skb_queue_len(&precvpriv->free_recv_skb_queue)) {
  97418. + DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue));
  97419. + }
  97420. +
  97421. + rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue);
  97422. +
  97423. +#endif
  97424. +
  97425. +#endif
  97426. +
  97427. +}
  97428. --- /dev/null
  97429. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c
  97430. @@ -0,0 +1,1149 @@
  97431. +/******************************************************************************
  97432. + *
  97433. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  97434. + *
  97435. + * This program is free software; you can redistribute it and/or modify it
  97436. + * under the terms of version 2 of the GNU General Public License as
  97437. + * published by the Free Software Foundation.
  97438. + *
  97439. + * This program is distributed in the hope that it will be useful, but WITHOUT
  97440. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  97441. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  97442. + * more details.
  97443. + *
  97444. + * You should have received a copy of the GNU General Public License along with
  97445. + * this program; if not, write to the Free Software Foundation, Inc.,
  97446. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  97447. + *
  97448. + *
  97449. + ******************************************************************************/
  97450. +#define _RTL8192C_XMIT_C_
  97451. +#include <drv_conf.h>
  97452. +#include <osdep_service.h>
  97453. +#include <drv_types.h>
  97454. +#include <rtw_byteorder.h>
  97455. +#include <wifi.h>
  97456. +#include <osdep_intf.h>
  97457. +#include <circ_buf.h>
  97458. +#include <usb_ops.h>
  97459. +#include <rtl8192c_hal.h>
  97460. +
  97461. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  97462. +#error "Shall be Linux or Windows, but not both!\n"
  97463. +#endif
  97464. +
  97465. +
  97466. +s32 rtl8192cu_init_xmit_priv(_adapter *padapter)
  97467. +{
  97468. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  97469. +
  97470. +#ifdef PLATFORM_LINUX
  97471. + tasklet_init(&pxmitpriv->xmit_tasklet,
  97472. + (void(*)(unsigned long))rtl8192cu_xmit_tasklet,
  97473. + (unsigned long)padapter);
  97474. +#endif
  97475. + return _SUCCESS;
  97476. +}
  97477. +
  97478. +void rtl8192cu_free_xmit_priv(_adapter *padapter)
  97479. +{
  97480. +}
  97481. +
  97482. +u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
  97483. +{
  97484. + u32 addr;
  97485. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  97486. +
  97487. + switch(pattrib->qsel)
  97488. + {
  97489. + case 0:
  97490. + case 3:
  97491. + addr = BE_QUEUE_INX;
  97492. + break;
  97493. + case 1:
  97494. + case 2:
  97495. + addr = BK_QUEUE_INX;
  97496. + break;
  97497. + case 4:
  97498. + case 5:
  97499. + addr = VI_QUEUE_INX;
  97500. + break;
  97501. + case 6:
  97502. + case 7:
  97503. + addr = VO_QUEUE_INX;
  97504. + break;
  97505. + case 0x10:
  97506. + addr = BCN_QUEUE_INX;
  97507. + break;
  97508. + case 0x11://BC/MC in PS (HIQ)
  97509. + addr = HIGH_QUEUE_INX;
  97510. + break;
  97511. + case 0x12:
  97512. + addr = MGT_QUEUE_INX;
  97513. + break;
  97514. + default:
  97515. + addr = BE_QUEUE_INX;
  97516. + break;
  97517. +
  97518. + }
  97519. +
  97520. + return addr;
  97521. +
  97522. +}
  97523. +
  97524. +int urb_zero_packet_chk(_adapter *padapter, int sz)
  97525. +{
  97526. + int blnSetTxDescOffset;
  97527. + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
  97528. +
  97529. + if ( pdvobj->ishighspeed )
  97530. + {
  97531. + if ( ( (sz + TXDESC_SIZE) % 512 ) == 0 ) {
  97532. + blnSetTxDescOffset = 1;
  97533. + } else {
  97534. + blnSetTxDescOffset = 0;
  97535. + }
  97536. + }
  97537. + else
  97538. + {
  97539. + if ( ( (sz + TXDESC_SIZE) % 64 ) == 0 ) {
  97540. + blnSetTxDescOffset = 1;
  97541. + } else {
  97542. + blnSetTxDescOffset = 0;
  97543. + }
  97544. + }
  97545. +
  97546. + return blnSetTxDescOffset;
  97547. +
  97548. +}
  97549. +
  97550. +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc)
  97551. +{
  97552. + u16 *usPtr = (u16*)ptxdesc;
  97553. + u32 count = 16; // (32 bytes / 2 bytes per XOR) => 16 times
  97554. + u32 index;
  97555. + u16 checksum = 0;
  97556. +
  97557. + //Clear first
  97558. + ptxdesc->txdw7 &= cpu_to_le32(0xffff0000);
  97559. +
  97560. + for(index = 0 ; index < count ; index++){
  97561. + checksum = checksum ^ le16_to_cpu(*(usPtr + index));
  97562. + }
  97563. +
  97564. + ptxdesc->txdw7 |= cpu_to_le32(0x0000ffff&checksum);
  97565. +
  97566. +}
  97567. +
  97568. +void fill_txdesc_sectype(struct pkt_attrib *pattrib, struct tx_desc *ptxdesc)
  97569. +{
  97570. + if ((pattrib->encrypt > 0) && !pattrib->bswenc)
  97571. + {
  97572. + switch (pattrib->encrypt)
  97573. + {
  97574. + //SEC_TYPE
  97575. + case _WEP40_:
  97576. + case _WEP104_:
  97577. + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000);
  97578. + break;
  97579. + case _TKIP_:
  97580. + case _TKIP_WTMIC_:
  97581. + //ptxdesc->txdw1 |= cpu_to_le32((0x02<<22)&0x00c00000);
  97582. + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000);
  97583. + break;
  97584. + case _AES_:
  97585. + ptxdesc->txdw1 |= cpu_to_le32((0x03<<22)&0x00c00000);
  97586. + break;
  97587. + case _NO_PRIVACY_:
  97588. + default:
  97589. + break;
  97590. +
  97591. + }
  97592. +
  97593. + }
  97594. +
  97595. +}
  97596. +
  97597. +static void fill_txdesc_vcs(struct pkt_attrib *pattrib, u32 *pdw)
  97598. +{
  97599. + //DBG_8192C("cvs_mode=%d\n", pattrib->vcs_mode);
  97600. +
  97601. + switch(pattrib->vcs_mode)
  97602. + {
  97603. + case RTS_CTS:
  97604. + *pdw |= cpu_to_le32(BIT(12));
  97605. + break;
  97606. + case CTS_TO_SELF:
  97607. + *pdw |= cpu_to_le32(BIT(11));
  97608. + break;
  97609. + case NONE_VCS:
  97610. + default:
  97611. + break;
  97612. + }
  97613. +
  97614. + if(pattrib->vcs_mode) {
  97615. + *pdw |= cpu_to_le32(BIT(13));
  97616. +
  97617. + // Set RTS BW
  97618. + if(pattrib->ht_en)
  97619. + {
  97620. + *pdw |= (pattrib->bwmode&HT_CHANNEL_WIDTH_40)? cpu_to_le32(BIT(27)):0;
  97621. +
  97622. + if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
  97623. + *pdw |= cpu_to_le32((0x01<<28)&0x30000000);
  97624. + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
  97625. + *pdw |= cpu_to_le32((0x02<<28)&0x30000000);
  97626. + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)
  97627. + *pdw |= 0;
  97628. + else
  97629. + *pdw |= cpu_to_le32((0x03<<28)&0x30000000);
  97630. + }
  97631. + }
  97632. +}
  97633. +
  97634. +static void fill_txdesc_phy(struct pkt_attrib *pattrib, u32 *pdw)
  97635. +{
  97636. + //DBG_8192C("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset);
  97637. +
  97638. + if(pattrib->ht_en)
  97639. + {
  97640. + *pdw |= (pattrib->bwmode&HT_CHANNEL_WIDTH_40)? cpu_to_le32(BIT(25)):0;
  97641. +
  97642. + if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
  97643. + *pdw |= cpu_to_le32((0x01<<20)&0x00300000);
  97644. + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
  97645. + *pdw |= cpu_to_le32((0x02<<20)&0x00300000);
  97646. + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)
  97647. + *pdw |= 0;
  97648. + else
  97649. + *pdw |= cpu_to_le32((0x03<<20)&0x00300000);
  97650. + }
  97651. +}
  97652. +
  97653. +static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz, u8 bagg_pkt)
  97654. +{
  97655. + int pull=0;
  97656. + uint qsel;
  97657. + _adapter *padapter = pxmitframe->padapter;
  97658. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  97659. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  97660. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  97661. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  97662. + struct tx_desc *ptxdesc = (struct tx_desc *)pmem;
  97663. + struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  97664. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  97665. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  97666. + sint bmcst = IS_MCAST(pattrib->ra);
  97667. +#ifdef CONFIG_P2P
  97668. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  97669. +#endif //CONFIG_P2P
  97670. +
  97671. +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
  97672. + if((_FALSE == bagg_pkt) && (urb_zero_packet_chk(padapter, sz)==0))
  97673. + {
  97674. + ptxdesc = (struct tx_desc *)(pmem+PACKET_OFFSET_SZ);
  97675. + pull = 1;
  97676. + pxmitframe->pkt_offset --;
  97677. + }
  97678. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
  97679. +
  97680. + _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc));
  97681. +
  97682. + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
  97683. + {
  97684. + //DBG_8192C("pxmitframe->frame_tag == DATA_FRAMETAG\n");
  97685. +
  97686. + //offset 4
  97687. + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f);
  97688. +
  97689. + qsel = (uint)(pattrib->qsel & 0x0000001f);
  97690. + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00);
  97691. +
  97692. + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000);
  97693. +
  97694. + fill_txdesc_sectype(pattrib, ptxdesc);
  97695. +
  97696. + if(pattrib->ampdu_en==_TRUE)
  97697. + ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN
  97698. + else
  97699. + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK
  97700. +
  97701. + //offset 8
  97702. +
  97703. +
  97704. + //offset 12
  97705. + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000);
  97706. +
  97707. +
  97708. + //offset 16 , offset 20
  97709. + if (pattrib->qos_en)
  97710. + ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS
  97711. +
  97712. + if ((pattrib->ether_type != 0x888e) && (pattrib->ether_type != 0x0806) && (pattrib->dhcp_pkt != 1))
  97713. + {
  97714. + //Non EAP & ARP & DHCP type data packet
  97715. +
  97716. + fill_txdesc_vcs(pattrib, &ptxdesc->txdw4);
  97717. + fill_txdesc_phy(pattrib, &ptxdesc->txdw4);
  97718. +
  97719. + ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M
  97720. + ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00);//
  97721. + //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M
  97722. +
  97723. + //use REG_INIDATA_RATE_SEL value
  97724. + ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]);
  97725. +
  97726. + if(0)//for driver dbg
  97727. + {
  97728. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  97729. +
  97730. + if(pattrib->ht_en)
  97731. + ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI
  97732. +
  97733. + ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7
  97734. + }
  97735. +
  97736. + }
  97737. + else
  97738. + {
  97739. + // EAP data packet and ARP packet.
  97740. + // Use the 1M data rate to send the EAP/ARP packet.
  97741. + // This will maybe make the handshake smooth.
  97742. +
  97743. + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK
  97744. +
  97745. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  97746. +
  97747. + if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
  97748. + ptxdesc->txdw4 |= cpu_to_le32(BIT(24));// DATA_SHORT
  97749. +
  97750. + ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate));
  97751. + }
  97752. +
  97753. + //offset 24
  97754. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  97755. + if ( pattrib->hw_tcp_csum == 1 ) {
  97756. + // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!!
  97757. + u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8;
  97758. + ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16);
  97759. + DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7);
  97760. + }
  97761. +#endif
  97762. + }
  97763. + else if((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG)
  97764. + {
  97765. + //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n");
  97766. +
  97767. + //offset 4
  97768. + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f);
  97769. +
  97770. + qsel = (uint)(pattrib->qsel&0x0000001f);
  97771. + ptxdesc->txdw1 |= cpu_to_le32((qsel<<QSEL_SHT)&0x00001f00);
  97772. +
  97773. + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000);
  97774. +
  97775. + //fill_txdesc_sectype(pattrib, ptxdesc);
  97776. +
  97777. + //offset 8
  97778. +#ifdef CONFIG_XMIT_ACK
  97779. + //CCX-TXRPT ack for xmit mgmt frames.
  97780. + if (pxmitframe->ack_report) {
  97781. + ptxdesc->txdw2 |= cpu_to_le32(BIT(19));
  97782. + #ifdef DBG_CCX
  97783. + DBG_871X("%s set ccx\n", __func__);
  97784. + #endif
  97785. + }
  97786. +#endif //CONFIG_XMIT_ACK
  97787. +
  97788. + //offset 12
  97789. + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000);
  97790. +
  97791. + //offset 16
  97792. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  97793. +
  97794. + //offset 20
  97795. + ptxdesc->txdw5 |= cpu_to_le32(BIT(17));//retry limit enable
  97796. + if(pattrib->retry_ctrl == _TRUE)
  97797. + {
  97798. +#ifdef CONFIG_P2P
  97799. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  97800. + {
  97801. +#ifdef CONFIG_INTEL_WIDI
  97802. + if(padapter->mlmepriv.widi_enable == _TRUE)
  97803. + ptxdesc->txdw5 |= cpu_to_le32(0x00180000);//retry limit = 6
  97804. + else
  97805. +#endif //CONFIG_INTEL_WIDI
  97806. + ptxdesc->txdw5 |= cpu_to_le32(0x00080000);//retry limit = 2
  97807. + }
  97808. + else
  97809. +#endif //CONFIG_P2P
  97810. + ptxdesc->txdw5 |= cpu_to_le32(0x00180000);//retry limit = 6
  97811. + }
  97812. + else
  97813. + ptxdesc->txdw5 |= cpu_to_le32(0x00300000);//retry limit = 12
  97814. +
  97815. +#ifdef CONFIG_INTEL_PROXIM
  97816. + if((padapter->proximity.proxim_on==_TRUE)&&(pattrib->intel_proxim==_TRUE)){
  97817. + printk("\n %s pattrib->rate=%d\n",__FUNCTION__,pattrib->rate);
  97818. + ptxdesc->txdw5 |= cpu_to_le32( pattrib->rate);
  97819. + }
  97820. + else
  97821. +#endif
  97822. + {
  97823. + ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate));
  97824. + }
  97825. + }
  97826. + else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG)
  97827. + {
  97828. + DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n");
  97829. + }
  97830. +#ifdef CONFIG_MP_INCLUDED
  97831. + else if((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG)
  97832. + {
  97833. + fill_txdesc_for_mp(padapter, ptxdesc);
  97834. + }
  97835. +#endif
  97836. + else
  97837. + {
  97838. + DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag);
  97839. +
  97840. + //offset 4
  97841. + ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID)
  97842. +
  97843. + ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid
  97844. +
  97845. + //offset 8
  97846. +
  97847. + //offset 12
  97848. + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000);
  97849. +
  97850. + //offset 16
  97851. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  97852. +
  97853. + //offset 20
  97854. + ptxdesc->txdw5 |= cpu_to_le32(MRateToHwRate(pmlmeext->tx_rate));
  97855. + }
  97856. +
  97857. + // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS.
  97858. + // (1) The sequence number of each non-Qos frame / broadcast / multicast /
  97859. + // mgnt frame should be controled by Hw because Fw will also send null data
  97860. + // which we cannot control when Fw LPS enable.
  97861. + // --> default enable non-Qos data sequense number. 2010.06.23. by tynli.
  97862. + // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon.
  97863. + // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets.
  97864. + // 2010.06.23. Added by tynli.
  97865. + if(!pattrib->qos_en)
  97866. + {
  97867. + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number
  97868. + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29.
  97869. + }
  97870. +
  97871. + //offset 0
  97872. + ptxdesc->txdw0 |= cpu_to_le32(sz&0x0000ffff);
  97873. + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
  97874. + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<<OFFSET_SHT)&0x00ff0000);//32 bytes for TX Desc
  97875. +
  97876. + if(bmcst)
  97877. + {
  97878. + ptxdesc->txdw0 |= cpu_to_le32(BIT(24));
  97879. + }
  97880. +
  97881. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("offset0-txdesc=0x%x\n", ptxdesc->txdw0));
  97882. +
  97883. + //offset 4
  97884. + // pkt_offset, unit:8 bytes padding
  97885. + if (pxmitframe->pkt_offset > 0)
  97886. + ptxdesc->txdw1 |= cpu_to_le32((pxmitframe->pkt_offset << 26) & 0x7c000000);
  97887. +
  97888. +#ifdef CONFIG_USB_TX_AGGREGATION
  97889. + if (pxmitframe->agg_num > 1)
  97890. + ptxdesc->txdw5 |= cpu_to_le32((pxmitframe->agg_num << 24) & 0xff000000);
  97891. +#endif
  97892. +
  97893. + rtl8192cu_cal_txdesc_chksum(ptxdesc);
  97894. +
  97895. + return pull;
  97896. +
  97897. +}
  97898. +
  97899. +static s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe)
  97900. +{
  97901. + s32 ret = _SUCCESS;
  97902. + s32 inner_ret = _SUCCESS;
  97903. + int t, sz, w_sz, pull=0;
  97904. + u8 *mem_addr;
  97905. + u32 ff_hwaddr;
  97906. + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf;
  97907. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  97908. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  97909. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  97910. +
  97911. + if ((pxmitframe->frame_tag == DATA_FRAMETAG) &&
  97912. + (pxmitframe->attrib.ether_type != 0x0806) &&
  97913. + (pxmitframe->attrib.ether_type != 0x888e) &&
  97914. + (pxmitframe->attrib.dhcp_pkt != 1))
  97915. + {
  97916. + rtw_issue_addbareq_cmd(padapter, pxmitframe);
  97917. + }
  97918. +
  97919. + mem_addr = pxmitframe->buf_addr;
  97920. +
  97921. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n"));
  97922. +
  97923. + for (t = 0; t < pattrib->nr_frags; t++)
  97924. + {
  97925. + if (inner_ret != _SUCCESS && ret == _SUCCESS)
  97926. + ret = _FAIL;
  97927. +
  97928. + if (t != (pattrib->nr_frags - 1))
  97929. + {
  97930. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags));
  97931. +
  97932. + sz = pxmitpriv->frag_len;
  97933. + sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len);
  97934. + }
  97935. + else //no frag
  97936. + {
  97937. + sz = pattrib->last_txcmdsz;
  97938. + }
  97939. +
  97940. + pull = update_txdesc(pxmitframe, mem_addr, sz, _FALSE);
  97941. +
  97942. + if(pull)
  97943. + {
  97944. + mem_addr += PACKET_OFFSET_SZ; //pull txdesc head
  97945. +
  97946. + //pxmitbuf ->pbuf = mem_addr;
  97947. + pxmitframe->buf_addr = mem_addr;
  97948. +
  97949. + w_sz = sz + TXDESC_SIZE;
  97950. + }
  97951. + else
  97952. + {
  97953. + w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ;
  97954. + }
  97955. +
  97956. + ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe);
  97957. +
  97958. + inner_ret = rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf);
  97959. +
  97960. + rtw_count_tx_stats(padapter, pxmitframe, sz);
  97961. +
  97962. +
  97963. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz));
  97964. + //DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority);
  97965. +
  97966. + mem_addr += w_sz;
  97967. +
  97968. + mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr)));
  97969. +
  97970. + }
  97971. +
  97972. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  97973. +
  97974. + if (ret != _SUCCESS)
  97975. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);
  97976. +
  97977. + return ret;
  97978. +}
  97979. +
  97980. +#ifdef CONFIG_USB_TX_AGGREGATION
  97981. +static u32 xmitframe_need_length(struct xmit_frame *pxmitframe)
  97982. +{
  97983. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  97984. +
  97985. + u32 len = 0;
  97986. +
  97987. + // no consider fragement
  97988. + len = pattrib->hdrlen + pattrib->iv_len +
  97989. + SNAP_SIZE + sizeof(u16) +
  97990. + pattrib->pktlen +
  97991. + ((pattrib->bswenc) ? pattrib->icv_len : 0);
  97992. +
  97993. + if(pattrib->encrypt ==_TKIP_)
  97994. + len += 8;
  97995. +
  97996. + return len;
  97997. +}
  97998. +
  97999. +#define IDEA_CONDITION 1 // check all packets before enqueue
  98000. +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  98001. +{
  98002. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  98003. + struct xmit_frame *pxmitframe = NULL;
  98004. + struct xmit_frame *pfirstframe = NULL;
  98005. +
  98006. + // aggregate variable
  98007. + struct hw_xmit *phwxmit;
  98008. + struct sta_info *psta = NULL;
  98009. + struct tx_servq *ptxservq = NULL;
  98010. +
  98011. + _irqL irqL;
  98012. + _list *xmitframe_plist = NULL, *xmitframe_phead = NULL;
  98013. +
  98014. + u32 pbuf; // next pkt address
  98015. + u32 pbuf_tail; // last pkt tail
  98016. + u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET
  98017. +
  98018. + u32 bulkSize = pHalData->UsbBulkOutSize;
  98019. + u8 descCount;
  98020. + u32 bulkPtr;
  98021. +
  98022. + // dump frame variable
  98023. + u32 ff_hwaddr;
  98024. +
  98025. +#ifndef IDEA_CONDITION
  98026. + int res = _SUCCESS;
  98027. +#endif
  98028. +
  98029. + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_info_, ("+xmitframe_complete\n"));
  98030. +
  98031. +
  98032. + // check xmitbuffer is ok
  98033. + if (pxmitbuf == NULL) {
  98034. + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
  98035. + if (pxmitbuf == NULL) return _FALSE;
  98036. + }
  98037. +
  98038. +
  98039. + //3 1. pick up first frame
  98040. + do {
  98041. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98042. +
  98043. + pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
  98044. + if (pxmitframe == NULL) {
  98045. + // no more xmit frame, release xmit buffer
  98046. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  98047. + return _FALSE;
  98048. + }
  98049. +
  98050. +
  98051. +#ifndef IDEA_CONDITION
  98052. + if (pxmitframe->frame_tag != DATA_FRAMETAG) {
  98053. + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,
  98054. + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n",
  98055. + pxmitframe->frame_tag, DATA_FRAMETAG));
  98056. +// rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98057. + continue;
  98058. + }
  98059. +
  98060. + // TID 0~15
  98061. + if ((pxmitframe->attrib.priority < 0) ||
  98062. + (pxmitframe->attrib.priority > 15)) {
  98063. + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,
  98064. + ("xmitframe_complete: TID(%d) should be 0~15!\n",
  98065. + pxmitframe->attrib.priority));
  98066. +// rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98067. + continue;
  98068. + }
  98069. +#endif
  98070. +
  98071. + pxmitframe->pxmitbuf = pxmitbuf;
  98072. + pxmitframe->buf_addr = pxmitbuf->pbuf;
  98073. + pxmitbuf->priv_data = pxmitframe;
  98074. +
  98075. + //pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1.
  98076. + pxmitframe->pkt_offset = 1; // first frame of aggregation, reserve offset
  98077. +
  98078. +
  98079. + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) {
  98080. + DBG_871X("%s coalesce 1st xmitframe failed \n",__FUNCTION__);
  98081. + continue;
  98082. + }
  98083. +
  98084. +
  98085. + // always return ndis_packet after rtw_xmitframe_coalesce
  98086. + rtw_os_xmit_complete(padapter, pxmitframe);
  98087. +
  98088. + break;
  98089. + } while (1);
  98090. +
  98091. + //3 2. aggregate same priority and same DA(AP or STA) frames
  98092. + pfirstframe = pxmitframe;
  98093. + len = xmitframe_need_length(pfirstframe) + TXDESC_OFFSET;
  98094. + pbuf_tail = len;
  98095. + pbuf = _RND8(pbuf_tail);
  98096. +
  98097. + // check pkt amount in one bluk
  98098. + descCount = 0;
  98099. + bulkPtr = bulkSize;
  98100. + if (pbuf < bulkPtr)
  98101. + descCount++;
  98102. + else {
  98103. + descCount = 0;
  98104. + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize
  98105. + }
  98106. +
  98107. + // dequeue same priority packet from station tx queue
  98108. + psta = pfirstframe->attrib.psta;
  98109. + switch (pfirstframe->attrib.priority) {
  98110. + case 1:
  98111. + case 2:
  98112. + ptxservq = &(psta->sta_xmitpriv.bk_q);
  98113. + phwxmit = pxmitpriv->hwxmits + 3;
  98114. + break;
  98115. +
  98116. + case 4:
  98117. + case 5:
  98118. + ptxservq = &(psta->sta_xmitpriv.vi_q);
  98119. + phwxmit = pxmitpriv->hwxmits + 1;
  98120. + break;
  98121. +
  98122. + case 6:
  98123. + case 7:
  98124. + ptxservq = &(psta->sta_xmitpriv.vo_q);
  98125. + phwxmit = pxmitpriv->hwxmits;
  98126. + break;
  98127. +
  98128. + case 0:
  98129. + case 3:
  98130. + default:
  98131. + ptxservq = &(psta->sta_xmitpriv.be_q);
  98132. + phwxmit = pxmitpriv->hwxmits + 2;
  98133. + break;
  98134. + }
  98135. +
  98136. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  98137. +
  98138. + xmitframe_phead = get_list_head(&ptxservq->sta_pending);
  98139. + xmitframe_plist = get_next(xmitframe_phead);
  98140. + while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE)
  98141. + {
  98142. + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  98143. + xmitframe_plist = get_next(xmitframe_plist);
  98144. +
  98145. + len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE; // no offset
  98146. + if (pbuf + len > MAX_XMITBUF_SZ) break;
  98147. +
  98148. + rtw_list_delete(&pxmitframe->list);
  98149. + ptxservq->qcnt--;
  98150. + phwxmit->accnt--;
  98151. +
  98152. +#ifndef IDEA_CONDITION
  98153. + // suppose only data frames would be in queue
  98154. + if (pxmitframe->frame_tag != DATA_FRAMETAG) {
  98155. + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,
  98156. + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n",
  98157. + pxmitframe->frame_tag, DATA_FRAMETAG));
  98158. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98159. + continue;
  98160. + }
  98161. +
  98162. + // TID 0~15
  98163. + if ((pxmitframe->attrib.priority < 0) ||
  98164. + (pxmitframe->attrib.priority > 15)) {
  98165. + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,
  98166. + ("xmitframe_complete: TID(%d) should be 0~15!\n",
  98167. + pxmitframe->attrib.priority));
  98168. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98169. + continue;
  98170. + }
  98171. +#endif
  98172. +
  98173. +// pxmitframe->pxmitbuf = pxmitbuf;
  98174. + pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf;
  98175. +
  98176. + pxmitframe->agg_num = 0; // not first frame of aggregation
  98177. + pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset
  98178. +
  98179. + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) {
  98180. + DBG_871X("%s coalesce failed \n",__FUNCTION__);
  98181. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98182. + continue;
  98183. + }
  98184. +
  98185. + // always return ndis_packet after rtw_xmitframe_coalesce
  98186. + rtw_os_xmit_complete(padapter, pxmitframe);
  98187. +
  98188. + // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz
  98189. + update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz, _TRUE);
  98190. +
  98191. + // don't need xmitframe any more
  98192. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98193. +
  98194. + // handle pointer and stop condition
  98195. + pbuf_tail = pbuf + len;
  98196. + pbuf = _RND8(pbuf_tail);
  98197. +
  98198. + pfirstframe->agg_num++;
  98199. + if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num)
  98200. + break;
  98201. +
  98202. + if (pbuf < bulkPtr) {
  98203. + descCount++;
  98204. + if (descCount == pHalData->UsbTxAggDescNum)
  98205. + break;
  98206. + } else {
  98207. + descCount = 0;
  98208. + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize;
  98209. + }
  98210. + }
  98211. + if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE)
  98212. + rtw_list_delete(&ptxservq->tx_pending);
  98213. +
  98214. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  98215. +
  98216. + if ((pfirstframe->attrib.ether_type != 0x0806) &&
  98217. + (pfirstframe->attrib.ether_type != 0x888e) &&
  98218. + (pfirstframe->attrib.dhcp_pkt != 1))
  98219. + {
  98220. + rtw_issue_addbareq_cmd(padapter, pfirstframe);
  98221. + }
  98222. +
  98223. +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX
  98224. + //3 3. update first frame txdesc
  98225. + if ((pbuf_tail % bulkSize) == 0) {
  98226. + // remove pkt_offset
  98227. + pbuf_tail -= PACKET_OFFSET_SZ;
  98228. + pfirstframe->buf_addr += PACKET_OFFSET_SZ;
  98229. + pfirstframe->pkt_offset = 0;
  98230. + }
  98231. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
  98232. + update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz, _TRUE);
  98233. +
  98234. + //3 4. write xmit buffer to USB FIFO
  98235. + ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe);
  98236. +
  98237. + // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr
  98238. + rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf);
  98239. +
  98240. +
  98241. + //3 5. update statisitc
  98242. + pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE);
  98243. + if (pfirstframe->pkt_offset == 1) pbuf_tail -= PACKET_OFFSET_SZ;
  98244. +
  98245. + rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail);
  98246. +
  98247. + rtw_free_xmitframe(pxmitpriv, pfirstframe);
  98248. +
  98249. + return _TRUE;
  98250. +}
  98251. +
  98252. +#else
  98253. +
  98254. +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  98255. +{
  98256. +
  98257. + struct hw_xmit *phwxmits;
  98258. + sint hwentry;
  98259. + struct xmit_frame *pxmitframe=NULL;
  98260. + int res=_SUCCESS, xcnt = 0;
  98261. +
  98262. + phwxmits = pxmitpriv->hwxmits;
  98263. + hwentry = pxmitpriv->hwxmit_entry;
  98264. +
  98265. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n"));
  98266. +
  98267. + if(pxmitbuf==NULL)
  98268. + {
  98269. + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
  98270. + if(!pxmitbuf)
  98271. + {
  98272. + return _FALSE;
  98273. + }
  98274. + }
  98275. +
  98276. +
  98277. + do
  98278. + {
  98279. + pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry);
  98280. +
  98281. + if(pxmitframe)
  98282. + {
  98283. + pxmitframe->pxmitbuf = pxmitbuf;
  98284. +
  98285. + pxmitframe->buf_addr = pxmitbuf->pbuf;
  98286. +
  98287. + pxmitbuf->priv_data = pxmitframe;
  98288. +
  98289. + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
  98290. + {
  98291. + if(pxmitframe->attrib.priority<=15)//TID0~15
  98292. + {
  98293. + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe);
  98294. + }
  98295. +
  98296. + rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce
  98297. + }
  98298. +
  98299. +
  98300. + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete(): rtw_dump_xframe\n"));
  98301. +
  98302. +
  98303. + if(res == _SUCCESS)
  98304. + {
  98305. + rtw_dump_xframe(padapter, pxmitframe);
  98306. + }
  98307. + else
  98308. + {
  98309. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  98310. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98311. + }
  98312. +
  98313. + xcnt++;
  98314. +
  98315. + }
  98316. + else
  98317. + {
  98318. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  98319. + return _FALSE;
  98320. + }
  98321. +
  98322. + break;
  98323. +
  98324. + }while(0/*xcnt < (NR_XMITFRAME >> 3)*/);
  98325. +
  98326. + return _TRUE;
  98327. +
  98328. +}
  98329. +#endif
  98330. +
  98331. +
  98332. +
  98333. +static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe)
  98334. +{
  98335. + s32 res = _SUCCESS;
  98336. +
  98337. +
  98338. + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe);
  98339. + if (res == _SUCCESS) {
  98340. + rtw_dump_xframe(padapter, pxmitframe);
  98341. + }
  98342. +
  98343. + return res;
  98344. +}
  98345. +
  98346. +/*
  98347. + * Return
  98348. + * _TRUE dump packet directly
  98349. + * _FALSE enqueue packet
  98350. + */
  98351. +static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe)
  98352. +{
  98353. + _irqL irqL;
  98354. + s32 res;
  98355. + struct xmit_buf *pxmitbuf = NULL;
  98356. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  98357. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  98358. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  98359. +
  98360. +
  98361. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  98362. +
  98363. +
  98364. + if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0)
  98365. + goto enqueue;
  98366. +
  98367. +
  98368. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  98369. + goto enqueue;
  98370. +
  98371. +#ifdef CONFIG_CONCURRENT_MODE
  98372. + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  98373. + goto enqueue;
  98374. +#endif
  98375. +
  98376. + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
  98377. + if (pxmitbuf == NULL)
  98378. + goto enqueue;
  98379. +
  98380. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  98381. +
  98382. + pxmitframe->pxmitbuf = pxmitbuf;
  98383. + pxmitframe->buf_addr = pxmitbuf->pbuf;
  98384. + pxmitbuf->priv_data = pxmitframe;
  98385. +
  98386. + if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) {
  98387. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  98388. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98389. + }
  98390. +
  98391. + return _TRUE;
  98392. +
  98393. +enqueue:
  98394. + res = rtw_xmitframe_enqueue(padapter, pxmitframe);
  98395. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  98396. +
  98397. + if (res != _SUCCESS) {
  98398. + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("pre_xmitframe: enqueue xmitframe fail\n"));
  98399. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98400. +
  98401. + // Trick, make the statistics correct
  98402. + pxmitpriv->tx_pkts--;
  98403. + pxmitpriv->tx_drop++;
  98404. + return _TRUE;
  98405. + }
  98406. +
  98407. + return _FALSE;
  98408. +}
  98409. +
  98410. +s32 rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)
  98411. +{
  98412. + return rtw_dump_xframe(padapter, pmgntframe);
  98413. +}
  98414. +
  98415. +/*
  98416. + * Return
  98417. + * _TRUE dump packet directly ok
  98418. + * _FALSE temporary can't transmit packets to hardware
  98419. + */
  98420. +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)
  98421. +{
  98422. + return pre_xmitframe(padapter, pxmitframe);
  98423. +}
  98424. +
  98425. +s32 rtl8192cu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
  98426. +{
  98427. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  98428. + s32 err;
  98429. +
  98430. + if ((err=rtw_xmitframe_enqueue(padapter, pxmitframe)) != _SUCCESS)
  98431. + {
  98432. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  98433. +
  98434. + // Trick, make the statistics correct
  98435. + pxmitpriv->tx_pkts--;
  98436. + pxmitpriv->tx_drop++;
  98437. + }
  98438. + else
  98439. + {
  98440. +#ifdef PLATFORM_LINUX
  98441. + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
  98442. +#endif
  98443. + }
  98444. +
  98445. + return err;
  98446. +
  98447. +}
  98448. +
  98449. +#ifdef CONFIG_HOSTAPD_MLME
  98450. +
  98451. +static void rtl8192cu_hostap_mgnt_xmit_cb(struct urb *urb)
  98452. +{
  98453. +#ifdef PLATFORM_LINUX
  98454. + struct sk_buff *skb = (struct sk_buff *)urb->context;
  98455. +
  98456. + //DBG_8192C("%s\n", __FUNCTION__);
  98457. +
  98458. + rtw_skb_free(skb);
  98459. +#endif
  98460. +}
  98461. +
  98462. +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)
  98463. +{
  98464. +#ifdef PLATFORM_LINUX
  98465. + u16 fc;
  98466. + int rc, len, pipe;
  98467. + unsigned int bmcst, tid, qsel;
  98468. + struct sk_buff *skb, *pxmit_skb;
  98469. + struct urb *urb;
  98470. + unsigned char *pxmitbuf;
  98471. + struct tx_desc *ptxdesc;
  98472. + struct rtw_ieee80211_hdr *tx_hdr;
  98473. + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv;
  98474. + struct net_device *pnetdev = padapter->pnetdev;
  98475. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  98476. + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
  98477. +
  98478. +
  98479. + //DBG_8192C("%s\n", __FUNCTION__);
  98480. +
  98481. + skb = pkt;
  98482. +
  98483. + len = skb->len;
  98484. + tx_hdr = (struct rtw_ieee80211_hdr *)(skb->data);
  98485. + fc = le16_to_cpu(tx_hdr->frame_ctl);
  98486. + bmcst = IS_MCAST(tx_hdr->addr1);
  98487. +
  98488. + if ((fc & RTW_IEEE80211_FCTL_FTYPE) != RTW_IEEE80211_FTYPE_MGMT)
  98489. + goto _exit;
  98490. +
  98491. + pxmit_skb = rtw_skb_alloc(len + TXDESC_SIZE);
  98492. +
  98493. + if(!pxmit_skb)
  98494. + goto _exit;
  98495. +
  98496. + pxmitbuf = pxmit_skb->data;
  98497. +
  98498. + urb = usb_alloc_urb(0, GFP_ATOMIC);
  98499. + if (!urb) {
  98500. + goto _exit;
  98501. + }
  98502. +
  98503. + // ----- fill tx desc -----
  98504. + ptxdesc = (struct tx_desc *)pxmitbuf;
  98505. + _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc));
  98506. +
  98507. + //offset 0
  98508. + ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff);
  98509. + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<<OFFSET_SHT)&0x00ff0000);//default = 32 bytes for TX Desc
  98510. + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
  98511. +
  98512. + if(bmcst)
  98513. + {
  98514. + ptxdesc->txdw0 |= cpu_to_le32(BIT(24));
  98515. + }
  98516. +
  98517. + //offset 4
  98518. + ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID
  98519. +
  98520. + ptxdesc->txdw1 |= cpu_to_le32((0x12<<QSEL_SHT)&0x00001f00);
  98521. +
  98522. + ptxdesc->txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode
  98523. +
  98524. + //offset 8
  98525. +
  98526. + //offset 12
  98527. + ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000);
  98528. +
  98529. + //offset 16
  98530. + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate
  98531. +
  98532. + //offset 20
  98533. +
  98534. +
  98535. + //HW append seq
  98536. + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number
  98537. + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29.
  98538. +
  98539. +
  98540. + rtl8192cu_cal_txdesc_chksum(ptxdesc);
  98541. + // ----- end of fill tx desc -----
  98542. +
  98543. + //
  98544. + skb_put(pxmit_skb, len + TXDESC_SIZE);
  98545. + pxmitbuf = pxmitbuf + TXDESC_SIZE;
  98546. + _rtw_memcpy(pxmitbuf, skb->data, len);
  98547. +
  98548. + //DBG_8192C("mgnt_xmit, len=%x\n", pxmit_skb->len);
  98549. +
  98550. +
  98551. + // ----- prepare urb for submit -----
  98552. +
  98553. + //translate DMA FIFO addr to pipehandle
  98554. + //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX);
  98555. + pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f);
  98556. +
  98557. + usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe,
  98558. + pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb);
  98559. +
  98560. + urb->transfer_flags |= URB_ZERO_PACKET;
  98561. + usb_anchor_urb(urb, &phostapdpriv->anchored);
  98562. + rc = usb_submit_urb(urb, GFP_ATOMIC);
  98563. + if (rc < 0) {
  98564. + usb_unanchor_urb(urb);
  98565. + kfree_skb(skb);
  98566. + }
  98567. + usb_free_urb(urb);
  98568. +
  98569. +
  98570. +_exit:
  98571. +
  98572. + rtw_skb_free(skb);
  98573. +
  98574. +#endif
  98575. +
  98576. + return 0;
  98577. +
  98578. +}
  98579. +#endif
  98580. --- /dev/null
  98581. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c
  98582. @@ -0,0 +1,6260 @@
  98583. +/******************************************************************************
  98584. + *
  98585. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  98586. + *
  98587. + * This program is free software; you can redistribute it and/or modify it
  98588. + * under the terms of version 2 of the GNU General Public License as
  98589. + * published by the Free Software Foundation.
  98590. + *
  98591. + * This program is distributed in the hope that it will be useful, but WITHOUT
  98592. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  98593. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  98594. + * more details.
  98595. + *
  98596. + * You should have received a copy of the GNU General Public License along with
  98597. + * this program; if not, write to the Free Software Foundation, Inc.,
  98598. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  98599. + *
  98600. + *
  98601. + ******************************************************************************/
  98602. +#define _HCI_HAL_INIT_C_
  98603. +
  98604. +#include <drv_conf.h>
  98605. +#include <osdep_service.h>
  98606. +#include <drv_types.h>
  98607. +#include <rtw_efuse.h>
  98608. +
  98609. +#include <rtl8192c_hal.h>
  98610. +#include <rtl8192c_led.h>
  98611. +
  98612. +#ifdef DBG_CONFIG_ERROR_DETECT
  98613. +#include "rtl8192c_sreset.h"
  98614. +#endif
  98615. +
  98616. +#ifdef CONFIG_IOL
  98617. +#include <rtw_iol.h>
  98618. +#endif
  98619. +
  98620. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  98621. +
  98622. +#error "Shall be Linux or Windows, but not both!\n"
  98623. +
  98624. +#endif
  98625. +
  98626. +#ifndef CONFIG_USB_HCI
  98627. +
  98628. +#error "CONFIG_USB_HCI shall be on!\n"
  98629. +
  98630. +#endif
  98631. +
  98632. +#include <usb_ops.h>
  98633. +#include <usb_hal.h>
  98634. +#include <usb_osintf.h>
  98635. +
  98636. +#if DISABLE_BB_RF
  98637. + #define HAL_MAC_ENABLE 0
  98638. + #define HAL_BB_ENABLE 0
  98639. + #define HAL_RF_ENABLE 0
  98640. +#else
  98641. + #define HAL_MAC_ENABLE 1
  98642. + #define HAL_BB_ENABLE 1
  98643. + #define HAL_RF_ENABLE 1
  98644. +#endif
  98645. +
  98646. +//endpoint number 1,2,3,4,5
  98647. +// bult in : 1
  98648. +// bult out: 2 (High)
  98649. +// bult out: 3 (Normal) for 3 out_ep, (Low) for 2 out_ep
  98650. +// interrupt in: 4
  98651. +// bult out: 5 (Low) for 3 out_ep
  98652. +
  98653. +
  98654. +static VOID
  98655. +_OneOutEpMapping(
  98656. + IN HAL_DATA_TYPE *pHalData
  98657. + )
  98658. +{
  98659. + //only endpoint number 0x02
  98660. +
  98661. + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO
  98662. + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI
  98663. + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE
  98664. + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK
  98665. +
  98666. + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN
  98667. + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT
  98668. + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH
  98669. + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD
  98670. +}
  98671. +
  98672. +
  98673. +static VOID
  98674. +_TwoOutEpMapping(
  98675. + IN HAL_DATA_TYPE *pHalData,
  98676. + IN BOOLEAN bWIFICfg
  98677. + )
  98678. +{
  98679. +
  98680. +/*
  98681. +#define VO_QUEUE_INX 0
  98682. +#define VI_QUEUE_INX 1
  98683. +#define BE_QUEUE_INX 2
  98684. +#define BK_QUEUE_INX 3
  98685. +#define BCN_QUEUE_INX 4
  98686. +#define MGT_QUEUE_INX 5
  98687. +#define HIGH_QUEUE_INX 6
  98688. +#define TXCMD_QUEUE_INX 7
  98689. +*/
  98690. + if(bWIFICfg){ // Normal chip && wmm
  98691. +
  98692. + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
  98693. + //{ 0, 1, 0, 1, 0, 0, 0, 0, 0 };
  98694. + //0:H(end_number=0x02), 1:L (end_number=0x03)
  98695. +
  98696. + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[1];//VO
  98697. + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI
  98698. + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE
  98699. + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK
  98700. +
  98701. + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN
  98702. + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT
  98703. + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH
  98704. + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD
  98705. + }
  98706. + else{//typical setting
  98707. +
  98708. + //BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
  98709. + //{ 1, 1, 0, 0, 0, 0, 0, 0, 0 };
  98710. + //0:H(end_number=0x02), 1:L (end_number=0x03)
  98711. +
  98712. + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO
  98713. + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI
  98714. + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE
  98715. + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK
  98716. +
  98717. + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN
  98718. + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT
  98719. + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH
  98720. + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD
  98721. + }
  98722. +
  98723. +}
  98724. +
  98725. +
  98726. +static VOID _ThreeOutEpMapping(
  98727. + IN HAL_DATA_TYPE *pHalData,
  98728. + IN BOOLEAN bWIFICfg
  98729. + )
  98730. +{
  98731. + if(bWIFICfg){//for WMM
  98732. +
  98733. + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
  98734. + //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 };
  98735. + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05)
  98736. +
  98737. + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO
  98738. + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI
  98739. + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE
  98740. + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK
  98741. +
  98742. + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN
  98743. + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT
  98744. + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH
  98745. + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD
  98746. + }
  98747. + else{//typical setting
  98748. +
  98749. + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
  98750. + //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 };
  98751. + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05)
  98752. + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO
  98753. + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI
  98754. + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE
  98755. + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[2];//BK
  98756. +
  98757. + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN
  98758. + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT
  98759. + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH
  98760. + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD
  98761. + }
  98762. +
  98763. +}
  98764. +
  98765. +static BOOLEAN
  98766. +_MappingOutEP(
  98767. + IN PADAPTER pAdapter,
  98768. + IN u8 NumOutPipe
  98769. + )
  98770. +{
  98771. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  98772. + struct registry_priv *pregistrypriv = &pAdapter->registrypriv;
  98773. +
  98774. + BOOLEAN bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE;
  98775. +
  98776. + BOOLEAN result = _TRUE;
  98777. +
  98778. + switch(NumOutPipe)
  98779. + {
  98780. + case 2:
  98781. + _TwoOutEpMapping(pHalData, bWIFICfg);
  98782. + break;
  98783. + case 3:
  98784. + _ThreeOutEpMapping(pHalData, bWIFICfg);
  98785. + break;
  98786. + case 1:
  98787. + _OneOutEpMapping(pHalData);
  98788. + break;
  98789. + default:
  98790. + result = _FALSE;
  98791. + break;
  98792. + }
  98793. +
  98794. + return result;
  98795. +
  98796. +}
  98797. +
  98798. +static VOID
  98799. +_ConfigChipOutEP(
  98800. + IN PADAPTER pAdapter,
  98801. + IN u8 NumOutPipe
  98802. + )
  98803. +{
  98804. + u8 value8;
  98805. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  98806. +
  98807. + pHalData->OutEpQueueSel = 0;
  98808. + pHalData->OutEpNumber = 0;
  98809. +
  98810. + // Normal and High queue
  98811. + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 1));
  98812. +
  98813. + if(value8 & USB_NORMAL_SIE_EP_MASK){
  98814. + pHalData->OutEpQueueSel |= TX_SELE_HQ;
  98815. + pHalData->OutEpNumber++;
  98816. + }
  98817. +
  98818. +#ifdef CONFIG_USB_ONE_OUT_EP
  98819. + return;
  98820. +#endif
  98821. +
  98822. + if((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK){
  98823. + pHalData->OutEpQueueSel |= TX_SELE_NQ;
  98824. + pHalData->OutEpNumber++;
  98825. + }
  98826. +
  98827. + // Low queue
  98828. + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 2));
  98829. + if(value8 & USB_NORMAL_SIE_EP_MASK){
  98830. + pHalData->OutEpQueueSel |= TX_SELE_LQ;
  98831. + pHalData->OutEpNumber++;
  98832. + }
  98833. +
  98834. + // TODO: Error recovery for this case
  98835. + //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber));
  98836. +
  98837. +}
  98838. +
  98839. +static BOOLEAN HalUsbSetQueuePipeMapping8192CUsb(
  98840. + IN PADAPTER pAdapter,
  98841. + IN u8 NumInPipe,
  98842. + IN u8 NumOutPipe
  98843. + )
  98844. +{
  98845. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  98846. + BOOLEAN result = _FALSE;
  98847. +
  98848. + _ConfigChipOutEP(pAdapter, NumOutPipe);
  98849. +
  98850. + #ifndef CONFIG_USB_ONE_OUT_EP
  98851. + // Normal chip with one IN and one OUT doesn't have interrupt IN EP.
  98852. + if(1 == pHalData->OutEpNumber){
  98853. + if(1 != NumInPipe){
  98854. + return result;
  98855. + }
  98856. + }
  98857. + #endif
  98858. + result = _MappingOutEP(pAdapter, NumOutPipe);
  98859. +
  98860. + return result;
  98861. +
  98862. +}
  98863. +
  98864. +void rtl8192cu_interface_configure(_adapter *padapter)
  98865. +{
  98866. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  98867. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  98868. +
  98869. + if (pdvobjpriv->ishighspeed == _TRUE)
  98870. + {
  98871. + pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes
  98872. + }
  98873. + else
  98874. + {
  98875. + pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes
  98876. + }
  98877. +
  98878. + pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber;
  98879. + pHalData->RtBulkInPipe = pdvobjpriv->ep_num[0];
  98880. + pHalData->RtBulkOutPipe[0] = pdvobjpriv->ep_num[1];
  98881. + pHalData->RtBulkOutPipe[1] = pdvobjpriv->ep_num[2];
  98882. + pHalData->RtIntInPipe = pdvobjpriv->ep_num[3];
  98883. + pHalData->RtBulkOutPipe[2] = pdvobjpriv->ep_num[4];
  98884. +
  98885. +#ifdef CONFIG_USB_TX_AGGREGATION
  98886. + pHalData->UsbTxAggMode = 1;
  98887. + pHalData->UsbTxAggDescNum = 0x6; // only 4 bits
  98888. +#endif
  98889. +
  98890. +#ifdef CONFIG_USB_RX_AGGREGATION
  98891. + pHalData->UsbRxAggMode = USB_RX_AGG_DMA;// USB_RX_AGG_DMA;
  98892. + pHalData->UsbRxAggBlockCount = 8; //unit : 512b
  98893. + pHalData->UsbRxAggBlockTimeout = 0x6;
  98894. + pHalData->UsbRxAggPageCount = 48; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize
  98895. + pHalData->UsbRxAggPageTimeout = 0x4; //6, absolute time = 34ms/(2^6)
  98896. +#endif
  98897. +
  98898. + HalUsbSetQueuePipeMapping8192CUsb(padapter, pdvobjpriv->RtNumInPipes,
  98899. + #ifdef CONFIG_USB_ONE_OUT_EP
  98900. + 1
  98901. + #else
  98902. + pdvobjpriv->RtNumOutPipes
  98903. + #endif
  98904. + );
  98905. +
  98906. +}
  98907. +
  98908. +static u8 _InitPowerOn(_adapter *padapter)
  98909. +{
  98910. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  98911. + u8 ret = _SUCCESS;
  98912. + u16 value16=0;
  98913. + u8 value8 = 0;
  98914. + u32 value32 = 0;
  98915. +
  98916. + // polling autoload done.
  98917. + u32 pollingCount = 0;
  98918. +
  98919. + do
  98920. + {
  98921. + if(rtw_read8(padapter, REG_APS_FSMCO) & PFM_ALDN){
  98922. + //RT_TRACE(COMP_INIT,DBG_LOUD,("Autoload Done!\n"));
  98923. + break;
  98924. + }
  98925. +
  98926. + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){
  98927. + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[PFM_ALDN] done!\n"));
  98928. + return _FAIL;
  98929. + }
  98930. +
  98931. + }while(_TRUE);
  98932. +
  98933. +
  98934. +// For hardware power on sequence.
  98935. +
  98936. + //0. RSV_CTRL 0x1C[7:0] = 0x00 // unlock ISO/CLK/Power control register
  98937. + rtw_write8(padapter, REG_RSV_CTRL, 0x0);
  98938. + // Power on when re-enter from IPS/Radio off/card disable
  98939. + rtw_write8(padapter, REG_SPS0_CTRL, 0x2b);//enable SPS into PWM mode
  98940. +/*
  98941. + value16 = PlatformIORead2Byte(Adapter, REG_AFE_XTAL_CTRL);//enable AFE clock
  98942. + value16 &= (~XTAL_GATE_AFE);
  98943. + PlatformIOWrite2Byte(Adapter,REG_AFE_XTAL_CTRL, value16 );
  98944. +*/
  98945. +
  98946. + rtw_udelay_os(100);//PlatformSleepUs(150);//this is not necessary when initially power on
  98947. +
  98948. + value8 = rtw_read8(padapter, REG_LDOV12D_CTRL);
  98949. + if(0== (value8 & LDV12_EN) ){
  98950. + value8 |= LDV12_EN;
  98951. + rtw_write8(padapter, REG_LDOV12D_CTRL, value8);
  98952. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8));
  98953. + rtw_udelay_os(100);//PlatformSleepUs(100);//this is not necessary when initially power on
  98954. + value8 = rtw_read8(padapter, REG_SYS_ISO_CTRL);
  98955. + value8 &= ~ISO_MD2PP;
  98956. + rtw_write8(padapter, REG_SYS_ISO_CTRL, value8);
  98957. + }
  98958. +
  98959. + // auto enable WLAN
  98960. + pollingCount = 0;
  98961. + value16 = rtw_read16(padapter, REG_APS_FSMCO);
  98962. + value16 |= APFM_ONMAC;
  98963. + rtw_write16(padapter, REG_APS_FSMCO, value16);
  98964. +
  98965. + do
  98966. + {
  98967. + if(0 == (rtw_read16(padapter, REG_APS_FSMCO) & APFM_ONMAC)){
  98968. + //RT_TRACE(COMP_INIT,DBG_LOUD,("MAC auto ON okay!\n"));
  98969. + break;
  98970. + }
  98971. +
  98972. + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){
  98973. + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n"));
  98974. + return _FAIL;
  98975. + }
  98976. +
  98977. + }while(_TRUE);
  98978. +
  98979. + //Enable Radio ,GPIO ,and LED function
  98980. + rtw_write16(padapter,REG_APS_FSMCO,0x0812);
  98981. +
  98982. +#ifdef CONFIG_AUTOSUSPEND
  98983. + //for usb Combo card ,BT
  98984. + if((BOARD_USB_COMBO == pHalData->BoardType)&&(padapter->registrypriv.usbss_enable))
  98985. + {
  98986. + value32 = rtw_read32(padapter, REG_APS_FSMCO);
  98987. + value32 |= (SOP_ABG|SOP_AMB|XOP_BTCK);
  98988. + rtw_write32(padapter, REG_APS_FSMCO, value32);
  98989. + }
  98990. +#endif
  98991. +
  98992. + // release RF digital isolation
  98993. + value16 = rtw_read16(padapter, REG_SYS_ISO_CTRL);
  98994. + value16 &= ~ISO_DIOR;
  98995. + rtw_write16(padapter, REG_SYS_ISO_CTRL, value16);
  98996. +
  98997. + // Enable MAC DMA/WMAC/SCHEDULE/SEC block
  98998. + value16 = rtw_read16(padapter, REG_CR);
  98999. + value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN
  99000. + | PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN | ENSEC);
  99001. + rtw_write16(padapter, REG_CR, value16);
  99002. +
  99003. + //tynli_test for suspend mode.
  99004. + {
  99005. + rtw_write8(padapter, 0xfe10, 0x19);
  99006. + }
  99007. +
  99008. + // 2010/11/22 MH For slim combo debug mode check.
  99009. + if (pHalData->BoardType == BOARD_USB_COMBO)
  99010. + {
  99011. + if (pHalData->SlimComboDbg == _TRUE)
  99012. + {
  99013. + DBG_8192C("SlimComboDbg == TRUE\n");
  99014. +
  99015. + // 1. SIC?Test Mode 中, Debug Ports 會自動 Enable, 所以 Driver 上來後,
  99016. + // 要關掉請設定 0x 00[7] -> "1", 將它 Disable. effect if not: power consumption increase
  99017. + rtw_write8(padapter, REG_SYS_ISO_CTRL, rtw_read8(padapter, REG_SYS_ISO_CTRL)|BIT7);
  99018. +
  99019. + // 2. SIC?Test Mode 中, GPIO-8?會 report Power State 所以 Driver 上來後, 請設定? 0x04[6] -> "1" 將它 Disable
  99020. + // effect if not: GPIO-8 could not be GPIO or LED function
  99021. + rtw_write8(padapter, REG_APS_FSMCO, rtw_read8(padapter, REG_APS_FSMCO)|BIT6);
  99022. +
  99023. + // 3. SIC Test Mode 中, EESK, EECS 會 report?Host Clock status, 所以 Driver 上來後, 請設定? 0x40[4] -> "1" 將它切成 EEPROM 使用 Pin (autoload still from Efuse)
  99024. + // effect if not:power consumption increase
  99025. + value8 = rtw_read8(padapter, REG_GPIO_MUXCFG)|BIT4 ;
  99026. + #ifdef CONFIG_BT_COEXIST
  99027. + // 2011/01/26 MH UMB-B cut bug. We need to support the modification.
  99028. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) &&
  99029. + pHalData->bt_coexist.BT_Coexist)
  99030. + {
  99031. + value8 |= (BIT5);
  99032. + }
  99033. + #endif
  99034. + rtw_write8(padapter, REG_GPIO_MUXCFG,value8 );
  99035. +
  99036. +
  99037. + // 4. SIC Test Mode 中,?SIC Debug ports 會自動 Enable , 所以 Driver 上來後馬上, 請設定? 0x40[15:11] -> “0x00”, 將它Disable
  99038. + // 4.1Two Steps setting for safety: 0x40[15,13,12, 11] -> "0", then ?0x40[14] -> "0"
  99039. + // effect if not: Host could not transfer packets, and GPIO-3,2 will occupied by SIC then Co-exist could not work.
  99040. + rtw_write16(padapter, REG_GPIO_MUXCFG, (rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF)|BIT14);
  99041. + rtw_write16(padapter, REG_GPIO_MUXCFG, rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF);
  99042. + }
  99043. + }
  99044. +
  99045. +
  99046. + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in
  99047. + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all
  99048. + // IC. According to Johnny's opinion, only RU will meet the condition.
  99049. + if (IS_HARDWARE_TYPE_8192C(padapter) && (pHalData->BoardType == BOARD_USB_High_PA))
  99050. + rtw_write32(padapter, rFPGA0_XCD_RFParameter, rtw_read32(padapter, rFPGA0_XCD_RFParameter)&(~BIT1));
  99051. + return ret;
  99052. +
  99053. +}
  99054. +
  99055. +
  99056. +static void _dbg_dump_macreg(_adapter *padapter)
  99057. +{
  99058. + u32 offset = 0;
  99059. + u32 val32 = 0;
  99060. + u32 index =0 ;
  99061. + for(index=0;index<64;index++)
  99062. + {
  99063. + offset = index*4;
  99064. + val32 = rtw_read32(padapter,offset);
  99065. + DBG_8192C("offset : 0x%02x ,val:0x%08x\n",offset,val32);
  99066. + }
  99067. +}
  99068. +
  99069. +
  99070. +static void _InitPABias(_adapter *padapter)
  99071. +{
  99072. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  99073. + u8 pa_setting;
  99074. + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID);
  99075. +
  99076. + //FIXED PA current issue
  99077. + //efuse_one_byte_read(padapter, 0x1FA, &pa_setting);
  99078. + pa_setting = EFUSE_Read1Byte(padapter, 0x1FA);
  99079. +
  99080. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_InitPABias 0x1FA 0x%x \n",pa_setting));
  99081. +
  99082. + if(!(pa_setting & BIT0))
  99083. + {
  99084. + PHY_SetRFReg(padapter, RF_PATH_A, 0x15, 0x0FFFFF, 0x0F406);
  99085. + PHY_SetRFReg(padapter, RF_PATH_A, 0x15, 0x0FFFFF, 0x4F406);
  99086. + PHY_SetRFReg(padapter, RF_PATH_A, 0x15, 0x0FFFFF, 0x8F406);
  99087. + PHY_SetRFReg(padapter, RF_PATH_A, 0x15, 0x0FFFFF, 0xCF406);
  99088. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path A\n"));
  99089. + }
  99090. +
  99091. + if(!(pa_setting & BIT1) && is92C)
  99092. + {
  99093. + PHY_SetRFReg(padapter,RF_PATH_B, 0x15, 0x0FFFFF, 0x0F406);
  99094. + PHY_SetRFReg(padapter,RF_PATH_B, 0x15, 0x0FFFFF, 0x4F406);
  99095. + PHY_SetRFReg(padapter,RF_PATH_B, 0x15, 0x0FFFFF, 0x8F406);
  99096. + PHY_SetRFReg(padapter,RF_PATH_B, 0x15, 0x0FFFFF, 0xCF406);
  99097. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path B\n"));
  99098. + }
  99099. +
  99100. + if(!(pa_setting & BIT4))
  99101. + {
  99102. + pa_setting = rtw_read8(padapter, 0x16);
  99103. + pa_setting &= 0x0F;
  99104. + rtw_write8(padapter, 0x16, pa_setting | 0x90);
  99105. + }
  99106. +}
  99107. +#ifdef CONFIG_BT_COEXIST
  99108. +static void _InitBTCoexist(_adapter *padapter)
  99109. +{
  99110. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  99111. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  99112. + u8 u1Tmp;
  99113. +
  99114. + if(pbtpriv->BT_Coexist && pbtpriv->BT_CoexistType == BT_CSR_BC4)
  99115. + {
  99116. +
  99117. +#if MP_DRIVER != 1
  99118. + if(pbtpriv->BT_Ant_isolation)
  99119. + {
  99120. + rtw_write8( padapter,REG_GPIO_MUXCFG, 0xa0);
  99121. + DBG_8192C("BT write 0x%x = 0x%x\n", REG_GPIO_MUXCFG, 0xa0);
  99122. + }
  99123. +#endif
  99124. +
  99125. + u1Tmp = rtw_read8(padapter, 0x4fd) & BIT0;
  99126. + u1Tmp = u1Tmp |
  99127. + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |
  99128. + ((pbtpriv->BT_Service==BT_SCO)?0:BIT2);
  99129. + rtw_write8( padapter, 0x4fd, u1Tmp);
  99130. + DBG_8192C("BT write 0x%x = 0x%x for non-isolation\n", 0x4fd, u1Tmp);
  99131. +
  99132. +
  99133. + rtw_write32(padapter, REG_BT_COEX_TABLE+4, 0xaaaa9aaa);
  99134. + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+4, 0xaaaa9aaa);
  99135. +
  99136. + rtw_write32(padapter, REG_BT_COEX_TABLE+8, 0xffbd0040);
  99137. + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+8, 0xffbd0040);
  99138. +
  99139. + rtw_write32(padapter, REG_BT_COEX_TABLE+0xc, 0x40000010);
  99140. + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+0xc, 0x40000010);
  99141. +
  99142. + //Config to 1T1R
  99143. + u1Tmp = rtw_read8(padapter,rOFDM0_TRxPathEnable);
  99144. + u1Tmp &= ~(BIT1);
  99145. + rtw_write8( padapter, rOFDM0_TRxPathEnable, u1Tmp);
  99146. + DBG_8192C("BT write 0xC04 = 0x%x\n", u1Tmp);
  99147. +
  99148. + u1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable);
  99149. + u1Tmp &= ~(BIT1);
  99150. + rtw_write8( padapter, rOFDM1_TRxPathEnable, u1Tmp);
  99151. + DBG_8192C("BT write 0xD04 = 0x%x\n", u1Tmp);
  99152. +
  99153. + }
  99154. +}
  99155. +#endif
  99156. +
  99157. +//-------------------------------------------------------------------------
  99158. +//
  99159. +// LLT R/W/Init function
  99160. +//
  99161. +//-------------------------------------------------------------------------
  99162. +static u8 _LLTWrite(
  99163. + IN PADAPTER Adapter,
  99164. + IN u32 address,
  99165. + IN u32 data
  99166. + )
  99167. +{
  99168. + u8 status = _SUCCESS;
  99169. + int count = 0;
  99170. + u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS);
  99171. +
  99172. + rtw_write32(Adapter, REG_LLT_INIT, value);
  99173. +
  99174. + //polling
  99175. + do{
  99176. +
  99177. + value = rtw_read32(Adapter, REG_LLT_INIT);
  99178. + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){
  99179. + break;
  99180. + }
  99181. +
  99182. + if(count > POLLING_LLT_THRESHOLD){
  99183. + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling write LLT done at address %d!\n", address));
  99184. + status = _FAIL;
  99185. + break;
  99186. + }
  99187. + }while(count++);
  99188. +
  99189. + return status;
  99190. +
  99191. +}
  99192. +
  99193. +
  99194. +static u8 _LLTRead(
  99195. + IN PADAPTER Adapter,
  99196. + IN u32 address
  99197. + )
  99198. +{
  99199. + int count = 0;
  99200. + u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS);
  99201. +
  99202. + rtw_write32(Adapter, REG_LLT_INIT, value);
  99203. +
  99204. + //polling and get value
  99205. + do{
  99206. +
  99207. + value = rtw_read32(Adapter, REG_LLT_INIT);
  99208. + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){
  99209. + return (u8)value;
  99210. + }
  99211. +
  99212. + if(count > POLLING_LLT_THRESHOLD){
  99213. + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address));
  99214. + break;
  99215. + }
  99216. + }while(count++);
  99217. +
  99218. + return 0xFF;
  99219. +
  99220. +}
  99221. +
  99222. +
  99223. +static u8 InitLLTTable(
  99224. + IN PADAPTER Adapter,
  99225. + IN u32 boundary
  99226. + )
  99227. +{
  99228. + u8 status = _SUCCESS;
  99229. + u32 i;
  99230. +
  99231. +#ifdef CONFIG_IOL_LLT
  99232. + if(rtw_IOL_applied(Adapter))
  99233. + {
  99234. + struct xmit_frame *xmit_frame;
  99235. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)
  99236. + return _FAIL;
  99237. +
  99238. + rtw_IOL_append_LLT_cmd(xmit_frame, boundary);
  99239. + status = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000);
  99240. + }
  99241. + else
  99242. +#endif
  99243. + {
  99244. + for(i = 0 ; i < (boundary - 1) ; i++){
  99245. + status = _LLTWrite(Adapter, i , i + 1);
  99246. + if(_SUCCESS != status){
  99247. + return status;
  99248. + }
  99249. + }
  99250. +
  99251. + // end of list
  99252. + status = _LLTWrite(Adapter, (boundary - 1), 0xFF);
  99253. + if(_SUCCESS != status){
  99254. + return status;
  99255. + }
  99256. +
  99257. + // Make the other pages as ring buffer
  99258. + // This ring buffer is used as beacon buffer if we config this MAC as two MAC transfer.
  99259. + // Otherwise used as local loopback buffer.
  99260. + for(i = boundary ; i < LAST_ENTRY_OF_TX_PKT_BUFFER ; i++){
  99261. + status = _LLTWrite(Adapter, i, (i + 1));
  99262. + if(_SUCCESS != status){
  99263. + return status;
  99264. + }
  99265. + }
  99266. +
  99267. + // Let last entry point to the start entry of ring buffer
  99268. + status = _LLTWrite(Adapter, LAST_ENTRY_OF_TX_PKT_BUFFER, boundary);
  99269. + if(_SUCCESS != status){
  99270. + return status;
  99271. + }
  99272. + }
  99273. +
  99274. + return status;
  99275. +
  99276. +}
  99277. +
  99278. +
  99279. +//---------------------------------------------------------------
  99280. +//
  99281. +// MAC init functions
  99282. +//
  99283. +//---------------------------------------------------------------
  99284. +static VOID
  99285. +_SetMacID(
  99286. + IN PADAPTER Adapter, u8* MacID
  99287. + )
  99288. +{
  99289. + u32 i;
  99290. + for(i=0 ; i< MAC_ADDR_LEN ; i++){
  99291. +#ifdef CONFIG_CONCURRENT_MODE
  99292. + if(Adapter->iface_type == IFACE_PORT1)
  99293. + rtw_write32(Adapter, REG_MACID1+i, MacID[i]);
  99294. + else
  99295. +#endif
  99296. + rtw_write32(Adapter, REG_MACID+i, MacID[i]);
  99297. + }
  99298. +}
  99299. +
  99300. +static VOID
  99301. +_SetBSSID(
  99302. + IN PADAPTER Adapter, u8* BSSID
  99303. + )
  99304. +{
  99305. + u32 i;
  99306. + for(i=0 ; i< MAC_ADDR_LEN ; i++){
  99307. +#ifdef CONFIG_CONCURRENT_MODE
  99308. + if(Adapter->iface_type == IFACE_PORT1)
  99309. + rtw_write32(Adapter, REG_BSSID1+i, BSSID[i]);
  99310. + else
  99311. +#endif
  99312. + rtw_write32(Adapter, REG_BSSID+i, BSSID[i]);
  99313. + }
  99314. +}
  99315. +
  99316. +
  99317. +// Shall USB interface init this?
  99318. +static VOID
  99319. +_InitInterrupt(
  99320. + IN PADAPTER Adapter
  99321. + )
  99322. +{
  99323. + u32 value32;
  99324. +
  99325. + // HISR - turn all on
  99326. + value32 = 0xFFFFFFFF;
  99327. + rtw_write32(Adapter, REG_HISR, value32);
  99328. +
  99329. + // HIMR - turn all on
  99330. + rtw_write32(Adapter, REG_HIMR, value32);
  99331. +}
  99332. +
  99333. +
  99334. +static VOID
  99335. +_InitQueueReservedPage(
  99336. + IN PADAPTER Adapter
  99337. + )
  99338. +{
  99339. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99340. + struct registry_priv *pregistrypriv = &Adapter->registrypriv;
  99341. +
  99342. + u32 outEPNum = (u32)pHalData->OutEpNumber;
  99343. + u32 numHQ = 0;
  99344. + u32 numLQ = 0;
  99345. + u32 numNQ = 0;
  99346. + u32 numPubQ;
  99347. + u32 value32;
  99348. + u8 value8;
  99349. + BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec;
  99350. + //u32 txQPageNum, txQPageUnit,txQRemainPage;
  99351. +
  99352. + { //for WMM
  99353. + //RT_ASSERT((outEPNum>=2), ("for WMM ,number of out-ep must more than or equal to 2!\n"));
  99354. +
  99355. + if(pHalData->OutEpQueueSel & TX_SELE_HQ){
  99356. + numHQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_HPQ:NORMAL_PAGE_NUM_HPQ;
  99357. + }
  99358. +
  99359. + if(pHalData->OutEpQueueSel & TX_SELE_LQ){
  99360. + numLQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_LPQ:NORMAL_PAGE_NUM_LPQ;
  99361. + }
  99362. + // NOTE: This step shall be proceed before writting REG_RQPN.
  99363. + if(pHalData->OutEpQueueSel & TX_SELE_NQ){
  99364. + numNQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_NPQ:NORMAL_PAGE_NUM_NPQ;
  99365. + }
  99366. + value8 = (u8)_NPQ(numNQ);
  99367. + rtw_write8(Adapter, REG_RQPN_NPQ, value8);
  99368. +
  99369. + if (bWiFiConfig)
  99370. + numPubQ = WMM_NORMAL_TX_TOTAL_PAGE_NUMBER - numHQ - numLQ - numNQ;
  99371. + else
  99372. + numPubQ = TX_TOTAL_PAGE_NUMBER - numHQ - numLQ - numNQ;
  99373. + }
  99374. +
  99375. + // TX DMA
  99376. + value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
  99377. + rtw_write32(Adapter, REG_RQPN, value32);
  99378. +}
  99379. +
  99380. +static VOID
  99381. +_InitTxBufferBoundary(
  99382. + IN PADAPTER Adapter
  99383. + )
  99384. +{
  99385. + struct registry_priv *pregistrypriv = &Adapter->registrypriv;
  99386. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99387. +
  99388. + u8 txpktbuf_bndy;
  99389. +
  99390. + if(!pregistrypriv->wifi_spec){
  99391. + txpktbuf_bndy = TX_PAGE_BOUNDARY;
  99392. + }
  99393. + else{//for WMM
  99394. + txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY;
  99395. + }
  99396. +
  99397. + rtw_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
  99398. + rtw_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
  99399. + rtw_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy);
  99400. + rtw_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy);
  99401. +#if 1
  99402. + rtw_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy);
  99403. +#else
  99404. + txdmactrl = PlatformIORead2Byte(Adapter, REG_TDECTRL);
  99405. + txdmactrl &= ~BCN_HEAD_MASK;
  99406. + txdmactrl |= BCN_HEAD(txpktbuf_bndy);
  99407. + PlatformIOWrite2Byte(Adapter, REG_TDECTRL, txdmactrl);
  99408. +#endif
  99409. +}
  99410. +
  99411. +static VOID
  99412. +_InitPageBoundary(
  99413. + IN PADAPTER Adapter
  99414. + )
  99415. +{
  99416. + // RX Page Boundary
  99417. + //srand(static_cast<unsigned int>(time(NULL)) );
  99418. + u16 rxff_bndy = 0x27FF;//(rand() % 1) ? 0x27FF : 0x23FF;
  99419. +
  99420. + rtw_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy);
  99421. +
  99422. + // TODO: ?? shall we set tx boundary?
  99423. +}
  99424. +
  99425. +
  99426. +static VOID
  99427. +_InitNormalChipRegPriority(
  99428. + IN PADAPTER Adapter,
  99429. + IN u16 beQ,
  99430. + IN u16 bkQ,
  99431. + IN u16 viQ,
  99432. + IN u16 voQ,
  99433. + IN u16 mgtQ,
  99434. + IN u16 hiQ
  99435. + )
  99436. +{
  99437. + u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7);
  99438. +
  99439. + value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) |
  99440. + _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) |
  99441. + _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ);
  99442. +
  99443. + rtw_write16(Adapter, REG_TRXDMA_CTRL, value16);
  99444. +}
  99445. +
  99446. +static VOID
  99447. +_InitNormalChipOneOutEpPriority(
  99448. + IN PADAPTER Adapter
  99449. + )
  99450. +{
  99451. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99452. +
  99453. + u16 value = 0;
  99454. + switch(pHalData->OutEpQueueSel)
  99455. + {
  99456. + case TX_SELE_HQ:
  99457. + value = QUEUE_HIGH;
  99458. + break;
  99459. + case TX_SELE_LQ:
  99460. + value = QUEUE_LOW;
  99461. + break;
  99462. + case TX_SELE_NQ:
  99463. + value = QUEUE_NORMAL;
  99464. + break;
  99465. + default:
  99466. + //RT_ASSERT(FALSE,("Shall not reach here!\n"));
  99467. + break;
  99468. + }
  99469. +
  99470. + _InitNormalChipRegPriority(Adapter,
  99471. + value,
  99472. + value,
  99473. + value,
  99474. + value,
  99475. + value,
  99476. + value
  99477. + );
  99478. +
  99479. +}
  99480. +
  99481. +static VOID
  99482. +_InitNormalChipTwoOutEpPriority(
  99483. + IN PADAPTER Adapter
  99484. + )
  99485. +{
  99486. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99487. + struct registry_priv *pregistrypriv = &Adapter->registrypriv;
  99488. + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ;
  99489. +
  99490. +
  99491. + u16 valueHi = 0;
  99492. + u16 valueLow = 0;
  99493. +
  99494. + switch(pHalData->OutEpQueueSel)
  99495. + {
  99496. + case (TX_SELE_HQ | TX_SELE_LQ):
  99497. + valueHi = QUEUE_HIGH;
  99498. + valueLow = QUEUE_LOW;
  99499. + break;
  99500. + case (TX_SELE_NQ | TX_SELE_LQ):
  99501. + valueHi = QUEUE_NORMAL;
  99502. + valueLow = QUEUE_LOW;
  99503. + break;
  99504. + case (TX_SELE_HQ | TX_SELE_NQ):
  99505. + valueHi = QUEUE_HIGH;
  99506. + valueLow = QUEUE_NORMAL;
  99507. + break;
  99508. + default:
  99509. + //RT_ASSERT(FALSE,("Shall not reach here!\n"));
  99510. + break;
  99511. + }
  99512. +
  99513. + if(!pregistrypriv->wifi_spec ){
  99514. + beQ = valueLow;
  99515. + bkQ = valueLow;
  99516. + viQ = valueHi;
  99517. + voQ = valueHi;
  99518. + mgtQ = valueHi;
  99519. + hiQ = valueHi;
  99520. + }
  99521. + else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE
  99522. + beQ = valueLow;
  99523. + bkQ = valueHi;
  99524. + viQ = valueHi;
  99525. + voQ = valueLow;
  99526. + mgtQ = valueHi;
  99527. + hiQ = valueHi;
  99528. + }
  99529. +
  99530. + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);
  99531. +
  99532. +}
  99533. +
  99534. +static VOID
  99535. +_InitNormalChipThreeOutEpPriority(
  99536. + IN PADAPTER Adapter
  99537. + )
  99538. +{
  99539. + struct registry_priv *pregistrypriv = &Adapter->registrypriv;
  99540. + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ;
  99541. +
  99542. + if(!pregistrypriv->wifi_spec ){// typical setting
  99543. + beQ = QUEUE_LOW;
  99544. + bkQ = QUEUE_LOW;
  99545. + viQ = QUEUE_NORMAL;
  99546. + voQ = QUEUE_HIGH;
  99547. + mgtQ = QUEUE_HIGH;
  99548. + hiQ = QUEUE_HIGH;
  99549. + }
  99550. + else{// for WMM
  99551. + beQ = QUEUE_LOW;
  99552. + bkQ = QUEUE_NORMAL;
  99553. + viQ = QUEUE_NORMAL;
  99554. + voQ = QUEUE_HIGH;
  99555. + mgtQ = QUEUE_HIGH;
  99556. + hiQ = QUEUE_HIGH;
  99557. + }
  99558. + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);
  99559. +}
  99560. +
  99561. +static VOID
  99562. +_InitNormalChipQueuePriority(
  99563. + IN PADAPTER Adapter
  99564. + )
  99565. +{
  99566. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99567. +
  99568. + switch(pHalData->OutEpNumber)
  99569. + {
  99570. + case 1:
  99571. + _InitNormalChipOneOutEpPriority(Adapter);
  99572. + break;
  99573. + case 2:
  99574. + _InitNormalChipTwoOutEpPriority(Adapter);
  99575. + break;
  99576. + case 3:
  99577. + _InitNormalChipThreeOutEpPriority(Adapter);
  99578. + break;
  99579. + default:
  99580. + //RT_ASSERT(FALSE,("Shall not reach here!\n"));
  99581. + break;
  99582. + }
  99583. +
  99584. +
  99585. +}
  99586. +
  99587. +static VOID
  99588. +_InitQueuePriority(
  99589. + IN PADAPTER Adapter
  99590. + )
  99591. +{
  99592. + _InitNormalChipQueuePriority(Adapter);
  99593. +}
  99594. +
  99595. +static VOID
  99596. +_InitHardwareDropIncorrectBulkOut(
  99597. + IN PADAPTER Adapter
  99598. + )
  99599. +{
  99600. + u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK);
  99601. + value32 |= DROP_DATA_EN;
  99602. + rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32);
  99603. +}
  99604. +
  99605. +static VOID
  99606. +_InitNetworkType(
  99607. + IN PADAPTER Adapter
  99608. + )
  99609. +{
  99610. + u32 value32;
  99611. +
  99612. + value32 = rtw_read32(Adapter, REG_CR);
  99613. +
  99614. + // TODO: use the other function to set network type
  99615. +#if RTL8191C_FPGA_NETWORKTYPE_ADHOC
  99616. + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC);
  99617. +#else
  99618. + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP);
  99619. +#endif
  99620. + rtw_write32(Adapter, REG_CR, value32);
  99621. +// RASSERT(pIoBase->rtw_read8(REG_CR + 2) == 0x2);
  99622. +}
  99623. +
  99624. +static VOID
  99625. +_InitTransferPageSize(
  99626. + IN PADAPTER Adapter
  99627. + )
  99628. +{
  99629. + // Tx page size is always 128.
  99630. +
  99631. + u8 value8;
  99632. + value8 = _PSRX(PBP_128) | _PSTX(PBP_128);
  99633. + rtw_write8(Adapter, REG_PBP, value8);
  99634. +}
  99635. +
  99636. +static VOID
  99637. +_InitDriverInfoSize(
  99638. + IN PADAPTER Adapter,
  99639. + IN u8 drvInfoSize
  99640. + )
  99641. +{
  99642. + rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize);
  99643. +}
  99644. +
  99645. +static VOID
  99646. +_InitWMACSetting(
  99647. + IN PADAPTER Adapter
  99648. + )
  99649. +{
  99650. + //u4Byte value32;
  99651. + //u16 value16;
  99652. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99653. +
  99654. + //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS;
  99655. + //pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYSTS;
  99656. + // don't turn on AAP, it will allow all packets to driver
  99657. + pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYSTS;
  99658. +
  99659. +#if (0 == RTL8192C_RX_PACKET_NO_INCLUDE_CRC)
  99660. + pHalData->ReceiveConfig |= ACRC32;
  99661. +#endif
  99662. +
  99663. + // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile()
  99664. + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);
  99665. +
  99666. + // Accept all multicast address
  99667. + rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF);
  99668. + rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF);
  99669. +
  99670. +
  99671. + // Accept all data frames
  99672. + //value16 = 0xFFFF;
  99673. + //rtw_write16(Adapter, REG_RXFLTMAP2, value16);
  99674. +
  99675. + // 2010.09.08 hpfan
  99676. + // Since ADF is removed from RCR, ps-poll will not be indicate to driver,
  99677. + // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll.
  99678. + //value16 = 0x400;
  99679. + //rtw_write16(Adapter, REG_RXFLTMAP1, value16);
  99680. +
  99681. + // Accept all management frames
  99682. + //value16 = 0xFFFF;
  99683. + //rtw_write16(Adapter, REG_RXFLTMAP0, value16);
  99684. +
  99685. + //enable RX_SHIFT bits
  99686. + //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1));
  99687. +
  99688. +}
  99689. +
  99690. +static VOID
  99691. +_InitAdaptiveCtrl(
  99692. + IN PADAPTER Adapter
  99693. + )
  99694. +{
  99695. + u16 value16;
  99696. + u32 value32;
  99697. +
  99698. + // Response Rate Set
  99699. + value32 = rtw_read32(Adapter, REG_RRSR);
  99700. + value32 &= ~RATE_BITMAP_ALL;
  99701. + value32 |= RATE_RRSR_CCK_ONLY_1M;
  99702. + rtw_write32(Adapter, REG_RRSR, value32);
  99703. +
  99704. + // CF-END Threshold
  99705. + //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1);
  99706. +
  99707. + // SIFS (used in NAV)
  99708. + value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10);
  99709. + rtw_write16(Adapter, REG_SPEC_SIFS, value16);
  99710. +
  99711. + // Retry Limit
  99712. + value16 = _LRL(0x30) | _SRL(0x30);
  99713. + rtw_write16(Adapter, REG_RL, value16);
  99714. +
  99715. +}
  99716. +
  99717. +static VOID
  99718. +_InitRateFallback(
  99719. + IN PADAPTER Adapter
  99720. + )
  99721. +{
  99722. + // Set Data Auto Rate Fallback Retry Count register.
  99723. + rtw_write32(Adapter, REG_DARFRC, 0x00000000);
  99724. + rtw_write32(Adapter, REG_DARFRC+4, 0x10080404);
  99725. + rtw_write32(Adapter, REG_RARFRC, 0x04030201);
  99726. + rtw_write32(Adapter, REG_RARFRC+4, 0x08070605);
  99727. +
  99728. +}
  99729. +
  99730. +
  99731. +static VOID
  99732. +_InitEDCA(
  99733. + IN PADAPTER Adapter
  99734. + )
  99735. +{
  99736. + // Set Spec SIFS (used in NAV)
  99737. + rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a);
  99738. + rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a);
  99739. +
  99740. + //REG514:SIFS_CCK_CTX
  99741. + //REG515:SIFS_OFDM_CTX
  99742. + //REG516:SIFS_CCK_TRX
  99743. + //REG517:SIFS_OFDM_TRX
  99744. +
  99745. + // Set SIFS for CCK_CTS and OFDM_CTX
  99746. + rtw_write16(Adapter,REG_SIFS_CTX, 0x100a);
  99747. +
  99748. + // Set SIFS for CCK_TRX and OFDM_TRX
  99749. + rtw_write16(Adapter,REG_SIFS_TRX, 0x100a);
  99750. +
  99751. + // TXOP
  99752. + rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B);
  99753. + rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F);
  99754. + rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324);
  99755. + rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226);
  99756. +}
  99757. +
  99758. +
  99759. +static VOID
  99760. +_InitBeaconMaxError(
  99761. + IN PADAPTER Adapter,
  99762. + IN BOOLEAN InfraMode
  99763. + )
  99764. +{
  99765. +#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING
  99766. + rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);
  99767. +#else
  99768. + //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10));
  99769. +#endif
  99770. +}
  99771. +
  99772. +
  99773. +#ifdef CONFIG_LED
  99774. +static void _InitHWLed(PADAPTER Adapter)
  99775. +{
  99776. + struct led_priv *pledpriv = &(Adapter->ledpriv);
  99777. +
  99778. + if( pledpriv->LedStrategy != HW_LED)
  99779. + return;
  99780. +
  99781. +// HW led control
  99782. +// to do ....
  99783. +//must consider cases of antenna diversity/ commbo card/solo card/mini card
  99784. +
  99785. +}
  99786. +#endif //CONFIG_LED
  99787. +
  99788. +static VOID
  99789. +_InitRDGSetting(
  99790. + IN PADAPTER Adapter
  99791. + )
  99792. +{
  99793. + rtw_write8(Adapter,REG_RD_CTRL,0xFF);
  99794. + rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200);
  99795. + rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05);
  99796. +}
  99797. +
  99798. +static VOID
  99799. +_InitRxSetting(
  99800. + IN PADAPTER Adapter
  99801. + )
  99802. +{
  99803. + rtw_write32(Adapter, REG_MACID, 0x87654321);
  99804. + rtw_write32(Adapter, 0x0700, 0x87654321);
  99805. +}
  99806. +
  99807. +static VOID
  99808. +_InitRetryFunction(
  99809. + IN PADAPTER Adapter
  99810. + )
  99811. +{
  99812. + u8 value8;
  99813. +
  99814. + value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL);
  99815. + value8 |= EN_AMPDU_RTY_NEW;
  99816. + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8);
  99817. +
  99818. + // Set ACK timeout
  99819. + rtw_write8(Adapter, REG_ACKTO, 0x40);
  99820. +}
  99821. +
  99822. +/*-----------------------------------------------------------------------------
  99823. + * Function: usb_AggSettingTxUpdate()
  99824. + *
  99825. + * Overview: Seperate TX/RX parameters update independent for TP detection and
  99826. + * dynamic TX/RX aggreagtion parameters update.
  99827. + *
  99828. + * Input: PADAPTER
  99829. + *
  99830. + * Output/Return: NONE
  99831. + *
  99832. + * Revised History:
  99833. + * When Who Remark
  99834. + * 12/10/2010 MHC Seperate to smaller function.
  99835. + *
  99836. + *---------------------------------------------------------------------------*/
  99837. +static VOID
  99838. +usb_AggSettingTxUpdate(
  99839. + IN PADAPTER Adapter
  99840. + )
  99841. +{
  99842. +#ifdef CONFIG_USB_TX_AGGREGATION
  99843. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99844. + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  99845. + u32 value32;
  99846. +
  99847. + if(Adapter->registrypriv.wifi_spec)
  99848. + pHalData->UsbTxAggMode = _FALSE;
  99849. +
  99850. + if(pHalData->UsbTxAggMode){
  99851. + value32 = rtw_read32(Adapter, REG_TDECTRL);
  99852. + value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT);
  99853. + value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT);
  99854. +
  99855. + rtw_write32(Adapter, REG_TDECTRL, value32);
  99856. + }
  99857. +
  99858. +#endif
  99859. +} // usb_AggSettingTxUpdate
  99860. +
  99861. +
  99862. +/*-----------------------------------------------------------------------------
  99863. + * Function: usb_AggSettingRxUpdate()
  99864. + *
  99865. + * Overview: Seperate TX/RX parameters update independent for TP detection and
  99866. + * dynamic TX/RX aggreagtion parameters update.
  99867. + *
  99868. + * Input: PADAPTER
  99869. + *
  99870. + * Output/Return: NONE
  99871. + *
  99872. + * Revised History:
  99873. + * When Who Remark
  99874. + * 12/10/2010 MHC Seperate to smaller function.
  99875. + *
  99876. + *---------------------------------------------------------------------------*/
  99877. +static VOID
  99878. +usb_AggSettingRxUpdate(
  99879. + IN PADAPTER Adapter
  99880. + )
  99881. +{
  99882. +#ifdef CONFIG_USB_RX_AGGREGATION
  99883. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99884. + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  99885. + u8 valueDMA;
  99886. + u8 valueUSB;
  99887. +
  99888. + valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL);
  99889. + valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION);
  99890. +
  99891. + switch(pHalData->UsbRxAggMode)
  99892. + {
  99893. + case USB_RX_AGG_DMA:
  99894. + valueDMA |= RXDMA_AGG_EN;
  99895. + valueUSB &= ~USB_AGG_EN;
  99896. + break;
  99897. + case USB_RX_AGG_USB:
  99898. + valueDMA &= ~RXDMA_AGG_EN;
  99899. + valueUSB |= USB_AGG_EN;
  99900. + break;
  99901. + case USB_RX_AGG_MIX:
  99902. + valueDMA |= RXDMA_AGG_EN;
  99903. + valueUSB |= USB_AGG_EN;
  99904. + break;
  99905. + case USB_RX_AGG_DISABLE:
  99906. + default:
  99907. + valueDMA &= ~RXDMA_AGG_EN;
  99908. + valueUSB &= ~USB_AGG_EN;
  99909. + break;
  99910. + }
  99911. +
  99912. + rtw_write8(Adapter, REG_TRXDMA_CTRL, valueDMA);
  99913. + rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, valueUSB);
  99914. +
  99915. + switch(pHalData->UsbRxAggMode)
  99916. + {
  99917. + case USB_RX_AGG_DMA:
  99918. + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount);
  99919. + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout);
  99920. + break;
  99921. + case USB_RX_AGG_USB:
  99922. + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount);
  99923. + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout);
  99924. + break;
  99925. + case USB_RX_AGG_MIX:
  99926. + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount);
  99927. + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout);
  99928. + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount);
  99929. + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout);
  99930. + break;
  99931. + case USB_RX_AGG_DISABLE:
  99932. + default:
  99933. + // TODO:
  99934. + break;
  99935. + }
  99936. +
  99937. + switch(PBP_128)
  99938. + {
  99939. + case PBP_128:
  99940. + pHalData->HwRxPageSize = 128;
  99941. + break;
  99942. + case PBP_64:
  99943. + pHalData->HwRxPageSize = 64;
  99944. + break;
  99945. + case PBP_256:
  99946. + pHalData->HwRxPageSize = 256;
  99947. + break;
  99948. + case PBP_512:
  99949. + pHalData->HwRxPageSize = 512;
  99950. + break;
  99951. + case PBP_1024:
  99952. + pHalData->HwRxPageSize = 1024;
  99953. + break;
  99954. + default:
  99955. + //RT_ASSERT(FALSE, ("RX_PAGE_SIZE_REG_VALUE definition is incorrect!\n"));
  99956. + break;
  99957. + }
  99958. +#endif
  99959. +} // usb_AggSettingRxUpdate
  99960. +
  99961. +static VOID
  99962. +InitUsbAggregationSetting(
  99963. + IN PADAPTER Adapter
  99964. + )
  99965. +{
  99966. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  99967. +
  99968. + // Tx aggregation setting
  99969. + usb_AggSettingTxUpdate(Adapter);
  99970. +
  99971. + // Rx aggregation setting
  99972. + usb_AggSettingRxUpdate(Adapter);
  99973. +
  99974. + // 201/12/10 MH Add for USB agg mode dynamic switch.
  99975. + pHalData->UsbRxHighSpeedMode = _FALSE;
  99976. +}
  99977. +
  99978. +/*-----------------------------------------------------------------------------
  99979. + * Function: USB_AggModeSwitch()
  99980. + *
  99981. + * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase
  99982. + * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we
  99983. + * need to monitor the influence of FTP/network share.
  99984. + * For TX mode, we are still ubder investigation.
  99985. + *
  99986. + * Input: PADAPTER
  99987. + *
  99988. + * Output: NONE
  99989. + *
  99990. + * Return: NONE
  99991. + *
  99992. + * Revised History:
  99993. + * When Who Remark
  99994. + * 12/10/2010 MHC Create Version 0.
  99995. + *
  99996. + *---------------------------------------------------------------------------*/
  99997. +VOID
  99998. +USB_AggModeSwitch(
  99999. + IN PADAPTER Adapter
  100000. + )
  100001. +{
  100002. +#if 0
  100003. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100004. + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
  100005. +
  100006. + //pHalData->UsbRxHighSpeedMode = FALSE;
  100007. + // How to measure the RX speed? We assume that when traffic is more than
  100008. + if (pMgntInfo->bRegAggDMEnable == _FALSE)
  100009. + {
  100010. + return; // Inf not support.
  100011. + }
  100012. +
  100013. +
  100014. + if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _TRUE &&
  100015. + pHalData->UsbRxHighSpeedMode == _FALSE)
  100016. + {
  100017. + pHalData->UsbRxHighSpeedMode = _TRUE;
  100018. + DBG_8192C("UsbAggModeSwitchCheck to HIGH\n");
  100019. + }
  100020. + else if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _FALSE &&
  100021. + pHalData->UsbRxHighSpeedMode == _TRUE)
  100022. + {
  100023. + pHalData->UsbRxHighSpeedMode = _FALSE;
  100024. + DBG_8192C("UsbAggModeSwitchCheck to LOW\n");
  100025. + }
  100026. + else
  100027. + {
  100028. + return;
  100029. + }
  100030. +
  100031. + // 2010/12/10 MH Add for USB Aggregation judgement we need to
  100032. + //if( pMgntInfo->LinkDetectInfo.NumRxOkInPeriod > 4000 ||
  100033. + // pMgntInfo->LinkDetectInfo.NumTxOkInPeriod > 4000 )
  100034. +
  100035. +#ifdef CONFIG_USB_TX_AGGREGATION
  100036. + //usb_AggSettingTxUpdate(Adapter);
  100037. +#endif
  100038. +
  100039. +#ifdef CONFIG_USB_RX_AGGREGATION
  100040. + if (pHalData->UsbRxHighSpeedMode == _TRUE)
  100041. + {
  100042. + // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator.
  100043. + // USB mode
  100044. + pHalData->UsbRxAggBlockCount = 40;
  100045. + pHalData->UsbRxAggBlockTimeout = 5;
  100046. + // Mix mode
  100047. + pHalData->UsbRxAggPageCount = 72;
  100048. + pHalData->UsbRxAggPageTimeout = 6;
  100049. + }
  100050. + else
  100051. + {
  100052. + // USB mode
  100053. + pHalData->UsbRxAggBlockCount = pMgntInfo->RegUsbRxAggBlockCount;
  100054. + pHalData->UsbRxAggBlockTimeout = pMgntInfo->RegUsbRxAggBlockTimeout;
  100055. + // Mix mode
  100056. + pHalData->UsbRxAggPageCount = pMgntInfo->RegUsbRxAggPageCount;
  100057. + pHalData->UsbRxAggPageTimeout = pMgntInfo->RegUsbRxAggPageTimeout;
  100058. + }
  100059. +#endif
  100060. +#endif
  100061. +} // USB_AggModeSwitch
  100062. +
  100063. +static VOID
  100064. +_InitOperationMode(
  100065. + IN PADAPTER Adapter
  100066. + )
  100067. +{
  100068. +#if 0//gtest
  100069. + PHAL_DATA_8192CUSB pHalData = GetHalData8192CUsb(Adapter);
  100070. + u1Byte regBwOpMode = 0;
  100071. + u4Byte regRATR = 0, regRRSR = 0;
  100072. +
  100073. +
  100074. + //1 This part need to modified according to the rate set we filtered!!
  100075. + //
  100076. + // Set RRSR, RATR, and REG_BWOPMODE registers
  100077. + //
  100078. + switch(Adapter->RegWirelessMode)
  100079. + {
  100080. + case WIRELESS_MODE_B:
  100081. + regBwOpMode = BW_OPMODE_20MHZ;
  100082. + regRATR = RATE_ALL_CCK;
  100083. + regRRSR = RATE_ALL_CCK;
  100084. + break;
  100085. + case WIRELESS_MODE_A:
  100086. + ASSERT(FALSE);
  100087. +#if 0
  100088. + regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
  100089. + regRATR = RATE_ALL_OFDM_AG;
  100090. + regRRSR = RATE_ALL_OFDM_AG;
  100091. +#endif
  100092. + break;
  100093. + case WIRELESS_MODE_G:
  100094. + regBwOpMode = BW_OPMODE_20MHZ;
  100095. + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100096. + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100097. + break;
  100098. + case WIRELESS_MODE_AUTO:
  100099. + if (Adapter->bInHctTest)
  100100. + {
  100101. + regBwOpMode = BW_OPMODE_20MHZ;
  100102. + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100103. + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100104. + }
  100105. + else
  100106. + {
  100107. + regBwOpMode = BW_OPMODE_20MHZ;
  100108. + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
  100109. + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100110. + }
  100111. + break;
  100112. + case WIRELESS_MODE_N_24G:
  100113. + // It support CCK rate by default.
  100114. + // CCK rate will be filtered out only when associated AP does not support it.
  100115. + regBwOpMode = BW_OPMODE_20MHZ;
  100116. + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
  100117. + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
  100118. + break;
  100119. + case WIRELESS_MODE_N_5G:
  100120. + ASSERT(FALSE);
  100121. +#if 0
  100122. + regBwOpMode = BW_OPMODE_5G;
  100123. + regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
  100124. + regRRSR = RATE_ALL_OFDM_AG;
  100125. +#endif
  100126. + break;
  100127. + }
  100128. +
  100129. + // Ziv ????????
  100130. + //PlatformEFIOWrite4Byte(Adapter, REG_INIRTS_RATE_SEL, regRRSR);
  100131. + PlatformEFIOWrite1Byte(Adapter, REG_BWOPMODE, regBwOpMode);
  100132. +
  100133. + // For Min Spacing configuration.
  100134. + switch(pHalData->RF_Type)
  100135. + {
  100136. + case RF_1T2R:
  100137. + case RF_1T1R:
  100138. + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter: RF_Type%s\n", (pHalData->RF_Type==RF_1T1R? "(1T1R)":"(1T2R)")));
  100139. + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
  100140. + break;
  100141. + case RF_2T2R:
  100142. + case RF_2T2R_GREEN:
  100143. + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter:RF_Type(2T2R)\n"));
  100144. + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
  100145. + break;
  100146. + }
  100147. +
  100148. + PlatformEFIOWrite1Byte(Adapter, REG_AMPDU_MIN_SPACE, Adapter->MgntInfo.MinSpaceCfg);
  100149. +#endif
  100150. +}
  100151. +
  100152. +
  100153. + static VOID
  100154. +_InitBeaconParameters(
  100155. + IN PADAPTER Adapter
  100156. + )
  100157. +{
  100158. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100159. +
  100160. + rtw_write16(Adapter, REG_BCN_CTRL, 0x1010);
  100161. +
  100162. + // TODO: Remove these magic number
  100163. + rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms
  100164. +
  100165. + rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME);// 5ms
  100166. + rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME); // 2ms
  100167. +
  100168. + // Suggested by designer timchen. Change beacon AIFS to the largest number
  100169. + // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03
  100170. + rtw_write16(Adapter, REG_BCNTCFG, 0x660F);
  100171. +}
  100172. +
  100173. +static VOID
  100174. +_InitRFType(
  100175. + IN PADAPTER Adapter
  100176. + )
  100177. +{
  100178. + struct registry_priv *pregpriv = &Adapter->registrypriv;
  100179. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100180. + BOOLEAN is92CU = IS_92C_SERIAL(pHalData->VersionID);
  100181. +
  100182. +#if DISABLE_BB_RF
  100183. + pHalData->rf_chip = RF_PSEUDO_11N;
  100184. + return;
  100185. +#endif
  100186. +
  100187. + pHalData->rf_chip = RF_6052;
  100188. +
  100189. + if(_FALSE == is92CU){
  100190. + pHalData->rf_type = RF_1T1R;
  100191. + DBG_8192C("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n");
  100192. + return;
  100193. + }
  100194. +
  100195. + // TODO: Consider that EEPROM set 92CU to 1T1R later.
  100196. + // Force to overwrite setting according to chip version. Ignore EEPROM setting.
  100197. + //pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R;
  100198. + MSG_8192C("Set RF Chip ID to RF_6052 and RF type to %d.\n", pHalData->rf_type);
  100199. +
  100200. +}
  100201. +
  100202. +static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter)
  100203. +{
  100204. +#if RTL8192CU_ADHOC_WORKAROUND_SETTING
  100205. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100206. + pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL);
  100207. + pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE);
  100208. + pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2);
  100209. + pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2);
  100210. +#endif
  100211. +}
  100212. +
  100213. +static VOID
  100214. +_BeaconFunctionEnable(
  100215. + IN PADAPTER Adapter,
  100216. + IN BOOLEAN Enable,
  100217. + IN BOOLEAN Linked
  100218. + )
  100219. +{
  100220. + rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1));
  100221. + //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00);
  100222. + //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", PlatformEFIORead1Byte(Adapter, 0x550)));
  100223. +
  100224. + rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F);
  100225. +}
  100226. +
  100227. +
  100228. +// Set CCK and OFDM Block "ON"
  100229. +static VOID _BBTurnOnBlock(
  100230. + IN PADAPTER Adapter
  100231. + )
  100232. +{
  100233. +#if (DISABLE_BB_RF)
  100234. + return;
  100235. +#endif
  100236. +
  100237. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
  100238. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
  100239. +}
  100240. +
  100241. +static VOID _RfPowerSave(
  100242. + IN PADAPTER Adapter
  100243. + )
  100244. +{
  100245. +#if 0
  100246. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100247. + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  100248. + u1Byte eRFPath;
  100249. +
  100250. +#if (DISABLE_BB_RF)
  100251. + return;
  100252. +#endif
  100253. +
  100254. + if(pMgntInfo->RegRfOff == TRUE){ // User disable RF via registry.
  100255. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n"));
  100256. + MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);
  100257. + // Those action will be discard in MgntActSet_RF_State because off the same state
  100258. + for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  100259. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
  100260. + }
  100261. + else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep.
  100262. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason));
  100263. + MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);
  100264. + }
  100265. + else{
  100266. + pHalData->eRFPowerState = eRfOn;
  100267. + pMgntInfo->RfOffReason = 0;
  100268. + if(Adapter->bInSetPower || Adapter->bResetInProgress)
  100269. + PlatformUsbEnableInPipes(Adapter);
  100270. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n"));
  100271. + }
  100272. +#endif
  100273. +}
  100274. +
  100275. +enum {
  100276. + Antenna_Lfet = 1,
  100277. + Antenna_Right = 2,
  100278. +};
  100279. +
  100280. +static VOID
  100281. +_InitAntenna_Selection(IN PADAPTER Adapter)
  100282. +{
  100283. +
  100284. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100285. +
  100286. + if(pHalData->AntDivCfg==0)
  100287. + return;
  100288. + DBG_8192C("==> %s ....\n",__FUNCTION__);
  100289. +
  100290. + if((RF_1T1R == pHalData->rf_type))
  100291. + {
  100292. + rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0)|BIT23);
  100293. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);
  100294. +
  100295. + if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A)
  100296. + pHalData->CurAntenna = Antenna_A;
  100297. + else
  100298. + pHalData->CurAntenna = Antenna_B;
  100299. + DBG_8192C("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == Antenna_A)?"Antenna_A":"Antenna_B");
  100300. +
  100301. +}
  100302. +
  100303. +
  100304. +}
  100305. +//
  100306. +// 2010/08/09 MH Add for power down check.
  100307. +//
  100308. +static BOOLEAN
  100309. +HalDetectPwrDownMode(
  100310. + IN PADAPTER Adapter
  100311. + )
  100312. +{
  100313. + u8 tmpvalue;
  100314. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100315. + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
  100316. +
  100317. + EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3, (u32 *)&tmpvalue);
  100318. +
  100319. + // 2010/08/25 MH INF priority > PDN Efuse value.
  100320. + if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode)
  100321. + {
  100322. + pHalData->pwrdown = _TRUE;
  100323. + }
  100324. + else
  100325. + {
  100326. + pHalData->pwrdown = _FALSE;
  100327. + }
  100328. +
  100329. + DBG_8192C("HalDetectPwrDownMode(): PDN=%d\n", pHalData->pwrdown);
  100330. + return pHalData->pwrdown;
  100331. +
  100332. +} // HalDetectPwrDownMode
  100333. +
  100334. +
  100335. +//
  100336. +// 2010/08/26 MH Add for selective suspend mode check.
  100337. +// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and
  100338. +// slim card.
  100339. +//
  100340. +static VOID
  100341. +HalDetectSelectiveSuspendMode(
  100342. + IN PADAPTER Adapter
  100343. + )
  100344. +{
  100345. + u8 tmpvalue;
  100346. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100347. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
  100348. +
  100349. + // If support HW radio detect, we need to enable WOL ability, otherwise, we
  100350. + // can not use FW to notify host the power state switch.
  100351. +
  100352. + EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue);
  100353. +
  100354. + DBG_8192C("HalDetectSelectiveSuspendMode(): SS ");
  100355. + if(tmpvalue & BIT1)
  100356. + {
  100357. + DBG_8192C("Enable\n");
  100358. + }
  100359. + else
  100360. + {
  100361. + DBG_8192C("Disable\n");
  100362. + pdvobjpriv->RegUsbSS = _FALSE;
  100363. + }
  100364. +
  100365. + // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode.
  100366. + if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData))
  100367. + {
  100368. + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
  100369. +
  100370. + //if (!pMgntInfo->bRegDongleSS)
  100371. + //{
  100372. + // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n"));
  100373. + pdvobjpriv->RegUsbSS = _FALSE;
  100374. + //}
  100375. + }
  100376. +} // HalDetectSelectiveSuspendMode
  100377. +/*-----------------------------------------------------------------------------
  100378. + * Function: HwSuspendModeEnable92Cu()
  100379. + *
  100380. + * Overview: HW suspend mode switch.
  100381. + *
  100382. + * Input: NONE
  100383. + *
  100384. + * Output: NONE
  100385. + *
  100386. + * Return: NONE
  100387. + *
  100388. + * Revised History:
  100389. + * When Who Remark
  100390. + * 08/23/2010 MHC HW suspend mode switch test..
  100391. + *---------------------------------------------------------------------------*/
  100392. +static VOID
  100393. +HwSuspendModeEnable92Cu(
  100394. + IN PADAPTER pAdapter,
  100395. + IN u8 Type
  100396. + )
  100397. +{
  100398. + //PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(pAdapter);
  100399. + u16 reg = rtw_read16(pAdapter, REG_GPIO_MUXCFG);
  100400. +
  100401. + //if (!pDevice->RegUsbSS)
  100402. + {
  100403. + return;
  100404. + }
  100405. +
  100406. + //
  100407. + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW
  100408. + // to enter suspend mode automatically. Otherwise, it will shut down major power
  100409. + // domain and 8051 will stop. When we try to enter selective suspend mode, we
  100410. + // need to prevent HW to enter D2 mode aumotmatically. Another way, Host will
  100411. + // issue a S10 signal to power domain. Then it will cleat SIC setting(from Yngli).
  100412. + // We need to enable HW suspend mode when enter S3/S4 or disable. We need
  100413. + // to disable HW suspend mode for IPS/radio_off.
  100414. + //
  100415. + //RT_TRACE(COMP_RF, DBG_LOUD, ("HwSuspendModeEnable92Cu = %d\n", Type));
  100416. + if (Type == _FALSE)
  100417. + {
  100418. + reg |= BIT14;
  100419. + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg));
  100420. + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
  100421. + reg |= BIT12;
  100422. + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg));
  100423. + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
  100424. + }
  100425. + else
  100426. + {
  100427. + reg &= (~BIT12);
  100428. + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
  100429. + reg &= (~BIT14);
  100430. + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
  100431. + }
  100432. +
  100433. +} // HwSuspendModeEnable92Cu
  100434. +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter )
  100435. +{
  100436. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  100437. + u8 val8;
  100438. + rt_rf_power_state rfpowerstate = rf_off;
  100439. +
  100440. + if(pAdapter->pwrctrlpriv.bHWPowerdown)
  100441. + {
  100442. + val8 = rtw_read8(pAdapter, REG_HSISR);
  100443. + DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8);
  100444. + rfpowerstate = (val8 & BIT7) ? rf_off: rf_on;
  100445. + }
  100446. + else // rf on/off
  100447. + {
  100448. + rtw_write8( pAdapter, REG_MAC_PINMUX_CFG,rtw_read8(pAdapter, REG_MAC_PINMUX_CFG)&~(BIT3));
  100449. + val8 = rtw_read8(pAdapter, REG_GPIO_IO_SEL);
  100450. + DBG_8192C("GPIO_IN=%02x\n", val8);
  100451. + rfpowerstate = (val8 & BIT3) ? rf_on : rf_off;
  100452. + }
  100453. + return rfpowerstate;
  100454. +} // HalDetectPwrDownMode
  100455. +
  100456. +void _ps_open_RF(_adapter *padapter);
  100457. +
  100458. +
  100459. +u32 rtl8192cu_hal_init(PADAPTER Adapter)
  100460. +{
  100461. + u8 val8 = 0;
  100462. + u32 boundary, status = _SUCCESS;
  100463. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100464. + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
  100465. + struct registry_priv *pregistrypriv = &Adapter->registrypriv;
  100466. + u8 is92C = IS_92C_SERIAL(pHalData->VersionID);
  100467. + rt_rf_power_state eRfPowerStateToSet;
  100468. +#ifdef CONFIG_BT_COEXIST
  100469. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  100470. +#endif
  100471. +
  100472. + u32 init_start_time = rtw_get_current_time();
  100473. +
  100474. +
  100475. +#ifdef DBG_HAL_INIT_PROFILING
  100476. +
  100477. + enum HAL_INIT_STAGES {
  100478. + HAL_INIT_STAGES_BEGIN = 0,
  100479. + HAL_INIT_STAGES_INIT_PW_ON,
  100480. + HAL_INIT_STAGES_MISC01,
  100481. + HAL_INIT_STAGES_DOWNLOAD_FW,
  100482. + HAL_INIT_STAGES_INIT_LLTT,
  100483. + HAL_INIT_STAGES_MAC,
  100484. + HAL_INIT_STAGES_MISC02,
  100485. + HAL_INIT_STAGES_BB,
  100486. + HAL_INIT_STAGES_RF,
  100487. + HAL_INIT_STAGES_TURN_ON_BLOCK,
  100488. + HAL_INIT_STAGES_INIT_SECURITY,
  100489. + HAL_INIT_STAGES_MISC11,
  100490. + //HAL_INIT_STAGES_RF_PS,
  100491. + HAL_INIT_STAGES_IQK,
  100492. + HAL_INIT_STAGES_PW_TRACK,
  100493. + HAL_INIT_STAGES_LCK,
  100494. + HAL_INIT_STAGES_MISC21,
  100495. + HAL_INIT_STAGES_INIT_PABIAS,
  100496. + HAL_INIT_STAGES_BT_COEXIST,
  100497. + //HAL_INIT_STAGES_ANTENNA_SEL,
  100498. + HAL_INIT_STAGES_INIT_HAL_DM,
  100499. + HAL_INIT_STAGES_MISC31,
  100500. + HAL_INIT_STAGES_END,
  100501. + HAL_INIT_STAGES_NUM
  100502. + };
  100503. +
  100504. + char * hal_init_stages_str[] = {
  100505. + "HAL_INIT_STAGES_BEGIN",
  100506. + "HAL_INIT_STAGES_INIT_PW_ON",
  100507. + "HAL_INIT_STAGES_MISC01",
  100508. + "HAL_INIT_STAGES_DOWNLOAD_FW",
  100509. + "HAL_INIT_STAGES_INIT_LLTT",
  100510. + "HAL_INIT_STAGES_MAC",
  100511. + "HAL_INIT_STAGES_MISC02",
  100512. + "HAL_INIT_STAGES_BB",
  100513. + "HAL_INIT_STAGES_RF",
  100514. + "HAL_INIT_STAGES_TURN_ON_BLOCK",
  100515. + "HAL_INIT_STAGES_INIT_SECURITY",
  100516. + "HAL_INIT_STAGES_MISC11",
  100517. + //"HAL_INIT_STAGES_RF_PS",
  100518. + "HAL_INIT_STAGES_IQK",
  100519. + "HAL_INIT_STAGES_PW_TRACK",
  100520. + "HAL_INIT_STAGES_LCK",
  100521. + "HAL_INIT_STAGES_MISC21",
  100522. + "HAL_INIT_STAGES_INIT_PABIAS",
  100523. + "HAL_INIT_STAGES_BT_COEXIST",
  100524. + //"HAL_INIT_STAGES_ANTENNA_SEL",
  100525. + "HAL_INIT_STAGES_INIT_HAL_DM",
  100526. + "HAL_INIT_STAGES_MISC31",
  100527. + "HAL_INIT_STAGES_END",
  100528. + };
  100529. +
  100530. + int hal_init_profiling_i;
  100531. + u32 hal_init_stages_timestamp[HAL_INIT_STAGES_NUM]; //used to record the time of each stage's starting point
  100532. +
  100533. + for(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM;hal_init_profiling_i++)
  100534. + hal_init_stages_timestamp[hal_init_profiling_i]=0;
  100535. +
  100536. + #define HAL_INIT_PROFILE_TAG(stage) hal_init_stages_timestamp[(stage)]=rtw_get_current_time();
  100537. +#else
  100538. + #define HAL_INIT_PROFILE_TAG(stage) do {} while(0)
  100539. +#endif //DBG_HAL_INIT_PROFILING
  100540. +
  100541. +
  100542. +
  100543. +_func_enter_;
  100544. +
  100545. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN);
  100546. + if(Adapter->pwrctrlpriv.bkeepfwalive)
  100547. + {
  100548. + _ps_open_RF(Adapter);
  100549. +
  100550. + if(pHalData->bIQKInitialized ){
  100551. + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE);
  100552. + }
  100553. + else{
  100554. + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE);
  100555. + pHalData->bIQKInitialized = _TRUE;
  100556. + }
  100557. + rtl8192c_dm_CheckTXPowerTracking(Adapter);
  100558. + rtl8192c_PHY_LCCalibrate(Adapter);
  100559. +
  100560. + goto exit;
  100561. + }
  100562. +
  100563. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON);
  100564. + status = _InitPowerOn(Adapter);
  100565. + if(status == _FAIL){
  100566. + RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init power on!\n"));
  100567. + goto exit;
  100568. + }
  100569. +
  100570. +
  100571. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01);
  100572. + _InitQueueReservedPage(Adapter);
  100573. + _InitTxBufferBoundary(Adapter);
  100574. + _InitQueuePriority(Adapter);
  100575. + _InitPageBoundary(Adapter);
  100576. + _InitTransferPageSize(Adapter);
  100577. +
  100578. +
  100579. +#if ENABLE_USB_DROP_INCORRECT_OUT
  100580. + _InitHardwareDropIncorrectBulkOut(Adapter);
  100581. +#endif
  100582. +
  100583. + if(pHalData->bRDGEnable){
  100584. + _InitRDGSetting(Adapter);
  100585. + }
  100586. +
  100587. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW);
  100588. +#if (1 == MP_DRIVER)
  100589. + _InitRxSetting(Adapter);
  100590. + // Don't Download Firmware
  100591. + Adapter->bFWReady = _FALSE;
  100592. +#elif RTL8192CU_FW_DOWNLOAD_ENABLE
  100593. + status = FirmwareDownload92C(Adapter,_FALSE);
  100594. + if(status != _SUCCESS)
  100595. + {
  100596. + Adapter->bFWReady = _FALSE;
  100597. + pHalData->fw_ractrl = _FALSE;
  100598. + DBG_8192C("fw download fail!\n");
  100599. + goto exit;
  100600. + }
  100601. + else
  100602. + {
  100603. + Adapter->bFWReady = _TRUE;
  100604. + pHalData->fw_ractrl = _TRUE;
  100605. + DBG_8192C("fw download ok!\n");
  100606. + }
  100607. +#endif
  100608. +
  100609. + InitializeFirmwareVars92C(Adapter);
  100610. +
  100611. + if(pwrctrlpriv->reg_rfoff == _TRUE){
  100612. + pwrctrlpriv->rf_pwrstate = rf_off;
  100613. + }
  100614. +
  100615. + // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting
  100616. + // HW GPIO pin. Before PHY_RFConfig8192C.
  100617. + //HalDetectPwrDownMode(Adapter);
  100618. + // 2010/08/26 MH If Efuse does not support sective suspend then disable the function.
  100619. + //HalDetectSelectiveSuspendMode(Adapter);
  100620. +
  100621. + // Set RF type for BB/RF configuration
  100622. + _InitRFType(Adapter);//->_ReadRFType()
  100623. +
  100624. + // Save target channel
  100625. + // <Roger_Notes> Current Channel will be updated again later.
  100626. + pHalData->CurrentChannel = 6;//default set to 6
  100627. +
  100628. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT);
  100629. + if(!pregistrypriv->wifi_spec){
  100630. + boundary = TX_PAGE_BOUNDARY;
  100631. + }
  100632. + else{// for WMM
  100633. + boundary = WMM_NORMAL_TX_PAGE_BOUNDARY;
  100634. + }
  100635. + status = InitLLTTable(Adapter, boundary);
  100636. + if(status == _FAIL){
  100637. + RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init LLT table\n"));
  100638. + goto exit;
  100639. + }
  100640. +
  100641. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC);
  100642. +#if (HAL_MAC_ENABLE == 1)
  100643. + status = PHY_MACConfig8192C(Adapter);
  100644. + if(status == _FAIL)
  100645. + {
  100646. + goto exit;
  100647. + }
  100648. +#endif
  100649. +
  100650. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02);
  100651. + // Get Rx PHY status in order to report RSSI and others.
  100652. + _InitDriverInfoSize(Adapter, DRVINFO_SZ);
  100653. +
  100654. + _InitInterrupt(Adapter);
  100655. + hal_init_macaddr(Adapter);//set mac_address
  100656. + _InitNetworkType(Adapter);//set msr
  100657. + _InitWMACSetting(Adapter);
  100658. + _InitAdaptiveCtrl(Adapter);
  100659. + _InitEDCA(Adapter);
  100660. + _InitRateFallback(Adapter);
  100661. + _InitRetryFunction(Adapter);
  100662. + InitUsbAggregationSetting(Adapter);
  100663. + _InitOperationMode(Adapter);//todo
  100664. + _InitBeaconParameters(Adapter);
  100665. + _InitBeaconMaxError(Adapter, _TRUE);
  100666. +
  100667. +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI)
  100668. +
  100669. +#ifdef CONFIG_CHECK_AC_LIFETIME
  100670. + // Enable lifetime check for the four ACs
  100671. + rtw_write8(Adapter, REG_LIFETIME_EN, 0x0F);
  100672. +#endif // CONFIG_CHECK_AC_LIFETIME
  100673. +
  100674. +#ifdef CONFIG_TX_MCAST2UNI
  100675. + rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); // unit: 256us. 256ms
  100676. + rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); // unit: 256us. 256ms
  100677. +#else // CONFIG_TX_MCAST2UNI
  100678. + rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x3000); // unit: 256us. 3s
  100679. + rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x3000); // unit: 256us. 3s
  100680. +#endif // CONFIG_TX_MCAST2UNI
  100681. +#endif // CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI
  100682. +
  100683. +
  100684. +#ifdef CONFIG_LED
  100685. + _InitHWLed(Adapter);
  100686. +#endif //CONFIG_LED
  100687. +
  100688. + //
  100689. + //d. Initialize BB related configurations.
  100690. + //
  100691. +
  100692. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB);
  100693. +#if (HAL_BB_ENABLE == 1)
  100694. + status = PHY_BBConfig8192C(Adapter);
  100695. + if(status == _FAIL)
  100696. + {
  100697. + goto exit;
  100698. + }
  100699. +#endif
  100700. +
  100701. + // 92CU use 3-wire to r/w RF
  100702. + //pHalData->Rf_Mode = RF_OP_By_SW_3wire;
  100703. +
  100704. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF);
  100705. +#if (HAL_RF_ENABLE == 1)
  100706. + status = PHY_RFConfig8192C(Adapter);
  100707. + if(status == _FAIL)
  100708. + {
  100709. + goto exit;
  100710. + }
  100711. +
  100712. + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID))
  100713. + {
  100714. + PHY_SetRFReg(Adapter, RF_PATH_A, RF_RX_G1, bMaskDWord, 0x30255);
  100715. + PHY_SetRFReg(Adapter, RF_PATH_A, RF_RX_G2, bMaskDWord, 0x50a00);
  100716. + }
  100717. +#endif
  100718. +
  100719. + //
  100720. + // Joseph Note: Keep RfRegChnlVal for later use.
  100721. + //
  100722. + pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (RF_RADIO_PATH_E)0, RF_CHNLBW, bRFRegOffsetMask);
  100723. + pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (RF_RADIO_PATH_E)1, RF_CHNLBW, bRFRegOffsetMask);
  100724. +
  100725. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK);
  100726. + _BBTurnOnBlock(Adapter);
  100727. + //NicIFSetMacAddress(padapter, padapter->PermanentAddress);
  100728. +
  100729. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY);
  100730. + invalidate_cam_all(Adapter);
  100731. +
  100732. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11);
  100733. + // 2010/12/17 MH We need to set TX power according to EFUSE content at first.
  100734. + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
  100735. +
  100736. +// Move by Neo for USB SS to below setp
  100737. +//_RfPowerSave(Adapter);
  100738. +
  100739. + if (!IS_92C_SERIAL( pHalData->VersionID) && (pHalData->AntDivCfg!=0))
  100740. + { //for 88CU ,1T1R
  100741. + _InitAntenna_Selection(Adapter);
  100742. + }
  100743. +
  100744. +
  100745. + //
  100746. + // Disable BAR, suggested by Scott
  100747. + // 2010.04.09 add by hpfan
  100748. + //
  100749. + rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff);
  100750. +
  100751. + // HW SEQ CTRL
  100752. + //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM.
  100753. + rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF);
  100754. +
  100755. + if(pregistrypriv->wifi_spec)
  100756. + rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0);
  100757. +
  100758. + //Nav limit , suggest by scott
  100759. + rtw_write8(Adapter, 0x652, 0x0);
  100760. +
  100761. +#if (MP_DRIVER == 1)
  100762. + Adapter->mppriv.channel = pHalData->CurrentChannel;
  100763. + MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel);
  100764. +#else
  100765. + //
  100766. + // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status
  100767. + // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not
  100768. + // call init_adapter. May cause some problem??
  100769. + //
  100770. + // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed
  100771. + // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState
  100772. + // is the same as eRfOff, we should change it to eRfOn after we config RF parameters.
  100773. + // Added by tynli. 2010.03.30.
  100774. + pwrctrlpriv->rf_pwrstate = rf_on;
  100775. +
  100776. +#if 0 //to do
  100777. + RT_CLEAR_PS_LEVEL(pwrctrlpriv, RT_RF_OFF_LEVL_HALT_NIC);
  100778. +#if 1 //Todo
  100779. + // 20100326 Joseph: Copy from GPIOChangeRFWorkItemCallBack() function to check HW radio on/off.
  100780. + // 20100329 Joseph: Revise and integrate the HW/SW radio off code in initialization.
  100781. +
  100782. + eRfPowerStateToSet = (rt_rf_power_state) RfOnOffDetect(Adapter);
  100783. + pwrctrlpriv->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW;
  100784. + pwrctrlpriv->rfoff_reason |= (pwrctrlpriv->reg_rfoff) ? RF_CHANGE_BY_SW : 0;
  100785. +
  100786. + if(pwrctrlpriv->rfoff_reason&RF_CHANGE_BY_HW)
  100787. + pwrctrlpriv->b_hw_radio_off = _TRUE;
  100788. +
  100789. + DBG_8192C("eRfPowerStateToSet=%d\n", eRfPowerStateToSet);
  100790. +
  100791. + if(pwrctrlpriv->reg_rfoff == _TRUE)
  100792. + { // User disable RF via registry.
  100793. + DBG_8192C("InitializeAdapter8192CU(): Turn off RF for RegRfOff.\n");
  100794. + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_SW, _TRUE);
  100795. +
  100796. + // Those action will be discard in MgntActSet_RF_State because off the same state
  100797. + //for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
  100798. + //PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0);
  100799. + }
  100800. + else if(pwrctrlpriv->rfoff_reason > RF_CHANGE_BY_PS)
  100801. + { // H/W or S/W RF OFF before sleep.
  100802. + DBG_8192C(" Turn off RF for RfOffReason(%x) ----------\n", pwrctrlpriv->rfoff_reason);
  100803. + //pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT;
  100804. + pwrctrlpriv->rf_pwrstate = rf_on;
  100805. + //MgntActSet_RF_State(Adapter, rf_off, pwrctrlpriv->rfoff_reason, _TRUE);
  100806. + }
  100807. + else
  100808. + {
  100809. + // Perform GPIO polling to find out current RF state. added by Roger, 2010.04.09.
  100810. + if(pHalData->BoardType == BOARD_MINICARD /*&& (Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)*/)
  100811. + {
  100812. + DBG_8192C("InitializeAdapter8192CU(): RF=%d \n", eRfPowerStateToSet);
  100813. + if (eRfPowerStateToSet == rf_off)
  100814. + {
  100815. + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_HW, _TRUE);
  100816. + pwrctrlpriv->b_hw_radio_off = _TRUE;
  100817. + }
  100818. + else
  100819. + {
  100820. + pwrctrlpriv->rf_pwrstate = rf_off;
  100821. + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT;
  100822. + pwrctrlpriv->b_hw_radio_off = _FALSE;
  100823. + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE);
  100824. + }
  100825. + }
  100826. + else
  100827. + {
  100828. + pwrctrlpriv->rf_pwrstate = rf_off;
  100829. + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT;
  100830. + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE);
  100831. + }
  100832. +
  100833. + pwrctrlpriv->rfoff_reason = 0;
  100834. + pwrctrlpriv->b_hw_radio_off = _FALSE;
  100835. + pwrctrlpriv->rf_pwrstate = rf_on;
  100836. + rtw_led_control(Adapter, LED_CTL_POWER_ON);
  100837. +
  100838. + }
  100839. +
  100840. + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c.
  100841. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1.
  100842. + if(pHalData->pwrdown && eRfPowerStateToSet == rf_off)
  100843. + {
  100844. + // Enable register area 0x0-0xc.
  100845. + rtw_write8(Adapter, REG_RSV_CTRL, 0x0);
  100846. +
  100847. + //
  100848. + // <Roger_Notes> We should configure HW PDn source for WiFi ONLY, and then
  100849. + // our HW will be set in power-down mode if PDn source from all functions are configured.
  100850. + // 2010.10.06.
  100851. + //
  100852. + //if(IS_HARDWARE_TYPE_8723AU(Adapter))
  100853. + //{
  100854. + // u1bTmp = rtw_read8(Adapter, REG_MULTI_FUNC_CTRL);
  100855. + // rtw_write8(Adapter, REG_MULTI_FUNC_CTRL, (u1bTmp|WL_HWPDN_EN));
  100856. + //}
  100857. + //else
  100858. + //{
  100859. + rtw_write16(Adapter, REG_APS_FSMCO, 0x8812);
  100860. + //}
  100861. + }
  100862. + //DrvIFIndicateCurrentPhyStatus(Adapter); // 2010/08/17 MH Disable to prevent BSOD.
  100863. +#endif
  100864. +#endif
  100865. +
  100866. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK);
  100867. + // 2010/08/26 MH Merge from 8192CE.
  100868. + if(pwrctrlpriv->rf_pwrstate == rf_on)
  100869. + {
  100870. + if(pHalData->bIQKInitialized ){
  100871. + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE);
  100872. + }
  100873. + else
  100874. + {
  100875. + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE);
  100876. + pHalData->bIQKInitialized = _TRUE;
  100877. + }
  100878. +
  100879. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_PW_TRACK);
  100880. + rtl8192c_dm_CheckTXPowerTracking(Adapter);
  100881. +
  100882. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_LCK);
  100883. + rtl8192c_PHY_LCCalibrate(Adapter);
  100884. + }
  100885. +#endif /* #if (MP_DRIVER == 1) */
  100886. +
  100887. +
  100888. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC21);
  100889. +#if RTL8192CU_ADHOC_WORKAROUND_SETTING
  100890. + _InitAdhocWorkaroundParams(Adapter);
  100891. +#endif
  100892. +
  100893. +
  100894. +#ifdef USB_INTERFERENCE_ISSUE
  100895. + //fixed USB interface interference issue
  100896. + rtw_write8(Adapter, 0xfe40, 0xe0);
  100897. + rtw_write8(Adapter, 0xfe41, 0x8d);
  100898. + rtw_write8(Adapter, 0xfe42, 0x80);
  100899. + rtw_write32(Adapter,0x20c,0xfd0320);
  100900. +#if 1
  100901. + //2011/01/07 ,suggest by Johnny,for solved the problem that too many protocol error on USB bus
  100902. + if(!IS_VENDOR_UMC_A_CUT(pHalData->VersionID) )//&& !IS_92C_SERIAL(pHalData->VersionID))// TSMC , 8188
  100903. + {
  100904. + // 0xE6=0x94
  100905. + rtw_write8(Adapter, 0xFE40, 0xE6);
  100906. + rtw_write8(Adapter, 0xFE41, 0x94);
  100907. + rtw_write8(Adapter, 0xFE42, 0x80);
  100908. +
  100909. + // 0xE0=0x19
  100910. + rtw_write8(Adapter, 0xFE40, 0xE0);
  100911. + rtw_write8(Adapter, 0xFE41, 0x19);
  100912. + rtw_write8(Adapter, 0xFE42, 0x80);
  100913. +
  100914. + // 0xE5=0x91
  100915. + rtw_write8(Adapter, 0xFE40, 0xE5);
  100916. + rtw_write8(Adapter, 0xFE41, 0x91);
  100917. + rtw_write8(Adapter, 0xFE42, 0x80);
  100918. +
  100919. + // 0xE2=0x81
  100920. + rtw_write8(Adapter, 0xFE40, 0xE2);
  100921. + rtw_write8(Adapter, 0xFE41, 0x81);
  100922. + rtw_write8(Adapter, 0xFE42, 0x80);
  100923. +
  100924. + }
  100925. +
  100926. +#endif
  100927. +#endif //USB_INTERFERENCE_ISSUE
  100928. +
  100929. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS);
  100930. + _InitPABias(Adapter);
  100931. +
  100932. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BT_COEXIST);
  100933. +#ifdef CONFIG_BT_COEXIST
  100934. + _InitBTCoexist(Adapter);
  100935. +#endif
  100936. +
  100937. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM);
  100938. + rtl8192c_InitHalDm(Adapter);
  100939. +
  100940. + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter
  100941. + // suspend mode automatically.
  100942. + //HwSuspendModeEnable92Cu(Adapter, _FALSE);
  100943. +
  100944. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);
  100945. + rtw_write8(Adapter, 0x15, 0xe9);//suggest by Johnny for lower temperature
  100946. +
  100947. + rtw_write8(Adapter, 0xc87, 0x50);//suggest by Jackson for CCA
  100948. +
  100949. + //_dbg_dump_macreg(padapter);
  100950. +
  100951. + rtw_write16(Adapter, REG_BCN_CTRL, 0x1818); // For 2 PORT TSF SYNC
  100952. +
  100953. +
  100954. +
  100955. +#ifdef CONFIG_XMIT_ACK
  100956. + //ack for xmit mgmt frames.
  100957. + rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12));
  100958. +#endif //CONFIG_XMIT_ACK
  100959. +
  100960. +exit:
  100961. +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END);
  100962. +
  100963. + DBG_871X("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time));
  100964. +
  100965. + #ifdef DBG_HAL_INIT_PROFILING
  100966. + hal_init_stages_timestamp[HAL_INIT_STAGES_END]=rtw_get_current_time();
  100967. +
  100968. + for(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM-1;hal_init_profiling_i++) {
  100969. + DBG_871X("DBG_HAL_INIT_PROFILING: %35s, %u, %5u, %5u\n"
  100970. + , hal_init_stages_str[hal_init_profiling_i]
  100971. + , hal_init_stages_timestamp[hal_init_profiling_i]
  100972. + , (hal_init_stages_timestamp[hal_init_profiling_i+1]-hal_init_stages_timestamp[hal_init_profiling_i])
  100973. + , rtw_get_time_interval_ms(hal_init_stages_timestamp[hal_init_profiling_i], hal_init_stages_timestamp[hal_init_profiling_i+1])
  100974. + );
  100975. + }
  100976. + #endif
  100977. +
  100978. +
  100979. +_func_exit_;
  100980. +
  100981. + return status;
  100982. +}
  100983. +
  100984. +
  100985. +#define SYNC_SD7_20110802_phy_SsPwrSwitch92CU
  100986. +#ifdef SYNC_SD7_20110802_phy_SsPwrSwitch92CU
  100987. +
  100988. +VOID
  100989. +phy_SsPwrSwitch92CU(
  100990. + IN PADAPTER Adapter,
  100991. + IN rt_rf_power_state eRFPowerState,
  100992. + IN int bRegSSPwrLvl
  100993. + )
  100994. +{
  100995. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  100996. + u8 value8;
  100997. +
  100998. + switch( eRFPowerState )
  100999. + {
  101000. + case rf_on:
  101001. + if (bRegSSPwrLvl == 1)
  101002. + {
  101003. + // 1. Enable MAC Clock. Can not be enabled now.
  101004. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3));
  101005. +
  101006. + // 2. Force PWM, Enable SPS18_LDO_Marco_Block
  101007. + rtw_write8(Adapter, REG_SPS0_CTRL,
  101008. + rtw_read8(Adapter, REG_SPS0_CTRL) | (BIT0|BIT3));
  101009. +
  101010. + // 3. restore BB, AFE control register.
  101011. + //RF
  101012. + if (pHalData->rf_type == RF_2T2R)
  101013. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 1);
  101014. + else
  101015. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 1);
  101016. + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
  101017. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1, 0);
  101018. +
  101019. + //AFE
  101020. + //DbgPrint("0x0e70 = %x\n", Adapter->PS_BBRegBackup[PSBBREG_AFE0]);
  101021. + //PHY_SetBBReg(Adapter, 0x0e70, bMaskDWord ,Adapter->PS_BBRegBackup[PSBBREG_AFE0] );
  101022. + //PHY_SetBBReg(Adapter, 0x0e70, bMaskDWord ,0x631B25A0 );
  101023. + if (pHalData->rf_type == RF_2T2R)
  101024. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x63DB25A0 );
  101025. + else if (pHalData->rf_type == RF_1T1R)
  101026. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x631B25A0 );
  101027. +
  101028. + // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode.
  101029. + // We can only prvide a usual value instead and then HW will modify the value by itself.
  101030. + PHY_SetRFReg(Adapter,RF_PATH_A, 0, bRFRegOffsetMask,0x32D95);
  101031. + if (pHalData->rf_type == RF_2T2R)
  101032. + {
  101033. + PHY_SetRFReg(Adapter,RF_PATH_B, 0, bRFRegOffsetMask,0x32D95);
  101034. + }
  101035. + }
  101036. + else // Level 2 or others.
  101037. + {
  101038. + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL
  101039. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x81);
  101040. +
  101041. + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK
  101042. + rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x800F);
  101043. + rtw_mdelay_os(1);
  101044. +
  101045. + // 1. Enable MAC Clock. Can not be enabled now.
  101046. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3));
  101047. +
  101048. + // 2. Force PWM, Enable SPS18_LDO_Marco_Block
  101049. + rtw_write8(Adapter, REG_SPS0_CTRL,
  101050. + rtw_read8(Adapter, REG_SPS0_CTRL) | (BIT0|BIT3));
  101051. +
  101052. + // 3. restore BB, AFE control register.
  101053. + //RF
  101054. + if (pHalData->rf_type == RF_2T2R)
  101055. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 1);
  101056. + else
  101057. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 1);
  101058. + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
  101059. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1, 0);
  101060. +
  101061. + //AFE
  101062. + if (pHalData->rf_type == RF_2T2R)
  101063. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x63DB25A0 );
  101064. + else if (pHalData->rf_type == RF_1T1R)
  101065. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x631B25A0 );
  101066. +
  101067. + // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode.
  101068. + // We can only prvide a usual value instead and then HW will modify the value by itself.
  101069. + PHY_SetRFReg(Adapter,RF_PATH_A, 0, bRFRegOffsetMask,0x32D95);
  101070. + if (pHalData->rf_type == RF_2T2R)
  101071. + {
  101072. + PHY_SetRFReg(Adapter,RF_PATH_B, 0, bRFRegOffsetMask,0x32D95);
  101073. + }
  101074. +
  101075. + // 5. gated MAC Clock
  101076. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3)));
  101077. + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)|(BIT3));
  101078. +
  101079. + {
  101080. + //u8 eRFPath = RF_PATH_A,value8 = 0, retry = 0;
  101081. + u8 bytetmp;
  101082. + //PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0);
  101083. + // 2010/08/12 MH Add for B path under SS test.
  101084. + //if (pHalData->RF_Type == RF_2T2R)
  101085. + //PHY_SetRFReg(Adapter, RF_PATH_B, 0x0, bMaskByte0, 0x0);
  101086. +
  101087. + bytetmp = rtw_read8(Adapter, REG_APSD_CTRL);
  101088. + rtw_write8(Adapter, REG_APSD_CTRL, bytetmp & ~BIT6);
  101089. +
  101090. + rtw_mdelay_os(10);
  101091. +
  101092. + // Set BB reset at first
  101093. + rtw_write8(Adapter, REG_SYS_FUNC_EN, 0x17 );//0x16
  101094. + //undo clock gated
  101095. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)&(~BIT31));
  101096. + // Enable TX
  101097. + rtw_write8(Adapter, REG_TXPAUSE, 0x0);
  101098. + }
  101099. + //Adapter->HalFunc.InitializeAdapterHandler(Adapter, Adapter->MgntInfo.dot11CurrentChannelNumber);
  101100. + //CardSelectiveSuspendLeave(Adapter);
  101101. + }
  101102. +
  101103. + break;
  101104. +
  101105. + case rf_sleep:
  101106. + case rf_off:
  101107. + value8 = rtw_read8(Adapter, REG_SPS0_CTRL) ;
  101108. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
  101109. + value8 &= ~(BIT0);
  101110. + else
  101111. + value8 &= ~(BIT0|BIT3);
  101112. + if (bRegSSPwrLvl == 1)
  101113. + {
  101114. + //RT_TRACE(COMP_POWER, DBG_LOUD, ("SS LVL1\n"));
  101115. + // Disable RF and BB only for SelectSuspend.
  101116. +
  101117. + // 1. Set BB/RF to shutdown.
  101118. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving
  101119. + // (2)Reg878[21:19]= 0 //Turn off RF-B
  101120. + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection
  101121. + // (4) Reg800[1] = 1 // enable preamble power saving
  101122. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord);
  101123. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord);
  101124. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord);
  101125. + if (pHalData->rf_type == RF_2T2R)
  101126. + {
  101127. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0);
  101128. + }
  101129. + else if (pHalData->rf_type == RF_1T1R)
  101130. + {
  101131. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 0);
  101132. + }
  101133. + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
  101134. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1);
  101135. +
  101136. + // 2 .AFE control register to power down. bit[30:22]
  101137. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord);
  101138. + if (pHalData->rf_type == RF_2T2R)
  101139. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0);
  101140. + else if (pHalData->rf_type == RF_1T1R)
  101141. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x001B25A0);
  101142. +
  101143. + // 3. issue 3-wire command that RF set to power down.
  101144. + PHY_SetRFReg(Adapter,RF_PATH_A, 0, bRFRegOffsetMask,0);
  101145. + if (pHalData->rf_type == RF_2T2R)
  101146. + {
  101147. + PHY_SetRFReg(Adapter,RF_PATH_B, 0, bRFRegOffsetMask,0);
  101148. + }
  101149. +
  101150. + // 4. Force PFM , disable SPS18_LDO_Marco_Block
  101151. + rtw_write8(Adapter, REG_SPS0_CTRL, value8);
  101152. +
  101153. + // 5. gated MAC Clock
  101154. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3)));
  101155. + }
  101156. + else // Level 2 or others.
  101157. + {
  101158. + //RT_TRACE(COMP_POWER, DBG_LOUD, ("SS LVL2\n"));
  101159. + {
  101160. + u8 eRFPath = RF_PATH_A,value8 = 0;
  101161. + rtw_write8(Adapter, REG_TXPAUSE, 0xFF);
  101162. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0);
  101163. + // 2010/08/12 MH Add for B path under SS test.
  101164. + //if (pHalData->RF_Type == RF_2T2R)
  101165. + //PHY_SetRFReg(Adapter, RF_PATH_B, 0x0, bMaskByte0, 0x0);
  101166. +
  101167. + value8 |= APSDOFF;
  101168. + rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40
  101169. +
  101170. + // After switch APSD, we need to delay for stability
  101171. + rtw_mdelay_os(10);
  101172. + //before BB reset should do clock gated
  101173. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|(BIT31));
  101174. + // Set BB reset at first
  101175. + value8 = 0 ;
  101176. + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn);
  101177. + rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16
  101178. + }
  101179. +
  101180. + // Disable RF and BB only for SelectSuspend.
  101181. +
  101182. + // 1. Set BB/RF to shutdown.
  101183. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving
  101184. + // (2)Reg878[21:19]= 0 //Turn off RF-B
  101185. + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection
  101186. + // (4) Reg800[1] = 1 // enable preamble power saving
  101187. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord);
  101188. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord);
  101189. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord);
  101190. + if (pHalData->rf_type == RF_2T2R)
  101191. + {
  101192. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0);
  101193. + }
  101194. + else if (pHalData->rf_type == RF_1T1R)
  101195. + {
  101196. + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 0);
  101197. + }
  101198. + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
  101199. + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1);
  101200. +
  101201. + // 2 .AFE control register to power down. bit[30:22]
  101202. + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord);
  101203. + if (pHalData->rf_type == RF_2T2R)
  101204. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0);
  101205. + else if (pHalData->rf_type == RF_1T1R)
  101206. + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x001B25A0);
  101207. +
  101208. + // 3. issue 3-wire command that RF set to power down.
  101209. + PHY_SetRFReg(Adapter,RF_PATH_A, 0, bRFRegOffsetMask,0);
  101210. + if (pHalData->rf_type == RF_2T2R)
  101211. + {
  101212. + PHY_SetRFReg(Adapter,RF_PATH_B, 0, bRFRegOffsetMask,0);
  101213. + }
  101214. +
  101215. + // 4. Force PFM , disable SPS18_LDO_Marco_Block
  101216. + rtw_write8(Adapter, REG_SPS0_CTRL, value8);
  101217. +
  101218. + // 2010/10/13 MH/Isaachsu exchange sequence.
  101219. + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL
  101220. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80);
  101221. + rtw_mdelay_os(1);
  101222. +
  101223. + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK
  101224. + rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0xA80F);
  101225. +
  101226. + // 5. gated MAC Clock
  101227. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3)));
  101228. + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)& ~(BIT3))
  101229. +
  101230. + //CardSelectiveSuspendEnter(Adapter);
  101231. + }
  101232. +
  101233. + break;
  101234. +
  101235. + default:
  101236. + break;
  101237. + }
  101238. +
  101239. +} // phy_PowerSwitch92CU
  101240. +
  101241. +void _ps_open_RF(_adapter *padapter) {
  101242. + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified
  101243. + phy_SsPwrSwitch92CU(padapter, rf_on, 1);
  101244. +}
  101245. +
  101246. +void _ps_close_RF(_adapter *padapter){
  101247. + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified
  101248. + phy_SsPwrSwitch92CU(padapter, rf_off, 1);
  101249. +}
  101250. +#endif //SYNC_SD7_20110802_phy_SsPwrSwitch92CU
  101251. +
  101252. +
  101253. +
  101254. +static VOID
  101255. +_DisableGPIO(
  101256. + IN PADAPTER Adapter
  101257. + )
  101258. +{
  101259. +/***************************************
  101260. +j. GPIO_PIN_CTRL 0x44[31:0]=0x000 //
  101261. +k. Value = GPIO_PIN_CTRL[7:0]
  101262. +l. GPIO_PIN_CTRL 0x44[31:0] = 0x00FF0000 | (value <<8); //write external PIN level
  101263. +m. GPIO_MUXCFG 0x42 [15:0] = 0x0780
  101264. +n. LEDCFG 0x4C[15:0] = 0x8080
  101265. +***************************************/
  101266. + u8 value8;
  101267. + u16 value16;
  101268. + u32 value32;
  101269. +
  101270. + //1. Disable GPIO[7:0]
  101271. + rtw_write16(Adapter, REG_GPIO_PIN_CTRL+2, 0x0000);
  101272. + value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL) & 0xFFFF00FF;
  101273. + value8 = (u8) (value32&0x000000FF);
  101274. + value32 |= ((value8<<8) | 0x00FF0000);
  101275. + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, value32);
  101276. +
  101277. + //2. Disable GPIO[10:8]
  101278. + rtw_write8(Adapter, REG_GPIO_MUXCFG+3, 0x00);
  101279. + value16 = rtw_read16(Adapter, REG_GPIO_MUXCFG+2) & 0xFF0F;
  101280. + value8 = (u8) (value16&0x000F);
  101281. + value16 |= ((value8<<4) | 0x0780);
  101282. + rtw_write16(Adapter, REG_GPIO_MUXCFG+2, value16);
  101283. +
  101284. + //3. Disable LED0 & 1
  101285. + rtw_write16(Adapter, REG_LEDCFG0, 0x8080);
  101286. +
  101287. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n"));
  101288. +
  101289. +} //end of _DisableGPIO()
  101290. +
  101291. +static VOID
  101292. +_ResetFWDownloadRegister(
  101293. + IN PADAPTER Adapter
  101294. + )
  101295. +{
  101296. + u32 value32;
  101297. +
  101298. + value32 = rtw_read32(Adapter, REG_MCUFWDL);
  101299. + value32 &= ~(MCUFWDL_EN | MCUFWDL_RDY);
  101300. + rtw_write32(Adapter, REG_MCUFWDL, value32);
  101301. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset FW download register.\n"));
  101302. +}
  101303. +
  101304. +
  101305. +static int
  101306. +_DisableRF_AFE(
  101307. + IN PADAPTER Adapter
  101308. + )
  101309. +{
  101310. + int rtStatus = _SUCCESS;
  101311. + u32 pollingCount = 0;
  101312. + u8 value8;
  101313. +
  101314. + //disable RF/ AFE AD/DA
  101315. + value8 = APSDOFF;
  101316. + rtw_write8(Adapter, REG_APSD_CTRL, value8);
  101317. +
  101318. +
  101319. +#if (RTL8192CU_ASIC_VERIFICATION)
  101320. +
  101321. + do
  101322. + {
  101323. + if(rtw_read8(Adapter, REG_APSD_CTRL) & APSDOFF_STATUS){
  101324. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE, AD, DA Done!\n"));
  101325. + break;
  101326. + }
  101327. +
  101328. + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){
  101329. + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Failed to polling APSDOFF_STATUS done!\n"));
  101330. + return _FAIL;
  101331. + }
  101332. +
  101333. + }while(_TRUE);
  101334. +
  101335. +#endif
  101336. +
  101337. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE,AD, DA.\n"));
  101338. + return rtStatus;
  101339. +
  101340. +}
  101341. +
  101342. +static VOID
  101343. +_ResetBB(
  101344. + IN PADAPTER Adapter
  101345. + )
  101346. +{
  101347. + u16 value16;
  101348. +
  101349. + //before BB reset should do clock gated
  101350. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|(BIT31));
  101351. + //reset BB
  101352. + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
  101353. + value16 &= ~(FEN_BBRSTB | FEN_BB_GLB_RSTn);
  101354. + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16);
  101355. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset BB.\n"));
  101356. +}
  101357. +
  101358. +static VOID
  101359. +_ResetMCU(
  101360. + IN PADAPTER Adapter
  101361. + )
  101362. +{
  101363. + u16 value16;
  101364. +
  101365. + // reset MCU
  101366. + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
  101367. + value16 &= ~FEN_CPUEN;
  101368. + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16);
  101369. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset MCU.\n"));
  101370. +}
  101371. +
  101372. +static VOID
  101373. +_DisableMAC_AFE_PLL(
  101374. + IN PADAPTER Adapter
  101375. + )
  101376. +{
  101377. + u32 value32;
  101378. +
  101379. + //disable MAC/ AFE PLL
  101380. + value32 = rtw_read32(Adapter, REG_APS_FSMCO);
  101381. + value32 |= APDM_MAC;
  101382. + rtw_write32(Adapter, REG_APS_FSMCO, value32);
  101383. +
  101384. + value32 |= APFM_OFF;
  101385. + rtw_write32(Adapter, REG_APS_FSMCO, value32);
  101386. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable MAC, AFE PLL.\n"));
  101387. +}
  101388. +
  101389. +static VOID
  101390. +_AutoPowerDownToHostOff(
  101391. + IN PADAPTER Adapter
  101392. + )
  101393. +{
  101394. + u32 value32;
  101395. + rtw_write8(Adapter, REG_SPS0_CTRL, 0x22);
  101396. +
  101397. + value32 = rtw_read32(Adapter, REG_APS_FSMCO);
  101398. +
  101399. + value32 |= APDM_HOST;//card disable
  101400. + rtw_write32(Adapter, REG_APS_FSMCO, value32);
  101401. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Auto Power Down to Host-off state.\n"));
  101402. +
  101403. + // set USB suspend
  101404. + value32 = rtw_read32(Adapter, REG_APS_FSMCO);
  101405. + value32 &= ~AFSM_PCIE;
  101406. + rtw_write32(Adapter, REG_APS_FSMCO, value32);
  101407. +
  101408. +}
  101409. +
  101410. +static VOID
  101411. +_SetUsbSuspend(
  101412. + IN PADAPTER Adapter
  101413. + )
  101414. +{
  101415. + u32 value32;
  101416. +
  101417. + value32 = rtw_read32(Adapter, REG_APS_FSMCO);
  101418. +
  101419. + // set USB suspend
  101420. + value32 |= AFSM_HSUS;
  101421. + rtw_write32(Adapter, REG_APS_FSMCO, value32);
  101422. +
  101423. + //RT_ASSERT(0 == (rtw_read32(Adapter, REG_APS_FSMCO) & BIT(12)),(""));
  101424. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Set USB suspend.\n"));
  101425. +
  101426. +}
  101427. +
  101428. +static VOID
  101429. +_DisableRFAFEAndResetBB(
  101430. + IN PADAPTER Adapter
  101431. + )
  101432. +{
  101433. +/**************************************
  101434. +a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue
  101435. +b. RF path 0 offset 0x00 = 0x00 // disable RF
  101436. +c. APSD_CTRL 0x600[7:0] = 0x40
  101437. +d. SYS_FUNC_EN 0x02[7:0] = 0x16 //reset BB state machine
  101438. +e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine
  101439. +***************************************/
  101440. + u8 eRFPath = 0,value8 = 0;
  101441. + rtw_write8(Adapter, REG_TXPAUSE, 0xFF);
  101442. + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0);
  101443. +
  101444. + value8 |= APSDOFF;
  101445. + rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40
  101446. + //before BB reset should do clock gated
  101447. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|(BIT31));
  101448. + value8 = 0 ;
  101449. + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn);
  101450. + rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16
  101451. +
  101452. + value8 &=( ~FEN_BB_GLB_RSTn );
  101453. + rtw_write8(Adapter, REG_SYS_FUNC_EN, value8); //0x14
  101454. +
  101455. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> RF off and reset BB.\n"));
  101456. +}
  101457. +
  101458. +static VOID
  101459. +_ResetDigitalProcedure1(
  101460. + IN PADAPTER Adapter,
  101461. + IN BOOLEAN bWithoutHWSM
  101462. + )
  101463. +{
  101464. +
  101465. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  101466. +
  101467. + if(pHalData->FirmwareVersion <= 0x20){
  101468. + #if 0
  101469. + /*****************************
  101470. + f. SYS_FUNC_EN 0x03[7:0]=0x54 // reset MAC register, DCORE
  101471. + g. MCUFWDL 0x80[7:0]=0 // reset MCU ready status
  101472. + ******************************/
  101473. + u4Byte value32 = 0;
  101474. + PlatformIOWrite1Byte(Adapter, REG_SYS_FUNC_EN+1, 0x54);
  101475. + PlatformIOWrite1Byte(Adapter, REG_MCUFWDL, 0);
  101476. + #else
  101477. + /*****************************
  101478. + f. MCUFWDL 0x80[7:0]=0 // reset MCU ready status
  101479. + g. SYS_FUNC_EN 0x02[10]= 0 // reset MCU register, (8051 reset)
  101480. + h. SYS_FUNC_EN 0x02[15-12]= 5 // reset MAC register, DCORE
  101481. + i. SYS_FUNC_EN 0x02[10]= 1 // enable MCU register, (8051 enable)
  101482. + ******************************/
  101483. + u16 valu16 = 0;
  101484. + rtw_write8(Adapter, REG_MCUFWDL, 0);
  101485. +
  101486. + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
  101487. + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 & (~FEN_CPUEN)));//reset MCU ,8051
  101488. +
  101489. + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN)&0x0FFF;
  101490. + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 |(FEN_HWPDN|FEN_ELDR)));//reset MAC
  101491. +
  101492. + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
  101493. + {
  101494. + u8 val;
  101495. + if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
  101496. + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
  101497. + }
  101498. + #endif
  101499. +
  101500. +
  101501. + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
  101502. + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 | FEN_CPUEN));//enable MCU ,8051
  101503. +
  101504. +
  101505. + #endif
  101506. + }
  101507. + else{
  101508. + u8 retry_cnts = 0;
  101509. +
  101510. + if(rtw_read8(Adapter, REG_MCUFWDL) & BIT1)
  101511. + { //IF fw in RAM code, do reset
  101512. +
  101513. + rtw_write8(Adapter, REG_MCUFWDL, 0);
  101514. + if(Adapter->bFWReady){
  101515. + // 2010/08/25 MH Accordign to RD alfred's suggestion, we need to disable other
  101516. + // HRCV INT to influence 8051 reset.
  101517. + rtw_write8(Adapter, REG_FWIMR, 0x20);
  101518. +
  101519. + rtw_write8(Adapter, REG_HMETFR+3, 0x20);//8051 reset by self
  101520. +
  101521. + while( (retry_cnts++ <100) && (FEN_CPUEN &rtw_read16(Adapter, REG_SYS_FUNC_EN)))
  101522. + {
  101523. + rtw_udelay_os(50);//PlatformStallExecution(50);//us
  101524. + }
  101525. +
  101526. + if(retry_cnts >= 100){
  101527. + DBG_8192C("%s #####=> 8051 reset failed!.........................\n", __FUNCTION__);
  101528. + // if 8051 reset fail we trigger GPIO 0 for LA
  101529. + //PlatformEFIOWrite4Byte( Adapter,
  101530. + // REG_GPIO_PIN_CTRL,
  101531. + // 0x00010100);
  101532. + // 2010/08/31 MH According to Filen's info, if 8051 reset fail, reset MAC directly.
  101533. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051
  101534. + rtw_mdelay_os(10);
  101535. + }
  101536. + else {
  101537. + //DBG_871X("%s =====> 8051 reset success (%d) .\n", __FUNCTION__, retry_cnts);
  101538. + }
  101539. + }
  101540. + else {
  101541. + DBG_871X("%s =====> 8051 in RAM but !Adapter->bFWReady\n", __FUNCTION__);
  101542. + }
  101543. + }
  101544. + else{
  101545. + //DBG_871X("%s =====> 8051 in ROM.\n", __FUNCTION__);
  101546. + }
  101547. +
  101548. + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
  101549. + {
  101550. + u8 val;
  101551. + if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
  101552. + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
  101553. + }
  101554. + #endif
  101555. +
  101556. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x54); //Reset MAC and Enable 8051
  101557. + }
  101558. +
  101559. + // Clear rpwm value for initial toggle bit trigger.
  101560. + rtw_write8(Adapter, REG_USB_HRPWM, 0x00);
  101561. +
  101562. + if(bWithoutHWSM){
  101563. + /*****************************
  101564. + Without HW auto state machine
  101565. + g. SYS_CLKR 0x08[15:0] = 0x30A3 //disable MAC clock
  101566. + h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL
  101567. + i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK
  101568. + j. SYS_ISO_CTRL 0x00[7:0] = 0xF9 // isolated digital to PON
  101569. + ******************************/
  101570. + //rtw_write16(Adapter, REG_SYS_CLKR, 0x30A3);
  101571. + rtw_write16(Adapter, REG_SYS_CLKR, 0x70A3);//modify to 0x70A3 by Scott.
  101572. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80);
  101573. + rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x880F);
  101574. + rtw_write8(Adapter, REG_SYS_ISO_CTRL, 0xF9);
  101575. + }
  101576. + else
  101577. + {
  101578. + // Disable all RF/BB power
  101579. + rtw_write8(Adapter, REG_RF_CTRL, 0x00);
  101580. + }
  101581. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Reset Digital.\n"));
  101582. +
  101583. +}
  101584. +
  101585. +static VOID
  101586. +_ResetDigitalProcedure2(
  101587. + IN PADAPTER Adapter
  101588. +)
  101589. +{
  101590. +/*****************************
  101591. +k. SYS_FUNC_EN 0x03[7:0] = 0x44 // disable ELDR runction
  101592. +l. SYS_CLKR 0x08[15:0] = 0x3083 // disable ELDR clock
  101593. +m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON
  101594. +******************************/
  101595. + //rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x44);//marked by Scott.
  101596. + //rtw_write16(Adapter, REG_SYS_CLKR, 0x3083);
  101597. + //rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x83);
  101598. +
  101599. + rtw_write16(Adapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott.
  101600. + rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott.
  101601. +}
  101602. +
  101603. +static VOID
  101604. +_DisableAnalog(
  101605. + IN PADAPTER Adapter,
  101606. + IN BOOLEAN bWithoutHWSM
  101607. + )
  101608. +{
  101609. + u16 value16 = 0;
  101610. + u8 value8=0;
  101611. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  101612. +
  101613. + if(bWithoutHWSM){
  101614. + /*****************************
  101615. + n. LDOA15_CTRL 0x20[7:0] = 0x04 // disable A15 power
  101616. + o. LDOV12D_CTRL 0x21[7:0] = 0x54 // disable digital core power
  101617. + r. When driver call disable, the ASIC will turn off remaining clock automatically
  101618. + ******************************/
  101619. +
  101620. + rtw_write8(Adapter, REG_LDOA15_CTRL, 0x04);
  101621. + //PlatformIOWrite1Byte(Adapter, REG_LDOV12D_CTRL, 0x54);
  101622. +
  101623. + value8 = rtw_read8(Adapter, REG_LDOV12D_CTRL);
  101624. + value8 &= (~LDV12_EN);
  101625. + rtw_write8(Adapter, REG_LDOV12D_CTRL, value8);
  101626. + //RT_TRACE(COMP_INIT, DBG_LOUD, (" REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8));
  101627. + }
  101628. +
  101629. +/*****************************
  101630. +h. SPS0_CTRL 0x11[7:0] = 0x23 //enter PFM mode
  101631. +i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend
  101632. +******************************/
  101633. +
  101634. +
  101635. + value8 = 0x23;
  101636. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
  101637. + value8 |= BIT3;
  101638. +
  101639. + rtw_write8(Adapter, REG_SPS0_CTRL, value8);
  101640. +
  101641. +
  101642. + if(bWithoutHWSM)
  101643. + {
  101644. + //value16 |= (APDM_HOST | /*AFSM_HSUS |*/PFM_ALDN);
  101645. + // 2010/08/31 According to Filen description, we need to use HW to shut down 8051 automatically.
  101646. + // Becasue suspend operatione need the asistance of 8051 to wait for 3ms.
  101647. + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN);
  101648. + }
  101649. + else
  101650. + {
  101651. + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN);
  101652. + }
  101653. +
  101654. + rtw_write16(Adapter, REG_APS_FSMCO,value16 );//0x4802
  101655. +
  101656. + rtw_write8(Adapter, REG_RSV_CTRL, 0x0e);
  101657. +
  101658. + #if 0
  101659. + //tynli_test for suspend mode.
  101660. + if(!bWithoutHWSM){
  101661. + rtw_write8(Adapter, 0xfe10, 0x19);
  101662. + }
  101663. +#endif
  101664. +
  101665. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable Analog Reg0x04:0x%04x.\n",value16));
  101666. +}
  101667. +
  101668. +static int
  101669. +CardDisableHWSM( // HW Auto state machine
  101670. + IN PADAPTER Adapter,
  101671. + IN BOOLEAN resetMCU
  101672. + )
  101673. +{
  101674. + int rtStatus = _SUCCESS;
  101675. + if(Adapter->bSurpriseRemoved){
  101676. + return rtStatus;
  101677. + }
  101678. +#if 1
  101679. + //==== RF Off Sequence ====
  101680. + _DisableRFAFEAndResetBB(Adapter);
  101681. +
  101682. + // ==== Reset digital sequence ======
  101683. + _ResetDigitalProcedure1(Adapter, _FALSE);
  101684. +
  101685. + // ==== Pull GPIO PIN to balance level and LED control ======
  101686. + _DisableGPIO(Adapter);
  101687. +
  101688. + // ==== Disable analog sequence ===
  101689. + _DisableAnalog(Adapter, _FALSE);
  101690. +
  101691. + RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("======> Card disable finished.\n"));
  101692. +#else
  101693. + _DisableGPIO(Adapter);
  101694. +
  101695. + //reset FW download register
  101696. + _ResetFWDownloadRegister(Adapter);
  101697. +
  101698. +
  101699. + //disable RF/ AFE AD/DA
  101700. + rtStatus = _DisableRF_AFE(Adapter);
  101701. + if(RT_STATUS_SUCCESS != rtStatus){
  101702. + RT_TRACE(COMP_INIT, DBG_SERIOUS, ("_DisableRF_AFE failed!\n"));
  101703. + goto Exit;
  101704. + }
  101705. + _ResetBB(Adapter);
  101706. +
  101707. + if(resetMCU){
  101708. + _ResetMCU(Adapter);
  101709. + }
  101710. +
  101711. + _AutoPowerDownToHostOff(Adapter);
  101712. + //_DisableMAC_AFE_PLL(Adapter);
  101713. +
  101714. + _SetUsbSuspend(Adapter);
  101715. +Exit:
  101716. +#endif
  101717. + return rtStatus;
  101718. +
  101719. +}
  101720. +
  101721. +static int
  101722. +CardDisableWithoutHWSM( // without HW Auto state machine
  101723. + IN PADAPTER Adapter
  101724. + )
  101725. +{
  101726. + int rtStatus = _SUCCESS;
  101727. +
  101728. + if(Adapter->bSurpriseRemoved){
  101729. + return rtStatus;
  101730. + }
  101731. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Card Disable Without HWSM .\n"));
  101732. + //==== RF Off Sequence ====
  101733. + _DisableRFAFEAndResetBB(Adapter);
  101734. +
  101735. + // ==== Reset digital sequence ======
  101736. + _ResetDigitalProcedure1(Adapter, _TRUE);
  101737. +
  101738. + // ==== Pull GPIO PIN to balance level and LED control ======
  101739. + _DisableGPIO(Adapter);
  101740. +
  101741. + // ==== Reset digital sequence ======
  101742. + _ResetDigitalProcedure2(Adapter);
  101743. +
  101744. + // ==== Disable analog sequence ===
  101745. + _DisableAnalog(Adapter, _TRUE);
  101746. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== Card Disable Without HWSM .\n"));
  101747. + return rtStatus;
  101748. +}
  101749. +
  101750. +static void rtl8192cu_hw_power_down(_adapter *padapter)
  101751. +{
  101752. + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c.
  101753. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1.
  101754. +
  101755. + // Enable register area 0x0-0xc.
  101756. + rtw_write8(padapter,REG_RSV_CTRL, 0x0);
  101757. + rtw_write16(padapter, REG_APS_FSMCO, 0x8812);
  101758. +}
  101759. +
  101760. +u32 rtl8192cu_hal_deinit(PADAPTER Adapter)
  101761. + {
  101762. +
  101763. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  101764. + DBG_8192C("==> %s \n",__FUNCTION__);
  101765. + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in
  101766. + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all
  101767. + // IC. Accord to johnny's opinion, only RU need the support.
  101768. + if (IS_HARDWARE_TYPE_8192C(Adapter) && (pHalData->BoardType == BOARD_USB_High_PA))
  101769. + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|BIT1);
  101770. +
  101771. + #ifdef SUPPORT_HW_RFOFF_DETECTED
  101772. + DBG_8192C("bkeepfwalive(%x)\n",Adapter->pwrctrlpriv.bkeepfwalive);
  101773. + if(Adapter->pwrctrlpriv.bkeepfwalive)
  101774. + {
  101775. + _ps_close_RF(Adapter);
  101776. + if((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown))
  101777. + rtl8192cu_hw_power_down(Adapter);
  101778. + }
  101779. + else
  101780. +#endif
  101781. + {
  101782. + if( Adapter->bCardDisableWOHSM == _FALSE)
  101783. + {
  101784. + DBG_8192C("card disble HWSM...........\n");
  101785. + CardDisableHWSM(Adapter, _FALSE);
  101786. + }
  101787. + else
  101788. + {
  101789. + DBG_8192C("card disble without HWSM...........\n");
  101790. + CardDisableWithoutHWSM(Adapter); // without HW Auto state machine
  101791. +
  101792. + if((Adapter->pwrctrlpriv.bHWPwrPindetect ) && (Adapter->pwrctrlpriv.bHWPowerdown))
  101793. + rtl8192cu_hw_power_down(Adapter);
  101794. + }
  101795. + }
  101796. +
  101797. + return _SUCCESS;
  101798. + }
  101799. +
  101800. +
  101801. +unsigned int rtl8192cu_inirp_init(PADAPTER Adapter)
  101802. +{
  101803. + u8 i;
  101804. + struct recv_buf *precvbuf;
  101805. + uint status;
  101806. + struct dvobj_priv *pdev = adapter_to_dvobj(Adapter);
  101807. + struct intf_hdl * pintfhdl=&Adapter->iopriv.intf;
  101808. + struct recv_priv *precvpriv = &(Adapter->recvpriv);
  101809. + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  101810. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  101811. + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
  101812. +#endif
  101813. +
  101814. +_func_enter_;
  101815. +
  101816. + _read_port = pintfhdl->io_ops._read_port;
  101817. +
  101818. + status = _SUCCESS;
  101819. +
  101820. + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("===> usb_inirp_init \n"));
  101821. +
  101822. + precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR;
  101823. +
  101824. + //issue Rx irp to receive data
  101825. + precvbuf = (struct recv_buf *)precvpriv->precv_buf;
  101826. + for(i=0; i<NR_RECVBUFF; i++)
  101827. + {
  101828. + if(_read_port(pintfhdl, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE )
  101829. + {
  101830. + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_port error \n"));
  101831. + status = _FAIL;
  101832. + goto exit;
  101833. + }
  101834. +
  101835. + precvbuf++;
  101836. + precvpriv->free_recv_buf_queue_cnt--;
  101837. + }
  101838. +
  101839. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  101840. + _read_interrupt = pintfhdl->io_ops._read_interrupt;
  101841. + if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE )
  101842. + {
  101843. + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_interrupt error \n"));
  101844. + status = _FAIL;
  101845. + }
  101846. +#endif
  101847. +
  101848. +exit:
  101849. +
  101850. + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("<=== usb_inirp_init \n"));
  101851. +
  101852. +_func_exit_;
  101853. +
  101854. + return status;
  101855. +
  101856. +}
  101857. +
  101858. +unsigned int rtl8192cu_inirp_deinit(PADAPTER Adapter)
  101859. +{
  101860. + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n ===> usb_rx_deinit \n"));
  101861. +
  101862. + rtw_read_port_cancel(Adapter);
  101863. +
  101864. + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n <=== usb_rx_deinit \n"));
  101865. +
  101866. + return _SUCCESS;
  101867. +}
  101868. +
  101869. +
  101870. +//-------------------------------------------------------------------------
  101871. +//
  101872. +// EEPROM Power index mapping
  101873. +//
  101874. +//-------------------------------------------------------------------------
  101875. +
  101876. + static VOID
  101877. +_ReadPowerValueFromPROM(
  101878. + IN PTxPowerInfo pwrInfo,
  101879. + IN u8* PROMContent,
  101880. + IN BOOLEAN AutoLoadFail
  101881. + )
  101882. +{
  101883. + u32 rfPath, eeAddr, group;
  101884. +
  101885. + _rtw_memset(pwrInfo, 0, sizeof(TxPowerInfo));
  101886. +
  101887. + if(AutoLoadFail){
  101888. + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){
  101889. + for(rfPath = 0 ; rfPath < RF_PATH_MAX ; rfPath++){
  101890. + pwrInfo->CCKIndex[rfPath][group] = EEPROM_Default_TxPowerLevel;
  101891. + pwrInfo->HT40_1SIndex[rfPath][group] = EEPROM_Default_TxPowerLevel;
  101892. + pwrInfo->HT40_2SIndexDiff[rfPath][group]= EEPROM_Default_HT40_2SDiff;
  101893. + pwrInfo->HT20IndexDiff[rfPath][group] = EEPROM_Default_HT20_Diff;
  101894. + pwrInfo->OFDMIndexDiff[rfPath][group] = EEPROM_Default_LegacyHTTxPowerDiff;
  101895. + pwrInfo->HT40MaxOffset[rfPath][group] = EEPROM_Default_HT40_PwrMaxOffset;
  101896. + pwrInfo->HT20MaxOffset[rfPath][group] = EEPROM_Default_HT20_PwrMaxOffset;
  101897. + }
  101898. + }
  101899. +
  101900. + pwrInfo->TSSI_A = EEPROM_Default_TSSI;
  101901. + pwrInfo->TSSI_B = EEPROM_Default_TSSI;
  101902. +
  101903. + return;
  101904. + }
  101905. +
  101906. + for(rfPath = 0 ; rfPath < RF_PATH_MAX ; rfPath++){
  101907. + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){
  101908. + eeAddr = EEPROM_CCK_TX_PWR_INX + (rfPath * 3) + group;
  101909. + pwrInfo->CCKIndex[rfPath][group] = PROMContent[eeAddr];
  101910. +
  101911. + eeAddr = EEPROM_HT40_1S_TX_PWR_INX + (rfPath * 3) + group;
  101912. + pwrInfo->HT40_1SIndex[rfPath][group] = PROMContent[eeAddr];
  101913. + }
  101914. + }
  101915. +
  101916. + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){
  101917. + for(rfPath = 0 ; rfPath < RF_PATH_MAX ; rfPath++){
  101918. + pwrInfo->HT40_2SIndexDiff[rfPath][group] =
  101919. + (PROMContent[EEPROM_HT40_2S_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF;
  101920. +
  101921. +#if 1
  101922. + pwrInfo->HT20IndexDiff[rfPath][group] =
  101923. + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF;
  101924. + if(pwrInfo->HT20IndexDiff[rfPath][group] & BIT3) //4bit sign number to 8 bit sign number
  101925. + pwrInfo->HT20IndexDiff[rfPath][group] |= 0xF0;
  101926. +#else
  101927. + pwrInfo->HT20IndexDiff[rfPath][group] =
  101928. + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF;
  101929. +#endif
  101930. +
  101931. + pwrInfo->OFDMIndexDiff[rfPath][group] =
  101932. + (PROMContent[EEPROM_OFDM_TX_PWR_INX_DIFF+ group] >> (rfPath * 4)) & 0xF;
  101933. +
  101934. + pwrInfo->HT40MaxOffset[rfPath][group] =
  101935. + (PROMContent[EEPROM_HT40_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF;
  101936. +
  101937. + pwrInfo->HT20MaxOffset[rfPath][group] =
  101938. + (PROMContent[EEPROM_HT20_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF;
  101939. + }
  101940. + }
  101941. +
  101942. + pwrInfo->TSSI_A = PROMContent[EEPROM_TSSI_A];
  101943. + pwrInfo->TSSI_B = PROMContent[EEPROM_TSSI_B];
  101944. +
  101945. +}
  101946. +
  101947. +
  101948. +static u32
  101949. +_GetChannelGroup(
  101950. + IN u32 channel
  101951. + )
  101952. +{
  101953. + //RT_ASSERT((channel < 14), ("Channel %d no is supported!\n"));
  101954. +
  101955. + if(channel < 3){ // Channel 1~3
  101956. + return 0;
  101957. + }
  101958. + else if(channel < 9){ // Channel 4~9
  101959. + return 1;
  101960. + }
  101961. +
  101962. + return 2; // Channel 10~14
  101963. +}
  101964. +
  101965. +
  101966. +static VOID
  101967. +ReadTxPowerInfo(
  101968. + IN PADAPTER Adapter,
  101969. + IN u8* PROMContent,
  101970. + IN BOOLEAN AutoLoadFail
  101971. + )
  101972. +{
  101973. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  101974. + TxPowerInfo pwrInfo;
  101975. + u32 rfPath, ch, group;
  101976. + u8 pwr, diff;
  101977. +
  101978. + _ReadPowerValueFromPROM(&pwrInfo, PROMContent, AutoLoadFail);
  101979. +
  101980. + if(!AutoLoadFail)
  101981. + pHalData->bTXPowerDataReadFromEEPORM = _TRUE;
  101982. +
  101983. + for(rfPath = 0 ; rfPath < RF_PATH_MAX ; rfPath++){
  101984. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  101985. + group = _GetChannelGroup(ch);
  101986. +
  101987. + pHalData->TxPwrLevelCck[rfPath][ch] = pwrInfo.CCKIndex[rfPath][group];
  101988. + pHalData->TxPwrLevelHT40_1S[rfPath][ch] = pwrInfo.HT40_1SIndex[rfPath][group];
  101989. +
  101990. + pHalData->TxPwrHt20Diff[rfPath][ch] = pwrInfo.HT20IndexDiff[rfPath][group];
  101991. + pHalData->TxPwrLegacyHtDiff[rfPath][ch] = pwrInfo.OFDMIndexDiff[rfPath][group];
  101992. + pHalData->PwrGroupHT20[rfPath][ch] = pwrInfo.HT20MaxOffset[rfPath][group];
  101993. + pHalData->PwrGroupHT40[rfPath][ch] = pwrInfo.HT40MaxOffset[rfPath][group];
  101994. +
  101995. + pwr = pwrInfo.HT40_1SIndex[rfPath][group];
  101996. + diff = pwrInfo.HT40_2SIndexDiff[rfPath][group];
  101997. +
  101998. + pHalData->TxPwrLevelHT40_2S[rfPath][ch] = (pwr > diff) ? (pwr - diff) : 0;
  101999. + }
  102000. + }
  102001. +
  102002. +#if DBG
  102003. +
  102004. + for(rfPath = 0 ; rfPath < RF_PATH_MAX ; rfPath++){
  102005. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  102006. + RTPRINT(FINIT, INIT_TxPower,
  102007. + ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
  102008. + rfPath, ch, pHalData->TxPwrLevelCck[rfPath][ch],
  102009. + pHalData->TxPwrLevelHT40_1S[rfPath][ch],
  102010. + pHalData->TxPwrLevelHT40_2S[rfPath][ch]));
  102011. +
  102012. + }
  102013. + }
  102014. +
  102015. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  102016. + RTPRINT(FINIT, INIT_TxPower, ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF_PATH_A][ch]));
  102017. + }
  102018. +
  102019. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  102020. + RTPRINT(FINIT, INIT_TxPower, ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF_PATH_A][ch]));
  102021. + }
  102022. +
  102023. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  102024. + RTPRINT(FINIT, INIT_TxPower, ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF_PATH_B][ch]));
  102025. + }
  102026. +
  102027. + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){
  102028. + RTPRINT(FINIT, INIT_TxPower, ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF_PATH_B][ch]));
  102029. + }
  102030. +
  102031. +#endif
  102032. + // 2010/10/19 MH Add Regulator recognize for CU.
  102033. + if(!AutoLoadFail)
  102034. + {
  102035. + pHalData->EEPROMRegulatory = (PROMContent[RF_OPTION1]&0x7); //bit0~2
  102036. + }
  102037. + else
  102038. + {
  102039. + pHalData->EEPROMRegulatory = 0;
  102040. + }
  102041. + DBG_8192C("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory);
  102042. +
  102043. +}
  102044. +
  102045. +
  102046. +//-------------------------------------------------------------------
  102047. +//
  102048. +// EEPROM/EFUSE Content Parsing
  102049. +//
  102050. +//-------------------------------------------------------------------
  102051. +static void
  102052. +_ReadIDs(
  102053. + IN PADAPTER Adapter,
  102054. + IN u8* PROMContent,
  102055. + IN BOOLEAN AutoloadFail
  102056. + )
  102057. +{
  102058. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102059. +
  102060. + if(_FALSE == AutoloadFail){
  102061. + // VID, PID
  102062. + pHalData->EEPROMVID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_VID]);
  102063. + pHalData->EEPROMPID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_PID]);
  102064. +
  102065. + // Customer ID, 0x00 and 0xff are reserved for Realtek.
  102066. + pHalData->EEPROMCustomerID = *(u8 *)&PROMContent[EEPROM_CUSTOMER_ID];
  102067. + pHalData->EEPROMSubCustomerID = *(u8 *)&PROMContent[EEPROM_SUBCUSTOMER_ID];
  102068. +
  102069. + }
  102070. + else{
  102071. + pHalData->EEPROMVID = EEPROM_Default_VID;
  102072. + pHalData->EEPROMPID = EEPROM_Default_PID;
  102073. +
  102074. + // Customer ID, 0x00 and 0xff are reserved for Realtek.
  102075. + pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID;
  102076. + pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID;
  102077. +
  102078. + }
  102079. +
  102080. + // For customized behavior.
  102081. + if((pHalData->EEPROMVID == 0x103C) && (pHalData->EEPROMVID == 0x1629))// HP Lite-On for RTL8188CUS Slim Combo.
  102082. + pHalData->CustomerID = RT_CID_819x_HP;
  102083. +
  102084. + // Decide CustomerID according to VID/DID or EEPROM
  102085. + switch(pHalData->EEPROMCustomerID)
  102086. + {
  102087. + case EEPROM_CID_DEFAULT:
  102088. + if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308))
  102089. + pHalData->CustomerID = RT_CID_DLINK;
  102090. + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309))
  102091. + pHalData->CustomerID = RT_CID_DLINK;
  102092. + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a))
  102093. + pHalData->CustomerID = RT_CID_DLINK;
  102094. + break;
  102095. + case EEPROM_CID_WHQL:
  102096. +/*
  102097. + Adapter->bInHctTest = TRUE;
  102098. +
  102099. + pMgntInfo->bSupportTurboMode = FALSE;
  102100. + pMgntInfo->bAutoTurboBy8186 = FALSE;
  102101. +
  102102. + pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
  102103. + pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
  102104. + pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
  102105. +
  102106. + pMgntInfo->keepAliveLevel = 0;
  102107. +
  102108. + Adapter->bUnloadDriverwhenS3S4 = FALSE;
  102109. +*/
  102110. + break;
  102111. + default:
  102112. + pHalData->CustomerID = RT_CID_DEFAULT;
  102113. + break;
  102114. +
  102115. + }
  102116. +
  102117. + MSG_8192C("EEPROMVID = 0x%04x\n", pHalData->EEPROMVID);
  102118. + MSG_8192C("EEPROMPID = 0x%04x\n", pHalData->EEPROMPID);
  102119. + MSG_8192C("EEPROMCustomerID : 0x%02x\n", pHalData->EEPROMCustomerID);
  102120. + MSG_8192C("EEPROMSubCustomerID: 0x%02x\n", pHalData->EEPROMSubCustomerID);
  102121. +
  102122. + MSG_8192C("RT_CustomerID: 0x%02x\n", pHalData->CustomerID);
  102123. +
  102124. +}
  102125. +
  102126. +
  102127. +static VOID
  102128. +_ReadMACAddress(
  102129. + IN PADAPTER Adapter,
  102130. + IN u8* PROMContent,
  102131. + IN BOOLEAN AutoloadFail
  102132. + )
  102133. +{
  102134. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
  102135. +
  102136. + if(_FALSE == AutoloadFail){
  102137. + //Read Permanent MAC address and set value to hardware
  102138. + _rtw_memcpy(pEEPROM->mac_addr, &PROMContent[EEPROM_MAC_ADDR], ETH_ALEN);
  102139. + }
  102140. + else{
  102141. + //Random assigh MAC address
  102142. + u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
  102143. + //sMacAddr[5] = (u8)GetRandomNumber(1, 254);
  102144. + _rtw_memcpy(pEEPROM->mac_addr, sMacAddr, ETH_ALEN);
  102145. + }
  102146. + DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pEEPROM->mac_addr));
  102147. + //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
  102148. + //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress);
  102149. +
  102150. +}
  102151. +
  102152. +static VOID
  102153. +_ReadBoardType(
  102154. + IN PADAPTER Adapter,
  102155. + IN u8* PROMContent,
  102156. + IN BOOLEAN AutoloadFail
  102157. + )
  102158. +{
  102159. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102160. + u32 value32;
  102161. + u8 boardType = BOARD_USB_DONGLE;
  102162. +
  102163. + if(AutoloadFail){
  102164. + if(IS_8723_SERIES(pHalData->VersionID))
  102165. + pHalData->rf_type = RF_1T1R;
  102166. + else
  102167. + pHalData->rf_type = RF_2T2R;
  102168. +
  102169. + pHalData->BluetoothCoexist = _FALSE;
  102170. + pHalData->BoardType = boardType;
  102171. + return;
  102172. + }
  102173. +
  102174. + boardType = PROMContent[EEPROM_NORMAL_BoardType];
  102175. + boardType &= BOARD_TYPE_NORMAL_MASK;//bit[7:5]
  102176. + boardType >>= 5;
  102177. +
  102178. + pHalData->BoardType = boardType;
  102179. + MSG_8192C("_ReadBoardType(%x)\n",pHalData->BoardType);
  102180. +
  102181. + if (boardType == BOARD_USB_High_PA)
  102182. + pHalData->ExternalPA = 1;
  102183. +}
  102184. +
  102185. +
  102186. +static VOID
  102187. +_ReadLEDSetting(
  102188. + IN PADAPTER Adapter,
  102189. + IN u8* PROMContent,
  102190. + IN BOOLEAN AutoloadFail
  102191. + )
  102192. +{
  102193. + struct led_priv *pledpriv = &(Adapter->ledpriv);
  102194. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102195. +#ifdef CONFIG_SW_LED
  102196. + pledpriv->bRegUseLed = _TRUE;
  102197. +
  102198. + //
  102199. + // Led mode
  102200. + //
  102201. + switch(pHalData->CustomerID)
  102202. + {
  102203. + case RT_CID_DEFAULT:
  102204. + pledpriv->LedStrategy = SW_LED_MODE1;
  102205. + pledpriv->bRegUseLed = _TRUE;
  102206. + break;
  102207. +
  102208. + case RT_CID_819x_HP:
  102209. + pledpriv->LedStrategy = SW_LED_MODE6;
  102210. + break;
  102211. +
  102212. + default:
  102213. + pledpriv->LedStrategy = SW_LED_MODE1;
  102214. + break;
  102215. + }
  102216. +
  102217. + if( BOARD_MINICARD == pHalData->BoardType )
  102218. + {
  102219. + pledpriv->LedStrategy = SW_LED_MODE6;
  102220. + }
  102221. + pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16.
  102222. +#else // HW LED
  102223. + pledpriv->LedStrategy = HW_LED;
  102224. +#endif //CONFIG_SW_LED
  102225. +}
  102226. +
  102227. +static VOID
  102228. +_ReadThermalMeter(
  102229. + IN PADAPTER Adapter,
  102230. + IN u8* PROMContent,
  102231. + IN BOOLEAN AutoloadFail
  102232. + )
  102233. +{
  102234. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102235. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  102236. + u8 tempval;
  102237. +
  102238. + //
  102239. + // ThermalMeter from EEPROM
  102240. + //
  102241. + if(!AutoloadFail)
  102242. + tempval = PROMContent[EEPROM_THERMAL_METER];
  102243. + else
  102244. + tempval = EEPROM_Default_ThermalMeter;
  102245. +
  102246. + pHalData->EEPROMThermalMeter = (tempval&0x1f); //[4:0]
  102247. +
  102248. + if(pHalData->EEPROMThermalMeter == 0x1f || AutoloadFail)
  102249. + pdmpriv->bAPKThermalMeterIgnore = _TRUE;
  102250. +
  102251. +#if 0
  102252. + if(pHalData->EEPROMThermalMeter < 0x06 || pHalData->EEPROMThermalMeter > 0x1c)
  102253. + pHalData->EEPROMThermalMeter = 0x12;
  102254. +#endif
  102255. +
  102256. + pdmpriv->ThermalMeter[0] = pHalData->EEPROMThermalMeter;
  102257. +
  102258. + //RTPRINT(FINIT, INIT_TxPower, ("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter));
  102259. +
  102260. +}
  102261. +
  102262. +static VOID
  102263. +_ReadRFSetting(
  102264. + IN PADAPTER Adapter,
  102265. + IN u8* PROMContent,
  102266. + IN BOOLEAN AutoloadFail
  102267. + )
  102268. +{
  102269. +}
  102270. +
  102271. +static void
  102272. +_ReadPROMVersion(
  102273. + IN PADAPTER Adapter,
  102274. + IN u8* PROMContent,
  102275. + IN BOOLEAN AutoloadFail
  102276. + )
  102277. +{
  102278. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102279. +
  102280. + if(AutoloadFail){
  102281. + pHalData->EEPROMVersion = EEPROM_Default_Version;
  102282. + }
  102283. + else{
  102284. + pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION];
  102285. + }
  102286. +}
  102287. +
  102288. +static VOID
  102289. +readAntennaDiversity(
  102290. + IN PADAPTER pAdapter,
  102291. + IN u8 *hwinfo,
  102292. + IN BOOLEAN AutoLoadFail
  102293. + )
  102294. +{
  102295. +
  102296. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  102297. + struct registry_priv *registry_par = &pAdapter->registrypriv;
  102298. +
  102299. + if(!AutoLoadFail)
  102300. + {
  102301. + // Antenna Diversity setting.
  102302. + if(registry_par->antdiv_cfg == 2) // 2: From Efuse
  102303. + pHalData->AntDivCfg = (hwinfo[EEPROM_RF_OPT1]&0x18)>>3;
  102304. + else
  102305. + pHalData->AntDivCfg = registry_par->antdiv_cfg ; // 0:OFF , 1:ON,
  102306. +
  102307. + DBG_8192C("### AntDivCfg(%x)\n",pHalData->AntDivCfg);
  102308. +
  102309. + //if(pHalData->EEPROMBluetoothCoexist!=0 && pHalData->EEPROMBluetoothAntNum==Ant_x1)
  102310. + // pHalData->AntDivCfg = 0;
  102311. + }
  102312. + else
  102313. + {
  102314. + pHalData->AntDivCfg = 0;
  102315. + }
  102316. +
  102317. +}
  102318. +
  102319. +static VOID
  102320. +hal_InitPGData(
  102321. + IN PADAPTER pAdapter,
  102322. + IN OUT u8 *PROMContent
  102323. + )
  102324. +{
  102325. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
  102326. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  102327. + u32 i;
  102328. + u16 value16;
  102329. +
  102330. + if(_FALSE == pEEPROM->bautoload_fail_flag)
  102331. + { // autoload OK.
  102332. + if (_TRUE == pEEPROM->EepromOrEfuse)
  102333. + {
  102334. + // Read all Content from EEPROM or EFUSE.
  102335. + for(i = 0; i < HWSET_MAX_SIZE; i += 2)
  102336. + {
  102337. + //value16 = EF2Byte(ReadEEprom(pAdapter, (u2Byte) (i>>1)));
  102338. + //*((u16 *)(&PROMContent[i])) = value16;
  102339. + }
  102340. + }
  102341. + else
  102342. + {
  102343. + // Read EFUSE real map to shadow.
  102344. + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE);
  102345. + _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE);
  102346. + }
  102347. + }
  102348. + else
  102349. + {//autoload fail
  102350. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("AutoLoad Fail reported from CR9346!!\n"));
  102351. + pEEPROM->bautoload_fail_flag = _TRUE;
  102352. + //update to default value 0xFF
  102353. + if (_FALSE == pEEPROM->EepromOrEfuse)
  102354. + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE);
  102355. + }
  102356. +}
  102357. +// Read HW power down mode selection
  102358. +static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail)
  102359. +{
  102360. + if(AutoloadFail){
  102361. + Adapter->pwrctrlpriv.bHWPowerdown = _FALSE;
  102362. + Adapter->pwrctrlpriv.bSupportRemoteWakeup = _FALSE;
  102363. + }
  102364. + else {
  102365. + //if(SUPPORT_HW_RADIO_DETECT(Adapter))
  102366. + Adapter->pwrctrlpriv.bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect;
  102367. + //else
  102368. + //Adapter->pwrctrlpriv.bHWPwrPindetect = _FALSE;//dongle not support new
  102369. +
  102370. +
  102371. + //hw power down mode selection , 0:rf-off / 1:power down
  102372. +
  102373. + if(Adapter->registrypriv.hwpdn_mode==2)
  102374. + Adapter->pwrctrlpriv.bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4);
  102375. + else
  102376. + Adapter->pwrctrlpriv.bHWPowerdown = Adapter->registrypriv.hwpdn_mode;
  102377. +#ifdef CONFIG_WOWLAN
  102378. + // decide hw if support remote wakeup function
  102379. + // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume
  102380. + Adapter->pwrctrlpriv.bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE;
  102381. +#endif //CONFIG_WOWLAN
  102382. +
  102383. + //if(SUPPORT_HW_RADIO_DETECT(Adapter))
  102384. + //Adapter->registrypriv.usbss_enable = Adapter->pwrctrlpriv.bSupportRemoteWakeup ;
  102385. +
  102386. + DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__,
  102387. + Adapter->pwrctrlpriv.bHWPwrPindetect,Adapter->pwrctrlpriv.bHWPowerdown ,Adapter->pwrctrlpriv.bSupportRemoteWakeup);
  102388. +
  102389. + DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable);
  102390. +
  102391. + }
  102392. +
  102393. +}
  102394. +
  102395. +static VOID
  102396. +readAdapterInfo_8192CU(
  102397. + IN PADAPTER Adapter
  102398. + )
  102399. +{
  102400. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
  102401. + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  102402. + u8 PROMContent[HWSET_MAX_SIZE]={0};
  102403. +
  102404. + hal_InitPGData(Adapter, PROMContent);
  102405. + rtl8192c_EfuseParseIDCode(Adapter, PROMContent);
  102406. +
  102407. + _ReadPROMVersion(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102408. + _ReadIDs(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102409. + _ReadMACAddress(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102410. + ReadTxPowerInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102411. + _ReadBoardType(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102412. +
  102413. +#ifdef CONFIG_BT_COEXIST
  102414. + //
  102415. + // Read Bluetooth co-exist and initialize
  102416. + //
  102417. + rtl8192c_ReadBluetoothCoexistInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102418. +#endif
  102419. +
  102420. + rtl8192c_EfuseParseChnlPlan(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102421. + _ReadThermalMeter(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102422. + _ReadLEDSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102423. + _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102424. + _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102425. + readAntennaDiversity(Adapter, PROMContent, pEEPROM->bautoload_fail_flag);
  102426. +
  102427. + //hal_CustomizedBehavior_8723U(Adapter);
  102428. +
  102429. + Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1;
  102430. + DBG_8192C("%s(): REPLACEMENT = %x\n",__FUNCTION__,Adapter->bDongle);
  102431. +#ifdef CONFIG_INTEL_PROXIM
  102432. + /* for intel proximity */
  102433. + if (pHalData->rf_type== RF_1T1R) {
  102434. + Adapter->proximity.proxim_support = _TRUE;
  102435. + } else if (pHalData->rf_type== RF_2T2R) {
  102436. + if ((pHalData->EEPROMPID == 0x8186) &&
  102437. + (pHalData->EEPROMVID== 0x0bda))
  102438. + Adapter->proximity.proxim_support = _TRUE;
  102439. + } else {
  102440. + Adapter->proximity.proxim_support = _FALSE;
  102441. + }
  102442. +#endif //CONFIG_INTEL_PROXIM
  102443. +}
  102444. +
  102445. +static void _ReadPROMContent(
  102446. + IN PADAPTER Adapter
  102447. + )
  102448. +{
  102449. + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
  102450. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102451. + u8 PROMContent[HWSET_MAX_SIZE]={0};
  102452. + u8 eeValue;
  102453. + u32 i;
  102454. + u16 value16;
  102455. +
  102456. + eeValue = rtw_read8(Adapter, REG_9346CR);
  102457. + // To check system boot selection.
  102458. + pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE;
  102459. + pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE;
  102460. +
  102461. +
  102462. + DBG_8192C("Boot from %s, Autoload %s !\n", (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"),
  102463. + (pEEPROM->bautoload_fail_flag ? "Fail" : "OK") );
  102464. +
  102465. + //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE;
  102466. +
  102467. + //if(IS_HARDWARE_TYPE_8723A(Adapter))
  102468. + // readAdapterInfo_8723U(Adapter);
  102469. + //else
  102470. + readAdapterInfo_8192CU(Adapter);
  102471. +}
  102472. +
  102473. +
  102474. +static VOID
  102475. +_InitOtherVariable(
  102476. + IN PADAPTER Adapter
  102477. + )
  102478. +{
  102479. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102480. +
  102481. +
  102482. + //if(Adapter->bInHctTest){
  102483. + // pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
  102484. + // pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
  102485. + // pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
  102486. + // pMgntInfo->keepAliveLevel = 0;
  102487. + //}
  102488. +
  102489. + // 2009/06/10 MH For 92S 1*1=1R/ 1*2&2*2 use 2R. We default set 1*1 use radio A
  102490. + // So if you want to use radio B. Please modify RF path enable bit for correct signal
  102491. + // strength calculate.
  102492. + if (pHalData->rf_type == RF_1T1R){
  102493. + pHalData->bRFPathRxEnable[0] = _TRUE;
  102494. + }
  102495. + else{
  102496. + pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE;
  102497. + }
  102498. +
  102499. +}
  102500. +
  102501. +static VOID
  102502. +_ReadRFType(
  102503. + IN PADAPTER Adapter
  102504. + )
  102505. +{
  102506. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102507. +
  102508. +#if DISABLE_BB_RF
  102509. + pHalData->rf_chip = RF_PSEUDO_11N;
  102510. +#else
  102511. + pHalData->rf_chip = RF_6052;
  102512. +#endif
  102513. +}
  102514. +
  102515. +void _ReadSilmComboMode(PADAPTER Adapter)
  102516. +{
  102517. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102518. +
  102519. + pHalData->SlimComboDbg = _FALSE; // Default is not debug mode.
  102520. +
  102521. + // 2010/11/22 MH We need to enter debug mode for TSMA and UMC A cut
  102522. + if ((Adapter->chip_type == RTL8188C_8192C) &&
  102523. + (pHalData->BoardType == BOARD_USB_COMBO))
  102524. + {
  102525. + switch (pHalData->VersionID)
  102526. + {
  102527. + case VERSION_NORMAL_TSMC_CHIP_88C:
  102528. + case VERSION_NORMAL_TSMC_CHIP_92C:
  102529. + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R:
  102530. + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT:
  102531. + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT:
  102532. + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT:
  102533. + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20)
  102534. + pHalData->SlimComboDbg = _TRUE;
  102535. +
  102536. + break;
  102537. +
  102538. + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT:
  102539. + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT:
  102540. + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT:
  102541. + // 2011/02/15 MH UNC-B cut ECO fail, we need to support slim combo debug mode.
  102542. + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20)
  102543. + pHalData->SlimComboDbg = _TRUE;
  102544. + break;
  102545. +
  102546. + default:
  102547. + break;
  102548. + }
  102549. +
  102550. + }
  102551. +
  102552. +}
  102553. +static int _ReadAdapterInfo8192CU(PADAPTER Adapter)
  102554. +{
  102555. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102556. + u32 start=rtw_get_current_time();
  102557. +
  102558. + MSG_8192C("====> ReadAdapterInfo8192C\n");
  102559. +
  102560. + //Efuse_InitSomeVar(Adapter);
  102561. +
  102562. + //if(IS_HARDWARE_TYPE_8723A(Adapter))
  102563. + // _EfuseCellSel(Adapter);
  102564. +
  102565. + _ReadRFType(Adapter);//rf_chip -> _InitRFType()
  102566. + _ReadPROMContent(Adapter);
  102567. +
  102568. + // 2010/10/25 MH THe function must be called after borad_type & IC-Version recognize.
  102569. + _ReadSilmComboMode(Adapter);
  102570. +
  102571. + _InitOtherVariable(Adapter);
  102572. +
  102573. + //MSG_8192C("%s()(done), rf_chip=0x%x, rf_type=0x%x\n", __FUNCTION__, pHalData->rf_chip, pHalData->rf_type);
  102574. +
  102575. + MSG_8192C("<==== ReadAdapterInfo8192C in %d ms\n", rtw_get_passing_time_ms(start));
  102576. +
  102577. + return _SUCCESS;
  102578. +}
  102579. +
  102580. +
  102581. +static void ReadAdapterInfo8192CU(PADAPTER Adapter)
  102582. +{
  102583. + // Read EEPROM size before call any EEPROM function
  102584. + //Adapter->EepromAddressSize=Adapter->HalFunc.GetEEPROMSizeHandler(Adapter);
  102585. + Adapter->EepromAddressSize = GetEEPROMSize8192C(Adapter);
  102586. +
  102587. + _ReadAdapterInfo8192CU(Adapter);
  102588. +}
  102589. +
  102590. +
  102591. +#define GPIO_DEBUG_PORT_NUM 0
  102592. +static void rtl8192cu_trigger_gpio_0(_adapter *padapter)
  102593. +{
  102594. +
  102595. + u32 gpioctrl;
  102596. + DBG_8192C("==> trigger_gpio_0...\n");
  102597. + rtw_write16_async(padapter,REG_GPIO_PIN_CTRL,0);
  102598. + rtw_write8_async(padapter,REG_GPIO_PIN_CTRL+2,0xFF);
  102599. + gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM)<<24 )|(BIT(GPIO_DEBUG_PORT_NUM)<<16);
  102600. + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl);
  102601. + gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8);
  102602. + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl);
  102603. + DBG_8192C("<=== trigger_gpio_0...\n");
  102604. +
  102605. +}
  102606. +
  102607. +static void ResumeTxBeacon(_adapter *padapter)
  102608. +{
  102609. + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter);
  102610. +
  102611. + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
  102612. + // which should be read from register to a global variable.
  102613. +
  102614. + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6);
  102615. + pHalData->RegFwHwTxQCtrl |= BIT6;
  102616. +}
  102617. +
  102618. +static void StopTxBeacon(_adapter *padapter)
  102619. +{
  102620. + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter);
  102621. +
  102622. + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
  102623. + // which should be read from register to a global variable.
  102624. +
  102625. + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6));
  102626. + pHalData->RegFwHwTxQCtrl &= (~BIT6);
  102627. +
  102628. + //todo: CheckFwRsvdPageContent(Adapter); // 2010.06.23. Added by tynli.
  102629. +
  102630. +}
  102631. +
  102632. +u16 CRC16(u8 data,u16 CRC)
  102633. +{
  102634. + unsigned char shift_in,CRC_BIT15,DataBit,CRC_BIT11,CRC_BIT4 ;
  102635. + int index;
  102636. + unsigned short CRC_Result;
  102637. +
  102638. + for(index=0;index<8;index++)
  102639. + {
  102640. + CRC_BIT15=((CRC&BIT15) ? 1:0);
  102641. + DataBit =(data&(BIT0<<index) ? 1:0);
  102642. + shift_in=CRC_BIT15^DataBit;
  102643. + //printf("CRC_BIT15=%d, DataBit=%d, shift_in=%d \n",CRC_BIT15,DataBit,shift_in);
  102644. +
  102645. + CRC_Result=CRC<<1;
  102646. + //set BIT0
  102647. + // printf("CRC =%x\n",CRC_Result);
  102648. + //CRC bit 0 =shift_in,
  102649. + if(shift_in==0)
  102650. + {
  102651. + CRC_Result&=(~BIT0);
  102652. + }
  102653. + else
  102654. + {
  102655. + CRC_Result|=BIT0;
  102656. + }
  102657. + //printf("CRC =%x\n",CRC_Result);
  102658. +
  102659. + CRC_BIT11 = ((CRC&BIT11) ? 1:0)^shift_in;
  102660. + if(CRC_BIT11==0)
  102661. + {
  102662. + CRC_Result&=(~BIT12);
  102663. + }
  102664. + else
  102665. + {
  102666. + CRC_Result|=BIT12;
  102667. + }
  102668. + //printf("bit12 CRC =%x\n",CRC_Result);
  102669. +
  102670. + CRC_BIT4 = ((CRC&BIT4) ? 1:0)^shift_in;
  102671. + if(CRC_BIT4==0)
  102672. + {
  102673. + CRC_Result&=(~BIT5);
  102674. + }
  102675. + else
  102676. + {
  102677. + CRC_Result|=BIT5;
  102678. + }
  102679. + //printf("bit5 CRC =%x\n",CRC_Result);
  102680. +
  102681. + CRC=CRC_Result; //重複使用上一次的結果
  102682. + }
  102683. +
  102684. + return CRC;
  102685. +
  102686. +}
  102687. +
  102688. +
  102689. +/////////////////////////////////////////////////
  102690. +//
  102691. +//function name :calc_crc
  102692. +//
  102693. +//input : char* pattern , pattern size
  102694. +//
  102695. +//////////////////////////////////////////////////
  102696. +u16 calc_crc(u8 * pdata,int length)
  102697. +{
  102698. +// unsigned char data[2]={0xC6,0xAA};
  102699. + u16 CRC=0xffff;
  102700. + int i;
  102701. +
  102702. + for(i=0;i<length;i++)
  102703. + {
  102704. + CRC=CRC16(pdata[i],CRC);
  102705. + }
  102706. +
  102707. + CRC=~CRC; //取補數
  102708. + printk("CRC =%x\n",CRC);
  102709. + return CRC;
  102710. +}
  102711. +
  102712. +static void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val)
  102713. +{
  102714. + u8 val8;
  102715. + u8 mode = *((u8 *)val);
  102716. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  102717. +
  102718. +#ifdef CONFIG_CONCURRENT_MODE
  102719. + if(Adapter->iface_type == IFACE_PORT1)
  102720. + {
  102721. + // disable Port1 TSF update
  102722. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
  102723. +
  102724. + // set net_type
  102725. + val8 = rtw_read8(Adapter, MSR)&0x03;
  102726. + val8 |= (mode<<2);
  102727. + rtw_write8(Adapter, MSR, val8);
  102728. +
  102729. + //reset TSF1
  102730. + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));
  102731. +
  102732. + DBG_871X("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode);
  102733. +
  102734. + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))
  102735. + {
  102736. + if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
  102737. + {
  102738. + StopTxBeacon(Adapter);
  102739. + }
  102740. +
  102741. + rtw_write8(Adapter,REG_BCN_CTRL_1, 0x19);//disable atim wnd
  102742. + //rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18);
  102743. + }
  102744. + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
  102745. + {
  102746. + ResumeTxBeacon(Adapter);
  102747. + rtw_write8(Adapter,REG_BCN_CTRL_1, 0x1a);
  102748. + }
  102749. + else if(mode == _HW_STATE_AP_)
  102750. + {
  102751. + ResumeTxBeacon(Adapter);
  102752. +
  102753. + rtw_write8(Adapter, REG_BCN_CTRL_1, 0x12);
  102754. +
  102755. + //Set RCR
  102756. + //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
  102757. + rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0
  102758. + //enable to rx data frame
  102759. + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
  102760. + //enable to rx ps-poll
  102761. + rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400);
  102762. +
  102763. + //Beacon Control related register for first time
  102764. + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms
  102765. + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms
  102766. + //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);
  102767. + rtw_write8(Adapter, REG_ATIMWND_1, 0x0a); // 10ms for port1
  102768. + rtw_write16(Adapter, REG_BCNTCFG, 0x00);
  102769. + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);
  102770. + rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)
  102771. +
  102772. +
  102773. + //enable BCN1 Function for if2
  102774. + //don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received)
  102775. + rtw_write8(Adapter, REG_BCN_CTRL_1, (DIS_TSF_UDT0_NORMAL_CHIP|EN_BCN_FUNCTION | EN_TXBCN_RPT|BIT(1)));
  102776. +
  102777. +#ifdef CONFIG_CONCURRENT_MODE
  102778. + if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))
  102779. + rtw_write8(Adapter, REG_BCN_CTRL,
  102780. + rtw_read8(Adapter, REG_BCN_CTRL) & ~EN_BCN_FUNCTION);
  102781. +#endif
  102782. +
  102783. + DBG_871X("%s()-%d: REG_BCN_CTRL_1 = %02x\n", __FUNCTION__, __LINE__, rtw_read8(Adapter, REG_BCN_CTRL_1));
  102784. +
  102785. + //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked
  102786. + //rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5));
  102787. + //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(3));
  102788. +
  102789. + //dis BCN0 ATIM WND if if1 is station
  102790. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(0));
  102791. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  102792. + // Reset TSF for STA+AP concurrent mode
  102793. + if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {
  102794. + if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)
  102795. + DBG_871X("ERROR! %s()-%d: Reset port1 TSF fail\n",
  102796. + __FUNCTION__, __LINE__);
  102797. + }
  102798. +#endif // CONFIG_TSF_RESET_OFFLOAD
  102799. + }
  102800. +
  102801. + }
  102802. + else // (Adapter->iface_type == IFACE_PORT1)
  102803. +#endif //CONFIG_CONCURRENT_MODE
  102804. + {
  102805. + // disable Port0 TSF update
  102806. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
  102807. +
  102808. + // set net_type
  102809. + val8 = rtw_read8(Adapter, MSR)&0x0c;
  102810. + val8 |= mode;
  102811. + rtw_write8(Adapter, MSR, val8);
  102812. +
  102813. + //reset TSF0
  102814. + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));
  102815. +
  102816. + DBG_871X("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode);
  102817. +
  102818. + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))
  102819. + {
  102820. +#ifdef CONFIG_CONCURRENT_MODE
  102821. + if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
  102822. +#endif //CONFIG_CONCURRENT_MODE
  102823. + {
  102824. + StopTxBeacon(Adapter);
  102825. + }
  102826. +
  102827. + rtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd
  102828. + //rtw_write8(Adapter,REG_BCN_CTRL, 0x18);
  102829. + }
  102830. + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
  102831. + {
  102832. + ResumeTxBeacon(Adapter);
  102833. + rtw_write8(Adapter,REG_BCN_CTRL, 0x1a);
  102834. + }
  102835. + else if(mode == _HW_STATE_AP_)
  102836. + {
  102837. + ResumeTxBeacon(Adapter);
  102838. +
  102839. + rtw_write8(Adapter, REG_BCN_CTRL, 0x12);
  102840. +
  102841. + //Set RCR
  102842. + //write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
  102843. + rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0
  102844. + //enable to rx data frame
  102845. + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
  102846. + //enable to rx ps-poll
  102847. + rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400);
  102848. +
  102849. + //Beacon Control related register for first time
  102850. +
  102851. + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms
  102852. + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms
  102853. +
  102854. + //write8(Adapter, REG_BCN_MAX_ERR, 0xFF);
  102855. + rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms for port0
  102856. + rtw_write16(Adapter, REG_BCNTCFG, 0x00);
  102857. + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);
  102858. + rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)
  102859. +
  102860. + //enable BCN0 Function for if1
  102861. + //don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received)
  102862. + rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP|EN_BCN_FUNCTION | EN_TXBCN_RPT|BIT(1)));
  102863. +
  102864. +#ifdef CONFIG_CONCURRENT_MODE
  102865. + if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))
  102866. + rtw_write8(Adapter, REG_BCN_CTRL_1,
  102867. + rtw_read8(Adapter, REG_BCN_CTRL_1) & ~EN_BCN_FUNCTION);
  102868. +#endif
  102869. + //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked
  102870. + //only interface 2 as AP MODE need to sync
  102871. + //rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5));
  102872. +
  102873. +
  102874. + //dis BCN1 ATIM WND if if2 is station
  102875. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(0));
  102876. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  102877. + // Reset TSF for STA+AP concurrent mode
  102878. + if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {
  102879. + if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)
  102880. + DBG_871X("ERROR! %s()-%d: Reset port0 TSF fail\n",
  102881. + __FUNCTION__, __LINE__);
  102882. + }
  102883. +#endif // CONFIG_TSF_RESET_OFFLOAD
  102884. +
  102885. + }
  102886. +
  102887. +
  102888. + }
  102889. +
  102890. +}
  102891. +
  102892. +static void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val)
  102893. +{
  102894. + u8 idx = 0;
  102895. + u32 reg_macid;
  102896. +
  102897. +#ifdef CONFIG_CONCURRENT_MODE
  102898. + if(Adapter->iface_type == IFACE_PORT1)
  102899. + {
  102900. + reg_macid = REG_MACID1;
  102901. + }
  102902. + else
  102903. +#endif
  102904. + {
  102905. + reg_macid = REG_MACID;
  102906. + }
  102907. +
  102908. + for(idx = 0 ; idx < 6; idx++)
  102909. + {
  102910. + rtw_write8(Adapter, (reg_macid+idx), val[idx]);
  102911. + }
  102912. +
  102913. +}
  102914. +
  102915. +static void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val)
  102916. +{
  102917. + u8 idx = 0;
  102918. + u32 reg_bssid;
  102919. +
  102920. +#ifdef CONFIG_CONCURRENT_MODE
  102921. + if(Adapter->iface_type == IFACE_PORT1)
  102922. + {
  102923. + reg_bssid = REG_BSSID1;
  102924. + }
  102925. + else
  102926. +#endif
  102927. + {
  102928. + reg_bssid = REG_BSSID;
  102929. + }
  102930. +
  102931. + for(idx = 0 ; idx < 6; idx++)
  102932. + {
  102933. + rtw_write8(Adapter, (reg_bssid+idx), val[idx]);
  102934. + }
  102935. +
  102936. +}
  102937. +
  102938. +static void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val)
  102939. +{
  102940. + u32 bcn_ctrl_reg;
  102941. +
  102942. +#ifdef CONFIG_CONCURRENT_MODE
  102943. + if(Adapter->iface_type == IFACE_PORT1)
  102944. + {
  102945. + bcn_ctrl_reg = REG_BCN_CTRL_1;
  102946. +
  102947. + if(*((u8 *)val))
  102948. + {
  102949. + rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));
  102950. + }
  102951. + else
  102952. + {
  102953. + rtw_write8(Adapter, bcn_ctrl_reg, rtw_read8(Adapter, bcn_ctrl_reg)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT)));
  102954. + }
  102955. + }
  102956. + else
  102957. +#endif
  102958. + {
  102959. + bcn_ctrl_reg = REG_BCN_CTRL;
  102960. + if(*((u8 *)val))
  102961. + {
  102962. + rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));
  102963. + }
  102964. + else
  102965. + {
  102966. + //rtw_write8(Adapter, bcn_ctrl_reg, rtw_read8(Adapter, bcn_ctrl_reg)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT)));
  102967. + rtw_write8(Adapter, bcn_ctrl_reg, (rtw_read8(Adapter, bcn_ctrl_reg)&(~(EN_TXBCN_RPT))) | DIS_TSF_UDT0_NORMAL_CHIP);
  102968. + }
  102969. + }
  102970. +
  102971. +
  102972. +}
  102973. +
  102974. +#ifdef CONFIG_WOWLAN
  102975. +static int rtw_wowlan_set_pattern(_adapter *padapter ,u8* pbuf){
  102976. + struct pwrctrl_priv *pwrpriv=&padapter->pwrctrlpriv;
  102977. + int res=0,crc_idx;
  102978. + u32 content=0,cmd=0;
  102979. + u32 *pdata;
  102980. + u8 config,crc,mc,bc,uc,idx,pattern_len,packet[200],packet_len,valid;
  102981. + u16 crc_val=0,i;
  102982. +
  102983. + config=pbuf[0];
  102984. + bc=config & BIT(3)?1:0;
  102985. + mc=config & BIT(4)?1:0;
  102986. + uc=config & BIT(5)?1:0;
  102987. + idx=config & 0x7;
  102988. + crc=config & BIT(6)?1:0;
  102989. + valid=config & BIT(7)?1:0;
  102990. + pattern_len=pbuf[1];
  102991. + packet_len=pattern_len*8;
  102992. + pdata=(u32 *)pbuf;
  102993. +
  102994. + // Write to the Wakeup CAM
  102995. + //offset 0
  102996. + if(pattern_len>=4){
  102997. + content=pdata[1];
  102998. + }
  102999. + else{
  103000. + content=0;
  103001. + }
  103002. + DBG_8192C("\nrtw_wowlan_set_pattern offset[0] content 0x%x [cpu_to_le32 0x%x]\n", content,__cpu_to_le32(content));
  103003. + //rtw_write32(padapter, REG_WKFMCAM_RWD, __cpu_to_le32(content));
  103004. + pwrpriv->wowlan_pattern_context[idx][0]= __cpu_to_le32(content);
  103005. + //cmd=BIT(31)|BIT(16)|(idx+0);
  103006. + //rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103007. + //offset 4
  103008. + if(pattern_len>=8){
  103009. + content=pdata[2];
  103010. + }
  103011. + else{
  103012. + content=0;
  103013. + }
  103014. + DBG_8192C("rtw_wowlan_set_pattern offset[4] content 0x%x [cpu_to_le32 0x%x]\n", content,__cpu_to_le32(content));
  103015. + //rtw_write32(padapter, REG_WKFMCAM_RWD, __cpu_to_le32(content));
  103016. + pwrpriv->wowlan_pattern_context[idx][1]= __cpu_to_le32(content);
  103017. +
  103018. + //cmd=BIT(31)|BIT(16)|(idx+1);
  103019. + //rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103020. + //offset 8
  103021. + if(pattern_len>=12){
  103022. + content=pdata[3];
  103023. + }
  103024. + else{
  103025. + content=0;
  103026. + }
  103027. + DBG_8192C("rtw_wowlan_set_pattern offset[8] content 0x%x [cpu_to_le32 0x%x]\n", content,__cpu_to_le32(content));
  103028. + //rtw_write32(padapter, REG_WKFMCAM_RWD, __cpu_to_le32(content));
  103029. + pwrpriv->wowlan_pattern_context[idx][2]= __cpu_to_le32(content);
  103030. + //cmd=BIT(31)|BIT(16)|(idx+2);
  103031. + //rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103032. + //offset 12
  103033. + if(pattern_len>=16){
  103034. + content=pdata[4];
  103035. + }
  103036. + else{
  103037. + content=0;
  103038. + }
  103039. + DBG_8192C("rtw_wowlan_set_pattern offset[12] content 0x%x [cpu_to_le32 0x%x]\n", content,__cpu_to_le32(content));
  103040. + //rtw_write32(padapter, REG_WKFMCAM_RWD, __cpu_to_le32(content));
  103041. + pwrpriv->wowlan_pattern_context[idx][3]= __cpu_to_le32(content);
  103042. + //cmd=BIT(31)|BIT(16)|(idx+3);
  103043. + //rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103044. +
  103045. + if(crc){
  103046. + // Have the CRC value
  103047. + crc_val=*(u16 *)(&pbuf[2]);
  103048. + DBG_8192C("rtw_wowlan_set_pattern crc_val 0x%x \n", crc_val);
  103049. + crc_val=__cpu_to_le16(crc_val);
  103050. + DBG_8192C("rtw_wowlan_set_pattern crc_val after 0x%x \n", crc_val);
  103051. + }
  103052. + else{
  103053. + DBG_8192C("+rtw_wowlan_set_pattern crc=0[%x] Should calculate the CRC\n", crc);
  103054. + // calculate the CRC the write to the Wakeup CAM
  103055. + crc_idx=0;
  103056. + for(i=0;i<packet_len;i++){
  103057. + if(pbuf[4+(i/8)]&(0x01<<(i%8)))
  103058. + {
  103059. + packet[crc_idx++]=pbuf[20+i];
  103060. + // printk("\n i=%d packet[i]=%x pbuf[20+i(%d)]=%x \n",i,packet[i],20+i,pbuf[20+i]);
  103061. + }
  103062. + }
  103063. + crc_val=calc_crc(packet, crc_idx);
  103064. + printk("+rtw_wowlan_set_pattern crc_val=0x%.8x \n", crc_val);
  103065. +
  103066. + }
  103067. +
  103068. + //offset 16
  103069. + content=(valid<<31)| (bc<<26)|(mc<<25)|(uc<<24) |crc_val;
  103070. + printk("rtw_wowlan_set_pattern offset[16] content 0x%x \n", content);
  103071. + rtw_write32(padapter, REG_WKFMCAM_RWD,content);
  103072. + pwrpriv->wowlan_pattern_context[idx][4]= content;
  103073. + //cmd=BIT(31)|BIT(16)|(idx+4);
  103074. + //rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103075. + pwrpriv->wowlan_pattern_idx|=BIT(idx);
  103076. +
  103077. +_rtw_wowlan_set_pattern_exit:
  103078. + return res;
  103079. +}
  103080. +
  103081. +
  103082. +
  103083. +void rtw_wowlan_reload_pattern(_adapter *padapter){
  103084. + struct pwrctrl_priv *pwrpriv=&padapter->pwrctrlpriv;
  103085. + u32 content=0,cmd=0;
  103086. + u8 idx;
  103087. +
  103088. + for (idx=0;idx<8;idx ++){
  103089. + if(pwrpriv->wowlan_pattern_idx & BIT(idx)){
  103090. + //offset 0
  103091. + rtw_write32(padapter, REG_WKFMCAM_RWD, pwrpriv->wowlan_pattern_context[idx][0]);
  103092. + cmd=BIT(31)|BIT(16)|(idx+0);
  103093. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103094. +
  103095. + //offset 4
  103096. + rtw_write32(padapter, REG_WKFMCAM_RWD, pwrpriv->wowlan_pattern_context[idx][1]);
  103097. + cmd=BIT(31)|BIT(16)|(idx+1);
  103098. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103099. +
  103100. + //offset 8
  103101. + rtw_write32(padapter, REG_WKFMCAM_RWD, pwrpriv->wowlan_pattern_context[idx][2]);
  103102. + cmd=BIT(31)|BIT(16)|(idx+2);
  103103. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103104. +
  103105. + //offset 12
  103106. + rtw_write32(padapter, REG_WKFMCAM_RWD, pwrpriv->wowlan_pattern_context[idx][3]);
  103107. + cmd=BIT(31)|BIT(16)|(idx+3);
  103108. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103109. +
  103110. + //offset 16
  103111. + rtw_write32(padapter, REG_WKFMCAM_RWD, pwrpriv->wowlan_pattern_context[idx][4]);
  103112. + cmd=BIT(31)|BIT(16)|(idx+4);
  103113. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103114. +
  103115. + }
  103116. + printk("print WOWCAM idx =%d\n",idx);
  103117. + cmd=BIT(31)|(idx+0);
  103118. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103119. + printk("print WOWCAM offset[0] =%x\n",rtw_read32(padapter, REG_WKFMCAM_RWD));
  103120. + cmd=BIT(31)|(idx+1);
  103121. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103122. + printk("print WOWCAM offset[1] =%x\n",rtw_read32(padapter, REG_WKFMCAM_RWD));
  103123. + cmd=BIT(31)|(idx+2);
  103124. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103125. + printk("print WOWCAM offset[2] =%x\n",rtw_read32(padapter, REG_WKFMCAM_RWD));
  103126. + cmd=BIT(31)|(idx+3);
  103127. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103128. + printk("print WOWCAM offset[3] =%x\n",rtw_read32(padapter, REG_WKFMCAM_RWD));
  103129. + cmd=BIT(31)|(idx+4);
  103130. + rtw_write32(padapter, REG_WKFMCAM_CMD, cmd);
  103131. + printk("print WOWCAM offset[4] =%x\n",rtw_read32(padapter, REG_WKFMCAM_RWD));
  103132. +
  103133. +
  103134. + }
  103135. +}
  103136. +#endif //CONFIG_WOWLAN
  103137. +
  103138. +static void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val)
  103139. +{
  103140. +#ifdef CONFIG_CONCURRENT_MODE
  103141. + u64 tsf;
  103142. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  103143. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  103144. +
  103145. + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
  103146. + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us
  103147. +
  103148. + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  103149. + {
  103150. + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
  103151. + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
  103152. + StopTxBeacon(Adapter);
  103153. + }
  103154. +
  103155. + if(Adapter->iface_type == IFACE_PORT1)
  103156. + {
  103157. + //disable related TSF function
  103158. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
  103159. +
  103160. + rtw_write32(Adapter, REG_TSFTR1, tsf);
  103161. + rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
  103162. +
  103163. + //enable related TSF function
  103164. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));
  103165. +
  103166. +
  103167. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  103168. + // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue!
  103169. + if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
  103170. + && check_buddy_fwstate(Adapter, WIFI_AP_STATE) ) {
  103171. + if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)
  103172. + DBG_871X("ERROR! %s()-%d: Reset port0 TSF fail\n",
  103173. + __FUNCTION__, __LINE__);
  103174. + }
  103175. +#endif // CONFIG_TSF_RESET_OFFLOAD
  103176. +
  103177. + }
  103178. + else // Adapter->iface_type == IFACE_PORT1
  103179. + {
  103180. + //disable related TSF function
  103181. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
  103182. + // disable TSF update instead! May induce burst beacon TX
  103183. + //rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
  103184. +
  103185. + rtw_write32(Adapter, REG_TSFTR, tsf);
  103186. + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
  103187. +
  103188. + //enable related TSF function
  103189. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
  103190. + //rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
  103191. +
  103192. + // Update buddy port's TSF if it is SoftAP for beacon TX issue!
  103193. + if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
  103194. + && check_buddy_fwstate(Adapter, WIFI_AP_STATE)
  103195. + ) {
  103196. + //disable related TSF function
  103197. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
  103198. + // disable TSF update instead!
  103199. + //rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
  103200. +
  103201. + rtw_write32(Adapter, REG_TSFTR1, tsf);
  103202. + rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
  103203. +
  103204. + //enable related TSF function
  103205. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));
  103206. + //rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
  103207. + }
  103208. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  103209. + // Update buddy port's TSF if it is SoftAP for beacon TX issue!
  103210. + if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
  103211. + && check_buddy_fwstate(Adapter, WIFI_AP_STATE) ) {
  103212. + if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)
  103213. + DBG_871X("ERROR! %s()-%d: Reset port1 TSF fail\n",
  103214. + __FUNCTION__, __LINE__);
  103215. + }
  103216. +#endif // CONFIG_TSF_RESET_OFFLOAD
  103217. + }
  103218. +
  103219. + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  103220. + {
  103221. + //pHalData->RegTxPause &= (~STOP_BCNQ);
  103222. + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
  103223. + ResumeTxBeacon(Adapter);
  103224. + }
  103225. +#endif // CONFIG_CONCURRENT_MODE
  103226. +}
  103227. +
  103228. +static void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val)
  103229. +{
  103230. +#ifdef CONFIG_CONCURRENT_MODE
  103231. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  103232. + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
  103233. +
  103234. +
  103235. + if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))
  103236. + rtw_write16(Adapter, REG_RXFLTMAP2, 0x00);
  103237. +
  103238. +
  103239. + if(Adapter->iface_type == IFACE_PORT1)
  103240. + {
  103241. + int i;
  103242. + u8 reg_bcn_ctrl_1;
  103243. +
  103244. + // a.Driver set 0x422 bit 6 =0
  103245. + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6));
  103246. + pHalData->RegFwHwTxQCtrl &= (~BIT6);
  103247. +
  103248. +
  103249. +#ifdef CONFIG_BEACON_DISABLE_OFFLOAD
  103250. + u8 reg_bcn_disable_cnt = rtw_read8(Adapter, REG_FW_BCN_DIS_CNT);
  103251. + DBG_871X("%s()-%d: reg_bcn_disable_cnt=%02x\n", __FUNCTION__, __LINE__, reg_bcn_disable_cnt);
  103252. +
  103253. + reg_bcn_ctrl_1 = rtw_read8(Adapter, REG_BCN_CTRL_1);
  103254. + DBG_871X("%s()-%d: reg_bcn_ctrl_1=%02x\n", __FUNCTION__, __LINE__, reg_bcn_ctrl_1);
  103255. +
  103256. + // b. driver set h2c cmd
  103257. + rtl8192c_dis_beacon_fun_cmd(Adapter);
  103258. +
  103259. + /*
  103260. + // FW Job for port 0
  103261. +
  103262. + c. 8051 set nettype to ap
  103263. + d. 8051 check dma_int
  103264. + e. 8051 set nettype to no_link
  103265. + f.8051 dis_tsf_update 0x550 bit 4
  103266. + g.8051 reset beacon function test count 0x553 bit0.
  103267. + h.8051 disable beacon function 0x550 bit3
  103268. + i. 8051 sent ready to driver
  103269. +
  103270. + */
  103271. +
  103272. + // The worst case is 100 + 15 ms
  103273. + rtw_msleep_os(120);
  103274. +
  103275. + for (i=0; i< 10; i++) {
  103276. + reg_bcn_ctrl_1 = rtw_read8(Adapter, REG_BCN_CTRL_1);
  103277. + if ( (reg_bcn_ctrl_1 & BIT(3)) == 0 ) {
  103278. + //DBG_871X("%s()-%d: BEACON_DISABLE_OFFLOAD finished! reg=%02x\n", __FUNCTION__, __LINE__, reg);
  103279. + break;
  103280. + }
  103281. + DBG_871X("%s()-%d: BEACON_DISABLE_OFFLOAD not finished! REG_BCN_CTRL_1=%02x\n", __FUNCTION__, __LINE__, reg_bcn_ctrl_1);
  103282. + DBG_871X("%s()-%d: reg_bcn_disable_cnt=%02x\n", __FUNCTION__, __LINE__, rtw_read8(Adapter, REG_FW_BCN_DIS_CNT));
  103283. + DBG_871X("%s()-%d: REG_BCN_CTRL=%02x\n", __FUNCTION__, __LINE__, rtw_read8(Adapter, REG_BCN_CTRL));
  103284. + DBG_871X("%s()-%d: FWISR=%08x\n", __FUNCTION__, __LINE__, rtw_read32(Adapter, REG_FWISR));
  103285. + rtw_msleep_os(100);
  103286. + }
  103287. + DBG_871X("%s()-%d: reg_bcn_disable_cnt=%02x\n", __FUNCTION__, __LINE__, rtw_read8(Adapter, REG_FW_BCN_DIS_CNT));
  103288. + DBG_871X("%s()-%d: reg_bcn_ctrl_1=%02x\n", __FUNCTION__, __LINE__, reg_bcn_ctrl_1);
  103289. +
  103290. +#else // CONFIG_BEACON_DISABLE_OFFLOAD
  103291. +
  103292. + //disable update TSF1
  103293. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
  103294. +
  103295. + //reset TSF1
  103296. + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));
  103297. +
  103298. + // disable Port1's beacon function
  103299. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
  103300. +
  103301. +#endif // CONFIG_BEACON_DISABLE_OFFLOAD
  103302. +
  103303. + // j, Driver set 0x422 bit 6 =1
  103304. + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6);
  103305. + pHalData->RegFwHwTxQCtrl |= BIT6;
  103306. +
  103307. + // k. re_download beacon pkt
  103308. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
  103309. + set_tx_beacon_cmd(pbuddy_adapter);
  103310. +
  103311. +
  103312. + }
  103313. + else // (Adapter->iface_type == IFACE_PORT1)
  103314. + {
  103315. + //disable update TSF
  103316. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
  103317. +
  103318. + //reset TSF
  103319. + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));
  103320. +
  103321. + // Can't disable Port0's beacon function due to it is used by RA
  103322. + }
  103323. +#endif
  103324. +}
  103325. +
  103326. +static void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val)
  103327. +{
  103328. + u32 value_rcr, rcr_clear_bit, reg_bcn_ctl;
  103329. + u16 value_rxfltmap2;
  103330. + struct mlme_priv *pmlmepriv=&(Adapter->mlmepriv);
  103331. +
  103332. +
  103333. +#ifdef CONFIG_CONCURRENT_MODE
  103334. + if(Adapter->iface_type == IFACE_PORT1)
  103335. + reg_bcn_ctl = REG_BCN_CTRL_1;
  103336. + else
  103337. +#endif
  103338. + reg_bcn_ctl = REG_BCN_CTRL;
  103339. +
  103340. +#ifdef CONFIG_FIND_BEST_CHANNEL
  103341. +
  103342. + if( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  103343. +#ifdef CONFIG_CONCURRENT_MODE
  103344. + || (check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE)
  103345. +#endif
  103346. +#ifdef CONFIG_TDLS
  103347. + // TDLS will clear RCR_CBSSID_DATA bit for connection.
  103348. + || ( Adapter->tdlsinfo.setup_state & TDLS_LINKED_STATE )
  103349. +#endif // CONFIG_TDLS
  103350. + )
  103351. + {
  103352. + rcr_clear_bit = RCR_CBSSID_BCN;
  103353. + }
  103354. + else
  103355. + {
  103356. + rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA);
  103357. + }
  103358. +
  103359. + // Recieve all data frames
  103360. + value_rxfltmap2 = 0xFFFF;
  103361. +
  103362. +#else /* CONFIG_FIND_BEST_CHANNEL */
  103363. +
  103364. + rcr_clear_bit = RCR_CBSSID_BCN;
  103365. +
  103366. + //config RCR to receive different BSSID & not to receive data frame
  103367. + value_rxfltmap2 = 0;
  103368. +
  103369. +#endif /* CONFIG_FIND_BEST_CHANNEL */
  103370. +
  103371. + value_rcr = rtw_read32(Adapter, REG_RCR);
  103372. +
  103373. + if(*((u8 *)val))//under sitesurvey
  103374. + {
  103375. + value_rcr &= ~(rcr_clear_bit);
  103376. + rtw_write32(Adapter, REG_RCR, value_rcr);
  103377. +
  103378. + rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2);
  103379. +
  103380. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) {
  103381. + //disable update TSF
  103382. + rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)|BIT(4));
  103383. + }
  103384. +
  103385. +#ifdef CONFIG_CONCURRENT_MODE
  103386. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
  103387. + check_buddy_fwstate(Adapter, _FW_LINKED))
  103388. + {
  103389. + StopTxBeacon(Adapter);
  103390. + }
  103391. +#endif
  103392. + }
  103393. + else//sitesurvey done
  103394. + {
  103395. + if(check_fwstate(pmlmepriv, _FW_LINKED) || check_fwstate(pmlmepriv, WIFI_AP_STATE)
  103396. +#ifdef CONFIG_CONCURRENT_MODE
  103397. + || check_buddy_fwstate(Adapter, _FW_LINKED) || check_buddy_fwstate(Adapter, WIFI_AP_STATE)
  103398. +#endif
  103399. + )
  103400. + {
  103401. + //enable to rx data frame
  103402. + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
  103403. + }
  103404. +
  103405. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) {
  103406. + //enable update TSF
  103407. + rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)&(~BIT(4)));
  103408. + }
  103409. +
  103410. + value_rcr |= rcr_clear_bit;
  103411. + rtw_write32(Adapter, REG_RCR, value_rcr);
  103412. +
  103413. +#ifdef CONFIG_CONCURRENT_MODE
  103414. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
  103415. + check_buddy_fwstate(Adapter, _FW_LINKED))
  103416. + {
  103417. + ResumeTxBeacon(Adapter);
  103418. + }
  103419. +#endif
  103420. + }
  103421. +}
  103422. +
  103423. +static void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val)
  103424. +{
  103425. +#ifdef CONFIG_CONCURRENT_MODE
  103426. + u8 RetryLimit = 0x30;
  103427. + u8 type = *((u8 *)val);
  103428. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  103429. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  103430. +
  103431. + if(type == 0) // prepare to join
  103432. + {
  103433. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
  103434. + check_buddy_fwstate(Adapter, _FW_LINKED))
  103435. + {
  103436. + StopTxBeacon(Adapter);
  103437. + }
  103438. +
  103439. + //enable to rx data frame.Accept all data frame
  103440. + //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
  103441. + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
  103442. +
  103443. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
  103444. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
  103445. + else
  103446. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
  103447. +
  103448. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  103449. + {
  103450. + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48;
  103451. + }
  103452. + else // Ad-hoc Mode
  103453. + {
  103454. + RetryLimit = 0x7;
  103455. + }
  103456. + }
  103457. + else if(type == 1) //joinbss_event call back when join res < 0
  103458. + {
  103459. + if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))
  103460. + rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
  103461. +
  103462. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
  103463. + check_buddy_fwstate(Adapter, _FW_LINKED))
  103464. + {
  103465. + ResumeTxBeacon(Adapter);
  103466. +
  103467. + //reset TSF 1/2 after ResumeTxBeacon
  103468. + //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));
  103469. +
  103470. + }
  103471. + }
  103472. + else if(type == 2) //sta add event call back
  103473. + {
  103474. +
  103475. + //enable update TSF
  103476. + if(Adapter->iface_type == IFACE_PORT1)
  103477. + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
  103478. + else
  103479. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
  103480. +
  103481. +
  103482. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
  103483. + {
  103484. + //fixed beacon issue for 8191su...........
  103485. + rtw_write8(Adapter,0x542 ,0x02);
  103486. + RetryLimit = 0x7;
  103487. + }
  103488. +
  103489. +
  103490. + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
  103491. + check_buddy_fwstate(Adapter, _FW_LINKED))
  103492. + {
  103493. + ResumeTxBeacon(Adapter);
  103494. +
  103495. + //reset TSF 1/2 after ResumeTxBeacon
  103496. + //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));
  103497. + }
  103498. +
  103499. + }
  103500. +
  103501. + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
  103502. +
  103503. +#endif
  103504. +}
  103505. +
  103506. +void SetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val)
  103507. +{
  103508. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  103509. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  103510. +
  103511. +_func_enter_;
  103512. +
  103513. + switch(variable)
  103514. + {
  103515. + case HW_VAR_MEDIA_STATUS:
  103516. + {
  103517. + u8 val8;
  103518. +
  103519. + val8 = rtw_read8(Adapter, MSR)&0x0c;
  103520. + val8 |= *((u8 *)val);
  103521. + rtw_write8(Adapter, MSR, val8);
  103522. + }
  103523. + break;
  103524. + case HW_VAR_MEDIA_STATUS1:
  103525. + {
  103526. + u8 val8;
  103527. +
  103528. + val8 = rtw_read8(Adapter, MSR)&0x03;
  103529. + val8 |= *((u8 *)val) <<2;
  103530. + rtw_write8(Adapter, MSR, val8);
  103531. + }
  103532. + break;
  103533. + case HW_VAR_SET_OPMODE:
  103534. + hw_var_set_opmode(Adapter, variable, val);
  103535. + break;
  103536. + case HW_VAR_MAC_ADDR:
  103537. + hw_var_set_macaddr(Adapter, variable, val);
  103538. + break;
  103539. + case HW_VAR_BSSID:
  103540. + hw_var_set_bssid(Adapter, variable, val);
  103541. + break;
  103542. + case HW_VAR_BASIC_RATE:
  103543. + {
  103544. + u16 BrateCfg = 0;
  103545. + u8 RateIndex = 0;
  103546. +
  103547. + // 2007.01.16, by Emily
  103548. + // Select RRSR (in Legacy-OFDM and CCK)
  103549. + // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate.
  103550. + // We do not use other rates.
  103551. + HalSetBrateCfg( Adapter, val, &BrateCfg );
  103552. +
  103553. + //2011.03.30 add by Luke Lee
  103554. + //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT
  103555. + //because CCK 2M has poor TXEVM
  103556. + //CCK 5.5M & 11M ACK should be enabled for better performance
  103557. +
  103558. + pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d;
  103559. +
  103560. + BrateCfg |= 0x01; // default enable 1M ACK rate
  103561. +
  103562. + DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg);
  103563. +
  103564. + // Set RRSR rate table.
  103565. + rtw_write8(Adapter, REG_RRSR, BrateCfg&0xff);
  103566. + rtw_write8(Adapter, REG_RRSR+1, (BrateCfg>>8)&0xff);
  103567. + rtw_write8(Adapter, REG_RRSR+2, rtw_read8(Adapter, REG_RRSR+2)&0xf0);
  103568. +
  103569. + // Set RTS initial rate
  103570. + while(BrateCfg > 0x1)
  103571. + {
  103572. + BrateCfg = (BrateCfg>> 1);
  103573. + RateIndex++;
  103574. + }
  103575. + // Ziv - Check
  103576. + rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex);
  103577. + }
  103578. + break;
  103579. + case HW_VAR_TXPAUSE:
  103580. + rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val));
  103581. + break;
  103582. + case HW_VAR_BCN_FUNC:
  103583. + hw_var_set_bcn_func(Adapter, variable, val);
  103584. + break;
  103585. + case HW_VAR_CORRECT_TSF:
  103586. +#ifdef CONFIG_CONCURRENT_MODE
  103587. + hw_var_set_correct_tsf(Adapter, variable, val);
  103588. +#else
  103589. + {
  103590. + u64 tsf;
  103591. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  103592. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  103593. +
  103594. + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
  103595. + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us
  103596. +
  103597. + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  103598. + {
  103599. + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
  103600. + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
  103601. + StopTxBeacon(Adapter);
  103602. + }
  103603. +
  103604. + //disable related TSF function
  103605. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
  103606. +
  103607. + rtw_write32(Adapter, REG_TSFTR, tsf);
  103608. + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
  103609. +
  103610. + //enable related TSF function
  103611. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
  103612. +
  103613. +
  103614. + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
  103615. + {
  103616. + //pHalData->RegTxPause &= (~STOP_BCNQ);
  103617. + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
  103618. + ResumeTxBeacon(Adapter);
  103619. + }
  103620. + }
  103621. +#endif
  103622. + break;
  103623. + case HW_VAR_CHECK_BSSID:
  103624. + if(*((u8 *)val))
  103625. + {
  103626. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
  103627. + }
  103628. + else
  103629. + {
  103630. + u32 val32;
  103631. +
  103632. + val32 = rtw_read32(Adapter, REG_RCR);
  103633. + val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);
  103634. + rtw_write32(Adapter, REG_RCR, val32);
  103635. + }
  103636. + break;
  103637. + case HW_VAR_MLME_DISCONNECT:
  103638. +#ifdef CONFIG_CONCURRENT_MODE
  103639. + hw_var_set_mlme_disconnect(Adapter, variable, val);
  103640. +#else
  103641. + {
  103642. + //Set RCR to not to receive data frame when NO LINK state
  103643. + //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF);
  103644. + //reject all data frames
  103645. + rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
  103646. +
  103647. + //reset TSF
  103648. + rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));
  103649. +
  103650. + //disable update TSF
  103651. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
  103652. + }
  103653. +#endif
  103654. + break;
  103655. + case HW_VAR_MLME_SITESURVEY:
  103656. + hw_var_set_mlme_sitesurvey(Adapter, variable, val);
  103657. + break;
  103658. + case HW_VAR_MLME_JOIN:
  103659. +#ifdef CONFIG_CONCURRENT_MODE
  103660. + hw_var_set_mlme_join(Adapter, variable, val);
  103661. +#else
  103662. + {
  103663. + u8 RetryLimit = 0x30;
  103664. + u8 type = *((u8 *)val);
  103665. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  103666. +
  103667. + if(type == 0) // prepare to join
  103668. + {
  103669. + //enable to rx data frame.Accept all data frame
  103670. + //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
  103671. + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
  103672. +
  103673. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
  103674. +
  103675. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  103676. + {
  103677. + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48;
  103678. + }
  103679. + else // Ad-hoc Mode
  103680. + {
  103681. + RetryLimit = 0x7;
  103682. + }
  103683. + }
  103684. + else if(type == 1) //joinbss_event call back when join res < 0
  103685. + {
  103686. + rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
  103687. + }
  103688. + else if(type == 2) //sta add event call back
  103689. + {
  103690. + //enable update TSF
  103691. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
  103692. +
  103693. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
  103694. + {
  103695. + //fixed beacon issue for 8191su...........
  103696. + rtw_write8(Adapter,0x542 ,0x02);
  103697. + RetryLimit = 0x7;
  103698. + }
  103699. + }
  103700. +
  103701. + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
  103702. + }
  103703. +#endif
  103704. + break;
  103705. +
  103706. + case HW_VAR_ON_RCR_AM:
  103707. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_AM);
  103708. + DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(Adapter, REG_RCR));
  103709. + break;
  103710. + case HW_VAR_OFF_RCR_AM:
  103711. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)& (~RCR_AM));
  103712. + DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(Adapter, REG_RCR));
  103713. + break;
  103714. +
  103715. + case HW_VAR_BEACON_INTERVAL:
  103716. + rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val));
  103717. + break;
  103718. + case HW_VAR_SLOT_TIME:
  103719. + {
  103720. + u8 u1bAIFS, aSifsTime;
  103721. + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
  103722. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  103723. +
  103724. + rtw_write8(Adapter, REG_SLOT, val[0]);
  103725. +
  103726. + if(pmlmeinfo->WMM_enable == 0)
  103727. + {
  103728. + if( pmlmeext->cur_wireless_mode == WIRELESS_11B)
  103729. + aSifsTime = 10;
  103730. + else
  103731. + aSifsTime = 16;
  103732. +
  103733. + u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime);
  103734. +
  103735. + // <Roger_EXP> Temporary removed, 2008.06.20.
  103736. + rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS);
  103737. + rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS);
  103738. + rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS);
  103739. + rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS);
  103740. + }
  103741. + }
  103742. + break;
  103743. + case HW_VAR_RESP_SIFS:
  103744. + {
  103745. +#if 0
  103746. + // SIFS for OFDM Data ACK
  103747. + rtw_write8(Adapter, REG_SIFS_CTX+1, val[0]);
  103748. + // SIFS for OFDM consecutive tx like CTS data!
  103749. + rtw_write8(Adapter, REG_SIFS_TRX+1, val[1]);
  103750. +
  103751. + rtw_write8(Adapter,REG_SPEC_SIFS+1, val[0]);
  103752. + rtw_write8(Adapter,REG_MAC_SPEC_SIFS+1, val[0]);
  103753. +
  103754. + // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change.
  103755. + rtw_write8(Adapter, REG_R2T_SIFS+1, val[0]); //0x08 - CCK
  103756. + rtw_write8(Adapter, REG_T2T_SIFS+1, val[0]); //0x0e - OFDM
  103757. +#else
  103758. + //SIFS_Timer = 0x0a0a0808;
  103759. + //RESP_SIFS for CCK
  103760. + rtw_write8(Adapter, REG_R2T_SIFS, val[0]); // SIFS_T2T_CCK (0x08)
  103761. + rtw_write8(Adapter, REG_R2T_SIFS+1, val[1]); //SIFS_R2T_CCK(0x08)
  103762. + //RESP_SIFS for OFDM
  103763. + rtw_write8(Adapter, REG_T2T_SIFS, val[2]); //SIFS_T2T_OFDM (0x0a)
  103764. + rtw_write8(Adapter, REG_T2T_SIFS+1, val[3]); //SIFS_R2T_OFDM(0x0a)
  103765. +#endif
  103766. + }
  103767. + break;
  103768. + case HW_VAR_ACK_PREAMBLE:
  103769. + {
  103770. + u8 regTmp;
  103771. + u8 bShortPreamble = *( (PBOOLEAN)val );
  103772. + // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily)
  103773. + regTmp = (pHalData->nCur40MhzPrimeSC)<<5;
  103774. + //regTmp = 0;
  103775. + if(bShortPreamble)
  103776. + regTmp |= 0x80;
  103777. +
  103778. + rtw_write8(Adapter, REG_RRSR+2, regTmp);
  103779. + }
  103780. + break;
  103781. + case HW_VAR_SEC_CFG:
  103782. +#ifdef CONFIG_CONCURRENT_MODE
  103783. + rtw_write8(Adapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
  103784. +#else
  103785. + rtw_write8(Adapter, REG_SECCFG, *((u8 *)val));
  103786. +#endif
  103787. + break;
  103788. + case HW_VAR_DM_FLAG:
  103789. + pdmpriv->DMFlag = *((u8 *)val);
  103790. + break;
  103791. + case HW_VAR_DM_FUNC_OP:
  103792. + if(val[0])
  103793. + {// save dm flag
  103794. + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag;
  103795. + }
  103796. + else
  103797. + {// restore dm flag
  103798. + pdmpriv->DMFlag = pdmpriv->DMFlag_tmp;
  103799. + }
  103800. + break;
  103801. + case HW_VAR_DM_FUNC_SET:
  103802. + pdmpriv->DMFlag |= *((u8 *)val);
  103803. + break;
  103804. + case HW_VAR_DM_FUNC_CLR:
  103805. + pdmpriv->DMFlag &= *((u8 *)val);
  103806. + break;
  103807. + case HW_VAR_CAM_EMPTY_ENTRY:
  103808. + {
  103809. + u8 ucIndex = *((u8 *)val);
  103810. + u8 i;
  103811. + u32 ulCommand=0;
  103812. + u32 ulContent=0;
  103813. + u32 ulEncAlgo=CAM_AES;
  103814. +
  103815. + for(i=0;i<CAM_CONTENT_COUNT;i++)
  103816. + {
  103817. + // filled id in CAM config 2 byte
  103818. + if( i == 0)
  103819. + {
  103820. + ulContent |=(ucIndex & 0x03) | ((u16)(ulEncAlgo)<<2);
  103821. + //ulContent |= CAM_VALID;
  103822. + }
  103823. + else
  103824. + {
  103825. + ulContent = 0;
  103826. + }
  103827. + // polling bit, and No Write enable, and address
  103828. + ulCommand= CAM_CONTENT_COUNT*ucIndex+i;
  103829. + ulCommand= ulCommand | CAM_POLLINIG|CAM_WRITE;
  103830. + // write content 0 is equall to mark invalid
  103831. + rtw_write32(Adapter, WCAMI, ulContent); //delay_ms(40);
  103832. + //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A4: %lx \n",ulContent));
  103833. + rtw_write32(Adapter, RWCAM, ulCommand); //delay_ms(40);
  103834. + //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A0: %lx \n",ulCommand));
  103835. + }
  103836. + }
  103837. + break;
  103838. + case HW_VAR_CAM_INVALID_ALL:
  103839. + rtw_write32(Adapter, RWCAM, BIT(31)|BIT(30));
  103840. + break;
  103841. + case HW_VAR_CAM_WRITE:
  103842. + {
  103843. + u32 cmd;
  103844. + u32 *cam_val = (u32 *)val;
  103845. + rtw_write32(Adapter, WCAMI, cam_val[0]);
  103846. +
  103847. + cmd = CAM_POLLINIG | CAM_WRITE | cam_val[1];
  103848. + rtw_write32(Adapter, RWCAM, cmd);
  103849. + }
  103850. + break;
  103851. + case HW_VAR_AC_PARAM_VO:
  103852. + rtw_write32(Adapter, REG_EDCA_VO_PARAM, ((u32 *)(val))[0]);
  103853. + break;
  103854. + case HW_VAR_AC_PARAM_VI:
  103855. + rtw_write32(Adapter, REG_EDCA_VI_PARAM, ((u32 *)(val))[0]);
  103856. + break;
  103857. + case HW_VAR_AC_PARAM_BE:
  103858. + pHalData->AcParam_BE = ((u32 *)(val))[0];
  103859. + rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]);
  103860. + break;
  103861. + case HW_VAR_AC_PARAM_BK:
  103862. + rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]);
  103863. + break;
  103864. + case HW_VAR_ACM_CTRL:
  103865. + {
  103866. + u8 acm_ctrl = *((u8 *)val);
  103867. + u8 AcmCtrl = rtw_read8( Adapter, REG_ACMHWCTRL);
  103868. +
  103869. + if(acm_ctrl > 1)
  103870. + AcmCtrl = AcmCtrl | 0x1;
  103871. +
  103872. + if(acm_ctrl & BIT(3))
  103873. + AcmCtrl |= AcmHw_VoqEn;
  103874. + else
  103875. + AcmCtrl &= (~AcmHw_VoqEn);
  103876. +
  103877. + if(acm_ctrl & BIT(2))
  103878. + AcmCtrl |= AcmHw_ViqEn;
  103879. + else
  103880. + AcmCtrl &= (~AcmHw_ViqEn);
  103881. +
  103882. + if(acm_ctrl & BIT(1))
  103883. + AcmCtrl |= AcmHw_BeqEn;
  103884. + else
  103885. + AcmCtrl &= (~AcmHw_BeqEn);
  103886. +
  103887. + DBG_871X("[HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl );
  103888. + rtw_write8(Adapter, REG_ACMHWCTRL, AcmCtrl );
  103889. + }
  103890. + break;
  103891. + case HW_VAR_AMPDU_MIN_SPACE:
  103892. + {
  103893. + u8 MinSpacingToSet;
  103894. + u8 SecMinSpace;
  103895. +
  103896. + MinSpacingToSet = *((u8 *)val);
  103897. + if(MinSpacingToSet <= 7)
  103898. + {
  103899. + switch(Adapter->securitypriv.dot11PrivacyAlgrthm)
  103900. + {
  103901. + case _NO_PRIVACY_:
  103902. + case _AES_:
  103903. + SecMinSpace = 0;
  103904. + break;
  103905. +
  103906. + case _WEP40_:
  103907. + case _WEP104_:
  103908. + case _TKIP_:
  103909. + case _TKIP_WTMIC_:
  103910. + SecMinSpace = 6;
  103911. + break;
  103912. + default:
  103913. + SecMinSpace = 7;
  103914. + break;
  103915. + }
  103916. +
  103917. + if(MinSpacingToSet < SecMinSpace){
  103918. + MinSpacingToSet = SecMinSpace;
  103919. + }
  103920. +
  103921. + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", Adapter->MgntInfo.MinSpaceCfg));
  103922. + rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet);
  103923. + }
  103924. + }
  103925. + break;
  103926. + case HW_VAR_AMPDU_FACTOR:
  103927. + {
  103928. + u8 RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9};
  103929. + u8 RegToSet_BT[4]={0x31,0x74,0x42, 0x97};
  103930. + u8 FactorToSet;
  103931. + u8 *pRegToSet;
  103932. + u8 index = 0;
  103933. +
  103934. +#ifdef CONFIG_BT_COEXIST
  103935. + if( (pHalData->bt_coexist.BT_Coexist) &&
  103936. + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) )
  103937. + pRegToSet = RegToSet_BT; // 0x97427431;
  103938. + else
  103939. +#endif
  103940. + pRegToSet = RegToSet_Normal; // 0xb972a841;
  103941. +
  103942. + FactorToSet = *((u8 *)val);
  103943. + if(FactorToSet <= 3)
  103944. + {
  103945. + FactorToSet = (1<<(FactorToSet + 2));
  103946. + if(FactorToSet>0xf)
  103947. + FactorToSet = 0xf;
  103948. +
  103949. + for(index=0; index<4; index++)
  103950. + {
  103951. + if((pRegToSet[index] & 0xf0) > (FactorToSet<<4))
  103952. + pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4);
  103953. +
  103954. + if((pRegToSet[index] & 0x0f) > FactorToSet)
  103955. + pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet);
  103956. +
  103957. + rtw_write8(Adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]);
  103958. + }
  103959. +
  103960. + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet));
  103961. + }
  103962. + }
  103963. + break;
  103964. + case HW_VAR_RXDMA_AGG_PG_TH:
  103965. + #ifdef CONFIG_USB_RX_AGGREGATION
  103966. + {
  103967. + u8 threshold = *((u8 *)val);
  103968. + if( threshold == 0)
  103969. + {
  103970. + threshold = pHalData->UsbRxAggPageCount;
  103971. + }
  103972. + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold);
  103973. + }
  103974. + #endif
  103975. + break;
  103976. + case HW_VAR_SET_RPWM:
  103977. + rtw_write8(Adapter, REG_USB_HRPWM, *((u8 *)val));
  103978. + break;
  103979. + case HW_VAR_H2C_FW_PWRMODE:
  103980. + {
  103981. + u8 psmode = (*(u8 *)val);
  103982. +
  103983. + // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power
  103984. + // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang.
  103985. + if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID)))
  103986. + {
  103987. + rtl8192c_dm_RF_Saving(Adapter, _TRUE);
  103988. + }
  103989. + rtl8192c_set_FwPwrMode_cmd(Adapter, psmode);
  103990. + }
  103991. + break;
  103992. + case HW_VAR_H2C_FW_JOINBSSRPT:
  103993. + {
  103994. + u8 mstatus = (*(u8 *)val);
  103995. + rtl8192c_set_FwJoinBssReport_cmd(Adapter, mstatus);
  103996. + }
  103997. + break;
  103998. +#ifdef CONFIG_P2P_PS
  103999. + case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
  104000. + {
  104001. + u8 p2p_ps_state = (*(u8 *)val);
  104002. + rtl8192c_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state);
  104003. + }
  104004. + break;
  104005. +#endif // CONFIG_P2P_PS
  104006. +#ifdef CONFIG_TDLS
  104007. + case HW_VAR_TDLS_WRCR:
  104008. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)&(~ BIT(6) ));
  104009. + break;
  104010. + case HW_VAR_TDLS_INIT_CH_SEN:
  104011. + {
  104012. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)&(~ BIT(6) )&(~ BIT(7) ));
  104013. + rtw_write16(Adapter, REG_RXFLTMAP2,0xffff);
  104014. +
  104015. + //disable update TSF
  104016. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
  104017. + }
  104018. + break;
  104019. + case HW_VAR_TDLS_DONE_CH_SEN:
  104020. + {
  104021. + //enable update TSF
  104022. + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~ BIT(4)));
  104023. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|(BIT(7) ));
  104024. + }
  104025. + break;
  104026. + case HW_VAR_TDLS_RS_RCR:
  104027. + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|(BIT(6)));
  104028. + break;
  104029. +#endif //CONFIG_TDLS
  104030. + case HW_VAR_INITIAL_GAIN:
  104031. + {
  104032. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  104033. + u32 rx_gain = ((u32 *)(val))[0];
  104034. +
  104035. + if(rx_gain == 0xff){//restore rx gain
  104036. + pDigTable->CurIGValue = pDigTable->BackupIGValue;
  104037. + PHY_SetBBReg(Adapter, rOFDM0_XAAGCCore1, 0x7f,pDigTable->CurIGValue );
  104038. + PHY_SetBBReg(Adapter, rOFDM0_XBAGCCore1, 0x7f,pDigTable->CurIGValue);
  104039. + }
  104040. + else{
  104041. + pDigTable->BackupIGValue = pDigTable->CurIGValue;
  104042. + PHY_SetBBReg(Adapter, rOFDM0_XAAGCCore1, 0x7f,rx_gain );
  104043. + PHY_SetBBReg(Adapter, rOFDM0_XBAGCCore1, 0x7f,rx_gain);
  104044. + pDigTable->CurIGValue = (u8)rx_gain;
  104045. + }
  104046. +
  104047. +
  104048. + }
  104049. + break;
  104050. + case HW_VAR_TRIGGER_GPIO_0:
  104051. + rtl8192cu_trigger_gpio_0(Adapter);
  104052. + break;
  104053. +#ifdef CONFIG_BT_COEXIST
  104054. + case HW_VAR_BT_SET_COEXIST:
  104055. + {
  104056. + u8 bStart = (*(u8 *)val);
  104057. + rtl8192c_set_dm_bt_coexist(Adapter, bStart);
  104058. + }
  104059. + break;
  104060. + case HW_VAR_BT_ISSUE_DELBA:
  104061. + {
  104062. + u8 dir = (*(u8 *)val);
  104063. + rtl8192c_issue_delete_ba(Adapter, dir);
  104064. + }
  104065. + break;
  104066. +#endif
  104067. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  104068. +
  104069. + case HW_VAR_ANTENNA_DIVERSITY_LINK:
  104070. + SwAntDivRestAfterLink8192C(Adapter);
  104071. + break;
  104072. + case HW_VAR_ANTENNA_DIVERSITY_SELECT:
  104073. + {
  104074. + u8 Optimum_antenna = (*(u8 *)val);
  104075. + //switch antenna to Optimum_antenna
  104076. + // DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
  104077. + if(pHalData->CurAntenna != Optimum_antenna)
  104078. + {
  104079. + PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, Optimum_antenna);
  104080. + pHalData->CurAntenna = Optimum_antenna ;
  104081. + //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
  104082. + }
  104083. + }
  104084. + break;
  104085. +#endif
  104086. + case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22.
  104087. + pHalData->EfuseUsedBytes = *((u16 *)val);
  104088. + break;
  104089. + case HW_VAR_FIFO_CLEARN_UP:
  104090. + {
  104091. + #define RW_RELEASE_EN BIT18
  104092. + #define RXDMA_IDLE BIT17
  104093. +
  104094. + struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv;
  104095. + u8 trycnt = 100;
  104096. +
  104097. + //pause tx
  104098. + rtw_write8(Adapter,REG_TXPAUSE,0xff);
  104099. +
  104100. + //keep sn
  104101. + Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter,REG_NQOS_SEQ);
  104102. +
  104103. + if(pwrpriv->bkeepfwalive != _TRUE)
  104104. + {
  104105. + //RX DMA stop
  104106. + rtw_write32(Adapter,REG_RXPKT_NUM,(rtw_read32(Adapter,REG_RXPKT_NUM)|RW_RELEASE_EN));
  104107. + do{
  104108. + if(!(rtw_read32(Adapter,REG_RXPKT_NUM)&RXDMA_IDLE))
  104109. + break;
  104110. + }while(trycnt--);
  104111. + if(trycnt ==0)
  104112. + DBG_8192C("Stop RX DMA failed...... \n");
  104113. +
  104114. + //RQPN Load 0
  104115. + rtw_write16(Adapter,REG_RQPN_NPQ,0x0);
  104116. + rtw_write32(Adapter,REG_RQPN,0x80000000);
  104117. + rtw_mdelay_os(10);
  104118. + }
  104119. + }
  104120. + break;
  104121. + case HW_VAR_WOWLAN:
  104122. +#ifdef CONFIG_WOWLAN
  104123. + {
  104124. + struct wowlan_ioctl_param *poidparam;
  104125. +
  104126. + int res;
  104127. +
  104128. + poidparam = (struct wowlan_ioctl_param *)val;
  104129. + switch (poidparam->subcode){
  104130. + case WOWLAN_PATTERN_MATCH:
  104131. + //Turn on the Pattern Match feature
  104132. + DBG_8192C("\n PATTERN_MATCH poidparam->subcode_value=%d\n",poidparam->subcode_value);
  104133. + if(poidparam->subcode_value==1){
  104134. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)|BIT(1)));
  104135. + Adapter->pwrctrlpriv.wowlan_pattern=_TRUE;
  104136. + DBG_8192C("%s Adapter->pwrctrlpriv.wowlan_pattern=%x\n",__FUNCTION__,Adapter->pwrctrlpriv.wowlan_pattern);
  104137. + }
  104138. + else{
  104139. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)&~BIT(1)));
  104140. + Adapter->pwrctrlpriv.wowlan_pattern=_FALSE;
  104141. + }
  104142. + break;
  104143. + case WOWLAN_MAGIC_PACKET:
  104144. + //Turn on the Magic Packet feature
  104145. + DBG_8192C("\n MAGIC_PACKET poidparam->subcode_value=%d\n",poidparam->subcode_value);
  104146. + if(poidparam->subcode_value==1){
  104147. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)|BIT(2)));
  104148. + Adapter->pwrctrlpriv.wowlan_magic=_TRUE;
  104149. + DBG_8192C("%s Adapter->pwrctrlpriv.wowlan_magic=%x\n",__FUNCTION__,Adapter->pwrctrlpriv.wowlan_magic);
  104150. + }
  104151. + else{
  104152. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)&~BIT(2)));
  104153. + Adapter->pwrctrlpriv.wowlan_magic=_FALSE;
  104154. + }
  104155. + break;
  104156. + case WOWLAN_UNICAST:
  104157. + //Turn on the Unicast wakeup feature
  104158. + if(poidparam->subcode_value==1){
  104159. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)|BIT(3)));
  104160. + Adapter->pwrctrlpriv.wowlan_unicast=_TRUE;
  104161. + }
  104162. + else{
  104163. + //rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)&~BIT(3)));
  104164. + Adapter->pwrctrlpriv.wowlan_unicast=_FALSE;
  104165. + DBG_8192C("%s Adapter->pwrctrlpriv.wowlan_unicast=%x\n",__FUNCTION__,Adapter->pwrctrlpriv.wowlan_unicast);
  104166. + }
  104167. + break;
  104168. + case WOWLAN_SET_PATTERN:
  104169. + //Setting the Pattern for wowlan
  104170. + res=rtw_wowlan_set_pattern(Adapter,poidparam->pattern);
  104171. + if(res)
  104172. + DBG_8192C("rtw_wowlan_set_pattern retern value=0x%x",res);
  104173. + break;
  104174. + case WOWLAN_DUMP_REG:
  104175. + //dump the WKFMCAM and WOW_CTRL register
  104176. + /*DBG_8192C("\n\n\n\n rtw_wowlan_ctrl: WOW_CTRL=0x%x \n",rtw_read8(Adapter, REG_WOW_CTRL));
  104177. + DBG_8192C("print WKFMCAM index =%d ",poidparam->data[0]);
  104178. + { int cmd=0,offset=0;
  104179. + for(offset=0;offset<5;offset++){
  104180. + cmd=BIT(31)|(poidparam->data[0]+offset);
  104181. + rtw_write32(Adapter, REG_WKFMCAM_CMD, cmd);
  104182. + DBG_8192C("offset[%d]=0x%.8x ",offset,rtw_read32(Adapter, REG_WKFMCAM_RWD));
  104183. + DBG_8192C("offset[%d]=MSB 0x%x:0x%x:0x%x:0x%x ",offset,rtw_read8(Adapter, REG_WKFMCAM_RWD+3),rtw_read8(Adapter, REG_WKFMCAM_RWD+2),rtw_read8(Adapter, REG_WKFMCAM_RWD+1),rtw_read8(Adapter, REG_WKFMCAM_RWD));
  104184. + }
  104185. + }*/
  104186. +
  104187. + break;
  104188. + case WOWLAN_ENABLE:
  104189. + SetFwRelatedForWoWLAN8192CU(Adapter, _TRUE);
  104190. + //Set Pattern
  104191. + if(Adapter->pwrctrlpriv.wowlan_pattern==_TRUE)
  104192. + rtw_wowlan_reload_pattern(Adapter);
  104193. + rtl8192c_set_wowlan_cmd(Adapter);
  104194. + rtw_write8(Adapter, 0x6, rtw_read8(Adapter, 0x6)|BIT(3));
  104195. + rtw_msleep_os(10);
  104196. + //DBG_8192C(" \n REG_WOW_CTRL=0x%x \n",rtw_read8(Adapter, REG_WOW_CTRL));
  104197. +// if(rtw_read8(Adapter, REG_WOW_CTRL)==0)
  104198. +// rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)|BIT(1)|BIT(2)|BIT(3)));
  104199. + //DBG_8192C(" \n REG_WOW_CTRL=0x%x \n",rtw_read8(Adapter, REG_WOW_CTRL));
  104200. + break;
  104201. +
  104202. + case WOWLAN_DISABLE:
  104203. + Adapter->pwrctrlpriv.wowlan_mode=_FALSE;
  104204. + rtl8192c_set_wowlan_cmd(Adapter);
  104205. + rtw_msleep_os(10);
  104206. + break;
  104207. +
  104208. + case WOWLAN_STATUS:
  104209. + poidparam->wakeup_reason = rtw_read8(Adapter, REG_WOWLAN_REASON);
  104210. + DBG_8192C("wake on wlan reason 0x%02x\n", poidparam->wakeup_reason);
  104211. + break;
  104212. +
  104213. + default:
  104214. + break;
  104215. + }
  104216. + if (Adapter->pwrctrlpriv.wowlan_unicast||Adapter->pwrctrlpriv.wowlan_magic || Adapter->pwrctrlpriv.wowlan_pattern)
  104217. + Adapter->pwrctrlpriv.wowlan_mode =_TRUE;
  104218. + else
  104219. + Adapter->pwrctrlpriv.wowlan_mode =_FALSE;
  104220. + }
  104221. +
  104222. + break;
  104223. +#endif //CONFIG_WOWLAN
  104224. + case HW_VAR_CHECK_TXBUF:
  104225. +#ifdef CONFIG_CONCURRENT_MODE
  104226. + {
  104227. + int i;
  104228. + u8 RetryLimit = 0x01;
  104229. +
  104230. + //rtw_write16(Adapter, REG_RL,0x0101);
  104231. + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
  104232. +
  104233. + for(i=0;i<1000;i++)
  104234. + {
  104235. + if(rtw_read32(Adapter, 0x200) != rtw_read32(Adapter, 0x204))
  104236. + {
  104237. + //DBG_871X("packet in tx packet buffer - 0x204=%x, 0x200=%x (%d)\n", rtw_read32(Adapter, 0x204), rtw_read32(Adapter, 0x200), i);
  104238. + rtw_msleep_os(10);
  104239. + }
  104240. + else
  104241. + {
  104242. + DBG_871X("no packet in tx packet buffer (%d)\n", i);
  104243. + break;
  104244. + }
  104245. + }
  104246. +
  104247. + RetryLimit = 0x30;
  104248. + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
  104249. +
  104250. + }
  104251. +#endif
  104252. + break;
  104253. + case HW_VAR_BCN_VALID:
  104254. + //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2, write 1 to clear, Clear by sw
  104255. + rtw_write8(Adapter, REG_TDECTRL+2, rtw_read8(Adapter, REG_TDECTRL+2) | BIT0);
  104256. + break;
  104257. + case HW_VAR_USB_RXAGG_PAGE_TO:
  104258. + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, *((u8 *)val));
  104259. + break;
  104260. + default:
  104261. + break;
  104262. + }
  104263. +
  104264. +_func_exit_;
  104265. +}
  104266. +
  104267. +void GetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val)
  104268. +{
  104269. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  104270. +
  104271. +_func_enter_;
  104272. +
  104273. + switch(variable)
  104274. + {
  104275. + case HW_VAR_BASIC_RATE:
  104276. + *((u16 *)(val)) = pHalData->BasicRateSet;
  104277. + case HW_VAR_TXPAUSE:
  104278. + val[0] = rtw_read8(Adapter, REG_TXPAUSE);
  104279. + break;
  104280. + case HW_VAR_BCN_VALID:
  104281. + //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2
  104282. + val[0] = (BIT0 & rtw_read8(Adapter, REG_TDECTRL+2))?_TRUE:_FALSE;
  104283. + break;
  104284. + case HW_VAR_DM_FLAG:
  104285. + val[0] = pHalData->dmpriv.DMFlag;
  104286. + break;
  104287. + case HW_VAR_RF_TYPE:
  104288. + val[0] = pHalData->rf_type;
  104289. + break;
  104290. + case HW_VAR_FWLPS_RF_ON:
  104291. + {
  104292. + //When we halt NIC, we should check if FW LPS is leave.
  104293. + u32 valRCR;
  104294. +
  104295. + if(Adapter->pwrctrlpriv.rf_pwrstate == rf_off)
  104296. + {
  104297. + // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave,
  104298. + // because Fw is unload.
  104299. + val[0] = _TRUE;
  104300. + }
  104301. + else
  104302. + {
  104303. + valRCR = rtw_read32(Adapter, REG_RCR);
  104304. + valRCR &= 0x00070000;
  104305. + if(valRCR)
  104306. + val[0] = _FALSE;
  104307. + else
  104308. + val[0] = _TRUE;
  104309. + }
  104310. + }
  104311. + break;
  104312. +#ifdef CONFIG_ANTENNA_DIVERSITY
  104313. + case HW_VAR_CURRENT_ANTENNA:
  104314. + val[0] = pHalData->CurAntenna;
  104315. + break;
  104316. +#endif
  104317. + case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22.
  104318. + *((u16 *)(val)) = pHalData->EfuseUsedBytes;
  104319. + break;
  104320. + case HW_VAR_VID:
  104321. + *((u16 *)(val)) = pHalData->EEPROMVID;
  104322. + break;
  104323. + case HW_VAR_PID:
  104324. + *((u16 *)(val)) = pHalData->EEPROMPID;
  104325. + break;
  104326. + default:
  104327. + break;
  104328. + }
  104329. +
  104330. +_func_exit_;
  104331. +}
  104332. +
  104333. +//
  104334. +// Description:
  104335. +// Query setting of specified variable.
  104336. +//
  104337. +u8
  104338. +GetHalDefVar8192CUsb(
  104339. + IN PADAPTER Adapter,
  104340. + IN HAL_DEF_VARIABLE eVariable,
  104341. + IN PVOID pValue
  104342. + )
  104343. +{
  104344. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  104345. + u8 bResult = _TRUE;
  104346. +
  104347. + switch(eVariable)
  104348. + {
  104349. + case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
  104350. +#if 0 //trunk
  104351. + {
  104352. + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
  104353. + struct sta_priv * pstapriv = &Adapter->stapriv;
  104354. + struct sta_info * psta;
  104355. + psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
  104356. + if(psta)
  104357. + {
  104358. + *((int *)pValue) = psta->rssi_stat.UndecoratedSmoothedPWDB;
  104359. + }
  104360. + }
  104361. +#else //v4 branch
  104362. + //if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){
  104363. + *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB;
  104364. + //}
  104365. + //else{
  104366. +
  104367. + //}
  104368. +#endif
  104369. + break;
  104370. + case HAL_DEF_IS_SUPPORT_ANT_DIV:
  104371. + #ifdef CONFIG_ANTENNA_DIVERSITY
  104372. + *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE;
  104373. + #endif
  104374. + break;
  104375. + case HAL_DEF_CURRENT_ANTENNA:
  104376. + #ifdef CONFIG_ANTENNA_DIVERSITY
  104377. + *(( u8*)pValue) = pHalData->CurAntenna;
  104378. + #endif
  104379. + break;
  104380. + case HAL_DEF_DRVINFO_SZ:
  104381. + *(( u32*)pValue) = DRVINFO_SZ;
  104382. + break;
  104383. + case HAL_DEF_MAX_RECVBUF_SZ:
  104384. + *(( u32*)pValue) = MAX_RECVBUF_SZ;
  104385. + break;
  104386. + case HAL_DEF_RX_PACKET_OFFSET:
  104387. + *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ;
  104388. + break;
  104389. + case HAL_DEF_DBG_DUMP_RXPKT:
  104390. + *(( u8*)pValue) = pHalData->bDumpRxPkt;
  104391. + break;
  104392. + case HAL_DEF_DBG_DM_FUNC:
  104393. + *(( u8*)pValue) = pHalData->dmpriv.DMFlag;
  104394. + break;
  104395. + default:
  104396. + //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): Unkown variable: %d!\n", eVariable));
  104397. + bResult = _FALSE;
  104398. + break;
  104399. + }
  104400. +
  104401. + return bResult;
  104402. +}
  104403. +
  104404. +
  104405. +
  104406. +
  104407. +//
  104408. +// Description:
  104409. +// Change default setting of specified variable.
  104410. +//
  104411. +u8
  104412. +SetHalDefVar8192CUsb(
  104413. + IN PADAPTER Adapter,
  104414. + IN HAL_DEF_VARIABLE eVariable,
  104415. + IN PVOID pValue
  104416. + )
  104417. +{
  104418. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  104419. + u8 bResult = _TRUE;
  104420. +
  104421. + switch(eVariable)
  104422. + {
  104423. + case HAL_DEF_DBG_DUMP_RXPKT:
  104424. + pHalData->bDumpRxPkt = *(( u8*)pValue);
  104425. + break;
  104426. + case HAL_DEF_DBG_DM_FUNC:
  104427. + {
  104428. + u8 dm_func = *(( u8*)pValue);
  104429. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  104430. +
  104431. + if(dm_func == 0){ //disable all dynamic func
  104432. + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
  104433. + DBG_8192C("==> Disable all dynamic function...\n");
  104434. + }
  104435. + else if(dm_func == 1){//disable DIG
  104436. + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_DIG);
  104437. + DBG_8192C("==> Disable DIG...\n");
  104438. + }
  104439. + else if(dm_func == 2){//disable High power
  104440. + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_HP);
  104441. + }
  104442. + else if(dm_func == 3){//disable tx power tracking
  104443. + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_SS);
  104444. + DBG_8192C("==> Disable tx power tracking...\n");
  104445. + }
  104446. + else if(dm_func == 4){//disable BT coexistence
  104447. + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT);
  104448. + }
  104449. + else if(dm_func == 5){//disable antenna diversity
  104450. + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_ANT_DIV);
  104451. + }
  104452. + else if(dm_func == 6){//turn on all dynamic func
  104453. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG))
  104454. + {
  104455. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  104456. + DIG_T *pDigTable = &pdmpriv->DM_DigTable;
  104457. + pDigTable->PreIGValue = rtw_read8(Adapter,0xc50);
  104458. + }
  104459. +
  104460. + pdmpriv->DMFlag |= (DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS|
  104461. + DYNAMIC_FUNC_BT|DYNAMIC_FUNC_ANT_DIV) ;
  104462. + DBG_8192C("==> Turn on all dynamic function...\n");
  104463. + }
  104464. + }
  104465. + break;
  104466. + default:
  104467. + //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable));
  104468. + bResult = _FALSE;
  104469. + break;
  104470. + }
  104471. +
  104472. + return bResult;
  104473. +}
  104474. +
  104475. +u32 _update_92cu_basic_rate(_adapter *padapter, unsigned int mask)
  104476. +{
  104477. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  104478. +#ifdef CONFIG_BT_COEXIST
  104479. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  104480. +#endif
  104481. + unsigned int BrateCfg = 0;
  104482. +
  104483. +#ifdef CONFIG_BT_COEXIST
  104484. + if( (pbtpriv->BT_Coexist) && (pbtpriv->BT_CoexistType == BT_CSR_BC4) )
  104485. + {
  104486. + BrateCfg = mask & 0x151;
  104487. + //DBG_8192C("BT temp disable cck 2/5.5/11M, (0x%x = 0x%x)\n", REG_RRSR, BrateCfg & 0x151);
  104488. + }
  104489. + else
  104490. +#endif
  104491. + {
  104492. + if(pHalData->VersionID != VERSION_TEST_CHIP_88C)
  104493. + BrateCfg = mask & 0x15F;
  104494. + else //for 88CU 46PING setting, Disable CCK 2M, 5.5M, Others must tuning
  104495. + BrateCfg = mask & 0x159;
  104496. + }
  104497. +
  104498. + BrateCfg |= 0x01; // default enable 1M ACK rate
  104499. +
  104500. + return BrateCfg;
  104501. +}
  104502. +
  104503. +void _update_response_rate(_adapter *padapter,unsigned int mask)
  104504. +{
  104505. + u8 RateIndex = 0;
  104506. + // Set RRSR rate table.
  104507. + rtw_write8(padapter, REG_RRSR, mask&0xff);
  104508. + rtw_write8(padapter,REG_RRSR+1, (mask>>8)&0xff);
  104509. +
  104510. +
  104511. + // Set RTS initial rate
  104512. + while(mask > 0x1)
  104513. + {
  104514. + mask = (mask>> 1);
  104515. + RateIndex++;
  104516. + }
  104517. + rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
  104518. +}
  104519. +
  104520. +void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id)
  104521. +{
  104522. + //volatile unsigned int result;
  104523. + u8 init_rate=0;
  104524. + u8 networkType, raid;
  104525. + u32 mask;
  104526. + u8 shortGIrate = _FALSE;
  104527. + int supportRateNum = 0;
  104528. + struct sta_info *psta;
  104529. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  104530. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  104531. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  104532. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  104533. + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
  104534. +#ifdef CONFIG_BT_COEXIST
  104535. + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
  104536. +#endif
  104537. +
  104538. + if (mac_id >= NUM_STA) //CAM_SIZE
  104539. + {
  104540. + return;
  104541. + }
  104542. +
  104543. + psta = pmlmeinfo->FW_sta_info[mac_id].psta;
  104544. + if(psta == NULL)
  104545. + {
  104546. + return;
  104547. + }
  104548. +
  104549. + switch (mac_id)
  104550. + {
  104551. + case 0:// for infra mode
  104552. +#ifdef CONFIG_CONCURRENT_MODE
  104553. + case 2:// first station uses macid=0, second station uses macid=2
  104554. +#endif
  104555. + supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates);
  104556. + networkType = judge_network_type(padapter, cur_network->SupportedRates, supportRateNum) & 0xf;
  104557. + //pmlmeext->cur_wireless_mode = networkType;
  104558. + raid = networktype_to_raid(networkType);
  104559. +
  104560. + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
  104561. + mask |= (pmlmeinfo->HT_enable)? update_MSC_rate(&(pmlmeinfo->HT_caps)): 0;
  104562. + mask |= ((raid<<28)&0xf0000000);
  104563. +
  104564. + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps)))
  104565. + {
  104566. + shortGIrate = _TRUE;
  104567. + }
  104568. +
  104569. + break;
  104570. +
  104571. + case 1://for broadcast/multicast
  104572. + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
  104573. + if(pmlmeext->cur_wireless_mode & WIRELESS_11B)
  104574. + networkType = WIRELESS_11B;
  104575. + else
  104576. + networkType = WIRELESS_11G;
  104577. + raid = networktype_to_raid(networkType);
  104578. +
  104579. + mask = update_basic_rate(cur_network->SupportedRates, supportRateNum);
  104580. + mask |= ((raid<<28)&0xf0000000);
  104581. +
  104582. + break;
  104583. +
  104584. + default: //for each sta in IBSS
  104585. +#ifdef CONFIG_TDLS
  104586. + if(psta->tdls_sta_state & TDLS_LINKED_STATE)
  104587. + {
  104588. + shortGIrate = update_sgi_tdls(padapter, psta);
  104589. + mask = update_mask_tdls(padapter, psta);
  104590. + raid = mask>>28;
  104591. + break;
  104592. + }
  104593. + else
  104594. +#endif //CONFIG_TDLS
  104595. + {
  104596. + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
  104597. + networkType = judge_network_type(padapter, pmlmeinfo->FW_sta_info[mac_id].SupportedRates, supportRateNum) & 0xf;
  104598. + //pmlmeext->cur_wireless_mode = networkType;
  104599. + raid = networktype_to_raid(networkType);
  104600. +
  104601. + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
  104602. + mask |= ((raid<<28)&0xf0000000);
  104603. +
  104604. + //todo: support HT in IBSS
  104605. +
  104606. + break;
  104607. + }
  104608. + }
  104609. +
  104610. +#ifdef CONFIG_BT_COEXIST
  104611. + if( (pbtpriv->BT_Coexist) &&
  104612. + (pbtpriv->BT_CoexistType == BT_CSR_BC4) &&
  104613. + (pbtpriv->BT_CUR_State) &&
  104614. + (pbtpriv->BT_Ant_isolation) &&
  104615. + ((pbtpriv->BT_Service==BT_SCO)||
  104616. + (pbtpriv->BT_Service==BT_Busy)) )
  104617. + mask &= 0xffffcfc0;
  104618. + else
  104619. +#endif
  104620. + mask &=0xffffffff;
  104621. +
  104622. +
  104623. + init_rate = get_highest_rate_idx(mask)&0x3f;
  104624. +
  104625. + if(pHalData->fw_ractrl == _TRUE)
  104626. + {
  104627. + u8 arg = 0;
  104628. +
  104629. + //arg = (cam_idx-4)&0x1f;//MACID
  104630. + arg = mac_id&0x1f;//MACID
  104631. +
  104632. + arg |= BIT(7);
  104633. +
  104634. + if (shortGIrate==_TRUE)
  104635. + arg |= BIT(5);
  104636. +
  104637. + DBG_871X("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg);
  104638. + psta->ra_mask=mask;
  104639. +#ifdef CONFIG_INTEL_PROXIM
  104640. + if(padapter->proximity.proxim_on ==_TRUE){
  104641. + arg &= ~BIT(6);
  104642. + }
  104643. + else {
  104644. + arg |= BIT(6);
  104645. + }
  104646. +#endif //CONFIG_INTEL_PROXIM
  104647. + rtl8192c_set_raid_cmd(padapter, mask, arg);
  104648. +
  104649. + }
  104650. + else
  104651. + {
  104652. + if (shortGIrate==_TRUE)
  104653. + init_rate |= BIT(6);
  104654. +
  104655. + rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate);
  104656. + }
  104657. +
  104658. +
  104659. + //set ra_id
  104660. + psta->raid = raid;
  104661. + psta->init_rate = init_rate;
  104662. +
  104663. + //set correct initial date rate for each mac_id
  104664. + pdmpriv->INIDATA_RATE[mac_id] = init_rate;
  104665. +}
  104666. +
  104667. +void SetBeaconRelatedRegisters8192CUsb(PADAPTER padapter)
  104668. +{
  104669. + u32 value32;
  104670. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  104671. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  104672. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  104673. +
  104674. + //reset TSF, enable update TSF, correcting TSF On Beacon
  104675. +
  104676. + //REG_BCN_INTERVAL
  104677. + //REG_BCNDMATIM
  104678. + //REG_ATIMWND
  104679. + //REG_TBTT_PROHIBIT
  104680. + //REG_DRVERLYINT
  104681. + //REG_BCN_MAX_ERR
  104682. + //REG_BCNTCFG //(0x510)
  104683. + //REG_DUAL_TSF_RST
  104684. + //REG_BCN_CTRL //(0x550)
  104685. +
  104686. + //BCN interval
  104687. + rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval);
  104688. + rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms
  104689. +
  104690. + _InitBeaconParameters(padapter);
  104691. +
  104692. + rtw_write8(padapter, REG_SLOT, 0x09);
  104693. +
  104694. + value32 =rtw_read32(padapter, REG_TCR);
  104695. + value32 &= ~TSFRST;
  104696. + rtw_write32(padapter, REG_TCR, value32);
  104697. +
  104698. + value32 |= TSFRST;
  104699. + rtw_write32(padapter, REG_TCR, value32);
  104700. +
  104701. + // NOTE: Fix test chip's bug (about contention windows's randomness)
  104702. + rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50);
  104703. + rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50);
  104704. +
  104705. + _BeaconFunctionEnable(padapter, _TRUE, _TRUE);
  104706. +
  104707. + ResumeTxBeacon(padapter);
  104708. +
  104709. + //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6));
  104710. +
  104711. + //rtw_write8(padapter, 0x541, 0xff);
  104712. +
  104713. + //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0));
  104714. +
  104715. + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(1));
  104716. +
  104717. +}
  104718. +
  104719. +static void rtl8192cu_init_default_value(_adapter * padapter)
  104720. +{
  104721. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  104722. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  104723. + struct dm_priv *pdmpriv = &pHalData->dmpriv;
  104724. + u8 i;
  104725. +
  104726. + //init default value
  104727. + pHalData->fw_ractrl = _FALSE;
  104728. + pHalData->bIQKInitialized = _FALSE;
  104729. + if(!pwrctrlpriv->bkeepfwalive)
  104730. + pHalData->LastHMEBoxNum = 0;
  104731. +
  104732. + pHalData->bIQKInitialized = _FALSE;
  104733. + //init dm default value
  104734. + pdmpriv->TM_Trigger = 0;
  104735. + pdmpriv->binitialized = _FALSE;
  104736. + pdmpriv->prv_traffic_idx = 3;
  104737. + pdmpriv->initialize = 0;
  104738. +
  104739. + pdmpriv->ThermalValue_HP_index = 0;
  104740. + for(i = 0; i < HP_THERMAL_NUM; i++)
  104741. + pdmpriv->ThermalValue_HP[i] = 0;
  104742. +}
  104743. +
  104744. +static u8 rtl8192cu_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val)
  104745. +{
  104746. + u8 bResult = _TRUE;
  104747. + switch(efunc_id){
  104748. +
  104749. + #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED)
  104750. + case HAL_USB_SELECT_SUSPEND:
  104751. + {
  104752. + u8 bfwpoll = *(( u8*)val);
  104753. + rtl8192c_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect
  104754. + }
  104755. + break;
  104756. + #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED
  104757. +
  104758. + default:
  104759. + break;
  104760. + }
  104761. + return bResult;
  104762. +}
  104763. +
  104764. +void rtl8192cu_set_hal_ops(_adapter * padapter)
  104765. +{
  104766. + struct hal_ops *pHalFunc = &padapter->HalFunc;
  104767. +
  104768. +_func_enter_;
  104769. +
  104770. + padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE));
  104771. + if(padapter->HalData == NULL){
  104772. + DBG_8192C("cant not alloc memory for HAL DATA \n");
  104773. + }
  104774. + //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE));
  104775. + padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
  104776. +
  104777. + pHalFunc->hal_init = &rtl8192cu_hal_init;
  104778. + pHalFunc->hal_deinit = &rtl8192cu_hal_deinit;
  104779. +
  104780. + //pHalFunc->free_hal_data = &rtl8192c_free_hal_data;
  104781. +
  104782. + pHalFunc->inirp_init = &rtl8192cu_inirp_init;
  104783. + pHalFunc->inirp_deinit = &rtl8192cu_inirp_deinit;
  104784. +
  104785. + pHalFunc->init_xmit_priv = &rtl8192cu_init_xmit_priv;
  104786. + pHalFunc->free_xmit_priv = &rtl8192cu_free_xmit_priv;
  104787. +
  104788. + pHalFunc->init_recv_priv = &rtl8192cu_init_recv_priv;
  104789. + pHalFunc->free_recv_priv = &rtl8192cu_free_recv_priv;
  104790. +#ifdef CONFIG_SW_LED
  104791. + pHalFunc->InitSwLeds = &rtl8192cu_InitSwLeds;
  104792. + pHalFunc->DeInitSwLeds = &rtl8192cu_DeInitSwLeds;
  104793. +#else //case of hw led or no led
  104794. + pHalFunc->InitSwLeds = NULL;
  104795. + pHalFunc->DeInitSwLeds = NULL;
  104796. +#endif//CONFIG_SW_LED
  104797. +
  104798. + //pHalFunc->dm_init = &rtl8192c_init_dm_priv;
  104799. + //pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv;
  104800. +
  104801. + pHalFunc->init_default_value = &rtl8192cu_init_default_value;
  104802. + pHalFunc->intf_chip_configure = &rtl8192cu_interface_configure;
  104803. + pHalFunc->read_adapter_info = &ReadAdapterInfo8192CU;
  104804. +
  104805. + //pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C;
  104806. + //pHalFunc->set_channel_handler = &PHY_SwChnl8192C;
  104807. +
  104808. + //pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog;
  104809. +
  104810. + pHalFunc->SetHwRegHandler = &SetHwReg8192CU;
  104811. + pHalFunc->GetHwRegHandler = &GetHwReg8192CU;
  104812. + pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb;
  104813. + pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb;
  104814. +
  104815. + pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb;
  104816. + pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8192CUsb;
  104817. +
  104818. + //pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid;
  104819. +
  104820. +//#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  104821. + //pHalFunc->AntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C;
  104822. + //pHalFunc->AntDivCompareHandler = &SwAntDivCompare8192C;
  104823. +//#endif
  104824. +
  104825. + pHalFunc->hal_xmit = &rtl8192cu_hal_xmit;
  104826. + pHalFunc->mgnt_xmit = &rtl8192cu_mgnt_xmit;
  104827. + pHalFunc->hal_xmitframe_enqueue = &rtl8192cu_hal_xmitframe_enqueue;
  104828. +
  104829. + //pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg;
  104830. + //pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg;
  104831. + //pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg;
  104832. + //pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg;
  104833. +
  104834. +#ifdef CONFIG_HOSTAPD_MLME
  104835. + pHalFunc->hostap_mgnt_xmit_entry = &rtl8192cu_hostap_mgnt_xmit_entry;
  104836. +#endif
  104837. + pHalFunc->interface_ps_func = &rtl8192cu_ps_func;
  104838. +
  104839. + rtl8192c_set_hal_ops(pHalFunc);
  104840. +_func_exit_;
  104841. +
  104842. +}
  104843. --- /dev/null
  104844. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c
  104845. @@ -0,0 +1,1205 @@
  104846. +/******************************************************************************
  104847. + *
  104848. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  104849. + *
  104850. + * This program is free software; you can redistribute it and/or modify it
  104851. + * under the terms of version 2 of the GNU General Public License as
  104852. + * published by the Free Software Foundation.
  104853. + *
  104854. + * This program is distributed in the hope that it will be useful, but WITHOUT
  104855. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  104856. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  104857. + * more details.
  104858. + *
  104859. + * You should have received a copy of the GNU General Public License along with
  104860. + * this program; if not, write to the Free Software Foundation, Inc.,
  104861. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  104862. + *
  104863. + *
  104864. + ******************************************************************************/
  104865. +#define _HCI_OPS_OS_C_
  104866. +
  104867. +#include <drv_conf.h>
  104868. +#include <osdep_service.h>
  104869. +#include <drv_types.h>
  104870. +#include <osdep_intf.h>
  104871. +
  104872. +#ifndef PLATFORM_OS_CE
  104873. + #error "PLATFORM_OS_CE shall be set \n"
  104874. +#endif
  104875. +
  104876. +#ifndef CONFIG_USB_HCI
  104877. + #error "CONFIG_USB_HCI shall be on!\n"
  104878. +#endif
  104879. +
  104880. +#include <usb_ops.h>
  104881. +#include <recv_osdep.h>
  104882. +
  104883. +#include <circ_buf.h>
  104884. +
  104885. +
  104886. +struct zero_bulkout_context
  104887. +{
  104888. + void *pbuf;
  104889. + void *purb;
  104890. + void *pirp;
  104891. + void *padapter;
  104892. +};
  104893. +
  104894. +
  104895. +
  104896. +#define PUSB_ERROR LPDWORD
  104897. +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3)
  104898. +
  104899. +
  104900. +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr);
  104901. +
  104902. +
  104903. +static NTSTATUS usb_async_interrupt_in_complete( LPVOID Context );
  104904. +static NTSTATUS usb_async_interrupt_out_complete( LPVOID Context );
  104905. +
  104906. +DWORD usb_write_port_complete( LPVOID Context );
  104907. +DWORD usb_read_port_complete( LPVOID Context );
  104908. +
  104909. +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  104910. +{
  104911. +_func_enter_;
  104912. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  104913. +_func_exit_;
  104914. +}
  104915. +
  104916. +
  104917. +
  104918. +BOOL
  104919. +CloseTransferHandle(
  104920. + LPCUSB_FUNCS pUsbFuncs,
  104921. + USB_TRANSFER hTransfer
  104922. + )
  104923. +{
  104924. + BOOL bRc = TRUE;
  104925. +
  104926. + // This assert may fail on suprise remove,
  104927. + // but should pass during normal I/O.
  104928. + // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );
  104929. +
  104930. + // CloseTransfer aborts any pending transfers
  104931. + if ( !pUsbFuncs->lpCloseTransfer(hTransfer) ) {
  104932. +
  104933. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError()));
  104934. + bRc = FALSE;
  104935. + }
  104936. +
  104937. + return bRc;
  104938. +}
  104939. +
  104940. +
  104941. +BOOL
  104942. +GetTransferStatus(
  104943. + LPCUSB_FUNCS pUsbFuncs,
  104944. + USB_TRANSFER hTransfer,
  104945. + LPDWORD pBytesTransferred , // OPTIONAL returns number of bytes transferred
  104946. + PUSB_ERROR pUsbError // returns USB error code
  104947. + )
  104948. +{
  104949. +
  104950. + BOOL bRc = TRUE;
  104951. +
  104952. + if ( pUsbFuncs->lpGetTransferStatus(hTransfer, pBytesTransferred, pUsbError) ) {
  104953. + if ( USB_NO_ERROR != *pUsbError ) {
  104954. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError()));
  104955. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("GetTransferStatus (BytesTransferred:%d, UsbError:0x%x)\n", pBytesTransferred?*pBytesTransferred:-1, pUsbError?*pUsbError:-1 ));
  104956. + }
  104957. + } else {
  104958. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_,("*** GetTransferStatus ERROR:%d ***\n", GetLastError()));
  104959. + *pUsbError = USB_CANCELED_ERROR;
  104960. + bRc = FALSE;
  104961. + }
  104962. +
  104963. + return bRc;
  104964. +}
  104965. +
  104966. +
  104967. +// The driver should never read RxCmd register. We have to set
  104968. +// RCR CMDHAT0 (bit6) to append Rx status before the Rx frame.
  104969. +//
  104970. +// |<-------- pBulkUrb->TransferBufferLength ------------>|
  104971. +// +------------------+-------------------+------------+
  104972. +// | Rx status (16 bytes) | Rx frame ..... | CRC(4 bytes) |
  104973. +// +------------------+-------------------+------------+
  104974. +// ^
  104975. +// ^pRfd->Buffer.VirtualAddress
  104976. +//
  104977. +/*! \brief USB RX IRP Complete Routine.
  104978. + @param Context pointer of RT_RFD
  104979. +*/
  104980. +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  104981. +{
  104982. + struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
  104983. + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev;
  104984. + _adapter *adapter = (_adapter *)pdvobj_priv->padapter;
  104985. +
  104986. + struct recv_priv *precvpriv = &adapter->recvpriv;
  104987. +
  104988. + struct recv_buf *precvbuf = (struct recv_buf *)rmem;
  104989. + DWORD dwErr = ERROR_SUCCESS ;
  104990. + DWORD dwBytesTransferred = 0 ;
  104991. + USB_TRANSFER hTransfer = NULL;
  104992. + USB_PIPE hPipe;
  104993. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  104994. +
  104995. +_func_enter_;
  104996. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__));
  104997. +
  104998. +#if (CONFIG_PWRCTRL == 1)
  104999. + if (adapter->pwrctrlpriv.pnp_bstop_trx)
  105000. + {
  105001. + return _FALSE;
  105002. + }
  105003. +#endif
  105004. +
  105005. + if(adapter->bDriverStopped || adapter->bSurpriseRemoved)
  105006. + {
  105007. + RT_TRACE(_module_hci_ops_os_c_, _drv_info_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved)!!!\n"));
  105008. + return _FALSE;
  105009. + }
  105010. +
  105011. + if(precvbuf !=NULL)
  105012. + {
  105013. +
  105014. + // get a recv buffer
  105015. + rtl8192cu_init_recvbuf(adapter, precvbuf);
  105016. +
  105017. +
  105018. +
  105019. + _rtw_spinlock(&precvpriv->lock);
  105020. + precvpriv->rx_pending_cnt++;
  105021. + precvbuf->irp_pending = _TRUE;
  105022. + _rtw_spinunlock(&precvpriv->lock);
  105023. +
  105024. +
  105025. + //translate DMA FIFO addr to pipehandle
  105026. + hPipe = ffaddr2pipehdl(pdvobj_priv, addr);
  105027. +
  105028. +
  105029. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__));
  105030. +
  105031. + precvbuf->usb_transfer_read_port = (*usb_funcs_vp->lpIssueBulkTransfer)(
  105032. + hPipe,
  105033. + usb_read_port_complete,
  105034. + precvbuf,
  105035. + USB_IN_TRANSFER|USB_SHORT_TRANSFER_OK,
  105036. + MAX_RECVBUF_SZ,
  105037. + precvbuf->pbuf,
  105038. + 0);
  105039. +
  105040. +
  105041. + if(precvbuf->usb_transfer_read_port)
  105042. + {
  105043. +
  105044. + // GetTransferStatus(usb_funcs_vp, hTransfer, &dwBytesTransferred,&UsbRc);
  105045. +
  105046. + // CloseTransferHandle(usb_funcs_vp, hTransfer);
  105047. +
  105048. + }
  105049. + else
  105050. + {
  105051. +
  105052. + dwErr = GetLastError();
  105053. + //RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr));
  105054. +
  105055. + }
  105056. +
  105057. +// if ( USB_NO_ERROR != UsbRc && ERROR_SUCCESS == dwErr) {
  105058. +// dwErr = ERROR_GEN_FAILURE;
  105059. +// }
  105060. +
  105061. +
  105062. + if ( ERROR_SUCCESS != dwErr ) {
  105063. +
  105064. + SetLastError(dwErr);
  105065. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr));
  105066. + }
  105067. +
  105068. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port(%u)\n", __LINE__));
  105069. +
  105070. + }
  105071. + else // if(precvbuf !=NULL)
  105072. + {
  105073. +
  105074. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n"));
  105075. + }
  105076. +
  105077. + return _TRUE;
  105078. +
  105079. +}
  105080. +
  105081. +DWORD usb_read_port_complete( PVOID context )
  105082. +{
  105083. + struct recv_buf *precvbuf = (struct recv_buf *)context;
  105084. + _adapter *adapter = (_adapter *)precvbuf->adapter;
  105085. + struct recv_priv *precvpriv = &adapter->recvpriv;
  105086. +
  105087. +
  105088. + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf;
  105089. + struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
  105090. + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev;
  105091. +
  105092. +
  105093. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105094. +
  105095. + DWORD dwBytesTransferred = 0;
  105096. + DWORD dwErr = USB_CANCELED_ERROR;
  105097. +
  105098. + uint isevt, *pbuf;
  105099. + int fComplete =_FALSE;
  105100. +
  105101. +
  105102. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_complete(%u)\n", __LINE__));
  105103. +
  105104. +_func_enter_;
  105105. +
  105106. +
  105107. + _rtw_spinlock_ex(&precvpriv->lock);
  105108. + precvbuf->irp_pending=_FALSE;
  105109. + precvpriv->rx_pending_cnt --;
  105110. + _rtw_spinunlock_ex(&precvpriv->lock);
  105111. +
  105112. +
  105113. +#if 1
  105114. +
  105115. + (*usb_funcs_vp->lpGetTransferStatus)(precvbuf->usb_transfer_read_port, &dwBytesTransferred, &dwErr);
  105116. + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(precvbuf->usb_transfer_read_port);
  105117. + if(fComplete!=_TRUE)
  105118. + {
  105119. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete CloseTransfer before complete\n"));
  105120. + }
  105121. + (*usb_funcs_vp->lpCloseTransfer)(precvbuf->usb_transfer_read_port);
  105122. +
  105123. +
  105124. +#endif
  105125. +
  105126. +
  105127. + if(USB_NO_ERROR != dwErr)
  105128. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete Fail :%d\n",dwErr));
  105129. +
  105130. + {
  105131. +
  105132. + if ( dwBytesTransferred > MAX_RECVBUF_SZ || dwBytesTransferred < RXDESC_SIZE )
  105133. + {
  105134. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,
  105135. + ("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE): %d\n",dwBytesTransferred));
  105136. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  105137. +
  105138. + //usb_read_port(pintfhdl, 0, 0, (unsigned char *)precvframe);
  105139. + }
  105140. + else
  105141. + {
  105142. + precvbuf->transfer_len = dwBytesTransferred;
  105143. +
  105144. + pbuf = (uint*)precvbuf->pbuf;
  105145. +
  105146. + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff)
  105147. + {
  105148. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,
  105149. + ("\n usb_read_port_complete: get a event\n"));
  105150. + rxcmd_event_hdl(adapter, pbuf);//rx c2h events
  105151. +
  105152. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  105153. + }
  105154. + else
  105155. + {
  105156. + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets
  105157. + {
  105158. + //precvbuf->reuse = _TRUE;
  105159. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  105160. + }
  105161. + }
  105162. + }
  105163. + }
  105164. +
  105165. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port_complete(%u)\n", __LINE__));
  105166. +
  105167. +_func_exit_;
  105168. + return ERROR_SUCCESS;
  105169. +// return STATUS_MORE_PROCESSING_REQUIRED;
  105170. +}
  105171. +
  105172. +void usb_read_port_cancel(_adapter *padapter){
  105173. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_cancel(%u)\n",__FUNCTION__, __LINE__));
  105174. +}
  105175. +
  105176. +DWORD usb_write_mem_complete( LPVOID Context )
  105177. +{
  105178. + int fComplete =_FALSE;
  105179. + DWORD dwBytes = 0;
  105180. + DWORD dwErr = USB_CANCELED_ERROR;
  105181. +
  105182. + _irqL irqL;
  105183. + _list *head;
  105184. + _list *plist;
  105185. + struct io_req *pio_req;
  105186. + struct io_queue *pio_q = (struct io_queue *) Context;
  105187. + struct intf_hdl *pintf = &(pio_q->intf);
  105188. + struct intf_priv *pintfpriv = pintf->pintfpriv;
  105189. + _adapter *padapter = (_adapter *)pintf->adapter;
  105190. + NTSTATUS status = STATUS_SUCCESS;
  105191. + struct xmit_priv * pxmitpriv = &padapter->xmitpriv;
  105192. +
  105193. + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev;
  105194. +
  105195. + USB_HANDLE usbHandle = pdvobj_priv->usb_extension._hDevice;
  105196. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105197. +
  105198. + // get the head from the processing io_queue
  105199. + head = &(pio_q->processing);
  105200. +
  105201. +_func_enter_;
  105202. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_mem_complete %p\n", Context));
  105203. +
  105204. +#if 1
  105205. + _enter_critical_bh(&(pio_q->lock), &irqL);
  105206. +
  105207. +
  105208. + //free irp in processing list...
  105209. + while(rtw_is_list_empty(head) != _TRUE)
  105210. + {
  105211. + plist = get_next(head);
  105212. + rtw_list_delete(plist);
  105213. + pio_req = LIST_CONTAINOR(plist, struct io_req, list);
  105214. + _rtw_up_sema(&pio_req->sema);
  105215. + }
  105216. +
  105217. + _exit_critical_bh(&(pio_q->lock), &irqL);
  105218. +#endif
  105219. +
  105220. +
  105221. +#if 1
  105222. +
  105223. + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr);
  105224. + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem);
  105225. + if(fComplete!=_TRUE)
  105226. + {
  105227. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem_complete CloseTransfer before complete\n"));
  105228. + }
  105229. + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem );
  105230. +
  105231. +#endif
  105232. +
  105233. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem_complete\n"));
  105234. +
  105235. +_func_exit_;
  105236. +
  105237. +
  105238. + return STATUS_MORE_PROCESSING_REQUIRED;
  105239. +
  105240. +}
  105241. +
  105242. +
  105243. +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  105244. +{
  105245. +
  105246. + NTSTATUS NtStatus = STATUS_SUCCESS;
  105247. + USB_PIPE hPipe;
  105248. + _irqL irqL;
  105249. +
  105250. + int fComplete = _FALSE;
  105251. + DWORD dwBytes = 0;
  105252. + DWORD dwErr = USB_CANCELED_ERROR;
  105253. +
  105254. +
  105255. + struct io_req *pio_req;
  105256. +
  105257. + _adapter *adapter = (_adapter *)pintfhdl->adapter;
  105258. + struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
  105259. + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev;
  105260. +
  105261. +
  105262. + struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
  105263. + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  105264. +
  105265. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105266. +
  105267. +
  105268. +_func_enter_;
  105269. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_mem(%u) pintfhdl %p wmem %p\n", __LINE__, pintfhdl, wmem));
  105270. +
  105271. + // fetch a io_request from the io_queue
  105272. + pio_req = alloc_ioreq(pio_queue);
  105273. +
  105274. + if ((pio_req == NULL)||(adapter->bSurpriseRemoved))
  105275. + {
  105276. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved ));
  105277. + goto exit;
  105278. + }
  105279. +
  105280. + _enter_critical_bh(&(pio_queue->lock), &irqL);
  105281. +
  105282. +
  105283. + // insert the io_request into processing io_queue
  105284. + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing));
  105285. +
  105286. +
  105287. + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx))
  105288. + {
  105289. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n"));
  105290. + goto exit;
  105291. + }
  105292. +
  105293. + //translate DMA FIFO addr to pipehandle
  105294. + hPipe = ffaddr2pipehdl(pdvobj_priv, addr);
  105295. +
  105296. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_,("usb_write_mem(%u)\n",__LINE__));
  105297. +
  105298. + pio_req->usb_transfer_write_mem = (*usb_funcs_vp->lpIssueBulkTransfer)(
  105299. + hPipe,
  105300. + usb_write_mem_complete,
  105301. + pio_queue,
  105302. + USB_OUT_TRANSFER,
  105303. + cnt,
  105304. + wmem,
  105305. + 0);
  105306. +
  105307. +#if 0
  105308. +
  105309. + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr);
  105310. +
  105311. + while( fComplete != _TRUE)
  105312. + {
  105313. + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem);
  105314. + if(fComplete==_TRUE)
  105315. + {
  105316. + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem );
  105317. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem finished\n"));
  105318. + break;
  105319. + }
  105320. + else
  105321. + {
  105322. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_,
  105323. + ("usb_write_mem not yet finished %X\n",
  105324. + pio_req->usb_transfer_write_mem));
  105325. + rtw_msleep_os(10);
  105326. + }
  105327. +
  105328. + }
  105329. +
  105330. +#endif
  105331. +
  105332. +
  105333. +// _rtw_down_sema(&pio_req->sema);
  105334. +
  105335. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem(%X)\n",pio_req->usb_transfer_write_mem));
  105336. +
  105337. + _exit_critical_bh(&(pio_queue->lock), &irqL);
  105338. +
  105339. + _rtw_down_sema(&pio_req->sema);
  105340. + free_ioreq(pio_req, pio_queue);
  105341. +
  105342. +exit:
  105343. +_func_exit_;
  105344. + return;
  105345. +}
  105346. +
  105347. +u32 usb_write_cnt=0;
  105348. +u32 usb_complete_cnt=0;
  105349. +
  105350. +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr)
  105351. +{
  105352. + USB_PIPE PipeHandle = NULL;
  105353. + _adapter *padapter = pNdisCEDvice->padapter;
  105354. +
  105355. +
  105356. + if(pNdisCEDvice->nr_endpoint == 11)
  105357. + {
  105358. + switch(addr)
  105359. + {
  105360. + case RTL8712_DMA_BEQ:
  105361. + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ;
  105362. + break;
  105363. + case RTL8712_DMA_BKQ:
  105364. + PipeHandle= padapter->halpriv.pipehdls_r8712[4];
  105365. + break;
  105366. + case RTL8712_DMA_VIQ:
  105367. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  105368. + break;
  105369. + case RTL8712_DMA_VOQ:
  105370. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  105371. + break;
  105372. + case RTL8712_DMA_BCNQ:
  105373. + PipeHandle= padapter->halpriv.pipehdls_r8712[6];
  105374. + break;
  105375. + case RTL8712_DMA_BMCQ: //HI Queue
  105376. + PipeHandle= padapter->halpriv.pipehdls_r8712[7];
  105377. + break;
  105378. + case RTL8712_DMA_MGTQ:
  105379. + PipeHandle= padapter->halpriv.pipehdls_r8712[8];
  105380. + break;
  105381. + case RTL8712_DMA_RX0FF:
  105382. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  105383. + break;
  105384. + case RTL8712_DMA_C2HCMD:
  105385. + PipeHandle= padapter->halpriv.pipehdls_r8712[5];
  105386. + break;
  105387. + case RTL8712_DMA_H2CCMD:
  105388. + PipeHandle= padapter->halpriv.pipehdls_r8712[9];
  105389. + break;
  105390. +
  105391. + }
  105392. +
  105393. + }
  105394. + else if(pNdisCEDvice->nr_endpoint == 6)
  105395. + {
  105396. + switch(addr)
  105397. + {
  105398. + case RTL8712_DMA_BEQ:
  105399. + PipeHandle= padapter->halpriv.pipehdls_r8712[3];
  105400. + break;
  105401. + case RTL8712_DMA_BKQ:
  105402. + PipeHandle= padapter->halpriv.pipehdls_r8712[4];
  105403. + break;
  105404. + case RTL8712_DMA_VIQ:
  105405. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  105406. + break;
  105407. + case RTL8712_DMA_VOQ:
  105408. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  105409. + break;
  105410. + case RTL8712_DMA_RX0FF:
  105411. + case RTL8712_DMA_C2HCMD:
  105412. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  105413. + break;
  105414. + case RTL8712_DMA_H2CCMD:
  105415. + case RTL8712_DMA_BCNQ:
  105416. + case RTL8712_DMA_BMCQ:
  105417. + case RTL8712_DMA_MGTQ:
  105418. + PipeHandle= padapter->halpriv.pipehdls_r8712[5];
  105419. + break;
  105420. +
  105421. + }
  105422. +
  105423. + }
  105424. + else if(pNdisCEDvice->nr_endpoint == 4)
  105425. + {
  105426. + switch(addr)
  105427. + {
  105428. + case RTL8712_DMA_BEQ:
  105429. + case RTL8712_DMA_BKQ:
  105430. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  105431. + break;
  105432. + case RTL8712_DMA_VIQ:
  105433. + case RTL8712_DMA_VOQ:
  105434. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  105435. + break;
  105436. + case RTL8712_DMA_RX0FF:
  105437. + case RTL8712_DMA_C2HCMD:
  105438. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  105439. + break;
  105440. + case RTL8712_DMA_H2CCMD:
  105441. + case RTL8712_DMA_BCNQ:
  105442. + case RTL8712_DMA_BMCQ:
  105443. + case RTL8712_DMA_MGTQ:
  105444. + PipeHandle= padapter->halpriv.pipehdls_r8712[3];
  105445. + break;
  105446. + }
  105447. +
  105448. + }
  105449. + else
  105450. + {
  105451. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint));
  105452. + }
  105453. +
  105454. + return PipeHandle;
  105455. +
  105456. +}
  105457. +
  105458. +DWORD usb_bulkout_zero_complete( LPVOID pZeroContext )
  105459. +{
  105460. + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext;
  105461. + _adapter * padapter = pcontext->padapter;
  105462. + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv;
  105463. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105464. + struct xmit_priv * pxmitpriv = &padapter->xmitpriv;
  105465. +
  105466. + int fComplete =_FALSE;
  105467. + DWORD dwBytesTransferred = 0;
  105468. + DWORD dwErr = USB_CANCELED_ERROR;
  105469. +
  105470. +_func_enter_;
  105471. +
  105472. +#if 1
  105473. +
  105474. + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr);
  105475. + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port);
  105476. + if(fComplete!=_TRUE)
  105477. + {
  105478. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_bulkout_zero_complete CloseTransfer before complete\n"));
  105479. + }
  105480. + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port);
  105481. +
  105482. +#endif
  105483. +
  105484. + if(pcontext)
  105485. + {
  105486. + if(pcontext->pbuf)
  105487. + {
  105488. + rtw_mfree(pcontext->pbuf, sizeof(int));
  105489. + }
  105490. +
  105491. + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context));
  105492. + }
  105493. +
  105494. +_func_exit_;
  105495. +
  105496. + return ERROR_SUCCESS;
  105497. +
  105498. +
  105499. +}
  105500. +
  105501. +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)
  105502. +{
  105503. + struct zero_bulkout_context *pcontext;
  105504. + unsigned char *pbuf;
  105505. + u8 len = 0 ;
  105506. + _adapter *padapter = (_adapter *)pintfhdl->adapter;
  105507. + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
  105508. + struct xmit_priv * pxmitpriv = &padapter->xmitpriv;
  105509. +
  105510. +
  105511. + LPCUSB_FUNCS usb_funcs_vp = pdvobj->usb_extension._lpUsbFuncs;
  105512. +
  105513. + USB_PIPE hPipe;
  105514. +
  105515. +_func_enter_;
  105516. +
  105517. + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx))
  105518. + {
  105519. + return _FAIL;
  105520. + }
  105521. +
  105522. +
  105523. + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context));
  105524. +
  105525. + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int));
  105526. +
  105527. + len = 0;
  105528. +
  105529. + pcontext->pbuf = pbuf;
  105530. + pcontext->purb = NULL;
  105531. + pcontext->pirp = NULL;
  105532. + pcontext->padapter = padapter;
  105533. +
  105534. +
  105535. +//translate DMA FIFO addr to pipehandle
  105536. + hPipe = ffaddr2pipehdl(pdvobj, addr);
  105537. +
  105538. +
  105539. +
  105540. +
  105541. + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)(
  105542. + hPipe, usb_bulkout_zero_complete,
  105543. + pcontext, USB_OUT_TRANSFER,
  105544. + len, pbuf, 0);
  105545. +
  105546. +
  105547. +_func_exit_;
  105548. +
  105549. + return _SUCCESS;
  105550. +
  105551. +}
  105552. +
  105553. +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  105554. +{
  105555. +
  105556. + u32 i, bwritezero = _FALSE;
  105557. + u32 ac_tag = addr;
  105558. +
  105559. + u8* ptr;
  105560. +
  105561. + struct intf_priv * pintfpriv = pintfhdl->pintfpriv;
  105562. + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev;
  105563. + _adapter * padapter = pdvobj_priv->padapter;
  105564. +
  105565. + struct xmit_priv * pxmitpriv = &padapter->xmitpriv;
  105566. + struct xmit_frame * pxmitframe = (struct xmit_frame *)wmem;
  105567. +
  105568. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105569. +
  105570. + USB_PIPE hPipe;
  105571. +
  105572. + u32 bResult = _FALSE;
  105573. +
  105574. +_func_enter_;
  105575. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_port\n"));
  105576. +
  105577. +#if (CONFIG_PWRCTRL == 1)
  105578. + if(padapter->pwrctrlpriv.pnp_bstop_trx==_TRUE){
  105579. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n"));
  105580. +
  105581. + }
  105582. +#endif
  105583. +
  105584. + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx))
  105585. + {
  105586. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  105587. + bResult = _FALSE;
  105588. + goto exit;
  105589. + }
  105590. +
  105591. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port(%u)\n", __LINE__));
  105592. +
  105593. + for(i=0; i<8; i++)
  105594. + {
  105595. + if(pxmitframe->bpending[i] == _FALSE)
  105596. + {
  105597. + _rtw_spinlock(&pxmitpriv->lock);
  105598. + pxmitpriv->txirp_cnt++;
  105599. + pxmitframe->bpending[i] = _TRUE;
  105600. + _rtw_spinunlock(&pxmitpriv->lock);
  105601. +
  105602. + pxmitframe->sz[i] = cnt;
  105603. + pxmitframe->ac_tag[i] = ac_tag;
  105604. +
  105605. + break;
  105606. + }
  105607. + }
  105608. +
  105609. +
  105610. + //TODO:
  105611. + if (pdvobj_priv->ishighspeed)
  105612. + {
  105613. + if(cnt> 0 && cnt%512 == 0)
  105614. + {
  105615. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt));
  105616. + // cnt=cnt+1;
  105617. + bwritezero = _TRUE;
  105618. +
  105619. + }
  105620. + }
  105621. + else
  105622. + {
  105623. + if(cnt > 0 && cnt%64 == 0)
  105624. + {
  105625. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("cnt=%d\n", cnt));
  105626. + // cnt=cnt+1;
  105627. + bwritezero = _TRUE;
  105628. +
  105629. + }
  105630. + }
  105631. +
  105632. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port: pipe handle convert\n"));
  105633. +
  105634. + //translate DMA FIFO addr to pipehandle
  105635. + hPipe = ffaddr2pipehdl(pdvobj_priv, addr);
  105636. +
  105637. +
  105638. +#if 0
  105639. + // for tx fifo, the maximum payload number is 8,
  105640. + // we workaround this issue here by separate whole fifo into 8 segments.
  105641. + if (cnt <= 500)
  105642. + cnt = 500;
  105643. +#endif
  105644. +
  105645. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_,
  105646. + ("usb_write_port(%u): pxmitframe %X pxmitframe->padapter %X\n",__LINE__, pxmitframe, pxmitframe->padapter));
  105647. +
  105648. + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)(
  105649. + hPipe, usb_write_port_complete,
  105650. + pxmitframe, USB_OUT_TRANSFER,
  105651. + cnt, pxmitframe->mem_addr, 0);
  105652. +
  105653. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105654. +
  105655. + ptr=(u8 *)&pxmitframe->mem;
  105656. +
  105657. +#if 0
  105658. + if (pdvobj_priv->ishighspeed)
  105659. + {
  105660. + ptr=ptr+512;
  105661. + }
  105662. + else
  105663. + {
  105664. + ptr=ptr+64;
  105665. +
  105666. + }
  105667. +#endif
  105668. + if(bwritezero == _TRUE)
  105669. + {
  105670. + usb_bulkout_zero(pintfhdl, addr);
  105671. + }
  105672. +
  105673. +// if (!pxmitframe->usb_transfer_xmit)
  105674. +// padapter->bSurpriseRemoved=_TRUE;
  105675. +
  105676. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105677. + bResult = _SUCCESS;
  105678. +
  105679. +exit:
  105680. +_func_exit_;
  105681. + return bResult;
  105682. +}
  105683. +
  105684. +DWORD usb_write_port_complete( LPVOID Context )
  105685. +{
  105686. +
  105687. +// u8 *ptr;
  105688. +
  105689. + struct xmit_frame * pxmitframe = (struct xmit_frame *) Context;
  105690. + _adapter * padapter = pxmitframe->padapter;
  105691. + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv;
  105692. + struct xmit_priv * pxmitpriv = &padapter->xmitpriv;
  105693. + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf;
  105694. + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs;
  105695. +
  105696. + int fComplete =_FALSE;
  105697. + DWORD dwBytesTransferred = 0;
  105698. + DWORD dwErr = USB_CANCELED_ERROR;
  105699. +
  105700. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u), pxmitframe %X\n",__FUNCTION__, __LINE__, Context));
  105701. +
  105702. +_func_enter_;
  105703. +
  105704. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("+usb_write_port_complete\n"));
  105705. +
  105706. + _rtw_spinlock_ex(&pxmitpriv->lock);
  105707. + pxmitpriv->txirp_cnt--;
  105708. + _rtw_spinunlock_ex(&pxmitpriv->lock);
  105709. +
  105710. + if(pxmitpriv->txirp_cnt==0){
  105711. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n"));
  105712. + _rtw_up_sema(&(pxmitpriv->tx_retevt));
  105713. + }
  105714. +
  105715. +
  105716. + //not to consider tx fragment
  105717. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  105718. +
  105719. +
  105720. +#if 1
  105721. +
  105722. + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr);
  105723. + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port);
  105724. + if(fComplete!=_TRUE)
  105725. + {
  105726. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_port_complete CloseTransfer before complete\n"));
  105727. + }
  105728. + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port);
  105729. +
  105730. +#else
  105731. +
  105732. + if((*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port))
  105733. + {
  105734. + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port);
  105735. + }
  105736. +
  105737. +#endif
  105738. +
  105739. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_,
  105740. + ("%s(%u): pxmitpriv %X pxmitpriv->free_xmitframe_cnt %X pxmitframe->padapter %X pxmitframe->padapter %X\n",
  105741. + __LINE__, pxmitpriv, pxmitpriv->free_xmitframe_cnt, pxmitframe->padapter));
  105742. +
  105743. + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf);
  105744. +
  105745. +_func_exit_;
  105746. +
  105747. + return STATUS_SUCCESS;
  105748. +}
  105749. +
  105750. +DWORD usb_write_scsi_complete(LPVOID pTxContext)
  105751. +{
  105752. +#ifndef PLATFORM_OS_CE
  105753. + struct SCSI_BUFFER_ENTRY *psb_entry = (struct SCSI_BUFFER_ENTRY *)pTxContext;
  105754. + _adapter *padapter = psb_entry->padapter;
  105755. + struct SCSI_BUFFER *psb = padapter->pscsi_buf;
  105756. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  105757. + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv;
  105758. + LPCUSB_FUNCS lpUsbFuncs = pdvobj_priv->pUsbExtension->_lpUsbFuncs;
  105759. +
  105760. + int fComplete =_FALSE;
  105761. + DWORD dwBytesTransferred = 0;
  105762. + DWORD dwErr = USB_CANCELED_ERROR;
  105763. +
  105764. +_func_enter_;
  105765. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u): circ_space = %d\n",__FUNCTION__, __LINE__, CIRC_SPACE( psb->head,psb->tail, SCSI_BUFFER_NUMBER)));
  105766. +
  105767. +#if 1
  105768. +
  105769. + (*lpUsbFuncs->lpGetTransferStatus)(psb_entry->usb_transfer_scsi_txcmd, &dwBytesTransferred, &dwErr);
  105770. + fComplete = (*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd);
  105771. + if(fComplete!=_TRUE)
  105772. + {
  105773. + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_scsi_complete CloseTransfer before complete\n"));
  105774. + }
  105775. + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd);
  105776. +
  105777. +#else
  105778. +
  105779. + if((*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd))
  105780. + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd);
  105781. +#endif
  105782. +
  105783. + memset(psb_entry->entry_memory, 0, 8);
  105784. +
  105785. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105786. + if((psb->tail+1)==SCSI_BUFFER_NUMBER)
  105787. + psb->tail=0;
  105788. + else
  105789. + psb->tail++;
  105790. +
  105791. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105792. + if(CIRC_CNT(psb->head,psb->tail,SCSI_BUFFER_NUMBER)==0){
  105793. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("write_txcmd_scsififo_callback: up_sema\n"));
  105794. + _rtw_up_sema(&pxmitpriv->xmit_sema);
  105795. + }
  105796. +
  105797. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105798. + if(padapter->bSurpriseRemoved) {
  105799. + return STATUS_MORE_PROCESSING_REQUIRED;
  105800. + }
  105801. +
  105802. +_func_exit_;
  105803. +#endif
  105804. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105805. + return STATUS_MORE_PROCESSING_REQUIRED;
  105806. +}
  105807. +
  105808. +uint usb_write_scsi(struct intf_hdl *pintfhdl, u32 cnt, u8 *wmem)
  105809. +{
  105810. +
  105811. +#ifndef PLATFORM_OS_CE
  105812. +
  105813. + _adapter *padapter = (_adapter *)pintfhdl->adapter;
  105814. + struct dvobj_priv *pdev = (struct dvobj_priv*)&padapter->dvobjpriv;
  105815. +
  105816. + struct SCSI_BUFFER *psb =padapter->pscsi_buf;
  105817. + struct SCSI_BUFFER_ENTRY *psb_entry=LIST_CONTAINOR(wmem,struct SCSI_BUFFER_ENTRY,entry_memory);
  105818. +
  105819. +_func_enter_;
  105820. + if(padapter->bSurpriseRemoved||padapter->bDriverStopped)
  105821. + return 0;
  105822. +
  105823. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105824. + psb_entry->usb_transfer_scsi_txcmd=pdev->pUsbExtension->_lpUsbFuncs->lpIssueBulkTransfer(
  105825. + pdev->scsi_out_pipehandle,
  105826. + usb_write_scsi_complete,
  105827. + psb_entry,
  105828. + USB_OUT_TRANSFER,
  105829. + cnt,
  105830. + wmem,
  105831. + 0);
  105832. +
  105833. +_func_exit_;
  105834. +#endif
  105835. +
  105836. + return _SUCCESS;
  105837. +}
  105838. +
  105839. +
  105840. +/*
  105841. + */
  105842. +uint usb_init_intf_priv(struct intf_priv *pintfpriv)
  105843. +{
  105844. + // get the dvobj_priv object
  105845. + struct dvobj_priv * pNdisCEDvice = (struct dvobj_priv *) pintfpriv->intf_dev;
  105846. +
  105847. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105848. + // set init intf_priv init status as _IOREADY
  105849. + pintfpriv->intf_status = _IOREADY;
  105850. +
  105851. + // determine the max io size by dvobj_priv.ishighspeed
  105852. + if(pNdisCEDvice->ishighspeed)
  105853. + pintfpriv->max_iosz = 128;
  105854. + else
  105855. + pintfpriv->max_iosz = 64;
  105856. +
  105857. + // read/write size set as 0
  105858. + pintfpriv->io_wsz = 0;
  105859. + pintfpriv->io_rsz = 0;
  105860. +
  105861. + // init io_rwmem buffer
  105862. + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4);
  105863. + if (pintfpriv->allocated_io_rwmem == NULL)
  105864. + {
  105865. + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4);
  105866. + return _FAIL;
  105867. + }
  105868. + else
  105869. + {
  105870. + // word align the io_rwmem
  105871. + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 - ( (u32)(pintfpriv->allocated_io_rwmem) & 3);
  105872. + }
  105873. +
  105874. +#ifndef PLATFORM_OS_CE
  105875. +
  105876. + // init io_r_mem buffer
  105877. + pintfpriv->allocated_io_r_mem = rtw_zmalloc(pintfpriv->max_iosz +4);
  105878. + if (pintfpriv->allocated_io_r_mem == NULL)
  105879. + {
  105880. + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz +4);
  105881. + return _FAIL;
  105882. + }
  105883. + else
  105884. + {
  105885. + // word align the io_rwmem
  105886. + pintfpriv->io_r_mem = pintfpriv->allocated_io_r_mem + 4 - ( (u32)(pintfpriv->allocated_io_r_mem) & 3);
  105887. + }
  105888. +#endif
  105889. +
  105890. + return _SUCCESS;
  105891. +}
  105892. +
  105893. +void usb_unload_intf_priv(struct intf_priv *pintfpriv)
  105894. +{
  105895. +#ifndef PLATFORM_OS_CE
  105896. +
  105897. + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4);
  105898. + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz+4);
  105899. +#endif
  105900. +
  105901. + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__));
  105902. +}
  105903. +
  105904. +
  105905. +
  105906. +void usb_write_port_cancel(_adapter *padapter)
  105907. +{
  105908. +
  105909. + sint i,j;
  105910. + struct dvobj_priv *pdev = &padapter->dvobjpriv;
  105911. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  105912. + struct xmit_frame *pxmitframe;
  105913. +
  105914. + _rtw_spinlock(&pxmitpriv->lock);
  105915. + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++
  105916. + _rtw_spinunlock(&pxmitpriv->lock);
  105917. +
  105918. + if (pxmitpriv->txirp_cnt)
  105919. + {
  105920. + // Canceling Pending Recv Irp
  105921. + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf;
  105922. +
  105923. + for( i = 0; i < NR_XMITFRAME; i++ )
  105924. + {
  105925. + for(j=0;j<8;j++)
  105926. + {
  105927. + if (pxmitframe->bpending[j]==_TRUE)
  105928. + {
  105929. +
  105930. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n"));
  105931. +
  105932. + }
  105933. + }
  105934. +
  105935. + pxmitframe++;
  105936. + }
  105937. +
  105938. + _rtw_down_sema(&(pxmitpriv->tx_retevt));
  105939. +
  105940. + }
  105941. +
  105942. +}
  105943. +
  105944. +DWORD usbctrl_vendorreq_complete(LPVOID lpvNotifyParameter)
  105945. +{
  105946. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv*)lpvNotifyParameter;
  105947. +
  105948. + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq_complete\n"));
  105949. +
  105950. + return STATUS_SUCCESS;
  105951. +}
  105952. +
  105953. +
  105954. +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
  105955. +{
  105956. + u8 ret=_TRUE;
  105957. +// NTSTATUS ntstatus;
  105958. +// int fComplete;
  105959. +// LPCUSB_DEVICE lpDeviceInfo;
  105960. +
  105961. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev;
  105962. +
  105963. + USB_TRANSFER usbTrans;
  105964. + USB_DEVICE_REQUEST usb_device_req;
  105965. + USB_HANDLE usbHandle = pdvobjpriv->usb_extension._hDevice;
  105966. + LPCUSB_FUNCS usbFuncs = pdvobjpriv->usb_extension._lpUsbFuncs;
  105967. +
  105968. + u32 transfer_flags = 0;
  105969. +
  105970. + _func_enter_;
  105971. +
  105972. + memset( &usb_device_req, 0, sizeof( USB_DEVICE_REQUEST ) );
  105973. +
  105974. + if( 0x01 == requesttype )
  105975. + {
  105976. + usb_device_req.bmRequestType = USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE;
  105977. + }
  105978. + else
  105979. + {
  105980. + usb_device_req.bmRequestType = USB_REQUEST_HOST_TO_DEVICE | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE;
  105981. + }
  105982. +
  105983. + usb_device_req.bRequest = request;
  105984. + usb_device_req.wValue = value;
  105985. + usb_device_req.wIndex = index;
  105986. + usb_device_req.wLength = len;
  105987. +
  105988. + if (requesttype == 0x01)
  105989. + {
  105990. + transfer_flags = USB_IN_TRANSFER;//read_in
  105991. + }
  105992. + else
  105993. + {
  105994. + transfer_flags= USB_OUT_TRANSFER;//write_out
  105995. + }
  105996. +
  105997. + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq\n",__FUNCTION__,__LINE__));
  105998. +
  105999. +#if 0
  106000. + // Remember to add callback for sync
  106001. + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle,
  106002. + usbctrl_vendorreq_complete, pdvobjpriv,
  106003. + transfer_flags, &usb_device_req, pdata, 0);
  106004. +#else
  106005. + // Remember to add callback for sync
  106006. + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle,
  106007. + NULL, 0,
  106008. + transfer_flags, &usb_device_req, pdata, 0);
  106009. +#endif
  106010. +
  106011. +// rtw_usleep_os(10);
  106012. +
  106013. + if ( usbTrans )
  106014. + {
  106015. + DWORD dwBytes = 0;
  106016. + DWORD dwErr = USB_CANCELED_ERROR;
  106017. + int fComplete;
  106018. +
  106019. + (*usbFuncs->lpGetTransferStatus)(usbTrans, &dwBytes, &dwErr);
  106020. +
  106021. + fComplete = (*usbFuncs->lpIsTransferComplete)(usbTrans);
  106022. +
  106023. + if (fComplete== _TRUE)
  106024. + {
  106025. + (*usbFuncs->lpCloseTransfer)(usbTrans);
  106026. + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("usbctrl_vendorreq lpCloseTransfer\n"));
  106027. + }
  106028. +
  106029. + if ( dwErr != USB_NO_ERROR || fComplete != _TRUE)
  106030. + {
  106031. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq lpCloseTransfer without complete\n"));
  106032. + ret = _FALSE;
  106033. + goto exit;
  106034. + }
  106035. + }
  106036. + else
  106037. + {
  106038. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq without usbTrans\n"));
  106039. + ret = _FALSE;
  106040. + goto exit;
  106041. +
  106042. + }
  106043. +
  106044. +exit:
  106045. + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("-usbctrl_vendorreq\n"));
  106046. +_func_exit_;
  106047. +
  106048. + return ret;
  106049. +
  106050. +}
  106051. --- /dev/null
  106052. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c
  106053. @@ -0,0 +1,1535 @@
  106054. +/******************************************************************************
  106055. + *
  106056. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  106057. + *
  106058. + * This program is free software; you can redistribute it and/or modify it
  106059. + * under the terms of version 2 of the GNU General Public License as
  106060. + * published by the Free Software Foundation.
  106061. + *
  106062. + * This program is distributed in the hope that it will be useful, but WITHOUT
  106063. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  106064. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  106065. + * more details.
  106066. + *
  106067. + * You should have received a copy of the GNU General Public License along with
  106068. + * this program; if not, write to the Free Software Foundation, Inc.,
  106069. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  106070. + *
  106071. + *
  106072. + ******************************************************************************/
  106073. +#define _HCI_OPS_OS_C_
  106074. +
  106075. +#include <drv_conf.h>
  106076. +#include <osdep_service.h>
  106077. +#include <drv_types.h>
  106078. +#include <osdep_intf.h>
  106079. +#include <usb_ops.h>
  106080. +#include <circ_buf.h>
  106081. +#include <recv_osdep.h>
  106082. +#include <rtl8192c_hal.h>
  106083. +
  106084. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  106085. +
  106086. +#error "Shall be Linux or Windows, but not both!\n"
  106087. +
  106088. +#endif
  106089. +
  106090. +static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
  106091. +{
  106092. + _adapter *padapter = pintfhdl->padapter;
  106093. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  106094. + struct usb_device *udev = pdvobjpriv->pusbdev;
  106095. +
  106096. + unsigned int pipe;
  106097. + int status = 0;
  106098. + u32 tmp_buflen=0;
  106099. + u8 reqtype;
  106100. + u8 *pIo_buf;
  106101. + int vendorreq_times = 0;
  106102. +
  106103. + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
  106104. + u8 *tmp_buf;
  106105. + #else // use stack memory
  106106. + u8 tmp_buf[MAX_USB_IO_CTL_SIZE];
  106107. + #endif
  106108. +
  106109. +#ifdef CONFIG_CONCURRENT_MODE
  106110. + if(padapter->adapter_type > PRIMARY_ADAPTER)
  106111. + {
  106112. + padapter = padapter->pbuddy_adapter;
  106113. + pdvobjpriv = adapter_to_dvobj(padapter);
  106114. + udev = pdvobjpriv->pusbdev;
  106115. + }
  106116. +#endif
  106117. +
  106118. +
  106119. + //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid);
  106120. +
  106121. + if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)){
  106122. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  106123. + status = -EPERM;
  106124. + goto exit;
  106125. + }
  106126. +
  106127. + if(len>MAX_VENDOR_REQ_CMD_SIZE){
  106128. + DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ );
  106129. + status = -EINVAL;
  106130. + goto exit;
  106131. + }
  106132. +
  106133. + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
  106134. + _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);
  106135. + #endif
  106136. +
  106137. +
  106138. + // Acquire IO memory for vendorreq
  106139. +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
  106140. + pIo_buf = pdvobjpriv->usb_vendor_req_buf;
  106141. +#else
  106142. + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
  106143. + tmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT);
  106144. + tmp_buflen = (u32)len + ALIGNMENT_UNIT;
  106145. + #else // use stack memory
  106146. + tmp_buflen = MAX_USB_IO_CTL_SIZE;
  106147. + #endif
  106148. +
  106149. + // Added by Albert 2010/02/09
  106150. + // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment.
  106151. + // Trying to fix it here.
  106152. + pIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f );
  106153. +#endif
  106154. +
  106155. + if ( pIo_buf== NULL) {
  106156. + DBG_8192C( "[%s] pIo_buf == NULL \n", __FUNCTION__ );
  106157. + status = -ENOMEM;
  106158. + goto release_mutex;
  106159. + }
  106160. +
  106161. + while(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES)
  106162. + {
  106163. + _rtw_memset(pIo_buf, 0, len);
  106164. +
  106165. + if (requesttype == 0x01)
  106166. + {
  106167. + pipe = usb_rcvctrlpipe(udev, 0);//read_in
  106168. + reqtype = REALTEK_USB_VENQT_READ;
  106169. + }
  106170. + else
  106171. + {
  106172. + pipe = usb_sndctrlpipe(udev, 0);//write_out
  106173. + reqtype = REALTEK_USB_VENQT_WRITE;
  106174. + _rtw_memcpy( pIo_buf, pdata, len);
  106175. + }
  106176. +
  106177. + #if 0
  106178. + //timeout test for firmware downloading
  106179. + status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len
  106180. + , ((value >= FW_8192C_START_ADDRESS && value <= FW_8192C_END_ADDRESS) ||value!=0x1000) ?RTW_USB_CONTROL_MSG_TIMEOUT : RTW_USB_CONTROL_MSG_TIMEOUT_TEST
  106181. + );
  106182. + #else
  106183. + status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT);
  106184. + #endif
  106185. +
  106186. + if ( status == len) // Success this control transfer.
  106187. + {
  106188. + rtw_reset_continual_urb_error(pdvobjpriv);
  106189. + if ( requesttype == 0x01 )
  106190. + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata.
  106191. + _rtw_memcpy( pdata, pIo_buf, len );
  106192. + }
  106193. + }
  106194. + else { // error cases
  106195. + DBG_8192C("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n"
  106196. + , value,(requesttype == 0x01)?"read":"write" , len, status, *(u32*)pdata, vendorreq_times);
  106197. +
  106198. + if (status < 0) {
  106199. + if(status == (-ESHUTDOWN) || status == -ENODEV )
  106200. + {
  106201. + padapter->bSurpriseRemoved = _TRUE;
  106202. + } else {
  106203. + #ifdef DBG_CONFIG_ERROR_DETECT
  106204. + {
  106205. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  106206. + pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL;
  106207. + }
  106208. + #endif
  106209. + }
  106210. + }
  106211. + else // status != len && status >= 0
  106212. + {
  106213. + if(status > 0) {
  106214. + if ( requesttype == 0x01 )
  106215. + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata.
  106216. + _rtw_memcpy( pdata, pIo_buf, len );
  106217. + }
  106218. + }
  106219. + }
  106220. +
  106221. + if(rtw_inc_and_chk_continual_urb_error(pdvobjpriv) == _TRUE ){
  106222. + padapter->bSurpriseRemoved = _TRUE;
  106223. + break;
  106224. + }
  106225. +
  106226. + }
  106227. +
  106228. + // firmware download is checksumed, don't retry
  106229. + if( (value >= FW_8192C_START_ADDRESS && value <= FW_8192C_END_ADDRESS) || status == len )
  106230. + break;
  106231. +
  106232. + }
  106233. +
  106234. + // release IO memory used by vendorreq
  106235. + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
  106236. + rtw_mfree(tmp_buf, tmp_buflen);
  106237. + #endif
  106238. +
  106239. +release_mutex:
  106240. + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
  106241. + _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);
  106242. + #endif
  106243. +exit:
  106244. + return status;
  106245. +
  106246. +}
  106247. +
  106248. +static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)
  106249. +{
  106250. + u8 request;
  106251. + u8 requesttype;
  106252. + u16 wvalue;
  106253. + u16 index;
  106254. + u16 len;
  106255. + u32 data=0;
  106256. +
  106257. + _func_enter_;
  106258. +
  106259. + request = 0x05;
  106260. + requesttype = 0x01;//read_in
  106261. + index = 0;//n/a
  106262. +
  106263. + wvalue = (u16)(addr&0x0000ffff);
  106264. + len = 1;
  106265. +
  106266. + usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106267. +
  106268. + _func_exit_;
  106269. +
  106270. + return (u8)(le32_to_cpu(data)&0x0ff);
  106271. +
  106272. +}
  106273. +
  106274. +static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
  106275. +{
  106276. + u8 request;
  106277. + u8 requesttype;
  106278. + u16 wvalue;
  106279. + u16 index;
  106280. + u16 len;
  106281. + u32 data=0;
  106282. +
  106283. + _func_enter_;
  106284. +
  106285. + request = 0x05;
  106286. + requesttype = 0x01;//read_in
  106287. + index = 0;//n/a
  106288. +
  106289. + wvalue = (u16)(addr&0x0000ffff);
  106290. + len = 2;
  106291. +
  106292. + usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106293. +
  106294. + _func_exit_;
  106295. +
  106296. + return (u16)(le32_to_cpu(data)&0xffff);
  106297. +
  106298. +}
  106299. +
  106300. +static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
  106301. +{
  106302. + u8 request;
  106303. + u8 requesttype;
  106304. + u16 wvalue;
  106305. + u16 index;
  106306. + u16 len;
  106307. + u32 data=0;
  106308. +
  106309. + _func_enter_;
  106310. +
  106311. + request = 0x05;
  106312. + requesttype = 0x01;//read_in
  106313. + index = 0;//n/a
  106314. +
  106315. + wvalue = (u16)(addr&0x0000ffff);
  106316. + len = 4;
  106317. +
  106318. + usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106319. +
  106320. + _func_exit_;
  106321. +
  106322. + return le32_to_cpu(data);
  106323. +
  106324. +}
  106325. +
  106326. +static int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
  106327. +{
  106328. + u8 request;
  106329. + u8 requesttype;
  106330. + u16 wvalue;
  106331. + u16 index;
  106332. + u16 len;
  106333. + u32 data;
  106334. + int ret;
  106335. +
  106336. + _func_enter_;
  106337. +
  106338. + request = 0x05;
  106339. + requesttype = 0x00;//write_out
  106340. + index = 0;//n/a
  106341. +
  106342. + wvalue = (u16)(addr&0x0000ffff);
  106343. + len = 1;
  106344. +
  106345. + data = val;
  106346. + data = cpu_to_le32(data&0x000000ff);
  106347. +
  106348. + ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106349. +
  106350. + _func_exit_;
  106351. +
  106352. + return ret;
  106353. +
  106354. +}
  106355. +
  106356. +static int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
  106357. +{
  106358. + u8 request;
  106359. + u8 requesttype;
  106360. + u16 wvalue;
  106361. + u16 index;
  106362. + u16 len;
  106363. + u32 data;
  106364. + int ret;
  106365. +
  106366. + _func_enter_;
  106367. +
  106368. + request = 0x05;
  106369. + requesttype = 0x00;//write_out
  106370. + index = 0;//n/a
  106371. +
  106372. + wvalue = (u16)(addr&0x0000ffff);
  106373. + len = 2;
  106374. +
  106375. + data = val;
  106376. + data = cpu_to_le32(data&0x0000ffff);
  106377. +
  106378. + ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106379. +
  106380. + _func_exit_;
  106381. +
  106382. + return ret;
  106383. +
  106384. +}
  106385. +
  106386. +static int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
  106387. +{
  106388. + u8 request;
  106389. + u8 requesttype;
  106390. + u16 wvalue;
  106391. + u16 index;
  106392. + u16 len;
  106393. + u32 data;
  106394. + int ret;
  106395. +
  106396. + _func_enter_;
  106397. +
  106398. + request = 0x05;
  106399. + requesttype = 0x00;//write_out
  106400. + index = 0;//n/a
  106401. +
  106402. + wvalue = (u16)(addr&0x0000ffff);
  106403. + len = 4;
  106404. + data = cpu_to_le32(val);
  106405. +
  106406. +
  106407. + ret =usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
  106408. +
  106409. + _func_exit_;
  106410. +
  106411. + return ret;
  106412. +
  106413. +}
  106414. +
  106415. +static int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata)
  106416. +{
  106417. + u8 request;
  106418. + u8 requesttype;
  106419. + u16 wvalue;
  106420. + u16 index;
  106421. + u16 len;
  106422. + u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0};
  106423. + int ret;
  106424. +
  106425. + _func_enter_;
  106426. +
  106427. + request = 0x05;
  106428. + requesttype = 0x00;//write_out
  106429. + index = 0;//n/a
  106430. +
  106431. + wvalue = (u16)(addr&0x0000ffff);
  106432. + len = length;
  106433. + _rtw_memcpy(buf, pdata, len );
  106434. +
  106435. + ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, buf, len, requesttype);
  106436. +
  106437. + _func_exit_;
  106438. +
  106439. + return ret;
  106440. +
  106441. +}
  106442. +
  106443. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  106444. +static void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs)
  106445. +{
  106446. + int err;
  106447. + _adapter *padapter = (_adapter *)purb->context;
  106448. +
  106449. + if(purb->status==0)//SUCCESS
  106450. + {
  106451. + if (purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX))
  106452. + {
  106453. + DBG_8192C("usb_read_interrupt_complete: purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX) \n");
  106454. + }
  106455. +
  106456. + err = usb_submit_urb(purb, GFP_ATOMIC);
  106457. + if((err) && (err != (-EPERM)))
  106458. + {
  106459. + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, purb->status);
  106460. + }
  106461. + }
  106462. + else
  106463. + {
  106464. + DBG_8192C("###=> usb_read_interrupt_complete => urb status(%d)\n", purb->status);
  106465. +
  106466. + switch(purb->status) {
  106467. + case -EINVAL:
  106468. + case -EPIPE:
  106469. + case -ENODEV:
  106470. + case -ESHUTDOWN:
  106471. + //padapter->bSurpriseRemoved=_TRUE;
  106472. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
  106473. + case -ENOENT:
  106474. + padapter->bDriverStopped=_TRUE;
  106475. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
  106476. + break;
  106477. + case -EPROTO:
  106478. + break;
  106479. + case -EINPROGRESS:
  106480. + DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
  106481. + break;
  106482. + default:
  106483. + break;
  106484. + }
  106485. + }
  106486. +
  106487. +}
  106488. +
  106489. +static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr)
  106490. +{
  106491. + int err;
  106492. + unsigned int pipe;
  106493. + u32 ret = _SUCCESS;
  106494. + _adapter *adapter = pintfhdl->padapter;
  106495. + struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
  106496. + struct recv_priv *precvpriv = &adapter->recvpriv;
  106497. + struct usb_device *pusbd = pdvobj->pusbdev;
  106498. +
  106499. +_func_enter_;
  106500. +
  106501. + //translate DMA FIFO addr to pipehandle
  106502. + pipe = ffaddr2pipehdl(pdvobj, addr);
  106503. +
  106504. + usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe,
  106505. + precvpriv->int_in_buf,
  106506. + sizeof(INTERRUPT_MSG_FORMAT_EX),
  106507. + usb_read_interrupt_complete,
  106508. + adapter,
  106509. + 1);
  106510. +
  106511. + err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC);
  106512. + if((err) && (err != (-EPERM)))
  106513. + {
  106514. + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, precvpriv->int_in_urb->status);
  106515. + ret = _FAIL;
  106516. + }
  106517. +
  106518. +_func_exit_;
  106519. +
  106520. + return ret;
  106521. +}
  106522. +#endif
  106523. +
  106524. +static s32 pre_recv_entry(union recv_frame *precvframe, struct recv_stat *prxstat, struct phy_stat *pphy_info)
  106525. +{
  106526. + s32 ret=_SUCCESS;
  106527. +#ifdef CONFIG_CONCURRENT_MODE
  106528. + u8 *primary_myid, *secondary_myid, *paddr1;
  106529. + union recv_frame *precvframe_if2 = NULL;
  106530. + _adapter *primary_padapter = precvframe->u.hdr.adapter;
  106531. + _adapter *secondary_padapter = primary_padapter->pbuddy_adapter;
  106532. + struct recv_priv *precvpriv = &primary_padapter->recvpriv;
  106533. + _queue *pfree_recv_queue = &precvpriv->free_recv_queue;
  106534. + u8 *pbuf = precvframe->u.hdr.rx_data;
  106535. +
  106536. + if(!secondary_padapter)
  106537. + return ret;
  106538. +
  106539. + paddr1 = GetAddr1Ptr(precvframe->u.hdr.rx_data);
  106540. +
  106541. + if(IS_MCAST(paddr1) == _FALSE)//unicast packets
  106542. + {
  106543. + //primary_myid = myid(&primary_padapter->eeprompriv);
  106544. + secondary_myid = myid(&secondary_padapter->eeprompriv);
  106545. +
  106546. + if(_rtw_memcmp(paddr1, secondary_myid, ETH_ALEN))
  106547. + {
  106548. + //change to secondary interface
  106549. + precvframe->u.hdr.adapter = secondary_padapter;
  106550. + }
  106551. +
  106552. + //ret = recv_entry(precvframe);
  106553. +
  106554. + }
  106555. + else // Handle BC/MC Packets
  106556. + {
  106557. +
  106558. + u8 clone = _TRUE;
  106559. +#if 0
  106560. + u8 type, subtype, *paddr2, *paddr3;
  106561. +
  106562. + type = GetFrameType(pbuf);
  106563. + subtype = GetFrameSubType(pbuf); //bit(7)~bit(2)
  106564. +
  106565. + switch (type)
  106566. + {
  106567. + case WIFI_MGT_TYPE: //Handle BC/MC mgnt Packets
  106568. + if(subtype == WIFI_BEACON)
  106569. + {
  106570. + paddr3 = GetAddr3Ptr(precvframe->u.hdr.rx_data);
  106571. +
  106572. + if (check_fwstate(&secondary_padapter->mlmepriv, _FW_LINKED) &&
  106573. + _rtw_memcmp(paddr3, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN))
  106574. + {
  106575. + //change to secondary interface
  106576. + precvframe->u.hdr.adapter = secondary_padapter;
  106577. + clone = _FALSE;
  106578. + }
  106579. +
  106580. + if(check_fwstate(&primary_padapter->mlmepriv, _FW_LINKED) &&
  106581. + _rtw_memcmp(paddr3, get_bssid(&primary_padapter->mlmepriv), ETH_ALEN))
  106582. + {
  106583. + if(clone==_FALSE)
  106584. + {
  106585. + clone = _TRUE;
  106586. + }
  106587. + else
  106588. + {
  106589. + clone = _FALSE;
  106590. + }
  106591. +
  106592. + precvframe->u.hdr.adapter = primary_padapter;
  106593. + }
  106594. +
  106595. + if(check_fwstate(&primary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) ||
  106596. + check_fwstate(&secondary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING))
  106597. + {
  106598. + clone = _TRUE;
  106599. + precvframe->u.hdr.adapter = primary_padapter;
  106600. + }
  106601. +
  106602. + }
  106603. + else if(subtype == WIFI_PROBEREQ)
  106604. + {
  106605. + //probe req frame is only for interface2
  106606. + //change to secondary interface
  106607. + precvframe->u.hdr.adapter = secondary_padapter;
  106608. + clone = _FALSE;
  106609. + }
  106610. + break;
  106611. + case WIFI_CTRL_TYPE: // Handle BC/MC ctrl Packets
  106612. +
  106613. + break;
  106614. + case WIFI_DATA_TYPE: //Handle BC/MC data Packets
  106615. + //Notes: AP MODE never rx BC/MC data packets
  106616. +
  106617. + paddr2 = GetAddr2Ptr(precvframe->u.hdr.rx_data);
  106618. +
  106619. + if(_rtw_memcmp(paddr2, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN))
  106620. + {
  106621. + //change to secondary interface
  106622. + precvframe->u.hdr.adapter = secondary_padapter;
  106623. + clone = _FALSE;
  106624. + }
  106625. +
  106626. + break;
  106627. + default:
  106628. +
  106629. + break;
  106630. + }
  106631. +#endif
  106632. +
  106633. + if(_TRUE == clone)
  106634. + {
  106635. + //clone/copy to if2
  106636. + u8 shift_sz = 0;
  106637. + u32 alloc_sz, skb_len;
  106638. + _pkt *pkt_copy = NULL;
  106639. + struct rx_pkt_attrib *pattrib = NULL;
  106640. +
  106641. + precvframe_if2 = rtw_alloc_recvframe(pfree_recv_queue);
  106642. + if(precvframe_if2)
  106643. + {
  106644. + precvframe_if2->u.hdr.adapter = secondary_padapter;
  106645. +
  106646. + _rtw_init_listhead(&precvframe_if2->u.hdr.list);
  106647. + precvframe_if2->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch.
  106648. + precvframe_if2->u.hdr.len=0;
  106649. +
  106650. + _rtw_memcpy(&precvframe_if2->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib));
  106651. +
  106652. + pattrib = &precvframe_if2->u.hdr.attrib;
  106653. +
  106654. + // Modified by Albert 20101213
  106655. + // For 8 bytes IP header alignment.
  106656. + if (pattrib->qos) // Qos data, wireless lan header length is 26
  106657. + {
  106658. + shift_sz = 6;
  106659. + }
  106660. + else
  106661. + {
  106662. + shift_sz = 0;
  106663. + }
  106664. +
  106665. + skb_len = pattrib->pkt_len;
  106666. +
  106667. + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.
  106668. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02
  106669. + if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0)){
  106670. + //alloc_sz = 1664; //1664 is 128 alignment.
  106671. + if(skb_len <= 1650)
  106672. + alloc_sz = 1664;
  106673. + else
  106674. + alloc_sz = skb_len + 14;
  106675. + }
  106676. + else {
  106677. + alloc_sz = skb_len;
  106678. + // 6 is for IP header 8 bytes alignment in QoS packet case.
  106679. + // 8 is for skb->data 4 bytes alignment.
  106680. + alloc_sz += 14;
  106681. + }
  106682. +
  106683. + pkt_copy = rtw_skb_alloc(alloc_sz);
  106684. +
  106685. + if(pkt_copy)
  106686. + {
  106687. + pkt_copy->dev = secondary_padapter->pnetdev;
  106688. + precvframe_if2->u.hdr.pkt = pkt_copy;
  106689. + precvframe_if2->u.hdr.rx_head = pkt_copy->data;
  106690. + precvframe_if2->u.hdr.rx_end = pkt_copy->data + alloc_sz;
  106691. + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address
  106692. + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz.
  106693. + _rtw_memcpy(pkt_copy->data, pbuf, skb_len);
  106694. + precvframe_if2->u.hdr.rx_data = precvframe_if2->u.hdr.rx_tail = pkt_copy->data;
  106695. +
  106696. +
  106697. + recvframe_put(precvframe_if2, skb_len);
  106698. + //recvframe_pull(precvframe_if2, drvinfo_sz + RXDESC_SIZE);
  106699. +
  106700. + rtl8192c_translate_rx_signal_stuff(precvframe_if2, pphy_info);
  106701. +
  106702. + ret = rtw_recv_entry(precvframe_if2);
  106703. +
  106704. + } else {
  106705. + rtw_free_recvframe(precvframe_if2, pfree_recv_queue);
  106706. + DBG_8192C("%s()-%d: alloc_skb() failed!\n", __FUNCTION__, __LINE__);
  106707. + }
  106708. +
  106709. + }
  106710. +
  106711. + }
  106712. +
  106713. + }
  106714. +
  106715. + rtl8192c_translate_rx_signal_stuff(precvframe, pphy_info);
  106716. +
  106717. + ret = rtw_recv_entry(precvframe);
  106718. +
  106719. +#endif
  106720. +
  106721. + return ret;
  106722. +
  106723. +}
  106724. +
  106725. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  106726. +static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf)
  106727. +{
  106728. + u8 *pbuf;
  106729. + u8 shift_sz = 0;
  106730. + u16 pkt_cnt, drvinfo_sz;
  106731. + u32 pkt_offset, skb_len, alloc_sz;
  106732. + s32 transfer_len;
  106733. + struct recv_stat *prxstat;
  106734. + struct phy_stat *pphy_info = NULL;
  106735. + _pkt *pkt_copy = NULL;
  106736. + union recv_frame *precvframe = NULL;
  106737. + struct rx_pkt_attrib *pattrib = NULL;
  106738. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  106739. + struct recv_priv *precvpriv = &padapter->recvpriv;
  106740. + _queue *pfree_recv_queue = &precvpriv->free_recv_queue;
  106741. +
  106742. +
  106743. + transfer_len = (s32)precvbuf->transfer_len;
  106744. + pbuf = precvbuf->pbuf;
  106745. +
  106746. + prxstat = (struct recv_stat *)pbuf;
  106747. + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;
  106748. +
  106749. +#if 0 //temp remove when disable usb rx aggregation
  106750. + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_len<RXDESC_SIZE) ||(pkt_len<=0))
  106751. + {
  106752. + return _FAIL;
  106753. + }
  106754. +#endif
  106755. +
  106756. + do{
  106757. + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  106758. + ("recvbuf2recvframe: rxdesc=offsset 0:0x%08x, 4:0x%08x, 8:0x%08x, C:0x%08x\n",
  106759. + prxstat->rxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4));
  106760. +
  106761. + prxstat = (struct recv_stat *)pbuf;
  106762. +
  106763. + precvframe = rtw_alloc_recvframe(pfree_recv_queue);
  106764. + if(precvframe==NULL)
  106765. + {
  106766. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n"));
  106767. + DBG_8192C("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__, __LINE__);
  106768. + goto _exit_recvbuf2recvframe;
  106769. + }
  106770. +
  106771. + _rtw_init_listhead(&precvframe->u.hdr.list);
  106772. + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch.
  106773. + precvframe->u.hdr.len=0;
  106774. +
  106775. + rtl8192c_query_rx_desc_status(precvframe, prxstat);
  106776. +
  106777. + pattrib = &precvframe->u.hdr.attrib;
  106778. + if(pattrib->physt)
  106779. + {
  106780. + pphy_info = (struct phy_stat *)(pbuf + RXDESC_OFFSET);
  106781. + }
  106782. +
  106783. + pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len;
  106784. +
  106785. + if((pattrib->pkt_len<=0) || (pkt_offset>transfer_len))
  106786. + {
  106787. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n"));
  106788. + DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);
  106789. + rtw_free_recvframe(precvframe, pfree_recv_queue);
  106790. + goto _exit_recvbuf2recvframe;
  106791. + }
  106792. +
  106793. + // Modified by Albert 20101213
  106794. + // For 8 bytes IP header alignment.
  106795. + if (pattrib->qos) // Qos data, wireless lan header length is 26
  106796. + {
  106797. + shift_sz = 6;
  106798. + }
  106799. + else
  106800. + {
  106801. + shift_sz = 0;
  106802. + }
  106803. +
  106804. + skb_len = pattrib->pkt_len;
  106805. +
  106806. + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.
  106807. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02
  106808. + if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0)){
  106809. + //alloc_sz = 1664; //1664 is 128 alignment.
  106810. + if(skb_len <= 1650)
  106811. + alloc_sz = 1664;
  106812. + else
  106813. + alloc_sz = skb_len + 14;
  106814. + }
  106815. + else {
  106816. + alloc_sz = skb_len;
  106817. + // 6 is for IP header 8 bytes alignment in QoS packet case.
  106818. + // 8 is for skb->data 4 bytes alignment.
  106819. + alloc_sz += 14;
  106820. + }
  106821. +
  106822. + pkt_copy = rtw_skb_alloc(alloc_sz);
  106823. +
  106824. + if(pkt_copy)
  106825. + {
  106826. + pkt_copy->dev = padapter->pnetdev;
  106827. + precvframe->u.hdr.pkt = pkt_copy;
  106828. + precvframe->u.hdr.rx_head = pkt_copy->data;
  106829. + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz;
  106830. + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address
  106831. + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz.
  106832. + _rtw_memcpy(pkt_copy->data, (pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), skb_len);
  106833. + precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data;
  106834. + }
  106835. + else
  106836. + {
  106837. + DBG_8192C("recvbuf2recvframe:can not allocate memory for skb copy\n");
  106838. + //precvframe->u.hdr.pkt = rtw_skb_clone(pskb);
  106839. + //precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf;
  106840. + //precvframe->u.hdr.rx_end = pbuf + (pkt_offset>1612?pkt_offset:1612);
  106841. +
  106842. + precvframe->u.hdr.pkt = NULL;
  106843. + rtw_free_recvframe(precvframe, pfree_recv_queue);
  106844. +
  106845. + goto _exit_recvbuf2recvframe;
  106846. + }
  106847. +
  106848. + recvframe_put(precvframe, skb_len);
  106849. + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE);
  106850. +
  106851. +#ifdef CONFIG_USB_RX_AGGREGATION
  106852. + switch(pHalData->UsbRxAggMode)
  106853. + {
  106854. + case USB_RX_AGG_DMA:
  106855. + case USB_RX_AGG_MIX:
  106856. + pkt_offset = (u16)_RND128(pkt_offset);
  106857. + break;
  106858. + case USB_RX_AGG_USB:
  106859. + pkt_offset = (u16)_RND4(pkt_offset);
  106860. + break;
  106861. + case USB_RX_AGG_DISABLE:
  106862. + default:
  106863. + break;
  106864. + }
  106865. +#endif
  106866. +
  106867. +#ifdef CONFIG_CONCURRENT_MODE
  106868. + if(rtw_buddy_adapter_up(padapter))
  106869. + {
  106870. + if(pre_recv_entry(precvframe, prxstat, pphy_info) != _SUCCESS)
  106871. + {
  106872. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\n"));
  106873. + }
  106874. + }
  106875. + else
  106876. + {
  106877. + rtl8192c_translate_rx_signal_stuff(precvframe, pphy_info);
  106878. + if(rtw_recv_entry(precvframe) != _SUCCESS)
  106879. + {
  106880. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
  106881. + }
  106882. + }
  106883. +
  106884. +#else
  106885. + rtl8192c_translate_rx_signal_stuff(precvframe, pphy_info);
  106886. + if(rtw_recv_entry(precvframe) != _SUCCESS)
  106887. + {
  106888. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
  106889. + }
  106890. +#endif
  106891. +
  106892. + pkt_cnt--;
  106893. + transfer_len -= pkt_offset;
  106894. + pbuf += pkt_offset;
  106895. + precvframe = NULL;
  106896. + pkt_copy = NULL;
  106897. +
  106898. + if(transfer_len>0 && pkt_cnt==0)
  106899. + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;
  106900. +
  106901. + }while((transfer_len>0) && (pkt_cnt>0));
  106902. +
  106903. +_exit_recvbuf2recvframe:
  106904. +
  106905. + return _SUCCESS;
  106906. +}
  106907. +
  106908. +void rtl8192cu_recv_tasklet(void *priv)
  106909. +{
  106910. + struct recv_buf *precvbuf = NULL;
  106911. + _adapter *padapter = (_adapter*)priv;
  106912. + struct recv_priv *precvpriv = &padapter->recvpriv;
  106913. +
  106914. + while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
  106915. + {
  106916. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
  106917. + {
  106918. + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");
  106919. +
  106920. + break;
  106921. + }
  106922. +
  106923. +
  106924. + recvbuf2recvframe(padapter, precvbuf);
  106925. +
  106926. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  106927. + }
  106928. +
  106929. +}
  106930. +
  106931. +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
  106932. +{
  106933. + struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
  106934. + _adapter *padapter =(_adapter *)precvbuf->adapter;
  106935. + struct recv_priv *precvpriv = &padapter->recvpriv;
  106936. +
  106937. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
  106938. +
  106939. + precvpriv->rx_pending_cnt --;
  106940. +
  106941. + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel)
  106942. + {
  106943. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  106944. +
  106945. + goto exit;
  106946. + }
  106947. +
  106948. + if(purb->status==0)//SUCCESS
  106949. + {
  106950. + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
  106951. + {
  106952. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));
  106953. +
  106954. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  106955. + }
  106956. + else
  106957. + {
  106958. + rtw_reset_continual_urb_error(adapter_to_dvobj(padapter));
  106959. +
  106960. + precvbuf->transfer_len = purb->actual_length;
  106961. +
  106962. + //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf);
  106963. + rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
  106964. +
  106965. + tasklet_schedule(&precvpriv->recv_tasklet);
  106966. + }
  106967. + }
  106968. + else
  106969. + {
  106970. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
  106971. +
  106972. + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
  106973. +
  106974. + if(rtw_inc_and_chk_continual_urb_error(adapter_to_dvobj(padapter)) == _TRUE ){
  106975. + padapter->bSurpriseRemoved = _TRUE;
  106976. + }
  106977. +
  106978. + switch(purb->status) {
  106979. + case -EINVAL:
  106980. + case -EPIPE:
  106981. + case -ENODEV:
  106982. + case -ESHUTDOWN:
  106983. + //padapter->bSurpriseRemoved=_TRUE;
  106984. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
  106985. + case -ENOENT:
  106986. + padapter->bDriverStopped=_TRUE;
  106987. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
  106988. + break;
  106989. + case -EPROTO:
  106990. + case -EILSEQ:
  106991. + case -ETIME:
  106992. + case -ECOMM:
  106993. + case -EOVERFLOW:
  106994. + #ifdef DBG_CONFIG_ERROR_DETECT
  106995. + {
  106996. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  106997. + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;
  106998. + }
  106999. + #endif
  107000. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  107001. + break;
  107002. + case -EINPROGRESS:
  107003. + DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
  107004. + break;
  107005. + default:
  107006. + break;
  107007. + }
  107008. +
  107009. + }
  107010. +
  107011. +exit:
  107012. +
  107013. +_func_exit_;
  107014. +
  107015. +}
  107016. +
  107017. +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  107018. +{
  107019. + int err;
  107020. + unsigned int pipe;
  107021. + u32 ret = _SUCCESS;
  107022. + PURB purb = NULL;
  107023. + struct recv_buf *precvbuf = (struct recv_buf *)rmem;
  107024. + _adapter *adapter = pintfhdl->padapter;
  107025. + struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
  107026. + struct recv_priv *precvpriv = &adapter->recvpriv;
  107027. + struct usb_device *pusbd = pdvobj->pusbdev;
  107028. +
  107029. +_func_enter_;
  107030. +
  107031. + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)
  107032. + {
  107033. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  107034. + return _FAIL;
  107035. + }
  107036. +
  107037. + if(precvbuf !=NULL)
  107038. + {
  107039. + rtl8192cu_init_recvbuf(adapter, precvbuf);
  107040. +
  107041. + if(precvbuf->pbuf)
  107042. + {
  107043. + precvpriv->rx_pending_cnt++;
  107044. +
  107045. + purb = precvbuf->purb;
  107046. +
  107047. + //translate DMA FIFO addr to pipehandle
  107048. + pipe = ffaddr2pipehdl(pdvobj, addr);
  107049. +
  107050. + usb_fill_bulk_urb(purb, pusbd, pipe,
  107051. + precvbuf->pbuf,
  107052. + MAX_RECVBUF_SZ,
  107053. + usb_read_port_complete,
  107054. + precvbuf);//context is precvbuf
  107055. +
  107056. + purb->transfer_dma = precvbuf->dma_transfer_addr;
  107057. + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  107058. +
  107059. + err = usb_submit_urb(purb, GFP_ATOMIC);
  107060. + if((err) && (err != (-EPERM)))
  107061. + {
  107062. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));
  107063. + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);
  107064. + ret = _FAIL;
  107065. + }
  107066. +
  107067. + }
  107068. +
  107069. + }
  107070. + else
  107071. + {
  107072. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n"));
  107073. + ret = _FAIL;
  107074. + }
  107075. +
  107076. +_func_exit_;
  107077. +
  107078. + return ret;
  107079. +}
  107080. +#else // CONFIG_USE_USB_BUFFER_ALLOC_RX
  107081. +static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb)
  107082. +{
  107083. + u8 *pbuf;
  107084. + u8 shift_sz = 0;
  107085. + u16 pkt_cnt;
  107086. + u32 pkt_offset, skb_len, alloc_sz;
  107087. + s32 transfer_len;
  107088. + struct recv_stat *prxstat;
  107089. + struct phy_stat *pphy_info = NULL;
  107090. + _pkt *pkt_copy = NULL;
  107091. + union recv_frame *precvframe = NULL;
  107092. + struct rx_pkt_attrib *pattrib = NULL;
  107093. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  107094. + struct recv_priv *precvpriv = &padapter->recvpriv;
  107095. + _queue *pfree_recv_queue = &precvpriv->free_recv_queue;
  107096. +
  107097. +
  107098. + transfer_len = (s32)pskb->len;
  107099. + pbuf = pskb->data;
  107100. +
  107101. + prxstat = (struct recv_stat *)pbuf;
  107102. + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;
  107103. +
  107104. +#if 0 //temp remove when disable usb rx aggregation
  107105. + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_len<RXDESC_SIZE) ||(pkt_len<=0))
  107106. + {
  107107. + return _FAIL;
  107108. + }
  107109. +#endif
  107110. +
  107111. + do{
  107112. + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  107113. + ("recvbuf2recvframe: rxdesc=offsset 0:0x%08x, 4:0x%08x, 8:0x%08x, C:0x%08x\n",
  107114. + prxstat->rxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4));
  107115. +
  107116. + prxstat = (struct recv_stat *)pbuf;
  107117. +
  107118. + precvframe = rtw_alloc_recvframe(pfree_recv_queue);
  107119. + if(precvframe==NULL)
  107120. + {
  107121. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n"));
  107122. + DBG_8192C("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__, __LINE__);
  107123. + goto _exit_recvbuf2recvframe;
  107124. + }
  107125. +
  107126. + _rtw_init_listhead(&precvframe->u.hdr.list);
  107127. + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch.
  107128. + precvframe->u.hdr.len=0;
  107129. +
  107130. + rtl8192c_query_rx_desc_status(precvframe, prxstat);
  107131. +
  107132. + pattrib = &precvframe->u.hdr.attrib;
  107133. + if(pattrib->physt)
  107134. + {
  107135. + pphy_info = (struct phy_stat *)(pbuf + RXDESC_OFFSET);
  107136. + }
  107137. +
  107138. + pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len;
  107139. +
  107140. + if((pattrib->pkt_len<=0) || (pkt_offset>transfer_len))
  107141. + {
  107142. + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n"));
  107143. + DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);
  107144. + rtw_free_recvframe(precvframe, pfree_recv_queue);
  107145. + goto _exit_recvbuf2recvframe;
  107146. + }
  107147. +
  107148. + // Modified by Albert 20101213
  107149. + // For 8 bytes IP header alignment.
  107150. + if (pattrib->qos) // Qos data, wireless lan header length is 26
  107151. + {
  107152. + shift_sz = 6;
  107153. + }
  107154. + else
  107155. + {
  107156. + shift_sz = 0;
  107157. + }
  107158. +
  107159. + skb_len = pattrib->pkt_len;
  107160. +
  107161. + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.
  107162. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02
  107163. + if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0)){
  107164. + //alloc_sz = 1664; //1664 is 128 alignment.
  107165. + if(skb_len <= 1650)
  107166. + alloc_sz = 1664;
  107167. + else
  107168. + alloc_sz = skb_len + 14;
  107169. + }
  107170. + else {
  107171. + alloc_sz = skb_len;
  107172. + // 6 is for IP header 8 bytes alignment in QoS packet case.
  107173. + // 8 is for skb->data 4 bytes alignment.
  107174. + alloc_sz += 14;
  107175. + }
  107176. +
  107177. + pkt_copy = rtw_skb_alloc(alloc_sz);
  107178. +
  107179. + if(pkt_copy)
  107180. + {
  107181. + pkt_copy->dev = padapter->pnetdev;
  107182. + precvframe->u.hdr.pkt = pkt_copy;
  107183. + precvframe->u.hdr.rx_head = pkt_copy->data;
  107184. + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz;
  107185. + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address
  107186. + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz.
  107187. + _rtw_memcpy(pkt_copy->data, (pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), skb_len);
  107188. + precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data;
  107189. +
  107190. + }
  107191. + else
  107192. + {
  107193. + precvframe->u.hdr.pkt = rtw_skb_clone(pskb);
  107194. + if(pkt_copy)
  107195. + {
  107196. + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf;
  107197. + precvframe->u.hdr.rx_end = pbuf + alloc_sz;
  107198. + }
  107199. + else
  107200. + {
  107201. + DBG_8192C("recvbuf2recvframe: rtw_skb_clone fail\n");
  107202. + rtw_free_recvframe(precvframe, pfree_recv_queue);
  107203. + goto _exit_recvbuf2recvframe;
  107204. + }
  107205. + }
  107206. +
  107207. + recvframe_put(precvframe, skb_len);
  107208. + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE);
  107209. +
  107210. +#ifdef CONFIG_USB_RX_AGGREGATION
  107211. + switch(pHalData->UsbRxAggMode)
  107212. + {
  107213. + case USB_RX_AGG_DMA:
  107214. + case USB_RX_AGG_MIX:
  107215. + pkt_offset = (u16)_RND128(pkt_offset);
  107216. + break;
  107217. + case USB_RX_AGG_USB:
  107218. + pkt_offset = (u16)_RND4(pkt_offset);
  107219. + break;
  107220. + case USB_RX_AGG_DISABLE:
  107221. + default:
  107222. + break;
  107223. + }
  107224. +#endif
  107225. +
  107226. +#ifdef CONFIG_CONCURRENT_MODE
  107227. + if(rtw_buddy_adapter_up(padapter))
  107228. + {
  107229. + if(pre_recv_entry(precvframe, prxstat, pphy_info) != _SUCCESS)
  107230. + {
  107231. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\n"));
  107232. + }
  107233. + }
  107234. + else
  107235. + {
  107236. + rtl8192c_translate_rx_signal_stuff(precvframe, pphy_info);
  107237. + if(rtw_recv_entry(precvframe) != _SUCCESS)
  107238. + {
  107239. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
  107240. + }
  107241. + }
  107242. +
  107243. +#else
  107244. + rtl8192c_translate_rx_signal_stuff(precvframe, pphy_info);
  107245. + if(rtw_recv_entry(precvframe) != _SUCCESS)
  107246. + {
  107247. + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
  107248. + }
  107249. +#endif
  107250. +
  107251. + pkt_cnt--;
  107252. + transfer_len -= pkt_offset;
  107253. + pbuf += pkt_offset;
  107254. + precvframe = NULL;
  107255. + pkt_copy = NULL;
  107256. +
  107257. + if(transfer_len>0 && pkt_cnt==0)
  107258. + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;
  107259. +
  107260. + }while((transfer_len>0) && (pkt_cnt>0));
  107261. +
  107262. +_exit_recvbuf2recvframe:
  107263. +
  107264. + return _SUCCESS;
  107265. +}
  107266. +
  107267. +void rtl8192cu_recv_tasklet(void *priv)
  107268. +{
  107269. + _pkt *pskb;
  107270. + _adapter *padapter = (_adapter*)priv;
  107271. + struct recv_priv *precvpriv = &padapter->recvpriv;
  107272. +
  107273. + while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue)))
  107274. + {
  107275. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
  107276. + {
  107277. + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");
  107278. + rtw_skb_free(pskb);
  107279. + break;
  107280. + }
  107281. +
  107282. + recvbuf2recvframe(padapter, pskb);
  107283. +
  107284. +#ifdef CONFIG_PREALLOC_RECV_SKB
  107285. +
  107286. + skb_reset_tail_pointer(pskb);
  107287. +
  107288. + pskb->len = 0;
  107289. +
  107290. + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
  107291. +
  107292. +#else
  107293. + rtw_skb_free(pskb);
  107294. +#endif
  107295. +
  107296. + }
  107297. +
  107298. +}
  107299. +
  107300. +
  107301. +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
  107302. +{
  107303. + _irqL irqL;
  107304. + uint isevt, *pbuf;
  107305. + struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
  107306. + _adapter *padapter =(_adapter *)precvbuf->adapter;
  107307. + struct recv_priv *precvpriv = &padapter->recvpriv;
  107308. +
  107309. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
  107310. +
  107311. + //_enter_critical(&precvpriv->lock, &irqL);
  107312. + //precvbuf->irp_pending=_FALSE;
  107313. + //precvpriv->rx_pending_cnt --;
  107314. + //_exit_critical(&precvpriv->lock, &irqL);
  107315. +
  107316. + precvpriv->rx_pending_cnt --;
  107317. +
  107318. + //if(precvpriv->rx_pending_cnt== 0)
  107319. + //{
  107320. + // RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n"));
  107321. + // _rtw_up_sema(&precvpriv->allrxreturnevt);
  107322. + //}
  107323. +
  107324. + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel)
  107325. + {
  107326. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  107327. +
  107328. + #ifdef CONFIG_PREALLOC_RECV_SKB
  107329. + precvbuf->reuse = _TRUE;
  107330. + #else
  107331. + if(precvbuf->pskb){
  107332. + DBG_8192C("==> free skb(%p)\n",precvbuf->pskb);
  107333. + rtw_skb_free(precvbuf->pskb);
  107334. + }
  107335. + #endif
  107336. + DBG_8192C("%s()-%d: RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bReadPortCancel(%d)\n",
  107337. + __FUNCTION__, __LINE__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel);
  107338. + goto exit;
  107339. + }
  107340. +
  107341. + if(purb->status==0)//SUCCESS
  107342. + {
  107343. + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
  107344. + {
  107345. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));
  107346. + precvbuf->reuse = _TRUE;
  107347. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  107348. + DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);
  107349. + }
  107350. + else
  107351. + {
  107352. + rtw_reset_continual_urb_error(adapter_to_dvobj(padapter));
  107353. +
  107354. + precvbuf->transfer_len = purb->actual_length;
  107355. + skb_put(precvbuf->pskb, purb->actual_length);
  107356. + skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);
  107357. +
  107358. + if (skb_queue_len(&precvpriv->rx_skb_queue)<=1)
  107359. + tasklet_schedule(&precvpriv->recv_tasklet);
  107360. +
  107361. + precvbuf->pskb = NULL;
  107362. + precvbuf->reuse = _FALSE;
  107363. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  107364. + }
  107365. + }
  107366. + else
  107367. + {
  107368. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
  107369. +
  107370. + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
  107371. +
  107372. + if(rtw_inc_and_chk_continual_urb_error(adapter_to_dvobj(padapter)) == _TRUE ){
  107373. + padapter->bSurpriseRemoved = _TRUE;
  107374. + }
  107375. +
  107376. + switch(purb->status) {
  107377. + case -EINVAL:
  107378. + case -EPIPE:
  107379. + case -ENODEV:
  107380. + case -ESHUTDOWN:
  107381. + //padapter->bSurpriseRemoved=_TRUE;
  107382. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
  107383. + case -ENOENT:
  107384. + padapter->bDriverStopped=_TRUE;
  107385. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
  107386. + break;
  107387. + case -EPROTO:
  107388. + case -EILSEQ:
  107389. + case -ETIME:
  107390. + case -ECOMM:
  107391. + case -EOVERFLOW:
  107392. + #ifdef DBG_CONFIG_ERROR_DETECT
  107393. + {
  107394. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  107395. + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;
  107396. + }
  107397. + #endif
  107398. + precvbuf->reuse = _TRUE;
  107399. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  107400. + break;
  107401. + case -EINPROGRESS:
  107402. + precvpriv->read_port_complete_EINPROGRESS_cnt++;
  107403. + DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
  107404. + break;
  107405. + default:
  107406. + precvpriv->read_port_complete_other_urb_err_cnt++;
  107407. + break;
  107408. + }
  107409. +
  107410. + }
  107411. +
  107412. +exit:
  107413. +
  107414. +_func_exit_;
  107415. +
  107416. +}
  107417. +
  107418. +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  107419. +{
  107420. + _irqL irqL;
  107421. + int err;
  107422. + unsigned int pipe;
  107423. + SIZE_PTR tmpaddr=0;
  107424. + SIZE_PTR alignment=0;
  107425. + u32 ret = _SUCCESS;
  107426. + PURB purb = NULL;
  107427. + struct recv_buf *precvbuf = (struct recv_buf *)rmem;
  107428. + _adapter *adapter = pintfhdl->padapter;
  107429. + struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
  107430. + struct recv_priv *precvpriv = &adapter->recvpriv;
  107431. + struct usb_device *pusbd = pdvobj->pusbdev;
  107432. +
  107433. +_func_enter_;
  107434. +
  107435. + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)
  107436. + {
  107437. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  107438. + return _FAIL;
  107439. + }
  107440. +
  107441. +#ifdef CONFIG_PREALLOC_RECV_SKB
  107442. + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))
  107443. + {
  107444. + if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue)))
  107445. + {
  107446. + precvbuf->reuse = _TRUE;
  107447. + }
  107448. + }
  107449. +#endif
  107450. +
  107451. +
  107452. + if(precvbuf !=NULL)
  107453. + {
  107454. + rtl8192cu_init_recvbuf(adapter, precvbuf);
  107455. +
  107456. + //re-assign for linux based on skb
  107457. + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))
  107458. + {
  107459. + precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
  107460. +
  107461. + if(precvbuf->pskb == NULL)
  107462. + {
  107463. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n"));
  107464. + precvpriv->recvbuf_skb_alloc_fail_cnt++;
  107465. + return _FAIL;
  107466. + }
  107467. +
  107468. + tmpaddr = (SIZE_PTR)precvbuf->pskb->data;
  107469. + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
  107470. + skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
  107471. +
  107472. + precvbuf->phead = precvbuf->pskb->head;
  107473. + precvbuf->pdata = precvbuf->pskb->data;
  107474. + precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
  107475. + precvbuf->pend = skb_end_pointer(precvbuf->pskb);
  107476. + precvbuf->pbuf = precvbuf->pskb->data;
  107477. + }
  107478. + else//reuse skb
  107479. + {
  107480. + precvbuf->phead = precvbuf->pskb->head;
  107481. + precvbuf->pdata = precvbuf->pskb->data;
  107482. + precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
  107483. + precvbuf->pend = skb_end_pointer(precvbuf->pskb);
  107484. + precvbuf->pbuf = precvbuf->pskb->data;
  107485. +
  107486. + precvbuf->reuse = _FALSE;
  107487. + }
  107488. +
  107489. + //_enter_critical(&precvpriv->lock, &irqL);
  107490. + //precvpriv->rx_pending_cnt++;
  107491. + //precvbuf->irp_pending = _TRUE;
  107492. + //_exit_critical(&precvpriv->lock, &irqL);
  107493. +
  107494. + precvpriv->rx_pending_cnt++;
  107495. +
  107496. + purb = precvbuf->purb;
  107497. +
  107498. + //translate DMA FIFO addr to pipehandle
  107499. + pipe = ffaddr2pipehdl(pdvobj, addr);
  107500. +
  107501. + usb_fill_bulk_urb(purb, pusbd, pipe,
  107502. + precvbuf->pbuf,
  107503. + MAX_RECVBUF_SZ,
  107504. + usb_read_port_complete,
  107505. + precvbuf);//context is precvbuf
  107506. +
  107507. + err = usb_submit_urb(purb, GFP_ATOMIC);
  107508. + if((err) && (err != (-EPERM)))
  107509. + {
  107510. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));
  107511. + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);
  107512. + ret = _FAIL;
  107513. + }
  107514. + }
  107515. + else
  107516. + {
  107517. + precvpriv->recvbuf_null_cnt++;
  107518. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n"));
  107519. + ret = _FAIL;
  107520. + }
  107521. +
  107522. +_func_exit_;
  107523. +
  107524. + return ret;
  107525. +}
  107526. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
  107527. +
  107528. +void rtl8192cu_xmit_tasklet(void *priv)
  107529. +{
  107530. + int ret = _FALSE;
  107531. + _adapter *padapter = (_adapter*)priv;
  107532. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  107533. +
  107534. + if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE)
  107535. + return;
  107536. +
  107537. + while(1)
  107538. + {
  107539. + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE) || (padapter->bWritePortCancel == _TRUE))
  107540. + {
  107541. + DBG_8192C("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n");
  107542. + break;
  107543. + }
  107544. +
  107545. + ret = rtl8192cu_xmitframe_complete(padapter, pxmitpriv, NULL);
  107546. +
  107547. + if(ret==_FALSE)
  107548. + break;
  107549. +
  107550. + }
  107551. +
  107552. +}
  107553. +
  107554. +void rtl8192cu_set_intf_ops(struct _io_ops *pops)
  107555. +{
  107556. + _func_enter_;
  107557. +
  107558. + _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops));
  107559. +
  107560. + pops->_read8 = &usb_read8;
  107561. + pops->_read16 = &usb_read16;
  107562. + pops->_read32 = &usb_read32;
  107563. + pops->_read_mem = &usb_read_mem;
  107564. + pops->_read_port = &usb_read_port;
  107565. +
  107566. + pops->_write8 = &usb_write8;
  107567. + pops->_write16 = &usb_write16;
  107568. + pops->_write32 = &usb_write32;
  107569. + pops->_writeN = &usb_writeN;
  107570. +
  107571. +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
  107572. + pops->_write8_async= &usb_async_write8;
  107573. + pops->_write16_async = &usb_async_write16;
  107574. + pops->_write32_async = &usb_async_write32;
  107575. +#endif
  107576. + pops->_write_mem = &usb_write_mem;
  107577. + pops->_write_port = &usb_write_port;
  107578. +
  107579. + pops->_read_port_cancel = &usb_read_port_cancel;
  107580. + pops->_write_port_cancel = &usb_write_port_cancel;
  107581. +
  107582. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  107583. + pops->_read_interrupt = &usb_read_interrupt;
  107584. +#endif
  107585. +
  107586. + _func_exit_;
  107587. +
  107588. +}
  107589. --- /dev/null
  107590. +++ b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c
  107591. @@ -0,0 +1,1264 @@
  107592. +/******************************************************************************
  107593. + *
  107594. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  107595. + *
  107596. + * This program is free software; you can redistribute it and/or modify it
  107597. + * under the terms of version 2 of the GNU General Public License as
  107598. + * published by the Free Software Foundation.
  107599. + *
  107600. + * This program is distributed in the hope that it will be useful, but WITHOUT
  107601. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  107602. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  107603. + * more details.
  107604. + *
  107605. + * You should have received a copy of the GNU General Public License along with
  107606. + * this program; if not, write to the Free Software Foundation, Inc.,
  107607. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  107608. + *
  107609. + *
  107610. + ******************************************************************************/
  107611. +#define _HCI_OPS_OS_C_
  107612. +
  107613. +#include <drv_conf.h>
  107614. +#include <osdep_service.h>
  107615. +#include <drv_types.h>
  107616. +#include <osdep_intf.h>
  107617. +#include <circ_buf.h>
  107618. +
  107619. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  107620. + #error "Shall be Linux or Windows, but not both!\n"
  107621. +#endif
  107622. +
  107623. +#ifndef CONFIG_USB_HCI
  107624. + #error "CONFIG_USB_HCI shall be on!\n"
  107625. +#endif
  107626. +
  107627. +
  107628. +#include <usb.h>
  107629. +#include <usbdlib.h>
  107630. +#include <usbioctl.h>
  107631. +
  107632. +#include <usb_ops.h>
  107633. +#include <recv_osdep.h>
  107634. +
  107635. +#include <usb_osintf.h>
  107636. +
  107637. +
  107638. +struct zero_bulkout_context
  107639. +{
  107640. + void *pbuf;
  107641. + void *purb;
  107642. + void *pirp;
  107643. + void *padapter;
  107644. +};
  107645. +
  107646. +#define usb_write_cmd usb_write_mem
  107647. +#define usb_read_cmd usb_read_mem
  107648. +#define usb_write_cmd_complete usb_write_mem_complete
  107649. +//#define usb_read_cmd_complete usb_read_mem_complete
  107650. +
  107651. +
  107652. +
  107653. +uint usb_init_intf_priv(struct intf_priv *pintfpriv)
  107654. +{
  107655. +
  107656. + PURB piorw_urb;
  107657. + u8 NextDeviceStackSize;
  107658. + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev;
  107659. + _adapter * padapter=pdev->padapter;
  107660. +
  107661. +_func_enter_;
  107662. +
  107663. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n +usb_init_intf_priv\n"));
  107664. +
  107665. + pintfpriv->intf_status = _IOREADY;
  107666. +
  107667. + if(pdev->ishighspeed) pintfpriv->max_iosz = 128;
  107668. + else pintfpriv->max_iosz = 64;
  107669. +
  107670. +
  107671. + _init_timer(&pintfpriv->io_timer, padapter->hndis_adapter, io_irp_timeout_handler, pintfpriv);
  107672. +
  107673. +
  107674. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("usb_init_intf_priv:pintfpriv->max_iosz:%d\n",pintfpriv->max_iosz));
  107675. +
  107676. + pintfpriv->io_wsz = 0;
  107677. + pintfpriv->io_rsz = 0;
  107678. +
  107679. + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4);
  107680. +
  107681. + if (pintfpriv->allocated_io_rwmem == NULL){
  107682. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_init_intf_priv:pintfpriv->allocated_io_rwmem == NULL\n"));
  107683. + goto usb_init_intf_priv_fail;
  107684. + }
  107685. +
  107686. + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 \
  107687. + -( (u32)(pintfpriv->allocated_io_rwmem) & 3);
  107688. +
  107689. +
  107690. +
  107691. + NextDeviceStackSize = (u8)pdev->nextdevstacksz;//pintfpriv->pUsbDevObj->StackSize + 1;
  107692. +
  107693. + piorw_urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB) );
  107694. + if(piorw_urb == NULL)
  107695. + goto usb_init_intf_priv_fail;
  107696. +
  107697. + pintfpriv->piorw_urb = piorw_urb;
  107698. +
  107699. + pintfpriv->piorw_irp = IoAllocateIrp(NextDeviceStackSize , FALSE);
  107700. +
  107701. +
  107702. + pintfpriv->io_irp_cnt=1;
  107703. + pintfpriv->bio_irp_pending=_FALSE;
  107704. +
  107705. + _rtw_init_sema(&(pintfpriv->io_retevt), 0);//NdisInitializeEvent(&pintfpriv->io_irp_return_evt);
  107706. +
  107707. +_func_exit_;
  107708. + return _SUCCESS;
  107709. +
  107710. +usb_init_intf_priv_fail:
  107711. +
  107712. + if (pintfpriv->allocated_io_rwmem)
  107713. + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4);
  107714. +
  107715. + if(piorw_urb)
  107716. + ExFreePool(piorw_urb);
  107717. +
  107718. + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n -usb_init_intf_priv(usb_init_intf_priv_fail)\n"));
  107719. +
  107720. +_func_exit_;
  107721. + return _FAIL;
  107722. +
  107723. +}
  107724. +
  107725. +void usb_unload_intf_priv(struct intf_priv *pintfpriv)
  107726. +{
  107727. +
  107728. +_func_enter_;
  107729. +
  107730. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n+usb_unload_intf_priv\n"));
  107731. +
  107732. + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4);
  107733. +
  107734. +#ifdef PLATFORM_WINDOWS
  107735. + if(pintfpriv->piorw_urb)
  107736. + ExFreePool(pintfpriv->piorw_urb);
  107737. +
  107738. + if(pintfpriv->piorw_irp)
  107739. + IoFreeIrp(pintfpriv->piorw_irp);
  107740. +#endif
  107741. +
  107742. +
  107743. +#ifdef PLATFORM_LINUX
  107744. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npintfpriv->io_irp_cnt=%d\n",pintfpriv->io_irp_cnt));
  107745. + pintfpriv->io_irp_cnt--;
  107746. + if(pintfpriv->io_irp_cnt){
  107747. + if(pintfpriv->bio_irp_pending==_TRUE){
  107748. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\nkill iorw_urb\n"));
  107749. + usb_kill_urb(pintfpriv->piorw_urb);
  107750. + }
  107751. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n wait io_retevt\n"));
  107752. + _rtw_down_sema(&(pintfpriv->io_retevt));
  107753. + }
  107754. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n cancel io_urb ok\n"));
  107755. +#endif
  107756. +
  107757. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n-usb_unload_intf_priv\n"));
  107758. +
  107759. +_func_exit_;
  107760. +
  107761. +}
  107762. +
  107763. +void *ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr)
  107764. +{
  107765. + HANDLE PipeHandle = NULL;
  107766. + _adapter *padapter = pNdisCEDvice->padapter;
  107767. +
  107768. +
  107769. + if(pNdisCEDvice->nr_endpoint == 11)
  107770. + {
  107771. + switch(addr)
  107772. + {
  107773. + case RTL8712_DMA_BEQ:
  107774. + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ;
  107775. + break;
  107776. + case RTL8712_DMA_BKQ:
  107777. + PipeHandle= padapter->halpriv.pipehdls_r8712[4];
  107778. + break;
  107779. + case RTL8712_DMA_VIQ:
  107780. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  107781. + break;
  107782. + case RTL8712_DMA_VOQ:
  107783. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  107784. + break;
  107785. + case RTL8712_DMA_BCNQ:
  107786. + PipeHandle= padapter->halpriv.pipehdls_r8712[6];
  107787. + break;
  107788. + case RTL8712_DMA_BMCQ: //HI Queue
  107789. + PipeHandle= padapter->halpriv.pipehdls_r8712[7];
  107790. + break;
  107791. + case RTL8712_DMA_MGTQ:
  107792. + PipeHandle= padapter->halpriv.pipehdls_r8712[8];
  107793. + break;
  107794. + case RTL8712_DMA_RX0FF:
  107795. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  107796. + break;
  107797. + case RTL8712_DMA_C2HCMD:
  107798. + PipeHandle= padapter->halpriv.pipehdls_r8712[5];
  107799. + break;
  107800. + case RTL8712_DMA_H2CCMD:
  107801. + PipeHandle= padapter->halpriv.pipehdls_r8712[9];
  107802. + break;
  107803. +
  107804. + }
  107805. +
  107806. + }
  107807. + else if(pNdisCEDvice->nr_endpoint == 6)
  107808. + {
  107809. + switch(addr)
  107810. + {
  107811. + case RTL8712_DMA_BEQ:
  107812. + PipeHandle= padapter->halpriv.pipehdls_r8712[3];
  107813. + break;
  107814. + case RTL8712_DMA_BKQ:
  107815. + PipeHandle= padapter->halpriv.pipehdls_r8712[4];
  107816. + break;
  107817. + case RTL8712_DMA_VIQ:
  107818. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  107819. + break;
  107820. + case RTL8712_DMA_VOQ:
  107821. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  107822. + break;
  107823. + case RTL8712_DMA_RX0FF:
  107824. + case RTL8712_DMA_C2HCMD:
  107825. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  107826. + break;
  107827. + case RTL8712_DMA_H2CCMD:
  107828. + case RTL8712_DMA_BCNQ:
  107829. + case RTL8712_DMA_BMCQ:
  107830. + case RTL8712_DMA_MGTQ:
  107831. + PipeHandle= padapter->halpriv.pipehdls_r8712[5];
  107832. + break;
  107833. +
  107834. + }
  107835. +
  107836. + }
  107837. + else if(pNdisCEDvice->nr_endpoint == 4)
  107838. + {
  107839. + switch(addr)
  107840. + {
  107841. + case RTL8712_DMA_BEQ:
  107842. + //case RTL8712_DMA_BKQ:
  107843. + PipeHandle= padapter->halpriv.pipehdls_r8712[2];
  107844. + break;
  107845. + //case RTL8712_DMA_VIQ:
  107846. + case RTL8712_DMA_VOQ:
  107847. + PipeHandle= padapter->halpriv.pipehdls_r8712[1];
  107848. + break;
  107849. + case RTL8712_DMA_RX0FF:
  107850. + case RTL8712_DMA_C2HCMD:
  107851. + PipeHandle= padapter->halpriv.pipehdls_r8712[0];
  107852. + break;
  107853. + case RTL8712_DMA_H2CCMD:
  107854. + case RTL8712_DMA_BCNQ:
  107855. + case RTL8712_DMA_BMCQ:
  107856. + case RTL8712_DMA_MGTQ:
  107857. + PipeHandle= padapter->halpriv.pipehdls_r8712[3];
  107858. + break;
  107859. + }
  107860. +
  107861. + }
  107862. + else
  107863. + {
  107864. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint));
  107865. + }
  107866. +
  107867. + return PipeHandle;
  107868. +
  107869. +}
  107870. +
  107871. +
  107872. +NTSTATUS usb_bulkout_zero_complete(
  107873. + PDEVICE_OBJECT pUsbDevObj,
  107874. + PIRP pIrp, void* pZeroContext)
  107875. +{
  107876. + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext;
  107877. +
  107878. +_func_enter_;
  107879. +
  107880. + if(pcontext)
  107881. + {
  107882. + if(pcontext->pbuf)
  107883. + {
  107884. + ExFreePool(pcontext->pbuf);
  107885. + }
  107886. +
  107887. + if(pcontext->purb)
  107888. + {
  107889. + ExFreePool(pcontext->purb);
  107890. + }
  107891. +
  107892. + if(pcontext->pirp && (pIrp ==pcontext->pirp))
  107893. + {
  107894. + IoFreeIrp(pIrp);
  107895. + }
  107896. +
  107897. + ExFreePool(pcontext);
  107898. + }
  107899. +
  107900. +_func_exit_;
  107901. +
  107902. + return STATUS_MORE_PROCESSING_REQUIRED;
  107903. +
  107904. +
  107905. +}
  107906. +
  107907. +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)
  107908. +{
  107909. + struct zero_bulkout_context *pcontext;
  107910. + unsigned char *pbuf;
  107911. + char NextDeviceStackSize, len;
  107912. + PIO_STACK_LOCATION nextStack;
  107913. + USBD_STATUS usbdstatus;
  107914. + HANDLE PipeHandle;
  107915. + PIRP pirp = NULL;
  107916. + PURB purb = NULL;
  107917. + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS;
  107918. + _adapter *padapter = (_adapter *)pintfhdl->adapter;
  107919. + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv;
  107920. +
  107921. +
  107922. +_func_enter_;
  107923. +
  107924. + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx))
  107925. + {
  107926. + return _FAIL;
  107927. + }
  107928. +
  107929. + len = 0;
  107930. + NextDeviceStackSize = (char)pdvobj->nextdevstacksz;
  107931. +
  107932. + pcontext = (struct zero_bulkout_context *)ExAllocatePool(NonPagedPool, sizeof(struct zero_bulkout_context));
  107933. + pbuf = (unsigned char *)ExAllocatePool(NonPagedPool, sizeof(int));
  107934. + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB));
  107935. + pirp = IoAllocateIrp(NextDeviceStackSize, FALSE);
  107936. +
  107937. + pcontext->pbuf = pbuf;
  107938. + pcontext->purb = purb;
  107939. + pcontext->pirp = pirp;
  107940. + pcontext->padapter = padapter;
  107941. +
  107942. + //translate DMA FIFO addr to pipehandle
  107943. + PipeHandle = ffaddr2pipehdl(pdvobj, addr);
  107944. +
  107945. +
  107946. + // Build our URB for USBD
  107947. + UsbBuildInterruptOrBulkTransferRequest(
  107948. + purb,
  107949. + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
  107950. + PipeHandle,
  107951. + pbuf,
  107952. + NULL,
  107953. + len,
  107954. + 0,
  107955. + NULL);
  107956. +
  107957. + //
  107958. + // call the calss driver to perform the operation
  107959. + // pass the URB to the USB driver stack
  107960. + //
  107961. + nextStack = IoGetNextIrpStackLocation(pirp);
  107962. + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
  107963. + nextStack->Parameters.Others.Argument1 = purb;
  107964. + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
  107965. +
  107966. + //Set Completion Routine
  107967. + IoSetCompletionRoutine(pirp, // irp to use
  107968. + usb_bulkout_zero_complete, // callback routine
  107969. + pcontext, // context
  107970. + TRUE, // call on success
  107971. + TRUE, // call on error
  107972. + TRUE); // call on cancel
  107973. +
  107974. +
  107975. + // Call IoCallDriver to send the irp to the usb bus driver
  107976. + //
  107977. + ndisStatus = IoCallDriver(pdvobj->pnextdevobj, pirp);
  107978. + usbdstatus = URB_STATUS(purb);
  107979. +
  107980. + if( USBD_HALTED(usbdstatus) )
  107981. + {
  107982. + padapter->bDriverStopped=_TRUE;
  107983. + padapter->bSurpriseRemoved=_TRUE;
  107984. + }
  107985. +
  107986. + //
  107987. + // The usb bus driver should always return STATUS_PENDING when bulk out irp async
  107988. + //
  107989. + if ( ndisStatus != STATUS_PENDING )
  107990. + {
  107991. + return _FAIL;
  107992. + }
  107993. +
  107994. +_func_exit_;
  107995. +
  107996. + return _SUCCESS;
  107997. +
  107998. +}
  107999. +
  108000. +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  108001. +{
  108002. + _func_enter_;
  108003. +
  108004. +
  108005. +
  108006. + _func_exit_;
  108007. +}
  108008. +
  108009. +NTSTATUS usb_write_mem_complete(PDEVICE_OBJECT pUsbDevObj, PIRP piowrite_irp, PVOID pusb_cnxt)
  108010. +{
  108011. +
  108012. + _irqL irqL;
  108013. + _list *head, *plist;
  108014. + struct io_req *pio_req;
  108015. + struct io_queue *pio_q = (struct io_queue *) pusb_cnxt;
  108016. + struct intf_hdl *pintf = &(pio_q->intf);
  108017. + struct intf_priv *pintfpriv = pintf->pintfpriv;
  108018. + _adapter *padapter = (_adapter *)pintf->adapter;
  108019. + NTSTATUS status = STATUS_SUCCESS;
  108020. +
  108021. + head = &(pio_q->processing);
  108022. +
  108023. + _func_enter_;
  108024. +
  108025. + _enter_critical_bh(&(pio_q->lock), &irqL);
  108026. +
  108027. + pintfpriv->io_irp_cnt--;
  108028. + if(pintfpriv->io_irp_cnt ==0){
  108029. + _rtw_up_sema(&(pintfpriv->io_retevt));
  108030. + }
  108031. +
  108032. + pintfpriv->bio_irp_pending=_FALSE;
  108033. +
  108034. + switch(piowrite_irp->IoStatus.Status)
  108035. + {
  108036. + case STATUS_SUCCESS:
  108037. + break;
  108038. +
  108039. + default:
  108040. + padapter->bSurpriseRemoved=_TRUE;
  108041. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usbAsynIntOutComplete:pioread_irp->IoStatus.Status !=STATUS_SUCCESS\n"));
  108042. + break;
  108043. + }
  108044. +
  108045. + //free irp in processing list...
  108046. + while(rtw_is_list_empty(head) != _TRUE)
  108047. + {
  108048. + plist = get_next(head);
  108049. + rtw_list_delete(plist);
  108050. + pio_req = LIST_CONTAINOR(plist, struct io_req, list);
  108051. + _rtw_up_sema(&pio_req->sema);
  108052. + }
  108053. +
  108054. + _exit_critical_bh(&(pio_q->lock), &irqL);
  108055. +
  108056. + _func_exit_;
  108057. +
  108058. + return STATUS_MORE_PROCESSING_REQUIRED;
  108059. +
  108060. +}
  108061. +
  108062. +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  108063. +{
  108064. + u32 bwritezero;
  108065. + _irqL irqL;
  108066. + USBD_STATUS usbdstatus;
  108067. + PIO_STACK_LOCATION nextStack;
  108068. + HANDLE PipeHandle;
  108069. + struct io_req *pio_req;
  108070. +
  108071. + _adapter *adapter = (_adapter *)pintfhdl->adapter;
  108072. + struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
  108073. + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev;
  108074. + PURB piorw_urb = pintfpriv->piorw_urb;
  108075. + PIRP piorw_irp = pintfpriv->piorw_irp;
  108076. + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
  108077. + NTSTATUS NtStatus = STATUS_SUCCESS;
  108078. +
  108079. + _func_enter_;
  108080. +
  108081. + pio_req = alloc_ioreq(pio_queue);
  108082. +
  108083. + if ((pio_req == NULL)||(adapter->bSurpriseRemoved)){
  108084. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved ));
  108085. + goto exit;
  108086. + }
  108087. +
  108088. + _enter_critical_bh(&(pio_queue->lock), &irqL);
  108089. +
  108090. + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing));
  108091. +
  108092. +
  108093. +#ifdef NDIS51_MINIPORT
  108094. + IoReuseIrp(piorw_irp, STATUS_SUCCESS);
  108095. +#else
  108096. + piorw_irp->Cancel = _FALSE;
  108097. +#endif
  108098. +
  108099. + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx))
  108100. + {
  108101. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n"));
  108102. + _func_exit_;
  108103. + return;
  108104. + }
  108105. +
  108106. + //translate DMA FIFO addr to pipehandle
  108107. + PipeHandle = ffaddr2pipehdl(pdev, addr);
  108108. +
  108109. +
  108110. + pintfpriv->io_irp_cnt++;
  108111. + pintfpriv->bio_irp_pending=_TRUE;
  108112. + // Build our URB for USBD
  108113. + UsbBuildInterruptOrBulkTransferRequest(
  108114. + piorw_urb,
  108115. + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
  108116. + PipeHandle,
  108117. + (PVOID)wmem,
  108118. + NULL,
  108119. + cnt,
  108120. + 0,
  108121. + NULL);
  108122. +
  108123. + //
  108124. + // call the calss driver to perform the operation
  108125. + // pass the URB to the USB driver stack
  108126. + //
  108127. + nextStack = IoGetNextIrpStackLocation(piorw_irp);
  108128. + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
  108129. + nextStack->Parameters.Others.Argument1 = (PURB)piorw_urb;
  108130. + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
  108131. +
  108132. + IoSetCompletionRoutine(
  108133. + piorw_irp, // irp to use
  108134. + usb_write_mem_complete, // routine to call when irp is done
  108135. + pio_queue, // context to pass routine
  108136. + TRUE, // call on success
  108137. + TRUE, // call on error
  108138. + TRUE); // call on cancel
  108139. +
  108140. + //
  108141. + // Call IoCallDriver to send the irp to the usb port
  108142. + //
  108143. + NtStatus = IoCallDriver(pdev->pnextdevobj, piorw_irp);
  108144. + usbdstatus = URB_STATUS(piorw_urb);
  108145. +
  108146. + //
  108147. + // The USB driver should always return STATUS_PENDING when
  108148. + // it receives a write irp
  108149. + //
  108150. + if ((NtStatus != STATUS_PENDING) || USBD_HALTED(usbdstatus) ) {
  108151. +
  108152. + if( USBD_HALTED(usbdstatus) ) {
  108153. +
  108154. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_mem():USBD_HALTED(usbdstatus)=%X!\n",USBD_HALTED(usbdstatus)) );
  108155. + }
  108156. + _func_exit_;
  108157. + return;//STATUS_UNSUCCESSFUL;
  108158. + }
  108159. +
  108160. + _exit_critical_bh(&(pio_queue->lock), &irqL);
  108161. +
  108162. + _rtw_down_sema(&pio_req->sema);
  108163. + free_ioreq(pio_req, pio_queue);
  108164. +
  108165. +
  108166. + bwritezero = _FALSE;
  108167. + if (pdev->ishighspeed)
  108168. + {
  108169. + if(cnt> 0 && cnt%512 == 0)
  108170. + bwritezero = _TRUE;
  108171. +
  108172. + }
  108173. + else
  108174. + {
  108175. + if(cnt > 0 && cnt%64 == 0)
  108176. + bwritezero = _TRUE;
  108177. + }
  108178. +
  108179. +
  108180. + if(bwritezero == _TRUE)
  108181. + {
  108182. + usb_bulkout_zero(pintfhdl, addr);
  108183. + }
  108184. +
  108185. +exit:
  108186. +
  108187. + _func_exit_;
  108188. +
  108189. +}
  108190. +
  108191. +NTSTATUS usb_read_port_complete(PDEVICE_OBJECT pUsbDevObj, PIRP pIrp, PVOID context)
  108192. +{
  108193. + uint isevt, *pbuf;
  108194. + struct _URB_BULK_OR_INTERRUPT_TRANSFER *pbulkurb;
  108195. + USBD_STATUS usbdstatus;
  108196. + struct recv_buf *precvbuf = (struct recv_buf *)context;
  108197. + _adapter *adapter =(_adapter *)precvbuf->adapter;
  108198. + struct recv_priv *precvpriv = &adapter->recvpriv;
  108199. + struct dvobj_priv *dev = (struct dvobj_priv *)&adapter->dvobjpriv;
  108200. + PURB purb = precvbuf->purb;
  108201. + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf;
  108202. +
  108203. + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
  108204. +
  108205. + usbdstatus = URB_STATUS(purb);
  108206. +
  108207. + _rtw_spinlock_ex(&precvpriv->lock);
  108208. + precvbuf->irp_pending=_FALSE;
  108209. + precvpriv->rx_pending_cnt --;
  108210. + _rtw_spinunlock_ex(&precvpriv->lock);
  108211. +
  108212. + if(precvpriv->rx_pending_cnt== 0) {
  108213. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n"));
  108214. + _rtw_up_sema(&precvpriv->allrxreturnevt);
  108215. + }
  108216. +
  108217. +
  108218. + if( pIrp->Cancel == _TRUE ) {
  108219. +
  108220. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: One IRP has been cancelled succesfully\n"));
  108221. + return STATUS_MORE_PROCESSING_REQUIRED;
  108222. + }
  108223. + if(adapter->bSurpriseRemoved) {
  108224. +
  108225. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved));
  108226. + return STATUS_MORE_PROCESSING_REQUIRED;
  108227. + }
  108228. +
  108229. + switch(pIrp->IoStatus.Status)
  108230. + {
  108231. + case STATUS_SUCCESS:
  108232. +
  108233. + pbulkurb = &(precvbuf->purb)->UrbBulkOrInterruptTransfer;
  108234. + if((pbulkurb->TransferBufferLength >(MAX_RECVBUF_SZ)) || (pbulkurb->TransferBufferLength < RXDESC_SIZE) )
  108235. + {
  108236. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE)\n"));
  108237. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  108238. + }
  108239. + else
  108240. + {
  108241. + precvbuf->transfer_len = pbulkurb->TransferBufferLength;
  108242. +
  108243. + pbuf = (uint*)precvbuf->pbuf;
  108244. +
  108245. + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff)
  108246. + {
  108247. + rxcmd_event_hdl(adapter, pbuf);//rx c2h events
  108248. +
  108249. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  108250. + }
  108251. + else
  108252. + {
  108253. + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets
  108254. + {
  108255. + //precvbuf->reuse = _TRUE;
  108256. + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  108257. + }
  108258. + }
  108259. +
  108260. + }
  108261. +
  108262. + break;
  108263. +
  108264. + default:
  108265. +
  108266. + if( !USBD_HALTED(usbdstatus) )
  108267. + {
  108268. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete():USBD_HALTED(usbdstatus)=%x (need to handle ) \n",USBD_HALTED(usbdstatus)));
  108269. +
  108270. + }
  108271. + else
  108272. + {
  108273. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus)) );
  108274. + adapter->bDriverStopped = _TRUE;
  108275. + adapter->bSurpriseRemoved = _TRUE;
  108276. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus))) ;
  108277. + }
  108278. +
  108279. + break;
  108280. +
  108281. + }
  108282. +
  108283. + return STATUS_MORE_PROCESSING_REQUIRED;
  108284. +
  108285. +}
  108286. +
  108287. +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  108288. +{
  108289. + u8 *pdata;
  108290. + u16 size;
  108291. + PURB purb;
  108292. + PIRP pirp;
  108293. + PIO_STACK_LOCATION nextStack;
  108294. + NTSTATUS ntstatus;
  108295. + USBD_STATUS usbdstatus;
  108296. + HANDLE PipeHandle;
  108297. + struct recv_buf *precvbuf = (struct recv_buf *)rmem;
  108298. + struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
  108299. + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev;
  108300. + _adapter *adapter = (_adapter *)pdev->padapter;
  108301. + struct recv_priv *precvpriv = &adapter->recvpriv;
  108302. + u32 bResult = _FALSE;
  108303. +
  108304. +_func_enter_;
  108305. +
  108306. + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) {
  108307. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  108308. + return bResult;
  108309. + }
  108310. +
  108311. + if(precvbuf !=NULL)
  108312. + {
  108313. +
  108314. + rtl8192cu_init_recvbuf(adapter, precvbuf);
  108315. +
  108316. + _rtw_spinlock(&precvpriv->lock);
  108317. + precvpriv->rx_pending_cnt++;
  108318. + precvbuf->irp_pending = _TRUE;
  108319. + _rtw_spinunlock(&precvpriv->lock);
  108320. +
  108321. + pdata = (u8*)precvbuf->pbuf;
  108322. +
  108323. + size = sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER );
  108324. + purb = precvbuf->purb;
  108325. +
  108326. + //translate DMA FIFO addr to pipehandle
  108327. + PipeHandle = ffaddr2pipehdl(pdev, addr);
  108328. +
  108329. + UsbBuildInterruptOrBulkTransferRequest(
  108330. + purb,
  108331. + (USHORT)size,
  108332. + PipeHandle,
  108333. + pdata,
  108334. + NULL,
  108335. + MAX_RECVBUF_SZ,
  108336. + USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK,
  108337. + NULL
  108338. + );
  108339. +
  108340. + pirp = precvbuf->pirp;
  108341. +
  108342. +#if NDIS51_MINIPORT
  108343. + IoReuseIrp(pirp, STATUS_SUCCESS);
  108344. +#else
  108345. + pirp->Cancel = _FALSE;
  108346. +#endif
  108347. +
  108348. + // call the class driver to perform the operation
  108349. + // and pass the URB to the USB driver stack
  108350. + nextStack = IoGetNextIrpStackLocation(pirp);
  108351. + nextStack->Parameters.Others.Argument1 = purb;
  108352. + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
  108353. + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
  108354. +
  108355. + IoSetCompletionRoutine(
  108356. + pirp, // irp to use
  108357. + usb_read_port_complete, // routine to call when irp is done
  108358. + precvbuf, // context to pass routine
  108359. + TRUE, // call on success
  108360. + TRUE, // call on error
  108361. + TRUE); // call on cancel
  108362. +
  108363. + //
  108364. + // The IoCallDriver routine
  108365. + // sends an IRP to the driver associated with a specified device object.
  108366. + //
  108367. + ntstatus = IoCallDriver(pdev->pnextdevobj, pirp);
  108368. + usbdstatus = URB_STATUS(purb);
  108369. +
  108370. + if( USBD_HALTED(usbdstatus) ) {
  108371. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port(): USBD_HALTED(usbdstatus=0x%.8x)=%.8x \n\n", usbdstatus, USBD_HALTED(usbdstatus)));
  108372. + pdev->padapter->bDriverStopped=_TRUE;
  108373. + pdev->padapter->bSurpriseRemoved=_TRUE;
  108374. + }
  108375. +
  108376. + if( ntstatus == STATUS_PENDING )
  108377. + {
  108378. + bResult = _TRUE;// The IRP is pended in USBD as we expected.
  108379. + }
  108380. + else {
  108381. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! IRP STATUS: %X\n", ntstatus));
  108382. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! USB STATUS: %X\n", usbdstatus));
  108383. + }
  108384. +
  108385. + }
  108386. + else{
  108387. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n"));
  108388. + }
  108389. +
  108390. +_func_exit_;
  108391. +
  108392. + return bResult;
  108393. +
  108394. +}
  108395. +
  108396. +void usb_read_port_cancel(_adapter *padapter)
  108397. +{
  108398. + struct recv_buf *precvbuf;
  108399. + sint i;
  108400. + struct dvobj_priv *pdev = &padapter->dvobjpriv;
  108401. + struct recv_priv *precvpriv=&padapter->recvpriv;
  108402. +
  108403. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n ==>usb_read_port_cancel\n"));
  108404. +
  108405. + _rtw_spinlock(&precvpriv->lock);
  108406. + precvpriv->rx_pending_cnt--; //decrease 1 for Initialize ++
  108407. + _rtw_spinunlock(&precvpriv->lock);
  108408. +
  108409. + if (precvpriv->rx_pending_cnt)
  108410. + {
  108411. + // Canceling Pending Recv Irp
  108412. + precvbuf = (struct recv_buf *)precvpriv->precv_buf;
  108413. +
  108414. + for( i = 0; i < NR_RECVBUFF; i++ )
  108415. + {
  108416. + if (precvbuf->irp_pending == _TRUE)
  108417. + {
  108418. + IoCancelIrp(precvbuf->pirp);
  108419. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel() :IoCancelIrp\n"));
  108420. + }
  108421. +
  108422. + precvbuf++;
  108423. + }
  108424. +
  108425. + _rtw_down_sema(&precvpriv->allrxreturnevt);
  108426. +
  108427. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel:down sema\n"));
  108428. +
  108429. + }
  108430. +
  108431. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("<==usb_read_port_cancel\n"));
  108432. +
  108433. +}
  108434. +
  108435. +NTSTATUS usb_write_port_complete(
  108436. + PDEVICE_OBJECT pUsbDevObj,
  108437. + PIRP pIrp,
  108438. + PVOID pTxContext
  108439. +)
  108440. +{
  108441. + u32 i, bIrpSuccess, sz;
  108442. + NTSTATUS status = STATUS_SUCCESS;
  108443. + u8 *ptr;
  108444. + struct xmit_frame *pxmitframe = (struct xmit_frame *) pTxContext;
  108445. + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf;
  108446. + _adapter *padapter = pxmitframe->padapter;
  108447. + struct dvobj_priv *pdev = (struct dvobj_priv *)&padapter->dvobjpriv;
  108448. + struct io_queue *pio_queue = (struct io_queue *)padapter->pio_queue;
  108449. + struct intf_hdl *pintfhdl = &(pio_queue->intf);
  108450. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  108451. +
  108452. +_func_enter_;
  108453. +
  108454. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n"));
  108455. +
  108456. + _rtw_spinlock_ex(&pxmitpriv->lock);
  108457. + pxmitpriv->txirp_cnt--;
  108458. + _rtw_spinunlock_ex(&pxmitpriv->lock);
  108459. +
  108460. + if(pxmitpriv->txirp_cnt==0){
  108461. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n"));
  108462. + _rtw_up_sema(&(pxmitpriv->tx_retevt));
  108463. + }
  108464. +
  108465. + status = pIrp->IoStatus.Status;
  108466. +
  108467. + if( status == STATUS_SUCCESS )
  108468. + bIrpSuccess = _TRUE;
  108469. + else
  108470. + bIrpSuccess = _FALSE;
  108471. +
  108472. + if( pIrp->Cancel == _TRUE )
  108473. + {
  108474. + if(pxmitframe !=NULL)
  108475. + {
  108476. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pIrp->Cancel == _TRUE,(pxmitframe !=NULL\n"));
  108477. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  108478. + }
  108479. +
  108480. + return STATUS_MORE_PROCESSING_REQUIRED;
  108481. + }
  108482. +
  108483. + if(padapter->bSurpriseRemoved)
  108484. + {
  108485. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  108486. + return STATUS_MORE_PROCESSING_REQUIRED;
  108487. + }
  108488. +
  108489. +
  108490. + //
  108491. + // Send 0-byte here if necessary.
  108492. + //
  108493. + // <Note>
  108494. + // 1. We MUST keep at most one IRP pending in each endpoint, otherwise USB host controler driver will hang.
  108495. + // Besides, even 0-byte IRP shall be count into #IRP sent down, so, we send 0-byte here instead of TxFillDescriptor8187().
  108496. + // 2. If we don't count 0-byte IRP into an #IRP sent down, Tx will stuck when we download files via BT and
  108497. + // play online video on XP SP1 EHCU.
  108498. + // 2005.12.26, by rcnjko.
  108499. + //
  108500. +
  108501. +
  108502. + for(i=0; i< 8; i++)
  108503. + {
  108504. + if(pIrp == pxmitframe->pxmit_irp[i])
  108505. + {
  108506. + pxmitframe->bpending[i] = _FALSE;//
  108507. + //ac_tag = pxmitframe->ac_tag[i];
  108508. + sz = pxmitframe->sz[i];
  108509. + break;
  108510. + }
  108511. + }
  108512. +
  108513. +#if 0
  108514. + pxmitframe->fragcnt--;
  108515. + if(pxmitframe->fragcnt == 0)// if((pxmitframe->fragcnt == 0) && (pxmitframe->irpcnt == 8)){
  108516. + {
  108517. + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pxmitframe->fragcnt == 0\n"));
  108518. + rtw_free_xmitframe(pxmitpriv,pxmitframe);
  108519. + }
  108520. +#else
  108521. +
  108522. + //not to consider tx fragment
  108523. + rtw_free_xmitframe(pxmitpriv, pxmitframe);
  108524. +
  108525. +#endif
  108526. +
  108527. + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf);
  108528. +
  108529. +_func_exit_;
  108530. +
  108531. + return STATUS_MORE_PROCESSING_REQUIRED;
  108532. +
  108533. +}
  108534. +
  108535. +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  108536. +{
  108537. + u32 i, bwritezero;
  108538. + u8 *ptr;
  108539. + PIO_STACK_LOCATION nextStack;
  108540. + USBD_STATUS usbdstatus;
  108541. + HANDLE PipeHandle;
  108542. + PIRP pirp = NULL;
  108543. + PURB purb = NULL;
  108544. + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS;
  108545. + _adapter *padapter = (_adapter *)pintfhdl->adapter;
  108546. + struct dvobj_priv *pNdisCEDvice = (struct dvobj_priv *)&padapter->dvobjpriv;
  108547. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  108548. + struct xmit_frame *pxmitframe = (struct xmit_frame *)wmem;
  108549. +
  108550. +_func_enter_;
  108551. +
  108552. + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx))
  108553. + {
  108554. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  108555. + return _FAIL;
  108556. + }
  108557. +
  108558. +
  108559. + for(i=0; i<8; i++)
  108560. + {
  108561. + if(pxmitframe->bpending[i] == _FALSE)
  108562. + {
  108563. + _rtw_spinlock(&pxmitpriv->lock);
  108564. + pxmitpriv->txirp_cnt++;
  108565. + pxmitframe->bpending[i] = _TRUE;
  108566. + _rtw_spinunlock(&pxmitpriv->lock);
  108567. +
  108568. + pxmitframe->sz[i] = cnt;
  108569. + purb = pxmitframe->pxmit_urb[i];
  108570. + pirp = pxmitframe->pxmit_irp[i];
  108571. +
  108572. + //pxmitframe->ac_tag[i] = ac_tag;
  108573. +
  108574. + break;
  108575. + }
  108576. + }
  108577. +
  108578. + bwritezero = _FALSE;
  108579. + if (pNdisCEDvice->ishighspeed)
  108580. + {
  108581. + if(cnt> 0 && cnt%512 == 0)
  108582. + {
  108583. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt));
  108584. + //cnt=cnt+1;
  108585. + bwritezero = _TRUE;
  108586. + }
  108587. + }
  108588. + else
  108589. + {
  108590. + if(cnt > 0 && cnt%64 == 0)
  108591. + {
  108592. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cnt=%d\n", cnt));
  108593. + //cnt=cnt+1;
  108594. + bwritezero = _TRUE;
  108595. + }
  108596. + }
  108597. +
  108598. +
  108599. +#ifdef NDIS51_MINIPORT
  108600. + IoReuseIrp(pirp, STATUS_SUCCESS);
  108601. +#else
  108602. + pirp->Cancel = _FALSE;
  108603. +#endif
  108604. +
  108605. +
  108606. + //translate DMA FIFO addr to pipehandle
  108607. + PipeHandle = ffaddr2pipehdl(pNdisCEDvice, addr);
  108608. +
  108609. +
  108610. + // Build our URB for USBD
  108611. + UsbBuildInterruptOrBulkTransferRequest(
  108612. + purb,
  108613. + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
  108614. + PipeHandle,
  108615. + pxmitframe->mem_addr,
  108616. + NULL,
  108617. + cnt,
  108618. + 0,
  108619. + NULL);
  108620. +
  108621. + //
  108622. + // call the calss driver to perform the operation
  108623. + // pass the URB to the USB driver stack
  108624. + //
  108625. + nextStack = IoGetNextIrpStackLocation(pirp);
  108626. + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
  108627. + nextStack->Parameters.Others.Argument1 = purb;
  108628. + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
  108629. +
  108630. + //Set Completion Routine
  108631. + IoSetCompletionRoutine(pirp, // irp to use
  108632. + usb_write_port_complete, // callback routine
  108633. + pxmitframe, // context
  108634. + TRUE, // call on success
  108635. + TRUE, // call on error
  108636. + TRUE); // call on cancel
  108637. +
  108638. +
  108639. + // Call IoCallDriver to send the irp to the usb bus driver
  108640. + //
  108641. + ndisStatus = IoCallDriver(pNdisCEDvice->pnextdevobj, pirp);
  108642. + usbdstatus = URB_STATUS(purb);
  108643. +
  108644. + if( USBD_HALTED(usbdstatus) )
  108645. + {
  108646. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): USBD_HALTED(usbdstatus)=%x set bDriverStopped TRUE!\n\n",USBD_HALTED(usbdstatus)) );
  108647. + padapter->bDriverStopped=_TRUE;
  108648. + padapter->bSurpriseRemoved=_TRUE;
  108649. + }
  108650. +
  108651. + //
  108652. + // The usb bus driver should always return STATUS_PENDING when bulk out irp async
  108653. + //
  108654. + if ( ndisStatus != STATUS_PENDING )
  108655. + {
  108656. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): ndisStatus(%x) != STATUS_PENDING!\n\n", ndisStatus));
  108657. +
  108658. + _func_exit_;
  108659. +
  108660. + return _FAIL;
  108661. + }
  108662. +
  108663. + if(bwritezero == _TRUE)
  108664. + {
  108665. + usb_bulkout_zero(pintfhdl, addr);
  108666. + }
  108667. +
  108668. +
  108669. +_func_exit_;
  108670. +
  108671. + return _SUCCESS;
  108672. +
  108673. +}
  108674. +
  108675. +
  108676. +void usb_write_port_cancel(_adapter *padapter)
  108677. +{
  108678. +
  108679. + sint i,j;
  108680. + struct dvobj_priv *pdev = &padapter->dvobjpriv;
  108681. + struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
  108682. + struct xmit_frame *pxmitframe;
  108683. +
  108684. + _rtw_spinlock(&pxmitpriv->lock);
  108685. + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++
  108686. + _rtw_spinunlock(&pxmitpriv->lock);
  108687. +
  108688. + if (pxmitpriv->txirp_cnt)
  108689. + {
  108690. + // Canceling Pending Recv Irp
  108691. + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf;
  108692. +
  108693. + for( i = 0; i < NR_XMITFRAME; i++ )
  108694. + {
  108695. + for(j=0;j<8;j++)
  108696. + {
  108697. + if (pxmitframe->bpending[j]==_TRUE)
  108698. + {
  108699. + IoCancelIrp(pxmitframe->pxmit_irp[j]);
  108700. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n"));
  108701. +
  108702. + }
  108703. + }
  108704. +
  108705. + pxmitframe++;
  108706. + }
  108707. +
  108708. + _rtw_down_sema(&(pxmitpriv->tx_retevt));
  108709. +
  108710. + }
  108711. +
  108712. +}
  108713. +
  108714. +
  108715. +/*! \brief Wrap the pUrb to an IRP and send this IRP to Bus Driver. Then wait for this IRP completion.
  108716. + The Caller shall be at Passive Level.
  108717. +*/
  108718. +NTSTATUS sync_callusbd(struct dvobj_priv *pdvobjpriv, PURB purb)
  108719. +{
  108720. +
  108721. + KEVENT kevent;
  108722. + PIRP irp;
  108723. + IO_STATUS_BLOCK iostatusblock;
  108724. + PIO_STACK_LOCATION nextstack;
  108725. + USBD_STATUS usbdstatus;
  108726. + LARGE_INTEGER waittime;
  108727. + NTSTATUS ntstatus = STATUS_SUCCESS;
  108728. + _adapter *padapter = pdvobjpriv->padapter;
  108729. +
  108730. +
  108731. + _func_enter_;
  108732. +
  108733. +// if(padapter->bDriverStopped) {
  108734. +// goto exit;
  108735. +// }
  108736. +
  108737. + KeInitializeEvent(&kevent, NotificationEvent, _FALSE);
  108738. + irp = IoBuildDeviceIoControlRequest(
  108739. + IOCTL_INTERNAL_USB_SUBMIT_URB,
  108740. + pdvobjpriv->pphysdevobj,//CEdevice->pUsbDevObj,
  108741. + NULL,
  108742. + 0,
  108743. + NULL,
  108744. + 0,
  108745. + _TRUE,
  108746. + &kevent,
  108747. + &iostatusblock);
  108748. +
  108749. + if(irp == NULL) {
  108750. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: memory alloc for irp failed\n"));
  108751. + ntstatus=STATUS_INSUFFICIENT_RESOURCES;
  108752. + goto exit;
  108753. + }
  108754. +
  108755. + nextstack = IoGetNextIrpStackLocation(irp);
  108756. + if(nextstack == NULL)
  108757. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("IoGetNextIrpStackLocation fail\n"));
  108758. +
  108759. + nextstack->Parameters.Others.Argument1 = purb;
  108760. +
  108761. + // Issue an IRP for Sync IO.
  108762. + ntstatus = IoCallDriver(pdvobjpriv->pphysdevobj, irp);
  108763. + usbdstatus = URB_STATUS(purb);
  108764. +
  108765. + if(ntstatus == STATUS_PENDING)
  108766. + {
  108767. + // Method 1
  108768. + waittime.QuadPart = -10000 * 50000;
  108769. + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, &waittime); //8150 code
  108770. +
  108771. + // Method 2
  108772. + //ntStatus = KeWaitForSingleObject(&Kevent, Executive, KernelMode, FALSE, NULL); //DDK sample
  108773. +
  108774. + usbdstatus = URB_STATUS(purb);
  108775. +
  108776. + if(ntstatus == STATUS_TIMEOUT)
  108777. + {
  108778. + //usbdevice->nIoStuckCnt++;
  108779. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: TIMEOUT....5000ms\n"));
  108780. +
  108781. + // Method 2
  108782. + IoCancelIrp(irp);
  108783. + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, NULL); //DDK sample
  108784. + usbdstatus = URB_STATUS(purb);
  108785. +
  108786. + usbdstatus = USBD_STATUS_SUCCESS;
  108787. + }
  108788. +
  108789. + }
  108790. +
  108791. +exit:
  108792. +
  108793. + _func_exit_;
  108794. +
  108795. + return ntstatus;
  108796. +
  108797. +}
  108798. +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
  108799. +{
  108800. + PURB purb;
  108801. + u8 ret;
  108802. + unsigned long transferflags;
  108803. + NTSTATUS ntstatus;
  108804. +
  108805. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev;
  108806. +
  108807. + _func_enter_;
  108808. +
  108809. + ret=_TRUE;
  108810. + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) );
  108811. + if(purb == NULL) {
  108812. +
  108813. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq(): Failed to allocate urb !!!\n"));
  108814. + ret =_FALSE;
  108815. + goto exit;
  108816. + }
  108817. +
  108818. + if (requesttype == 0x01) {
  108819. + transferflags = USBD_TRANSFER_DIRECTION_IN;//read_in
  108820. + } else {
  108821. + transferflags= 0;//write_out
  108822. + }
  108823. +
  108824. + UsbBuildVendorRequest(
  108825. + purb, //Pointer to an URB that is to be formatted as a vendor or class request.
  108826. + URB_FUNCTION_VENDOR_DEVICE, //Indicates the URB is a vendor-defined request for a USB device.
  108827. + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), //Specifies the length, in bytes, of the URB.
  108828. + transferflags, //TransferFlags
  108829. + 0, //ReservedBits
  108830. + request, //Request
  108831. + value, //Value
  108832. + index, //Index
  108833. + pdata, //TransferBuffer
  108834. + NULL, //TransferBufferMDL
  108835. + len, //TransferBufferLength
  108836. + NULL //Link
  108837. + );
  108838. +
  108839. + ntstatus = sync_callusbd(pdvobjpriv, purb);
  108840. + if(!NT_SUCCESS(ntstatus))
  108841. + {
  108842. + ExFreePool(purb);
  108843. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usbctrl_vendorreq() : SOMETHING WRONG\n") );
  108844. + ret = _FALSE;
  108845. + goto exit;
  108846. + }
  108847. +
  108848. + ExFreePool(purb);
  108849. +
  108850. +exit:
  108851. + _func_exit_;
  108852. +
  108853. + return ret;
  108854. +
  108855. +}
  108856. --- /dev/null
  108857. +++ b/drivers/net/wireless/rtl8192cu/ifcfg-wlan0
  108858. @@ -0,0 +1,4 @@
  108859. +#DHCP client
  108860. +DEVICE=wlan0
  108861. +BOOTPROTO=dhcp
  108862. +ONBOOT=yes
  108863. \ No newline at end of file
  108864. --- /dev/null
  108865. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h
  108866. @@ -0,0 +1,85 @@
  108867. +/******************************************************************************
  108868. + *
  108869. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  108870. + *
  108871. + * This program is free software; you can redistribute it and/or modify it
  108872. + * under the terms of version 2 of the GNU General Public License as
  108873. + * published by the Free Software Foundation.
  108874. + *
  108875. + * This program is distributed in the hope that it will be useful, but WITHOUT
  108876. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  108877. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  108878. + * more details.
  108879. + *
  108880. + * You should have received a copy of the GNU General Public License along with
  108881. + * this program; if not, write to the Free Software Foundation, Inc.,
  108882. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  108883. + *
  108884. + *
  108885. + ******************************************************************************/
  108886. +#ifndef __INC_HAL8192CE_FW_IMG_H
  108887. +#define __INC_HAL8192CE_FW_IMG_H
  108888. +
  108889. +#include <basic_types.h>
  108890. +
  108891. +/*Created on 2011/ 6/15, 5:45*/
  108892. +
  108893. +#ifdef CONFIG_BT_COEXISTENCE
  108894. +#define TSMCImgArrayLength 15706 //v84 TSMC COMMON 2012-04-13
  108895. +#else //#ifdef CONFIG_P2P
  108896. +#define TSMCImgArrayLength 16126 //v88 TSMC P2PPS with CCX report C2H 2012-12-05
  108897. +#endif
  108898. +extern u8 Rtl8192CEFwTSMCImgArray[TSMCImgArrayLength];
  108899. +
  108900. +#ifdef CONFIG_BT_COEXISTENCE
  108901. +#define UMCACutImgArrayLength 16248 //v79 UMC A Cut COMMON 2011-10-06
  108902. +#else //#ifdef CONFIG_P2P
  108903. +#define UMCACutImgArrayLength 16126 //v88 UMC A Cut P2PPS with CCX report C2H 2012-12-05
  108904. +#endif
  108905. +extern u8 Rtl8192CEFwUMCACutImgArray[UMCACutImgArrayLength];
  108906. +
  108907. +#ifdef CONFIG_BT_COEXISTENCE
  108908. +#define UMCBCutImgArrayLength 15686 //v84 UMC B Cut COMMON 2012-04-13
  108909. +#else //#ifdef CONFIG_P2P
  108910. +#define UMCBCutImgArrayLength 16096 //v88 UMC B Cut P2PPS with CCX report C2H 2012-12-05
  108911. +#endif
  108912. +extern u8 Rtl8192CEFwUMCBCutImgArray[UMCBCutImgArrayLength];
  108913. +
  108914. +//8192C_Formal_92CE_PHYforMP_110804 2011-11-23
  108915. +//8188C_Formal_88CE_PHYforMP_111117 2011-11-23
  108916. +
  108917. +#define PHY_REG_2TArrayLength 374
  108918. +extern u32 Rtl8192CEPHY_REG_2TArray[PHY_REG_2TArrayLength];
  108919. +#define PHY_REG_1TArrayLength 374
  108920. +extern u32 Rtl8192CEPHY_REG_1TArray[PHY_REG_1TArrayLength];
  108921. +#define PHY_ChangeTo_1T1RArrayLength 1
  108922. +extern u32 Rtl8192CEPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength];
  108923. +#define PHY_ChangeTo_1T2RArrayLength 1
  108924. +extern u32 Rtl8192CEPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength];
  108925. +#define PHY_ChangeTo_2T2RArrayLength 1
  108926. +extern u32 Rtl8192CEPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength];
  108927. +#define PHY_REG_Array_PGLength 336
  108928. +extern u32 Rtl8192CEPHY_REG_Array_PG[PHY_REG_Array_PGLength];
  108929. +#define PHY_REG_Array_MPLength 4
  108930. +extern u32 Rtl8192CEPHY_REG_Array_MP[PHY_REG_Array_MPLength];
  108931. +#define RadioA_2TArrayLength 282
  108932. +extern u32 Rtl8192CERadioA_2TArray[RadioA_2TArrayLength];
  108933. +#define RadioB_2TArrayLength 78
  108934. +extern u32 Rtl8192CERadioB_2TArray[RadioB_2TArrayLength];
  108935. +#define RadioA_1TArrayLength 282
  108936. +extern u32 Rtl8192CERadioA_1TArray[RadioA_1TArrayLength];
  108937. +#define RadioB_1TArrayLength 1
  108938. +extern u32 Rtl8192CERadioB_1TArray[RadioB_1TArrayLength];
  108939. +#define RadioB_GM_ArrayLength 1
  108940. +extern u32 Rtl8192CERadioB_GM_Array[RadioB_GM_ArrayLength];
  108941. +// MAC reg V14 - 2011-11-23
  108942. +#define MAC_2T_ArrayLength 174
  108943. +extern u32 Rtl8192CEMAC_2T_Array[MAC_2T_ArrayLength];
  108944. +#define MACPHY_Array_PGLength 1
  108945. +extern u32 Rtl8192CEMACPHY_Array_PG[MACPHY_Array_PGLength];
  108946. +#define AGCTAB_2TArrayLength 320
  108947. +extern u32 Rtl8192CEAGCTAB_2TArray[AGCTAB_2TArrayLength];
  108948. +#define AGCTAB_1TArrayLength 320
  108949. +extern u32 Rtl8192CEAGCTAB_1TArray[AGCTAB_1TArrayLength];
  108950. +
  108951. +#endif //__INC_HAL8192CE_FW_IMG_H
  108952. --- /dev/null
  108953. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h
  108954. @@ -0,0 +1,427 @@
  108955. +/******************************************************************************
  108956. + *
  108957. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  108958. + *
  108959. + * This program is free software; you can redistribute it and/or modify it
  108960. + * under the terms of version 2 of the GNU General Public License as
  108961. + * published by the Free Software Foundation.
  108962. + *
  108963. + * This program is distributed in the hope that it will be useful, but WITHOUT
  108964. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  108965. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  108966. + * more details.
  108967. + *
  108968. + * You should have received a copy of the GNU General Public License along with
  108969. + * this program; if not, write to the Free Software Foundation, Inc.,
  108970. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  108971. + *
  108972. + *
  108973. + ******************************************************************************/
  108974. +/*****************************************************************************
  108975. + * Module: __INC_HAL8192CPHYCFG_H
  108976. + *
  108977. + *
  108978. + * Note:
  108979. + *
  108980. + *
  108981. + * Export: Constants, macro, functions(API), global variables(None).
  108982. + *
  108983. + * Abbrev:
  108984. + *
  108985. + * History:
  108986. + * Data Who Remark
  108987. + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
  108988. + * 2. Reorganize code architecture.
  108989. + *
  108990. + *****************************************************************************/
  108991. + /* Check to see if the file has been included already. */
  108992. +#ifndef __INC_HAL8192CPHYCFG_H
  108993. +#define __INC_HAL8192CPHYCFG_H
  108994. +
  108995. +
  108996. +/*--------------------------Define Parameters-------------------------------*/
  108997. +#define LOOP_LIMIT 5
  108998. +#define MAX_STALL_TIME 50 //us
  108999. +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)
  109000. +#define MAX_TXPWR_IDX_NMODE_92S 63
  109001. +#define Reset_Cnt_Limit 3
  109002. +
  109003. +#define IQK_MAC_REG_NUM 4
  109004. +#define IQK_ADDA_REG_NUM 16
  109005. +#define IQK_BB_REG_NUM 9
  109006. +#define HP_THERMAL_NUM 8
  109007. +
  109008. +#ifdef CONFIG_PCI_HCI
  109009. +#define MAX_AGGR_NUM 0x0A0A
  109010. +#else
  109011. +#define MAX_AGGR_NUM 0x0909
  109012. +#endif
  109013. +
  109014. +#ifdef CONFIG_PCI_HCI
  109015. +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \
  109016. +{ \
  109017. + u1Byte u1bTmp; \
  109018. + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \
  109019. + u1bTmp |= BIT0; \
  109020. + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \
  109021. + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \
  109022. + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \
  109023. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \
  109024. + delay_us(100); \
  109025. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \
  109026. + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \
  109027. + delay_us(10); \
  109028. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \
  109029. + delay_us(10); \
  109030. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \
  109031. + delay_us(10); \
  109032. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \
  109033. +}
  109034. +#endif
  109035. +
  109036. +
  109037. +/*--------------------------Define Parameters-------------------------------*/
  109038. +
  109039. +
  109040. +/*------------------------------Define structure----------------------------*/
  109041. +typedef enum _SwChnlCmdID{
  109042. + CmdID_End,
  109043. + CmdID_SetTxPowerLevel,
  109044. + CmdID_BBRegWrite10,
  109045. + CmdID_WritePortUlong,
  109046. + CmdID_WritePortUshort,
  109047. + CmdID_WritePortUchar,
  109048. + CmdID_RF_WriteReg,
  109049. +}SwChnlCmdID;
  109050. +
  109051. +
  109052. +/* 1. Switch channel related */
  109053. +typedef struct _SwChnlCmd{
  109054. + SwChnlCmdID CmdID;
  109055. + u32 Para1;
  109056. + u32 Para2;
  109057. + u32 msDelay;
  109058. +}SwChnlCmd;
  109059. +
  109060. +typedef enum _HW90_BLOCK{
  109061. + HW90_BLOCK_MAC = 0,
  109062. + HW90_BLOCK_PHY0 = 1,
  109063. + HW90_BLOCK_PHY1 = 2,
  109064. + HW90_BLOCK_RF = 3,
  109065. + HW90_BLOCK_MAXIMUM = 4, // Never use this
  109066. +}HW90_BLOCK_E, *PHW90_BLOCK_E;
  109067. +
  109068. +#define RF_PATH_MAX 2
  109069. +
  109070. +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number
  109071. +#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups
  109072. +
  109073. +typedef enum _WIRELESS_MODE {
  109074. + WIRELESS_MODE_UNKNOWN = 0x00,
  109075. + WIRELESS_MODE_A = 0x01,
  109076. + WIRELESS_MODE_B = 0x02,
  109077. + WIRELESS_MODE_G = 0x04,
  109078. + WIRELESS_MODE_AUTO = 0x08,
  109079. + WIRELESS_MODE_N_24G = 0x10,
  109080. + WIRELESS_MODE_N_5G = 0x20
  109081. +} WIRELESS_MODE;
  109082. +
  109083. +typedef enum _BaseBand_Config_Type{
  109084. + BaseBand_Config_PHY_REG = 0, //Radio Path A
  109085. + BaseBand_Config_AGC_TAB = 1, //Radio Path B
  109086. +}BaseBand_Config_Type, *PBaseBand_Config_Type;
  109087. +
  109088. +
  109089. +typedef enum _PHY_Rate_Tx_Power_Offset_Area{
  109090. + RA_OFFSET_LEGACY_OFDM1,
  109091. + RA_OFFSET_LEGACY_OFDM2,
  109092. + RA_OFFSET_HT_OFDM1,
  109093. + RA_OFFSET_HT_OFDM2,
  109094. + RA_OFFSET_HT_OFDM3,
  109095. + RA_OFFSET_HT_OFDM4,
  109096. + RA_OFFSET_HT_CCK,
  109097. +}RA_OFFSET_AREA,*PRA_OFFSET_AREA;
  109098. +
  109099. +
  109100. +/* BB/RF related */
  109101. +typedef enum _RF_TYPE_8190P{
  109102. + RF_TYPE_MIN, // 0
  109103. + RF_8225=1, // 1 11b/g RF for verification only
  109104. + RF_8256=2, // 2 11b/g/n
  109105. + RF_8258=3, // 3 11a/b/g/n RF
  109106. + RF_6052=4, // 4 11b/g/n RF
  109107. + //RF_6052=5, // 4 11b/g/n RF
  109108. + // TODO: We sholud remove this psudo PHY RF after we get new RF.
  109109. + RF_PSEUDO_11N=5, // 5, It is a temporality RF.
  109110. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E;
  109111. +
  109112. +typedef struct _BB_REGISTER_DEFINITION{
  109113. + u32 rfintfs; // set software control:
  109114. + // 0x870~0x877[8 bytes]
  109115. +
  109116. + u32 rfintfi; // readback data:
  109117. + // 0x8e0~0x8e7[8 bytes]
  109118. +
  109119. + u32 rfintfo; // output data:
  109120. + // 0x860~0x86f [16 bytes]
  109121. +
  109122. + u32 rfintfe; // output enable:
  109123. + // 0x860~0x86f [16 bytes]
  109124. +
  109125. + u32 rf3wireOffset; // LSSI data:
  109126. + // 0x840~0x84f [16 bytes]
  109127. +
  109128. + u32 rfLSSI_Select; // BB Band Select:
  109129. + // 0x878~0x87f [8 bytes]
  109130. +
  109131. + u32 rfTxGainStage; // Tx gain stage:
  109132. + // 0x80c~0x80f [4 bytes]
  109133. +
  109134. + u32 rfHSSIPara1; // wire parameter control1 :
  109135. + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes]
  109136. +
  109137. + u32 rfHSSIPara2; // wire parameter control2 :
  109138. + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes]
  109139. +
  109140. + u32 rfSwitchControl; //Tx Rx antenna control :
  109141. + // 0x858~0x85f [16 bytes]
  109142. +
  109143. + u32 rfAGCControl1; //AGC parameter control1 :
  109144. + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes]
  109145. +
  109146. + u32 rfAGCControl2; //AGC parameter control2 :
  109147. + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes]
  109148. +
  109149. + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix :
  109150. + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes]
  109151. +
  109152. + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter :
  109153. + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes]
  109154. +
  109155. + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix
  109156. + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes]
  109157. +
  109158. + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type
  109159. + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes]
  109160. +
  109161. + u32 rfLSSIReadBack; //LSSI RF readback data SI mode
  109162. + // 0x8a0~0x8af [16 bytes]
  109163. +
  109164. + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B
  109165. +
  109166. +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T;
  109167. +
  109168. +#ifdef CONFIG_MP_INCLUDED
  109169. +typedef enum _ANTENNA_PATH{
  109170. + ANTENNA_NONE = 0x00,
  109171. + ANTENNA_D ,
  109172. + ANTENNA_C ,
  109173. + ANTENNA_CD ,
  109174. + ANTENNA_B ,
  109175. + ANTENNA_BD ,
  109176. + ANTENNA_BC ,
  109177. + ANTENNA_BCD ,
  109178. + ANTENNA_A ,
  109179. + ANTENNA_AD ,
  109180. + ANTENNA_AC ,
  109181. + ANTENNA_ACD ,
  109182. + ANTENNA_AB ,
  109183. + ANTENNA_ABD ,
  109184. + ANTENNA_ABC ,
  109185. + ANTENNA_ABCD
  109186. +} ANTENNA_PATH;
  109187. +#endif
  109188. +
  109189. +typedef struct _R_ANTENNA_SELECT_OFDM{
  109190. + u32 r_tx_antenna:4;
  109191. + u32 r_ant_l:4;
  109192. + u32 r_ant_non_ht:4;
  109193. + u32 r_ant_ht1:4;
  109194. + u32 r_ant_ht2:4;
  109195. + u32 r_ant_ht_s1:4;
  109196. + u32 r_ant_non_ht_s1:4;
  109197. + u32 OFDM_TXSC:2;
  109198. + u32 Reserved:2;
  109199. +}R_ANTENNA_SELECT_OFDM;
  109200. +
  109201. +typedef struct _R_ANTENNA_SELECT_CCK{
  109202. + u8 r_cckrx_enable_2:2;
  109203. + u8 r_cckrx_enable:2;
  109204. + u8 r_ccktx_enable:4;
  109205. +}R_ANTENNA_SELECT_CCK;
  109206. +
  109207. +/*------------------------------Define structure----------------------------*/
  109208. +
  109209. +
  109210. +/*------------------------Export global variable----------------------------*/
  109211. +/*------------------------Export global variable----------------------------*/
  109212. +
  109213. +
  109214. +/*------------------------Export Marco Definition---------------------------*/
  109215. +/*------------------------Export Marco Definition---------------------------*/
  109216. +
  109217. +
  109218. +/*--------------------------Exported Function prototype---------------------*/
  109219. +//
  109220. +// BB and RF register read/write
  109221. +//
  109222. +u32 rtl8192c_PHY_QueryBBReg( IN PADAPTER Adapter,
  109223. + IN u32 RegAddr,
  109224. + IN u32 BitMask );
  109225. +void rtl8192c_PHY_SetBBReg( IN PADAPTER Adapter,
  109226. + IN u32 RegAddr,
  109227. + IN u32 BitMask,
  109228. + IN u32 Data );
  109229. +u32 rtl8192c_PHY_QueryRFReg( IN PADAPTER Adapter,
  109230. + IN RF_RADIO_PATH_E eRFPath,
  109231. + IN u32 RegAddr,
  109232. + IN u32 BitMask );
  109233. +void rtl8192c_PHY_SetRFReg( IN PADAPTER Adapter,
  109234. + IN RF_RADIO_PATH_E eRFPath,
  109235. + IN u32 RegAddr,
  109236. + IN u32 BitMask,
  109237. + IN u32 Data );
  109238. +
  109239. +//
  109240. +// Initialization related function
  109241. +//
  109242. +/* MAC/BB/RF HAL config */
  109243. +int PHY_MACConfig8192C( IN PADAPTER Adapter );
  109244. +int PHY_BBConfig8192C( IN PADAPTER Adapter );
  109245. +int PHY_RFConfig8192C( IN PADAPTER Adapter );
  109246. +/* RF config */
  109247. +int rtl8192c_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter,
  109248. + IN u8* pFileName,
  109249. + IN RF_RADIO_PATH_E eRFPath);
  109250. +int rtl8192c_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter,
  109251. + IN RF_RADIO_PATH_E eRFPath);
  109252. +
  109253. +/* BB/RF readback check for making sure init OK */
  109254. +int rtl8192c_PHY_CheckBBAndRFOK( IN PADAPTER Adapter,
  109255. + IN HW90_BLOCK_E CheckBlock,
  109256. + IN RF_RADIO_PATH_E eRFPath );
  109257. +/* Read initi reg value for tx power setting. */
  109258. +void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter );
  109259. +
  109260. +//
  109261. +// RF Power setting
  109262. +//
  109263. +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter,
  109264. +// IN RT_RF_POWER_STATE eRFPowerState);
  109265. +
  109266. +//
  109267. +// BB TX Power R/W
  109268. +//
  109269. +void PHY_GetTxPowerLevel8192C( IN PADAPTER Adapter,
  109270. + OUT u32* powerlevel );
  109271. +void PHY_SetTxPowerLevel8192C( IN PADAPTER Adapter,
  109272. + IN u8 channel );
  109273. +BOOLEAN PHY_UpdateTxPowerDbm8192C( IN PADAPTER Adapter,
  109274. + IN int powerInDbm );
  109275. +
  109276. +//
  109277. +VOID
  109278. +PHY_ScanOperationBackup8192C(IN PADAPTER Adapter,
  109279. + IN u8 Operation );
  109280. +
  109281. +//
  109282. +// Switch bandwidth for 8192S
  109283. +//
  109284. +//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer );
  109285. +void PHY_SetBWMode8192C( IN PADAPTER pAdapter,
  109286. + IN HT_CHANNEL_WIDTH ChnlWidth,
  109287. + IN unsigned char Offset );
  109288. +
  109289. +//
  109290. +// Set FW CMD IO for 8192S.
  109291. +//
  109292. +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter,
  109293. +// IN IO_TYPE IOType);
  109294. +
  109295. +//
  109296. +// Set A2 entry to fw for 8192S
  109297. +//
  109298. +extern void FillA2Entry8192C( IN PADAPTER Adapter,
  109299. + IN u8 index,
  109300. + IN u8* val);
  109301. +
  109302. +
  109303. +//
  109304. +// channel switch related funciton
  109305. +//
  109306. +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer );
  109307. +void PHY_SwChnl8192C( IN PADAPTER pAdapter,
  109308. + IN u8 channel );
  109309. + // Call after initialization
  109310. +void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter,
  109311. + IN u8 channel );
  109312. +
  109313. +void ChkFwCmdIoDone( IN PADAPTER Adapter);
  109314. +
  109315. +#ifdef USE_WORKITEM
  109316. +//extern void SetIOWorkItemCallback( IN PVOID pContext );
  109317. +#else
  109318. +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer);
  109319. +#endif
  109320. +
  109321. +//
  109322. +// BB/MAC/RF other monitor API
  109323. +//
  109324. +void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter,
  109325. + IN BOOLEAN bEnableMonitorMode );
  109326. +
  109327. +BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter,
  109328. + IN u32 eRFPath );
  109329. +
  109330. +//
  109331. +// IQ calibrate
  109332. +//
  109333. +VOID rtl8192c_PHY_IQCalibrate( IN PADAPTER pAdapter , IN BOOLEAN bReCovery);
  109334. +
  109335. +//
  109336. +// LC calibrate
  109337. +//
  109338. +VOID rtl8192c_PHY_LCCalibrate(IN PADAPTER pAdapter);
  109339. +
  109340. +//
  109341. +// AP calibrate
  109342. +//
  109343. +VOID rtl8192c_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta);
  109344. +
  109345. +VOID rtl8192c_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain);
  109346. +
  109347. +//
  109348. +// Modify the value of the hw register when beacon interval be changed.
  109349. +//
  109350. +void
  109351. +rtl8192c_PHY_SetBeaconHwReg( IN PADAPTER Adapter,
  109352. + IN u16 BeaconInterval );
  109353. +
  109354. +
  109355. +extern VOID
  109356. +PHY_SwitchEphyParameter(
  109357. + IN PADAPTER Adapter
  109358. + );
  109359. +
  109360. +extern VOID
  109361. +PHY_EnableHostClkReq(
  109362. + IN PADAPTER Adapter
  109363. + );
  109364. +
  109365. +BOOLEAN
  109366. +SetAntennaConfig92C(
  109367. + IN PADAPTER Adapter,
  109368. + IN u8 DefaultAnt
  109369. + );
  109370. +
  109371. +
  109372. +/*--------------------------Exported Function prototype---------------------*/
  109373. +
  109374. +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192c_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask))
  109375. +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192c_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data))
  109376. +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192c_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask))
  109377. +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192c_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data))
  109378. +
  109379. +#define PHY_SetMacReg PHY_SetBBReg
  109380. +
  109381. +#endif // __INC_HAL8192CPHYCFG_H
  109382. --- /dev/null
  109383. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h
  109384. @@ -0,0 +1,1122 @@
  109385. +/******************************************************************************
  109386. + *
  109387. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  109388. + *
  109389. + * This program is free software; you can redistribute it and/or modify it
  109390. + * under the terms of version 2 of the GNU General Public License as
  109391. + * published by the Free Software Foundation.
  109392. + *
  109393. + * This program is distributed in the hope that it will be useful, but WITHOUT
  109394. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  109395. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  109396. + * more details.
  109397. + *
  109398. + * You should have received a copy of the GNU General Public License along with
  109399. + * this program; if not, write to the Free Software Foundation, Inc.,
  109400. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  109401. + *
  109402. + *
  109403. + ******************************************************************************/
  109404. +/*****************************************************************************
  109405. + *
  109406. + * Module: __INC_HAL8192CPHYREG_H
  109407. + *
  109408. + *
  109409. + * Note: 1. Define PMAC/BB register map
  109410. + * 2. Define RF register map
  109411. + * 3. PMAC/BB register bit mask.
  109412. + * 4. RF reg bit mask.
  109413. + * 5. Other BB/RF relative definition.
  109414. + *
  109415. + *
  109416. + * Export: Constants, macro, functions(API), global variables(None).
  109417. + *
  109418. + * Abbrev:
  109419. + *
  109420. + * History:
  109421. + * Data Who Remark
  109422. + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
  109423. + * 2. Reorganize code architecture.
  109424. + * 09/25/2008 MH 1. Add RL6052 register definition
  109425. + *
  109426. + *****************************************************************************/
  109427. +#ifndef __INC_HAL8192CPHYREG_H
  109428. +#define __INC_HAL8192CPHYREG_H
  109429. +
  109430. +
  109431. +/*--------------------------Define Parameters-------------------------------*/
  109432. +
  109433. +//============================================================
  109434. +// 8192S Regsiter offset definition
  109435. +//============================================================
  109436. +
  109437. +//
  109438. +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF
  109439. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  109440. +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00
  109441. +// 3. RF register 0x00-2E
  109442. +// 4. Bit Mask for BB/RF register
  109443. +// 5. Other defintion for BB/RF R/W
  109444. +//
  109445. +
  109446. +
  109447. +//
  109448. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  109449. +// 1. Page1(0x100)
  109450. +//
  109451. +#define rPMAC_Reset 0x100
  109452. +#define rPMAC_TxStart 0x104
  109453. +#define rPMAC_TxLegacySIG 0x108
  109454. +#define rPMAC_TxHTSIG1 0x10c
  109455. +#define rPMAC_TxHTSIG2 0x110
  109456. +#define rPMAC_PHYDebug 0x114
  109457. +#define rPMAC_TxPacketNum 0x118
  109458. +#define rPMAC_TxIdle 0x11c
  109459. +#define rPMAC_TxMACHeader0 0x120
  109460. +#define rPMAC_TxMACHeader1 0x124
  109461. +#define rPMAC_TxMACHeader2 0x128
  109462. +#define rPMAC_TxMACHeader3 0x12c
  109463. +#define rPMAC_TxMACHeader4 0x130
  109464. +#define rPMAC_TxMACHeader5 0x134
  109465. +#define rPMAC_TxDataType 0x138
  109466. +#define rPMAC_TxRandomSeed 0x13c
  109467. +#define rPMAC_CCKPLCPPreamble 0x140
  109468. +#define rPMAC_CCKPLCPHeader 0x144
  109469. +#define rPMAC_CCKCRC16 0x148
  109470. +#define rPMAC_OFDMRxCRC32OK 0x170
  109471. +#define rPMAC_OFDMRxCRC32Er 0x174
  109472. +#define rPMAC_OFDMRxParityEr 0x178
  109473. +#define rPMAC_OFDMRxCRC8Er 0x17c
  109474. +#define rPMAC_CCKCRxRC16Er 0x180
  109475. +#define rPMAC_CCKCRxRC32Er 0x184
  109476. +#define rPMAC_CCKCRxRC32OK 0x188
  109477. +#define rPMAC_TxStatus 0x18c
  109478. +
  109479. +//
  109480. +// 2. Page2(0x200)
  109481. +//
  109482. +// The following two definition are only used for USB interface.
  109483. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address.
  109484. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data.
  109485. +
  109486. +//
  109487. +// 3. Page8(0x800)
  109488. +//
  109489. +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting??
  109490. +
  109491. +#define rFPGA0_TxInfo 0x804 // Status report??
  109492. +#define rFPGA0_PSDFunction 0x808
  109493. +
  109494. +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain?
  109495. +
  109496. +#define rFPGA0_RFTiming1 0x810 // Useless now
  109497. +#define rFPGA0_RFTiming2 0x814
  109498. +
  109499. +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register
  109500. +#define rFPGA0_XA_HSSIParameter2 0x824
  109501. +#define rFPGA0_XB_HSSIParameter1 0x828
  109502. +#define rFPGA0_XB_HSSIParameter2 0x82c
  109503. +#define rTxAGC_B_Rate18_06 0x830
  109504. +#define rTxAGC_B_Rate54_24 0x834
  109505. +#define rTxAGC_B_CCK1_55_Mcs32 0x838
  109506. +#define rTxAGC_B_Mcs03_Mcs00 0x83c
  109507. +
  109508. +#define rTxAGC_B_Mcs07_Mcs04 0x848
  109509. +#define rTxAGC_B_Mcs11_Mcs08 0x84c
  109510. +
  109511. +#define rFPGA0_XA_LSSIParameter 0x840
  109512. +#define rFPGA0_XB_LSSIParameter 0x844
  109513. +
  109514. +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now
  109515. +#define rFPGA0_RFSleepUpParameter 0x854
  109516. +
  109517. +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch
  109518. +#define rFPGA0_XCD_SwitchControl 0x85c
  109519. +
  109520. +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch
  109521. +#define rFPGA0_XB_RFInterfaceOE 0x864
  109522. +
  109523. +#define rTxAGC_B_Mcs15_Mcs12 0x868
  109524. +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c
  109525. +
  109526. +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control
  109527. +#define rFPGA0_XCD_RFInterfaceSW 0x874
  109528. +
  109529. +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter
  109530. +#define rFPGA0_XCD_RFParameter 0x87c
  109531. +
  109532. +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4??
  109533. +#define rFPGA0_AnalogParameter2 0x884
  109534. +#define rFPGA0_AnalogParameter3 0x888 // Useless now
  109535. +#define rFPGA0_AnalogParameter4 0x88c
  109536. +
  109537. +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback
  109538. +#define rFPGA0_XB_LSSIReadBack 0x8a4
  109539. +#define rFPGA0_XC_LSSIReadBack 0x8a8
  109540. +#define rFPGA0_XD_LSSIReadBack 0x8ac
  109541. +
  109542. +#define rFPGA0_PSDReport 0x8b4 // Useless now
  109543. +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback
  109544. +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback
  109545. +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value
  109546. +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now
  109547. +
  109548. +//
  109549. +// 4. Page9(0x900)
  109550. +//
  109551. +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting??
  109552. +
  109553. +#define rFPGA1_TxBlock 0x904 // Useless now
  109554. +#define rFPGA1_DebugSelect 0x908 // Useless now
  109555. +#define rFPGA1_TxInfo 0x90c // Useless now // Status report??
  109556. +
  109557. +//
  109558. +// 5. PageA(0xA00)
  109559. +//
  109560. +// Set Control channel to upper or lower. These settings are required only for 40MHz
  109561. +#define rCCK0_System 0xa00
  109562. +
  109563. +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI
  109564. +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain
  109565. +
  109566. +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series
  109567. +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC
  109568. +
  109569. +#define rCCK0_RxHP 0xa14
  109570. +
  109571. +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold
  109572. +#define rCCK0_DSPParameter2 0xa1c //SQ threshold
  109573. +
  109574. +#define rCCK0_TxFilter1 0xa20
  109575. +#define rCCK0_TxFilter2 0xa24
  109576. +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3
  109577. +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report
  109578. +#define rCCK0_TRSSIReport 0xa50
  109579. +#define rCCK0_RxReport 0xa54 //0xa57
  109580. +#define rCCK0_FACounterLower 0xa5c //0xa5b
  109581. +#define rCCK0_FACounterUpper 0xa58 //0xa5c
  109582. +
  109583. +//
  109584. +// PageB(0xB00)
  109585. +//
  109586. +#define rPdp_AntA 0xb00
  109587. +#define rPdp_AntA_4 0xb04
  109588. +#define rConfig_Pmpd_AntA 0xb28
  109589. +#define rConfig_AntA 0xb68
  109590. +#define rConfig_AntB 0xb6c
  109591. +#define rPdp_AntB 0xb70
  109592. +#define rPdp_AntB_4 0xb74
  109593. +#define rConfig_Pmpd_AntB 0xb98
  109594. +#define rAPK 0xbd8
  109595. +
  109596. +//
  109597. +// 6. PageC(0xC00)
  109598. +//
  109599. +#define rOFDM0_LSTF 0xc00
  109600. +
  109601. +#define rOFDM0_TRxPathEnable 0xc04
  109602. +#define rOFDM0_TRMuxPar 0xc08
  109603. +#define rOFDM0_TRSWIsolation 0xc0c
  109604. +
  109605. +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter
  109606. +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix
  109607. +#define rOFDM0_XBRxAFE 0xc18
  109608. +#define rOFDM0_XBRxIQImbalance 0xc1c
  109609. +#define rOFDM0_XCRxAFE 0xc20
  109610. +#define rOFDM0_XCRxIQImbalance 0xc24
  109611. +#define rOFDM0_XDRxAFE 0xc28
  109612. +#define rOFDM0_XDRxIQImbalance 0xc2c
  109613. +
  109614. +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain
  109615. +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync.
  109616. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync.
  109617. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI
  109618. +
  109619. +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path
  109620. +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC
  109621. +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold
  109622. +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA
  109623. +
  109624. +#define rOFDM0_XAAGCCore1 0xc50 // DIG
  109625. +#define rOFDM0_XAAGCCore2 0xc54
  109626. +#define rOFDM0_XBAGCCore1 0xc58
  109627. +#define rOFDM0_XBAGCCore2 0xc5c
  109628. +#define rOFDM0_XCAGCCore1 0xc60
  109629. +#define rOFDM0_XCAGCCore2 0xc64
  109630. +#define rOFDM0_XDAGCCore1 0xc68
  109631. +#define rOFDM0_XDAGCCore2 0xc6c
  109632. +
  109633. +#define rOFDM0_AGCParameter1 0xc70
  109634. +#define rOFDM0_AGCParameter2 0xc74
  109635. +#define rOFDM0_AGCRSSITable 0xc78
  109636. +#define rOFDM0_HTSTFAGC 0xc7c
  109637. +
  109638. +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG
  109639. +#define rOFDM0_XATxAFE 0xc84
  109640. +#define rOFDM0_XBTxIQImbalance 0xc88
  109641. +#define rOFDM0_XBTxAFE 0xc8c
  109642. +#define rOFDM0_XCTxIQImbalance 0xc90
  109643. +#define rOFDM0_XCTxAFE 0xc94
  109644. +#define rOFDM0_XDTxIQImbalance 0xc98
  109645. +#define rOFDM0_XDTxAFE 0xc9c
  109646. +
  109647. +#define rOFDM0_RxIQExtAnta 0xca0
  109648. +#define rOFDM0_TxCoeff1 0xca4
  109649. +#define rOFDM0_TxCoeff2 0xca8
  109650. +#define rOFDM0_TxCoeff3 0xcac
  109651. +#define rOFDM0_TxCoeff4 0xcb0
  109652. +#define rOFDM0_TxCoeff5 0xcb4
  109653. +#define rOFDM0_TxCoeff6 0xcb8
  109654. +#define rOFDM0_RxHPParameter 0xce0
  109655. +#define rOFDM0_TxPseudoNoiseWgt 0xce4
  109656. +#define rOFDM0_FrameSync 0xcf0
  109657. +#define rOFDM0_DFSReport 0xcf4
  109658. +
  109659. +//
  109660. +// 7. PageD(0xD00)
  109661. +//
  109662. +#define rOFDM1_LSTF 0xd00
  109663. +#define rOFDM1_TRxPathEnable 0xd04
  109664. +
  109665. +#define rOFDM1_CFO 0xd08 // No setting now
  109666. +#define rOFDM1_CSI1 0xd10
  109667. +#define rOFDM1_SBD 0xd14
  109668. +#define rOFDM1_CSI2 0xd18
  109669. +#define rOFDM1_CFOTracking 0xd2c
  109670. +#define rOFDM1_TRxMesaure1 0xd34
  109671. +#define rOFDM1_IntfDet 0xd3c
  109672. +#define rOFDM1_PseudoNoiseStateAB 0xd50
  109673. +#define rOFDM1_PseudoNoiseStateCD 0xd54
  109674. +#define rOFDM1_RxPseudoNoiseWgt 0xd58
  109675. +
  109676. +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail
  109677. +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail
  109678. +#define rOFDM_PHYCounter3 0xda8 //MCS not support
  109679. +
  109680. +#define rOFDM_ShortCFOAB 0xdac // No setting now
  109681. +#define rOFDM_ShortCFOCD 0xdb0
  109682. +#define rOFDM_LongCFOAB 0xdb4
  109683. +#define rOFDM_LongCFOCD 0xdb8
  109684. +#define rOFDM_TailCFOAB 0xdbc
  109685. +#define rOFDM_TailCFOCD 0xdc0
  109686. +#define rOFDM_PWMeasure1 0xdc4
  109687. +#define rOFDM_PWMeasure2 0xdc8
  109688. +#define rOFDM_BWReport 0xdcc
  109689. +#define rOFDM_AGCReport 0xdd0
  109690. +#define rOFDM_RxSNR 0xdd4
  109691. +#define rOFDM_RxEVMCSI 0xdd8
  109692. +#define rOFDM_SIGReport 0xddc
  109693. +
  109694. +
  109695. +//
  109696. +// 8. PageE(0xE00)
  109697. +//
  109698. +#define rTxAGC_A_Rate18_06 0xe00
  109699. +#define rTxAGC_A_Rate54_24 0xe04
  109700. +#define rTxAGC_A_CCK1_Mcs32 0xe08
  109701. +#define rTxAGC_A_Mcs03_Mcs00 0xe10
  109702. +#define rTxAGC_A_Mcs07_Mcs04 0xe14
  109703. +#define rTxAGC_A_Mcs11_Mcs08 0xe18
  109704. +#define rTxAGC_A_Mcs15_Mcs12 0xe1c
  109705. +
  109706. +#define rFPGA0_IQK 0xe28
  109707. +#define rTx_IQK_Tone_A 0xe30
  109708. +#define rRx_IQK_Tone_A 0xe34
  109709. +#define rTx_IQK_PI_A 0xe38
  109710. +#define rRx_IQK_PI_A 0xe3c
  109711. +
  109712. +#define rTx_IQK 0xe40
  109713. +#define rRx_IQK 0xe44
  109714. +#define rIQK_AGC_Pts 0xe48
  109715. +#define rIQK_AGC_Rsp 0xe4c
  109716. +#define rTx_IQK_Tone_B 0xe50
  109717. +#define rRx_IQK_Tone_B 0xe54
  109718. +#define rTx_IQK_PI_B 0xe58
  109719. +#define rRx_IQK_PI_B 0xe5c
  109720. +#define rIQK_AGC_Cont 0xe60
  109721. +
  109722. +#define rBlue_Tooth 0xe6c
  109723. +#define rRx_Wait_CCA 0xe70
  109724. +#define rTx_CCK_RFON 0xe74
  109725. +#define rTx_CCK_BBON 0xe78
  109726. +#define rTx_OFDM_RFON 0xe7c
  109727. +#define rTx_OFDM_BBON 0xe80
  109728. +#define rTx_To_Rx 0xe84
  109729. +#define rTx_To_Tx 0xe88
  109730. +#define rRx_CCK 0xe8c
  109731. +
  109732. +#define rTx_Power_Before_IQK_A 0xe94
  109733. +#define rTx_Power_After_IQK_A 0xe9c
  109734. +
  109735. +#define rRx_Power_Before_IQK_A 0xea0
  109736. +#define rRx_Power_Before_IQK_A_2 0xea4
  109737. +#define rRx_Power_After_IQK_A 0xea8
  109738. +#define rRx_Power_After_IQK_A_2 0xeac
  109739. +
  109740. +#define rTx_Power_Before_IQK_B 0xeb4
  109741. +#define rTx_Power_After_IQK_B 0xebc
  109742. +
  109743. +#define rRx_Power_Before_IQK_B 0xec0
  109744. +#define rRx_Power_Before_IQK_B_2 0xec4
  109745. +#define rRx_Power_After_IQK_B 0xec8
  109746. +#define rRx_Power_After_IQK_B_2 0xecc
  109747. +
  109748. +#define rRx_OFDM 0xed0
  109749. +#define rRx_Wait_RIFS 0xed4
  109750. +#define rRx_TO_Rx 0xed8
  109751. +#define rStandby 0xedc
  109752. +#define rSleep 0xee0
  109753. +#define rPMPD_ANAEN 0xeec
  109754. +
  109755. +//
  109756. +// 7. RF Register 0x00-0x2E (RF 8256)
  109757. +// RF-0222D 0x00-3F
  109758. +//
  109759. +//Zebra1
  109760. +#define rZebra1_HSSIEnable 0x0 // Useless now
  109761. +#define rZebra1_TRxEnable1 0x1
  109762. +#define rZebra1_TRxEnable2 0x2
  109763. +#define rZebra1_AGC 0x4
  109764. +#define rZebra1_ChargePump 0x5
  109765. +#define rZebra1_Channel 0x7 // RF channel switch
  109766. +
  109767. +//#endif
  109768. +#define rZebra1_TxGain 0x8 // Useless now
  109769. +#define rZebra1_TxLPF 0x9
  109770. +#define rZebra1_RxLPF 0xb
  109771. +#define rZebra1_RxHPFCorner 0xc
  109772. +
  109773. +//Zebra4
  109774. +#define rGlobalCtrl 0 // Useless now
  109775. +#define rRTL8256_TxLPF 19
  109776. +#define rRTL8256_RxLPF 11
  109777. +
  109778. +//RTL8258
  109779. +#define rRTL8258_TxLPF 0x11 // Useless now
  109780. +#define rRTL8258_RxLPF 0x13
  109781. +#define rRTL8258_RSSILPF 0xa
  109782. +
  109783. +//
  109784. +// RL6052 Register definition
  109785. +//
  109786. +#define RF_AC 0x00 //
  109787. +
  109788. +#define RF_IQADJ_G1 0x01 //
  109789. +#define RF_IQADJ_G2 0x02 //
  109790. +#define RF_BS_PA_APSET_G1_G4 0x03
  109791. +#define RF_BS_PA_APSET_G5_G8 0x04
  109792. +#define RF_POW_TRSW 0x05 //
  109793. +
  109794. +#define RF_GAIN_RX 0x06 //
  109795. +#define RF_GAIN_TX 0x07 //
  109796. +
  109797. +#define RF_TXM_IDAC 0x08 //
  109798. +#define RF_IPA_G 0x09 //
  109799. +#define RF_TXBIAS_G 0x0A
  109800. +#define RF_TXPA_AG 0x0B
  109801. +#define RF_IPA_A 0x0C //
  109802. +#define RF_TXBIAS_A 0x0D
  109803. +#define RF_BS_PA_APSET_G9_G11 0x0E
  109804. +#define RF_BS_IQGEN 0x0F //
  109805. +
  109806. +#define RF_MODE1 0x10 //
  109807. +#define RF_MODE2 0x11 //
  109808. +
  109809. +#define RF_RX_AGC_HP 0x12 //
  109810. +#define RF_TX_AGC 0x13 //
  109811. +#define RF_BIAS 0x14 //
  109812. +#define RF_IPA 0x15 //
  109813. +#define RF_POW_ABILITY 0x17 //
  109814. +#define RF_MODE_AG 0x18 //
  109815. +#define rRfChannel 0x18 // RF channel and BW switch
  109816. +#define RF_CHNLBW 0x18 // RF channel and BW switch
  109817. +#define RF_TOP 0x19 //
  109818. +
  109819. +#define RF_RX_G1 0x1A //
  109820. +#define RF_RX_G2 0x1B //
  109821. +
  109822. +#define RF_RX_BB2 0x1C //
  109823. +#define RF_RX_BB1 0x1D //
  109824. +
  109825. +#define RF_RCK1 0x1E //
  109826. +#define RF_RCK2 0x1F //
  109827. +
  109828. +#define RF_TX_G1 0x20 //
  109829. +#define RF_TX_G2 0x21 //
  109830. +#define RF_TX_G3 0x22 //
  109831. +
  109832. +#define RF_TX_BB1 0x23 //
  109833. +
  109834. +#define RF_T_METER 0x24 //
  109835. +
  109836. +#define RF_SYN_G1 0x25 // RF TX Power control
  109837. +#define RF_SYN_G2 0x26 // RF TX Power control
  109838. +#define RF_SYN_G3 0x27 // RF TX Power control
  109839. +#define RF_SYN_G4 0x28 // RF TX Power control
  109840. +#define RF_SYN_G5 0x29 // RF TX Power control
  109841. +#define RF_SYN_G6 0x2A // RF TX Power control
  109842. +#define RF_SYN_G7 0x2B // RF TX Power control
  109843. +#define RF_SYN_G8 0x2C // RF TX Power control
  109844. +
  109845. +#define RF_RCK_OS 0x30 // RF TX PA control
  109846. +
  109847. +#define RF_TXPA_G1 0x31 // RF TX PA control
  109848. +#define RF_TXPA_G2 0x32 // RF TX PA control
  109849. +#define RF_TXPA_G3 0x33 // RF TX PA control
  109850. +
  109851. +//
  109852. +//Bit Mask
  109853. +//
  109854. +// 1. Page1(0x100)
  109855. +#define bBBResetB 0x100 // Useless now?
  109856. +#define bGlobalResetB 0x200
  109857. +#define bOFDMTxStart 0x4
  109858. +#define bCCKTxStart 0x8
  109859. +#define bCRC32Debug 0x100
  109860. +#define bPMACLoopback 0x10
  109861. +#define bTxLSIG 0xffffff
  109862. +#define bOFDMTxRate 0xf
  109863. +#define bOFDMTxReserved 0x10
  109864. +#define bOFDMTxLength 0x1ffe0
  109865. +#define bOFDMTxParity 0x20000
  109866. +#define bTxHTSIG1 0xffffff
  109867. +#define bTxHTMCSRate 0x7f
  109868. +#define bTxHTBW 0x80
  109869. +#define bTxHTLength 0xffff00
  109870. +#define bTxHTSIG2 0xffffff
  109871. +#define bTxHTSmoothing 0x1
  109872. +#define bTxHTSounding 0x2
  109873. +#define bTxHTReserved 0x4
  109874. +#define bTxHTAggreation 0x8
  109875. +#define bTxHTSTBC 0x30
  109876. +#define bTxHTAdvanceCoding 0x40
  109877. +#define bTxHTShortGI 0x80
  109878. +#define bTxHTNumberHT_LTF 0x300
  109879. +#define bTxHTCRC8 0x3fc00
  109880. +#define bCounterReset 0x10000
  109881. +#define bNumOfOFDMTx 0xffff
  109882. +#define bNumOfCCKTx 0xffff0000
  109883. +#define bTxIdleInterval 0xffff
  109884. +#define bOFDMService 0xffff0000
  109885. +#define bTxMACHeader 0xffffffff
  109886. +#define bTxDataInit 0xff
  109887. +#define bTxHTMode 0x100
  109888. +#define bTxDataType 0x30000
  109889. +#define bTxRandomSeed 0xffffffff
  109890. +#define bCCKTxPreamble 0x1
  109891. +#define bCCKTxSFD 0xffff0000
  109892. +#define bCCKTxSIG 0xff
  109893. +#define bCCKTxService 0xff00
  109894. +#define bCCKLengthExt 0x8000
  109895. +#define bCCKTxLength 0xffff0000
  109896. +#define bCCKTxCRC16 0xffff
  109897. +#define bCCKTxStatus 0x1
  109898. +#define bOFDMTxStatus 0x2
  109899. +
  109900. +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff))
  109901. +
  109902. +// 2. Page8(0x800)
  109903. +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD
  109904. +#define bJapanMode 0x2
  109905. +#define bCCKTxSC 0x30
  109906. +#define bCCKEn 0x1000000
  109907. +#define bOFDMEn 0x2000000
  109908. +
  109909. +#define bOFDMRxADCPhase 0x10000 // Useless now
  109910. +#define bOFDMTxDACPhase 0x40000
  109911. +#define bXATxAGC 0x3f
  109912. +
  109913. +#define bAntennaSelect 0x0300
  109914. +
  109915. +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage
  109916. +#define bXCTxAGC 0xf000
  109917. +#define bXDTxAGC 0xf0000
  109918. +
  109919. +#define bPAStart 0xf0000000 // Useless now
  109920. +#define bTRStart 0x00f00000
  109921. +#define bRFStart 0x0000f000
  109922. +#define bBBStart 0x000000f0
  109923. +#define bBBCCKStart 0x0000000f
  109924. +#define bPAEnd 0xf //Reg0x814
  109925. +#define bTREnd 0x0f000000
  109926. +#define bRFEnd 0x000f0000
  109927. +#define bCCAMask 0x000000f0 //T2R
  109928. +#define bR2RCCAMask 0x00000f00
  109929. +#define bHSSI_R2TDelay 0xf8000000
  109930. +#define bHSSI_T2RDelay 0xf80000
  109931. +#define bContTxHSSI 0x400 //chane gain at continue Tx
  109932. +#define bIGFromCCK 0x200
  109933. +#define bAGCAddress 0x3f
  109934. +#define bRxHPTx 0x7000
  109935. +#define bRxHPT2R 0x38000
  109936. +#define bRxHPCCKIni 0xc0000
  109937. +#define bAGCTxCode 0xc00000
  109938. +#define bAGCRxCode 0x300000
  109939. +
  109940. +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1
  109941. +#define b3WireAddressLength 0x400
  109942. +
  109943. +#define b3WireRFPowerDown 0x1 // Useless now
  109944. +//#define bHWSISelect 0x8
  109945. +#define b5GPAPEPolarity 0x40000000
  109946. +#define b2GPAPEPolarity 0x80000000
  109947. +#define bRFSW_TxDefaultAnt 0x3
  109948. +#define bRFSW_TxOptionAnt 0x30
  109949. +#define bRFSW_RxDefaultAnt 0x300
  109950. +#define bRFSW_RxOptionAnt 0x3000
  109951. +#define bRFSI_3WireData 0x1
  109952. +#define bRFSI_3WireClock 0x2
  109953. +#define bRFSI_3WireLoad 0x4
  109954. +#define bRFSI_3WireRW 0x8
  109955. +#define bRFSI_3Wire 0xf
  109956. +
  109957. +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW
  109958. +
  109959. +#define bRFSI_TRSW 0x20 // Useless now
  109960. +#define bRFSI_TRSWB 0x40
  109961. +#define bRFSI_ANTSW 0x100
  109962. +#define bRFSI_ANTSWB 0x200
  109963. +#define bRFSI_PAPE 0x400
  109964. +#define bRFSI_PAPE5G 0x800
  109965. +#define bBandSelect 0x1
  109966. +#define bHTSIG2_GI 0x80
  109967. +#define bHTSIG2_Smoothing 0x01
  109968. +#define bHTSIG2_Sounding 0x02
  109969. +#define bHTSIG2_Aggreaton 0x08
  109970. +#define bHTSIG2_STBC 0x30
  109971. +#define bHTSIG2_AdvCoding 0x40
  109972. +#define bHTSIG2_NumOfHTLTF 0x300
  109973. +#define bHTSIG2_CRC8 0x3fc
  109974. +#define bHTSIG1_MCS 0x7f
  109975. +#define bHTSIG1_BandWidth 0x80
  109976. +#define bHTSIG1_HTLength 0xffff
  109977. +#define bLSIG_Rate 0xf
  109978. +#define bLSIG_Reserved 0x10
  109979. +#define bLSIG_Length 0x1fffe
  109980. +#define bLSIG_Parity 0x20
  109981. +#define bCCKRxPhase 0x4
  109982. +
  109983. +#define bLSSIReadAddress 0x7f800000 // T65 RF
  109984. +
  109985. +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal
  109986. +
  109987. +#define bLSSIReadBackData 0xfffff // T65 RF
  109988. +
  109989. +#define bLSSIReadOKFlag 0x1000 // Useless now
  109990. +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz
  109991. +#define bRegulator0Standby 0x1
  109992. +#define bRegulatorPLLStandby 0x2
  109993. +#define bRegulator1Standby 0x4
  109994. +#define bPLLPowerUp 0x8
  109995. +#define bDPLLPowerUp 0x10
  109996. +#define bDA10PowerUp 0x20
  109997. +#define bAD7PowerUp 0x200
  109998. +#define bDA6PowerUp 0x2000
  109999. +#define bXtalPowerUp 0x4000
  110000. +#define b40MDClkPowerUP 0x8000
  110001. +#define bDA6DebugMode 0x20000
  110002. +#define bDA6Swing 0x380000
  110003. +
  110004. +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ
  110005. +
  110006. +#define b80MClkDelay 0x18000000 // Useless
  110007. +#define bAFEWatchDogEnable 0x20000000
  110008. +
  110009. +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap
  110010. +#define bXtalCap23 0x3
  110011. +#define bXtalCap92x 0x0f000000
  110012. +#define bXtalCap 0x0f000000
  110013. +
  110014. +#define bIntDifClkEnable 0x400 // Useless
  110015. +#define bExtSigClkEnable 0x800
  110016. +#define bBandgapMbiasPowerUp 0x10000
  110017. +#define bAD11SHGain 0xc0000
  110018. +#define bAD11InputRange 0x700000
  110019. +#define bAD11OPCurrent 0x3800000
  110020. +#define bIPathLoopback 0x4000000
  110021. +#define bQPathLoopback 0x8000000
  110022. +#define bAFELoopback 0x10000000
  110023. +#define bDA10Swing 0x7e0
  110024. +#define bDA10Reverse 0x800
  110025. +#define bDAClkSource 0x1000
  110026. +#define bAD7InputRange 0x6000
  110027. +#define bAD7Gain 0x38000
  110028. +#define bAD7OutputCMMode 0x40000
  110029. +#define bAD7InputCMMode 0x380000
  110030. +#define bAD7Current 0xc00000
  110031. +#define bRegulatorAdjust 0x7000000
  110032. +#define bAD11PowerUpAtTx 0x1
  110033. +#define bDA10PSAtTx 0x10
  110034. +#define bAD11PowerUpAtRx 0x100
  110035. +#define bDA10PSAtRx 0x1000
  110036. +#define bCCKRxAGCFormat 0x200
  110037. +#define bPSDFFTSamplepPoint 0xc000
  110038. +#define bPSDAverageNum 0x3000
  110039. +#define bIQPathControl 0xc00
  110040. +#define bPSDFreq 0x3ff
  110041. +#define bPSDAntennaPath 0x30
  110042. +#define bPSDIQSwitch 0x40
  110043. +#define bPSDRxTrigger 0x400000
  110044. +#define bPSDTxTrigger 0x80000000
  110045. +#define bPSDSineToneScale 0x7f000000
  110046. +#define bPSDReport 0xffff
  110047. +
  110048. +// 3. Page9(0x900)
  110049. +#define bOFDMTxSC 0x30000000 // Useless
  110050. +#define bCCKTxOn 0x1
  110051. +#define bOFDMTxOn 0x2
  110052. +#define bDebugPage 0xfff //reset debug page and also HWord, LWord
  110053. +#define bDebugItem 0xff //reset debug page and LWord
  110054. +#define bAntL 0x10
  110055. +#define bAntNonHT 0x100
  110056. +#define bAntHT1 0x1000
  110057. +#define bAntHT2 0x10000
  110058. +#define bAntHT1S1 0x100000
  110059. +#define bAntNonHTS1 0x1000000
  110060. +
  110061. +// 4. PageA(0xA00)
  110062. +#define bCCKBBMode 0x3 // Useless
  110063. +#define bCCKTxPowerSaving 0x80
  110064. +#define bCCKRxPowerSaving 0x40
  110065. +
  110066. +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch
  110067. +
  110068. +#define bCCKScramble 0x8 // Useless
  110069. +#define bCCKAntDiversity 0x8000
  110070. +#define bCCKCarrierRecovery 0x4000
  110071. +#define bCCKTxRate 0x3000
  110072. +#define bCCKDCCancel 0x0800
  110073. +#define bCCKISICancel 0x0400
  110074. +#define bCCKMatchFilter 0x0200
  110075. +#define bCCKEqualizer 0x0100
  110076. +#define bCCKPreambleDetect 0x800000
  110077. +#define bCCKFastFalseCCA 0x400000
  110078. +#define bCCKChEstStart 0x300000
  110079. +#define bCCKCCACount 0x080000
  110080. +#define bCCKcs_lim 0x070000
  110081. +#define bCCKBistMode 0x80000000
  110082. +#define bCCKCCAMask 0x40000000
  110083. +#define bCCKTxDACPhase 0x4
  110084. +#define bCCKRxADCPhase 0x20000000 //r_rx_clk
  110085. +#define bCCKr_cp_mode0 0x0100
  110086. +#define bCCKTxDCOffset 0xf0
  110087. +#define bCCKRxDCOffset 0xf
  110088. +#define bCCKCCAMode 0xc000
  110089. +#define bCCKFalseCS_lim 0x3f00
  110090. +#define bCCKCS_ratio 0xc00000
  110091. +#define bCCKCorgBit_sel 0x300000
  110092. +#define bCCKPD_lim 0x0f0000
  110093. +#define bCCKNewCCA 0x80000000
  110094. +#define bCCKRxHPofIG 0x8000
  110095. +#define bCCKRxIG 0x7f00
  110096. +#define bCCKLNAPolarity 0x800000
  110097. +#define bCCKRx1stGain 0x7f0000
  110098. +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity
  110099. +#define bCCKRxAGCSatLevel 0x1f000000
  110100. +#define bCCKRxAGCSatCount 0xe0
  110101. +#define bCCKRxRFSettle 0x1f //AGCsamp_dly
  110102. +#define bCCKFixedRxAGC 0x8000
  110103. +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824
  110104. +#define bCCKAntennaPolarity 0x2000
  110105. +#define bCCKTxFilterType 0x0c00
  110106. +#define bCCKRxAGCReportType 0x0300
  110107. +#define bCCKRxDAGCEn 0x80000000
  110108. +#define bCCKRxDAGCPeriod 0x20000000
  110109. +#define bCCKRxDAGCSatLevel 0x1f000000
  110110. +#define bCCKTimingRecovery 0x800000
  110111. +#define bCCKTxC0 0x3f0000
  110112. +#define bCCKTxC1 0x3f000000
  110113. +#define bCCKTxC2 0x3f
  110114. +#define bCCKTxC3 0x3f00
  110115. +#define bCCKTxC4 0x3f0000
  110116. +#define bCCKTxC5 0x3f000000
  110117. +#define bCCKTxC6 0x3f
  110118. +#define bCCKTxC7 0x3f00
  110119. +#define bCCKDebugPort 0xff0000
  110120. +#define bCCKDACDebug 0x0f000000
  110121. +#define bCCKFalseAlarmEnable 0x8000
  110122. +#define bCCKFalseAlarmRead 0x4000
  110123. +#define bCCKTRSSI 0x7f
  110124. +#define bCCKRxAGCReport 0xfe
  110125. +#define bCCKRxReport_AntSel 0x80000000
  110126. +#define bCCKRxReport_MFOff 0x40000000
  110127. +#define bCCKRxRxReport_SQLoss 0x20000000
  110128. +#define bCCKRxReport_Pktloss 0x10000000
  110129. +#define bCCKRxReport_Lockedbit 0x08000000
  110130. +#define bCCKRxReport_RateError 0x04000000
  110131. +#define bCCKRxReport_RxRate 0x03000000
  110132. +#define bCCKRxFACounterLower 0xff
  110133. +#define bCCKRxFACounterUpper 0xff000000
  110134. +#define bCCKRxHPAGCStart 0xe000
  110135. +#define bCCKRxHPAGCFinal 0x1c00
  110136. +#define bCCKRxFalseAlarmEnable 0x8000
  110137. +#define bCCKFACounterFreeze 0x4000
  110138. +#define bCCKTxPathSel 0x10000000
  110139. +#define bCCKDefaultRxPath 0xc000000
  110140. +#define bCCKOptionRxPath 0x3000000
  110141. +
  110142. +// 5. PageC(0xC00)
  110143. +#define bNumOfSTF 0x3 // Useless
  110144. +#define bShift_L 0xc0
  110145. +#define bGI_TH 0xc
  110146. +#define bRxPathA 0x1
  110147. +#define bRxPathB 0x2
  110148. +#define bRxPathC 0x4
  110149. +#define bRxPathD 0x8
  110150. +#define bTxPathA 0x1
  110151. +#define bTxPathB 0x2
  110152. +#define bTxPathC 0x4
  110153. +#define bTxPathD 0x8
  110154. +#define bTRSSIFreq 0x200
  110155. +#define bADCBackoff 0x3000
  110156. +#define bDFIRBackoff 0xc000
  110157. +#define bTRSSILatchPhase 0x10000
  110158. +#define bRxIDCOffset 0xff
  110159. +#define bRxQDCOffset 0xff00
  110160. +#define bRxDFIRMode 0x1800000
  110161. +#define bRxDCNFType 0xe000000
  110162. +#define bRXIQImb_A 0x3ff
  110163. +#define bRXIQImb_B 0xfc00
  110164. +#define bRXIQImb_C 0x3f0000
  110165. +#define bRXIQImb_D 0xffc00000
  110166. +#define bDC_dc_Notch 0x60000
  110167. +#define bRxNBINotch 0x1f000000
  110168. +#define bPD_TH 0xf
  110169. +#define bPD_TH_Opt2 0xc000
  110170. +#define bPWED_TH 0x700
  110171. +#define bIfMF_Win_L 0x800
  110172. +#define bPD_Option 0x1000
  110173. +#define bMF_Win_L 0xe000
  110174. +#define bBW_Search_L 0x30000
  110175. +#define bwin_enh_L 0xc0000
  110176. +#define bBW_TH 0x700000
  110177. +#define bED_TH2 0x3800000
  110178. +#define bBW_option 0x4000000
  110179. +#define bRatio_TH 0x18000000
  110180. +#define bWindow_L 0xe0000000
  110181. +#define bSBD_Option 0x1
  110182. +#define bFrame_TH 0x1c
  110183. +#define bFS_Option 0x60
  110184. +#define bDC_Slope_check 0x80
  110185. +#define bFGuard_Counter_DC_L 0xe00
  110186. +#define bFrame_Weight_Short 0x7000
  110187. +#define bSub_Tune 0xe00000
  110188. +#define bFrame_DC_Length 0xe000000
  110189. +#define bSBD_start_offset 0x30000000
  110190. +#define bFrame_TH_2 0x7
  110191. +#define bFrame_GI2_TH 0x38
  110192. +#define bGI2_Sync_en 0x40
  110193. +#define bSarch_Short_Early 0x300
  110194. +#define bSarch_Short_Late 0xc00
  110195. +#define bSarch_GI2_Late 0x70000
  110196. +#define bCFOAntSum 0x1
  110197. +#define bCFOAcc 0x2
  110198. +#define bCFOStartOffset 0xc
  110199. +#define bCFOLookBack 0x70
  110200. +#define bCFOSumWeight 0x80
  110201. +#define bDAGCEnable 0x10000
  110202. +#define bTXIQImb_A 0x3ff
  110203. +#define bTXIQImb_B 0xfc00
  110204. +#define bTXIQImb_C 0x3f0000
  110205. +#define bTXIQImb_D 0xffc00000
  110206. +#define bTxIDCOffset 0xff
  110207. +#define bTxQDCOffset 0xff00
  110208. +#define bTxDFIRMode 0x10000
  110209. +#define bTxPesudoNoiseOn 0x4000000
  110210. +#define bTxPesudoNoise_A 0xff
  110211. +#define bTxPesudoNoise_B 0xff00
  110212. +#define bTxPesudoNoise_C 0xff0000
  110213. +#define bTxPesudoNoise_D 0xff000000
  110214. +#define bCCADropOption 0x20000
  110215. +#define bCCADropThres 0xfff00000
  110216. +#define bEDCCA_H 0xf
  110217. +#define bEDCCA_L 0xf0
  110218. +#define bLambda_ED 0x300
  110219. +#define bRxInitialGain 0x7f
  110220. +#define bRxAntDivEn 0x80
  110221. +#define bRxAGCAddressForLNA 0x7f00
  110222. +#define bRxHighPowerFlow 0x8000
  110223. +#define bRxAGCFreezeThres 0xc0000
  110224. +#define bRxFreezeStep_AGC1 0x300000
  110225. +#define bRxFreezeStep_AGC2 0xc00000
  110226. +#define bRxFreezeStep_AGC3 0x3000000
  110227. +#define bRxFreezeStep_AGC0 0xc000000
  110228. +#define bRxRssi_Cmp_En 0x10000000
  110229. +#define bRxQuickAGCEn 0x20000000
  110230. +#define bRxAGCFreezeThresMode 0x40000000
  110231. +#define bRxOverFlowCheckType 0x80000000
  110232. +#define bRxAGCShift 0x7f
  110233. +#define bTRSW_Tri_Only 0x80
  110234. +#define bPowerThres 0x300
  110235. +#define bRxAGCEn 0x1
  110236. +#define bRxAGCTogetherEn 0x2
  110237. +#define bRxAGCMin 0x4
  110238. +#define bRxHP_Ini 0x7
  110239. +#define bRxHP_TRLNA 0x70
  110240. +#define bRxHP_RSSI 0x700
  110241. +#define bRxHP_BBP1 0x7000
  110242. +#define bRxHP_BBP2 0x70000
  110243. +#define bRxHP_BBP3 0x700000
  110244. +#define bRSSI_H 0x7f0000 //the threshold for high power
  110245. +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity
  110246. +#define bRxSettle_TRSW 0x7
  110247. +#define bRxSettle_LNA 0x38
  110248. +#define bRxSettle_RSSI 0x1c0
  110249. +#define bRxSettle_BBP 0xe00
  110250. +#define bRxSettle_RxHP 0x7000
  110251. +#define bRxSettle_AntSW_RSSI 0x38000
  110252. +#define bRxSettle_AntSW 0xc0000
  110253. +#define bRxProcessTime_DAGC 0x300000
  110254. +#define bRxSettle_HSSI 0x400000
  110255. +#define bRxProcessTime_BBPPW 0x800000
  110256. +#define bRxAntennaPowerShift 0x3000000
  110257. +#define bRSSITableSelect 0xc000000
  110258. +#define bRxHP_Final 0x7000000
  110259. +#define bRxHTSettle_BBP 0x7
  110260. +#define bRxHTSettle_HSSI 0x8
  110261. +#define bRxHTSettle_RxHP 0x70
  110262. +#define bRxHTSettle_BBPPW 0x80
  110263. +#define bRxHTSettle_Idle 0x300
  110264. +#define bRxHTSettle_Reserved 0x1c00
  110265. +#define bRxHTRxHPEn 0x8000
  110266. +#define bRxHTAGCFreezeThres 0x30000
  110267. +#define bRxHTAGCTogetherEn 0x40000
  110268. +#define bRxHTAGCMin 0x80000
  110269. +#define bRxHTAGCEn 0x100000
  110270. +#define bRxHTDAGCEn 0x200000
  110271. +#define bRxHTRxHP_BBP 0x1c00000
  110272. +#define bRxHTRxHP_Final 0xe0000000
  110273. +#define bRxPWRatioTH 0x3
  110274. +#define bRxPWRatioEn 0x4
  110275. +#define bRxMFHold 0x3800
  110276. +#define bRxPD_Delay_TH1 0x38
  110277. +#define bRxPD_Delay_TH2 0x1c0
  110278. +#define bRxPD_DC_COUNT_MAX 0x600
  110279. +//#define bRxMF_Hold 0x3800
  110280. +#define bRxPD_Delay_TH 0x8000
  110281. +#define bRxProcess_Delay 0xf0000
  110282. +#define bRxSearchrange_GI2_Early 0x700000
  110283. +#define bRxFrame_Guard_Counter_L 0x3800000
  110284. +#define bRxSGI_Guard_L 0xc000000
  110285. +#define bRxSGI_Search_L 0x30000000
  110286. +#define bRxSGI_TH 0xc0000000
  110287. +#define bDFSCnt0 0xff
  110288. +#define bDFSCnt1 0xff00
  110289. +#define bDFSFlag 0xf0000
  110290. +#define bMFWeightSum 0x300000
  110291. +#define bMinIdxTH 0x7f000000
  110292. +#define bDAFormat 0x40000
  110293. +#define bTxChEmuEnable 0x01000000
  110294. +#define bTRSWIsolation_A 0x7f
  110295. +#define bTRSWIsolation_B 0x7f00
  110296. +#define bTRSWIsolation_C 0x7f0000
  110297. +#define bTRSWIsolation_D 0x7f000000
  110298. +#define bExtLNAGain 0x7c00
  110299. +
  110300. +// 6. PageE(0xE00)
  110301. +#define bSTBCEn 0x4 // Useless
  110302. +#define bAntennaMapping 0x10
  110303. +#define bNss 0x20
  110304. +#define bCFOAntSumD 0x200
  110305. +#define bPHYCounterReset 0x8000000
  110306. +#define bCFOReportGet 0x4000000
  110307. +#define bOFDMContinueTx 0x10000000
  110308. +#define bOFDMSingleCarrier 0x20000000
  110309. +#define bOFDMSingleTone 0x40000000
  110310. +//#define bRxPath1 0x01
  110311. +//#define bRxPath2 0x02
  110312. +//#define bRxPath3 0x04
  110313. +//#define bRxPath4 0x08
  110314. +//#define bTxPath1 0x10
  110315. +//#define bTxPath2 0x20
  110316. +#define bHTDetect 0x100
  110317. +#define bCFOEn 0x10000
  110318. +#define bCFOValue 0xfff00000
  110319. +#define bSigTone_Re 0x3f
  110320. +#define bSigTone_Im 0x7f00
  110321. +#define bCounter_CCA 0xffff
  110322. +#define bCounter_ParityFail 0xffff0000
  110323. +#define bCounter_RateIllegal 0xffff
  110324. +#define bCounter_CRC8Fail 0xffff0000
  110325. +#define bCounter_MCSNoSupport 0xffff
  110326. +#define bCounter_FastSync 0xffff
  110327. +#define bShortCFO 0xfff
  110328. +#define bShortCFOTLength 12 //total
  110329. +#define bShortCFOFLength 11 //fraction
  110330. +#define bLongCFO 0x7ff
  110331. +#define bLongCFOTLength 11
  110332. +#define bLongCFOFLength 11
  110333. +#define bTailCFO 0x1fff
  110334. +#define bTailCFOTLength 13
  110335. +#define bTailCFOFLength 12
  110336. +#define bmax_en_pwdB 0xffff
  110337. +#define bCC_power_dB 0xffff0000
  110338. +#define bnoise_pwdB 0xffff
  110339. +#define bPowerMeasTLength 10
  110340. +#define bPowerMeasFLength 3
  110341. +#define bRx_HT_BW 0x1
  110342. +#define bRxSC 0x6
  110343. +#define bRx_HT 0x8
  110344. +#define bNB_intf_det_on 0x1
  110345. +#define bIntf_win_len_cfg 0x30
  110346. +#define bNB_Intf_TH_cfg 0x1c0
  110347. +#define bRFGain 0x3f
  110348. +#define bTableSel 0x40
  110349. +#define bTRSW 0x80
  110350. +#define bRxSNR_A 0xff
  110351. +#define bRxSNR_B 0xff00
  110352. +#define bRxSNR_C 0xff0000
  110353. +#define bRxSNR_D 0xff000000
  110354. +#define bSNREVMTLength 8
  110355. +#define bSNREVMFLength 1
  110356. +#define bCSI1st 0xff
  110357. +#define bCSI2nd 0xff00
  110358. +#define bRxEVM1st 0xff0000
  110359. +#define bRxEVM2nd 0xff000000
  110360. +#define bSIGEVM 0xff
  110361. +#define bPWDB 0xff00
  110362. +#define bSGIEN 0x10000
  110363. +
  110364. +#define bSFactorQAM1 0xf // Useless
  110365. +#define bSFactorQAM2 0xf0
  110366. +#define bSFactorQAM3 0xf00
  110367. +#define bSFactorQAM4 0xf000
  110368. +#define bSFactorQAM5 0xf0000
  110369. +#define bSFactorQAM6 0xf0000
  110370. +#define bSFactorQAM7 0xf00000
  110371. +#define bSFactorQAM8 0xf000000
  110372. +#define bSFactorQAM9 0xf0000000
  110373. +#define bCSIScheme 0x100000
  110374. +
  110375. +#define bNoiseLvlTopSet 0x3 // Useless
  110376. +#define bChSmooth 0x4
  110377. +#define bChSmoothCfg1 0x38
  110378. +#define bChSmoothCfg2 0x1c0
  110379. +#define bChSmoothCfg3 0xe00
  110380. +#define bChSmoothCfg4 0x7000
  110381. +#define bMRCMode 0x800000
  110382. +#define bTHEVMCfg 0x7000000
  110383. +
  110384. +#define bLoopFitType 0x1 // Useless
  110385. +#define bUpdCFO 0x40
  110386. +#define bUpdCFOOffData 0x80
  110387. +#define bAdvUpdCFO 0x100
  110388. +#define bAdvTimeCtrl 0x800
  110389. +#define bUpdClko 0x1000
  110390. +#define bFC 0x6000
  110391. +#define bTrackingMode 0x8000
  110392. +#define bPhCmpEnable 0x10000
  110393. +#define bUpdClkoLTF 0x20000
  110394. +#define bComChCFO 0x40000
  110395. +#define bCSIEstiMode 0x80000
  110396. +#define bAdvUpdEqz 0x100000
  110397. +#define bUChCfg 0x7000000
  110398. +#define bUpdEqz 0x8000000
  110399. +
  110400. +//Rx Pseduo noise
  110401. +#define bRxPesudoNoiseOn 0x20000000 // Useless
  110402. +#define bRxPesudoNoise_A 0xff
  110403. +#define bRxPesudoNoise_B 0xff00
  110404. +#define bRxPesudoNoise_C 0xff0000
  110405. +#define bRxPesudoNoise_D 0xff000000
  110406. +#define bPesudoNoiseState_A 0xffff
  110407. +#define bPesudoNoiseState_B 0xffff0000
  110408. +#define bPesudoNoiseState_C 0xffff
  110409. +#define bPesudoNoiseState_D 0xffff0000
  110410. +
  110411. +//7. RF Register
  110412. +//Zebra1
  110413. +#define bZebra1_HSSIEnable 0x8 // Useless
  110414. +#define bZebra1_TRxControl 0xc00
  110415. +#define bZebra1_TRxGainSetting 0x07f
  110416. +#define bZebra1_RxCorner 0xc00
  110417. +#define bZebra1_TxChargePump 0x38
  110418. +#define bZebra1_RxChargePump 0x7
  110419. +#define bZebra1_ChannelNum 0xf80
  110420. +#define bZebra1_TxLPFBW 0x400
  110421. +#define bZebra1_RxLPFBW 0x600
  110422. +
  110423. +//Zebra4
  110424. +#define bRTL8256RegModeCtrl1 0x100 // Useless
  110425. +#define bRTL8256RegModeCtrl0 0x40
  110426. +#define bRTL8256_TxLPFBW 0x18
  110427. +#define bRTL8256_RxLPFBW 0x600
  110428. +
  110429. +//RTL8258
  110430. +#define bRTL8258_TxLPFBW 0xc // Useless
  110431. +#define bRTL8258_RxLPFBW 0xc00
  110432. +#define bRTL8258_RSSILPFBW 0xc0
  110433. +
  110434. +
  110435. +//
  110436. +// Other Definition
  110437. +//
  110438. +
  110439. +//byte endable for sb_write
  110440. +#define bByte0 0x1 // Useless
  110441. +#define bByte1 0x2
  110442. +#define bByte2 0x4
  110443. +#define bByte3 0x8
  110444. +#define bWord0 0x3
  110445. +#define bWord1 0xc
  110446. +#define bDWord 0xf
  110447. +
  110448. +//for PutRegsetting & GetRegSetting BitMask
  110449. +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f
  110450. +#define bMaskByte1 0xff00
  110451. +#define bMaskByte2 0xff0000
  110452. +#define bMaskByte3 0xff000000
  110453. +#define bMaskHWord 0xffff0000
  110454. +#define bMaskLWord 0x0000ffff
  110455. +#define bMaskDWord 0xffffffff
  110456. +#define bMask12Bits 0xfff
  110457. +#define bMaskH4Bits 0xf0000000
  110458. +#define bMaskOFDM_D 0xffc00000
  110459. +#define bMaskCCK 0x3f3f3f3f
  110460. +
  110461. +//for PutRFRegsetting & GetRFRegSetting BitMask
  110462. +//#define bMask12Bits 0xfffff // RF Reg mask bits
  110463. +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF
  110464. +#define bRFRegOffsetMask 0xfffff
  110465. +
  110466. +#define bEnable 0x1 // Useless
  110467. +#define bDisable 0x0
  110468. +
  110469. +#define LeftAntenna 0x0 // Useless
  110470. +#define RightAntenna 0x1
  110471. +
  110472. +#define tCheckTxStatus 500 //500ms // Useless
  110473. +#define tUpdateRxCounter 100 //100ms
  110474. +
  110475. +#define rateCCK 0 // Useless
  110476. +#define rateOFDM 1
  110477. +#define rateHT 2
  110478. +
  110479. +//define Register-End
  110480. +#define bPMAC_End 0x1ff // Useless
  110481. +#define bFPGAPHY0_End 0x8ff
  110482. +#define bFPGAPHY1_End 0x9ff
  110483. +#define bCCKPHY0_End 0xaff
  110484. +#define bOFDMPHY0_End 0xcff
  110485. +#define bOFDMPHY1_End 0xdff
  110486. +
  110487. +//define max debug item in each debug page
  110488. +//#define bMaxItem_FPGA_PHY0 0x9
  110489. +//#define bMaxItem_FPGA_PHY1 0x3
  110490. +//#define bMaxItem_PHY_11B 0x16
  110491. +//#define bMaxItem_OFDM_PHY0 0x29
  110492. +//#define bMaxItem_OFDM_PHY1 0x0
  110493. +
  110494. +#define bPMACControl 0x0 // Useless
  110495. +#define bWMACControl 0x1
  110496. +#define bWNICControl 0x2
  110497. +
  110498. +#define PathA 0x0 // Useless
  110499. +#define PathB 0x1
  110500. +#define PathC 0x2
  110501. +#define PathD 0x3
  110502. +
  110503. +/*--------------------------Define Parameters-------------------------------*/
  110504. +
  110505. +
  110506. +#endif //__INC_HAL8192SPHYREG_H
  110507. --- /dev/null
  110508. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h
  110509. @@ -0,0 +1,105 @@
  110510. +/******************************************************************************
  110511. + *
  110512. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  110513. + *
  110514. + * This program is free software; you can redistribute it and/or modify it
  110515. + * under the terms of version 2 of the GNU General Public License as
  110516. + * published by the Free Software Foundation.
  110517. + *
  110518. + * This program is distributed in the hope that it will be useful, but WITHOUT
  110519. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  110520. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  110521. + * more details.
  110522. + *
  110523. + * You should have received a copy of the GNU General Public License along with
  110524. + * this program; if not, write to the Free Software Foundation, Inc.,
  110525. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  110526. + *
  110527. + *
  110528. + ******************************************************************************/
  110529. +#ifndef __INC_HAL8192CU_FW_IMG_H
  110530. +#define __INC_HAL8192CU_FW_IMG_H
  110531. +
  110532. +/*Created on 2011/ 6/15, 5:45*/
  110533. +
  110534. +#ifdef CONFIG_BT_COEXISTENCE
  110535. +#define TSMCImgArrayLength 15706 //v84 TSMC COMMON 2012-04-13
  110536. +#else //#ifdef CONFIG_P2P
  110537. +#define TSMCImgArrayLength 16126 //v88 TSMC P2PPS with CCX report C2H 2012-12-05
  110538. +#endif
  110539. +extern u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength];
  110540. +
  110541. +#ifdef CONFIG_BT_COEXISTENCE
  110542. +#define UMCACutImgArrayLength 16248 //v79 UMC A Cut COMMON 2011-10-06
  110543. +#else //#ifdef CONFIG_P2P
  110544. +#define UMCACutImgArrayLength 16126 //v88 UMC A Cut P2PPS with CCX report C2H 2012-12-05
  110545. +#endif
  110546. +extern u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength];
  110547. +
  110548. +#ifdef CONFIG_BT_COEXISTENCE
  110549. +#define UMCBCutImgArrayLength 15686 //v84 UMC B Cut COMMON 2012-04-13
  110550. +#else //#ifdef CONFIG_P2P
  110551. +#define UMCBCutImgArrayLength 16096 //v88 UMC B Cut P2PPS with CCX report C2H 2012-12-05
  110552. +#endif
  110553. +extern u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength];
  110554. +
  110555. +//8188C_Formal_All_PHYforMP_111117 2011-11-23
  110556. +//8192C_Formal_92CU_PHYforMP_110817 2011-11-23
  110557. +#define PHY_REG_2TArrayLength 374
  110558. +extern u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength];
  110559. +#define PHY_REG_1TArrayLength 374
  110560. +extern u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength];
  110561. +#define PHY_ChangeTo_1T1RArrayLength 1
  110562. +extern u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength];
  110563. +#define PHY_ChangeTo_1T2RArrayLength 1
  110564. +extern u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength];
  110565. +#define PHY_ChangeTo_2T2RArrayLength 1
  110566. +extern u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength];
  110567. +#define PHY_REG_Array_PGLength 336
  110568. +extern u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength];
  110569. +#define PHY_REG_Array_PG_mCardLength 336
  110570. +extern u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength];
  110571. +#define PHY_REG_Array_MPLength 4
  110572. +extern u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength];
  110573. +#define PHY_REG_1T_HPArrayLength 378
  110574. +extern u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength];
  110575. +#define PHY_REG_1T_mCardArrayLength 374
  110576. +extern u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength];
  110577. +#define PHY_REG_2T_mCardArrayLength 374
  110578. +extern u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength];
  110579. +#define PHY_REG_Array_PG_HPLength 336
  110580. +extern u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength];
  110581. +#define RadioA_2TArrayLength 282
  110582. +extern u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength];
  110583. +#define RadioB_2TArrayLength 78
  110584. +extern u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength];
  110585. +#define RadioA_1TArrayLength 282
  110586. +extern u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength];
  110587. +#define RadioB_1TArrayLength 1
  110588. +extern u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength];
  110589. +#define RadioA_2T_mCardArrayLength 282
  110590. +extern u32 Rtl8192CURadioA_2T_mCardArray[RadioA_2T_mCardArrayLength];
  110591. +#define RadioB_2T_mCardArrayLength 78
  110592. +extern u32 Rtl8192CURadioB_2T_mCardArray[RadioB_2T_mCardArrayLength];
  110593. +#define RadioA_1T_mCardArrayLength 282
  110594. +extern u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength];
  110595. +#define RadioB_1T_mCardArrayLength 1
  110596. +extern u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength];
  110597. +#define RadioA_1T_HPArrayLength 282
  110598. +extern u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength];
  110599. +#define RadioB_GM_ArrayLength 1
  110600. +extern u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength];
  110601. +
  110602. +// MAC reg V14 - 2011-11-23
  110603. +#define MAC_2T_ArrayLength 174
  110604. +extern u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength];
  110605. +#define MACPHY_Array_PGLength 1
  110606. +extern u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength];
  110607. +#define AGCTAB_2TArrayLength 320
  110608. +extern u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength];
  110609. +#define AGCTAB_1TArrayLength 320
  110610. +extern u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength];
  110611. +#define AGCTAB_1T_HPArrayLength 320
  110612. +extern u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength];
  110613. +
  110614. +#endif //__INC_HAL8192CU_FW_IMG_H
  110615. --- /dev/null
  110616. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h
  110617. @@ -0,0 +1,33 @@
  110618. +/******************************************************************************
  110619. + *
  110620. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  110621. + *
  110622. + * This program is free software; you can redistribute it and/or modify it
  110623. + * under the terms of version 2 of the GNU General Public License as
  110624. + * published by the Free Software Foundation.
  110625. + *
  110626. + * This program is distributed in the hope that it will be useful, but WITHOUT
  110627. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  110628. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  110629. + * more details.
  110630. + *
  110631. + * You should have received a copy of the GNU General Public License along with
  110632. + * this program; if not, write to the Free Software Foundation, Inc.,
  110633. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  110634. + *
  110635. + *
  110636. + ******************************************************************************/
  110637. +#ifndef __INC_HAL8192CU_FW_IMG_WOWLAN_H
  110638. +#define __INC_HAL8192CU_FW_IMG_WOWLAN_H
  110639. +
  110640. +/*Created on 2011/11/ 8, 14:15*/
  110641. +
  110642. +
  110643. +#define TSMCWWImgArrayLength 13458
  110644. +extern u8 Rtl8192CUFwTSMCWWImgArray[TSMCWWImgArrayLength];
  110645. +#define UMCACutWWImgArrayLength 13458
  110646. +extern u8 Rtl8192CUFwUMCACutWWImgArray[UMCACutWWImgArrayLength];
  110647. +#define UMCBCutWWImgArrayLength 13446
  110648. +extern u8 Rtl8192CUFwUMCBCutWWImgArray[UMCBCutWWImgArrayLength];
  110649. +
  110650. +#endif //__INC_HAL8192CU_FW_IMG_WOWLAN_H
  110651. --- /dev/null
  110652. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h
  110653. @@ -0,0 +1,66 @@
  110654. +/******************************************************************************
  110655. + *
  110656. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  110657. + *
  110658. + * This program is free software; you can redistribute it and/or modify it
  110659. + * under the terms of version 2 of the GNU General Public License as
  110660. + * published by the Free Software Foundation.
  110661. + *
  110662. + * This program is distributed in the hope that it will be useful, but WITHOUT
  110663. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  110664. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  110665. + * more details.
  110666. + *
  110667. + * You should have received a copy of the GNU General Public License along with
  110668. + * this program; if not, write to the Free Software Foundation, Inc.,
  110669. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  110670. + *
  110671. + *
  110672. + ******************************************************************************/
  110673. +#ifndef __INC_HAL8192DE_FW_IMG_H
  110674. +#define __INC_HAL8192DE_FW_IMG_H
  110675. +
  110676. +#include <basic_types.h>
  110677. +
  110678. +/*Created on 2011/11/11, 8: 8*/
  110679. +
  110680. +#define Rtl8192DEImgArrayLength 32296
  110681. +extern const u8 Rtl8192DEFwImgArray[Rtl8192DEImgArrayLength];
  110682. +#define Rtl8192DEMainArrayLength 1
  110683. +extern const u8 Rtl8192DEFwMainArray[Rtl8192DEMainArrayLength];
  110684. +#define Rtl8192DEDataArrayLength 1
  110685. +extern const u8 Rtl8192DEFwDataArray[Rtl8192DEDataArrayLength];
  110686. +#define Rtl8192DEPHY_REG_2TArrayLength 372
  110687. +extern const u32 Rtl8192DEPHY_REG_2TArray[Rtl8192DEPHY_REG_2TArrayLength];
  110688. +#define Rtl8192DEPHY_REG_1TArrayLength 1
  110689. +extern const u32 Rtl8192DEPHY_REG_1TArray[Rtl8192DEPHY_REG_1TArrayLength];
  110690. +#define Rtl8192DEPHY_REG_Array_PGLength 624
  110691. +extern const u32 Rtl8192DEPHY_REG_Array_PG[Rtl8192DEPHY_REG_Array_PGLength];
  110692. +#define Rtl8192DEPHY_REG_Array_MPLength 12
  110693. +extern const u32 Rtl8192DEPHY_REG_Array_MP[Rtl8192DEPHY_REG_Array_MPLength];
  110694. +#define Rtl8192DERadioA_2TArrayLength 378
  110695. +extern const u32 Rtl8192DERadioA_2TArray[Rtl8192DERadioA_2TArrayLength];
  110696. +#define Rtl8192DERadioB_2TArrayLength 384
  110697. +extern const u32 Rtl8192DERadioB_2TArray[Rtl8192DERadioB_2TArrayLength];
  110698. +#define Rtl8192DERadioA_1TArrayLength 1
  110699. +extern const u32 Rtl8192DERadioA_1TArray[Rtl8192DERadioA_1TArrayLength];
  110700. +#define Rtl8192DERadioB_1TArrayLength 1
  110701. +extern const u32 Rtl8192DERadioB_1TArray[Rtl8192DERadioB_1TArrayLength];
  110702. +#define Rtl8192DERadioA_2T_intPAArrayLength 378
  110703. +extern const u32 Rtl8192DERadioA_2T_intPAArray[Rtl8192DERadioA_2T_intPAArrayLength];
  110704. +#define Rtl8192DERadioB_2T_intPAArrayLength 384
  110705. +extern const u32 Rtl8192DERadioB_2T_intPAArray[Rtl8192DERadioB_2T_intPAArrayLength];
  110706. +#define Rtl8192DEMAC_2T_ArrayLength 192
  110707. +extern const u32 Rtl8192DEMAC_2T_Array[Rtl8192DEMAC_2T_ArrayLength];
  110708. +#define Rtl8192DEAGCTAB_ArrayLength 386
  110709. +extern const u32 Rtl8192DEAGCTAB_Array[Rtl8192DEAGCTAB_ArrayLength];
  110710. +#define Rtl8192DEAGCTAB_5GArrayLength 194
  110711. +extern const u32 Rtl8192DEAGCTAB_5GArray[Rtl8192DEAGCTAB_5GArrayLength];
  110712. +#define Rtl8192DEAGCTAB_2GArrayLength 194
  110713. +extern const u32 Rtl8192DEAGCTAB_2GArray[Rtl8192DEAGCTAB_2GArrayLength];
  110714. +#define Rtl8192DEAGCTAB_2TArrayLength 1
  110715. +extern const u32 Rtl8192DEAGCTAB_2TArray[Rtl8192DEAGCTAB_2TArrayLength];
  110716. +#define Rtl8192DEAGCTAB_1TArrayLength 1
  110717. +extern const u32 Rtl8192DEAGCTAB_1TArray[Rtl8192DEAGCTAB_1TArrayLength];
  110718. +
  110719. +#endif //__INC_HAL8192CU_FW_IMG_H
  110720. --- /dev/null
  110721. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h
  110722. @@ -0,0 +1,527 @@
  110723. +/******************************************************************************
  110724. + *
  110725. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  110726. + *
  110727. + * This program is free software; you can redistribute it and/or modify it
  110728. + * under the terms of version 2 of the GNU General Public License as
  110729. + * published by the Free Software Foundation.
  110730. + *
  110731. + * This program is distributed in the hope that it will be useful, but WITHOUT
  110732. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  110733. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  110734. + * more details.
  110735. + *
  110736. + * You should have received a copy of the GNU General Public License along with
  110737. + * this program; if not, write to the Free Software Foundation, Inc.,
  110738. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  110739. + *
  110740. + *
  110741. + ******************************************************************************/
  110742. +/*****************************************************************************
  110743. + *
  110744. + * Module: __INC_HAL8192DPHYCFG_H
  110745. + *
  110746. + *
  110747. + * Note:
  110748. + *
  110749. + *
  110750. + * Export: Constants, macro, functions(API), global variables(None).
  110751. + *
  110752. + * Abbrev:
  110753. + *
  110754. + * History:
  110755. + * Data Who Remark
  110756. + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
  110757. + * 2. Reorganize code architecture.
  110758. + *
  110759. + *****************************************************************************/
  110760. + /* Check to see if the file has been included already. */
  110761. +#ifndef __INC_HAL8192DPHYCFG_H
  110762. +#define __INC_HAL8192DPHYCFG_H
  110763. +
  110764. +
  110765. +/*--------------------------Define Parameters-------------------------------*/
  110766. +#define LOOP_LIMIT 5
  110767. +#define MAX_STALL_TIME 50 //us
  110768. +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)
  110769. +#define MAX_TXPWR_IDX_NMODE_92S 63
  110770. +#define Reset_Cnt_Limit 3
  110771. +
  110772. +
  110773. +#define IQK_MAC_REG_NUM 4
  110774. +#define IQK_ADDA_REG_NUM 16
  110775. +#define IQK_BB_REG_NUM 10
  110776. +#define IQK_BB_REG_NUM_92C 9
  110777. +#define IQK_BB_REG_NUM_92D 10
  110778. +#define IQK_BB_REG_NUM_test 6
  110779. +#define index_mapping_NUM 13
  110780. +#define Rx_index_mapping_NUM 15
  110781. +#define AVG_THERMAL_NUM 8
  110782. +#define IQK_Matrix_REG_NUM 8
  110783. +#define IQK_Matrix_Settings_NUM 1+24+21
  110784. +
  110785. +#ifdef CONFIG_PCI_HCI
  110786. +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \
  110787. +{ \
  110788. + u1Byte u1bTmp; \
  110789. + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \
  110790. + u1bTmp |= BIT0; \
  110791. + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \
  110792. + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \
  110793. + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \
  110794. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \
  110795. + delay_us(100); \
  110796. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \
  110797. + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \
  110798. + delay_us(10); \
  110799. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \
  110800. + delay_us(10); \
  110801. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \
  110802. + delay_us(10); \
  110803. + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \
  110804. +}
  110805. +#endif
  110806. +
  110807. +
  110808. +/*--------------------------Define Parameters-------------------------------*/
  110809. +
  110810. +
  110811. +/*------------------------------Define structure----------------------------*/
  110812. +typedef enum _SwChnlCmdID{
  110813. + CmdID_End,
  110814. + CmdID_SetTxPowerLevel,
  110815. + CmdID_BBRegWrite10,
  110816. + CmdID_WritePortUlong,
  110817. + CmdID_WritePortUshort,
  110818. + CmdID_WritePortUchar,
  110819. + CmdID_RF_WriteReg,
  110820. +}SwChnlCmdID;
  110821. +
  110822. +
  110823. +/* 1. Switch channel related */
  110824. +typedef struct _SwChnlCmd{
  110825. + SwChnlCmdID CmdID;
  110826. + u32 Para1;
  110827. + u32 Para2;
  110828. + u32 msDelay;
  110829. +}SwChnlCmd;
  110830. +
  110831. +typedef enum _HW90_BLOCK{
  110832. + HW90_BLOCK_MAC = 0,
  110833. + HW90_BLOCK_PHY0 = 1,
  110834. + HW90_BLOCK_PHY1 = 2,
  110835. + HW90_BLOCK_RF = 3,
  110836. + HW90_BLOCK_MAXIMUM = 4, // Never use this
  110837. +}HW90_BLOCK_E, *PHW90_BLOCK_E;
  110838. +
  110839. +//vivi added this for read parameter from header, 20100908
  110840. +typedef enum _RF_CONTENT{
  110841. + radioa_txt = 0x1000,
  110842. + radiob_txt = 0x1001,
  110843. + radioc_txt = 0x1002,
  110844. + radiod_txt = 0x1003
  110845. +} RF_CONTENT;
  110846. +
  110847. +#define RF_PATH_MAX 2
  110848. +
  110849. +typedef enum _WIRELESS_MODE {
  110850. + WIRELESS_MODE_UNKNOWN = 0x00,
  110851. + WIRELESS_MODE_A = 0x01,
  110852. + WIRELESS_MODE_B = 0x02,
  110853. + WIRELESS_MODE_G = 0x04,
  110854. + WIRELESS_MODE_AUTO = 0x08,
  110855. + WIRELESS_MODE_N_24G = 0x10,
  110856. + WIRELESS_MODE_N_5G = 0x20
  110857. +} WIRELESS_MODE;
  110858. +
  110859. +
  110860. +#define CHANNEL_MAX_NUMBER 14+24+21 // 14 is the max channel number
  110861. +#define CHANNEL_GROUP_MAX 3+9 // ch1~3, ch4~9, ch10~14 total three groups
  110862. +#define MAX_PG_GROUP 13
  110863. +
  110864. +#define CHANNEL_GROUP_MAX_2G 3
  110865. +#define CHANNEL_GROUP_IDX_5GL 3
  110866. +#define CHANNEL_GROUP_IDX_5GM 6
  110867. +#define CHANNEL_GROUP_IDX_5GH 9
  110868. +#define CHANNEL_GROUP_MAX_5G 9
  110869. +#define CHANNEL_MAX_NUMBER_2G 14
  110870. +
  110871. +typedef enum _BaseBand_Config_Type{
  110872. + BaseBand_Config_PHY_REG = 0, //Radio Path A
  110873. + BaseBand_Config_AGC_TAB = 1, //Radio Path B
  110874. +}BaseBand_Config_Type, *PBaseBand_Config_Type;
  110875. +
  110876. +typedef enum _MACPHY_MODE_8192D{
  110877. + SINGLEMAC_SINGLEPHY,
  110878. + DUALMAC_DUALPHY,
  110879. + DUALMAC_SINGLEPHY,
  110880. +}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D;
  110881. +
  110882. +typedef enum _MACPHY_MODE_CHANGE_ACTION{
  110883. + DMDP2DMSP = 0,
  110884. + DMSP2DMDP = 1,
  110885. + DMDP2SMSP = 2,
  110886. + SMSP2DMDP = 3,
  110887. + DMSP2SMSP = 4,
  110888. + SMSP2DMSP = 5,
  110889. + MAXACTION
  110890. +}MACPHY_MODE_CHANGE_ACTION,*PMACPHY_MODE_CHANGE_ACTION;
  110891. +
  110892. +typedef enum _BAND_TYPE{
  110893. + BAND_ON_2_4G = 0,
  110894. + BAND_ON_5G,
  110895. + BAND_ON_BOTH,
  110896. + BANDMAX
  110897. +}BAND_TYPE,*PBAND_TYPE;
  110898. +
  110899. +typedef enum _PHY_Rate_Tx_Power_Offset_Area{
  110900. + RA_OFFSET_LEGACY_OFDM1,
  110901. + RA_OFFSET_LEGACY_OFDM2,
  110902. + RA_OFFSET_HT_OFDM1,
  110903. + RA_OFFSET_HT_OFDM2,
  110904. + RA_OFFSET_HT_OFDM3,
  110905. + RA_OFFSET_HT_OFDM4,
  110906. + RA_OFFSET_HT_CCK,
  110907. +}RA_OFFSET_AREA,*PRA_OFFSET_AREA;
  110908. +
  110909. +
  110910. +/* BB/RF related */
  110911. +typedef enum _RF_TYPE_8190P{
  110912. + RF_TYPE_MIN, // 0
  110913. + RF_8225=1, // 1 11b/g RF for verification only
  110914. + RF_8256=2, // 2 11b/g/n
  110915. + RF_8258=3, // 3 11a/b/g/n RF
  110916. + RF_6052=4, // 4 11b/g/n RF
  110917. + //RF_6052=5, // 4 11b/g/n RF
  110918. + // TODO: We sholud remove this psudo PHY RF after we get new RF.
  110919. + RF_PSEUDO_11N=5, // 5, It is a temporality RF.
  110920. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E;
  110921. +
  110922. +typedef struct _BB_REGISTER_DEFINITION{
  110923. + u32 rfintfs; // set software control:
  110924. + // 0x870~0x877[8 bytes]
  110925. +
  110926. + u32 rfintfi; // readback data:
  110927. + // 0x8e0~0x8e7[8 bytes]
  110928. +
  110929. + u32 rfintfo; // output data:
  110930. + // 0x860~0x86f [16 bytes]
  110931. +
  110932. + u32 rfintfe; // output enable:
  110933. + // 0x860~0x86f [16 bytes]
  110934. +
  110935. + u32 rf3wireOffset; // LSSI data:
  110936. + // 0x840~0x84f [16 bytes]
  110937. +
  110938. + u32 rfLSSI_Select; // BB Band Select:
  110939. + // 0x878~0x87f [8 bytes]
  110940. +
  110941. + u32 rfTxGainStage; // Tx gain stage:
  110942. + // 0x80c~0x80f [4 bytes]
  110943. +
  110944. + u32 rfHSSIPara1; // wire parameter control1 :
  110945. + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes]
  110946. +
  110947. + u32 rfHSSIPara2; // wire parameter control2 :
  110948. + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes]
  110949. +
  110950. + u32 rfSwitchControl; //Tx Rx antenna control :
  110951. + // 0x858~0x85f [16 bytes]
  110952. +
  110953. + u32 rfAGCControl1; //AGC parameter control1 :
  110954. + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes]
  110955. +
  110956. + u32 rfAGCControl2; //AGC parameter control2 :
  110957. + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes]
  110958. +
  110959. + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix :
  110960. + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes]
  110961. +
  110962. + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter :
  110963. + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes]
  110964. +
  110965. + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix
  110966. + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes]
  110967. +
  110968. + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type
  110969. + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes]
  110970. +
  110971. + u32 rfLSSIReadBack; //LSSI RF readback data SI mode
  110972. + // 0x8a0~0x8af [16 bytes]
  110973. +
  110974. + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B
  110975. +
  110976. +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T;
  110977. +
  110978. +#ifdef CONFIG_MP_INCLUDED
  110979. +typedef enum _ANTENNA_PATH{
  110980. + ANTENNA_NONE = 0x00,
  110981. + ANTENNA_D ,
  110982. + ANTENNA_C ,
  110983. + ANTENNA_CD ,
  110984. + ANTENNA_B ,
  110985. + ANTENNA_BD ,
  110986. + ANTENNA_BC ,
  110987. + ANTENNA_BCD ,
  110988. + ANTENNA_A ,
  110989. + ANTENNA_AD ,
  110990. + ANTENNA_AC ,
  110991. + ANTENNA_ACD ,
  110992. + ANTENNA_AB ,
  110993. + ANTENNA_ABD ,
  110994. + ANTENNA_ABC ,
  110995. + ANTENNA_ABCD
  110996. +} ANTENNA_PATH;
  110997. +#endif
  110998. +
  110999. +typedef struct _R_ANTENNA_SELECT_OFDM{
  111000. + u32 r_tx_antenna:4;
  111001. + u32 r_ant_l:4;
  111002. + u32 r_ant_non_ht:4;
  111003. + u32 r_ant_ht1:4;
  111004. + u32 r_ant_ht2:4;
  111005. + u32 r_ant_ht_s1:4;
  111006. + u32 r_ant_non_ht_s1:4;
  111007. + u32 OFDM_TXSC:2;
  111008. + u32 Reserved:2;
  111009. +}R_ANTENNA_SELECT_OFDM;
  111010. +
  111011. +typedef struct _R_ANTENNA_SELECT_CCK{
  111012. + u8 r_cckrx_enable_2:2;
  111013. + u8 r_cckrx_enable:2;
  111014. + u8 r_ccktx_enable:4;
  111015. +}R_ANTENNA_SELECT_CCK;
  111016. +
  111017. +/*------------------------------Define structure----------------------------*/
  111018. +
  111019. +
  111020. +/*------------------------Export global variable----------------------------*/
  111021. +/*------------------------Export global variable----------------------------*/
  111022. +
  111023. +
  111024. +/*------------------------Export Marco Definition---------------------------*/
  111025. +/*------------------------Export Marco Definition---------------------------*/
  111026. +
  111027. +//Added for TX Power
  111028. +//u8 GetRightChnlPlace(u8 chnl);
  111029. +u8 rtl8192d_GetRightChnlPlaceforIQK(u8 chnl);
  111030. +u8 rtl8192d_getChnlGroupfromArray(u8 chnl);
  111031. +/*--------------------------Exported Function prototype---------------------*/
  111032. +//
  111033. +// BB and RF register read/write
  111034. +//
  111035. +void rtl8192d_PHY_SetBBReg1Byte( IN PADAPTER Adapter,
  111036. + IN u32 RegAddr,
  111037. + IN u32 BitMask,
  111038. + IN u32 Data );
  111039. +u32 rtl8192d_PHY_QueryBBReg( IN PADAPTER Adapter,
  111040. + IN u32 RegAddr,
  111041. + IN u32 BitMask );
  111042. +void rtl8192d_PHY_SetBBReg( IN PADAPTER Adapter,
  111043. + IN u32 RegAddr,
  111044. + IN u32 BitMask,
  111045. + IN u32 Data );
  111046. +u32 rtl8192d_PHY_QueryRFReg( IN PADAPTER Adapter,
  111047. + IN RF_RADIO_PATH_E eRFPath,
  111048. + IN u32 RegAddr,
  111049. + IN u32 BitMask );
  111050. +void rtl8192d_PHY_SetRFReg( IN PADAPTER Adapter,
  111051. + IN RF_RADIO_PATH_E eRFPath,
  111052. + IN u32 RegAddr,
  111053. + IN u32 BitMask,
  111054. + IN u32 Data );
  111055. +
  111056. +//
  111057. +// Initialization related function
  111058. +//
  111059. +/* MAC/BB/RF HAL config */
  111060. +extern int PHY_MACConfig8192D( IN PADAPTER Adapter );
  111061. +extern int PHY_BBConfig8192D( IN PADAPTER Adapter );
  111062. +extern int PHY_RFConfig8192D( IN PADAPTER Adapter );
  111063. +/* RF config */
  111064. +int rtl8192d_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter,
  111065. + IN u8* pFileName,
  111066. + IN RF_RADIO_PATH_E eRFPath);
  111067. +int rtl8192d_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter,
  111068. + IN RF_CONTENT Content,
  111069. + IN RF_RADIO_PATH_E eRFPath);
  111070. +/* BB/RF readback check for making sure init OK */
  111071. +int rtl8192d_PHY_CheckBBAndRFOK( IN PADAPTER Adapter,
  111072. + IN HW90_BLOCK_E CheckBlock,
  111073. + IN RF_RADIO_PATH_E eRFPath );
  111074. +/* Read initi reg value for tx power setting. */
  111075. +void rtl8192d_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter );
  111076. +
  111077. +//
  111078. +// RF Power setting
  111079. +//
  111080. +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter,
  111081. +// IN RT_RF_POWER_STATE eRFPowerState);
  111082. +
  111083. +//
  111084. +// BB TX Power R/W
  111085. +//
  111086. +void PHY_GetTxPowerLevel8192D( IN PADAPTER Adapter,
  111087. + OUT u32* powerlevel );
  111088. +void PHY_SetTxPowerLevel8192D( IN PADAPTER Adapter,
  111089. + IN u8 channel );
  111090. +BOOLEAN PHY_UpdateTxPowerDbm8192D( IN PADAPTER Adapter,
  111091. + IN int powerInDbm );
  111092. +
  111093. +//
  111094. +VOID
  111095. +PHY_ScanOperationBackup8192D(IN PADAPTER Adapter,
  111096. + IN u8 Operation );
  111097. +
  111098. +//
  111099. +// Switch bandwidth for 8192S
  111100. +//
  111101. +//void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer );
  111102. +void PHY_SetBWMode8192D( IN PADAPTER pAdapter,
  111103. + IN HT_CHANNEL_WIDTH ChnlWidth,
  111104. + IN unsigned char Offset );
  111105. +
  111106. +//
  111107. +// Set FW CMD IO for 8192S.
  111108. +//
  111109. +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter,
  111110. +// IN IO_TYPE IOType);
  111111. +
  111112. +//
  111113. +// Set A2 entry to fw for 8192S
  111114. +//
  111115. +extern void FillA2Entry8192C( IN PADAPTER Adapter,
  111116. + IN u8 index,
  111117. + IN u8* val);
  111118. +
  111119. +
  111120. +//
  111121. +// channel switch related funciton
  111122. +//
  111123. +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer );
  111124. +void PHY_SwChnl8192D( IN PADAPTER pAdapter,
  111125. + IN u8 channel );
  111126. + // Call after initialization
  111127. +void PHY_SwChnlPhy8192D( IN PADAPTER pAdapter,
  111128. + IN u8 channel );
  111129. +
  111130. +extern void ChkFwCmdIoDone( IN PADAPTER Adapter);
  111131. +
  111132. +#ifdef USE_WORKITEM
  111133. +//extern void SetIOWorkItemCallback( IN PVOID pContext );
  111134. +#else
  111135. +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer);
  111136. +#endif
  111137. +
  111138. +//
  111139. +// BB/MAC/RF other monitor API
  111140. +//
  111141. +void PHY_SetMonitorMode8192D(IN PADAPTER pAdapter,
  111142. + IN BOOLEAN bEnableMonitorMode );
  111143. +
  111144. +BOOLEAN PHY_CheckIsLegalRfPath8192D(IN PADAPTER pAdapter,
  111145. + IN u32 eRFPath );
  111146. +
  111147. +//
  111148. +// IQ calibrate
  111149. +//
  111150. +void rtl8192d_PHY_IQCalibrate( IN PADAPTER pAdapter);
  111151. +
  111152. +
  111153. +//
  111154. +// LC calibrate
  111155. +//
  111156. +void rtl8192d_PHY_LCCalibrate(IN PADAPTER pAdapter);
  111157. +
  111158. +//
  111159. +// AP calibrate
  111160. +//
  111161. +void rtl8192d_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta);
  111162. +
  111163. +
  111164. +//
  111165. +// Modify the value of the hw register when beacon interval be changed.
  111166. +//
  111167. +void
  111168. +rtl8192d_PHY_SetBeaconHwReg( IN PADAPTER Adapter,
  111169. + IN u16 BeaconInterval );
  111170. +
  111171. +
  111172. +extern VOID
  111173. +PHY_SwitchEphyParameter(
  111174. + IN PADAPTER Adapter
  111175. + );
  111176. +
  111177. +extern VOID
  111178. +PHY_EnableHostClkReq(
  111179. + IN PADAPTER Adapter
  111180. + );
  111181. +
  111182. +BOOLEAN
  111183. +SetAntennaConfig92C(
  111184. + IN PADAPTER Adapter,
  111185. + IN u8 DefaultAnt
  111186. + );
  111187. +
  111188. +VOID
  111189. +PHY_StopTRXBeforeChangeBand8192D(
  111190. + PADAPTER Adapter
  111191. +);
  111192. +
  111193. +VOID
  111194. +PHY_UpdateBBRFConfiguration8192D(
  111195. + IN PADAPTER Adapter,
  111196. + IN BOOLEAN bisBandSwitch
  111197. +);
  111198. +
  111199. +VOID PHY_ReadMacPhyMode92D(
  111200. + IN PADAPTER Adapter,
  111201. + IN BOOLEAN AutoloadFail
  111202. +);
  111203. +
  111204. +VOID PHY_ConfigMacPhyMode92D(
  111205. + IN PADAPTER Adapter
  111206. +);
  111207. +
  111208. +VOID PHY_ConfigMacPhyModeInfo92D(
  111209. + IN PADAPTER Adapter
  111210. +);
  111211. +
  111212. +VOID PHY_ConfigMacCoexist_RFPage92D(
  111213. + IN PADAPTER Adapter
  111214. +);
  111215. +
  111216. +VOID
  111217. +rtl8192d_PHY_InitRxSetting(
  111218. + IN PADAPTER Adapter
  111219. +);
  111220. +
  111221. +VOID
  111222. +rtl8192d_PHY_ResetIQKResult(
  111223. + IN PADAPTER Adapter
  111224. +);
  111225. +
  111226. +
  111227. +VOID
  111228. +rtl8192d_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain);
  111229. +
  111230. +VOID
  111231. +HalChangeCCKStatus8192D(
  111232. + IN PADAPTER Adapter,
  111233. + IN BOOLEAN bCCKDisable
  111234. +);
  111235. +
  111236. +VOID
  111237. +PHY_InitPABias92D(IN PADAPTER Adapter);
  111238. +
  111239. +/*--------------------------Exported Function prototype---------------------*/
  111240. +
  111241. +#define PHY_SetBBReg1Byte(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg1Byte((Adapter), (RegAddr), (BitMask), (Data))
  111242. +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192d_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask))
  111243. +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data))
  111244. +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192d_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask))
  111245. +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192d_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data))
  111246. +
  111247. +#define PHY_SetMacReg PHY_SetBBReg
  111248. +
  111249. +#endif // __INC_HAL8192SPHYCFG_H
  111250. --- /dev/null
  111251. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h
  111252. @@ -0,0 +1,1170 @@
  111253. +/******************************************************************************
  111254. + *
  111255. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  111256. + *
  111257. + * This program is free software; you can redistribute it and/or modify it
  111258. + * under the terms of version 2 of the GNU General Public License as
  111259. + * published by the Free Software Foundation.
  111260. + *
  111261. + * This program is distributed in the hope that it will be useful, but WITHOUT
  111262. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  111263. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  111264. + * more details.
  111265. + *
  111266. + * You should have received a copy of the GNU General Public License along with
  111267. + * this program; if not, write to the Free Software Foundation, Inc.,
  111268. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  111269. + *
  111270. + *
  111271. + ******************************************************************************/
  111272. +/*****************************************************************************
  111273. + *
  111274. + * Module: __INC_HAL8192DPHYREG_H
  111275. + *
  111276. + *
  111277. + * Note: 1. Define PMAC/BB register map
  111278. + * 2. Define RF register map
  111279. + * 3. PMAC/BB register bit mask.
  111280. + * 4. RF reg bit mask.
  111281. + * 5. Other BB/RF relative definition.
  111282. + *
  111283. + *
  111284. + * Export: Constants, macro, functions(API), global variables(None).
  111285. + *
  111286. + * Abbrev:
  111287. + *
  111288. + * History:
  111289. + * Data Who Remark
  111290. + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
  111291. + * 2. Reorganize code architecture.
  111292. + * 09/25/2008 MH 1. Add RL6052 register definition
  111293. + *
  111294. + *****************************************************************************/
  111295. +#ifndef __INC_HAL8192DPHYREG_H
  111296. +#define __INC_HAL8192DPHYREG_H
  111297. +
  111298. +
  111299. +/*--------------------------Define Parameters-------------------------------*/
  111300. +
  111301. +//============================================================
  111302. +// 8192S Regsiter offset definition
  111303. +//============================================================
  111304. +
  111305. +//
  111306. +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF
  111307. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  111308. +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00
  111309. +// 3. RF register 0x00-2E
  111310. +// 4. Bit Mask for BB/RF register
  111311. +// 5. Other defintion for BB/RF R/W
  111312. +//
  111313. +
  111314. +
  111315. +//
  111316. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  111317. +// 1. Page1(0x100)
  111318. +//
  111319. +#define rPMAC_Reset 0x100
  111320. +#define rPMAC_TxStart 0x104
  111321. +#define rPMAC_TxLegacySIG 0x108
  111322. +#define rPMAC_TxHTSIG1 0x10c
  111323. +#define rPMAC_TxHTSIG2 0x110
  111324. +#define rPMAC_PHYDebug 0x114
  111325. +#define rPMAC_TxPacketNum 0x118
  111326. +#define rPMAC_TxIdle 0x11c
  111327. +#define rPMAC_TxMACHeader0 0x120
  111328. +#define rPMAC_TxMACHeader1 0x124
  111329. +#define rPMAC_TxMACHeader2 0x128
  111330. +#define rPMAC_TxMACHeader3 0x12c
  111331. +#define rPMAC_TxMACHeader4 0x130
  111332. +#define rPMAC_TxMACHeader5 0x134
  111333. +#define rPMAC_TxDataType 0x138
  111334. +#define rPMAC_TxRandomSeed 0x13c
  111335. +#define rPMAC_CCKPLCPPreamble 0x140
  111336. +#define rPMAC_CCKPLCPHeader 0x144
  111337. +#define rPMAC_CCKCRC16 0x148
  111338. +#define rPMAC_OFDMRxCRC32OK 0x170
  111339. +#define rPMAC_OFDMRxCRC32Er 0x174
  111340. +#define rPMAC_OFDMRxParityEr 0x178
  111341. +#define rPMAC_OFDMRxCRC8Er 0x17c
  111342. +#define rPMAC_CCKCRxRC16Er 0x180
  111343. +#define rPMAC_CCKCRxRC32Er 0x184
  111344. +#define rPMAC_CCKCRxRC32OK 0x188
  111345. +#define rPMAC_TxStatus 0x18c
  111346. +
  111347. +//
  111348. +// 2. Page2(0x200)
  111349. +//
  111350. +// The following two definition are only used for USB interface.
  111351. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address.
  111352. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data.
  111353. +
  111354. +//
  111355. +// 3. Page8(0x800)
  111356. +//
  111357. +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting??
  111358. +
  111359. +#define rFPGA0_TxInfo 0x804 // Status report??
  111360. +#define rFPGA0_PSDFunction 0x808
  111361. +
  111362. +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain?
  111363. +
  111364. +#define rFPGA0_RFTiming1 0x810 // Useless now
  111365. +#define rFPGA0_RFTiming2 0x814
  111366. +
  111367. +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register
  111368. +#define rFPGA0_XA_HSSIParameter2 0x824
  111369. +#define rFPGA0_XB_HSSIParameter1 0x828
  111370. +#define rFPGA0_XB_HSSIParameter2 0x82c
  111371. +
  111372. +#define rFPGA0_XA_LSSIParameter 0x840
  111373. +#define rFPGA0_XB_LSSIParameter 0x844
  111374. +
  111375. +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now
  111376. +#define rFPGA0_RFSleepUpParameter 0x854
  111377. +
  111378. +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch
  111379. +#define rFPGA0_XCD_SwitchControl 0x85c
  111380. +
  111381. +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch
  111382. +#define rFPGA0_XB_RFInterfaceOE 0x864
  111383. +
  111384. +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control
  111385. +#define rFPGA0_XCD_RFInterfaceSW 0x874
  111386. +
  111387. +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter
  111388. +#define rFPGA0_XCD_RFParameter 0x87c
  111389. +
  111390. +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4??
  111391. +#define rFPGA0_AnalogParameter2 0x884
  111392. +#define rFPGA0_AnalogParameter3 0x888
  111393. +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy
  111394. +#define rFPGA0_AnalogParameter4 0x88c
  111395. +
  111396. +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback
  111397. +#define rFPGA0_XB_LSSIReadBack 0x8a4
  111398. +#define rFPGA0_XC_LSSIReadBack 0x8a8
  111399. +#define rFPGA0_XD_LSSIReadBack 0x8ac
  111400. +
  111401. +#define rFPGA0_PSDReport 0x8b4 // Useless now
  111402. +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback
  111403. +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback
  111404. +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value
  111405. +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now
  111406. +
  111407. +//
  111408. +// 4. Page9(0x900)
  111409. +//
  111410. +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting??
  111411. +
  111412. +#define rFPGA1_TxBlock 0x904 // Useless now
  111413. +#define rFPGA1_DebugSelect 0x908 // Useless now
  111414. +#define rFPGA1_TxInfo 0x90c // Useless now // Status report??
  111415. +
  111416. +//
  111417. +// 5. PageA(0xA00)
  111418. +//
  111419. +// Set Control channel to upper or lower. These settings are required only for 40MHz
  111420. +#define rCCK0_System 0xa00
  111421. +
  111422. +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI
  111423. +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain
  111424. +
  111425. +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series
  111426. +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC
  111427. +
  111428. +#define rCCK0_RxHP 0xa14
  111429. +
  111430. +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold
  111431. +#define rCCK0_DSPParameter2 0xa1c //SQ threshold
  111432. +
  111433. +#define rCCK0_TxFilter1 0xa20
  111434. +#define rCCK0_TxFilter2 0xa24
  111435. +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3
  111436. +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report
  111437. +#define rCCK0_TRSSIReport 0xa50
  111438. +#define rCCK0_RxReport 0xa54 //0xa57
  111439. +#define rCCK0_FACounterLower 0xa5c //0xa5b
  111440. +#define rCCK0_FACounterUpper 0xa58 //0xa5c
  111441. +
  111442. +//
  111443. +// PageB(0xB00)
  111444. +//
  111445. +#define rPdp_AntA 0xb00
  111446. +#define rPdp_AntA_4 0xb04
  111447. +#define rPdp_AntA_8 0xb08
  111448. +#define rPdp_AntA_C 0xb0c
  111449. +#define rPdp_AntA_10 0xb10
  111450. +#define rPdp_AntA_14 0xb14
  111451. +#define rPdp_AntA_18 0xb18
  111452. +#define rPdp_AntA_1C 0xb1c
  111453. +#define rPdp_AntA_20 0xb20
  111454. +#define rPdp_AntA_24 0xb24
  111455. +
  111456. +#define rConfig_Pmpd_AntA 0xb28
  111457. +#define rConfig_ram64x16 0xb2c
  111458. +
  111459. +#define rBndA 0xb30
  111460. +#define rHssiPar 0xb34
  111461. +
  111462. +#define rConfig_AntA 0xb68
  111463. +#define rConfig_AntB 0xb6c
  111464. +
  111465. +#define rPdp_AntB 0xb70
  111466. +#define rPdp_AntB_4 0xb74
  111467. +#define rPdp_AntB_8 0xb78
  111468. +#define rPdp_AntB_C 0xb7c
  111469. +#define rPdp_AntB_10 0xb80
  111470. +#define rPdp_AntB_14 0xb84
  111471. +#define rPdp_AntB_18 0xb88
  111472. +#define rPdp_AntB_1C 0xb8c
  111473. +#define rPdp_AntB_20 0xb90
  111474. +#define rPdp_AntB_24 0xb94
  111475. +
  111476. +#define rConfig_Pmpd_AntB 0xb98
  111477. +
  111478. +#define rBndB 0xba0
  111479. +
  111480. +#define rAPK 0xbd8
  111481. +#define rPm_Rx0_AntA 0xbdc
  111482. +#define rPm_Rx1_AntA 0xbe0
  111483. +#define rPm_Rx2_AntA 0xbe4
  111484. +#define rPm_Rx3_AntA 0xbe8
  111485. +#define rPm_Rx0_AntB 0xbec
  111486. +#define rPm_Rx1_AntB 0xbf0
  111487. +#define rPm_Rx2_AntB 0xbf4
  111488. +#define rPm_Rx3_AntB 0xbf8
  111489. +
  111490. +//
  111491. +// 6. PageC(0xC00)
  111492. +//
  111493. +#define rOFDM0_LSTF 0xc00
  111494. +
  111495. +#define rOFDM0_TRxPathEnable 0xc04
  111496. +#define rOFDM0_TRMuxPar 0xc08
  111497. +#define rOFDM0_TRSWIsolation 0xc0c
  111498. +
  111499. +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter
  111500. +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix
  111501. +#define rOFDM0_XBRxAFE 0xc18
  111502. +#define rOFDM0_XBRxIQImbalance 0xc1c
  111503. +#define rOFDM0_XCRxAFE 0xc20
  111504. +#define rOFDM0_XCRxIQImbalance 0xc24
  111505. +#define rOFDM0_XDRxAFE 0xc28
  111506. +#define rOFDM0_XDRxIQImbalance 0xc2c
  111507. +
  111508. +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain
  111509. +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync.
  111510. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync.
  111511. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI
  111512. +
  111513. +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path
  111514. +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC
  111515. +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold
  111516. +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA
  111517. +
  111518. +#define rOFDM0_XAAGCCore1 0xc50 // DIG
  111519. +#define rOFDM0_XAAGCCore2 0xc54
  111520. +#define rOFDM0_XBAGCCore1 0xc58
  111521. +#define rOFDM0_XBAGCCore2 0xc5c
  111522. +#define rOFDM0_XCAGCCore1 0xc60
  111523. +#define rOFDM0_XCAGCCore2 0xc64
  111524. +#define rOFDM0_XDAGCCore1 0xc68
  111525. +#define rOFDM0_XDAGCCore2 0xc6c
  111526. +
  111527. +#define rOFDM0_AGCParameter1 0xc70
  111528. +#define rOFDM0_AGCParameter2 0xc74
  111529. +#define rOFDM0_AGCRSSITable 0xc78
  111530. +#define rOFDM0_HTSTFAGC 0xc7c
  111531. +
  111532. +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG
  111533. +#define rOFDM0_XATxAFE 0xc84
  111534. +#define rOFDM0_XBTxIQImbalance 0xc88
  111535. +#define rOFDM0_XBTxAFE 0xc8c
  111536. +#define rOFDM0_XCTxIQImbalance 0xc90
  111537. +#define rOFDM0_XCTxAFE 0xc94
  111538. +#define rOFDM0_XDTxIQImbalance 0xc98
  111539. +#define rOFDM0_XDTxAFE 0xc9c
  111540. +
  111541. +#define rOFDM0_RxIQExtAnta 0xca0
  111542. +#define rOFDM0_TxCoeff1 0xca4
  111543. +#define rOFDM0_TxCoeff2 0xca8
  111544. +#define rOFDM0_TxCoeff3 0xcac
  111545. +#define rOFDM0_TxCoeff4 0xcb0
  111546. +#define rOFDM0_TxCoeff5 0xcb4
  111547. +#define rOFDM0_TxCoeff6 0xcb8
  111548. +#define rOFDM0_RxHPParameter 0xce0
  111549. +#define rOFDM0_TxPseudoNoiseWgt 0xce4
  111550. +#define rOFDM0_FrameSync 0xcf0
  111551. +#define rOFDM0_DFSReport 0xcf4
  111552. +
  111553. +//
  111554. +// 7. PageD(0xD00)
  111555. +//
  111556. +#define rOFDM1_LSTF 0xd00
  111557. +#define rOFDM1_TRxPathEnable 0xd04
  111558. +
  111559. +#define rOFDM1_CFO 0xd08 // No setting now
  111560. +#define rOFDM1_CSI1 0xd10
  111561. +#define rOFDM1_SBD 0xd14
  111562. +#define rOFDM1_CSI2 0xd18
  111563. +#define rOFDM1_CFOTracking 0xd2c
  111564. +#define rOFDM1_TRxMesaure1 0xd34
  111565. +#define rOFDM1_IntfDet 0xd3c
  111566. +#define rOFDM1_PseudoNoiseStateAB 0xd50
  111567. +#define rOFDM1_PseudoNoiseStateCD 0xd54
  111568. +#define rOFDM1_RxPseudoNoiseWgt 0xd58
  111569. +
  111570. +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail
  111571. +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail
  111572. +#define rOFDM_PHYCounter3 0xda8 //MCS not support
  111573. +
  111574. +#define rOFDM_ShortCFOAB 0xdac // No setting now
  111575. +#define rOFDM_ShortCFOCD 0xdb0
  111576. +#define rOFDM_LongCFOAB 0xdb4
  111577. +#define rOFDM_LongCFOCD 0xdb8
  111578. +#define rOFDM_TailCFOAB 0xdbc
  111579. +#define rOFDM_TailCFOCD 0xdc0
  111580. +#define rOFDM_PWMeasure1 0xdc4
  111581. +#define rOFDM_PWMeasure2 0xdc8
  111582. +#define rOFDM_BWReport 0xdcc
  111583. +#define rOFDM_AGCReport 0xdd0
  111584. +#define rOFDM_RxSNR 0xdd4
  111585. +#define rOFDM_RxEVMCSI 0xdd8
  111586. +#define rOFDM_SIGReport 0xddc
  111587. +
  111588. +
  111589. +//
  111590. +// 8. PageE(0xE00)
  111591. +//
  111592. +#define rTxAGC_A_Rate18_06 0xe00
  111593. +#define rTxAGC_A_Rate54_24 0xe04
  111594. +#define rTxAGC_A_CCK1_Mcs32 0xe08
  111595. +#define rTxAGC_A_Mcs03_Mcs00 0xe10
  111596. +#define rTxAGC_A_Mcs07_Mcs04 0xe14
  111597. +#define rTxAGC_A_Mcs11_Mcs08 0xe18
  111598. +#define rTxAGC_A_Mcs15_Mcs12 0xe1c
  111599. +
  111600. +#define rTxAGC_B_Rate18_06 0x830
  111601. +#define rTxAGC_B_Rate54_24 0x834
  111602. +#define rTxAGC_B_CCK1_55_Mcs32 0x838
  111603. +#define rTxAGC_B_Mcs03_Mcs00 0x83c
  111604. +#define rTxAGC_B_Mcs07_Mcs04 0x848
  111605. +#define rTxAGC_B_Mcs11_Mcs08 0x84c
  111606. +#define rTxAGC_B_Mcs15_Mcs12 0x868
  111607. +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c
  111608. +
  111609. +#define rFPGA0_IQK 0xe28
  111610. +#define rTx_IQK_Tone_A 0xe30
  111611. +#define rRx_IQK_Tone_A 0xe34
  111612. +#define rTx_IQK_PI_A 0xe38
  111613. +#define rRx_IQK_PI_A 0xe3c
  111614. +
  111615. +#define rTx_IQK 0xe40
  111616. +#define rRx_IQK 0xe44
  111617. +#define rIQK_AGC_Pts 0xe48
  111618. +#define rIQK_AGC_Rsp 0xe4c
  111619. +#define rTx_IQK_Tone_B 0xe50
  111620. +#define rRx_IQK_Tone_B 0xe54
  111621. +#define rTx_IQK_PI_B 0xe58
  111622. +#define rRx_IQK_PI_B 0xe5c
  111623. +#define rIQK_AGC_Cont 0xe60
  111624. +
  111625. +#define rBlue_Tooth 0xe6c
  111626. +#define rRx_Wait_CCA 0xe70
  111627. +#define rTx_CCK_RFON 0xe74
  111628. +#define rTx_CCK_BBON 0xe78
  111629. +#define rTx_OFDM_RFON 0xe7c
  111630. +#define rTx_OFDM_BBON 0xe80
  111631. +#define rTx_To_Rx 0xe84
  111632. +#define rTx_To_Tx 0xe88
  111633. +#define rRx_CCK 0xe8c
  111634. +
  111635. +#define rTx_Power_Before_IQK_A 0xe94
  111636. +#define rTx_Power_After_IQK_A 0xe9c
  111637. +
  111638. +#define rRx_Power_Before_IQK_A 0xea0
  111639. +#define rRx_Power_Before_IQK_A_2 0xea4
  111640. +#define rRx_Power_After_IQK_A 0xea8
  111641. +#define rRx_Power_After_IQK_A_2 0xeac
  111642. +
  111643. +#define rTx_Power_Before_IQK_B 0xeb4
  111644. +#define rTx_Power_After_IQK_B 0xebc
  111645. +
  111646. +#define rRx_Power_Before_IQK_B 0xec0
  111647. +#define rRx_Power_Before_IQK_B_2 0xec4
  111648. +#define rRx_Power_After_IQK_B 0xec8
  111649. +#define rRx_Power_After_IQK_B_2 0xecc
  111650. +
  111651. +#define rRx_OFDM 0xed0
  111652. +#define rRx_Wait_RIFS 0xed4
  111653. +#define rRx_TO_Rx 0xed8
  111654. +#define rStandby 0xedc
  111655. +#define rSleep 0xee0
  111656. +#define rPMPD_ANAEN 0xeec
  111657. +
  111658. +//
  111659. +// 7. RF Register 0x00-0x2E (RF 8256)
  111660. +// RF-0222D 0x00-3F
  111661. +//
  111662. +//Zebra1
  111663. +#define rZebra1_HSSIEnable 0x0 // Useless now
  111664. +#define rZebra1_TRxEnable1 0x1
  111665. +#define rZebra1_TRxEnable2 0x2
  111666. +#define rZebra1_AGC 0x4
  111667. +#define rZebra1_ChargePump 0x5
  111668. +#define rZebra1_Channel 0x7 // RF channel switch
  111669. +
  111670. +//#endif
  111671. +#define rZebra1_TxGain 0x8 // Useless now
  111672. +#define rZebra1_TxLPF 0x9
  111673. +#define rZebra1_RxLPF 0xb
  111674. +#define rZebra1_RxHPFCorner 0xc
  111675. +
  111676. +//Zebra4
  111677. +#define rGlobalCtrl 0 // Useless now
  111678. +#define rRTL8256_TxLPF 19
  111679. +#define rRTL8256_RxLPF 11
  111680. +
  111681. +//RTL8258
  111682. +#define rRTL8258_TxLPF 0x11 // Useless now
  111683. +#define rRTL8258_RxLPF 0x13
  111684. +#define rRTL8258_RSSILPF 0xa
  111685. +
  111686. +//
  111687. +// RL6052 Register definition
  111688. +//
  111689. +#define RF_AC 0x00 //
  111690. +
  111691. +#define RF_IQADJ_G1 0x01 //
  111692. +#define RF_IQADJ_G2 0x02 //
  111693. +#define RF_BS_PA_APSET_G1_G4 0x03
  111694. +#define RF_BS_PA_APSET_G5_G8 0x04
  111695. +#define RF_POW_TRSW 0x05 //
  111696. +
  111697. +#define RF_GAIN_RX 0x06 //
  111698. +#define RF_GAIN_TX 0x07 //
  111699. +
  111700. +#define RF_TXM_IDAC 0x08 //
  111701. +#define RF_IPA_G 0x09 //
  111702. +#define RF_TXBIAS_G 0x0A
  111703. +#define RF_TXPA_AG 0x0B
  111704. +#define RF_IPA_A 0x0C //
  111705. +#define RF_TXBIAS_A 0x0D
  111706. +#define RF_BS_PA_APSET_G9_G11 0x0E
  111707. +#define RF_BS_IQGEN 0x0F //
  111708. +
  111709. +#define RF_MODE1 0x10 //
  111710. +#define RF_MODE2 0x11 //
  111711. +
  111712. +#define RF_RX_AGC_HP 0x12 //
  111713. +#define RF_TX_AGC 0x13 //
  111714. +#define RF_BIAS 0x14 //
  111715. +#define RF_IPA 0x15 //
  111716. +#define RF_POW_ABILITY 0x17 //
  111717. +#define RF_MODE_AG 0x18 //
  111718. +#define rRfChannel 0x18 // RF channel and BW switch
  111719. +#define RF_CHNLBW 0x18 // RF channel and BW switch
  111720. +#define RF_TOP 0x19 //
  111721. +
  111722. +#define RF_RX_G1 0x1A //
  111723. +#define RF_RX_G2 0x1B //
  111724. +
  111725. +#define RF_RX_BB2 0x1C //
  111726. +#define RF_RX_BB1 0x1D //
  111727. +
  111728. +#define RF_RCK1 0x1E //
  111729. +#define RF_RCK2 0x1F //
  111730. +
  111731. +#define RF_TX_G1 0x20 //
  111732. +#define RF_TX_G2 0x21 //
  111733. +#define RF_TX_G3 0x22 //
  111734. +
  111735. +#define RF_TX_BB1 0x23 //
  111736. +
  111737. +#define RF_T_METER 0x42 //
  111738. +
  111739. +#define RF_SYN_G1 0x25 // RF TX Power control
  111740. +#define RF_SYN_G2 0x26 // RF TX Power control
  111741. +#define RF_SYN_G3 0x27 // RF TX Power control
  111742. +#define RF_SYN_G4 0x28 // RF TX Power control
  111743. +#define RF_SYN_G5 0x29 // RF TX Power control
  111744. +#define RF_SYN_G6 0x2A // RF TX Power control
  111745. +#define RF_SYN_G7 0x2B // RF TX Power control
  111746. +#define RF_SYN_G8 0x2C // RF TX Power control
  111747. +
  111748. +#define RF_RCK_OS 0x30 // RF TX PA control
  111749. +
  111750. +#define RF_TXPA_G1 0x31 // RF TX PA control
  111751. +#define RF_TXPA_G2 0x32 // RF TX PA control
  111752. +#define RF_TXPA_G3 0x33 // RF TX PA control
  111753. +#define RF_LOBF_9 0x38
  111754. +#define RF_RXRF_A3 0x3C //
  111755. +#define RF_TRSW 0x3F
  111756. +
  111757. +#define RF_TXRF_A2 0x41
  111758. +#define RF_TXPA_G4 0x46
  111759. +#define RF_TXPA_A4 0x4B
  111760. +
  111761. +//
  111762. +//Bit Mask
  111763. +//
  111764. +// 1. Page1(0x100)
  111765. +#define bBBResetB 0x100 // Useless now?
  111766. +#define bGlobalResetB 0x200
  111767. +#define bOFDMTxStart 0x4
  111768. +#define bCCKTxStart 0x8
  111769. +#define bCRC32Debug 0x100
  111770. +#define bPMACLoopback 0x10
  111771. +#define bTxLSIG 0xffffff
  111772. +#define bOFDMTxRate 0xf
  111773. +#define bOFDMTxReserved 0x10
  111774. +#define bOFDMTxLength 0x1ffe0
  111775. +#define bOFDMTxParity 0x20000
  111776. +#define bTxHTSIG1 0xffffff
  111777. +#define bTxHTMCSRate 0x7f
  111778. +#define bTxHTBW 0x80
  111779. +#define bTxHTLength 0xffff00
  111780. +#define bTxHTSIG2 0xffffff
  111781. +#define bTxHTSmoothing 0x1
  111782. +#define bTxHTSounding 0x2
  111783. +#define bTxHTReserved 0x4
  111784. +#define bTxHTAggreation 0x8
  111785. +#define bTxHTSTBC 0x30
  111786. +#define bTxHTAdvanceCoding 0x40
  111787. +#define bTxHTShortGI 0x80
  111788. +#define bTxHTNumberHT_LTF 0x300
  111789. +#define bTxHTCRC8 0x3fc00
  111790. +#define bCounterReset 0x10000
  111791. +#define bNumOfOFDMTx 0xffff
  111792. +#define bNumOfCCKTx 0xffff0000
  111793. +#define bTxIdleInterval 0xffff
  111794. +#define bOFDMService 0xffff0000
  111795. +#define bTxMACHeader 0xffffffff
  111796. +#define bTxDataInit 0xff
  111797. +#define bTxHTMode 0x100
  111798. +#define bTxDataType 0x30000
  111799. +#define bTxRandomSeed 0xffffffff
  111800. +#define bCCKTxPreamble 0x1
  111801. +#define bCCKTxSFD 0xffff0000
  111802. +#define bCCKTxSIG 0xff
  111803. +#define bCCKTxService 0xff00
  111804. +#define bCCKLengthExt 0x8000
  111805. +#define bCCKTxLength 0xffff0000
  111806. +#define bCCKTxCRC16 0xffff
  111807. +#define bCCKTxStatus 0x1
  111808. +#define bOFDMTxStatus 0x2
  111809. +
  111810. +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff))
  111811. +
  111812. +// 2. Page8(0x800)
  111813. +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD
  111814. +#define bJapanMode 0x2
  111815. +#define bCCKTxSC 0x30
  111816. +#define bCCKEn 0x1000000
  111817. +#define bOFDMEn 0x2000000
  111818. +
  111819. +#define bOFDMRxADCPhase 0x10000 // Useless now
  111820. +#define bOFDMTxDACPhase 0x40000
  111821. +#define bXATxAGC 0x3f
  111822. +
  111823. +#define bAntennaSelect 0x0300
  111824. +
  111825. +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage
  111826. +#define bXCTxAGC 0xf000
  111827. +#define bXDTxAGC 0xf0000
  111828. +
  111829. +#define bPAStart 0xf0000000 // Useless now
  111830. +#define bTRStart 0x00f00000
  111831. +#define bRFStart 0x0000f000
  111832. +#define bBBStart 0x000000f0
  111833. +#define bBBCCKStart 0x0000000f
  111834. +#define bPAEnd 0xf //Reg0x814
  111835. +#define bTREnd 0x0f000000
  111836. +#define bRFEnd 0x000f0000
  111837. +#define bCCAMask 0x000000f0 //T2R
  111838. +#define bR2RCCAMask 0x00000f00
  111839. +#define bHSSI_R2TDelay 0xf8000000
  111840. +#define bHSSI_T2RDelay 0xf80000
  111841. +#define bContTxHSSI 0x400 //chane gain at continue Tx
  111842. +#define bIGFromCCK 0x200
  111843. +#define bAGCAddress 0x3f
  111844. +#define bRxHPTx 0x7000
  111845. +#define bRxHPT2R 0x38000
  111846. +#define bRxHPCCKIni 0xc0000
  111847. +#define bAGCTxCode 0xc00000
  111848. +#define bAGCRxCode 0x300000
  111849. +
  111850. +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1
  111851. +#define b3WireAddressLength 0x400
  111852. +
  111853. +#define b3WireRFPowerDown 0x1 // Useless now
  111854. +//#define bHWSISelect 0x8
  111855. +#define b5GPAPEPolarity 0x40000000
  111856. +#define b2GPAPEPolarity 0x80000000
  111857. +#define bRFSW_TxDefaultAnt 0x3
  111858. +#define bRFSW_TxOptionAnt 0x30
  111859. +#define bRFSW_RxDefaultAnt 0x300
  111860. +#define bRFSW_RxOptionAnt 0x3000
  111861. +#define bRFSI_3WireData 0x1
  111862. +#define bRFSI_3WireClock 0x2
  111863. +#define bRFSI_3WireLoad 0x4
  111864. +#define bRFSI_3WireRW 0x8
  111865. +#define bRFSI_3Wire 0xf
  111866. +
  111867. +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW
  111868. +
  111869. +#define bRFSI_TRSW 0x20 // Useless now
  111870. +#define bRFSI_TRSWB 0x40
  111871. +#define bRFSI_ANTSW 0x100
  111872. +#define bRFSI_ANTSWB 0x200
  111873. +#define bRFSI_PAPE 0x400
  111874. +#define bRFSI_PAPE5G 0x800
  111875. +#define bBandSelect 0x1
  111876. +#define bHTSIG2_GI 0x80
  111877. +#define bHTSIG2_Smoothing 0x01
  111878. +#define bHTSIG2_Sounding 0x02
  111879. +#define bHTSIG2_Aggreaton 0x08
  111880. +#define bHTSIG2_STBC 0x30
  111881. +#define bHTSIG2_AdvCoding 0x40
  111882. +#define bHTSIG2_NumOfHTLTF 0x300
  111883. +#define bHTSIG2_CRC8 0x3fc
  111884. +#define bHTSIG1_MCS 0x7f
  111885. +#define bHTSIG1_BandWidth 0x80
  111886. +#define bHTSIG1_HTLength 0xffff
  111887. +#define bLSIG_Rate 0xf
  111888. +#define bLSIG_Reserved 0x10
  111889. +#define bLSIG_Length 0x1fffe
  111890. +#define bLSIG_Parity 0x20
  111891. +#define bCCKRxPhase 0x4
  111892. +
  111893. +#define bLSSIReadAddress 0x7f800000 // T65 RF
  111894. +
  111895. +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal
  111896. +
  111897. +#define bLSSIReadBackData 0xfffff // T65 RF
  111898. +
  111899. +#define bLSSIReadOKFlag 0x1000 // Useless now
  111900. +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz
  111901. +#define bRegulator0Standby 0x1
  111902. +#define bRegulatorPLLStandby 0x2
  111903. +#define bRegulator1Standby 0x4
  111904. +#define bPLLPowerUp 0x8
  111905. +#define bDPLLPowerUp 0x10
  111906. +#define bDA10PowerUp 0x20
  111907. +#define bAD7PowerUp 0x200
  111908. +#define bDA6PowerUp 0x2000
  111909. +#define bXtalPowerUp 0x4000
  111910. +#define b40MDClkPowerUP 0x8000
  111911. +#define bDA6DebugMode 0x20000
  111912. +#define bDA6Swing 0x380000
  111913. +
  111914. +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ
  111915. +
  111916. +#define b80MClkDelay 0x18000000 // Useless
  111917. +#define bAFEWatchDogEnable 0x20000000
  111918. +
  111919. +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap
  111920. +#define bXtalCap23 0x3
  111921. +#define bXtalCap92x 0x0f000000
  111922. +#define bXtalCap 0x0f000000
  111923. +
  111924. +#define bIntDifClkEnable 0x400 // Useless
  111925. +#define bExtSigClkEnable 0x800
  111926. +#define bBandgapMbiasPowerUp 0x10000
  111927. +#define bAD11SHGain 0xc0000
  111928. +#define bAD11InputRange 0x700000
  111929. +#define bAD11OPCurrent 0x3800000
  111930. +#define bIPathLoopback 0x4000000
  111931. +#define bQPathLoopback 0x8000000
  111932. +#define bAFELoopback 0x10000000
  111933. +#define bDA10Swing 0x7e0
  111934. +#define bDA10Reverse 0x800
  111935. +#define bDAClkSource 0x1000
  111936. +#define bAD7InputRange 0x6000
  111937. +#define bAD7Gain 0x38000
  111938. +#define bAD7OutputCMMode 0x40000
  111939. +#define bAD7InputCMMode 0x380000
  111940. +#define bAD7Current 0xc00000
  111941. +#define bRegulatorAdjust 0x7000000
  111942. +#define bAD11PowerUpAtTx 0x1
  111943. +#define bDA10PSAtTx 0x10
  111944. +#define bAD11PowerUpAtRx 0x100
  111945. +#define bDA10PSAtRx 0x1000
  111946. +#define bCCKRxAGCFormat 0x200
  111947. +#define bPSDFFTSamplepPoint 0xc000
  111948. +#define bPSDAverageNum 0x3000
  111949. +#define bIQPathControl 0xc00
  111950. +#define bPSDFreq 0x3ff
  111951. +#define bPSDAntennaPath 0x30
  111952. +#define bPSDIQSwitch 0x40
  111953. +#define bPSDRxTrigger 0x400000
  111954. +#define bPSDTxTrigger 0x80000000
  111955. +#define bPSDSineToneScale 0x7f000000
  111956. +#define bPSDReport 0xffff
  111957. +
  111958. +// 3. Page9(0x900)
  111959. +#define bOFDMTxSC 0x30000000 // Useless
  111960. +#define bCCKTxOn 0x1
  111961. +#define bOFDMTxOn 0x2
  111962. +#define bDebugPage 0xfff //reset debug page and also HWord, LWord
  111963. +#define bDebugItem 0xff //reset debug page and LWord
  111964. +#define bAntL 0x10
  111965. +#define bAntNonHT 0x100
  111966. +#define bAntHT1 0x1000
  111967. +#define bAntHT2 0x10000
  111968. +#define bAntHT1S1 0x100000
  111969. +#define bAntNonHTS1 0x1000000
  111970. +
  111971. +// 4. PageA(0xA00)
  111972. +#define bCCKBBMode 0x3 // Useless
  111973. +#define bCCKTxPowerSaving 0x80
  111974. +#define bCCKRxPowerSaving 0x40
  111975. +
  111976. +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch
  111977. +
  111978. +#define bCCKScramble 0x8 // Useless
  111979. +#define bCCKAntDiversity 0x8000
  111980. +#define bCCKCarrierRecovery 0x4000
  111981. +#define bCCKTxRate 0x3000
  111982. +#define bCCKDCCancel 0x0800
  111983. +#define bCCKISICancel 0x0400
  111984. +#define bCCKMatchFilter 0x0200
  111985. +#define bCCKEqualizer 0x0100
  111986. +#define bCCKPreambleDetect 0x800000
  111987. +#define bCCKFastFalseCCA 0x400000
  111988. +#define bCCKChEstStart 0x300000
  111989. +#define bCCKCCACount 0x080000
  111990. +#define bCCKcs_lim 0x070000
  111991. +#define bCCKBistMode 0x80000000
  111992. +#define bCCKCCAMask 0x40000000
  111993. +#define bCCKTxDACPhase 0x4
  111994. +#define bCCKRxADCPhase 0x20000000 //r_rx_clk
  111995. +#define bCCKr_cp_mode0 0x0100
  111996. +#define bCCKTxDCOffset 0xf0
  111997. +#define bCCKRxDCOffset 0xf
  111998. +#define bCCKCCAMode 0xc000
  111999. +#define bCCKFalseCS_lim 0x3f00
  112000. +#define bCCKCS_ratio 0xc00000
  112001. +#define bCCKCorgBit_sel 0x300000
  112002. +#define bCCKPD_lim 0x0f0000
  112003. +#define bCCKNewCCA 0x80000000
  112004. +#define bCCKRxHPofIG 0x8000
  112005. +#define bCCKRxIG 0x7f00
  112006. +#define bCCKLNAPolarity 0x800000
  112007. +#define bCCKRx1stGain 0x7f0000
  112008. +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity
  112009. +#define bCCKRxAGCSatLevel 0x1f000000
  112010. +#define bCCKRxAGCSatCount 0xe0
  112011. +#define bCCKRxRFSettle 0x1f //AGCsamp_dly
  112012. +#define bCCKFixedRxAGC 0x8000
  112013. +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824
  112014. +#define bCCKAntennaPolarity 0x2000
  112015. +#define bCCKTxFilterType 0x0c00
  112016. +#define bCCKRxAGCReportType 0x0300
  112017. +#define bCCKRxDAGCEn 0x80000000
  112018. +#define bCCKRxDAGCPeriod 0x20000000
  112019. +#define bCCKRxDAGCSatLevel 0x1f000000
  112020. +#define bCCKTimingRecovery 0x800000
  112021. +#define bCCKTxC0 0x3f0000
  112022. +#define bCCKTxC1 0x3f000000
  112023. +#define bCCKTxC2 0x3f
  112024. +#define bCCKTxC3 0x3f00
  112025. +#define bCCKTxC4 0x3f0000
  112026. +#define bCCKTxC5 0x3f000000
  112027. +#define bCCKTxC6 0x3f
  112028. +#define bCCKTxC7 0x3f00
  112029. +#define bCCKDebugPort 0xff0000
  112030. +#define bCCKDACDebug 0x0f000000
  112031. +#define bCCKFalseAlarmEnable 0x8000
  112032. +#define bCCKFalseAlarmRead 0x4000
  112033. +#define bCCKTRSSI 0x7f
  112034. +#define bCCKRxAGCReport 0xfe
  112035. +#define bCCKRxReport_AntSel 0x80000000
  112036. +#define bCCKRxReport_MFOff 0x40000000
  112037. +#define bCCKRxRxReport_SQLoss 0x20000000
  112038. +#define bCCKRxReport_Pktloss 0x10000000
  112039. +#define bCCKRxReport_Lockedbit 0x08000000
  112040. +#define bCCKRxReport_RateError 0x04000000
  112041. +#define bCCKRxReport_RxRate 0x03000000
  112042. +#define bCCKRxFACounterLower 0xff
  112043. +#define bCCKRxFACounterUpper 0xff000000
  112044. +#define bCCKRxHPAGCStart 0xe000
  112045. +#define bCCKRxHPAGCFinal 0x1c00
  112046. +#define bCCKRxFalseAlarmEnable 0x8000
  112047. +#define bCCKFACounterFreeze 0x4000
  112048. +#define bCCKTxPathSel 0x10000000
  112049. +#define bCCKDefaultRxPath 0xc000000
  112050. +#define bCCKOptionRxPath 0x3000000
  112051. +
  112052. +// 5. PageC(0xC00)
  112053. +#define bNumOfSTF 0x3 // Useless
  112054. +#define bShift_L 0xc0
  112055. +#define bGI_TH 0xc
  112056. +#define bRxPathA 0x1
  112057. +#define bRxPathB 0x2
  112058. +#define bRxPathC 0x4
  112059. +#define bRxPathD 0x8
  112060. +#define bTxPathA 0x1
  112061. +#define bTxPathB 0x2
  112062. +#define bTxPathC 0x4
  112063. +#define bTxPathD 0x8
  112064. +#define bTRSSIFreq 0x200
  112065. +#define bADCBackoff 0x3000
  112066. +#define bDFIRBackoff 0xc000
  112067. +#define bTRSSILatchPhase 0x10000
  112068. +#define bRxIDCOffset 0xff
  112069. +#define bRxQDCOffset 0xff00
  112070. +#define bRxDFIRMode 0x1800000
  112071. +#define bRxDCNFType 0xe000000
  112072. +#define bRXIQImb_A 0x3ff
  112073. +#define bRXIQImb_B 0xfc00
  112074. +#define bRXIQImb_C 0x3f0000
  112075. +#define bRXIQImb_D 0xffc00000
  112076. +#define bDC_dc_Notch 0x60000
  112077. +#define bRxNBINotch 0x1f000000
  112078. +#define bPD_TH 0xf
  112079. +#define bPD_TH_Opt2 0xc000
  112080. +#define bPWED_TH 0x700
  112081. +#define bIfMF_Win_L 0x800
  112082. +#define bPD_Option 0x1000
  112083. +#define bMF_Win_L 0xe000
  112084. +#define bBW_Search_L 0x30000
  112085. +#define bwin_enh_L 0xc0000
  112086. +#define bBW_TH 0x700000
  112087. +#define bED_TH2 0x3800000
  112088. +#define bBW_option 0x4000000
  112089. +#define bRatio_TH 0x18000000
  112090. +#define bWindow_L 0xe0000000
  112091. +#define bSBD_Option 0x1
  112092. +#define bFrame_TH 0x1c
  112093. +#define bFS_Option 0x60
  112094. +#define bDC_Slope_check 0x80
  112095. +#define bFGuard_Counter_DC_L 0xe00
  112096. +#define bFrame_Weight_Short 0x7000
  112097. +#define bSub_Tune 0xe00000
  112098. +#define bFrame_DC_Length 0xe000000
  112099. +#define bSBD_start_offset 0x30000000
  112100. +#define bFrame_TH_2 0x7
  112101. +#define bFrame_GI2_TH 0x38
  112102. +#define bGI2_Sync_en 0x40
  112103. +#define bSarch_Short_Early 0x300
  112104. +#define bSarch_Short_Late 0xc00
  112105. +#define bSarch_GI2_Late 0x70000
  112106. +#define bCFOAntSum 0x1
  112107. +#define bCFOAcc 0x2
  112108. +#define bCFOStartOffset 0xc
  112109. +#define bCFOLookBack 0x70
  112110. +#define bCFOSumWeight 0x80
  112111. +#define bDAGCEnable 0x10000
  112112. +#define bTXIQImb_A 0x3ff
  112113. +#define bTXIQImb_B 0xfc00
  112114. +#define bTXIQImb_C 0x3f0000
  112115. +#define bTXIQImb_D 0xffc00000
  112116. +#define bTxIDCOffset 0xff
  112117. +#define bTxQDCOffset 0xff00
  112118. +#define bTxDFIRMode 0x10000
  112119. +#define bTxPesudoNoiseOn 0x4000000
  112120. +#define bTxPesudoNoise_A 0xff
  112121. +#define bTxPesudoNoise_B 0xff00
  112122. +#define bTxPesudoNoise_C 0xff0000
  112123. +#define bTxPesudoNoise_D 0xff000000
  112124. +#define bCCADropOption 0x20000
  112125. +#define bCCADropThres 0xfff00000
  112126. +#define bEDCCA_H 0xf
  112127. +#define bEDCCA_L 0xf0
  112128. +#define bLambda_ED 0x300
  112129. +#define bRxInitialGain 0x7f
  112130. +#define bRxAntDivEn 0x80
  112131. +#define bRxAGCAddressForLNA 0x7f00
  112132. +#define bRxHighPowerFlow 0x8000
  112133. +#define bRxAGCFreezeThres 0xc0000
  112134. +#define bRxFreezeStep_AGC1 0x300000
  112135. +#define bRxFreezeStep_AGC2 0xc00000
  112136. +#define bRxFreezeStep_AGC3 0x3000000
  112137. +#define bRxFreezeStep_AGC0 0xc000000
  112138. +#define bRxRssi_Cmp_En 0x10000000
  112139. +#define bRxQuickAGCEn 0x20000000
  112140. +#define bRxAGCFreezeThresMode 0x40000000
  112141. +#define bRxOverFlowCheckType 0x80000000
  112142. +#define bRxAGCShift 0x7f
  112143. +#define bTRSW_Tri_Only 0x80
  112144. +#define bPowerThres 0x300
  112145. +#define bRxAGCEn 0x1
  112146. +#define bRxAGCTogetherEn 0x2
  112147. +#define bRxAGCMin 0x4
  112148. +#define bRxHP_Ini 0x7
  112149. +#define bRxHP_TRLNA 0x70
  112150. +#define bRxHP_RSSI 0x700
  112151. +#define bRxHP_BBP1 0x7000
  112152. +#define bRxHP_BBP2 0x70000
  112153. +#define bRxHP_BBP3 0x700000
  112154. +#define bRSSI_H 0x7f0000 //the threshold for high power
  112155. +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity
  112156. +#define bRxSettle_TRSW 0x7
  112157. +#define bRxSettle_LNA 0x38
  112158. +#define bRxSettle_RSSI 0x1c0
  112159. +#define bRxSettle_BBP 0xe00
  112160. +#define bRxSettle_RxHP 0x7000
  112161. +#define bRxSettle_AntSW_RSSI 0x38000
  112162. +#define bRxSettle_AntSW 0xc0000
  112163. +#define bRxProcessTime_DAGC 0x300000
  112164. +#define bRxSettle_HSSI 0x400000
  112165. +#define bRxProcessTime_BBPPW 0x800000
  112166. +#define bRxAntennaPowerShift 0x3000000
  112167. +#define bRSSITableSelect 0xc000000
  112168. +#define bRxHP_Final 0x7000000
  112169. +#define bRxHTSettle_BBP 0x7
  112170. +#define bRxHTSettle_HSSI 0x8
  112171. +#define bRxHTSettle_RxHP 0x70
  112172. +#define bRxHTSettle_BBPPW 0x80
  112173. +#define bRxHTSettle_Idle 0x300
  112174. +#define bRxHTSettle_Reserved 0x1c00
  112175. +#define bRxHTRxHPEn 0x8000
  112176. +#define bRxHTAGCFreezeThres 0x30000
  112177. +#define bRxHTAGCTogetherEn 0x40000
  112178. +#define bRxHTAGCMin 0x80000
  112179. +#define bRxHTAGCEn 0x100000
  112180. +#define bRxHTDAGCEn 0x200000
  112181. +#define bRxHTRxHP_BBP 0x1c00000
  112182. +#define bRxHTRxHP_Final 0xe0000000
  112183. +#define bRxPWRatioTH 0x3
  112184. +#define bRxPWRatioEn 0x4
  112185. +#define bRxMFHold 0x3800
  112186. +#define bRxPD_Delay_TH1 0x38
  112187. +#define bRxPD_Delay_TH2 0x1c0
  112188. +#define bRxPD_DC_COUNT_MAX 0x600
  112189. +//#define bRxMF_Hold 0x3800
  112190. +#define bRxPD_Delay_TH 0x8000
  112191. +#define bRxProcess_Delay 0xf0000
  112192. +#define bRxSearchrange_GI2_Early 0x700000
  112193. +#define bRxFrame_Guard_Counter_L 0x3800000
  112194. +#define bRxSGI_Guard_L 0xc000000
  112195. +#define bRxSGI_Search_L 0x30000000
  112196. +#define bRxSGI_TH 0xc0000000
  112197. +#define bDFSCnt0 0xff
  112198. +#define bDFSCnt1 0xff00
  112199. +#define bDFSFlag 0xf0000
  112200. +#define bMFWeightSum 0x300000
  112201. +#define bMinIdxTH 0x7f000000
  112202. +#define bDAFormat 0x40000
  112203. +#define bTxChEmuEnable 0x01000000
  112204. +#define bTRSWIsolation_A 0x7f
  112205. +#define bTRSWIsolation_B 0x7f00
  112206. +#define bTRSWIsolation_C 0x7f0000
  112207. +#define bTRSWIsolation_D 0x7f000000
  112208. +#define bExtLNAGain 0x7c00
  112209. +
  112210. +// 6. PageE(0xE00)
  112211. +#define bSTBCEn 0x4 // Useless
  112212. +#define bAntennaMapping 0x10
  112213. +#define bNss 0x20
  112214. +#define bCFOAntSumD 0x200
  112215. +#define bPHYCounterReset 0x8000000
  112216. +#define bCFOReportGet 0x4000000
  112217. +#define bOFDMContinueTx 0x10000000
  112218. +#define bOFDMSingleCarrier 0x20000000
  112219. +#define bOFDMSingleTone 0x40000000
  112220. +//#define bRxPath1 0x01
  112221. +//#define bRxPath2 0x02
  112222. +//#define bRxPath3 0x04
  112223. +//#define bRxPath4 0x08
  112224. +//#define bTxPath1 0x10
  112225. +//#define bTxPath2 0x20
  112226. +#define bHTDetect 0x100
  112227. +#define bCFOEn 0x10000
  112228. +#define bCFOValue 0xfff00000
  112229. +#define bSigTone_Re 0x3f
  112230. +#define bSigTone_Im 0x7f00
  112231. +#define bCounter_CCA 0xffff
  112232. +#define bCounter_ParityFail 0xffff0000
  112233. +#define bCounter_RateIllegal 0xffff
  112234. +#define bCounter_CRC8Fail 0xffff0000
  112235. +#define bCounter_MCSNoSupport 0xffff
  112236. +#define bCounter_FastSync 0xffff
  112237. +#define bShortCFO 0xfff
  112238. +#define bShortCFOTLength 12 //total
  112239. +#define bShortCFOFLength 11 //fraction
  112240. +#define bLongCFO 0x7ff
  112241. +#define bLongCFOTLength 11
  112242. +#define bLongCFOFLength 11
  112243. +#define bTailCFO 0x1fff
  112244. +#define bTailCFOTLength 13
  112245. +#define bTailCFOFLength 12
  112246. +#define bmax_en_pwdB 0xffff
  112247. +#define bCC_power_dB 0xffff0000
  112248. +#define bnoise_pwdB 0xffff
  112249. +#define bPowerMeasTLength 10
  112250. +#define bPowerMeasFLength 3
  112251. +#define bRx_HT_BW 0x1
  112252. +#define bRxSC 0x6
  112253. +#define bRx_HT 0x8
  112254. +#define bNB_intf_det_on 0x1
  112255. +#define bIntf_win_len_cfg 0x30
  112256. +#define bNB_Intf_TH_cfg 0x1c0
  112257. +#define bRFGain 0x3f
  112258. +#define bTableSel 0x40
  112259. +#define bTRSW 0x80
  112260. +#define bRxSNR_A 0xff
  112261. +#define bRxSNR_B 0xff00
  112262. +#define bRxSNR_C 0xff0000
  112263. +#define bRxSNR_D 0xff000000
  112264. +#define bSNREVMTLength 8
  112265. +#define bSNREVMFLength 1
  112266. +#define bCSI1st 0xff
  112267. +#define bCSI2nd 0xff00
  112268. +#define bRxEVM1st 0xff0000
  112269. +#define bRxEVM2nd 0xff000000
  112270. +#define bSIGEVM 0xff
  112271. +#define bPWDB 0xff00
  112272. +#define bSGIEN 0x10000
  112273. +
  112274. +#define bSFactorQAM1 0xf // Useless
  112275. +#define bSFactorQAM2 0xf0
  112276. +#define bSFactorQAM3 0xf00
  112277. +#define bSFactorQAM4 0xf000
  112278. +#define bSFactorQAM5 0xf0000
  112279. +#define bSFactorQAM6 0xf0000
  112280. +#define bSFactorQAM7 0xf00000
  112281. +#define bSFactorQAM8 0xf000000
  112282. +#define bSFactorQAM9 0xf0000000
  112283. +#define bCSIScheme 0x100000
  112284. +
  112285. +#define bNoiseLvlTopSet 0x3 // Useless
  112286. +#define bChSmooth 0x4
  112287. +#define bChSmoothCfg1 0x38
  112288. +#define bChSmoothCfg2 0x1c0
  112289. +#define bChSmoothCfg3 0xe00
  112290. +#define bChSmoothCfg4 0x7000
  112291. +#define bMRCMode 0x800000
  112292. +#define bTHEVMCfg 0x7000000
  112293. +
  112294. +#define bLoopFitType 0x1 // Useless
  112295. +#define bUpdCFO 0x40
  112296. +#define bUpdCFOOffData 0x80
  112297. +#define bAdvUpdCFO 0x100
  112298. +#define bAdvTimeCtrl 0x800
  112299. +#define bUpdClko 0x1000
  112300. +#define bFC 0x6000
  112301. +#define bTrackingMode 0x8000
  112302. +#define bPhCmpEnable 0x10000
  112303. +#define bUpdClkoLTF 0x20000
  112304. +#define bComChCFO 0x40000
  112305. +#define bCSIEstiMode 0x80000
  112306. +#define bAdvUpdEqz 0x100000
  112307. +#define bUChCfg 0x7000000
  112308. +#define bUpdEqz 0x8000000
  112309. +
  112310. +//Rx Pseduo noise
  112311. +#define bRxPesudoNoiseOn 0x20000000 // Useless
  112312. +#define bRxPesudoNoise_A 0xff
  112313. +#define bRxPesudoNoise_B 0xff00
  112314. +#define bRxPesudoNoise_C 0xff0000
  112315. +#define bRxPesudoNoise_D 0xff000000
  112316. +#define bPesudoNoiseState_A 0xffff
  112317. +#define bPesudoNoiseState_B 0xffff0000
  112318. +#define bPesudoNoiseState_C 0xffff
  112319. +#define bPesudoNoiseState_D 0xffff0000
  112320. +
  112321. +//7. RF Register
  112322. +//Zebra1
  112323. +#define bZebra1_HSSIEnable 0x8 // Useless
  112324. +#define bZebra1_TRxControl 0xc00
  112325. +#define bZebra1_TRxGainSetting 0x07f
  112326. +#define bZebra1_RxCorner 0xc00
  112327. +#define bZebra1_TxChargePump 0x38
  112328. +#define bZebra1_RxChargePump 0x7
  112329. +#define bZebra1_ChannelNum 0xf80
  112330. +#define bZebra1_TxLPFBW 0x400
  112331. +#define bZebra1_RxLPFBW 0x600
  112332. +
  112333. +//Zebra4
  112334. +#define bRTL8256RegModeCtrl1 0x100 // Useless
  112335. +#define bRTL8256RegModeCtrl0 0x40
  112336. +#define bRTL8256_TxLPFBW 0x18
  112337. +#define bRTL8256_RxLPFBW 0x600
  112338. +
  112339. +//RTL8258
  112340. +#define bRTL8258_TxLPFBW 0xc // Useless
  112341. +#define bRTL8258_RxLPFBW 0xc00
  112342. +#define bRTL8258_RSSILPFBW 0xc0
  112343. +
  112344. +
  112345. +//
  112346. +// Other Definition
  112347. +//
  112348. +
  112349. +//byte endable for sb_write
  112350. +#define bByte0 0x1 // Useless
  112351. +#define bByte1 0x2
  112352. +#define bByte2 0x4
  112353. +#define bByte3 0x8
  112354. +#define bWord0 0x3
  112355. +#define bWord1 0xc
  112356. +#define bDWord 0xf
  112357. +
  112358. +//for PutRegsetting & GetRegSetting BitMask
  112359. +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f
  112360. +#define bMaskByte1 0xff00
  112361. +#define bMaskByte2 0xff0000
  112362. +#define bMaskByte3 0xff000000
  112363. +#define bMaskHWord 0xffff0000
  112364. +#define bMaskLWord 0x0000ffff
  112365. +#define bMaskDWord 0xffffffff
  112366. +#define bMask12Bits 0xfff
  112367. +#define bMaskH4Bits 0xf0000000
  112368. +#define bMaskOFDM_D 0xffc00000
  112369. +#define bMaskCCK 0x3f3f3f3f
  112370. +
  112371. +//for PutRFRegsetting & GetRFRegSetting BitMask
  112372. +//#define bMask12Bits 0xfffff // RF Reg mask bits
  112373. +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF
  112374. +#define bRFRegOffsetMask 0xfffff
  112375. +//#define bRFRegOffsetMask 0xfff
  112376. +
  112377. +//MAC0 will wirte PHY1
  112378. +#define MAC0_ACCESS_PHY1 0x4000
  112379. +//MAC1 will wirte PHY0
  112380. +#define MAC1_ACCESS_PHY0 0x2000
  112381. +
  112382. +#define bEnable 0x1 // Useless
  112383. +#define bDisable 0x0
  112384. +
  112385. +#define LeftAntenna 0x0 // Useless
  112386. +#define RightAntenna 0x1
  112387. +
  112388. +#define tCheckTxStatus 500 //500ms // Useless
  112389. +#define tUpdateRxCounter 100 //100ms
  112390. +
  112391. +#define rateCCK 0 // Useless
  112392. +#define rateOFDM 1
  112393. +#define rateHT 2
  112394. +
  112395. +//define Register-End
  112396. +#define bPMAC_End 0x1ff // Useless
  112397. +#define bFPGAPHY0_End 0x8ff
  112398. +#define bFPGAPHY1_End 0x9ff
  112399. +#define bCCKPHY0_End 0xaff
  112400. +#define bOFDMPHY0_End 0xcff
  112401. +#define bOFDMPHY1_End 0xdff
  112402. +
  112403. +//define max debug item in each debug page
  112404. +//#define bMaxItem_FPGA_PHY0 0x9
  112405. +//#define bMaxItem_FPGA_PHY1 0x3
  112406. +//#define bMaxItem_PHY_11B 0x16
  112407. +//#define bMaxItem_OFDM_PHY0 0x29
  112408. +//#define bMaxItem_OFDM_PHY1 0x0
  112409. +
  112410. +#define bPMACControl 0x0 // Useless
  112411. +#define bWMACControl 0x1
  112412. +#define bWNICControl 0x2
  112413. +
  112414. +#define PathA 0x0 // Useless
  112415. +#define PathB 0x1
  112416. +#define PathC 0x2
  112417. +#define PathD 0x3
  112418. +
  112419. +/*--------------------------Define Parameters-------------------------------*/
  112420. +
  112421. +
  112422. +#endif //__INC_HAL8192SPHYREG_H
  112423. --- /dev/null
  112424. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h
  112425. @@ -0,0 +1,66 @@
  112426. +/******************************************************************************
  112427. + *
  112428. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  112429. + *
  112430. + * This program is free software; you can redistribute it and/or modify it
  112431. + * under the terms of version 2 of the GNU General Public License as
  112432. + * published by the Free Software Foundation.
  112433. + *
  112434. + * This program is distributed in the hope that it will be useful, but WITHOUT
  112435. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  112436. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  112437. + * more details.
  112438. + *
  112439. + * You should have received a copy of the GNU General Public License along with
  112440. + * this program; if not, write to the Free Software Foundation, Inc.,
  112441. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  112442. + *
  112443. + *
  112444. + ******************************************************************************/
  112445. +#ifndef __INC_HAL8192DU_FW_IMG_H
  112446. +#define __INC_HAL8192DU_FW_IMG_H
  112447. +
  112448. +#include <basic_types.h>
  112449. +
  112450. +/*Created on 2011/11/11, 8: 8*/
  112451. +
  112452. +#define Rtl8192DUImgArrayLength 31452
  112453. +extern const u8 Rtl8192DUFwImgArray[Rtl8192DUImgArrayLength];
  112454. +#define Rtl8192DUMainArrayLength 1
  112455. +extern const u8 Rtl8192DUFwMainArray[Rtl8192DUMainArrayLength];
  112456. +#define Rtl8192DUDataArrayLength 1
  112457. +extern const u8 Rtl8192DUFwDataArray[Rtl8192DUDataArrayLength];
  112458. +#define Rtl8192DUPHY_REG_2TArrayLength 372
  112459. +extern const u32 Rtl8192DUPHY_REG_2TArray[Rtl8192DUPHY_REG_2TArrayLength];
  112460. +#define Rtl8192DUPHY_REG_1TArrayLength 1
  112461. +extern const u32 Rtl8192DUPHY_REG_1TArray[Rtl8192DUPHY_REG_1TArrayLength];
  112462. +#define Rtl8192DUPHY_REG_Array_PGLength 624
  112463. +extern const u32 Rtl8192DUPHY_REG_Array_PG[Rtl8192DUPHY_REG_Array_PGLength];
  112464. +#define Rtl8192DUPHY_REG_Array_MPLength 14
  112465. +extern const u32 Rtl8192DUPHY_REG_Array_MP[Rtl8192DUPHY_REG_Array_MPLength];
  112466. +#define Rtl8192DURadioA_2TArrayLength 378
  112467. +extern const u32 Rtl8192DURadioA_2TArray[Rtl8192DURadioA_2TArrayLength];
  112468. +#define Rtl8192DURadioB_2TArrayLength 384
  112469. +extern const u32 Rtl8192DURadioB_2TArray[Rtl8192DURadioB_2TArrayLength];
  112470. +#define Rtl8192DURadioA_1TArrayLength 1
  112471. +extern const u32 Rtl8192DURadioA_1TArray[Rtl8192DURadioA_1TArrayLength];
  112472. +#define Rtl8192DURadioB_1TArrayLength 1
  112473. +extern const u32 Rtl8192DURadioB_1TArray[Rtl8192DURadioB_1TArrayLength];
  112474. +#define Rtl8192DURadioA_2T_intPAArrayLength 378
  112475. +extern const u32 Rtl8192DURadioA_2T_intPAArray[Rtl8192DURadioA_2T_intPAArrayLength];
  112476. +#define Rtl8192DURadioB_2T_intPAArrayLength 384
  112477. +extern const u32 Rtl8192DURadioB_2T_intPAArray[Rtl8192DURadioB_2T_intPAArrayLength];
  112478. +#define Rtl8192DUMAC_2T_ArrayLength 192
  112479. +extern const u32 Rtl8192DUMAC_2T_Array[Rtl8192DUMAC_2T_ArrayLength];
  112480. +#define Rtl8192DUAGCTAB_ArrayLength 386
  112481. +extern const u32 Rtl8192DUAGCTAB_Array[Rtl8192DUAGCTAB_ArrayLength];
  112482. +#define Rtl8192DUAGCTAB_5GArrayLength 194
  112483. +extern const u32 Rtl8192DUAGCTAB_5GArray[Rtl8192DUAGCTAB_5GArrayLength];
  112484. +#define Rtl8192DUAGCTAB_2GArrayLength 194
  112485. +extern const u32 Rtl8192DUAGCTAB_2GArray[Rtl8192DUAGCTAB_2GArrayLength];
  112486. +#define Rtl8192DUAGCTAB_2TArrayLength 1
  112487. +extern const u32 Rtl8192DUAGCTAB_2TArray[Rtl8192DUAGCTAB_2TArrayLength];
  112488. +#define Rtl8192DUAGCTAB_1TArrayLength 1
  112489. +extern const u32 Rtl8192DUAGCTAB_1TArray[Rtl8192DUAGCTAB_1TArrayLength];
  112490. +
  112491. +#endif //__INC_HAL8192CU_FW_IMG_H
  112492. --- /dev/null
  112493. +++ b/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h
  112494. @@ -0,0 +1,29 @@
  112495. +/******************************************************************************
  112496. + *
  112497. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  112498. + *
  112499. + * This program is free software; you can redistribute it and/or modify it
  112500. + * under the terms of version 2 of the GNU General Public License as
  112501. + * published by the Free Software Foundation.
  112502. + *
  112503. + * This program is distributed in the hope that it will be useful, but WITHOUT
  112504. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  112505. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  112506. + * more details.
  112507. + *
  112508. + * You should have received a copy of the GNU General Public License along with
  112509. + * this program; if not, write to the Free Software Foundation, Inc.,
  112510. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  112511. + *
  112512. + *
  112513. + ******************************************************************************/
  112514. +#ifndef __INC_HAL8192DU_FW_IMG_WOWLAN_H
  112515. +#define __INC_HAL8192DU_FW_IMG_WOWLAN_H
  112516. +
  112517. +/*Created on 2011/11/ 8, 14:15*/
  112518. +
  112519. +
  112520. +#define DUWWImgArrayLength 24818
  112521. +extern u8 Rtl8192DUFwWWImgArray[DUWWImgArrayLength];
  112522. +
  112523. +#endif //__INC_HAL8192DU_FW_IMG_WOWLAN_H
  112524. --- /dev/null
  112525. +++ b/drivers/net/wireless/rtl8192cu/include/HalPwrSeqCmd.h
  112526. @@ -0,0 +1,137 @@
  112527. +/******************************************************************************
  112528. + *
  112529. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  112530. + *
  112531. + * This program is free software; you can redistribute it and/or modify it
  112532. + * under the terms of version 2 of the GNU General Public License as
  112533. + * published by the Free Software Foundation.
  112534. + *
  112535. + * This program is distributed in the hope that it will be useful, but WITHOUT
  112536. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  112537. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  112538. + * more details.
  112539. + *
  112540. + * You should have received a copy of the GNU General Public License along with
  112541. + * this program; if not, write to the Free Software Foundation, Inc.,
  112542. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  112543. + *
  112544. + *
  112545. + ******************************************************************************/
  112546. +#ifndef __HALPWRSEQCMD_H__
  112547. +#define __HALPWRSEQCMD_H__
  112548. +
  112549. +#include <drv_types.h>
  112550. +
  112551. +/*---------------------------------------------*/
  112552. +//3 The value of cmd: 4 bits
  112553. +/*---------------------------------------------*/
  112554. +#define PWR_CMD_READ 0x00
  112555. + // offset: the read register offset
  112556. + // msk: the mask of the read value
  112557. + // value: N/A, left by 0
  112558. + // note: dirver shall implement this function by read & msk
  112559. +
  112560. +#define PWR_CMD_WRITE 0x01
  112561. + // offset: the read register offset
  112562. + // msk: the mask of the write bits
  112563. + // value: write value
  112564. + // note: driver shall implement this cmd by read & msk after write
  112565. +
  112566. +#define PWR_CMD_POLLING 0x02
  112567. + // offset: the read register offset
  112568. + // msk: the mask of the polled value
  112569. + // value: the value to be polled, masked by the msd field.
  112570. + // note: driver shall implement this cmd by
  112571. + // do{
  112572. + // if( (Read(offset) & msk) == (value & msk) )
  112573. + // break;
  112574. + // } while(not timeout);
  112575. +
  112576. +#define PWR_CMD_DELAY 0x03
  112577. + // offset: the value to delay
  112578. + // msk: N/A
  112579. + // value: the unit of delay, 0: us, 1: ms
  112580. +
  112581. +#define PWR_CMD_END 0x04
  112582. + // offset: N/A
  112583. + // msk: N/A
  112584. + // value: N/A
  112585. +
  112586. +/*---------------------------------------------*/
  112587. +//3 The value of base: 4 bits
  112588. +/*---------------------------------------------*/
  112589. + // define the base address of each block
  112590. +#define PWR_BASEADDR_MAC 0x00
  112591. +#define PWR_BASEADDR_USB 0x01
  112592. +#define PWR_BASEADDR_PCIE 0x02
  112593. +#define PWR_BASEADDR_SDIO 0x03
  112594. +
  112595. +/*---------------------------------------------*/
  112596. +//3 The value of interface_msk: 4 bits
  112597. +/*---------------------------------------------*/
  112598. +#define PWR_INTF_SDIO_MSK BIT(0)
  112599. +#define PWR_INTF_USB_MSK BIT(1)
  112600. +#define PWR_INTF_PCI_MSK BIT(2)
  112601. +#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
  112602. +
  112603. +/*---------------------------------------------*/
  112604. +//3 The value of fab_msk: 4 bits
  112605. +/*---------------------------------------------*/
  112606. +#define PWR_FAB_TSMC_MSK BIT(0)
  112607. +#define PWR_FAB_UMC_MSK BIT(1)
  112608. +#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
  112609. +
  112610. +/*---------------------------------------------*/
  112611. +//3 The value of cut_msk: 8 bits
  112612. +/*---------------------------------------------*/
  112613. +#define PWR_CUT_TESTCHIP_MSK BIT(0)
  112614. +#define PWR_CUT_A_MSK BIT(1)
  112615. +#define PWR_CUT_B_MSK BIT(2)
  112616. +#define PWR_CUT_C_MSK BIT(3)
  112617. +#define PWR_CUT_D_MSK BIT(4)
  112618. +#define PWR_CUT_E_MSK BIT(5)
  112619. +#define PWR_CUT_F_MSK BIT(6)
  112620. +#define PWR_CUT_G_MSK BIT(7)
  112621. +#define PWR_CUT_ALL_MSK 0xFF
  112622. +
  112623. +
  112624. +typedef enum _PWRSEQ_CMD_DELAY_UNIT_
  112625. +{
  112626. + PWRSEQ_DELAY_US,
  112627. + PWRSEQ_DELAY_MS,
  112628. +} PWRSEQ_DELAY_UNIT;
  112629. +
  112630. +typedef struct _WL_PWR_CFG_
  112631. +{
  112632. + u16 offset;
  112633. + u8 cut_msk;
  112634. + u8 fab_msk:4;
  112635. + u8 interface_msk:4;
  112636. + u8 base:4;
  112637. + u8 cmd:4;
  112638. + u8 msk;
  112639. + u8 value;
  112640. +} WLAN_PWR_CFG, *PWLAN_PWR_CFG;
  112641. +
  112642. +
  112643. +#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset
  112644. +#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk
  112645. +#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk
  112646. +#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk
  112647. +#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base
  112648. +#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd
  112649. +#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk
  112650. +#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value
  112651. +
  112652. +
  112653. +//================================================================================
  112654. +// Prototype of protected function.
  112655. +//================================================================================
  112656. +u8 HalPwrSeqCmdParsing(
  112657. + PADAPTER padapter,
  112658. + u8 CutVersion,
  112659. + u8 FabVersion,
  112660. + u8 InterfaceType,
  112661. + WLAN_PWR_CFG PwrCfgCmd[]);
  112662. +
  112663. +#endif
  112664. --- /dev/null
  112665. +++ b/drivers/net/wireless/rtl8192cu/include/autoconf.h
  112666. @@ -0,0 +1,336 @@
  112667. +/******************************************************************************
  112668. + *
  112669. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  112670. + *
  112671. + * This program is free software; you can redistribute it and/or modify it
  112672. + * under the terms of version 2 of the GNU General Public License as
  112673. + * published by the Free Software Foundation.
  112674. + *
  112675. + * This program is distributed in the hope that it will be useful, but WITHOUT
  112676. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  112677. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  112678. + * more details.
  112679. + *
  112680. + * You should have received a copy of the GNU General Public License along with
  112681. + * this program; if not, write to the Free Software Foundation, Inc.,
  112682. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  112683. + *
  112684. + *
  112685. + ******************************************************************************/
  112686. +
  112687. +/*
  112688. + * Public General Config
  112689. + */
  112690. +#define AUTOCONF_INCLUDED
  112691. +#define RTL871X_MODULE_NAME "92CU"
  112692. +#define DRV_NAME "rtl8192cu"
  112693. +
  112694. +#define CONFIG_USB_HCI 1
  112695. +
  112696. +#define CONFIG_RTL8192C 1
  112697. +
  112698. +#define PLATFORM_LINUX 1
  112699. +
  112700. +//#define CONFIG_IOCTL_CFG80211 1
  112701. +#ifdef CONFIG_IOCTL_CFG80211
  112702. + //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */
  112703. + #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
  112704. + //#define CONFIG_DEBUG_CFG80211 1
  112705. + //#define CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2
  112706. + #define CONFIG_SET_SCAN_DENY_TIMER
  112707. +#endif
  112708. +
  112709. +/*
  112710. + * Internal General Config
  112711. + */
  112712. +//#define CONFIG_PWRCTRL
  112713. +//#define CONFIG_H2CLBK
  112714. +
  112715. +#define CONFIG_EMBEDDED_FWIMG 1
  112716. +//#define CONFIG_FILE_FWIMG
  112717. +
  112718. +#ifdef CONFIG_WAKE_ON_WLAN
  112719. +#define CONFIG_WOWLAN 1
  112720. +#endif //CONFIG_WAKE_ON_WLAN
  112721. +
  112722. +#define CONFIG_R871X_TEST 1
  112723. +
  112724. +#define CONFIG_XMIT_ACK
  112725. +#ifdef CONFIG_XMIT_ACK
  112726. + #define CONFIG_XMIT_ACK_POLLING
  112727. + #define CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  112728. +#endif
  112729. +
  112730. +#define CONFIG_80211N_HT 1
  112731. +
  112732. +#define CONFIG_RECV_REORDERING_CTRL 1
  112733. +
  112734. +//#define CONFIG_TCP_CSUM_OFFLOAD_RX 1
  112735. +
  112736. +//#define CONFIG_BEFORE_LINKED_DIG
  112737. +//#define CONFIG_DRVEXT_MODULE 1
  112738. +
  112739. +#ifndef CONFIG_MP_INCLUDED
  112740. + #define CONFIG_IPS 1
  112741. + #ifdef CONFIG_IPS
  112742. + //#define CONFIG_IPS_LEVEL_2 1 //enable this to set default IPS mode to IPS_LEVEL_2
  112743. + #endif
  112744. +
  112745. + #define SUPPORT_HW_RFOFF_DETECTED 1
  112746. +
  112747. + #define CONFIG_LPS 1
  112748. + #define CONFIG_BT_COEXIST 1
  112749. +
  112750. + //befor link
  112751. + #define CONFIG_ANTENNA_DIVERSITY
  112752. +
  112753. + //after link
  112754. + #ifdef CONFIG_ANTENNA_DIVERSITY
  112755. + #define CONFIG_SW_ANTENNA_DIVERSITY
  112756. + //#define CONFIG_HW_ANTENNA_DIVERSITY
  112757. + #endif
  112758. +
  112759. + #define CONFIG_IOL
  112760. +#else //#ifndef CONFIG_MP_INCLUDED
  112761. + #define CONFIG_MP_IWPRIV_SUPPORT 1
  112762. +#endif //#ifndef CONFIG_MP_INCLUDED
  112763. +
  112764. +#define CONFIG_AP_MODE 1
  112765. +#ifdef CONFIG_AP_MODE
  112766. + #define CONFIG_NATIVEAP_MLME 1
  112767. + #ifndef CONFIG_NATIVEAP_MLME
  112768. + #define CONFIG_HOSTAPD_MLME 1
  112769. + #endif
  112770. + #define CONFIG_FIND_BEST_CHANNEL 1
  112771. + //#define CONFIG_NO_WIRELESS_HANDLERS 1
  112772. +#endif
  112773. +
  112774. +// Added by Albert 20110314
  112775. +#define CONFIG_P2P 1
  112776. +#ifdef CONFIG_P2P
  112777. + //Added by Albert 20110812
  112778. + //The CONFIG_WFD is for supporting the Wi-Fi display
  112779. + #define CONFIG_WFD
  112780. +
  112781. + #ifndef CONFIG_WIFI_TEST
  112782. + #define CONFIG_P2P_REMOVE_GROUP_INFO
  112783. + #endif
  112784. + //#define CONFIG_DBG_P2P
  112785. +
  112786. + //#define CONFIG_P2P_PS
  112787. + //#define CONFIG_P2P_IPS
  112788. +
  112789. + #define P2P_OP_CHECK_SOCIAL_CH
  112790. + // Added comment by Borg 2013/06/21
  112791. + // Issue: Nexus 4 is hard to do miracast.
  112792. + // Root Cause: After group formation,
  112793. + // Nexus 4 is possible to be not at OP channel of Invitation Resp/Nego Confirm but at social channel.
  112794. + // Patch: While scan OP channel,
  112795. + // not only scan OP channel of Invitation Resp/Nego Confirm,
  112796. + // but also scan social channel(1, 6, 11)
  112797. +#endif
  112798. +
  112799. +// Added by Kurt 20110511
  112800. +//#define CONFIG_TDLS 1
  112801. +#ifdef CONFIG_TDLS
  112802. +// #ifndef CONFIG_WFD
  112803. +// #define CONFIG_WFD 1
  112804. +// #endif
  112805. +// #define CONFIG_TDLS_AUTOSETUP 1
  112806. +// #define CONFIG_TDLS_AUTOCHECKALIVE 1
  112807. +#endif
  112808. +
  112809. +#define CONFIG_SKB_COPY 1//for amsdu
  112810. +
  112811. +#define CONFIG_LED
  112812. +#ifdef CONFIG_LED
  112813. + #define CONFIG_SW_LED
  112814. + #ifdef CONFIG_SW_LED
  112815. + //#define CONFIG_LED_HANDLED_BY_CMD_THREAD
  112816. + #endif
  112817. +#endif // CONFIG_LED
  112818. +
  112819. +
  112820. +
  112821. +#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface
  112822. +#define CONFIG_GLOBAL_UI_PID
  112823. +
  112824. +#define CONFIG_LAYER2_ROAMING
  112825. +#define CONFIG_LAYER2_ROAMING_RESUME
  112826. +//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general...
  112827. +//#define CONFIG_RESUME_IN_WORKQUEUE
  112828. +//#define CONFIG_SET_SCAN_DENY_TIMER
  112829. +#define CONFIG_LONG_DELAY_ISSUE
  112830. +#define CONFIG_NEW_SIGNAL_STAT_PROCESS
  112831. +//#define CONFIG_SIGNAL_DISPLAY_DBM //display RX signal with dbm
  112832. +#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable */
  112833. +#define CONFIG_DEAUTH_BEFORE_CONNECT
  112834. +
  112835. +#ifdef CONFIG_IOL
  112836. + #define CONFIG_IOL_LLT
  112837. + #define CONFIG_IOL_MAC
  112838. + #define CONFIG_IOL_BB_PHY_REG
  112839. + #define CONFIG_IOL_BB_AGC_TAB
  112840. + #define CONFIG_IOL_RF_RF90_PATH_A
  112841. + #define CONFIG_IOL_RF_RF90_PATH_B
  112842. +#endif
  112843. +
  112844. +#define CONFIG_BR_EXT 1 // Enable NAT2.5 support for STA mode interface with a L2 Bridge
  112845. +#ifdef CONFIG_BR_EXT
  112846. +#define CONFIG_BR_EXT_BRNAME "br0"
  112847. +#endif // CONFIG_BR_EXT
  112848. +
  112849. +#define CONFIG_TX_MCAST2UNI 1 // Support IP multicast->unicast
  112850. +//#define CONFIG_DM_ADAPTIVITY
  112851. +//#define CONFIG_CHECK_AC_LIFETIME 1 // Check packet lifetime of 4 ACs.
  112852. +
  112853. +//#define CONFIG_CONCURRENT_MODE 1
  112854. +#ifdef CONFIG_CONCURRENT_MODE
  112855. + #define CONFIG_TSF_RESET_OFFLOAD 1 // For 2 PORT TSF SYNC.
  112856. + //#define CONFIG_HWPORT_SWAP //Port0->Sec , Port1 -> Pri
  112857. + //#define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  112858. + //#define CONFIG_MULTI_VIR_IFACES //besides primary&secondary interfaces, extend to support more interfaces
  112859. +#endif // CONFIG_CONCURRENT_MODE
  112860. +
  112861. +#define CONFIG_80211D
  112862. +
  112863. +/*
  112864. + * Interface Related Config
  112865. + */
  112866. +
  112867. +//#define CONFIG_USB_ONE_OUT_EP
  112868. +//#define CONFIG_USB_INTERRUPT_IN_PIPE 1
  112869. +
  112870. +#ifndef CONFIG_MINIMAL_MEMORY_USAGE
  112871. + #define CONFIG_USB_TX_AGGREGATION 1
  112872. + #define CONFIG_USB_RX_AGGREGATION 1
  112873. +#endif
  112874. +
  112875. +#define CONFIG_PREALLOC_RECV_SKB 1
  112876. +//#define CONFIG_REDUCE_USB_TX_INT 1 // Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms.
  112877. +//#define CONFIG_EASY_REPLACEMENT 1
  112878. +
  112879. +/*
  112880. + * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now!
  112881. + */
  112882. +//#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1 // Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms.
  112883. +//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1 // For RX path
  112884. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  112885. +#undef CONFIG_PREALLOC_RECV_SKB
  112886. +#endif
  112887. +
  112888. +/*
  112889. + * USB VENDOR REQ BUFFER ALLOCATION METHOD
  112890. + * if not set we'll use function local variable (stack memory)
  112891. + */
  112892. +//#define CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
  112893. +#define CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
  112894. +
  112895. +#define CONFIG_USB_VENDOR_REQ_MUTEX
  112896. +#define CONFIG_VENDOR_REQ_RETRY
  112897. +
  112898. +//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1
  112899. +
  112900. +
  112901. +/*
  112902. + * HAL Related Config
  112903. + */
  112904. +
  112905. +#define RTL8192C_RX_PACKET_NO_INCLUDE_CRC 1
  112906. +
  112907. +#define SUPPORTED_BLOCK_IO
  112908. +
  112909. +
  112910. +
  112911. +#define RTL8192CU_FW_DOWNLOAD_ENABLE 1
  112912. +
  112913. +#define CONFIG_ONLY_ONE_OUT_EP_TO_LOW 0
  112914. +
  112915. +#define CONFIG_OUT_EP_WIFI_MODE 0
  112916. +
  112917. +#define ENABLE_USB_DROP_INCORRECT_OUT 0
  112918. +
  112919. +#define RTL8192CU_ASIC_VERIFICATION 0 // For ASIC verification.
  112920. +
  112921. +#define RTL8192CU_ADHOC_WORKAROUND_SETTING 1
  112922. +
  112923. +#define DISABLE_BB_RF 0
  112924. +
  112925. +#define RTL8191C_FPGA_NETWORKTYPE_ADHOC 0
  112926. +
  112927. +#ifdef CONFIG_MP_INCLUDED
  112928. + #define MP_DRIVER 1
  112929. + #undef CONFIG_USB_TX_AGGREGATION
  112930. + #undef CONFIG_USB_RX_AGGREGATION
  112931. +#else
  112932. + #define MP_DRIVER 0
  112933. +#endif
  112934. +
  112935. +
  112936. +/*
  112937. + * Platform Related Config
  112938. + */
  112939. +#ifdef CONFIG_PLATFORM_MN10300
  112940. +#define CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
  112941. +
  112942. +#if defined (CONFIG_SW_ANTENNA_DIVERSITY)
  112943. + #undef CONFIG_SW_ANTENNA_DIVERSITY
  112944. + #define CONFIG_HW_ANTENNA_DIVERSITY
  112945. +#endif
  112946. +
  112947. +#endif
  112948. +
  112949. +#ifdef CONFIG_WISTRON_PLATFORM
  112950. +
  112951. +#endif
  112952. +
  112953. +#ifdef CONFIG_PLATFORM_TI_DM365
  112954. +#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1
  112955. +#endif
  112956. +
  112957. +#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR
  112958. +
  112959. +/*
  112960. + * Debug Related Config
  112961. + */
  112962. +//#define CONFIG_DEBUG_RTL871X
  112963. +
  112964. +#define DBG 0
  112965. +//#define CONFIG_DEBUG_RTL819X
  112966. +
  112967. +//#define CONFIG_PROC_DEBUG 1
  112968. +
  112969. +//#define DBG_IO
  112970. +//#define DBG_DELAY_OS
  112971. +//#define DBG_MEM_ALLOC
  112972. +//#define DBG_IOCTL
  112973. +
  112974. +//#define DBG_TX
  112975. +//#define DBG_XMIT_BUF
  112976. +//#define DBG_TX_DROP_FRAME
  112977. +
  112978. +//#define DBG_RX_DROP_FRAME
  112979. +//#define DBG_RX_SEQ
  112980. +//#define DBG_RX_SIGNAL_DISPLAY_PROCESSING
  112981. +//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED "jeff-ap"
  112982. +
  112983. +//#define DBG_EXPIRATION_CHK
  112984. +
  112985. +
  112986. +//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
  112987. +//#define DBG_ROAMING_TEST
  112988. +
  112989. +//#define DBG_HAL_INIT_PROFILING
  112990. +
  112991. +//#define DBG_MEMORY_LEAK 1
  112992. +
  112993. +#define DBG_CONFIG_ERROR_DETECT
  112994. +//#define DBG_CONFIG_ERROR_RESET
  112995. +
  112996. +//TX use 1 urb
  112997. +//#define CONFIG_SINGLE_XMIT_BUF
  112998. +//RX use 1 urb
  112999. +//#define CONFIG_SINGLE_RECV_BUF
  113000. +
  113001. +//turn off power tracking when traffic is busy
  113002. +//#define CONFIG_BUSY_TRAFFIC_SKIP_PWR_TRACK
  113003. --- /dev/null
  113004. +++ b/drivers/net/wireless/rtl8192cu/include/basic_types.h
  113005. @@ -0,0 +1,320 @@
  113006. +/******************************************************************************
  113007. + *
  113008. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113009. + *
  113010. + * This program is free software; you can redistribute it and/or modify it
  113011. + * under the terms of version 2 of the GNU General Public License as
  113012. + * published by the Free Software Foundation.
  113013. + *
  113014. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113015. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113016. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113017. + * more details.
  113018. + *
  113019. + * You should have received a copy of the GNU General Public License along with
  113020. + * this program; if not, write to the Free Software Foundation, Inc.,
  113021. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113022. + *
  113023. + *
  113024. + ******************************************************************************/
  113025. +#ifndef __BASIC_TYPES_H__
  113026. +#define __BASIC_TYPES_H__
  113027. +
  113028. +#include <drv_conf.h>
  113029. +
  113030. +
  113031. +#define SUCCESS 0
  113032. +#define FAIL (-1)
  113033. +
  113034. +#ifndef TRUE
  113035. + #define _TRUE 1
  113036. +#else
  113037. + #define _TRUE TRUE
  113038. +#endif
  113039. +
  113040. +#ifndef FALSE
  113041. + #define _FALSE 0
  113042. +#else
  113043. + #define _FALSE FALSE
  113044. +#endif
  113045. +
  113046. +#ifdef PLATFORM_WINDOWS
  113047. +
  113048. + typedef signed char s8;
  113049. + typedef unsigned char u8;
  113050. +
  113051. + typedef signed short s16;
  113052. + typedef unsigned short u16;
  113053. +
  113054. + typedef signed long s32;
  113055. + typedef unsigned long u32;
  113056. +
  113057. + typedef unsigned int uint;
  113058. + typedef signed int sint;
  113059. +
  113060. +
  113061. + typedef signed long long s64;
  113062. + typedef unsigned long long u64;
  113063. +
  113064. + #ifdef NDIS50_MINIPORT
  113065. +
  113066. + #define NDIS_MAJOR_VERSION 5
  113067. + #define NDIS_MINOR_VERSION 0
  113068. +
  113069. + #endif
  113070. +
  113071. + #ifdef NDIS51_MINIPORT
  113072. +
  113073. + #define NDIS_MAJOR_VERSION 5
  113074. + #define NDIS_MINOR_VERSION 1
  113075. +
  113076. + #endif
  113077. +
  113078. + typedef NDIS_PROC proc_t;
  113079. +
  113080. + typedef LONG atomic_t;
  113081. +
  113082. +#endif
  113083. +
  113084. +
  113085. +#ifdef PLATFORM_LINUX
  113086. +
  113087. + #include <linux/types.h>
  113088. + #define IN
  113089. + #define OUT
  113090. + #define VOID void
  113091. + #define NDIS_OID uint
  113092. + #define NDIS_STATUS uint
  113093. +
  113094. + typedef signed int sint;
  113095. +
  113096. + #ifndef PVOID
  113097. + typedef void * PVOID;
  113098. + //#define PVOID (void *)
  113099. + #endif
  113100. +
  113101. + #define UCHAR u8
  113102. + #define USHORT u16
  113103. + #define UINT u32
  113104. + #define ULONG u32
  113105. +
  113106. + typedef void (*proc_t)(void*);
  113107. +
  113108. + typedef __kernel_size_t SIZE_T;
  113109. + typedef __kernel_ssize_t SSIZE_T;
  113110. + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field)
  113111. +
  113112. +#endif
  113113. +
  113114. +
  113115. +#ifdef PLATFORM_FREEBSD
  113116. +
  113117. + typedef signed char s8;
  113118. + typedef unsigned char u8;
  113119. +
  113120. + typedef signed short s16;
  113121. + typedef unsigned short u16;
  113122. +
  113123. + typedef signed int s32;
  113124. + typedef unsigned int u32;
  113125. +
  113126. + typedef unsigned int uint;
  113127. + typedef signed int sint;
  113128. + typedef long atomic_t;
  113129. +
  113130. + typedef signed long long s64;
  113131. + typedef unsigned long long u64;
  113132. + #define IN
  113133. + #define OUT
  113134. + #define VOID void
  113135. + #define NDIS_OID uint
  113136. + #define NDIS_STATUS uint
  113137. +
  113138. + #ifndef PVOID
  113139. + typedef void * PVOID;
  113140. + //#define PVOID (void *)
  113141. + #endif
  113142. + typedef u32 dma_addr_t;
  113143. + #define UCHAR u8
  113144. + #define USHORT u16
  113145. + #define UINT u32
  113146. + #define ULONG u32
  113147. +
  113148. + typedef void (*proc_t)(void*);
  113149. +
  113150. + typedef unsigned int __kernel_size_t;
  113151. + typedef int __kernel_ssize_t;
  113152. +
  113153. + typedef __kernel_size_t SIZE_T;
  113154. + typedef __kernel_ssize_t SSIZE_T;
  113155. + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field)
  113156. +
  113157. +#endif
  113158. +
  113159. +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T))
  113160. +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1)
  113161. +
  113162. +#define SIZE_PTR SIZE_T
  113163. +#define SSIZE_PTR SSIZE_T
  113164. +
  113165. +//port from fw by thomas
  113166. +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness
  113167. +
  113168. +/*
  113169. + * Call endian free function when
  113170. + * 1. Read/write packet content.
  113171. + * 2. Before write integer to IO.
  113172. + * 3. After read integer from IO.
  113173. +*/
  113174. +
  113175. +//
  113176. +// Byte Swapping routine.
  113177. +//
  113178. +#define EF1Byte
  113179. +#define EF2Byte le16_to_cpu
  113180. +#define EF4Byte le32_to_cpu
  113181. +
  113182. +//
  113183. +// Read LE format data from memory
  113184. +//
  113185. +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr)))
  113186. +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr)))
  113187. +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr)))
  113188. +
  113189. +//
  113190. +// Write LE data to memory
  113191. +//
  113192. +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val)
  113193. +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val)
  113194. +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val)
  113195. +
  113196. +//
  113197. +// Example:
  113198. +// BIT_LEN_MASK_32(0) => 0x00000000
  113199. +// BIT_LEN_MASK_32(1) => 0x00000001
  113200. +// BIT_LEN_MASK_32(2) => 0x00000003
  113201. +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF
  113202. +//
  113203. +#define BIT_LEN_MASK_32(__BitLen) \
  113204. + (0xFFFFFFFF >> (32 - (__BitLen)))
  113205. +//
  113206. +// Example:
  113207. +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
  113208. +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
  113209. +//
  113210. +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \
  113211. + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset))
  113212. +
  113213. +//
  113214. +// Description:
  113215. +// Return 4-byte value in host byte ordering from
  113216. +// 4-byte pointer in litten-endian system.
  113217. +//
  113218. +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
  113219. + (EF4Byte(*((u32 *)(__pStart))))
  113220. +
  113221. +//
  113222. +// Description:
  113223. +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to
  113224. +// 4-byte value in host byte ordering.
  113225. +//
  113226. +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
  113227. + ( \
  113228. + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \
  113229. + & \
  113230. + BIT_LEN_MASK_32(__BitLen) \
  113231. + )
  113232. +
  113233. +//
  113234. +// Description:
  113235. +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering
  113236. +// and return the result in 4-byte value in host byte ordering.
  113237. +//
  113238. +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
  113239. + ( \
  113240. + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
  113241. + & \
  113242. + ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \
  113243. + )
  113244. +
  113245. +//
  113246. +// Description:
  113247. +// Set subfield of little-endian 4-byte value to specified value.
  113248. +//
  113249. +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \
  113250. + *((u32 *)(__pStart)) = \
  113251. + EF4Byte( \
  113252. + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
  113253. + | \
  113254. + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \
  113255. + );
  113256. +
  113257. +
  113258. +#define BIT_LEN_MASK_16(__BitLen) \
  113259. + (0xFFFF >> (16 - (__BitLen)))
  113260. +
  113261. +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \
  113262. + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset))
  113263. +
  113264. +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
  113265. + (EF2Byte(*((u16 *)(__pStart))))
  113266. +
  113267. +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
  113268. + ( \
  113269. + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \
  113270. + & \
  113271. + BIT_LEN_MASK_16(__BitLen) \
  113272. + )
  113273. +
  113274. +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
  113275. + ( \
  113276. + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
  113277. + & \
  113278. + ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \
  113279. + )
  113280. +
  113281. +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \
  113282. + *((u16 *)(__pStart)) = \
  113283. + EF2Byte( \
  113284. + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
  113285. + | \
  113286. + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \
  113287. + );
  113288. +
  113289. +#define BIT_LEN_MASK_8(__BitLen) \
  113290. + (0xFF >> (8 - (__BitLen)))
  113291. +
  113292. +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \
  113293. + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset))
  113294. +
  113295. +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
  113296. + (EF1Byte(*((u8 *)(__pStart))))
  113297. +
  113298. +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
  113299. + ( \
  113300. + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \
  113301. + & \
  113302. + BIT_LEN_MASK_8(__BitLen) \
  113303. + )
  113304. +
  113305. +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
  113306. + ( \
  113307. + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
  113308. + & \
  113309. + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \
  113310. + )
  113311. +
  113312. +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \
  113313. + *((u8 *)(__pStart)) = \
  113314. + EF1Byte( \
  113315. + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
  113316. + | \
  113317. + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \
  113318. + );
  113319. +
  113320. +// Get the N-bytes aligment offset from the current length
  113321. +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment))
  113322. +
  113323. +typedef unsigned char BOOLEAN,*PBOOLEAN;
  113324. +
  113325. +#endif //__BASIC_TYPES_H__
  113326. --- /dev/null
  113327. +++ b/drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h
  113328. @@ -0,0 +1,87 @@
  113329. +/******************************************************************************
  113330. + *
  113331. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113332. + *
  113333. + * This program is free software; you can redistribute it and/or modify it
  113334. + * under the terms of version 2 of the GNU General Public License as
  113335. + * published by the Free Software Foundation.
  113336. + *
  113337. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113338. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113339. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113340. + * more details.
  113341. + *
  113342. + * You should have received a copy of the GNU General Public License along with
  113343. + * this program; if not, write to the Free Software Foundation, Inc.,
  113344. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113345. + *
  113346. + *
  113347. + ******************************************************************************/
  113348. +#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H
  113349. +#define _LINUX_BYTEORDER_BIG_ENDIAN_H
  113350. +
  113351. +#ifndef __BIG_ENDIAN
  113352. +#define __BIG_ENDIAN 4321
  113353. +#endif
  113354. +#ifndef __BIG_ENDIAN_BITFIELD
  113355. +#define __BIG_ENDIAN_BITFIELD
  113356. +#endif
  113357. +
  113358. +#include <byteorder/swab.h>
  113359. +
  113360. +#define __constant_htonl(x) ((__u32)(x))
  113361. +#define __constant_ntohl(x) ((__u32)(x))
  113362. +#define __constant_htons(x) ((__u16)(x))
  113363. +#define __constant_ntohs(x) ((__u16)(x))
  113364. +#define __constant_cpu_to_le64(x) ___constant_swab64((x))
  113365. +#define __constant_le64_to_cpu(x) ___constant_swab64((x))
  113366. +#define __constant_cpu_to_le32(x) ___constant_swab32((x))
  113367. +#define __constant_le32_to_cpu(x) ___constant_swab32((x))
  113368. +#define __constant_cpu_to_le16(x) ___constant_swab16((x))
  113369. +#define __constant_le16_to_cpu(x) ___constant_swab16((x))
  113370. +#define __constant_cpu_to_be64(x) ((__u64)(x))
  113371. +#define __constant_be64_to_cpu(x) ((__u64)(x))
  113372. +#define __constant_cpu_to_be32(x) ((__u32)(x))
  113373. +#define __constant_be32_to_cpu(x) ((__u32)(x))
  113374. +#define __constant_cpu_to_be16(x) ((__u16)(x))
  113375. +#define __constant_be16_to_cpu(x) ((__u16)(x))
  113376. +#define __cpu_to_le64(x) __swab64((x))
  113377. +#define __le64_to_cpu(x) __swab64((x))
  113378. +#define __cpu_to_le32(x) __swab32((x))
  113379. +#define __le32_to_cpu(x) __swab32((x))
  113380. +#define __cpu_to_le16(x) __swab16((x))
  113381. +#define __le16_to_cpu(x) __swab16((x))
  113382. +#define __cpu_to_be64(x) ((__u64)(x))
  113383. +#define __be64_to_cpu(x) ((__u64)(x))
  113384. +#define __cpu_to_be32(x) ((__u32)(x))
  113385. +#define __be32_to_cpu(x) ((__u32)(x))
  113386. +#define __cpu_to_be16(x) ((__u16)(x))
  113387. +#define __be16_to_cpu(x) ((__u16)(x))
  113388. +#define __cpu_to_le64p(x) __swab64p((x))
  113389. +#define __le64_to_cpup(x) __swab64p((x))
  113390. +#define __cpu_to_le32p(x) __swab32p((x))
  113391. +#define __le32_to_cpup(x) __swab32p((x))
  113392. +#define __cpu_to_le16p(x) __swab16p((x))
  113393. +#define __le16_to_cpup(x) __swab16p((x))
  113394. +#define __cpu_to_be64p(x) (*(__u64*)(x))
  113395. +#define __be64_to_cpup(x) (*(__u64*)(x))
  113396. +#define __cpu_to_be32p(x) (*(__u32*)(x))
  113397. +#define __be32_to_cpup(x) (*(__u32*)(x))
  113398. +#define __cpu_to_be16p(x) (*(__u16*)(x))
  113399. +#define __be16_to_cpup(x) (*(__u16*)(x))
  113400. +#define __cpu_to_le64s(x) __swab64s((x))
  113401. +#define __le64_to_cpus(x) __swab64s((x))
  113402. +#define __cpu_to_le32s(x) __swab32s((x))
  113403. +#define __le32_to_cpus(x) __swab32s((x))
  113404. +#define __cpu_to_le16s(x) __swab16s((x))
  113405. +#define __le16_to_cpus(x) __swab16s((x))
  113406. +#define __cpu_to_be64s(x) do {} while (0)
  113407. +#define __be64_to_cpus(x) do {} while (0)
  113408. +#define __cpu_to_be32s(x) do {} while (0)
  113409. +#define __be32_to_cpus(x) do {} while (0)
  113410. +#define __cpu_to_be16s(x) do {} while (0)
  113411. +#define __be16_to_cpus(x) do {} while (0)
  113412. +
  113413. +#include <byteorder/generic.h>
  113414. +
  113415. +#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */
  113416. --- /dev/null
  113417. +++ b/drivers/net/wireless/rtl8192cu/include/byteorder/generic.h
  113418. @@ -0,0 +1,212 @@
  113419. +/******************************************************************************
  113420. + *
  113421. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113422. + *
  113423. + * This program is free software; you can redistribute it and/or modify it
  113424. + * under the terms of version 2 of the GNU General Public License as
  113425. + * published by the Free Software Foundation.
  113426. + *
  113427. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113428. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113429. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113430. + * more details.
  113431. + *
  113432. + * You should have received a copy of the GNU General Public License along with
  113433. + * this program; if not, write to the Free Software Foundation, Inc.,
  113434. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113435. + *
  113436. + *
  113437. + ******************************************************************************/
  113438. +#ifndef _LINUX_BYTEORDER_GENERIC_H
  113439. +#define _LINUX_BYTEORDER_GENERIC_H
  113440. +
  113441. +/*
  113442. + * linux/byteorder_generic.h
  113443. + * Generic Byte-reordering support
  113444. + *
  113445. + * Francois-Rene Rideau <fare@tunes.org> 19970707
  113446. + * gathered all the good ideas from all asm-foo/byteorder.h into one file,
  113447. + * cleaned them up.
  113448. + * I hope it is compliant with non-GCC compilers.
  113449. + * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h,
  113450. + * because I wasn't sure it would be ok to put it in types.h
  113451. + * Upgraded it to 2.1.43
  113452. + * Francois-Rene Rideau <fare@tunes.org> 19971012
  113453. + * Upgraded it to 2.1.57
  113454. + * to please Linus T., replaced huge #ifdef's between little/big endian
  113455. + * by nestedly #include'd files.
  113456. + * Francois-Rene Rideau <fare@tunes.org> 19971205
  113457. + * Made it to 2.1.71; now a facelift:
  113458. + * Put files under include/linux/byteorder/
  113459. + * Split swab from generic support.
  113460. + *
  113461. + * TODO:
  113462. + * = Regular kernel maintainers could also replace all these manual
  113463. + * byteswap macros that remain, disseminated among drivers,
  113464. + * after some grep or the sources...
  113465. + * = Linus might want to rename all these macros and files to fit his taste,
  113466. + * to fit his personal naming scheme.
  113467. + * = it seems that a few drivers would also appreciate
  113468. + * nybble swapping support...
  113469. + * = every architecture could add their byteswap macro in asm/byteorder.h
  113470. + * see how some architectures already do (i386, alpha, ppc, etc)
  113471. + * = cpu_to_beXX and beXX_to_cpu might some day need to be well
  113472. + * distinguished throughout the kernel. This is not the case currently,
  113473. + * since little endian, big endian, and pdp endian machines needn't it.
  113474. + * But this might be the case for, say, a port of Linux to 20/21 bit
  113475. + * architectures (and F21 Linux addict around?).
  113476. + */
  113477. +
  113478. +/*
  113479. + * The following macros are to be defined by <asm/byteorder.h>:
  113480. + *
  113481. + * Conversion of long and short int between network and host format
  113482. + * ntohl(__u32 x)
  113483. + * ntohs(__u16 x)
  113484. + * htonl(__u32 x)
  113485. + * htons(__u16 x)
  113486. + * It seems that some programs (which? where? or perhaps a standard? POSIX?)
  113487. + * might like the above to be functions, not macros (why?).
  113488. + * if that's true, then detect them, and take measures.
  113489. + * Anyway, the measure is: define only ___ntohl as a macro instead,
  113490. + * and in a separate file, have
  113491. + * unsigned long inline ntohl(x){return ___ntohl(x);}
  113492. + *
  113493. + * The same for constant arguments
  113494. + * __constant_ntohl(__u32 x)
  113495. + * __constant_ntohs(__u16 x)
  113496. + * __constant_htonl(__u32 x)
  113497. + * __constant_htons(__u16 x)
  113498. + *
  113499. + * Conversion of XX-bit integers (16- 32- or 64-)
  113500. + * between native CPU format and little/big endian format
  113501. + * 64-bit stuff only defined for proper architectures
  113502. + * cpu_to_[bl]eXX(__uXX x)
  113503. + * [bl]eXX_to_cpu(__uXX x)
  113504. + *
  113505. + * The same, but takes a pointer to the value to convert
  113506. + * cpu_to_[bl]eXXp(__uXX x)
  113507. + * [bl]eXX_to_cpup(__uXX x)
  113508. + *
  113509. + * The same, but change in situ
  113510. + * cpu_to_[bl]eXXs(__uXX x)
  113511. + * [bl]eXX_to_cpus(__uXX x)
  113512. + *
  113513. + * See asm-foo/byteorder.h for examples of how to provide
  113514. + * architecture-optimized versions
  113515. + *
  113516. + */
  113517. +
  113518. +
  113519. +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) || defined(PLATFORM_FREEBSD)
  113520. +/*
  113521. + * inside the kernel, we can use nicknames;
  113522. + * outside of it, we must avoid POSIX namespace pollution...
  113523. + */
  113524. +#define cpu_to_le64 __cpu_to_le64
  113525. +#define le64_to_cpu __le64_to_cpu
  113526. +#define cpu_to_le32 __cpu_to_le32
  113527. +#define le32_to_cpu __le32_to_cpu
  113528. +#define cpu_to_le16 __cpu_to_le16
  113529. +#define le16_to_cpu __le16_to_cpu
  113530. +#define cpu_to_be64 __cpu_to_be64
  113531. +#define be64_to_cpu __be64_to_cpu
  113532. +#define cpu_to_be32 __cpu_to_be32
  113533. +#define be32_to_cpu __be32_to_cpu
  113534. +#define cpu_to_be16 __cpu_to_be16
  113535. +#define be16_to_cpu __be16_to_cpu
  113536. +#define cpu_to_le64p __cpu_to_le64p
  113537. +#define le64_to_cpup __le64_to_cpup
  113538. +#define cpu_to_le32p __cpu_to_le32p
  113539. +#define le32_to_cpup __le32_to_cpup
  113540. +#define cpu_to_le16p __cpu_to_le16p
  113541. +#define le16_to_cpup __le16_to_cpup
  113542. +#define cpu_to_be64p __cpu_to_be64p
  113543. +#define be64_to_cpup __be64_to_cpup
  113544. +#define cpu_to_be32p __cpu_to_be32p
  113545. +#define be32_to_cpup __be32_to_cpup
  113546. +#define cpu_to_be16p __cpu_to_be16p
  113547. +#define be16_to_cpup __be16_to_cpup
  113548. +#define cpu_to_le64s __cpu_to_le64s
  113549. +#define le64_to_cpus __le64_to_cpus
  113550. +#define cpu_to_le32s __cpu_to_le32s
  113551. +#define le32_to_cpus __le32_to_cpus
  113552. +#define cpu_to_le16s __cpu_to_le16s
  113553. +#define le16_to_cpus __le16_to_cpus
  113554. +#define cpu_to_be64s __cpu_to_be64s
  113555. +#define be64_to_cpus __be64_to_cpus
  113556. +#define cpu_to_be32s __cpu_to_be32s
  113557. +#define be32_to_cpus __be32_to_cpus
  113558. +#define cpu_to_be16s __cpu_to_be16s
  113559. +#define be16_to_cpus __be16_to_cpus
  113560. +#endif
  113561. +
  113562. +
  113563. +/*
  113564. + * Handle ntohl and suches. These have various compatibility
  113565. + * issues - like we want to give the prototype even though we
  113566. + * also have a macro for them in case some strange program
  113567. + * wants to take the address of the thing or something..
  113568. + *
  113569. + * Note that these used to return a "long" in libc5, even though
  113570. + * long is often 64-bit these days.. Thus the casts.
  113571. + *
  113572. + * They have to be macros in order to do the constant folding
  113573. + * correctly - if the argument passed into a inline function
  113574. + * it is no longer constant according to gcc..
  113575. + */
  113576. +
  113577. +#undef ntohl
  113578. +#undef ntohs
  113579. +#undef htonl
  113580. +#undef htons
  113581. +
  113582. +/*
  113583. + * Do the prototypes. Somebody might want to take the
  113584. + * address or some such sick thing..
  113585. + */
  113586. +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)
  113587. +extern __u32 ntohl(__u32);
  113588. +extern __u32 htonl(__u32);
  113589. +#else //defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)
  113590. +#ifndef PLATFORM_FREEBSD
  113591. +extern unsigned long int ntohl(unsigned long int);
  113592. +extern unsigned long int htonl(unsigned long int);
  113593. +#endif
  113594. +#endif
  113595. +#ifndef PLATFORM_FREEBSD
  113596. +extern unsigned short int ntohs(unsigned short int);
  113597. +extern unsigned short int htons(unsigned short int);
  113598. +#endif
  113599. +
  113600. +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) || defined(PLATFORM_MPIXEL)
  113601. +
  113602. +#define ___htonl(x) __cpu_to_be32(x)
  113603. +#define ___htons(x) __cpu_to_be16(x)
  113604. +#define ___ntohl(x) __be32_to_cpu(x)
  113605. +#define ___ntohs(x) __be16_to_cpu(x)
  113606. +
  113607. +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)
  113608. +#define htonl(x) ___htonl(x)
  113609. +#define ntohl(x) ___ntohl(x)
  113610. +#else
  113611. +#define htonl(x) ((unsigned long)___htonl(x))
  113612. +#define ntohl(x) ((unsigned long)___ntohl(x))
  113613. +#endif
  113614. +#define htons(x) ___htons(x)
  113615. +#define ntohs(x) ___ntohs(x)
  113616. +
  113617. +#endif /* OPTIMIZE */
  113618. +
  113619. +
  113620. +#if defined (PLATFORM_WINDOWS)
  113621. +
  113622. +#define htonl(x) __cpu_to_be32(x)
  113623. +#define ntohl(x) __be32_to_cpu(x)
  113624. +#define htons(x) __cpu_to_be16(x)
  113625. +#define ntohs(x) __be16_to_cpu(x)
  113626. +
  113627. +
  113628. +#endif
  113629. +
  113630. +#endif /* _LINUX_BYTEORDER_GENERIC_H */
  113631. --- /dev/null
  113632. +++ b/drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h
  113633. @@ -0,0 +1,89 @@
  113634. +/******************************************************************************
  113635. + *
  113636. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113637. + *
  113638. + * This program is free software; you can redistribute it and/or modify it
  113639. + * under the terms of version 2 of the GNU General Public License as
  113640. + * published by the Free Software Foundation.
  113641. + *
  113642. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113643. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113644. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113645. + * more details.
  113646. + *
  113647. + * You should have received a copy of the GNU General Public License along with
  113648. + * this program; if not, write to the Free Software Foundation, Inc.,
  113649. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113650. + *
  113651. + *
  113652. + ******************************************************************************/
  113653. +#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H
  113654. +#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H
  113655. +
  113656. +#ifndef __LITTLE_ENDIAN
  113657. +#define __LITTLE_ENDIAN 1234
  113658. +#endif
  113659. +#ifndef __LITTLE_ENDIAN_BITFIELD
  113660. +#define __LITTLE_ENDIAN_BITFIELD
  113661. +#endif
  113662. +
  113663. +#include <byteorder/swab.h>
  113664. +
  113665. +#ifndef __constant_htonl
  113666. +#define __constant_htonl(x) ___constant_swab32((x))
  113667. +#define __constant_ntohl(x) ___constant_swab32((x))
  113668. +#define __constant_htons(x) ___constant_swab16((x))
  113669. +#define __constant_ntohs(x) ___constant_swab16((x))
  113670. +#define __constant_cpu_to_le64(x) ((__u64)(x))
  113671. +#define __constant_le64_to_cpu(x) ((__u64)(x))
  113672. +#define __constant_cpu_to_le32(x) ((__u32)(x))
  113673. +#define __constant_le32_to_cpu(x) ((__u32)(x))
  113674. +#define __constant_cpu_to_le16(x) ((__u16)(x))
  113675. +#define __constant_le16_to_cpu(x) ((__u16)(x))
  113676. +#define __constant_cpu_to_be64(x) ___constant_swab64((x))
  113677. +#define __constant_be64_to_cpu(x) ___constant_swab64((x))
  113678. +#define __constant_cpu_to_be32(x) ___constant_swab32((x))
  113679. +#define __constant_be32_to_cpu(x) ___constant_swab32((x))
  113680. +#define __constant_cpu_to_be16(x) ___constant_swab16((x))
  113681. +#define __constant_be16_to_cpu(x) ___constant_swab16((x))
  113682. +#define __cpu_to_le64(x) ((__u64)(x))
  113683. +#define __le64_to_cpu(x) ((__u64)(x))
  113684. +#define __cpu_to_le32(x) ((__u32)(x))
  113685. +#define __le32_to_cpu(x) ((__u32)(x))
  113686. +#define __cpu_to_le16(x) ((__u16)(x))
  113687. +#define __le16_to_cpu(x) ((__u16)(x))
  113688. +#define __cpu_to_be64(x) __swab64((x))
  113689. +#define __be64_to_cpu(x) __swab64((x))
  113690. +#define __cpu_to_be32(x) __swab32((x))
  113691. +#define __be32_to_cpu(x) __swab32((x))
  113692. +#define __cpu_to_be16(x) __swab16((x))
  113693. +#define __be16_to_cpu(x) __swab16((x))
  113694. +#define __cpu_to_le64p(x) (*(__u64*)(x))
  113695. +#define __le64_to_cpup(x) (*(__u64*)(x))
  113696. +#define __cpu_to_le32p(x) (*(__u32*)(x))
  113697. +#define __le32_to_cpup(x) (*(__u32*)(x))
  113698. +#define __cpu_to_le16p(x) (*(__u16*)(x))
  113699. +#define __le16_to_cpup(x) (*(__u16*)(x))
  113700. +#define __cpu_to_be64p(x) __swab64p((x))
  113701. +#define __be64_to_cpup(x) __swab64p((x))
  113702. +#define __cpu_to_be32p(x) __swab32p((x))
  113703. +#define __be32_to_cpup(x) __swab32p((x))
  113704. +#define __cpu_to_be16p(x) __swab16p((x))
  113705. +#define __be16_to_cpup(x) __swab16p((x))
  113706. +#define __cpu_to_le64s(x) do {} while (0)
  113707. +#define __le64_to_cpus(x) do {} while (0)
  113708. +#define __cpu_to_le32s(x) do {} while (0)
  113709. +#define __le32_to_cpus(x) do {} while (0)
  113710. +#define __cpu_to_le16s(x) do {} while (0)
  113711. +#define __le16_to_cpus(x) do {} while (0)
  113712. +#define __cpu_to_be64s(x) __swab64s((x))
  113713. +#define __be64_to_cpus(x) __swab64s((x))
  113714. +#define __cpu_to_be32s(x) __swab32s((x))
  113715. +#define __be32_to_cpus(x) __swab32s((x))
  113716. +#define __cpu_to_be16s(x) __swab16s((x))
  113717. +#define __be16_to_cpus(x) __swab16s((x))
  113718. +#endif // __constant_htonl
  113719. +
  113720. +#include <byteorder/generic.h>
  113721. +
  113722. +#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */
  113723. --- /dev/null
  113724. +++ b/drivers/net/wireless/rtl8192cu/include/byteorder/swab.h
  113725. @@ -0,0 +1,140 @@
  113726. +/******************************************************************************
  113727. + *
  113728. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113729. + *
  113730. + * This program is free software; you can redistribute it and/or modify it
  113731. + * under the terms of version 2 of the GNU General Public License as
  113732. + * published by the Free Software Foundation.
  113733. + *
  113734. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113735. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113736. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113737. + * more details.
  113738. + *
  113739. + * You should have received a copy of the GNU General Public License along with
  113740. + * this program; if not, write to the Free Software Foundation, Inc.,
  113741. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113742. + *
  113743. + *
  113744. + ******************************************************************************/
  113745. +#ifndef _LINUX_BYTEORDER_SWAB_H
  113746. +#define _LINUX_BYTEORDER_SWAB_H
  113747. +
  113748. +#if !defined(CONFIG_PLATFORM_MSTAR)
  113749. +#ifndef __u16
  113750. +typedef unsigned short __u16;
  113751. +#endif
  113752. +
  113753. +#ifndef __u32
  113754. +typedef unsigned int __u32;
  113755. +#endif
  113756. +
  113757. +#ifndef __u8
  113758. +typedef unsigned char __u8;
  113759. +#endif
  113760. +
  113761. +#ifndef __u64
  113762. +typedef unsigned long long __u64;
  113763. +#endif
  113764. +
  113765. +
  113766. +__inline static __u16 ___swab16(__u16 x)
  113767. +{
  113768. + __u16 __x = x;
  113769. + return
  113770. + ((__u16)(
  113771. + (((__u16)(__x) & (__u16)0x00ffU) << 8) |
  113772. + (((__u16)(__x) & (__u16)0xff00U) >> 8) ));
  113773. +
  113774. +}
  113775. +
  113776. +__inline static __u32 ___swab32(__u32 x)
  113777. +{
  113778. + __u32 __x = (x);
  113779. + return ((__u32)(
  113780. + (((__u32)(__x) & (__u32)0x000000ffUL) << 24) |
  113781. + (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |
  113782. + (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |
  113783. + (((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));
  113784. +}
  113785. +
  113786. +__inline static __u64 ___swab64(__u64 x)
  113787. +{
  113788. + __u64 __x = (x);
  113789. +
  113790. + return
  113791. + ((__u64)( \
  113792. + (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \
  113793. + (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \
  113794. + (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \
  113795. + (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \
  113796. + (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \
  113797. + (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \
  113798. + (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \
  113799. + (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \
  113800. +}
  113801. +#endif // CONFIG_PLATFORM_MSTAR
  113802. +
  113803. +#ifndef __arch__swab16
  113804. +__inline static __u16 __arch__swab16(__u16 x)
  113805. +{
  113806. + return ___swab16(x);
  113807. +}
  113808. +
  113809. +#endif
  113810. +
  113811. +#ifndef __arch__swab32
  113812. +__inline static __u32 __arch__swab32(__u32 x)
  113813. +{
  113814. + __u32 __tmp = (x) ;
  113815. + return ___swab32(__tmp);
  113816. +}
  113817. +#endif
  113818. +
  113819. +#ifndef __arch__swab64
  113820. +
  113821. +__inline static __u64 __arch__swab64(__u64 x)
  113822. +{
  113823. + __u64 __tmp = (x) ;
  113824. + return ___swab64(__tmp);
  113825. +}
  113826. +
  113827. +
  113828. +#endif
  113829. +
  113830. +#ifndef __swab16
  113831. +#define __swab16(x) __fswab16(x)
  113832. +#define __swab32(x) __fswab32(x)
  113833. +#define __swab64(x) __fswab64(x)
  113834. +#endif // __swab16
  113835. +
  113836. +#ifdef PLATFORM_FREEBSD
  113837. +__inline static __u16 __fswab16(__u16 x)
  113838. +#else
  113839. +__inline static const __u16 __fswab16(__u16 x)
  113840. +#endif //PLATFORM_FREEBSD
  113841. +{
  113842. + return __arch__swab16(x);
  113843. +}
  113844. +#ifdef PLATFORM_FREEBSD
  113845. +__inline static __u32 __fswab32(__u32 x)
  113846. +#else
  113847. +__inline static const __u32 __fswab32(__u32 x)
  113848. +#endif //PLATFORM_FREEBSD
  113849. +{
  113850. + return __arch__swab32(x);
  113851. +}
  113852. +
  113853. +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS)
  113854. +#define swab16 __swab16
  113855. +#define swab32 __swab32
  113856. +#define swab64 __swab64
  113857. +#define swab16p __swab16p
  113858. +#define swab32p __swab32p
  113859. +#define swab64p __swab64p
  113860. +#define swab16s __swab16s
  113861. +#define swab32s __swab32s
  113862. +#define swab64s __swab64s
  113863. +#endif
  113864. +
  113865. +#endif /* _LINUX_BYTEORDER_SWAB_H */
  113866. --- /dev/null
  113867. +++ b/drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h
  113868. @@ -0,0 +1,156 @@
  113869. +/******************************************************************************
  113870. + *
  113871. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  113872. + *
  113873. + * This program is free software; you can redistribute it and/or modify it
  113874. + * under the terms of version 2 of the GNU General Public License as
  113875. + * published by the Free Software Foundation.
  113876. + *
  113877. + * This program is distributed in the hope that it will be useful, but WITHOUT
  113878. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  113879. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  113880. + * more details.
  113881. + *
  113882. + * You should have received a copy of the GNU General Public License along with
  113883. + * this program; if not, write to the Free Software Foundation, Inc.,
  113884. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  113885. + *
  113886. + *
  113887. + ******************************************************************************/
  113888. +#ifndef _LINUX_BYTEORDER_SWABB_H
  113889. +#define _LINUX_BYTEORDER_SWABB_H
  113890. +
  113891. +/*
  113892. + * linux/byteorder/swabb.h
  113893. + * SWAp Bytes Bizarrely
  113894. + * swaHHXX[ps]?(foo)
  113895. + *
  113896. + * Support for obNUXIous pdp-endian and other bizarre architectures.
  113897. + * Will Linux ever run on such ancient beasts? if not, this file
  113898. + * will be but a programming pearl. Still, it's a reminder that we
  113899. + * shouldn't be making too many assumptions when trying to be portable.
  113900. + *
  113901. + */
  113902. +
  113903. +/*
  113904. + * Meaning of the names I chose (vaxlinux people feel free to correct them):
  113905. + * swahw32 swap 16-bit half-words in a 32-bit word
  113906. + * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word
  113907. + *
  113908. + * No 64-bit support yet. I don't know NUXI conventions for long longs.
  113909. + * I guarantee it will be a mess when it's there, though :->
  113910. + * It will be even worse if there are conflicting 64-bit conventions.
  113911. + * Hopefully, no one ever used 64-bit objects on NUXI machines.
  113912. + *
  113913. + */
  113914. +
  113915. +#define ___swahw32(x) \
  113916. +({ \
  113917. + __u32 __x = (x); \
  113918. + ((__u32)( \
  113919. + (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \
  113920. + (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \
  113921. +})
  113922. +#define ___swahb32(x) \
  113923. +({ \
  113924. + __u32 __x = (x); \
  113925. + ((__u32)( \
  113926. + (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \
  113927. + (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \
  113928. +})
  113929. +
  113930. +#define ___constant_swahw32(x) \
  113931. + ((__u32)( \
  113932. + (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \
  113933. + (((__u32)(x) & (__u32)0xffff0000UL) >> 16) ))
  113934. +#define ___constant_swahb32(x) \
  113935. + ((__u32)( \
  113936. + (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \
  113937. + (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) ))
  113938. +
  113939. +/*
  113940. + * provide defaults when no architecture-specific optimization is detected
  113941. + */
  113942. +#ifndef __arch__swahw32
  113943. +# define __arch__swahw32(x) ___swahw32(x)
  113944. +#endif
  113945. +#ifndef __arch__swahb32
  113946. +# define __arch__swahb32(x) ___swahb32(x)
  113947. +#endif
  113948. +
  113949. +#ifndef __arch__swahw32p
  113950. +# define __arch__swahw32p(x) __swahw32(*(x))
  113951. +#endif
  113952. +#ifndef __arch__swahb32p
  113953. +# define __arch__swahb32p(x) __swahb32(*(x))
  113954. +#endif
  113955. +
  113956. +#ifndef __arch__swahw32s
  113957. +# define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0)
  113958. +#endif
  113959. +#ifndef __arch__swahb32s
  113960. +# define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0)
  113961. +#endif
  113962. +
  113963. +
  113964. +/*
  113965. + * Allow constant folding
  113966. + */
  113967. +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__)
  113968. +# define __swahw32(x) \
  113969. +(__builtin_constant_p((__u32)(x)) ? \
  113970. + ___swahw32((x)) : \
  113971. + __fswahw32((x)))
  113972. +# define __swahb32(x) \
  113973. +(__builtin_constant_p((__u32)(x)) ? \
  113974. + ___swahb32((x)) : \
  113975. + __fswahb32((x)))
  113976. +#else
  113977. +# define __swahw32(x) __fswahw32(x)
  113978. +# define __swahb32(x) __fswahb32(x)
  113979. +#endif /* OPTIMIZE */
  113980. +
  113981. +
  113982. +__inline static__ __const__ __u32 __fswahw32(__u32 x)
  113983. +{
  113984. + return __arch__swahw32(x);
  113985. +}
  113986. +__inline static__ __u32 __swahw32p(__u32 *x)
  113987. +{
  113988. + return __arch__swahw32p(x);
  113989. +}
  113990. +__inline static__ void __swahw32s(__u32 *addr)
  113991. +{
  113992. + __arch__swahw32s(addr);
  113993. +}
  113994. +
  113995. +
  113996. +__inline static__ __const__ __u32 __fswahb32(__u32 x)
  113997. +{
  113998. + return __arch__swahb32(x);
  113999. +}
  114000. +__inline static__ __u32 __swahb32p(__u32 *x)
  114001. +{
  114002. + return __arch__swahb32p(x);
  114003. +}
  114004. +__inline static__ void __swahb32s(__u32 *addr)
  114005. +{
  114006. + __arch__swahb32s(addr);
  114007. +}
  114008. +
  114009. +#ifdef __BYTEORDER_HAS_U64__
  114010. +/*
  114011. + * Not supported yet
  114012. + */
  114013. +#endif /* __BYTEORDER_HAS_U64__ */
  114014. +
  114015. +#if defined(PLATFORM_LINUX)
  114016. +#define swahw32 __swahw32
  114017. +#define swahb32 __swahb32
  114018. +#define swahw32p __swahw32p
  114019. +#define swahb32p __swahb32p
  114020. +#define swahw32s __swahw32s
  114021. +#define swahb32s __swahb32s
  114022. +#endif
  114023. +
  114024. +#endif /* _LINUX_BYTEORDER_SWABB_H */
  114025. --- /dev/null
  114026. +++ b/drivers/net/wireless/rtl8192cu/include/circ_buf.h
  114027. @@ -0,0 +1,27 @@
  114028. +/******************************************************************************
  114029. + *
  114030. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114031. + *
  114032. + * This program is free software; you can redistribute it and/or modify it
  114033. + * under the terms of version 2 of the GNU General Public License as
  114034. + * published by the Free Software Foundation.
  114035. + *
  114036. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114037. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114038. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114039. + * more details.
  114040. + *
  114041. + * You should have received a copy of the GNU General Public License along with
  114042. + * this program; if not, write to the Free Software Foundation, Inc.,
  114043. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114044. + *
  114045. + *
  114046. + ******************************************************************************/
  114047. +#ifndef __CIRC_BUF_H_
  114048. +#define __CIRC_BUF_H_ 1
  114049. +
  114050. +#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
  114051. +
  114052. +#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
  114053. +
  114054. +#endif //_CIRC_BUF_H_
  114055. --- /dev/null
  114056. +++ b/drivers/net/wireless/rtl8192cu/include/cmd_osdep.h
  114057. @@ -0,0 +1,35 @@
  114058. +/******************************************************************************
  114059. + *
  114060. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114061. + *
  114062. + * This program is free software; you can redistribute it and/or modify it
  114063. + * under the terms of version 2 of the GNU General Public License as
  114064. + * published by the Free Software Foundation.
  114065. + *
  114066. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114067. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114068. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114069. + * more details.
  114070. + *
  114071. + * You should have received a copy of the GNU General Public License along with
  114072. + * this program; if not, write to the Free Software Foundation, Inc.,
  114073. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114074. + *
  114075. + *
  114076. + ******************************************************************************/
  114077. +#ifndef __CMD_OSDEP_H_
  114078. +#define __CMD_OSDEP_H_
  114079. +
  114080. +
  114081. +#include <drv_conf.h>
  114082. +#include <osdep_service.h>
  114083. +#include <drv_types.h>
  114084. +
  114085. +extern sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv);
  114086. +extern sint _rtw_init_evt_priv(struct evt_priv *pevtpriv);
  114087. +extern void _rtw_free_evt_priv (struct evt_priv *pevtpriv);
  114088. +extern void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv);
  114089. +extern sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj);
  114090. +extern struct cmd_obj *_rtw_dequeue_cmd(_queue *queue);
  114091. +
  114092. +#endif
  114093. --- /dev/null
  114094. +++ b/drivers/net/wireless/rtl8192cu/include/drv_conf.h
  114095. @@ -0,0 +1,77 @@
  114096. +/******************************************************************************
  114097. + *
  114098. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114099. + *
  114100. + * This program is free software; you can redistribute it and/or modify it
  114101. + * under the terms of version 2 of the GNU General Public License as
  114102. + * published by the Free Software Foundation.
  114103. + *
  114104. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114105. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114106. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114107. + * more details.
  114108. + *
  114109. + * You should have received a copy of the GNU General Public License along with
  114110. + * this program; if not, write to the Free Software Foundation, Inc.,
  114111. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114112. + *
  114113. + *
  114114. + ******************************************************************************/
  114115. +#ifndef __DRV_CONF_H__
  114116. +#define __DRV_CONF_H__
  114117. +#include "autoconf.h"
  114118. +
  114119. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  114120. +
  114121. +#error "Shall be Linux or Windows, but not both!\n"
  114122. +
  114123. +#endif
  114124. +
  114125. +//Older Android kernel doesn't has CONFIG_ANDROID defined,
  114126. +//add this to force CONFIG_ANDROID defined
  114127. +#ifdef CONFIG_PLATFORM_ANDROID
  114128. +#define CONFIG_ANDROID
  114129. +#endif
  114130. +
  114131. +#ifdef CONFIG_ANDROID
  114132. +//Some Android build will restart the UI while non-printable ascii is passed
  114133. +//between java and c/c++ layer (JNI). We force CONFIG_VALIDATE_SSID
  114134. +//for Android here. If you are sure there is no risk on your system about this,
  114135. +//mask this macro define to support non-printable ascii ssid.
  114136. +//#define CONFIG_VALIDATE_SSID
  114137. +
  114138. +//Android expect dbm as the rx signal strength unit
  114139. +#define CONFIG_SIGNAL_DISPLAY_DBM
  114140. +#endif
  114141. +
  114142. +#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE)
  114143. + #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
  114144. + #undef CONFIG_RESUME_IN_WORKQUEUE
  114145. +#endif
  114146. +
  114147. +#if defined(CONFIG_ANDROID_POWER) && defined (CONFIG_RESUME_IN_WORKQUEUE)
  114148. + #warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
  114149. + #undef CONFIG_RESUME_IN_WORKQUEUE
  114150. +#endif
  114151. +
  114152. +#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this...
  114153. + #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER)
  114154. + #error "enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality..."
  114155. + #error "If you still want to enable CONFIG_RESUME_IN_WORKQUEUE in this case, mask this preprossor checking and GOOD LUCK..."
  114156. + #endif
  114157. +#endif
  114158. +
  114159. +//About USB VENDOR REQ
  114160. +#if defined(CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC) && !defined(CONFIG_USB_VENDOR_REQ_MUTEX)
  114161. + #warning "define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC automatically"
  114162. + #define CONFIG_USB_VENDOR_REQ_MUTEX
  114163. +#endif
  114164. +#if defined(CONFIG_VENDOR_REQ_RETRY) && !defined(CONFIG_USB_VENDOR_REQ_MUTEX)
  114165. + #warning "define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_VENDOR_REQ_RETRY automatically"
  114166. + #define CONFIG_USB_VENDOR_REQ_MUTEX
  114167. +#endif
  114168. +
  114169. +
  114170. +//#include <rtl871x_byteorder.h>
  114171. +
  114172. +#endif // __DRV_CONF_H__
  114173. --- /dev/null
  114174. +++ b/drivers/net/wireless/rtl8192cu/include/drv_types.h
  114175. @@ -0,0 +1,661 @@
  114176. +/******************************************************************************
  114177. + *
  114178. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114179. + *
  114180. + * This program is free software; you can redistribute it and/or modify it
  114181. + * under the terms of version 2 of the GNU General Public License as
  114182. + * published by the Free Software Foundation.
  114183. + *
  114184. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114185. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114186. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114187. + * more details.
  114188. + *
  114189. + * You should have received a copy of the GNU General Public License along with
  114190. + * this program; if not, write to the Free Software Foundation, Inc.,
  114191. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114192. + *
  114193. + *
  114194. + ******************************************************************************/
  114195. +/*-------------------------------------------------------------------------------
  114196. +
  114197. + For type defines and data structure defines
  114198. +
  114199. +--------------------------------------------------------------------------------*/
  114200. +
  114201. +
  114202. +#ifndef __DRV_TYPES_H__
  114203. +#define __DRV_TYPES_H__
  114204. +
  114205. +#include <drv_conf.h>
  114206. +#include <osdep_service.h>
  114207. +#include <wlan_bssdef.h>
  114208. +
  114209. +
  114210. +#ifdef PLATFORM_OS_XP
  114211. +#include <drv_types_xp.h>
  114212. +#endif
  114213. +
  114214. +#ifdef PLATFORM_OS_CE
  114215. +#include <drv_types_ce.h>
  114216. +#endif
  114217. +
  114218. +#ifdef PLATFORM_LINUX
  114219. +#include <drv_types_linux.h>
  114220. +#endif
  114221. +
  114222. +enum _NIC_VERSION {
  114223. +
  114224. + RTL8711_NIC,
  114225. + RTL8712_NIC,
  114226. + RTL8713_NIC,
  114227. + RTL8716_NIC
  114228. +
  114229. +};
  114230. +
  114231. +enum{
  114232. + UP_LINK,
  114233. + DOWN_LINK,
  114234. +};
  114235. +typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
  114236. +
  114237. +#ifdef CONFIG_80211N_HT
  114238. +#include <rtw_ht.h>
  114239. +#endif
  114240. +
  114241. +#include <rtw_cmd.h>
  114242. +#include <wlan_bssdef.h>
  114243. +#include <rtw_security.h>
  114244. +#include <rtw_xmit.h>
  114245. +#include <rtw_recv.h>
  114246. +#include <hal_intf.h>
  114247. +#include <hal_com.h>
  114248. +#include <rtw_qos.h>
  114249. +#include <rtw_pwrctrl.h>
  114250. +#include <rtw_io.h>
  114251. +#include <rtw_eeprom.h>
  114252. +#include <sta_info.h>
  114253. +#include <rtw_mlme.h>
  114254. +#include <rtw_debug.h>
  114255. +#include <rtw_rf.h>
  114256. +#include <rtw_event.h>
  114257. +#include <rtw_led.h>
  114258. +#include <rtw_mlme_ext.h>
  114259. +#include <rtw_p2p.h>
  114260. +#include <rtw_tdls.h>
  114261. +#include <rtw_ap.h>
  114262. +
  114263. +#ifdef CONFIG_DRVEXT_MODULE
  114264. +#include <drvext_api.h>
  114265. +#endif
  114266. +
  114267. +#ifdef CONFIG_MP_INCLUDED
  114268. +#include <rtw_mp.h>
  114269. +#endif
  114270. +
  114271. +#ifdef CONFIG_BR_EXT
  114272. +#include <rtw_br_ext.h>
  114273. +#endif // CONFIG_BR_EXT
  114274. +
  114275. +#ifdef CONFIG_IOCTL_CFG80211
  114276. + #include "ioctl_cfg80211.h"
  114277. +#endif //CONFIG_IOCTL_CFG80211
  114278. +
  114279. +#define SPEC_DEV_ID_NONE BIT(0)
  114280. +#define SPEC_DEV_ID_DISABLE_HT BIT(1)
  114281. +#define SPEC_DEV_ID_ENABLE_PS BIT(2)
  114282. +#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3)
  114283. +#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4)
  114284. +#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5)
  114285. +
  114286. +struct specific_device_id{
  114287. +
  114288. + u32 flags;
  114289. +
  114290. + u16 idVendor;
  114291. + u16 idProduct;
  114292. +
  114293. +};
  114294. +
  114295. +struct registry_priv
  114296. +{
  114297. + u8 chip_version;
  114298. + u8 rfintfs;
  114299. + u8 lbkmode;
  114300. + u8 hci;
  114301. + NDIS_802_11_SSID ssid;
  114302. + u8 network_mode; //infra, ad-hoc, auto
  114303. + u8 channel;//ad-hoc support requirement
  114304. + u8 wireless_mode;//A, B, G, auto
  114305. + u8 scan_mode;//active, passive
  114306. + u8 radio_enable;
  114307. + u8 preamble;//long, short, auto
  114308. + u8 vrtl_carrier_sense;//Enable, Disable, Auto
  114309. + u8 vcs_type;//RTS/CTS, CTS-to-self
  114310. + u16 rts_thresh;
  114311. + u16 frag_thresh;
  114312. + u8 adhoc_tx_pwr;
  114313. + u8 soft_ap;
  114314. + u8 power_mgnt;
  114315. + u8 ips_mode;
  114316. + u8 smart_ps;
  114317. + u8 long_retry_lmt;
  114318. + u8 short_retry_lmt;
  114319. + u16 busy_thresh;
  114320. + u8 ack_policy;
  114321. + u8 mp_mode;
  114322. + u8 software_encrypt;
  114323. + u8 software_decrypt;
  114324. +
  114325. + u8 acm_method;
  114326. + //UAPSD
  114327. + u8 wmm_enable;
  114328. + u8 uapsd_enable;
  114329. + u8 uapsd_max_sp;
  114330. + u8 uapsd_acbk_en;
  114331. + u8 uapsd_acbe_en;
  114332. + u8 uapsd_acvi_en;
  114333. + u8 uapsd_acvo_en;
  114334. +
  114335. + WLAN_BSSID_EX dev_network;
  114336. +
  114337. +#ifdef CONFIG_80211N_HT
  114338. + u8 ht_enable;
  114339. + u8 cbw40_enable;
  114340. + u8 ampdu_enable;//for tx
  114341. + u8 rx_stbc;
  114342. + u8 ampdu_amsdu;//A-MPDU Supports A-MSDU is permitted
  114343. +#endif
  114344. + u8 lowrate_two_xmit;
  114345. +
  114346. + u8 rf_config ;
  114347. + u8 low_power ;
  114348. +
  114349. + u8 wifi_spec;// !turbo_mode
  114350. +
  114351. + u8 channel_plan;
  114352. +#ifdef CONFIG_BT_COEXIST
  114353. + u8 bt_iso;
  114354. + u8 bt_sco;
  114355. + u8 bt_ampdu;
  114356. +#endif
  114357. + BOOLEAN bAcceptAddbaReq;
  114358. +
  114359. + u8 antdiv_cfg;
  114360. +
  114361. + u8 usbss_enable;//0:disable,1:enable
  114362. + u8 hwpdn_mode;//0:disable,1:enable,2:decide by EFUSE config
  114363. + u8 hwpwrp_detect;//0:disable,1:enable
  114364. +
  114365. + u8 hw_wps_pbc;//0:disable,1:enable
  114366. +
  114367. +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  114368. + char adaptor_info_caching_file_path[PATH_LENGTH_MAX];
  114369. +#endif
  114370. +
  114371. +#ifdef CONFIG_LAYER2_ROAMING
  114372. + u8 max_roaming_times; // the max number driver will try to roaming
  114373. +#endif
  114374. +
  114375. +#ifdef CONFIG_IOL
  114376. + bool force_iol; //enable iol without other concern
  114377. +#endif
  114378. + u8 special_rf_path; //0: 2T2R ,1: only turn on path A 1T1R, 2: only turn on path B 1T1R
  114379. + u8 mac_phy_mode; //0:by efuse, 1:smsp, 2:dmdp, 3:dmsp.
  114380. +
  114381. +#ifdef CONFIG_80211D
  114382. + u8 enable80211d;
  114383. +#endif
  114384. +
  114385. + u8 ifname[16];
  114386. + u8 if2name[16];
  114387. +
  114388. + u8 notch_filter;
  114389. +
  114390. +#ifdef CONFIG_MULTI_VIR_IFACES
  114391. + u8 ext_iface_num;//primary/secondary iface is excluded
  114392. +#endif
  114393. +};
  114394. +
  114395. +
  114396. +//For registry parameters
  114397. +#define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field))
  114398. +#define RGTRY_SZ(field) sizeof(((struct registry_priv*) 0)->field)
  114399. +#define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field))
  114400. +#define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field)
  114401. +
  114402. +#define MAX_CONTINUAL_URB_ERR 4
  114403. +
  114404. +#ifdef CONFIG_SDIO_HCI
  114405. +#include <drv_types_sdio.h>
  114406. +#define INTF_DATA SDIO_DATA
  114407. +#endif
  114408. +
  114409. +#define GET_PRIMARY_ADAPTER(padapter) (((_adapter *)padapter)->dvobj->if1)
  114410. +
  114411. +#define GET_IFACE_NUMS(padapter) (((_adapter *)padapter)->dvobj->iface_nums)
  114412. +#define GET_ADAPTER(padapter, iface_id) (((_adapter *)padapter)->dvobj->padapters[iface_id])
  114413. +
  114414. +enum _IFACE_ID {
  114415. + IFACE_ID0, //maping to PRIMARY_ADAPTER
  114416. + IFACE_ID1, //maping to SECONDARY_ADAPTER
  114417. + IFACE_ID2,
  114418. + IFACE_ID3,
  114419. + IFACE_ID_MAX,
  114420. +};
  114421. +
  114422. +struct dvobj_priv
  114423. +{
  114424. + _adapter *if1; //PRIMARY_ADAPTER
  114425. + _adapter *if2; //SECONDARY_ADAPTER
  114426. +
  114427. + s32 processing_dev_remove;
  114428. +
  114429. + //for local/global synchronization
  114430. + _mutex hw_init_mutex;
  114431. + _mutex h2c_fwcmd_mutex;
  114432. + _mutex setch_mutex;
  114433. + _mutex setbw_mutex;
  114434. +
  114435. + unsigned char oper_channel; //saved channel info when call set_channel_bw
  114436. + unsigned char oper_bwmode;
  114437. + unsigned char oper_ch_offset;//PRIME_CHNL_OFFSET
  114438. + u32 on_oper_ch_time;
  114439. +
  114440. + //extend to support mulitu interface
  114441. + //padapters[IFACE_ID0] == if1
  114442. + //padapters[IFACE_ID1] == if2
  114443. + _adapter *padapters[IFACE_ID_MAX];
  114444. + u8 iface_nums; // total number of ifaces used runtime
  114445. +
  114446. + //For 92D, DMDP have 2 interface.
  114447. + u8 InterfaceNumber;
  114448. + u8 NumInterfaces;
  114449. + u8 DualMacMode;
  114450. + u8 irq_alloc;
  114451. +
  114452. +/*-------- below is for SDIO INTERFACE --------*/
  114453. +
  114454. +#ifdef INTF_DATA
  114455. + INTF_DATA intf_data;
  114456. +#endif
  114457. +
  114458. +/*-------- below is for USB INTERFACE --------*/
  114459. +
  114460. +#ifdef CONFIG_USB_HCI
  114461. +
  114462. + u8 nr_endpoint;
  114463. + u8 ishighspeed;
  114464. + u8 RtNumInPipes;
  114465. + u8 RtNumOutPipes;
  114466. + int ep_num[5]; //endpoint number
  114467. +
  114468. + int RegUsbSS;
  114469. +
  114470. + _sema usb_suspend_sema;
  114471. +
  114472. +#ifdef CONFIG_USB_VENDOR_REQ_MUTEX
  114473. + _mutex usb_vendor_req_mutex;
  114474. +#endif
  114475. +
  114476. +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
  114477. + u8 * usb_alloc_vendor_req_buf;
  114478. + u8 * usb_vendor_req_buf;
  114479. +#endif
  114480. +
  114481. +#ifdef PLATFORM_WINDOWS
  114482. + //related device objects
  114483. + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj;
  114484. + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj;
  114485. + PDEVICE_OBJECT pnextdevobj;//pNextDevObj;
  114486. +
  114487. + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; //= (CHAR)CEdevice->pUsbDevObj->StackSize + 1;
  114488. +
  114489. + //urb for control diescriptor request
  114490. +
  114491. +#ifdef PLATFORM_OS_XP
  114492. + struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb;
  114493. + PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;//UsbConfigurationDescriptor;
  114494. +#endif
  114495. +
  114496. +#ifdef PLATFORM_OS_CE
  114497. + WCHAR active_path[MAX_ACTIVE_REG_PATH]; // adapter regpath
  114498. + USB_EXTENSION usb_extension;
  114499. +
  114500. + _nic_hdl pipehdls_r8192c[0x10];
  114501. +#endif
  114502. +
  114503. + u32 config_descriptor_len;//ULONG UsbConfigurationDescriptorLength;
  114504. +#endif//PLATFORM_WINDOWS
  114505. +
  114506. +#ifdef PLATFORM_LINUX
  114507. + struct usb_interface *pusbintf;
  114508. + struct usb_device *pusbdev;
  114509. +#endif//PLATFORM_LINUX
  114510. +
  114511. +#ifdef PLATFORM_FREEBSD
  114512. + struct usb_interface *pusbintf;
  114513. + struct usb_device *pusbdev;
  114514. +#endif//PLATFORM_FREEBSD
  114515. + ATOMIC_T continual_urb_error;
  114516. +#endif//CONFIG_USB_HCI
  114517. +
  114518. +/*-------- below is for PCIE INTERFACE --------*/
  114519. +
  114520. +#ifdef CONFIG_PCI_HCI
  114521. +
  114522. +#ifdef PLATFORM_LINUX
  114523. + struct pci_dev *ppcidev;
  114524. +
  114525. + //PCI MEM map
  114526. + unsigned long pci_mem_end; /* shared mem end */
  114527. + unsigned long pci_mem_start; /* shared mem start */
  114528. +
  114529. + //PCI IO map
  114530. + unsigned long pci_base_addr; /* device I/O address */
  114531. +
  114532. + //PciBridge
  114533. + struct pci_priv pcipriv;
  114534. +
  114535. + u16 irqline;
  114536. + u8 irq_enabled;
  114537. + RT_ISR_CONTENT isr_content;
  114538. + _lock irq_th_lock;
  114539. +
  114540. + //ASPM
  114541. + u8 const_pci_aspm;
  114542. + u8 const_amdpci_aspm;
  114543. + u8 const_hwsw_rfoff_d3;
  114544. + u8 const_support_pciaspm;
  114545. + // pci-e bridge */
  114546. + u8 const_hostpci_aspm_setting;
  114547. + // pci-e device */
  114548. + u8 const_devicepci_aspm_setting;
  114549. + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00.
  114550. + u8 b_support_backdoor;
  114551. + u8 bdma64;
  114552. +#endif//PLATFORM_LINUX
  114553. +
  114554. +#endif//CONFIG_PCI_HCI
  114555. +};
  114556. +
  114557. +#ifdef PLATFORM_LINUX
  114558. +static struct device *dvobj_to_dev(struct dvobj_priv *dvobj)
  114559. +{
  114560. + /* todo: get interface type from dvobj and the return the dev accordingly */
  114561. +#ifdef RTW_DVOBJ_CHIP_HW_TYPE
  114562. +#endif
  114563. +
  114564. +#ifdef CONFIG_USB_HCI
  114565. + return &dvobj->pusbintf->dev;
  114566. +#endif
  114567. +#ifdef CONFIG_SDIO_HCI
  114568. + return &dvobj->intf_data.func->dev;
  114569. +#endif
  114570. +#ifdef CONFIG_PCI_HCI
  114571. + return &dvobj->ppcidev->dev;
  114572. +#endif
  114573. +}
  114574. +#endif
  114575. +
  114576. +
  114577. +enum _IFACE_TYPE {
  114578. + IFACE_PORT0, //mapping to port0 for C/D series chips
  114579. + IFACE_PORT1, //mapping to port1 for C/D series chip
  114580. + MAX_IFACE_PORT,
  114581. +};
  114582. +
  114583. +enum _ADAPTER_TYPE {
  114584. + PRIMARY_ADAPTER,
  114585. + SECONDARY_ADAPTER,
  114586. + MAX_ADAPTER = 0xFF,
  114587. +};
  114588. +
  114589. +typedef enum _DRIVER_STATE{
  114590. + DRIVER_NORMAL = 0,
  114591. + DRIVER_DISAPPEAR = 1,
  114592. + DRIVER_REPLACE_DONGLE = 2,
  114593. +}DRIVER_STATE;
  114594. +
  114595. +#ifdef CONFIG_INTEL_PROXIM
  114596. +struct proxim {
  114597. + bool proxim_support;
  114598. + bool proxim_on;
  114599. +
  114600. + void *proximity_priv;
  114601. + int (*proxim_rx)(_adapter *padapter,
  114602. + union recv_frame *precv_frame);
  114603. + u8 (*proxim_get_var)(_adapter* padapter, u8 type);
  114604. +};
  114605. +#endif //CONFIG_INTEL_PROXIM
  114606. +
  114607. +#ifdef RTL8723A_SDIO_LOOPBACK
  114608. +typedef struct loopbackdata
  114609. +{
  114610. + _sema sema;
  114611. + _thread_hdl_ lbkthread;
  114612. + u8 bstop;
  114613. + u32 cnt;
  114614. + u16 size;
  114615. + u16 txsize;
  114616. + u8 txbuf[0x8000];
  114617. + u16 rxsize;
  114618. + u8 rxbuf[0x8000];
  114619. + u8 msg[100];
  114620. +
  114621. +}LOOPBACKDATA, *PLOOPBACKDATA;
  114622. +#endif
  114623. +
  114624. +struct _ADAPTER{
  114625. + int DriverState;// for disable driver using module, use dongle to replace module.
  114626. + int pid[3];//process id from UI, 0:wps, 1:hostapd, 2:dhcpcd
  114627. + int bDongle;//build-in module or external dongle
  114628. + u16 chip_type;
  114629. + u16 HardwareType;
  114630. + u16 interface_type;//USB,SDIO,PCI
  114631. +
  114632. + struct dvobj_priv *dvobj;
  114633. + struct mlme_priv mlmepriv;
  114634. + struct mlme_ext_priv mlmeextpriv;
  114635. + struct cmd_priv cmdpriv;
  114636. + struct evt_priv evtpriv;
  114637. + //struct io_queue *pio_queue;
  114638. + struct io_priv iopriv;
  114639. + struct xmit_priv xmitpriv;
  114640. + struct recv_priv recvpriv;
  114641. + struct sta_priv stapriv;
  114642. + struct security_priv securitypriv;
  114643. + _lock security_key_mutex; // add for CONFIG_IEEE80211W, none 11w also can use
  114644. + struct registry_priv registrypriv;
  114645. + struct pwrctrl_priv pwrctrlpriv;
  114646. + struct eeprom_priv eeprompriv;
  114647. + struct led_priv ledpriv;
  114648. +
  114649. +#ifdef CONFIG_MP_INCLUDED
  114650. + struct mp_priv mppriv;
  114651. +#endif
  114652. +
  114653. +#ifdef CONFIG_DRVEXT_MODULE
  114654. + struct drvext_priv drvextpriv;
  114655. +#endif
  114656. +
  114657. +#ifdef CONFIG_AP_MODE
  114658. + struct hostapd_priv *phostapdpriv;
  114659. +#endif
  114660. +
  114661. +#ifdef CONFIG_IOCTL_CFG80211
  114662. +#ifdef CONFIG_P2P
  114663. + struct cfg80211_wifidirect_info cfg80211_wdinfo;
  114664. +#endif //CONFIG_P2P
  114665. +#endif //CONFIG_IOCTL_CFG80211
  114666. + u32 setband;
  114667. +#ifdef CONFIG_P2P
  114668. + struct wifidirect_info wdinfo;
  114669. +#endif //CONFIG_P2P
  114670. +
  114671. +#ifdef CONFIG_TDLS
  114672. + struct tdls_info tdlsinfo;
  114673. +#endif //CONFIG_TDLS
  114674. +
  114675. +#ifdef CONFIG_WFD
  114676. + struct wifi_display_info wfd_info;
  114677. +#endif //CONFIG_WFD
  114678. +
  114679. + PVOID HalData;
  114680. + u32 hal_data_sz;
  114681. + struct hal_ops HalFunc;
  114682. +
  114683. +#ifdef CONFIG_BT_COEXIST
  114684. + //struct btcoexist_priv bt_coexist;
  114685. +#endif
  114686. + s32 bDriverStopped;
  114687. + s32 bSurpriseRemoved;
  114688. + s32 bCardDisableWOHSM;
  114689. +
  114690. + u32 IsrContent;
  114691. + u32 ImrContent;
  114692. +
  114693. + u8 EepromAddressSize;
  114694. + u8 hw_init_completed;
  114695. + u8 bDriverIsGoingToUnload;
  114696. + u8 init_adpt_in_progress;
  114697. + u8 bHaltInProgress;
  114698. +
  114699. + _thread_hdl_ cmdThread;
  114700. + _thread_hdl_ evtThread;
  114701. + _thread_hdl_ xmitThread;
  114702. + _thread_hdl_ recvThread;
  114703. +
  114704. +#ifndef PLATFORM_LINUX
  114705. + NDIS_STATUS (*dvobj_init)(struct dvobj_priv *dvobj);
  114706. + void (*dvobj_deinit)(struct dvobj_priv *dvobj);
  114707. +#endif
  114708. +
  114709. + void (*intf_start)(_adapter * adapter);
  114710. + void (*intf_stop)(_adapter * adapter);
  114711. +
  114712. +#ifdef PLATFORM_WINDOWS
  114713. + _nic_hdl hndis_adapter;//hNdisAdapter(NDISMiniportAdapterHandle);
  114714. + _nic_hdl hndis_config;//hNdisConfiguration;
  114715. + NDIS_STRING fw_img;
  114716. +
  114717. + u32 NdisPacketFilter;
  114718. + u8 MCList[MAX_MCAST_LIST_NUM][6];
  114719. + u32 MCAddrCount;
  114720. +#endif //end of PLATFORM_WINDOWS
  114721. +
  114722. +
  114723. +#ifdef PLATFORM_LINUX
  114724. + _nic_hdl pnetdev;
  114725. +
  114726. + // used by rtw_rereg_nd_name related function
  114727. + struct rereg_nd_name_data {
  114728. + _nic_hdl old_pnetdev;
  114729. + char old_ifname[IFNAMSIZ];
  114730. + u8 old_ips_mode;
  114731. + u8 old_bRegUseLed;
  114732. + } rereg_nd_name_priv;
  114733. +
  114734. + int bup;
  114735. + struct net_device_stats stats;
  114736. + struct iw_statistics iwstats;
  114737. + struct proc_dir_entry *dir_dev;// for proc directory
  114738. +
  114739. +#ifdef CONFIG_IOCTL_CFG80211
  114740. + struct wireless_dev *rtw_wdev;
  114741. +#endif //CONFIG_IOCTL_CFG80211
  114742. +
  114743. +#endif //end of PLATFORM_LINUX
  114744. +
  114745. +#ifdef PLATFORM_FREEBSD
  114746. + _nic_hdl pifp;
  114747. + int bup;
  114748. + _lock glock;
  114749. +#endif //PLATFORM_FREEBSD
  114750. + int net_closed;
  114751. +
  114752. + u8 bFWReady;
  114753. + u8 bReadPortCancel;
  114754. + u8 bWritePortCancel;
  114755. + u8 bRxRSSIDisplay;
  114756. + // Added by Albert 2012/07/26
  114757. + // The driver will write the initial gain everytime when running in the DM_Write_DIG function.
  114758. + u8 bForceWriteInitGain;
  114759. + // Added by Albert 2012/10/26
  114760. + // The driver will show up the desired channel number when this flag is 1.
  114761. + u8 bNotifyChannelChange;
  114762. +#ifdef CONFIG_P2P
  114763. + // Added by Albert 2012/12/06
  114764. + // The driver will show the current P2P status when the upper application reads it.
  114765. + u8 bShowGetP2PState;
  114766. +#endif
  114767. +#ifdef CONFIG_AUTOSUSPEND
  114768. + u8 bDisableAutosuspend;
  114769. +#endif
  114770. +
  114771. + //pbuddy_adapter is used only in two inteface case, (iface_nums=2 in struct dvobj_priv)
  114772. + //PRIMARY_ADAPTER's buddy is SECONDARY_ADAPTER
  114773. + //SECONDARY_ADAPTER's buddy is PRIMARY_ADAPTER
  114774. + //for iface_id > SECONDARY_ADAPTER(IFACE_ID1), refer to padapters[iface_id] in struct dvobj_priv
  114775. + //and their pbuddy_adapter is PRIMARY_ADAPTER.
  114776. + //for PRIMARY_ADAPTER(IFACE_ID0) can directly refer to if1 in struct dvobj_priv
  114777. + _adapter *pbuddy_adapter;
  114778. +
  114779. +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT)
  114780. + u8 isprimary; //is primary adapter or not
  114781. + //notes:
  114782. + // if isprimary is true, the adapter_type value is 0, iface_id is IFACE_ID0 for PRIMARY_ADAPTER
  114783. + // if isprimary is false, the adapter_type value is 1, iface_id is IFACE_ID1 for SECONDARY_ADAPTER
  114784. + // refer to iface_id if iface_nums>2 and isprimary is false and the adapter_type value is 0xff.
  114785. + u8 adapter_type;//used only in two inteface case(PRIMARY_ADAPTER and SECONDARY_ADAPTER) .
  114786. + u8 iface_type; //interface port type, it depends on HW port
  114787. +#endif
  114788. +
  114789. + //extend to support multi interface
  114790. + //IFACE_ID0 is equals to PRIMARY_ADAPTER
  114791. + //IFACE_ID1 is equals to SECONDARY_ADAPTER
  114792. + u8 iface_id;
  114793. +
  114794. +#ifdef CONFIG_DUALMAC_CONCURRENT
  114795. + u8 DualMacConcurrent; // 1: DMSP 0:DMDP
  114796. +#endif
  114797. +
  114798. +#ifdef CONFIG_BR_EXT
  114799. + _lock br_ext_lock;
  114800. + //unsigned int macclone_completed;
  114801. + struct nat25_network_db_entry *nethash[NAT25_HASH_SIZE];
  114802. + int pppoe_connection_in_progress;
  114803. + unsigned char pppoe_addr[MACADDRLEN];
  114804. + unsigned char scdb_mac[MACADDRLEN];
  114805. + unsigned char scdb_ip[4];
  114806. + struct nat25_network_db_entry *scdb_entry;
  114807. + unsigned char br_mac[MACADDRLEN];
  114808. + unsigned char br_ip[4];
  114809. +
  114810. + struct br_ext_info ethBrExtInfo;
  114811. +#endif // CONFIG_BR_EXT
  114812. +
  114813. +#ifdef CONFIG_INTEL_PROXIM
  114814. + /* intel Proximity, should be alloc mem
  114815. + * in intel Proximity module and can only
  114816. + * be used in intel Proximity mode */
  114817. + struct proxim proximity;
  114818. +#endif //CONFIG_INTEL_PROXIM
  114819. +
  114820. +#ifdef RTL8723A_SDIO_LOOPBACK
  114821. + PLOOPBACKDATA ploopback;
  114822. +#endif
  114823. +
  114824. +};
  114825. +
  114826. +#define adapter_to_dvobj(adapter) (adapter->dvobj)
  114827. +
  114828. +int rtw_handle_dualmac(_adapter *adapter, bool init);
  114829. +
  114830. +__inline static u8 *myid(struct eeprom_priv *peepriv)
  114831. +{
  114832. + return (peepriv->mac_addr);
  114833. +}
  114834. +
  114835. +
  114836. +#endif //__DRV_TYPES_H__
  114837. --- /dev/null
  114838. +++ b/drivers/net/wireless/rtl8192cu/include/drv_types_ce.h
  114839. @@ -0,0 +1,92 @@
  114840. +/******************************************************************************
  114841. + *
  114842. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114843. + *
  114844. + * This program is free software; you can redistribute it and/or modify it
  114845. + * under the terms of version 2 of the GNU General Public License as
  114846. + * published by the Free Software Foundation.
  114847. + *
  114848. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114849. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114850. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114851. + * more details.
  114852. + *
  114853. + * You should have received a copy of the GNU General Public License along with
  114854. + * this program; if not, write to the Free Software Foundation, Inc.,
  114855. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114856. + *
  114857. + *
  114858. + ******************************************************************************/
  114859. +#ifndef __DRV_TYPES_CE_H__
  114860. +#define __DRV_TYPES_CE_H__
  114861. +
  114862. +#include <drv_conf.h>
  114863. +#include <osdep_service.h>
  114864. +
  114865. +#include <Sdcardddk.h>
  114866. +
  114867. +#define MAX_ACTIVE_REG_PATH 256
  114868. +
  114869. +#define MAX_MCAST_LIST_NUM 32
  114870. +
  114871. +
  114872. +
  114873. +//for ioctl
  114874. +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer)
  114875. +
  114876. +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h
  114877. +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h
  114878. +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h
  114879. +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h
  114880. +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h
  114881. +
  114882. +typedef struct _MP_REG_ENTRY
  114883. +{
  114884. +
  114885. + NDIS_STRING RegName; // variable name text
  114886. + BOOLEAN bRequired; // 1 -> required, 0 -> optional
  114887. +
  114888. + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString
  114889. + uint FieldOffset; // offset to MP_ADAPTER field
  114890. + uint FieldSize; // size (in bytes) of the field
  114891. +
  114892. +#ifdef UNDER_AMD64
  114893. + u64 Default;
  114894. +#else
  114895. + u32 Default; // default value to use
  114896. +#endif
  114897. +
  114898. + u32 Min; // minimum value allowed
  114899. + u32 Max; // maximum value allowed
  114900. +} MP_REG_ENTRY, *PMP_REG_ENTRY;
  114901. +
  114902. +#ifdef CONFIG_USB_HCI
  114903. +typedef struct _USB_EXTENSION {
  114904. + LPCUSB_FUNCS _lpUsbFuncs;
  114905. + USB_HANDLE _hDevice;
  114906. + PVOID pAdapter;
  114907. +
  114908. +#if 0
  114909. + USB_ENDPOINT_DESCRIPTOR _endpACLIn;
  114910. + USB_ENDPOINT_DESCRIPTOR _endpACLOutHigh;
  114911. + USB_ENDPOINT_DESCRIPTOR _endpACLOutNormal;
  114912. +
  114913. + USB_PIPE pPipeIn;
  114914. + USB_PIPE pPipeOutNormal;
  114915. + USB_PIPE pPipeOutHigh;
  114916. +#endif
  114917. +
  114918. +} USB_EXTENSION, *PUSB_EXTENSION;
  114919. +#endif
  114920. +
  114921. +
  114922. +typedef struct _OCTET_STRING{
  114923. + u8 *Octet;
  114924. + u16 Length;
  114925. +} OCTET_STRING, *POCTET_STRING;
  114926. +
  114927. +
  114928. +
  114929. +
  114930. +
  114931. +#endif
  114932. --- /dev/null
  114933. +++ b/drivers/net/wireless/rtl8192cu/include/drv_types_linux.h
  114934. @@ -0,0 +1,24 @@
  114935. +/******************************************************************************
  114936. + *
  114937. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114938. + *
  114939. + * This program is free software; you can redistribute it and/or modify it
  114940. + * under the terms of version 2 of the GNU General Public License as
  114941. + * published by the Free Software Foundation.
  114942. + *
  114943. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114944. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114945. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114946. + * more details.
  114947. + *
  114948. + * You should have received a copy of the GNU General Public License along with
  114949. + * this program; if not, write to the Free Software Foundation, Inc.,
  114950. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114951. + *
  114952. + *
  114953. + ******************************************************************************/
  114954. +#ifndef __DRV_TYPES_LINUX_H__
  114955. +#define __DRV_TYPES_LINUX_H__
  114956. +
  114957. +
  114958. +#endif
  114959. --- /dev/null
  114960. +++ b/drivers/net/wireless/rtl8192cu/include/drv_types_sdio.h
  114961. @@ -0,0 +1,69 @@
  114962. +/******************************************************************************
  114963. + *
  114964. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  114965. + *
  114966. + * This program is free software; you can redistribute it and/or modify it
  114967. + * under the terms of version 2 of the GNU General Public License as
  114968. + * published by the Free Software Foundation.
  114969. + *
  114970. + * This program is distributed in the hope that it will be useful, but WITHOUT
  114971. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  114972. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  114973. + * more details.
  114974. + *
  114975. + * You should have received a copy of the GNU General Public License along with
  114976. + * this program; if not, write to the Free Software Foundation, Inc.,
  114977. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  114978. + *
  114979. + *
  114980. + ******************************************************************************/
  114981. +#ifndef __DRV_TYPES_SDIO_H__
  114982. +#define __DRV_TYPES_SDIO_H__
  114983. +
  114984. +#include <drv_conf.h>
  114985. +#include <basic_types.h>
  114986. +
  114987. +// SDIO Header Files
  114988. +#ifdef PLATFORM_LINUX
  114989. +#include <linux/mmc/sdio_func.h>
  114990. +#endif
  114991. +#ifdef PLATFORM_OS_XP
  114992. +#include <wdm.h>
  114993. +#include <ntddsd.h>
  114994. +#endif
  114995. +#ifdef PLATFORM_OS_CE
  114996. +#include <sdcardddk.h>
  114997. +#endif
  114998. +
  114999. +
  115000. +typedef struct sdio_data
  115001. +{
  115002. + u8 func_number;
  115003. +
  115004. + u8 tx_block_mode;
  115005. + u8 rx_block_mode;
  115006. + u32 block_transfer_len;
  115007. +
  115008. +#ifdef PLATFORM_LINUX
  115009. + struct sdio_func *func;
  115010. +#endif
  115011. +
  115012. +#ifdef PLATFORM_OS_XP
  115013. + PDEVICE_OBJECT pphysdevobj;
  115014. + PDEVICE_OBJECT pfuncdevobj;
  115015. + PDEVICE_OBJECT pnextdevobj;
  115016. + SDBUS_INTERFACE_STANDARD sdbusinft;
  115017. + u8 nextdevstacksz;
  115018. +#endif
  115019. +
  115020. +#ifdef PLATFORM_OS_CE
  115021. + SD_DEVICE_HANDLE hDevice;
  115022. + SD_CARD_RCA sd_rca;
  115023. + SD_CARD_INTERFACE card_intf;
  115024. + BOOLEAN enableIsarWithStatus;
  115025. + WCHAR active_path[MAX_ACTIVE_REG_PATH];
  115026. + SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap;
  115027. +#endif
  115028. +} SDIO_DATA, *PSDIO_DATA;
  115029. +
  115030. +#endif
  115031. --- /dev/null
  115032. +++ b/drivers/net/wireless/rtl8192cu/include/drv_types_xp.h
  115033. @@ -0,0 +1,94 @@
  115034. +/******************************************************************************
  115035. + *
  115036. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  115037. + *
  115038. + * This program is free software; you can redistribute it and/or modify it
  115039. + * under the terms of version 2 of the GNU General Public License as
  115040. + * published by the Free Software Foundation.
  115041. + *
  115042. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115043. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115044. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115045. + * more details.
  115046. + *
  115047. + * You should have received a copy of the GNU General Public License along with
  115048. + * this program; if not, write to the Free Software Foundation, Inc.,
  115049. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115050. + *
  115051. + *
  115052. + ******************************************************************************/
  115053. +#ifndef __DRV_TYPES_XP_H__
  115054. +#define __DRV_TYPES_XP_H__
  115055. +
  115056. +#include <drv_conf.h>
  115057. +#include <osdep_service.h>
  115058. +
  115059. +
  115060. +
  115061. +#define MAX_MCAST_LIST_NUM 32
  115062. +
  115063. +
  115064. +
  115065. +//for ioctl
  115066. +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer)
  115067. +
  115068. +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h
  115069. +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h
  115070. +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h
  115071. +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h
  115072. +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h
  115073. +
  115074. +
  115075. +#undef ON_VISTA
  115076. +//added by Jackson
  115077. +#ifndef ON_VISTA
  115078. +//
  115079. +// Bus driver versions
  115080. +//
  115081. +
  115082. +#define SDBUS_DRIVER_VERSION_1 0x100
  115083. +#define SDBUS_DRIVER_VERSION_2 0x200
  115084. +
  115085. +#define SDP_FUNCTION_TYPE 4
  115086. +#define SDP_BUS_DRIVER_VERSION 5
  115087. +#define SDP_BUS_WIDTH 6
  115088. +#define SDP_BUS_CLOCK 7
  115089. +#define SDP_BUS_INTERFACE_CONTROL 8
  115090. +#define SDP_HOST_BLOCK_LENGTH 9
  115091. +#define SDP_FUNCTION_BLOCK_LENGTH 10
  115092. +#define SDP_FN0_BLOCK_LENGTH 11
  115093. +#define SDP_FUNCTION_INT_ENABLE 12
  115094. +#endif
  115095. +
  115096. +
  115097. +typedef struct _MP_REG_ENTRY
  115098. +{
  115099. +
  115100. + NDIS_STRING RegName; // variable name text
  115101. + BOOLEAN bRequired; // 1 -> required, 0 -> optional
  115102. +
  115103. + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString
  115104. + uint FieldOffset; // offset to MP_ADAPTER field
  115105. + uint FieldSize; // size (in bytes) of the field
  115106. +
  115107. +#ifdef UNDER_AMD64
  115108. + u64 Default;
  115109. +#else
  115110. + u32 Default; // default value to use
  115111. +#endif
  115112. +
  115113. + u32 Min; // minimum value allowed
  115114. + u32 Max; // maximum value allowed
  115115. +} MP_REG_ENTRY, *PMP_REG_ENTRY;
  115116. +
  115117. +
  115118. +typedef struct _OCTET_STRING{
  115119. + u8 *Octet;
  115120. + u16 Length;
  115121. +} OCTET_STRING, *POCTET_STRING;
  115122. +
  115123. +
  115124. +
  115125. +
  115126. +
  115127. +#endif
  115128. --- /dev/null
  115129. +++ b/drivers/net/wireless/rtl8192cu/include/ethernet.h
  115130. @@ -0,0 +1,41 @@
  115131. +/******************************************************************************
  115132. + *
  115133. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  115134. + *
  115135. + * This program is free software; you can redistribute it and/or modify it
  115136. + * under the terms of version 2 of the GNU General Public License as
  115137. + * published by the Free Software Foundation.
  115138. + *
  115139. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115140. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115141. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115142. + * more details.
  115143. + *
  115144. + * You should have received a copy of the GNU General Public License along with
  115145. + * this program; if not, write to the Free Software Foundation, Inc.,
  115146. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115147. + *
  115148. + *
  115149. + ******************************************************************************/
  115150. +/*! \file */
  115151. +#ifndef __INC_ETHERNET_H
  115152. +#define __INC_ETHERNET_H
  115153. +
  115154. +#define ETHERNET_ADDRESS_LENGTH 6 //!< Ethernet Address Length
  115155. +#define ETHERNET_HEADER_SIZE 14 //!< Ethernet Header Length
  115156. +#define LLC_HEADER_SIZE 6 //!< LLC Header Length
  115157. +#define TYPE_LENGTH_FIELD_SIZE 2 //!< Type/Length Size
  115158. +#define MINIMUM_ETHERNET_PACKET_SIZE 60 //!< Minimum Ethernet Packet Size
  115159. +#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 //!< Maximum Ethernet Packet Size
  115160. +
  115161. +#define RT_ETH_IS_MULTICAST(_pAddr) ((((UCHAR *)(_pAddr))[0]&0x01)!=0) //!< Is Multicast Address?
  115162. +#define RT_ETH_IS_BROADCAST(_pAddr) ( \
  115163. + ((UCHAR *)(_pAddr))[0]==0xff && \
  115164. + ((UCHAR *)(_pAddr))[1]==0xff && \
  115165. + ((UCHAR *)(_pAddr))[2]==0xff && \
  115166. + ((UCHAR *)(_pAddr))[3]==0xff && \
  115167. + ((UCHAR *)(_pAddr))[4]==0xff && \
  115168. + ((UCHAR *)(_pAddr))[5]==0xff ) //!< Is Broadcast Address?
  115169. +
  115170. +
  115171. +#endif // #ifndef __INC_ETHERNET_H
  115172. --- /dev/null
  115173. +++ b/drivers/net/wireless/rtl8192cu/include/h2clbk.h
  115174. @@ -0,0 +1,35 @@
  115175. +/******************************************************************************
  115176. + *
  115177. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  115178. + *
  115179. + * This program is free software; you can redistribute it and/or modify it
  115180. + * under the terms of version 2 of the GNU General Public License as
  115181. + * published by the Free Software Foundation.
  115182. + *
  115183. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115184. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115185. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115186. + * more details.
  115187. + *
  115188. + * You should have received a copy of the GNU General Public License along with
  115189. + * this program; if not, write to the Free Software Foundation, Inc.,
  115190. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115191. + *
  115192. + *
  115193. + ******************************************************************************/
  115194. +
  115195. +
  115196. +#define _H2CLBK_H_
  115197. +
  115198. +
  115199. +#include <rtl8711_spec.h>
  115200. +#include <TypeDef.h>
  115201. +
  115202. +
  115203. +void _lbk_cmd(PADAPTER Adapter);
  115204. +
  115205. +void _lbk_rsp(PADAPTER Adapter);
  115206. +
  115207. +void _lbk_evt(IN PADAPTER Adapter);
  115208. +
  115209. +void h2c_event_callback(unsigned char *dev, unsigned char *pbuf);
  115210. --- /dev/null
  115211. +++ b/drivers/net/wireless/rtl8192cu/include/hal_com.h
  115212. @@ -0,0 +1,145 @@
  115213. +/******************************************************************************
  115214. + *
  115215. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  115216. + *
  115217. + * This program is free software; you can redistribute it and/or modify it
  115218. + * under the terms of version 2 of the GNU General Public License as
  115219. + * published by the Free Software Foundation.
  115220. + *
  115221. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115222. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115223. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115224. + * more details.
  115225. + *
  115226. + * You should have received a copy of the GNU General Public License along with
  115227. + * this program; if not, write to the Free Software Foundation, Inc.,
  115228. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115229. + *
  115230. + *
  115231. + ******************************************************************************/
  115232. +#ifndef __HAL_COMMON_H__
  115233. +#define __HAL_COMMON_H__
  115234. +
  115235. +//CCK
  115236. +#define RATE_1M BIT(0)
  115237. +#define RATE_2M BIT(1)
  115238. +#define RATE_5_5M BIT(2)
  115239. +#define RATE_11M BIT(3)
  115240. +//OFDM
  115241. +#define RATE_6M BIT(4)
  115242. +#define RATE_9M BIT(5)
  115243. +#define RATE_12M BIT(6)
  115244. +#define RATE_18M BIT(7)
  115245. +#define RATE_24M BIT(8)
  115246. +#define RATE_36M BIT(9)
  115247. +#define RATE_48M BIT(10)
  115248. +#define RATE_54M BIT(11)
  115249. +//MCS 1 Spatial Stream
  115250. +#define RATE_MCS0 BIT(12)
  115251. +#define RATE_MCS1 BIT(13)
  115252. +#define RATE_MCS2 BIT(14)
  115253. +#define RATE_MCS3 BIT(15)
  115254. +#define RATE_MCS4 BIT(16)
  115255. +#define RATE_MCS5 BIT(17)
  115256. +#define RATE_MCS6 BIT(18)
  115257. +#define RATE_MCS7 BIT(19)
  115258. +//MCS 2 Spatial Stream
  115259. +#define RATE_MCS8 BIT(20)
  115260. +#define RATE_MCS9 BIT(21)
  115261. +#define RATE_MCS10 BIT(22)
  115262. +#define RATE_MCS11 BIT(23)
  115263. +#define RATE_MCS12 BIT(24)
  115264. +#define RATE_MCS13 BIT(25)
  115265. +#define RATE_MCS14 BIT(26)
  115266. +#define RATE_MCS15 BIT(27)
  115267. +
  115268. +// ALL CCK Rate
  115269. +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M
  115270. +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\
  115271. + RATR_36M|RATR_48M|RATR_54M
  115272. +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\
  115273. + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7
  115274. +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\
  115275. + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15
  115276. +
  115277. +/*------------------------------ Tx Desc definition Macro ------------------------*/
  115278. +//#pragma mark -- Tx Desc related definition. --
  115279. +//----------------------------------------------------------------------------
  115280. +//-----------------------------------------------------------
  115281. +// Rate
  115282. +//-----------------------------------------------------------
  115283. +// CCK Rates, TxHT = 0
  115284. +#define DESC_RATE1M 0x00
  115285. +#define DESC_RATE2M 0x01
  115286. +#define DESC_RATE5_5M 0x02
  115287. +#define DESC_RATE11M 0x03
  115288. +
  115289. +// OFDM Rates, TxHT = 0
  115290. +#define DESC_RATE6M 0x04
  115291. +#define DESC_RATE9M 0x05
  115292. +#define DESC_RATE12M 0x06
  115293. +#define DESC_RATE18M 0x07
  115294. +#define DESC_RATE24M 0x08
  115295. +#define DESC_RATE36M 0x09
  115296. +#define DESC_RATE48M 0x0a
  115297. +#define DESC_RATE54M 0x0b
  115298. +
  115299. +// MCS Rates, TxHT = 1
  115300. +#define DESC_RATEMCS0 0x0c
  115301. +#define DESC_RATEMCS1 0x0d
  115302. +#define DESC_RATEMCS2 0x0e
  115303. +#define DESC_RATEMCS3 0x0f
  115304. +#define DESC_RATEMCS4 0x10
  115305. +#define DESC_RATEMCS5 0x11
  115306. +#define DESC_RATEMCS6 0x12
  115307. +#define DESC_RATEMCS7 0x13
  115308. +#define DESC_RATEMCS8 0x14
  115309. +#define DESC_RATEMCS9 0x15
  115310. +#define DESC_RATEMCS10 0x16
  115311. +#define DESC_RATEMCS11 0x17
  115312. +#define DESC_RATEMCS12 0x18
  115313. +#define DESC_RATEMCS13 0x19
  115314. +#define DESC_RATEMCS14 0x1a
  115315. +#define DESC_RATEMCS15 0x1b
  115316. +#define DESC_RATEMCS15_SG 0x1c
  115317. +#define DESC_RATEMCS32 0x20
  115318. +
  115319. +//============================================================
  115320. +// Global var
  115321. +//============================================================
  115322. +#define OFDM_TABLE_SIZE_92C 37
  115323. +#define OFDM_TABLE_SIZE_92D 43
  115324. +#define CCK_TABLE_SIZE 33
  115325. +
  115326. +extern u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] ;
  115327. +
  115328. +extern u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8];
  115329. +
  115330. +extern u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8];
  115331. +
  115332. +#ifdef CONFIG_CHIP_VER_INTEGRATION
  115333. +void dump_chip_info(HAL_VERSION ChipVersion);
  115334. +#endif
  115335. +
  115336. +u8 //return the final channel plan decision
  115337. +hal_com_get_channel_plan(
  115338. + IN PADAPTER padapter,
  115339. + IN u8 hw_channel_plan, //channel plan from HW (efuse/eeprom)
  115340. + IN u8 sw_channel_plan, //channel plan from SW (registry/module param)
  115341. + IN u8 def_channel_plan, //channel plan used when the former two is invalid
  115342. + IN BOOLEAN AutoLoadFail
  115343. + );
  115344. +
  115345. +void HalSetBrateCfg(
  115346. + IN PADAPTER Adapter,
  115347. + IN u8 *mBratesOS,
  115348. + OUT u16 *pBrateCfg);
  115349. +
  115350. +u8 MRateToHwRate(u8 rate);
  115351. +
  115352. +void hal_init_macaddr(_adapter *adapter);
  115353. +
  115354. +void c2h_evt_clear(_adapter *adapter);
  115355. +s32 c2h_evt_read(_adapter *adapter, u8 *buf);
  115356. +
  115357. +#endif //__HAL_COMMON_H__
  115358. --- /dev/null
  115359. +++ b/drivers/net/wireless/rtl8192cu/include/hal_intf.h
  115360. @@ -0,0 +1,431 @@
  115361. +/******************************************************************************
  115362. + *
  115363. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  115364. + *
  115365. + * This program is free software; you can redistribute it and/or modify it
  115366. + * under the terms of version 2 of the GNU General Public License as
  115367. + * published by the Free Software Foundation.
  115368. + *
  115369. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115370. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115371. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115372. + * more details.
  115373. + *
  115374. + * You should have received a copy of the GNU General Public License along with
  115375. + * this program; if not, write to the Free Software Foundation, Inc.,
  115376. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115377. + *
  115378. + *
  115379. + ******************************************************************************/
  115380. +#ifndef __HAL_INTF_H__
  115381. +#define __HAL_INTF_H__
  115382. +
  115383. +#include <drv_conf.h>
  115384. +#include <osdep_service.h>
  115385. +#include <drv_types.h>
  115386. +
  115387. +#ifdef CONFIG_PCI_HCI
  115388. +#include <pci_hal.h>
  115389. +#endif
  115390. +
  115391. +
  115392. +enum RTL871X_HCI_TYPE {
  115393. +
  115394. + RTW_SDIO,
  115395. + RTW_USB,
  115396. + RTW_PCIE
  115397. +};
  115398. +
  115399. +enum _CHIP_TYPE {
  115400. +
  115401. + NULL_CHIP_TYPE,
  115402. + RTL8712_8188S_8191S_8192S,
  115403. + RTL8188C_8192C,
  115404. + RTL8192D,
  115405. + RTL8723A,
  115406. + RTL8188E,
  115407. + MAX_CHIP_TYPE
  115408. +};
  115409. +
  115410. +
  115411. +typedef enum _HW_VARIABLES{
  115412. + HW_VAR_MEDIA_STATUS,
  115413. + HW_VAR_MEDIA_STATUS1,
  115414. + HW_VAR_SET_OPMODE,
  115415. + HW_VAR_MAC_ADDR,
  115416. + HW_VAR_BSSID,
  115417. + HW_VAR_INIT_RTS_RATE,
  115418. + HW_VAR_INIT_DATA_RATE,
  115419. + HW_VAR_BASIC_RATE,
  115420. + HW_VAR_TXPAUSE,
  115421. + HW_VAR_BCN_FUNC,
  115422. + HW_VAR_CORRECT_TSF,
  115423. + HW_VAR_CHECK_BSSID,
  115424. + HW_VAR_MLME_DISCONNECT,
  115425. + HW_VAR_MLME_SITESURVEY,
  115426. + HW_VAR_MLME_JOIN,
  115427. + HW_VAR_ON_RCR_AM,
  115428. + HW_VAR_OFF_RCR_AM,
  115429. + HW_VAR_BEACON_INTERVAL,
  115430. + HW_VAR_SLOT_TIME,
  115431. + HW_VAR_RESP_SIFS,
  115432. + HW_VAR_ACK_PREAMBLE,
  115433. + HW_VAR_SEC_CFG,
  115434. + HW_VAR_BCN_VALID,
  115435. + HW_VAR_RF_TYPE,
  115436. + HW_VAR_DM_FLAG,
  115437. + HW_VAR_DM_FUNC_OP,
  115438. + HW_VAR_DM_FUNC_SET,
  115439. + HW_VAR_DM_FUNC_CLR,
  115440. + HW_VAR_DM_INIT_PWDB,
  115441. + HW_VAR_CAM_EMPTY_ENTRY,
  115442. + HW_VAR_CAM_INVALID_ALL,
  115443. + HW_VAR_CAM_WRITE,
  115444. + HW_VAR_CAM_READ,
  115445. + HW_VAR_AC_PARAM_VO,
  115446. + HW_VAR_AC_PARAM_VI,
  115447. + HW_VAR_AC_PARAM_BE,
  115448. + HW_VAR_AC_PARAM_BK,
  115449. + HW_VAR_ACM_CTRL,
  115450. + HW_VAR_AMPDU_MIN_SPACE,
  115451. + HW_VAR_AMPDU_FACTOR,
  115452. + HW_VAR_RXDMA_AGG_PG_TH,
  115453. + HW_VAR_SET_RPWM,
  115454. + HW_VAR_H2C_FW_PWRMODE,
  115455. + HW_VAR_H2C_FW_JOINBSSRPT,
  115456. + HW_VAR_FWLPS_RF_ON,
  115457. + HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
  115458. + HW_VAR_TDLS_WRCR,
  115459. + HW_VAR_TDLS_INIT_CH_SEN,
  115460. + HW_VAR_TDLS_RS_RCR,
  115461. + HW_VAR_TDLS_DONE_CH_SEN,
  115462. + HW_VAR_INITIAL_GAIN,
  115463. + HW_VAR_TRIGGER_GPIO_0,
  115464. + HW_VAR_BT_SET_COEXIST,
  115465. + HW_VAR_BT_ISSUE_DELBA,
  115466. + HW_VAR_CURRENT_ANTENNA,
  115467. + HW_VAR_ANTENNA_DIVERSITY_LINK,
  115468. + HW_VAR_ANTENNA_DIVERSITY_SELECT,
  115469. + HW_VAR_SWITCH_EPHY_WoWLAN,
  115470. + HW_VAR_EFUSE_BYTES,
  115471. + HW_VAR_FIFO_CLEARN_UP,
  115472. + HW_VAR_CHECK_TXBUF,
  115473. + HW_VAR_APFM_ON_MAC, //Auto FSM to Turn On, include clock, isolation, power control for MAC only
  115474. + HW_VAR_WOWLAN,
  115475. + HW_VAR_VID,
  115476. + HW_VAR_PID,
  115477. + HW_VAR_MBSSID_CAM_WRITE,
  115478. + HW_VAR_MBSSID_CAM_CLEAR,
  115479. + HW_VAR_RCR_MBSSID_EN,
  115480. + HW_VAR_USB_RXAGG_PAGE_TO,
  115481. +}HW_VARIABLES;
  115482. +
  115483. +typedef enum _HAL_DEF_VARIABLE{
  115484. + HAL_DEF_UNDERCORATEDSMOOTHEDPWDB,
  115485. + HAL_DEF_IS_SUPPORT_ANT_DIV,
  115486. + HAL_DEF_CURRENT_ANTENNA,
  115487. + HAL_DEF_DRVINFO_SZ,
  115488. + HAL_DEF_MAX_RECVBUF_SZ,
  115489. + HAL_DEF_RX_PACKET_OFFSET,
  115490. + HAL_DEF_DBG_DUMP_RXPKT,//for dbg
  115491. + HAL_DEF_DBG_DM_FUNC,//for dbg
  115492. + HAL_DEF_DUAL_MAC_MODE,
  115493. +}HAL_DEF_VARIABLE;
  115494. +
  115495. +typedef enum _HAL_INTF_PS_FUNC{
  115496. + HAL_USB_SELECT_SUSPEND,
  115497. + HAL_MAX_ID,
  115498. +}HAL_INTF_PS_FUNC;
  115499. +
  115500. +typedef s32 (*c2h_id_filter)(u8 id);
  115501. +
  115502. +struct hal_ops {
  115503. + u32 (*hal_init)(PADAPTER Adapter);
  115504. + u32 (*hal_deinit)(PADAPTER Adapter);
  115505. +
  115506. + void (*free_hal_data)(PADAPTER Adapter);
  115507. +
  115508. + u32 (*inirp_init)(PADAPTER Adapter);
  115509. + u32 (*inirp_deinit)(PADAPTER Adapter);
  115510. +
  115511. + s32 (*init_xmit_priv)(PADAPTER Adapter);
  115512. + void (*free_xmit_priv)(PADAPTER Adapter);
  115513. +
  115514. + s32 (*init_recv_priv)(PADAPTER Adapter);
  115515. + void (*free_recv_priv)(PADAPTER Adapter);
  115516. +
  115517. + void (*InitSwLeds)(PADAPTER Adapter);
  115518. + void (*DeInitSwLeds)(PADAPTER Adapter);
  115519. +
  115520. + void (*dm_init)(PADAPTER Adapter);
  115521. + void (*dm_deinit)(PADAPTER Adapter);
  115522. + void (*read_chip_version)(PADAPTER Adapter);
  115523. +
  115524. + void (*init_default_value)(PADAPTER Adapter);
  115525. +
  115526. + void (*intf_chip_configure)(PADAPTER Adapter);
  115527. +
  115528. + void (*read_adapter_info)(PADAPTER Adapter);
  115529. +
  115530. + void (*enable_interrupt)(PADAPTER Adapter);
  115531. + void (*disable_interrupt)(PADAPTER Adapter);
  115532. + s32 (*interrupt_handler)(PADAPTER Adapter);
  115533. +
  115534. + void (*set_bwmode_handler)(PADAPTER Adapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset);
  115535. + void (*set_channel_handler)(PADAPTER Adapter, u8 channel);
  115536. +
  115537. + void (*hal_dm_watchdog)(PADAPTER Adapter);
  115538. +
  115539. + void (*SetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val);
  115540. + void (*GetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val);
  115541. +
  115542. + u8 (*GetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
  115543. + u8 (*SetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
  115544. +
  115545. + void (*UpdateRAMaskHandler)(PADAPTER Adapter, u32 mac_id);
  115546. + void (*SetBeaconRelatedRegistersHandler)(PADAPTER Adapter);
  115547. +
  115548. + void (*Add_RateATid)(PADAPTER Adapter, u32 bitmap, u8 arg);
  115549. +
  115550. +#ifdef CONFIG_ANTENNA_DIVERSITY
  115551. + u8 (*AntDivBeforeLinkHandler)(PADAPTER Adapter);
  115552. + void (*AntDivCompareHandler)(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);
  115553. +#endif
  115554. + u8 (*interface_ps_func)(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8* val);
  115555. +
  115556. + s32 (*hal_xmit)(PADAPTER Adapter, struct xmit_frame *pxmitframe);
  115557. + s32 (*mgnt_xmit)(PADAPTER Adapter, struct xmit_frame *pmgntframe);
  115558. + s32 (*hal_xmitframe_enqueue)(_adapter *padapter, struct xmit_frame *pxmitframe);
  115559. +
  115560. + u32 (*read_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask);
  115561. + void (*write_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask, u32 Data);
  115562. + u32 (*read_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask);
  115563. + void (*write_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data);
  115564. +
  115565. +#ifdef CONFIG_HOSTAPD_MLME
  115566. + s32 (*hostap_mgnt_xmit_entry)(PADAPTER Adapter, _pkt *pkt);
  115567. +#endif
  115568. + void (*EfusePowerSwitch)(PADAPTER pAdapter, u8 bWrite, u8 PwrState);
  115569. + void (*ReadEFuse)(PADAPTER Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, BOOLEAN bPseudoTest);
  115570. + void (*EFUSEGetEfuseDefinition)(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest);
  115571. + u16 (*EfuseGetCurrentSize)(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
  115572. + int (*Efuse_PgPacketRead)(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest);
  115573. + int (*Efuse_PgPacketWrite)(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
  115574. + u8 (*Efuse_WordEnableDataWrite)(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
  115575. +
  115576. +#ifdef DBG_CONFIG_ERROR_DETECT
  115577. + void (*sreset_init_value)(_adapter *padapter);
  115578. + void (*sreset_reset_value)(_adapter *padapter);
  115579. + void (*silentreset)(_adapter *padapter);
  115580. + void (*sreset_xmit_status_check)(_adapter *padapter);
  115581. + void (*sreset_linked_status_check) (_adapter *padapter);
  115582. + u8 (*sreset_get_wifi_status)(_adapter *padapter);
  115583. + bool (*sreset_inprogress)(_adapter *padapter);
  115584. +#endif
  115585. +
  115586. +#ifdef CONFIG_IOL
  115587. + int (*IOL_exec_cmds_sync)(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms);
  115588. +#endif
  115589. + void (*hal_notch_filter)(_adapter * adapter, bool enable);
  115590. + void (*hal_reset_security_engine)(_adapter * adapter);
  115591. +
  115592. + s32 (*c2h_handler)(_adapter *padapter, struct c2h_evt_hdr *c2h_evt);
  115593. + c2h_id_filter c2h_id_filter_ccx;
  115594. +};
  115595. +
  115596. +typedef enum _RT_EEPROM_TYPE{
  115597. + EEPROM_93C46,
  115598. + EEPROM_93C56,
  115599. + EEPROM_BOOT_EFUSE,
  115600. +}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE;
  115601. +
  115602. +#define USB_HIGH_SPEED_BULK_SIZE 512
  115603. +#define USB_FULL_SPEED_BULK_SIZE 64
  115604. +
  115605. +#define RF_CHANGE_BY_INIT 0
  115606. +#define RF_CHANGE_BY_IPS BIT28
  115607. +#define RF_CHANGE_BY_PS BIT29
  115608. +#define RF_CHANGE_BY_HW BIT30
  115609. +#define RF_CHANGE_BY_SW BIT31
  115610. +
  115611. +typedef enum _HARDWARE_TYPE{
  115612. + HARDWARE_TYPE_RTL8180,
  115613. + HARDWARE_TYPE_RTL8185,
  115614. + HARDWARE_TYPE_RTL8187,
  115615. + HARDWARE_TYPE_RTL8188,
  115616. + HARDWARE_TYPE_RTL8190P,
  115617. + HARDWARE_TYPE_RTL8192E,
  115618. + HARDWARE_TYPE_RTL819xU,
  115619. + HARDWARE_TYPE_RTL8192SE,
  115620. + HARDWARE_TYPE_RTL8192SU,
  115621. + HARDWARE_TYPE_RTL8192CE,
  115622. + HARDWARE_TYPE_RTL8192CU,
  115623. + HARDWARE_TYPE_RTL8192DE,
  115624. + HARDWARE_TYPE_RTL8192DU,
  115625. + HARDWARE_TYPE_RTL8723AE,
  115626. + HARDWARE_TYPE_RTL8723AU,
  115627. + HARDWARE_TYPE_RTL8723AS,
  115628. + HARDWARE_TYPE_RTL8188EE,
  115629. + HARDWARE_TYPE_RTL8188EU,
  115630. + HARDWARE_TYPE_RTL8188ES,
  115631. + HARDWARE_TYPE_MAX,
  115632. +}HARDWARE_TYPE;
  115633. +
  115634. +//
  115635. +// RTL8192C Series
  115636. +//
  115637. +#define IS_HARDWARE_TYPE_8192CE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CE)
  115638. +#define IS_HARDWARE_TYPE_8192CU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CU)
  115639. +#define IS_HARDWARE_TYPE_8192C(_Adapter) \
  115640. +(IS_HARDWARE_TYPE_8192CE(_Adapter) || IS_HARDWARE_TYPE_8192CU(_Adapter))
  115641. +
  115642. +//
  115643. +// RTL8192D Series
  115644. +//
  115645. +#define IS_HARDWARE_TYPE_8192DE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DE)
  115646. +#define IS_HARDWARE_TYPE_8192DU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DU)
  115647. +#define IS_HARDWARE_TYPE_8192D(_Adapter) \
  115648. +(IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter))
  115649. +
  115650. +//
  115651. +// RTL8723A Series
  115652. +//
  115653. +#define IS_HARDWARE_TYPE_8723AE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AE)
  115654. +#define IS_HARDWARE_TYPE_8723AU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AU)
  115655. +#define IS_HARDWARE_TYPE_8723AS(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723AS)
  115656. +#define IS_HARDWARE_TYPE_8723A(_Adapter) \
  115657. +(IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter))
  115658. +
  115659. +//
  115660. +// RTL8188E Series
  115661. +//
  115662. +#define IS_HARDWARE_TYPE_8188EE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188EE)
  115663. +#define IS_HARDWARE_TYPE_8188EU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188EU)
  115664. +#define IS_HARDWARE_TYPE_8188ES(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8188ES)
  115665. +#define IS_HARDWARE_TYPE_8188E(_Adapter) \
  115666. +(IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter))
  115667. +
  115668. +
  115669. +typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV;
  115670. +#define GET_EEPROM_EFUSE_PRIV(priv) (&priv->eeprompriv)
  115671. +
  115672. +#ifdef CONFIG_WOWLAN
  115673. +typedef enum _wowlan_subcode{
  115674. + WOWLAN_PATTERN_MATCH = 1,
  115675. + WOWLAN_MAGIC_PACKET = 2,
  115676. + WOWLAN_UNICAST = 3,
  115677. + WOWLAN_SET_PATTERN = 4,
  115678. + WOWLAN_DUMP_REG = 5,
  115679. + WOWLAN_ENABLE = 6,
  115680. + WOWLAN_DISABLE = 7,
  115681. + WOWLAN_STATUS = 8,
  115682. + WOWLAN_DEBUG_RELOAD_FW = 9,
  115683. + WOWLAN_DEBUG_1 =10,
  115684. + WOWLAN_DEBUG_2 =11
  115685. +}wowlan_subcode;
  115686. +
  115687. +struct wowlan_ioctl_param{
  115688. + unsigned int subcode;
  115689. + unsigned int subcode_value;
  115690. + unsigned int wakeup_reason;
  115691. + unsigned int len;
  115692. + unsigned char pattern[0];
  115693. +};
  115694. +
  115695. +#define Rx_Pairwisekey BIT(0)
  115696. +#define Rx_GTK BIT(1)
  115697. +#define Rx_DisAssoc BIT(2)
  115698. +#define Rx_DeAuth BIT(3)
  115699. +#define FWDecisionDisconnect BIT(4)
  115700. +#define Rx_MagicPkt BIT(5)
  115701. +#define FinishBtFwPatch BIT(7)
  115702. +
  115703. +#endif // CONFIG_WOWLAN
  115704. +
  115705. +void rtw_hal_def_value_init(_adapter *padapter);
  115706. +void rtw_hal_free_data(_adapter *padapter);
  115707. +
  115708. +void rtw_hal_dm_init(_adapter *padapter);
  115709. +void rtw_hal_dm_deinit(_adapter *padapter);
  115710. +void rtw_hal_sw_led_init(_adapter *padapter);
  115711. +void rtw_hal_sw_led_deinit(_adapter *padapter);
  115712. +
  115713. +uint rtw_hal_init(_adapter *padapter);
  115714. +uint rtw_hal_deinit(_adapter *padapter);
  115715. +void rtw_hal_stop(_adapter *padapter);
  115716. +
  115717. +void rtw_hal_set_hwreg(PADAPTER padapter, u8 variable, u8 *val);
  115718. +void rtw_hal_get_hwreg(PADAPTER padapter, u8 variable, u8 *val);
  115719. +
  115720. +void rtw_hal_chip_configure(_adapter *padapter);
  115721. +void rtw_hal_read_chip_info(_adapter *padapter);
  115722. +void rtw_hal_read_chip_version(_adapter *padapter);
  115723. +
  115724. +u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
  115725. +u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
  115726. +
  115727. +void rtw_hal_enable_interrupt(_adapter *padapter);
  115728. +void rtw_hal_disable_interrupt(_adapter *padapter);
  115729. +
  115730. +u32 rtw_hal_inirp_init(_adapter *padapter);
  115731. +u32 rtw_hal_inirp_deinit(_adapter *padapter);
  115732. +
  115733. +u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val);
  115734. +
  115735. +s32 rtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  115736. +s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);
  115737. +s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);
  115738. +
  115739. +s32 rtw_hal_init_xmit_priv(_adapter *padapter);
  115740. +void rtw_hal_free_xmit_priv(_adapter *padapter);
  115741. +
  115742. +s32 rtw_hal_init_recv_priv(_adapter *padapter);
  115743. +void rtw_hal_free_recv_priv(_adapter *padapter);
  115744. +
  115745. +void rtw_hal_update_ra_mask(_adapter *padapter, u32 mac_id);
  115746. +void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8 arg);
  115747. +
  115748. +void rtw_hal_bcn_related_reg_setting(_adapter *padapter);
  115749. +
  115750. +u32 rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask);
  115751. +void rtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data);
  115752. +u32 rtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask);
  115753. +void rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data);
  115754. +
  115755. +s32 rtw_hal_interrupt_handler(_adapter *padapter);
  115756. +
  115757. +void rtw_hal_set_bwmode(_adapter *padapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset);
  115758. +void rtw_hal_set_chan(_adapter *padapter, u8 channel);
  115759. +
  115760. +void rtw_hal_dm_watchdog(_adapter *padapter);
  115761. +
  115762. +#ifdef CONFIG_ANTENNA_DIVERSITY
  115763. +u8 rtw_hal_antdiv_before_linked(_adapter *padapter);
  115764. +void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);
  115765. +#endif
  115766. +
  115767. +#ifdef CONFIG_HOSTAPD_MLME
  115768. +s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);
  115769. +#endif
  115770. +
  115771. +#ifdef DBG_CONFIG_ERROR_DETECT
  115772. +void rtw_hal_sreset_init(_adapter *padapter);
  115773. +void rtw_hal_sreset_reset(_adapter *padapter);
  115774. +void rtw_hal_sreset_reset_value(_adapter *padapter);
  115775. +void rtw_hal_sreset_xmit_status_check(_adapter *padapter);
  115776. +void rtw_hal_sreset_linked_status_check(_adapter *padapter);
  115777. +u8 rtw_hal_sreset_get_wifi_status(_adapter *padapter);
  115778. +bool rtw_hal_sreset_inprogress(_adapter *padapter);
  115779. +#endif
  115780. +
  115781. +#ifdef CONFIG_IOL
  115782. +int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms);
  115783. +#endif
  115784. +
  115785. +void rtw_hal_notch_filter(_adapter * adapter, bool enable);
  115786. +void rtw_hal_reset_security_engine(_adapter * adapter);
  115787. +
  115788. +s32 rtw_hal_c2h_handler(_adapter *adapter, struct c2h_evt_hdr *c2h_evt);
  115789. +c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter);
  115790. +
  115791. +#endif //__HAL_INTF_H__
  115792. --- /dev/null
  115793. +++ b/drivers/net/wireless/rtl8192cu/include/ieee80211.h
  115794. @@ -0,0 +1,1579 @@
  115795. +/******************************************************************************
  115796. + *
  115797. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  115798. + *
  115799. + * This program is free software; you can redistribute it and/or modify it
  115800. + * under the terms of version 2 of the GNU General Public License as
  115801. + * published by the Free Software Foundation.
  115802. + *
  115803. + * This program is distributed in the hope that it will be useful, but WITHOUT
  115804. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  115805. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  115806. + * more details.
  115807. + *
  115808. + * You should have received a copy of the GNU General Public License along with
  115809. + * this program; if not, write to the Free Software Foundation, Inc.,
  115810. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  115811. + *
  115812. + *
  115813. + ******************************************************************************/
  115814. +#ifndef __IEEE80211_H
  115815. +#define __IEEE80211_H
  115816. +
  115817. +
  115818. +#ifndef CONFIG_RTL8711FW
  115819. +
  115820. + #include <drv_conf.h>
  115821. + #include <osdep_service.h>
  115822. + #include <drv_types.h>
  115823. + #include "wifi.h"
  115824. +
  115825. + #if defined PLATFORM_OS_XP
  115826. + #include <ntstrsafe.h>
  115827. + #endif
  115828. + #if defined PLATFORM_LINUX
  115829. + #include <linux/wireless.h>
  115830. + #endif
  115831. +#else
  115832. +
  115833. + #include <list.h>
  115834. +
  115835. +#endif
  115836. +
  115837. +#define MGMT_QUEUE_NUM 5
  115838. +
  115839. +#define ETH_ALEN 6
  115840. +#define ETH_TYPE_LEN 2
  115841. +#define PAYLOAD_TYPE_LEN 1
  115842. +
  115843. +#ifdef CONFIG_AP_MODE
  115844. +
  115845. +#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28)
  115846. +
  115847. +/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */
  115848. +enum {
  115849. + RTL871X_HOSTAPD_FLUSH = 1,
  115850. + RTL871X_HOSTAPD_ADD_STA = 2,
  115851. + RTL871X_HOSTAPD_REMOVE_STA = 3,
  115852. + RTL871X_HOSTAPD_GET_INFO_STA = 4,
  115853. + /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */
  115854. + RTL871X_HOSTAPD_GET_WPAIE_STA = 5,
  115855. + RTL871X_SET_ENCRYPTION = 6,
  115856. + RTL871X_GET_ENCRYPTION = 7,
  115857. + RTL871X_HOSTAPD_SET_FLAGS_STA = 8,
  115858. + RTL871X_HOSTAPD_GET_RID = 9,
  115859. + RTL871X_HOSTAPD_SET_RID = 10,
  115860. + RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11,
  115861. + RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12,
  115862. + RTL871X_HOSTAPD_MLME = 13,
  115863. + RTL871X_HOSTAPD_SCAN_REQ = 14,
  115864. + RTL871X_HOSTAPD_STA_CLEAR_STATS = 15,
  115865. + RTL871X_HOSTAPD_SET_BEACON=16,
  115866. + RTL871X_HOSTAPD_SET_WPS_BEACON = 17,
  115867. + RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18,
  115868. + RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19,
  115869. + RTL871X_HOSTAPD_SET_HIDDEN_SSID = 20,
  115870. + RTL871X_HOSTAPD_SET_MACADDR_ACL = 21,
  115871. + RTL871X_HOSTAPD_ACL_ADD_STA = 22,
  115872. + RTL871X_HOSTAPD_ACL_REMOVE_STA = 23,
  115873. +};
  115874. +
  115875. +/* STA flags */
  115876. +#define WLAN_STA_AUTH BIT(0)
  115877. +#define WLAN_STA_ASSOC BIT(1)
  115878. +#define WLAN_STA_PS BIT(2)
  115879. +#define WLAN_STA_TIM BIT(3)
  115880. +#define WLAN_STA_PERM BIT(4)
  115881. +#define WLAN_STA_AUTHORIZED BIT(5)
  115882. +#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */
  115883. +#define WLAN_STA_SHORT_PREAMBLE BIT(7)
  115884. +#define WLAN_STA_PREAUTH BIT(8)
  115885. +#define WLAN_STA_WME BIT(9)
  115886. +#define WLAN_STA_MFP BIT(10)
  115887. +#define WLAN_STA_HT BIT(11)
  115888. +#define WLAN_STA_WPS BIT(12)
  115889. +#define WLAN_STA_MAYBE_WPS BIT(13)
  115890. +#define WLAN_STA_NONERP BIT(31)
  115891. +
  115892. +#endif
  115893. +
  115894. +#define IEEE_CMD_SET_WPA_PARAM 1
  115895. +#define IEEE_CMD_SET_WPA_IE 2
  115896. +#define IEEE_CMD_SET_ENCRYPTION 3
  115897. +#define IEEE_CMD_MLME 4
  115898. +
  115899. +#define IEEE_PARAM_WPA_ENABLED 1
  115900. +#define IEEE_PARAM_TKIP_COUNTERMEASURES 2
  115901. +#define IEEE_PARAM_DROP_UNENCRYPTED 3
  115902. +#define IEEE_PARAM_PRIVACY_INVOKED 4
  115903. +#define IEEE_PARAM_AUTH_ALGS 5
  115904. +#define IEEE_PARAM_IEEE_802_1X 6
  115905. +#define IEEE_PARAM_WPAX_SELECT 7
  115906. +
  115907. +#define AUTH_ALG_OPEN_SYSTEM 0x1
  115908. +#define AUTH_ALG_SHARED_KEY 0x2
  115909. +#define AUTH_ALG_LEAP 0x00000004
  115910. +
  115911. +#define IEEE_MLME_STA_DEAUTH 1
  115912. +#define IEEE_MLME_STA_DISASSOC 2
  115913. +
  115914. +#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2
  115915. +#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3
  115916. +#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4
  115917. +#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5
  115918. +#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6
  115919. +#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7
  115920. +
  115921. +
  115922. +#define IEEE_CRYPT_ALG_NAME_LEN 16
  115923. +
  115924. +#define WPA_CIPHER_NONE BIT(0)
  115925. +#define WPA_CIPHER_WEP40 BIT(1)
  115926. +#define WPA_CIPHER_WEP104 BIT(2)
  115927. +#define WPA_CIPHER_TKIP BIT(3)
  115928. +#define WPA_CIPHER_CCMP BIT(4)
  115929. +
  115930. +
  115931. +
  115932. +#define WPA_SELECTOR_LEN 4
  115933. +extern u8 RTW_WPA_OUI_TYPE[] ;
  115934. +extern u16 RTW_WPA_VERSION ;
  115935. +extern u8 WPA_AUTH_KEY_MGMT_NONE[];
  115936. +extern u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[];
  115937. +extern u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[];
  115938. +extern u8 WPA_CIPHER_SUITE_NONE[];
  115939. +extern u8 WPA_CIPHER_SUITE_WEP40[];
  115940. +extern u8 WPA_CIPHER_SUITE_TKIP[];
  115941. +extern u8 WPA_CIPHER_SUITE_WRAP[];
  115942. +extern u8 WPA_CIPHER_SUITE_CCMP[];
  115943. +extern u8 WPA_CIPHER_SUITE_WEP104[];
  115944. +
  115945. +
  115946. +#define RSN_HEADER_LEN 4
  115947. +#define RSN_SELECTOR_LEN 4
  115948. +
  115949. +extern u16 RSN_VERSION_BSD;
  115950. +extern u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[];
  115951. +extern u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[];
  115952. +extern u8 RSN_CIPHER_SUITE_NONE[];
  115953. +extern u8 RSN_CIPHER_SUITE_WEP40[];
  115954. +extern u8 RSN_CIPHER_SUITE_TKIP[];
  115955. +extern u8 RSN_CIPHER_SUITE_WRAP[];
  115956. +extern u8 RSN_CIPHER_SUITE_CCMP[];
  115957. +extern u8 RSN_CIPHER_SUITE_WEP104[];
  115958. +
  115959. +typedef enum _RATR_TABLE_MODE{
  115960. + RATR_INX_WIRELESS_NGB = 0, // BGN 40 Mhz 2SS 1SS
  115961. + RATR_INX_WIRELESS_NG = 1, // GN or N
  115962. + RATR_INX_WIRELESS_NB = 2, // BGN 20 Mhz 2SS 1SS or BN
  115963. + RATR_INX_WIRELESS_N = 3,
  115964. + RATR_INX_WIRELESS_GB = 4,
  115965. + RATR_INX_WIRELESS_G = 5,
  115966. + RATR_INX_WIRELESS_B = 6,
  115967. + RATR_INX_WIRELESS_MC = 7,
  115968. + RATR_INX_WIRELESS_AC_N = 8,
  115969. +}RATR_TABLE_MODE, *PRATR_TABLE_MODE;
  115970. +
  115971. +enum NETWORK_TYPE
  115972. +{
  115973. + WIRELESS_INVALID = 0,
  115974. + //Sub-Element
  115975. + WIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck
  115976. + WIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm
  115977. + WIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only
  115978. + WIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck
  115979. + WIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only
  115980. + //WIRELESS_AUTO = BIT(5),
  115981. + WIRELESS_AC = BIT(6),
  115982. +
  115983. + //Combination
  115984. + WIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm
  115985. + WIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm
  115986. + WIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only
  115987. + WIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck
  115988. + WIRELESS_11AGN = (WIRELESS_11A|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only
  115989. + WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N),
  115990. +};
  115991. +
  115992. +#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N)
  115993. +#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N)
  115994. +
  115995. +#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE)
  115996. +#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE)
  115997. +
  115998. +#define IsEnableHWCCK(NetType) IsSupported24G(NetType)
  115999. +#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE)
  116000. +
  116001. +#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType)
  116002. +#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType)
  116003. +#define IsSupportedRxMCS(NetType) IsEnableHWOFDM(NetType)
  116004. +
  116005. +#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE)
  116006. +#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE)
  116007. +#define IsSupportedTxMCS(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE)
  116008. +
  116009. +
  116010. +typedef struct ieee_param {
  116011. + u32 cmd;
  116012. + u8 sta_addr[ETH_ALEN];
  116013. + union {
  116014. + struct {
  116015. + u8 name;
  116016. + u32 value;
  116017. + } wpa_param;
  116018. + struct {
  116019. + u32 len;
  116020. + u8 reserved[32];
  116021. + u8 data[0];
  116022. + } wpa_ie;
  116023. + struct{
  116024. + int command;
  116025. + int reason_code;
  116026. + } mlme;
  116027. + struct {
  116028. + u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
  116029. + u8 set_tx;
  116030. + u32 err;
  116031. + u8 idx;
  116032. + u8 seq[8]; /* sequence counter (set: RX, get: TX) */
  116033. + u16 key_len;
  116034. + u8 key[0];
  116035. + } crypt;
  116036. +#ifdef CONFIG_AP_MODE
  116037. + struct {
  116038. + u16 aid;
  116039. + u16 capability;
  116040. + int flags;
  116041. + u8 tx_supp_rates[16];
  116042. + struct rtw_ieee80211_ht_cap ht_cap;
  116043. + } add_sta;
  116044. + struct {
  116045. + u8 reserved[2];//for set max_num_sta
  116046. + u8 buf[0];
  116047. + } bcn_ie;
  116048. +#endif
  116049. +
  116050. + } u;
  116051. +}ieee_param;
  116052. +
  116053. +#ifdef CONFIG_AP_MODE
  116054. +typedef struct ieee_param_ex {
  116055. + u32 cmd;
  116056. + u8 sta_addr[ETH_ALEN];
  116057. + u8 data[0];
  116058. +}ieee_param_ex;
  116059. +
  116060. +struct sta_data{
  116061. + u16 aid;
  116062. + u16 capability;
  116063. + int flags;
  116064. + u32 sta_set;
  116065. + u8 tx_supp_rates[16];
  116066. + u32 tx_supp_rates_len;
  116067. + struct rtw_ieee80211_ht_cap ht_cap;
  116068. + u64 rx_pkts;
  116069. + u64 rx_bytes;
  116070. + u64 rx_drops;
  116071. + u64 tx_pkts;
  116072. + u64 tx_bytes;
  116073. + u64 tx_drops;
  116074. +};
  116075. +#endif
  116076. +
  116077. +
  116078. +#if WIRELESS_EXT < 17
  116079. +#define IW_QUAL_QUAL_INVALID 0x10
  116080. +#define IW_QUAL_LEVEL_INVALID 0x20
  116081. +#define IW_QUAL_NOISE_INVALID 0x40
  116082. +#define IW_QUAL_QUAL_UPDATED 0x1
  116083. +#define IW_QUAL_LEVEL_UPDATED 0x2
  116084. +#define IW_QUAL_NOISE_UPDATED 0x4
  116085. +#endif
  116086. +
  116087. +#define IEEE80211_DATA_LEN 2304
  116088. +/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
  116089. + 6.2.1.1.2.
  116090. +
  116091. + The figure in section 7.1.2 suggests a body size of up to 2312
  116092. + bytes is allowed, which is a bit confusing, I suspect this
  116093. + represents the 2304 bytes of real data, plus a possible 8 bytes of
  116094. + WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
  116095. +
  116096. +
  116097. +#define IEEE80211_HLEN 30
  116098. +#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
  116099. +
  116100. +
  116101. +/* this is stolen from ipw2200 driver */
  116102. +#define IEEE_IBSS_MAC_HASH_SIZE 31
  116103. +
  116104. +struct ieee_ibss_seq {
  116105. + u8 mac[ETH_ALEN];
  116106. + u16 seq_num;
  116107. + u16 frag_num;
  116108. + unsigned long packet_time;
  116109. + _list list;
  116110. +};
  116111. +
  116112. +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)||defined(PLATFORM_FREEBSD)
  116113. +
  116114. +struct rtw_ieee80211_hdr {
  116115. + u16 frame_ctl;
  116116. + u16 duration_id;
  116117. + u8 addr1[ETH_ALEN];
  116118. + u8 addr2[ETH_ALEN];
  116119. + u8 addr3[ETH_ALEN];
  116120. + u16 seq_ctl;
  116121. + u8 addr4[ETH_ALEN];
  116122. +} __attribute__ ((packed));
  116123. +
  116124. +struct rtw_ieee80211_hdr_3addr {
  116125. + u16 frame_ctl;
  116126. + u16 duration_id;
  116127. + u8 addr1[ETH_ALEN];
  116128. + u8 addr2[ETH_ALEN];
  116129. + u8 addr3[ETH_ALEN];
  116130. + u16 seq_ctl;
  116131. +} __attribute__ ((packed));
  116132. +
  116133. +
  116134. +struct rtw_ieee80211_hdr_qos {
  116135. + u16 frame_ctl;
  116136. + u16 duration_id;
  116137. + u8 addr1[ETH_ALEN];
  116138. + u8 addr2[ETH_ALEN];
  116139. + u8 addr3[ETH_ALEN];
  116140. + u16 seq_ctl;
  116141. + u8 addr4[ETH_ALEN];
  116142. + u16 qc;
  116143. +} __attribute__ ((packed));
  116144. +
  116145. +struct rtw_ieee80211_hdr_3addr_qos {
  116146. + u16 frame_ctl;
  116147. + u16 duration_id;
  116148. + u8 addr1[ETH_ALEN];
  116149. + u8 addr2[ETH_ALEN];
  116150. + u8 addr3[ETH_ALEN];
  116151. + u16 seq_ctl;
  116152. + u16 qc;
  116153. +} __attribute__ ((packed));
  116154. +
  116155. +struct eapol {
  116156. + u8 snap[6];
  116157. + u16 ethertype;
  116158. + u8 version;
  116159. + u8 type;
  116160. + u16 length;
  116161. +} __attribute__ ((packed));
  116162. +
  116163. +#endif
  116164. +
  116165. +
  116166. +
  116167. +#ifdef PLATFORM_WINDOWS
  116168. +
  116169. +#pragma pack(1)
  116170. +struct rtw_ieee80211_hdr {
  116171. + u16 frame_ctl;
  116172. + u16 duration_id;
  116173. + u8 addr1[ETH_ALEN];
  116174. + u8 addr2[ETH_ALEN];
  116175. + u8 addr3[ETH_ALEN];
  116176. + u16 seq_ctl;
  116177. + u8 addr4[ETH_ALEN];
  116178. +};
  116179. +
  116180. +struct rtw_ieee80211_hdr_3addr {
  116181. + u16 frame_ctl;
  116182. + u16 duration_id;
  116183. + u8 addr1[ETH_ALEN];
  116184. + u8 addr2[ETH_ALEN];
  116185. + u8 addr3[ETH_ALEN];
  116186. + u16 seq_ctl;
  116187. +};
  116188. +
  116189. +
  116190. +struct rtw_ieee80211_hdr_qos {
  116191. + struct rtw_ieee80211_hdr wlan_hdr;
  116192. + u16 qc;
  116193. +};
  116194. +
  116195. +struct rtw_ieee80211_hdr_3addr_qos {
  116196. + struct rtw_ieee80211_hdr_3addr wlan_hdr;
  116197. + u16 qc;
  116198. +};
  116199. +
  116200. +struct eapol {
  116201. + u8 snap[6];
  116202. + u16 ethertype;
  116203. + u8 version;
  116204. + u8 type;
  116205. + u16 length;
  116206. +};
  116207. +#pragma pack()
  116208. +
  116209. +#endif
  116210. +
  116211. +
  116212. +
  116213. +enum eap_type {
  116214. + EAP_PACKET = 0,
  116215. + EAPOL_START,
  116216. + EAPOL_LOGOFF,
  116217. + EAPOL_KEY,
  116218. + EAPOL_ENCAP_ASF_ALERT
  116219. +};
  116220. +
  116221. +#define IEEE80211_3ADDR_LEN 24
  116222. +#define IEEE80211_4ADDR_LEN 30
  116223. +#define IEEE80211_FCS_LEN 4
  116224. +
  116225. +#define MIN_FRAG_THRESHOLD 256U
  116226. +#define MAX_FRAG_THRESHOLD 2346U
  116227. +
  116228. +/* Frame control field constants */
  116229. +#define RTW_IEEE80211_FCTL_VERS 0x0003
  116230. +#define RTW_IEEE80211_FCTL_FTYPE 0x000c
  116231. +#define RTW_IEEE80211_FCTL_STYPE 0x00f0
  116232. +#define RTW_IEEE80211_FCTL_TODS 0x0100
  116233. +#define RTW_IEEE80211_FCTL_FROMDS 0x0200
  116234. +#define RTW_IEEE80211_FCTL_MOREFRAGS 0x0400
  116235. +#define RTW_IEEE80211_FCTL_RETRY 0x0800
  116236. +#define RTW_IEEE80211_FCTL_PM 0x1000
  116237. +#define RTW_IEEE80211_FCTL_MOREDATA 0x2000
  116238. +#define RTW_IEEE80211_FCTL_PROTECTED 0x4000
  116239. +#define RTW_IEEE80211_FCTL_ORDER 0x8000
  116240. +#define RTW_IEEE80211_FCTL_CTL_EXT 0x0f00
  116241. +
  116242. +#define RTW_IEEE80211_FTYPE_MGMT 0x0000
  116243. +#define RTW_IEEE80211_FTYPE_CTL 0x0004
  116244. +#define RTW_IEEE80211_FTYPE_DATA 0x0008
  116245. +#define RTW_IEEE80211_FTYPE_EXT 0x000c
  116246. +
  116247. +/* management */
  116248. +#define RTW_IEEE80211_STYPE_ASSOC_REQ 0x0000
  116249. +#define RTW_IEEE80211_STYPE_ASSOC_RESP 0x0010
  116250. +#define RTW_IEEE80211_STYPE_REASSOC_REQ 0x0020
  116251. +#define RTW_IEEE80211_STYPE_REASSOC_RESP 0x0030
  116252. +#define RTW_IEEE80211_STYPE_PROBE_REQ 0x0040
  116253. +#define RTW_IEEE80211_STYPE_PROBE_RESP 0x0050
  116254. +#define RTW_IEEE80211_STYPE_BEACON 0x0080
  116255. +#define RTW_IEEE80211_STYPE_ATIM 0x0090
  116256. +#define RTW_IEEE80211_STYPE_DISASSOC 0x00A0
  116257. +#define RTW_IEEE80211_STYPE_AUTH 0x00B0
  116258. +#define RTW_IEEE80211_STYPE_DEAUTH 0x00C0
  116259. +#define RTW_IEEE80211_STYPE_ACTION 0x00D0
  116260. +
  116261. +/* control */
  116262. +#define RTW_IEEE80211_STYPE_CTL_EXT 0x0060
  116263. +#define RTW_IEEE80211_STYPE_BACK_REQ 0x0080
  116264. +#define RTW_IEEE80211_STYPE_BACK 0x0090
  116265. +#define RTW_IEEE80211_STYPE_PSPOLL 0x00A0
  116266. +#define RTW_IEEE80211_STYPE_RTS 0x00B0
  116267. +#define RTW_IEEE80211_STYPE_CTS 0x00C0
  116268. +#define RTW_IEEE80211_STYPE_ACK 0x00D0
  116269. +#define RTW_IEEE80211_STYPE_CFEND 0x00E0
  116270. +#define RTW_IEEE80211_STYPE_CFENDACK 0x00F0
  116271. +
  116272. +/* data */
  116273. +#define RTW_IEEE80211_STYPE_DATA 0x0000
  116274. +#define RTW_IEEE80211_STYPE_DATA_CFACK 0x0010
  116275. +#define RTW_IEEE80211_STYPE_DATA_CFPOLL 0x0020
  116276. +#define RTW_IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
  116277. +#define RTW_IEEE80211_STYPE_NULLFUNC 0x0040
  116278. +#define RTW_IEEE80211_STYPE_CFACK 0x0050
  116279. +#define RTW_IEEE80211_STYPE_CFPOLL 0x0060
  116280. +#define RTW_IEEE80211_STYPE_CFACKPOLL 0x0070
  116281. +#define RTW_IEEE80211_STYPE_QOS_DATA 0x0080
  116282. +#define RTW_IEEE80211_STYPE_QOS_DATA_CFACK 0x0090
  116283. +#define RTW_IEEE80211_STYPE_QOS_DATA_CFPOLL 0x00A0
  116284. +#define RTW_IEEE80211_STYPE_QOS_DATA_CFACKPOLL 0x00B0
  116285. +#define RTW_IEEE80211_STYPE_QOS_NULLFUNC 0x00C0
  116286. +#define RTW_IEEE80211_STYPE_QOS_CFACK 0x00D0
  116287. +#define RTW_IEEE80211_STYPE_QOS_CFPOLL 0x00E0
  116288. +#define RTW_IEEE80211_STYPE_QOS_CFACKPOLL 0x00F0
  116289. +
  116290. +/* sequence control field */
  116291. +#define RTW_IEEE80211_SCTL_FRAG 0x000F
  116292. +#define RTW_IEEE80211_SCTL_SEQ 0xFFF0
  116293. +
  116294. +
  116295. +#define RTW_ERP_INFO_NON_ERP_PRESENT BIT(0)
  116296. +#define RTW_ERP_INFO_USE_PROTECTION BIT(1)
  116297. +#define RTW_ERP_INFO_BARKER_PREAMBLE_MODE BIT(2)
  116298. +
  116299. +/* QoS,QOS */
  116300. +#define NORMAL_ACK 0
  116301. +#define NO_ACK 1
  116302. +#define NON_EXPLICIT_ACK 2
  116303. +#define BLOCK_ACK 3
  116304. +
  116305. +#ifndef ETH_P_PAE
  116306. +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
  116307. +#endif /* ETH_P_PAE */
  116308. +
  116309. +#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
  116310. +
  116311. +#define ETH_P_ECONET 0x0018
  116312. +
  116313. +#ifndef ETH_P_80211_RAW
  116314. +#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
  116315. +#endif
  116316. +
  116317. +/* IEEE 802.11 defines */
  116318. +
  116319. +#define P80211_OUI_LEN 3
  116320. +
  116321. +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) || defined(PLATFORM_FREEBSD)
  116322. +
  116323. +struct ieee80211_snap_hdr {
  116324. +
  116325. + u8 dsap; /* always 0xAA */
  116326. + u8 ssap; /* always 0xAA */
  116327. + u8 ctrl; /* always 0x03 */
  116328. + u8 oui[P80211_OUI_LEN]; /* organizational universal id */
  116329. +
  116330. +} __attribute__ ((packed));
  116331. +
  116332. +#endif
  116333. +
  116334. +#ifdef PLATFORM_WINDOWS
  116335. +
  116336. +#pragma pack(1)
  116337. +struct ieee80211_snap_hdr {
  116338. +
  116339. + u8 dsap; /* always 0xAA */
  116340. + u8 ssap; /* always 0xAA */
  116341. + u8 ctrl; /* always 0x03 */
  116342. + u8 oui[P80211_OUI_LEN]; /* organizational universal id */
  116343. +
  116344. +};
  116345. +#pragma pack()
  116346. +
  116347. +#endif
  116348. +
  116349. +
  116350. +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
  116351. +
  116352. +#define WLAN_FC_GET_TYPE(fc) ((fc) & RTW_IEEE80211_FCTL_FTYPE)
  116353. +#define WLAN_FC_GET_STYPE(fc) ((fc) & RTW_IEEE80211_FCTL_STYPE)
  116354. +
  116355. +#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f)
  116356. +
  116357. +#define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTW_IEEE80211_SCTL_FRAG)
  116358. +#define WLAN_GET_SEQ_SEQ(seq) ((seq) & RTW_IEEE80211_SCTL_SEQ)
  116359. +
  116360. +/* Authentication algorithms */
  116361. +#define WLAN_AUTH_OPEN 0
  116362. +#define WLAN_AUTH_SHARED_KEY 1
  116363. +
  116364. +#define WLAN_AUTH_CHALLENGE_LEN 128
  116365. +
  116366. +#define WLAN_CAPABILITY_BSS (1<<0)
  116367. +#define WLAN_CAPABILITY_IBSS (1<<1)
  116368. +#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
  116369. +#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
  116370. +#define WLAN_CAPABILITY_PRIVACY (1<<4)
  116371. +#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
  116372. +#define WLAN_CAPABILITY_PBCC (1<<6)
  116373. +#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
  116374. +#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)
  116375. +
  116376. +/* Status codes */
  116377. +#define WLAN_STATUS_SUCCESS 0
  116378. +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
  116379. +#define WLAN_STATUS_CAPS_UNSUPPORTED 10
  116380. +#define WLAN_STATUS_REASSOC_NO_ASSOC 11
  116381. +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
  116382. +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
  116383. +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
  116384. +#define WLAN_STATUS_CHALLENGE_FAIL 15
  116385. +#define WLAN_STATUS_AUTH_TIMEOUT 16
  116386. +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
  116387. +#define WLAN_STATUS_ASSOC_DENIED_RATES 18
  116388. +/* 802.11b */
  116389. +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
  116390. +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20
  116391. +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21
  116392. +
  116393. +/* Reason codes */
  116394. +#define WLAN_REASON_UNSPECIFIED 1
  116395. +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
  116396. +#define WLAN_REASON_DEAUTH_LEAVING 3
  116397. +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
  116398. +#define WLAN_REASON_DISASSOC_AP_BUSY 5
  116399. +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
  116400. +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
  116401. +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
  116402. +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
  116403. +#define WLAN_REASON_JOIN_WRONG_CHANNEL 65534
  116404. +#define WLAN_REASON_EXPIRATION_CHK 65535
  116405. +
  116406. +/* Information Element IDs */
  116407. +#define WLAN_EID_SSID 0
  116408. +#define WLAN_EID_SUPP_RATES 1
  116409. +#define WLAN_EID_FH_PARAMS 2
  116410. +#define WLAN_EID_DS_PARAMS 3
  116411. +#define WLAN_EID_CF_PARAMS 4
  116412. +#define WLAN_EID_TIM 5
  116413. +#define WLAN_EID_IBSS_PARAMS 6
  116414. +#define WLAN_EID_CHALLENGE 16
  116415. +/* EIDs defined by IEEE 802.11h - START */
  116416. +#define WLAN_EID_PWR_CONSTRAINT 32
  116417. +#define WLAN_EID_PWR_CAPABILITY 33
  116418. +#define WLAN_EID_TPC_REQUEST 34
  116419. +#define WLAN_EID_TPC_REPORT 35
  116420. +#define WLAN_EID_SUPPORTED_CHANNELS 36
  116421. +#define WLAN_EID_CHANNEL_SWITCH 37
  116422. +#define WLAN_EID_MEASURE_REQUEST 38
  116423. +#define WLAN_EID_MEASURE_REPORT 39
  116424. +#define WLAN_EID_QUITE 40
  116425. +#define WLAN_EID_IBSS_DFS 41
  116426. +/* EIDs defined by IEEE 802.11h - END */
  116427. +#define WLAN_EID_ERP_INFO 42
  116428. +#define WLAN_EID_HT_CAP 45
  116429. +#define WLAN_EID_RSN 48
  116430. +#define WLAN_EID_EXT_SUPP_RATES 50
  116431. +#define WLAN_EID_MOBILITY_DOMAIN 54
  116432. +#define WLAN_EID_FAST_BSS_TRANSITION 55
  116433. +#define WLAN_EID_TIMEOUT_INTERVAL 56
  116434. +#define WLAN_EID_RIC_DATA 57
  116435. +#define WLAN_EID_HT_OPERATION 61
  116436. +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62
  116437. +#define WLAN_EID_20_40_BSS_COEXISTENCE 72
  116438. +#define WLAN_EID_20_40_BSS_INTOLERANT 73
  116439. +#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74
  116440. +#define WLAN_EID_MMIE 76
  116441. +#define WLAN_EID_VENDOR_SPECIFIC 221
  116442. +#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC)
  116443. +
  116444. +#define IEEE80211_MGMT_HDR_LEN 24
  116445. +#define IEEE80211_DATA_HDR3_LEN 24
  116446. +#define IEEE80211_DATA_HDR4_LEN 30
  116447. +
  116448. +
  116449. +#define IEEE80211_STATMASK_SIGNAL (1<<0)
  116450. +#define IEEE80211_STATMASK_RSSI (1<<1)
  116451. +#define IEEE80211_STATMASK_NOISE (1<<2)
  116452. +#define IEEE80211_STATMASK_RATE (1<<3)
  116453. +#define IEEE80211_STATMASK_WEMASK 0x7
  116454. +
  116455. +
  116456. +#define IEEE80211_CCK_MODULATION (1<<0)
  116457. +#define IEEE80211_OFDM_MODULATION (1<<1)
  116458. +
  116459. +#define IEEE80211_24GHZ_BAND (1<<0)
  116460. +#define IEEE80211_52GHZ_BAND (1<<1)
  116461. +
  116462. +#define IEEE80211_CCK_RATE_LEN 4
  116463. +#define IEEE80211_NUM_OFDM_RATESLEN 8
  116464. +
  116465. +
  116466. +#define IEEE80211_CCK_RATE_1MB 0x02
  116467. +#define IEEE80211_CCK_RATE_2MB 0x04
  116468. +#define IEEE80211_CCK_RATE_5MB 0x0B
  116469. +#define IEEE80211_CCK_RATE_11MB 0x16
  116470. +#define IEEE80211_OFDM_RATE_LEN 8
  116471. +#define IEEE80211_OFDM_RATE_6MB 0x0C
  116472. +#define IEEE80211_OFDM_RATE_9MB 0x12
  116473. +#define IEEE80211_OFDM_RATE_12MB 0x18
  116474. +#define IEEE80211_OFDM_RATE_18MB 0x24
  116475. +#define IEEE80211_OFDM_RATE_24MB 0x30
  116476. +#define IEEE80211_OFDM_RATE_36MB 0x48
  116477. +#define IEEE80211_OFDM_RATE_48MB 0x60
  116478. +#define IEEE80211_OFDM_RATE_54MB 0x6C
  116479. +#define IEEE80211_BASIC_RATE_MASK 0x80
  116480. +
  116481. +#define IEEE80211_CCK_RATE_1MB_MASK (1<<0)
  116482. +#define IEEE80211_CCK_RATE_2MB_MASK (1<<1)
  116483. +#define IEEE80211_CCK_RATE_5MB_MASK (1<<2)
  116484. +#define IEEE80211_CCK_RATE_11MB_MASK (1<<3)
  116485. +#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4)
  116486. +#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5)
  116487. +#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6)
  116488. +#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7)
  116489. +#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8)
  116490. +#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9)
  116491. +#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10)
  116492. +#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11)
  116493. +
  116494. +#define IEEE80211_CCK_RATES_MASK 0x0000000F
  116495. +#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \
  116496. + IEEE80211_CCK_RATE_2MB_MASK)
  116497. +#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \
  116498. + IEEE80211_CCK_RATE_5MB_MASK | \
  116499. + IEEE80211_CCK_RATE_11MB_MASK)
  116500. +
  116501. +#define IEEE80211_OFDM_RATES_MASK 0x00000FF0
  116502. +#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \
  116503. + IEEE80211_OFDM_RATE_12MB_MASK | \
  116504. + IEEE80211_OFDM_RATE_24MB_MASK)
  116505. +#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \
  116506. + IEEE80211_OFDM_RATE_9MB_MASK | \
  116507. + IEEE80211_OFDM_RATE_18MB_MASK | \
  116508. + IEEE80211_OFDM_RATE_36MB_MASK | \
  116509. + IEEE80211_OFDM_RATE_48MB_MASK | \
  116510. + IEEE80211_OFDM_RATE_54MB_MASK)
  116511. +#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \
  116512. + IEEE80211_CCK_DEFAULT_RATES_MASK)
  116513. +
  116514. +#define IEEE80211_NUM_OFDM_RATES 8
  116515. +#define IEEE80211_NUM_CCK_RATES 4
  116516. +#define IEEE80211_OFDM_SHIFT_MASK_A 4
  116517. +
  116518. +
  116519. +
  116520. +
  116521. +/* NOTE: This data is for statistical purposes; not all hardware provides this
  116522. + * information for frames received. Not setting these will not cause
  116523. + * any adverse affects. */
  116524. +struct ieee80211_rx_stats {
  116525. + //u32 mac_time[2];
  116526. + s8 rssi;
  116527. + u8 signal;
  116528. + u8 noise;
  116529. + u8 received_channel;
  116530. + u16 rate; /* in 100 kbps */
  116531. + //u8 control;
  116532. + u8 mask;
  116533. + u8 freq;
  116534. + u16 len;
  116535. +};
  116536. +
  116537. +/* IEEE 802.11 requires that STA supports concurrent reception of at least
  116538. + * three fragmented frames. This define can be increased to support more
  116539. + * concurrent frames, but it should be noted that each entry can consume about
  116540. + * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
  116541. +#define IEEE80211_FRAG_CACHE_LEN 4
  116542. +
  116543. +struct ieee80211_frag_entry {
  116544. + u32 first_frag_time;
  116545. + uint seq;
  116546. + uint last_frag;
  116547. + uint qos; //jackson
  116548. + uint tid; //jackson
  116549. + struct sk_buff *skb;
  116550. + u8 src_addr[ETH_ALEN];
  116551. + u8 dst_addr[ETH_ALEN];
  116552. +};
  116553. +
  116554. +#ifndef PLATFORM_FREEBSD //Baron BSD has already defined
  116555. +struct ieee80211_stats {
  116556. + uint tx_unicast_frames;
  116557. + uint tx_multicast_frames;
  116558. + uint tx_fragments;
  116559. + uint tx_unicast_octets;
  116560. + uint tx_multicast_octets;
  116561. + uint tx_deferred_transmissions;
  116562. + uint tx_single_retry_frames;
  116563. + uint tx_multiple_retry_frames;
  116564. + uint tx_retry_limit_exceeded;
  116565. + uint tx_discards;
  116566. + uint rx_unicast_frames;
  116567. + uint rx_multicast_frames;
  116568. + uint rx_fragments;
  116569. + uint rx_unicast_octets;
  116570. + uint rx_multicast_octets;
  116571. + uint rx_fcs_errors;
  116572. + uint rx_discards_no_buffer;
  116573. + uint tx_discards_wrong_sa;
  116574. + uint rx_discards_undecryptable;
  116575. + uint rx_message_in_msg_fragments;
  116576. + uint rx_message_in_bad_msg_fragments;
  116577. +};
  116578. +#endif //PLATFORM_FREEBSD
  116579. +struct ieee80211_softmac_stats{
  116580. + uint rx_ass_ok;
  116581. + uint rx_ass_err;
  116582. + uint rx_probe_rq;
  116583. + uint tx_probe_rs;
  116584. + uint tx_beacons;
  116585. + uint rx_auth_rq;
  116586. + uint rx_auth_rs_ok;
  116587. + uint rx_auth_rs_err;
  116588. + uint tx_auth_rq;
  116589. + uint no_auth_rs;
  116590. + uint no_ass_rs;
  116591. + uint tx_ass_rq;
  116592. + uint rx_ass_rq;
  116593. + uint tx_probe_rq;
  116594. + uint reassoc;
  116595. + uint swtxstop;
  116596. + uint swtxawake;
  116597. +};
  116598. +
  116599. +#define SEC_KEY_1 (1<<0)
  116600. +#define SEC_KEY_2 (1<<1)
  116601. +#define SEC_KEY_3 (1<<2)
  116602. +#define SEC_KEY_4 (1<<3)
  116603. +#define SEC_ACTIVE_KEY (1<<4)
  116604. +#define SEC_AUTH_MODE (1<<5)
  116605. +#define SEC_UNICAST_GROUP (1<<6)
  116606. +#define SEC_LEVEL (1<<7)
  116607. +#define SEC_ENABLED (1<<8)
  116608. +
  116609. +#define SEC_LEVEL_0 0 /* None */
  116610. +#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */
  116611. +#define SEC_LEVEL_2 2 /* Level 1 + TKIP */
  116612. +#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
  116613. +#define SEC_LEVEL_3 4 /* Level 2 + CCMP */
  116614. +
  116615. +#define WEP_KEYS 4
  116616. +#define WEP_KEY_LEN 13
  116617. +
  116618. +#ifdef CONFIG_IEEE80211W
  116619. +#define BIP_MAX_KEYID 5
  116620. +#define BIP_AAD_SIZE 20
  116621. +#endif //CONFIG_IEEE80211W
  116622. +
  116623. +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)
  116624. +
  116625. +struct ieee80211_security {
  116626. + u16 active_key:2,
  116627. + enabled:1,
  116628. + auth_mode:2,
  116629. + auth_algo:4,
  116630. + unicast_uses_group:1;
  116631. + u8 key_sizes[WEP_KEYS];
  116632. + u8 keys[WEP_KEYS][WEP_KEY_LEN];
  116633. + u8 level;
  116634. + u16 flags;
  116635. +} __attribute__ ((packed));
  116636. +
  116637. +#endif
  116638. +
  116639. +#ifdef PLATFORM_WINDOWS
  116640. +
  116641. +#pragma pack(1)
  116642. +struct ieee80211_security {
  116643. + u16 active_key:2,
  116644. + enabled:1,
  116645. + auth_mode:2,
  116646. + auth_algo:4,
  116647. + unicast_uses_group:1;
  116648. + u8 key_sizes[WEP_KEYS];
  116649. + u8 keys[WEP_KEYS][WEP_KEY_LEN];
  116650. + u8 level;
  116651. + u16 flags;
  116652. +} ;
  116653. +#pragma pack()
  116654. +
  116655. +#endif
  116656. +
  116657. +/*
  116658. +
  116659. + 802.11 data frame from AP
  116660. +
  116661. + ,-------------------------------------------------------------------.
  116662. +Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
  116663. + |------|------|---------|---------|---------|------|---------|------|
  116664. +Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs |
  116665. + | | tion | (BSSID) | | | ence | data | |
  116666. + `-------------------------------------------------------------------'
  116667. +
  116668. +Total: 28-2340 bytes
  116669. +
  116670. +*/
  116671. +
  116672. +struct ieee80211_header_data {
  116673. + u16 frame_ctl;
  116674. + u16 duration_id;
  116675. + u8 addr1[6];
  116676. + u8 addr2[6];
  116677. + u8 addr3[6];
  116678. + u16 seq_ctrl;
  116679. +};
  116680. +
  116681. +#define BEACON_PROBE_SSID_ID_POSITION 12
  116682. +
  116683. +/* Management Frame Information Element Types */
  116684. +#define MFIE_TYPE_SSID 0
  116685. +#define MFIE_TYPE_RATES 1
  116686. +#define MFIE_TYPE_FH_SET 2
  116687. +#define MFIE_TYPE_DS_SET 3
  116688. +#define MFIE_TYPE_CF_SET 4
  116689. +#define MFIE_TYPE_TIM 5
  116690. +#define MFIE_TYPE_IBSS_SET 6
  116691. +#define MFIE_TYPE_CHALLENGE 16
  116692. +#define MFIE_TYPE_ERP 42
  116693. +#define MFIE_TYPE_RSN 48
  116694. +#define MFIE_TYPE_RATES_EX 50
  116695. +#define MFIE_TYPE_GENERIC 221
  116696. +
  116697. +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)
  116698. +
  116699. +struct ieee80211_info_element_hdr {
  116700. + u8 id;
  116701. + u8 len;
  116702. +} __attribute__ ((packed));
  116703. +
  116704. +struct ieee80211_info_element {
  116705. + u8 id;
  116706. + u8 len;
  116707. + u8 data[0];
  116708. +} __attribute__ ((packed));
  116709. +#endif
  116710. +
  116711. +#ifdef PLATFORM_WINDOWS
  116712. +
  116713. +#pragma pack(1)
  116714. +struct ieee80211_info_element_hdr {
  116715. + u8 id;
  116716. + u8 len;
  116717. +} ;
  116718. +
  116719. +struct ieee80211_info_element {
  116720. + u8 id;
  116721. + u8 len;
  116722. + u8 data[0];
  116723. +} ;
  116724. +#pragma pack()
  116725. +
  116726. +#endif
  116727. +
  116728. +
  116729. +/*
  116730. + * These are the data types that can make up management packets
  116731. + *
  116732. + u16 auth_algorithm;
  116733. + u16 auth_sequence;
  116734. + u16 beacon_interval;
  116735. + u16 capability;
  116736. + u8 current_ap[ETH_ALEN];
  116737. + u16 listen_interval;
  116738. + struct {
  116739. + u16 association_id:14, reserved:2;
  116740. + } __attribute__ ((packed));
  116741. + u32 time_stamp[2];
  116742. + u16 reason;
  116743. + u16 status;
  116744. +*/
  116745. +
  116746. +#define IEEE80211_DEFAULT_TX_ESSID "Penguin"
  116747. +#define IEEE80211_DEFAULT_BASIC_RATE 10
  116748. +
  116749. +
  116750. +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)
  116751. +
  116752. +
  116753. +struct ieee80211_authentication {
  116754. + struct ieee80211_header_data header;
  116755. + u16 algorithm;
  116756. + u16 transaction;
  116757. + u16 status;
  116758. + //struct ieee80211_info_element_hdr info_element;
  116759. +} __attribute__ ((packed));
  116760. +
  116761. +
  116762. +struct ieee80211_probe_response {
  116763. + struct ieee80211_header_data header;
  116764. + u32 time_stamp[2];
  116765. + u16 beacon_interval;
  116766. + u16 capability;
  116767. + struct ieee80211_info_element info_element;
  116768. +} __attribute__ ((packed));
  116769. +
  116770. +struct ieee80211_probe_request {
  116771. + struct ieee80211_header_data header;
  116772. + /*struct ieee80211_info_element info_element;*/
  116773. +} __attribute__ ((packed));
  116774. +
  116775. +struct ieee80211_assoc_request_frame {
  116776. + struct rtw_ieee80211_hdr_3addr header;
  116777. + u16 capability;
  116778. + u16 listen_interval;
  116779. + //u8 current_ap[ETH_ALEN];
  116780. + struct ieee80211_info_element_hdr info_element;
  116781. +} __attribute__ ((packed));
  116782. +
  116783. +struct ieee80211_assoc_response_frame {
  116784. + struct rtw_ieee80211_hdr_3addr header;
  116785. + u16 capability;
  116786. + u16 status;
  116787. + u16 aid;
  116788. +// struct ieee80211_info_element info_element; /* supported rates */
  116789. +} __attribute__ ((packed));
  116790. +#endif
  116791. +
  116792. +
  116793. +
  116794. +#ifdef PLATFORM_WINDOWS
  116795. +
  116796. +#pragma pack(1)
  116797. +
  116798. +struct ieee80211_authentication {
  116799. + struct ieee80211_header_data header;
  116800. + u16 algorithm;
  116801. + u16 transaction;
  116802. + u16 status;
  116803. + //struct ieee80211_info_element_hdr info_element;
  116804. +} ;
  116805. +
  116806. +
  116807. +struct ieee80211_probe_response {
  116808. + struct ieee80211_header_data header;
  116809. + u32 time_stamp[2];
  116810. + u16 beacon_interval;
  116811. + u16 capability;
  116812. + struct ieee80211_info_element info_element;
  116813. +} ;
  116814. +
  116815. +struct ieee80211_probe_request {
  116816. + struct ieee80211_header_data header;
  116817. + /*struct ieee80211_info_element info_element;*/
  116818. +} ;
  116819. +
  116820. +struct ieee80211_assoc_request_frame {
  116821. + struct rtw_ieee80211_hdr_3addr header;
  116822. + u16 capability;
  116823. + u16 listen_interval;
  116824. + //u8 current_ap[ETH_ALEN];
  116825. + struct ieee80211_info_element_hdr info_element;
  116826. +} ;
  116827. +
  116828. +struct ieee80211_assoc_response_frame {
  116829. + struct rtw_ieee80211_hdr_3addr header;
  116830. + u16 capability;
  116831. + u16 status;
  116832. + u16 aid;
  116833. +// struct ieee80211_info_element info_element; /* supported rates */
  116834. +};
  116835. +
  116836. +#pragma pack()
  116837. +
  116838. +#endif
  116839. +
  116840. +
  116841. +
  116842. +
  116843. +struct ieee80211_txb {
  116844. + u8 nr_frags;
  116845. + u8 encrypted;
  116846. + u16 reserved;
  116847. + u16 frag_size;
  116848. + u16 payload_size;
  116849. + struct sk_buff *fragments[0];
  116850. +};
  116851. +
  116852. +
  116853. +/* SWEEP TABLE ENTRIES NUMBER*/
  116854. +#define MAX_SWEEP_TAB_ENTRIES 42
  116855. +#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7
  116856. +/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs
  116857. + * only use 8, and then use extended rates for the remaining supported
  116858. + * rates. Other APs, however, stick all of their supported rates on the
  116859. + * main rates information element... */
  116860. +#define MAX_RATES_LENGTH ((u8)12)
  116861. +#define MAX_RATES_EX_LENGTH ((u8)16)
  116862. +#define MAX_NETWORK_COUNT 128
  116863. +#define MAX_CHANNEL_NUMBER 161
  116864. +#define IEEE80211_SOFTMAC_SCAN_TIME 400
  116865. +//(HZ / 2)
  116866. +#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
  116867. +
  116868. +#define CRC_LENGTH 4U
  116869. +
  116870. +#define MAX_WPA_IE_LEN (256)
  116871. +#define MAX_WPS_IE_LEN (512)
  116872. +#define MAX_P2P_IE_LEN (256)
  116873. +#define MAX_WFD_IE_LEN (128)
  116874. +
  116875. +#define NETWORK_EMPTY_ESSID (1<<0)
  116876. +#define NETWORK_HAS_OFDM (1<<1)
  116877. +#define NETWORK_HAS_CCK (1<<2)
  116878. +
  116879. +#define IEEE80211_DTIM_MBCAST 4
  116880. +#define IEEE80211_DTIM_UCAST 2
  116881. +#define IEEE80211_DTIM_VALID 1
  116882. +#define IEEE80211_DTIM_INVALID 0
  116883. +
  116884. +#define IEEE80211_PS_DISABLED 0
  116885. +#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST
  116886. +#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST
  116887. +#define IW_ESSID_MAX_SIZE 32
  116888. +#if 0
  116889. +struct ieee80211_network {
  116890. + /* These entries are used to identify a unique network */
  116891. + u8 bssid[ETH_ALEN];
  116892. + u8 channel;
  116893. + /* Ensure null-terminated for any debug msgs */
  116894. + u8 ssid[IW_ESSID_MAX_SIZE + 1];
  116895. + u8 ssid_len;
  116896. + u8 rssi; //relative signal strength
  116897. + u8 sq; //signal quality
  116898. +
  116899. + /* These are network statistics */
  116900. + //struct ieee80211_rx_stats stats;
  116901. + u16 capability;
  116902. + u16 aid;
  116903. + u8 rates[MAX_RATES_LENGTH];
  116904. + u8 rates_len;
  116905. + u8 rates_ex[MAX_RATES_EX_LENGTH];
  116906. + u8 rates_ex_len;
  116907. +
  116908. + u8 edca_parmsets[18];
  116909. +
  116910. + u8 mode;
  116911. + u8 flags;
  116912. + u8 time_stamp[8];
  116913. + u16 beacon_interval;
  116914. + u16 listen_interval;
  116915. + u16 atim_window;
  116916. + u8 wpa_ie[MAX_WPA_IE_LEN];
  116917. + size_t wpa_ie_len;
  116918. + u8 rsn_ie[MAX_WPA_IE_LEN];
  116919. + size_t rsn_ie_len;
  116920. + u8 country[6];
  116921. + u8 dtim_period;
  116922. + u8 dtim_data;
  116923. + u8 power_constraint;
  116924. + u8 qosinfo;
  116925. + u8 qbssload[5];
  116926. + u8 network_type;
  116927. + int join_res;
  116928. + unsigned long last_scanned;
  116929. +};
  116930. +#endif
  116931. +/*
  116932. +join_res:
  116933. +-1: authentication fail
  116934. +-2: association fail
  116935. +> 0: TID
  116936. +*/
  116937. +
  116938. +#ifndef PLATFORM_FREEBSD //Baron BSD has already defined
  116939. +
  116940. +enum ieee80211_state {
  116941. +
  116942. + /* the card is not linked at all */
  116943. + IEEE80211_NOLINK = 0,
  116944. +
  116945. + /* IEEE80211_ASSOCIATING* are for BSS client mode
  116946. + * the driver shall not perform RX filtering unless
  116947. + * the state is LINKED.
  116948. + * The driver shall just check for the state LINKED and
  116949. + * defaults to NOLINK for ALL the other states (including
  116950. + * LINKED_SCANNING)
  116951. + */
  116952. +
  116953. + /* the association procedure will start (wq scheduling)*/
  116954. + IEEE80211_ASSOCIATING,
  116955. + IEEE80211_ASSOCIATING_RETRY,
  116956. +
  116957. + /* the association procedure is sending AUTH request*/
  116958. + IEEE80211_ASSOCIATING_AUTHENTICATING,
  116959. +
  116960. + /* the association procedure has successfully authentcated
  116961. + * and is sending association request
  116962. + */
  116963. + IEEE80211_ASSOCIATING_AUTHENTICATED,
  116964. +
  116965. + /* the link is ok. the card associated to a BSS or linked
  116966. + * to a ibss cell or acting as an AP and creating the bss
  116967. + */
  116968. + IEEE80211_LINKED,
  116969. +
  116970. + /* same as LINKED, but the driver shall apply RX filter
  116971. + * rules as we are in NO_LINK mode. As the card is still
  116972. + * logically linked, but it is doing a syncro site survey
  116973. + * then it will be back to LINKED state.
  116974. + */
  116975. + IEEE80211_LINKED_SCANNING,
  116976. +
  116977. +};
  116978. +#endif //PLATFORM_FREEBSD
  116979. +
  116980. +#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
  116981. +#define DEFAULT_FTS 2346
  116982. +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
  116983. +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
  116984. +
  116985. +#ifdef PLATFORM_FREEBSD //Baron change func to macro
  116986. +#define is_multicast_mac_addr(Addr) ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff))
  116987. +#define is_broadcast_mac_addr(Addr) ((((Addr[0]) & 0xff) == 0xff) && (((Addr[1]) & 0xff) == 0xff) && \
  116988. +(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \
  116989. +(((Addr[5]) & 0xff) == 0xff))
  116990. +#else
  116991. +extern __inline int is_multicast_mac_addr(const u8 *addr)
  116992. +{
  116993. + return ((addr[0] != 0xff) && (0x01 & addr[0]));
  116994. +}
  116995. +
  116996. +extern __inline int is_broadcast_mac_addr(const u8 *addr)
  116997. +{
  116998. + return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
  116999. + (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
  117000. +}
  117001. +
  117002. +extern __inline int is_zero_mac_addr(const u8 *addr)
  117003. +{
  117004. + return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \
  117005. + (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));
  117006. +}
  117007. +#endif //PLATFORM_FREEBSD
  117008. +
  117009. +#define CFG_IEEE80211_RESERVE_FCS (1<<0)
  117010. +#define CFG_IEEE80211_COMPUTE_FCS (1<<1)
  117011. +
  117012. +typedef struct tx_pending_t{
  117013. + int frag;
  117014. + struct ieee80211_txb *txb;
  117015. +}tx_pending_t;
  117016. +
  117017. +
  117018. +
  117019. +#define MAXTID 16
  117020. +
  117021. +#define IEEE_A (1<<0)
  117022. +#define IEEE_B (1<<1)
  117023. +#define IEEE_G (1<<2)
  117024. +#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
  117025. +
  117026. +//Baron move to ieee80211.c
  117027. +int ieee80211_is_empty_essid(const char *essid, int essid_len);
  117028. +int ieee80211_get_hdrlen(u16 fc);
  117029. +
  117030. +#if 0
  117031. +/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */
  117032. +#define WLAN_ACTION_SPECTRUM_MGMT 0
  117033. +#define WLAN_ACTION_QOS 1
  117034. +#define WLAN_ACTION_DLS 2
  117035. +#define WLAN_ACTION_BLOCK_ACK 3
  117036. +#define WLAN_ACTION_RADIO_MEASUREMENT 5
  117037. +#define WLAN_ACTION_FT 6
  117038. +#define WLAN_ACTION_SA_QUERY 8
  117039. +#define WLAN_ACTION_WMM 17
  117040. +#endif
  117041. +
  117042. +
  117043. +/* Action category code */
  117044. +enum rtw_ieee80211_category {
  117045. + RTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0,
  117046. + RTW_WLAN_CATEGORY_QOS = 1,
  117047. + RTW_WLAN_CATEGORY_DLS = 2,
  117048. + RTW_WLAN_CATEGORY_BACK = 3,
  117049. + RTW_WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames
  117050. + RTW_WLAN_CATEGORY_RADIO_MEASUREMENT = 5,
  117051. + RTW_WLAN_CATEGORY_FT = 6,
  117052. + RTW_WLAN_CATEGORY_HT = 7,
  117053. + RTW_WLAN_CATEGORY_SA_QUERY = 8,
  117054. + RTW_WLAN_CATEGORY_UNPROTECTED_WNM = 11, // add for CONFIG_IEEE80211W, none 11w also can use
  117055. + RTW_WLAN_CATEGORY_TDLS = 12,
  117056. + RTW_WLAN_CATEGORY_SELF_PROTECTED = 15, // add for CONFIG_IEEE80211W, none 11w also can use
  117057. + RTW_WLAN_CATEGORY_WMM = 17,
  117058. + RTW_WLAN_CATEGORY_P2P = 0x7f,//P2P action frames
  117059. +};
  117060. +
  117061. +/* SPECTRUM_MGMT action code */
  117062. +enum rtw_ieee80211_spectrum_mgmt_actioncode {
  117063. + RTW_WLAN_ACTION_SPCT_MSR_REQ = 0,
  117064. + RTW_WLAN_ACTION_SPCT_MSR_RPRT = 1,
  117065. + RTW_WLAN_ACTION_SPCT_TPC_REQ = 2,
  117066. + RTW_WLAN_ACTION_SPCT_TPC_RPRT = 3,
  117067. + RTW_WLAN_ACTION_SPCT_CHL_SWITCH = 4,
  117068. + RTW_WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,
  117069. +};
  117070. +
  117071. +enum _PUBLIC_ACTION{
  117072. + ACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence
  117073. + ACT_PUBLIC_DSE_ENABLE = 1,
  117074. + ACT_PUBLIC_DSE_DEENABLE = 2,
  117075. + ACT_PUBLIC_DSE_REG_LOCATION = 3,
  117076. + ACT_PUBLIC_EXT_CHL_SWITCH = 4,
  117077. + ACT_PUBLIC_DSE_MSR_REQ = 5,
  117078. + ACT_PUBLIC_DSE_MSR_RPRT = 6,
  117079. + ACT_PUBLIC_MP = 7, // Measurement Pilot
  117080. + ACT_PUBLIC_DSE_PWR_CONSTRAINT = 8,
  117081. + ACT_PUBLIC_VENDOR = 9, // for WIFI_DIRECT
  117082. + ACT_PUBLIC_GAS_INITIAL_REQ = 10,
  117083. + ACT_PUBLIC_GAS_INITIAL_RSP = 11,
  117084. + ACT_PUBLIC_GAS_COMEBACK_REQ = 12,
  117085. + ACT_PUBLIC_GAS_COMEBACK_RSP = 13,
  117086. + ACT_PUBLIC_TDLS_DISCOVERY_RSP = 14,
  117087. + ACT_PUBLIC_LOCATION_TRACK = 15,
  117088. + ACT_PUBLIC_MAX
  117089. +};
  117090. +
  117091. +#ifdef CONFIG_TDLS
  117092. +enum TDLS_ACTION_FIELD{
  117093. + TDLS_SETUP_REQUEST = 0,
  117094. + TDLS_SETUP_RESPONSE = 1,
  117095. + TDLS_SETUP_CONFIRM = 2,
  117096. + TDLS_TEARDOWN = 3,
  117097. + TDLS_PEER_TRAFFIC_INDICATION = 4,
  117098. + TDLS_CHANNEL_SWITCH_REQUEST = 5,
  117099. + TDLS_CHANNEL_SWITCH_RESPONSE = 6,
  117100. + TDLS_PEER_PSM_REQUEST = 7,
  117101. + TDLS_PEER_PSM_RESPONSE = 8,
  117102. + TDLS_PEER_TRAFFIC_RESPONSE = 9,
  117103. + TDLS_DISCOVERY_REQUEST = 10,
  117104. + TDLS_DISCOVERY_RESPONSE = 14, //it's used in public action frame
  117105. +};
  117106. +
  117107. +#define TUNNELED_PROBE_REQ 15
  117108. +#define TUNNELED_PROBE_RSP 16
  117109. +#endif //CONFIG_TDLS
  117110. +
  117111. +/* BACK action code */
  117112. +enum rtw_ieee80211_back_actioncode {
  117113. + RTW_WLAN_ACTION_ADDBA_REQ = 0,
  117114. + RTW_WLAN_ACTION_ADDBA_RESP = 1,
  117115. + RTW_WLAN_ACTION_DELBA = 2,
  117116. +};
  117117. +
  117118. +/* HT features action code */
  117119. +enum rtw_ieee80211_ht_actioncode {
  117120. + RTW_WLAN_ACTION_NOTIFY_CH_WIDTH = 0,
  117121. + RTW_WLAN_ACTION_SM_PS = 1,
  117122. + RTW_WLAN_ACTION_PSPM = 2,
  117123. + RTW_WLAN_ACTION_PCO_PHASE = 3,
  117124. + RTW_WLAN_ACTION_MIMO_CSI_MX = 4,
  117125. + RTW_WLAN_ACTION_MIMO_NONCP_BF = 5,
  117126. + RTW_WLAN_ACTION_MIMP_CP_BF = 6,
  117127. + RTW_WLAN_ACTION_ASEL_INDICATES_FB = 7,
  117128. + RTW_WLAN_ACTION_HI_INFO_EXCHG = 8,
  117129. +};
  117130. +
  117131. +/* BACK (block-ack) parties */
  117132. +enum rtw_ieee80211_back_parties {
  117133. + RTW_WLAN_BACK_RECIPIENT = 0,
  117134. + RTW_WLAN_BACK_INITIATOR = 1,
  117135. + RTW_WLAN_BACK_TIMER = 2,
  117136. +};
  117137. +
  117138. +
  117139. +#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs)
  117140. + * 00:50:F2 */
  117141. +#ifndef PLATFORM_FREEBSD //Baron BSD has defined
  117142. +#define WME_OUI_TYPE 2
  117143. +#endif //PLATFORM_FREEBSD
  117144. +#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0
  117145. +#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1
  117146. +#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2
  117147. +#define WME_VERSION 1
  117148. +
  117149. +#define WME_ACTION_CODE_SETUP_REQUEST 0
  117150. +#define WME_ACTION_CODE_SETUP_RESPONSE 1
  117151. +#define WME_ACTION_CODE_TEARDOWN 2
  117152. +
  117153. +#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0
  117154. +#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1
  117155. +#define WME_SETUP_RESPONSE_STATUS_REFUSED 3
  117156. +
  117157. +#define WME_TSPEC_DIRECTION_UPLINK 0
  117158. +#define WME_TSPEC_DIRECTION_DOWNLINK 1
  117159. +#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3
  117160. +
  117161. +
  117162. +#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */
  117163. +
  117164. +#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */
  117165. +
  117166. +/**
  117167. + * enum rtw_ieee80211_channel_flags - channel flags
  117168. + *
  117169. + * Channel flags set by the regulatory control code.
  117170. + *
  117171. + * @RTW_IEEE80211_CHAN_DISABLED: This channel is disabled.
  117172. + * @RTW_IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
  117173. + * on this channel.
  117174. + * @RTW_IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
  117175. + * @RTW_IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
  117176. + * @RTW_IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
  117177. + * is not permitted.
  117178. + * @RTW_IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
  117179. + * is not permitted.
  117180. + */
  117181. + enum rtw_ieee80211_channel_flags {
  117182. + RTW_IEEE80211_CHAN_DISABLED = 1<<0,
  117183. + RTW_IEEE80211_CHAN_PASSIVE_SCAN = 1<<1,
  117184. + RTW_IEEE80211_CHAN_NO_IBSS = 1<<2,
  117185. + RTW_IEEE80211_CHAN_RADAR = 1<<3,
  117186. + RTW_IEEE80211_CHAN_NO_HT40PLUS = 1<<4,
  117187. + RTW_IEEE80211_CHAN_NO_HT40MINUS = 1<<5,
  117188. + };
  117189. +
  117190. + #define RTW_IEEE80211_CHAN_NO_HT40 \
  117191. + (RTW_IEEE80211_CHAN_NO_HT40PLUS | RTW_IEEE80211_CHAN_NO_HT40MINUS)
  117192. +
  117193. +/* Represent channel details, subset of ieee80211_channel */
  117194. +struct rtw_ieee80211_channel {
  117195. + //enum ieee80211_band band;
  117196. + //u16 center_freq;
  117197. + u16 hw_value;
  117198. + u32 flags;
  117199. + //int max_antenna_gain;
  117200. + //int max_power;
  117201. + //int max_reg_power;
  117202. + //bool beacon_found;
  117203. + //u32 orig_flags;
  117204. + //int orig_mag;
  117205. + //int orig_mpwr;
  117206. +};
  117207. +
  117208. +#define CHAN_FMT \
  117209. + /*"band:%d, "*/ \
  117210. + /*"center_freq:%u, "*/ \
  117211. + "hw_value:%u, " \
  117212. + "flags:0x%08x" \
  117213. + /*"max_antenna_gain:%d\n"*/ \
  117214. + /*"max_power:%d\n"*/ \
  117215. + /*"max_reg_power:%d\n"*/ \
  117216. + /*"beacon_found:%u\n"*/ \
  117217. + /*"orig_flags:0x%08x\n"*/ \
  117218. + /*"orig_mag:%d\n"*/ \
  117219. + /*"orig_mpwr:%d\n"*/
  117220. +
  117221. +#define CHAN_ARG(channel) \
  117222. + /*(channel)->band*/ \
  117223. + /*, (channel)->center_freq*/ \
  117224. + (channel)->hw_value \
  117225. + , (channel)->flags \
  117226. + /*, (channel)->max_antenna_gain*/ \
  117227. + /*, (channel)->max_power*/ \
  117228. + /*, (channel)->max_reg_power*/ \
  117229. + /*, (channel)->beacon_found*/ \
  117230. + /*, (channel)->orig_flags*/ \
  117231. + /*, (channel)->orig_mag*/ \
  117232. + /*, (channel)->orig_mpwr*/ \
  117233. +
  117234. +/* Parsed Information Elements */
  117235. +struct rtw_ieee802_11_elems {
  117236. + u8 *ssid;
  117237. + u8 ssid_len;
  117238. + u8 *supp_rates;
  117239. + u8 supp_rates_len;
  117240. + u8 *fh_params;
  117241. + u8 fh_params_len;
  117242. + u8 *ds_params;
  117243. + u8 ds_params_len;
  117244. + u8 *cf_params;
  117245. + u8 cf_params_len;
  117246. + u8 *tim;
  117247. + u8 tim_len;
  117248. + u8 *ibss_params;
  117249. + u8 ibss_params_len;
  117250. + u8 *challenge;
  117251. + u8 challenge_len;
  117252. + u8 *erp_info;
  117253. + u8 erp_info_len;
  117254. + u8 *ext_supp_rates;
  117255. + u8 ext_supp_rates_len;
  117256. + u8 *wpa_ie;
  117257. + u8 wpa_ie_len;
  117258. + u8 *rsn_ie;
  117259. + u8 rsn_ie_len;
  117260. + u8 *wme;
  117261. + u8 wme_len;
  117262. + u8 *wme_tspec;
  117263. + u8 wme_tspec_len;
  117264. + u8 *wps_ie;
  117265. + u8 wps_ie_len;
  117266. + u8 *power_cap;
  117267. + u8 power_cap_len;
  117268. + u8 *supp_channels;
  117269. + u8 supp_channels_len;
  117270. + u8 *mdie;
  117271. + u8 mdie_len;
  117272. + u8 *ftie;
  117273. + u8 ftie_len;
  117274. + u8 *timeout_int;
  117275. + u8 timeout_int_len;
  117276. + u8 *ht_capabilities;
  117277. + u8 ht_capabilities_len;
  117278. + u8 *ht_operation;
  117279. + u8 ht_operation_len;
  117280. + u8 *vendor_ht_cap;
  117281. + u8 vendor_ht_cap_len;
  117282. +};
  117283. +
  117284. +typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes;
  117285. +
  117286. +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,
  117287. + struct rtw_ieee802_11_elems *elems,
  117288. + int show_errors);
  117289. +
  117290. +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen);
  117291. +u8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen);
  117292. +
  117293. +enum secondary_ch_offset {
  117294. + SCN = 0, /* no secondary channel */
  117295. + SCA = 1, /* secondary channel above */
  117296. + SCB = 3, /* secondary channel below */
  117297. +};
  117298. +u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset);
  117299. +u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset);
  117300. +u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode, u8 new_ch, u8 ch_switch_cnt);
  117301. +u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch_offset);
  117302. +u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl, u8 flags, u16 reason, u16 precedence);
  117303. +
  117304. +u8 *rtw_get_ie(u8*pbuf, sint index, sint *len, sint limit);
  117305. +u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen);
  117306. +int rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len);
  117307. +
  117308. +void rtw_set_supported_rate(u8* SupportedRates, uint mode) ;
  117309. +
  117310. +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit);
  117311. +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit);
  117312. +int rtw_get_wpa_cipher_suite(u8 *s);
  117313. +int rtw_get_wpa2_cipher_suite(u8 *s);
  117314. +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher);
  117315. +int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher);
  117316. +
  117317. +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len);
  117318. +
  117319. +u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen);
  117320. +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen);
  117321. +u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr);
  117322. +u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content);
  117323. +
  117324. +/**
  117325. + * for_each_ie - iterate over continuous IEs
  117326. + * @ie:
  117327. + * @buf:
  117328. + * @buf_len:
  117329. + */
  117330. +#define for_each_ie(ie, buf, buf_len) \
  117331. + for (ie = (void*)buf; (((u8*)ie) - ((u8*)buf) + 1) < buf_len; ie = (void*)(((u8*)ie) + *(((u8*)ie)+1) + 2))
  117332. +
  117333. +void dump_ies(u8 *buf, u32 buf_len);
  117334. +void dump_wps_ie(u8 *ie, u32 ie_len);
  117335. +
  117336. +#ifdef CONFIG_P2P
  117337. +u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len);
  117338. +int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie);
  117339. +void dump_p2p_ie(u8 *ie, u32 ie_len);
  117340. +u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen);
  117341. +u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr);
  117342. +u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content);
  117343. +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr);
  117344. +void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id);
  117345. +#endif
  117346. +
  117347. +#ifdef CONFIG_WFD
  117348. +int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen);
  117349. +int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen);
  117350. +#endif // CONFIG_WFD
  117351. +
  117352. +uint rtw_get_rateset_len(u8 *rateset);
  117353. +
  117354. +struct registry_priv;
  117355. +int rtw_generate_ie(struct registry_priv *pregistrypriv);
  117356. +
  117357. +
  117358. +int rtw_get_bit_value_from_ieee_value(u8 val);
  117359. +
  117360. +uint rtw_is_cckrates_included(u8 *rate);
  117361. +
  117362. +uint rtw_is_cckratesonly_included(u8 *rate);
  117363. +
  117364. +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel);
  117365. +
  117366. +void rtw_macaddr_cfg(u8 *mac_addr);
  117367. +
  117368. +u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char * MCS_rate);
  117369. +
  117370. +int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action);
  117371. +const char *action_public_str(u8 action);
  117372. +
  117373. +#endif /* IEEE80211_H */
  117374. --- /dev/null
  117375. +++ b/drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h
  117376. @@ -0,0 +1,476 @@
  117377. +/******************************************************************************
  117378. + *
  117379. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  117380. + *
  117381. + * This program is free software; you can redistribute it and/or modify it
  117382. + * under the terms of version 2 of the GNU General Public License as
  117383. + * published by the Free Software Foundation.
  117384. + *
  117385. + * This program is distributed in the hope that it will be useful, but WITHOUT
  117386. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  117387. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  117388. + * more details.
  117389. + *
  117390. + * You should have received a copy of the GNU General Public License along with
  117391. + * this program; if not, write to the Free Software Foundation, Inc.,
  117392. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  117393. + *
  117394. + *
  117395. + ******************************************************************************/
  117396. +#ifndef __IEEE80211_EXT_H
  117397. +#define __IEEE80211_EXT_H
  117398. +
  117399. +#include <drv_conf.h>
  117400. +#include <osdep_service.h>
  117401. +#include <drv_types.h>
  117402. +
  117403. +#define WMM_OUI_TYPE 2
  117404. +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
  117405. +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
  117406. +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
  117407. +#define WMM_VERSION 1
  117408. +
  117409. +#define WPA_PROTO_WPA BIT(0)
  117410. +#define WPA_PROTO_RSN BIT(1)
  117411. +
  117412. +#define WPA_KEY_MGMT_IEEE8021X BIT(0)
  117413. +#define WPA_KEY_MGMT_PSK BIT(1)
  117414. +#define WPA_KEY_MGMT_NONE BIT(2)
  117415. +#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3)
  117416. +#define WPA_KEY_MGMT_WPA_NONE BIT(4)
  117417. +
  117418. +
  117419. +#define WPA_CAPABILITY_PREAUTH BIT(0)
  117420. +#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6)
  117421. +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
  117422. +
  117423. +
  117424. +#define PMKID_LEN 16
  117425. +
  117426. +
  117427. +#ifdef PLATFORM_LINUX
  117428. +struct wpa_ie_hdr {
  117429. + u8 elem_id;
  117430. + u8 len;
  117431. + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */
  117432. + u8 version[2]; /* little endian */
  117433. +}__attribute__ ((packed));
  117434. +
  117435. +struct rsn_ie_hdr {
  117436. + u8 elem_id; /* WLAN_EID_RSN */
  117437. + u8 len;
  117438. + u8 version[2]; /* little endian */
  117439. +}__attribute__ ((packed));
  117440. +
  117441. +struct wme_ac_parameter {
  117442. +#if defined(CONFIG_LITTLE_ENDIAN)
  117443. + /* byte 1 */
  117444. + u8 aifsn:4,
  117445. + acm:1,
  117446. + aci:2,
  117447. + reserved:1;
  117448. +
  117449. + /* byte 2 */
  117450. + u8 eCWmin:4,
  117451. + eCWmax:4;
  117452. +#elif defined(CONFIG_BIG_ENDIAN)
  117453. + /* byte 1 */
  117454. + u8 reserved:1,
  117455. + aci:2,
  117456. + acm:1,
  117457. + aifsn:4;
  117458. +
  117459. + /* byte 2 */
  117460. + u8 eCWmax:4,
  117461. + eCWmin:4;
  117462. +#else
  117463. +#error "Please fix <endian.h>"
  117464. +#endif
  117465. +
  117466. + /* bytes 3 & 4 */
  117467. + u16 txopLimit;
  117468. +} __attribute__ ((packed));
  117469. +
  117470. +struct wme_parameter_element {
  117471. + /* required fields for WME version 1 */
  117472. + u8 oui[3];
  117473. + u8 oui_type;
  117474. + u8 oui_subtype;
  117475. + u8 version;
  117476. + u8 acInfo;
  117477. + u8 reserved;
  117478. + struct wme_ac_parameter ac[4];
  117479. +
  117480. +} __attribute__ ((packed));
  117481. +
  117482. +#endif
  117483. +
  117484. +#ifdef PLATFORM_WINDOWS
  117485. +
  117486. +#pragma pack(1)
  117487. +
  117488. +struct wpa_ie_hdr {
  117489. + u8 elem_id;
  117490. + u8 len;
  117491. + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */
  117492. + u8 version[2]; /* little endian */
  117493. +};
  117494. +
  117495. +struct rsn_ie_hdr {
  117496. + u8 elem_id; /* WLAN_EID_RSN */
  117497. + u8 len;
  117498. + u8 version[2]; /* little endian */
  117499. +};
  117500. +
  117501. +#pragma pack()
  117502. +
  117503. +#endif
  117504. +
  117505. +#define WPA_PUT_LE16(a, val) \
  117506. + do { \
  117507. + (a)[1] = ((u16) (val)) >> 8; \
  117508. + (a)[0] = ((u16) (val)) & 0xff; \
  117509. + } while (0)
  117510. +
  117511. +#define WPA_PUT_BE32(a, val) \
  117512. + do { \
  117513. + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \
  117514. + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  117515. + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  117516. + (a)[3] = (u8) (((u32) (val)) & 0xff); \
  117517. + } while (0)
  117518. +
  117519. +#define WPA_PUT_LE32(a, val) \
  117520. + do { \
  117521. + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \
  117522. + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  117523. + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  117524. + (a)[0] = (u8) (((u32) (val)) & 0xff); \
  117525. + } while (0)
  117526. +
  117527. +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val))
  117528. +//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val))
  117529. +
  117530. +
  117531. +
  117532. +/* Action category code */
  117533. +enum ieee80211_category {
  117534. + WLAN_CATEGORY_SPECTRUM_MGMT = 0,
  117535. + WLAN_CATEGORY_QOS = 1,
  117536. + WLAN_CATEGORY_DLS = 2,
  117537. + WLAN_CATEGORY_BACK = 3,
  117538. + WLAN_CATEGORY_HT = 7,
  117539. + WLAN_CATEGORY_WMM = 17,
  117540. +};
  117541. +
  117542. +/* SPECTRUM_MGMT action code */
  117543. +enum ieee80211_spectrum_mgmt_actioncode {
  117544. + WLAN_ACTION_SPCT_MSR_REQ = 0,
  117545. + WLAN_ACTION_SPCT_MSR_RPRT = 1,
  117546. + WLAN_ACTION_SPCT_TPC_REQ = 2,
  117547. + WLAN_ACTION_SPCT_TPC_RPRT = 3,
  117548. + WLAN_ACTION_SPCT_CHL_SWITCH = 4,
  117549. + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,
  117550. +};
  117551. +
  117552. +/* BACK action code */
  117553. +enum ieee80211_back_actioncode {
  117554. + WLAN_ACTION_ADDBA_REQ = 0,
  117555. + WLAN_ACTION_ADDBA_RESP = 1,
  117556. + WLAN_ACTION_DELBA = 2,
  117557. +};
  117558. +
  117559. +/* HT features action code */
  117560. +enum ieee80211_ht_actioncode {
  117561. + WLAN_ACTION_NOTIFY_CH_WIDTH = 0,
  117562. + WLAN_ACTION_SM_PS = 1,
  117563. + WLAN_ACTION_PSPM = 2,
  117564. + WLAN_ACTION_PCO_PHASE = 3,
  117565. + WLAN_ACTION_MIMO_CSI_MX = 4,
  117566. + WLAN_ACTION_MIMO_NONCP_BF = 5,
  117567. + WLAN_ACTION_MIMP_CP_BF = 6,
  117568. + WLAN_ACTION_ASEL_INDICATES_FB = 7,
  117569. + WLAN_ACTION_HI_INFO_EXCHG = 8,
  117570. +};
  117571. +
  117572. +/* BACK (block-ack) parties */
  117573. +enum ieee80211_back_parties {
  117574. + WLAN_BACK_RECIPIENT = 0,
  117575. + WLAN_BACK_INITIATOR = 1,
  117576. + WLAN_BACK_TIMER = 2,
  117577. +};
  117578. +
  117579. +#ifdef PLATFORM_LINUX
  117580. +
  117581. +struct ieee80211_mgmt {
  117582. + u16 frame_control;
  117583. + u16 duration;
  117584. + u8 da[6];
  117585. + u8 sa[6];
  117586. + u8 bssid[6];
  117587. + u16 seq_ctrl;
  117588. + union {
  117589. + struct {
  117590. + u16 auth_alg;
  117591. + u16 auth_transaction;
  117592. + u16 status_code;
  117593. + /* possibly followed by Challenge text */
  117594. + u8 variable[0];
  117595. + } __attribute__ ((packed)) auth;
  117596. + struct {
  117597. + u16 reason_code;
  117598. + } __attribute__ ((packed)) deauth;
  117599. + struct {
  117600. + u16 capab_info;
  117601. + u16 listen_interval;
  117602. + /* followed by SSID and Supported rates */
  117603. + u8 variable[0];
  117604. + } __attribute__ ((packed)) assoc_req;
  117605. + struct {
  117606. + u16 capab_info;
  117607. + u16 status_code;
  117608. + u16 aid;
  117609. + /* followed by Supported rates */
  117610. + u8 variable[0];
  117611. + } __attribute__ ((packed)) assoc_resp, reassoc_resp;
  117612. + struct {
  117613. + u16 capab_info;
  117614. + u16 listen_interval;
  117615. + u8 current_ap[6];
  117616. + /* followed by SSID and Supported rates */
  117617. + u8 variable[0];
  117618. + } __attribute__ ((packed)) reassoc_req;
  117619. + struct {
  117620. + u16 reason_code;
  117621. + } __attribute__ ((packed)) disassoc;
  117622. + struct {
  117623. + __le64 timestamp;
  117624. + u16 beacon_int;
  117625. + u16 capab_info;
  117626. + /* followed by some of SSID, Supported rates,
  117627. + * FH Params, DS Params, CF Params, IBSS Params, TIM */
  117628. + u8 variable[0];
  117629. + } __attribute__ ((packed)) beacon;
  117630. + struct {
  117631. + /* only variable items: SSID, Supported rates */
  117632. + u8 variable[0];
  117633. + } __attribute__ ((packed)) probe_req;
  117634. + struct {
  117635. + __le64 timestamp;
  117636. + u16 beacon_int;
  117637. + u16 capab_info;
  117638. + /* followed by some of SSID, Supported rates,
  117639. + * FH Params, DS Params, CF Params, IBSS Params */
  117640. + u8 variable[0];
  117641. + } __attribute__ ((packed)) probe_resp;
  117642. + struct {
  117643. + u8 category;
  117644. + union {
  117645. + struct {
  117646. + u8 action_code;
  117647. + u8 dialog_token;
  117648. + u8 status_code;
  117649. + u8 variable[0];
  117650. + } __attribute__ ((packed)) wme_action;
  117651. +#if 0
  117652. + struct{
  117653. + u8 action_code;
  117654. + u8 element_id;
  117655. + u8 length;
  117656. + struct ieee80211_channel_sw_ie sw_elem;
  117657. + } __attribute__ ((packed)) chan_switch;
  117658. + struct{
  117659. + u8 action_code;
  117660. + u8 dialog_token;
  117661. + u8 element_id;
  117662. + u8 length;
  117663. + struct ieee80211_msrment_ie msr_elem;
  117664. + } __attribute__ ((packed)) measurement;
  117665. +#endif
  117666. + struct{
  117667. + u8 action_code;
  117668. + u8 dialog_token;
  117669. + u16 capab;
  117670. + u16 timeout;
  117671. + u16 start_seq_num;
  117672. + } __attribute__ ((packed)) addba_req;
  117673. + struct{
  117674. + u8 action_code;
  117675. + u8 dialog_token;
  117676. + u16 status;
  117677. + u16 capab;
  117678. + u16 timeout;
  117679. + } __attribute__ ((packed)) addba_resp;
  117680. + struct{
  117681. + u8 action_code;
  117682. + u16 params;
  117683. + u16 reason_code;
  117684. + } __attribute__ ((packed)) delba;
  117685. + struct{
  117686. + u8 action_code;
  117687. + /* capab_info for open and confirm,
  117688. + * reason for close
  117689. + */
  117690. + u16 aux;
  117691. + /* Followed in plink_confirm by status
  117692. + * code, AID and supported rates,
  117693. + * and directly by supported rates in
  117694. + * plink_open and plink_close
  117695. + */
  117696. + u8 variable[0];
  117697. + } __attribute__ ((packed)) plink_action;
  117698. + struct{
  117699. + u8 action_code;
  117700. + u8 variable[0];
  117701. + } __attribute__ ((packed)) mesh_action;
  117702. + } __attribute__ ((packed)) u;
  117703. + } __attribute__ ((packed)) action;
  117704. + } __attribute__ ((packed)) u;
  117705. +}__attribute__ ((packed));
  117706. +
  117707. +#endif
  117708. +
  117709. +
  117710. +#ifdef PLATFORM_WINDOWS
  117711. +
  117712. +#pragma pack(1)
  117713. +
  117714. +struct ieee80211_mgmt {
  117715. + u16 frame_control;
  117716. + u16 duration;
  117717. + u8 da[6];
  117718. + u8 sa[6];
  117719. + u8 bssid[6];
  117720. + u16 seq_ctrl;
  117721. + union {
  117722. + struct {
  117723. + u16 auth_alg;
  117724. + u16 auth_transaction;
  117725. + u16 status_code;
  117726. + /* possibly followed by Challenge text */
  117727. + u8 variable[0];
  117728. + } auth;
  117729. + struct {
  117730. + u16 reason_code;
  117731. + } deauth;
  117732. + struct {
  117733. + u16 capab_info;
  117734. + u16 listen_interval;
  117735. + /* followed by SSID and Supported rates */
  117736. + u8 variable[0];
  117737. + } assoc_req;
  117738. + struct {
  117739. + u16 capab_info;
  117740. + u16 status_code;
  117741. + u16 aid;
  117742. + /* followed by Supported rates */
  117743. + u8 variable[0];
  117744. + } assoc_resp, reassoc_resp;
  117745. + struct {
  117746. + u16 capab_info;
  117747. + u16 listen_interval;
  117748. + u8 current_ap[6];
  117749. + /* followed by SSID and Supported rates */
  117750. + u8 variable[0];
  117751. + } reassoc_req;
  117752. + struct {
  117753. + u16 reason_code;
  117754. + } disassoc;
  117755. +#if 0
  117756. + struct {
  117757. + __le64 timestamp;
  117758. + u16 beacon_int;
  117759. + u16 capab_info;
  117760. + /* followed by some of SSID, Supported rates,
  117761. + * FH Params, DS Params, CF Params, IBSS Params, TIM */
  117762. + u8 variable[0];
  117763. + } beacon;
  117764. + struct {
  117765. + /* only variable items: SSID, Supported rates */
  117766. + u8 variable[0];
  117767. + } probe_req;
  117768. +
  117769. + struct {
  117770. + __le64 timestamp;
  117771. + u16 beacon_int;
  117772. + u16 capab_info;
  117773. + /* followed by some of SSID, Supported rates,
  117774. + * FH Params, DS Params, CF Params, IBSS Params */
  117775. + u8 variable[0];
  117776. + } probe_resp;
  117777. +#endif
  117778. + struct {
  117779. + u8 category;
  117780. + union {
  117781. + struct {
  117782. + u8 action_code;
  117783. + u8 dialog_token;
  117784. + u8 status_code;
  117785. + u8 variable[0];
  117786. + } wme_action;
  117787. +/*
  117788. + struct{
  117789. + u8 action_code;
  117790. + u8 element_id;
  117791. + u8 length;
  117792. + struct ieee80211_channel_sw_ie sw_elem;
  117793. + } chan_switch;
  117794. + struct{
  117795. + u8 action_code;
  117796. + u8 dialog_token;
  117797. + u8 element_id;
  117798. + u8 length;
  117799. + struct ieee80211_msrment_ie msr_elem;
  117800. + } measurement;
  117801. +*/
  117802. + struct{
  117803. + u8 action_code;
  117804. + u8 dialog_token;
  117805. + u16 capab;
  117806. + u16 timeout;
  117807. + u16 start_seq_num;
  117808. + } addba_req;
  117809. + struct{
  117810. + u8 action_code;
  117811. + u8 dialog_token;
  117812. + u16 status;
  117813. + u16 capab;
  117814. + u16 timeout;
  117815. + } addba_resp;
  117816. + struct{
  117817. + u8 action_code;
  117818. + u16 params;
  117819. + u16 reason_code;
  117820. + } delba;
  117821. + struct{
  117822. + u8 action_code;
  117823. + /* capab_info for open and confirm,
  117824. + * reason for close
  117825. + */
  117826. + u16 aux;
  117827. + /* Followed in plink_confirm by status
  117828. + * code, AID and supported rates,
  117829. + * and directly by supported rates in
  117830. + * plink_open and plink_close
  117831. + */
  117832. + u8 variable[0];
  117833. + } plink_action;
  117834. + struct{
  117835. + u8 action_code;
  117836. + u8 variable[0];
  117837. + } mesh_action;
  117838. + } u;
  117839. + } action;
  117840. + } u;
  117841. +} ;
  117842. +
  117843. +#pragma pack()
  117844. +
  117845. +#endif
  117846. +
  117847. +/* mgmt header + 1 byte category code */
  117848. +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u)
  117849. +
  117850. +
  117851. +
  117852. +#endif
  117853. --- /dev/null
  117854. +++ b/drivers/net/wireless/rtl8192cu/include/if_ether.h
  117855. @@ -0,0 +1,112 @@
  117856. +/******************************************************************************
  117857. + *
  117858. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  117859. + *
  117860. + * This program is free software; you can redistribute it and/or modify it
  117861. + * under the terms of version 2 of the GNU General Public License as
  117862. + * published by the Free Software Foundation.
  117863. + *
  117864. + * This program is distributed in the hope that it will be useful, but WITHOUT
  117865. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  117866. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  117867. + * more details.
  117868. + *
  117869. + * You should have received a copy of the GNU General Public License along with
  117870. + * this program; if not, write to the Free Software Foundation, Inc.,
  117871. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  117872. + *
  117873. + *
  117874. + ******************************************************************************/
  117875. +
  117876. +#ifndef _LINUX_IF_ETHER_H
  117877. +#define _LINUX_IF_ETHER_H
  117878. +
  117879. +/*
  117880. + * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
  117881. + * and FCS/CRC (frame check sequence).
  117882. + */
  117883. +
  117884. +#define ETH_ALEN 6 /* Octets in one ethernet addr */
  117885. +#define ETH_HLEN 14 /* Total octets in header. */
  117886. +#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */
  117887. +#define ETH_DATA_LEN 1500 /* Max. octets in payload */
  117888. +#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */
  117889. +
  117890. +/*
  117891. + * These are the defined Ethernet Protocol ID's.
  117892. + */
  117893. +
  117894. +#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
  117895. +#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
  117896. +#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
  117897. +#define ETH_P_IP 0x0800 /* Internet Protocol packet */
  117898. +#define ETH_P_X25 0x0805 /* CCITT X.25 */
  117899. +#define ETH_P_ARP 0x0806 /* Address Resolution packet */
  117900. +#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */
  117901. +#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
  117902. +#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */
  117903. +#define ETH_P_DEC 0x6000 /* DEC Assigned proto */
  117904. +#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */
  117905. +#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */
  117906. +#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */
  117907. +#define ETH_P_LAT 0x6004 /* DEC LAT */
  117908. +#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
  117909. +#define ETH_P_CUST 0x6006 /* DEC Customer use */
  117910. +#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
  117911. +#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
  117912. +#define ETH_P_ATALK 0x809B /* Appletalk DDP */
  117913. +#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
  117914. +#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
  117915. +#define ETH_P_IPX 0x8137 /* IPX over DIX */
  117916. +#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
  117917. +#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */
  117918. +#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */
  117919. +#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */
  117920. +#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport
  117921. + * over Ethernet
  117922. + */
  117923. +
  117924. +/*
  117925. + * Non DIX types. Won't clash for 1500 types.
  117926. + */
  117927. +
  117928. +#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */
  117929. +#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */
  117930. +#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */
  117931. +#define ETH_P_802_2 0x0004 /* 802.2 frames */
  117932. +#define ETH_P_SNAP 0x0005 /* Internal only */
  117933. +#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */
  117934. +#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/
  117935. +#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */
  117936. +#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
  117937. +#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/
  117938. +#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */
  117939. +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */
  117940. +#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
  117941. +#define ETH_P_IRDA 0x0017 /* Linux-IrDA */
  117942. +#define ETH_P_ECONET 0x0018 /* Acorn Econet */
  117943. +
  117944. +/*
  117945. + * This is an Ethernet frame header.
  117946. + */
  117947. +
  117948. +struct ethhdr
  117949. +{
  117950. + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
  117951. + unsigned char h_source[ETH_ALEN]; /* source ether addr */
  117952. + unsigned short h_proto; /* packet type ID field */
  117953. +};
  117954. +
  117955. +struct _vlan {
  117956. + unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID
  117957. + unsigned short h_vlan_encapsulated_proto;
  117958. +};
  117959. +
  117960. +
  117961. +
  117962. +#define get_vlan_id(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI)) & 0xfff)
  117963. +#define get_vlan_priority(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI))>>13)
  117964. +#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short )pvlan->h_vlan_encapsulated_proto))
  117965. +
  117966. +
  117967. +#endif /* _LINUX_IF_ETHER_H */
  117968. --- /dev/null
  117969. +++ b/drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h
  117970. @@ -0,0 +1,179 @@
  117971. +/******************************************************************************
  117972. + *
  117973. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  117974. + *
  117975. + * This program is free software; you can redistribute it and/or modify it
  117976. + * under the terms of version 2 of the GNU General Public License as
  117977. + * published by the Free Software Foundation.
  117978. + *
  117979. + * This program is distributed in the hope that it will be useful, but WITHOUT
  117980. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  117981. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  117982. + * more details.
  117983. + *
  117984. + * You should have received a copy of the GNU General Public License along with
  117985. + * this program; if not, write to the Free Software Foundation, Inc.,
  117986. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  117987. + *
  117988. + *
  117989. + ******************************************************************************/
  117990. +#ifndef __IOCTL_CFG80211_H__
  117991. +#define __IOCTL_CFG80211_H__
  117992. +
  117993. +#if defined(CONFIG_IOCTL_CFG80211) && !defined(CONFIG_CFG80211) && !defined(CONFIG_CFG80211_MODULE)
  117994. + #error "Can't define CONFIG_IOCTL_CFG80211 because neither CONFIG_CFG80211 nor CONFIG_CFG80211_MODULE is defined in kernel"
  117995. +#endif
  117996. +#if defined(CONFIG_IOCTL_CFG80211) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)
  117997. + #error "We haven't verify our cfg80211 solution below kernel version 2.6.35"
  117998. +#endif
  117999. +
  118000. +#if defined(RTW_USE_CFG80211_STA_EVENT)
  118001. + #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
  118002. +#endif
  118003. +
  118004. +struct rtw_wdev_invit_info {
  118005. + u8 state; /* 0: req, 1:rep */
  118006. + u8 peer_mac[ETH_ALEN];
  118007. + u8 active;
  118008. + u8 token;
  118009. + u8 flags;
  118010. + u8 status;
  118011. + u8 req_op_ch;
  118012. + u8 rsp_op_ch;
  118013. +};
  118014. +
  118015. +#define rtw_wdev_invit_info_init(invit_info) \
  118016. + do { \
  118017. + (invit_info)->state = 0xff; \
  118018. + _rtw_memset((invit_info)->peer_mac, 0, ETH_ALEN); \
  118019. + (invit_info)->active = 0xff; \
  118020. + (invit_info)->token = 0; \
  118021. + (invit_info)->flags = 0x00; \
  118022. + (invit_info)->status = 0xff; \
  118023. + (invit_info)->req_op_ch = 0; \
  118024. + (invit_info)->rsp_op_ch = 0; \
  118025. + } while (0)
  118026. +
  118027. +struct rtw_wdev_nego_info {
  118028. + u8 state; /* 0: req, 1:rep, 3:conf */
  118029. + u8 peer_mac[ETH_ALEN];
  118030. + u8 active;
  118031. + u8 token;
  118032. + u8 status;
  118033. + u8 req_intent;
  118034. + u8 req_op_ch;
  118035. + u8 req_listen_ch;
  118036. + u8 rsp_intent;
  118037. + u8 rsp_op_ch;
  118038. + u8 conf_op_ch;
  118039. +};
  118040. +
  118041. +#define rtw_wdev_nego_info_init(nego_info) \
  118042. + do { \
  118043. + (nego_info)->state = 0xff; \
  118044. + _rtw_memset((nego_info)->peer_mac, 0, ETH_ALEN); \
  118045. + (nego_info)->active = 0xff; \
  118046. + (nego_info)->token = 0; \
  118047. + (nego_info)->status = 0xff; \
  118048. + (nego_info)->req_intent = 0xff; \
  118049. + (nego_info)->req_op_ch = 0; \
  118050. + (nego_info)->req_listen_ch = 0; \
  118051. + (nego_info)->rsp_intent = 0xff; \
  118052. + (nego_info)->rsp_op_ch = 0; \
  118053. + (nego_info)->conf_op_ch = 0; \
  118054. + } while (0)
  118055. +
  118056. +struct rtw_wdev_priv
  118057. +{
  118058. + struct wireless_dev *rtw_wdev;
  118059. +
  118060. + _adapter *padapter;
  118061. +
  118062. + struct cfg80211_scan_request *scan_request;
  118063. + _lock scan_req_lock;
  118064. +
  118065. + struct net_device *pmon_ndev;//for monitor interface
  118066. + char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface
  118067. +
  118068. + u8 p2p_enabled;
  118069. +
  118070. + u8 provdisc_req_issued;
  118071. +
  118072. + struct rtw_wdev_invit_info invit_info;
  118073. + struct rtw_wdev_nego_info nego_info;
  118074. +
  118075. + u8 bandroid_scan;
  118076. + bool block;
  118077. + bool power_mgmt;
  118078. +
  118079. +#ifdef CONFIG_CONCURRENT_MODE
  118080. + ATOMIC_T ro_ch_to;
  118081. + ATOMIC_T switch_ch_to;
  118082. +#endif
  118083. +
  118084. +};
  118085. +
  118086. +#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w)))
  118087. +
  118088. +#define wiphy_to_adapter(x) (_adapter *)(((struct rtw_wdev_priv*)wiphy_priv(x))->padapter)
  118089. +
  118090. +#define wiphy_to_wdev(x) (struct wireless_dev *)(((struct rtw_wdev_priv*)wiphy_priv(x))->rtw_wdev)
  118091. +
  118092. +int rtw_wdev_alloc(_adapter *padapter, struct device *dev);
  118093. +void rtw_wdev_free(struct wireless_dev *wdev);
  118094. +void rtw_wdev_unregister(struct wireless_dev *wdev);
  118095. +
  118096. +void rtw_cfg80211_init_wiphy(_adapter *padapter);
  118097. +
  118098. +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter);
  118099. +int rtw_cfg80211_check_bss(_adapter *padapter);
  118100. +void rtw_cfg80211_indicate_connect(_adapter *padapter);
  118101. +void rtw_cfg80211_indicate_disconnect(_adapter *padapter);
  118102. +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted);
  118103. +
  118104. +#ifdef CONFIG_AP_MODE
  118105. +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);
  118106. +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason);
  118107. +#endif //CONFIG_AP_MODE
  118108. +
  118109. +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len);
  118110. +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);
  118111. +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);
  118112. +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg);
  118113. +
  118114. +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type);
  118115. +
  118116. +bool rtw_cfg80211_pwr_mgmt(_adapter *adapter);
  118117. +
  118118. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE)
  118119. +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp)
  118120. +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
  118121. +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp)
  118122. +#else
  118123. +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp)
  118124. +#endif
  118125. +
  118126. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE)
  118127. +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len)
  118128. +#else
  118129. +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len)
  118130. +#endif
  118131. +
  118132. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
  118133. +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp)
  118134. +#else
  118135. +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp)
  118136. +#endif
  118137. +
  118138. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
  118139. +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp)
  118140. +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp)
  118141. +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  118142. +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp)
  118143. +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp)
  118144. +#else
  118145. +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp)
  118146. +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp)
  118147. +#endif
  118148. +
  118149. +#endif //__IOCTL_CFG80211_H__
  118150. --- /dev/null
  118151. +++ b/drivers/net/wireless/rtl8192cu/include/ip.h
  118152. @@ -0,0 +1,141 @@
  118153. +/******************************************************************************
  118154. + *
  118155. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118156. + *
  118157. + * This program is free software; you can redistribute it and/or modify it
  118158. + * under the terms of version 2 of the GNU General Public License as
  118159. + * published by the Free Software Foundation.
  118160. + *
  118161. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118162. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118163. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118164. + * more details.
  118165. + *
  118166. + * You should have received a copy of the GNU General Public License along with
  118167. + * this program; if not, write to the Free Software Foundation, Inc.,
  118168. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118169. + *
  118170. + *
  118171. + ******************************************************************************/
  118172. +#ifndef _LINUX_IP_H
  118173. +#define _LINUX_IP_H
  118174. +#include <rtw_byteorder.h>
  118175. +
  118176. +/* SOL_IP socket options */
  118177. +
  118178. +#define IPTOS_TOS_MASK 0x1E
  118179. +#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK)
  118180. +#define IPTOS_LOWDELAY 0x10
  118181. +#define IPTOS_THROUGHPUT 0x08
  118182. +#define IPTOS_RELIABILITY 0x04
  118183. +#define IPTOS_MINCOST 0x02
  118184. +
  118185. +#define IPTOS_PREC_MASK 0xE0
  118186. +#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK)
  118187. +#define IPTOS_PREC_NETCONTROL 0xe0
  118188. +#define IPTOS_PREC_INTERNETCONTROL 0xc0
  118189. +#define IPTOS_PREC_CRITIC_ECP 0xa0
  118190. +#define IPTOS_PREC_FLASHOVERRIDE 0x80
  118191. +#define IPTOS_PREC_FLASH 0x60
  118192. +#define IPTOS_PREC_IMMEDIATE 0x40
  118193. +#define IPTOS_PREC_PRIORITY 0x20
  118194. +#define IPTOS_PREC_ROUTINE 0x00
  118195. +
  118196. +
  118197. +/* IP options */
  118198. +#define IPOPT_COPY 0x80
  118199. +#define IPOPT_CLASS_MASK 0x60
  118200. +#define IPOPT_NUMBER_MASK 0x1f
  118201. +
  118202. +#define IPOPT_COPIED(o) ((o)&IPOPT_COPY)
  118203. +#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK)
  118204. +#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK)
  118205. +
  118206. +#define IPOPT_CONTROL 0x00
  118207. +#define IPOPT_RESERVED1 0x20
  118208. +#define IPOPT_MEASUREMENT 0x40
  118209. +#define IPOPT_RESERVED2 0x60
  118210. +
  118211. +#define IPOPT_END (0 |IPOPT_CONTROL)
  118212. +#define IPOPT_NOOP (1 |IPOPT_CONTROL)
  118213. +#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY)
  118214. +#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY)
  118215. +#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT)
  118216. +#define IPOPT_RR (7 |IPOPT_CONTROL)
  118217. +#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY)
  118218. +#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY)
  118219. +#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY)
  118220. +
  118221. +#define IPVERSION 4
  118222. +#define MAXTTL 255
  118223. +#define IPDEFTTL 64
  118224. +
  118225. +/* struct timestamp, struct route and MAX_ROUTES are removed.
  118226. +
  118227. + REASONS: it is clear that nobody used them because:
  118228. + - MAX_ROUTES value was wrong.
  118229. + - "struct route" was wrong.
  118230. + - "struct timestamp" had fatally misaligned bitfields and was completely unusable.
  118231. + */
  118232. +
  118233. +#define IPOPT_OPTVAL 0
  118234. +#define IPOPT_OLEN 1
  118235. +#define IPOPT_OFFSET 2
  118236. +#define IPOPT_MINOFF 4
  118237. +#define MAX_IPOPTLEN 40
  118238. +#define IPOPT_NOP IPOPT_NOOP
  118239. +#define IPOPT_EOL IPOPT_END
  118240. +#define IPOPT_TS IPOPT_TIMESTAMP
  118241. +
  118242. +#define IPOPT_TS_TSONLY 0 /* timestamps only */
  118243. +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
  118244. +#define IPOPT_TS_PRESPEC 3 /* specified modules only */
  118245. +
  118246. +#ifdef PLATFORM_LINUX
  118247. +
  118248. +struct ip_options {
  118249. + __u32 faddr; /* Saved first hop address */
  118250. + unsigned char optlen;
  118251. + unsigned char srr;
  118252. + unsigned char rr;
  118253. + unsigned char ts;
  118254. + unsigned char is_setbyuser:1, /* Set by setsockopt? */
  118255. + is_data:1, /* Options in __data, rather than skb */
  118256. + is_strictroute:1, /* Strict source route */
  118257. + srr_is_hit:1, /* Packet destination addr was our one */
  118258. + is_changed:1, /* IP checksum more not valid */
  118259. + rr_needaddr:1, /* Need to record addr of outgoing dev */
  118260. + ts_needtime:1, /* Need to record timestamp */
  118261. + ts_needaddr:1; /* Need to record addr of outgoing dev */
  118262. + unsigned char router_alert;
  118263. + unsigned char __pad1;
  118264. + unsigned char __pad2;
  118265. + unsigned char __data[0];
  118266. +};
  118267. +
  118268. +#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
  118269. +#endif
  118270. +
  118271. +struct iphdr {
  118272. +#if defined(__LITTLE_ENDIAN_BITFIELD)
  118273. + __u8 ihl:4,
  118274. + version:4;
  118275. +#elif defined (__BIG_ENDIAN_BITFIELD)
  118276. + __u8 version:4,
  118277. + ihl:4;
  118278. +#else
  118279. +#error "Please fix <asm/byteorder.h>"
  118280. +#endif
  118281. + __u8 tos;
  118282. + __u16 tot_len;
  118283. + __u16 id;
  118284. + __u16 frag_off;
  118285. + __u8 ttl;
  118286. + __u8 protocol;
  118287. + __u16 check;
  118288. + __u32 saddr;
  118289. + __u32 daddr;
  118290. + /*The options start here. */
  118291. +};
  118292. +
  118293. +#endif /* _LINUX_IP_H */
  118294. --- /dev/null
  118295. +++ b/drivers/net/wireless/rtl8192cu/include/linux/wireless.h
  118296. @@ -0,0 +1,90 @@
  118297. +/******************************************************************************
  118298. + *
  118299. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118300. + *
  118301. + * This program is free software; you can redistribute it and/or modify it
  118302. + * under the terms of version 2 of the GNU General Public License as
  118303. + * published by the Free Software Foundation.
  118304. + *
  118305. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118306. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118307. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118308. + * more details.
  118309. + *
  118310. + * You should have received a copy of the GNU General Public License along with
  118311. + * this program; if not, write to the Free Software Foundation, Inc.,
  118312. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118313. + *
  118314. + *
  118315. + ******************************************************************************/
  118316. +
  118317. +#ifndef _LINUX_WIRELESS_H
  118318. +#define _LINUX_WIRELESS_H
  118319. +
  118320. +/***************************** INCLUDES *****************************/
  118321. +
  118322. +#if 0
  118323. +#include <linux/types.h> /* for __u* and __s* typedefs */
  118324. +#include <linux/socket.h> /* for "struct sockaddr" et al */
  118325. +#include <linux/if.h> /* for IFNAMSIZ and co... */
  118326. +#else
  118327. +#define __user
  118328. +//typedef uint16_t __u16;
  118329. +#include <sys/socket.h> /* for "struct sockaddr" et al */
  118330. +#include <net/if.h> /* for IFNAMSIZ and co... */
  118331. +#endif
  118332. +
  118333. +/****************************** TYPES ******************************/
  118334. +
  118335. +/* --------------------------- SUBTYPES --------------------------- */
  118336. +/*
  118337. + * For all data larger than 16 octets, we need to use a
  118338. + * pointer to memory allocated in user space.
  118339. + */
  118340. +struct iw_point
  118341. +{
  118342. + void __user *pointer; /* Pointer to the data (in user space) */
  118343. + __u16 length; /* number of fields or size in bytes */
  118344. + __u16 flags; /* Optional params */
  118345. +};
  118346. +
  118347. +
  118348. +/* ------------------------ IOCTL REQUEST ------------------------ */
  118349. +/*
  118350. + * This structure defines the payload of an ioctl, and is used
  118351. + * below.
  118352. + *
  118353. + * Note that this structure should fit on the memory footprint
  118354. + * of iwreq (which is the same as ifreq), which mean a max size of
  118355. + * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...
  118356. + * You should check this when increasing the structures defined
  118357. + * above in this file...
  118358. + */
  118359. +union iwreq_data
  118360. +{
  118361. + /* Config - generic */
  118362. + char name[IFNAMSIZ];
  118363. + /* Name : used to verify the presence of wireless extensions.
  118364. + * Name of the protocol/provider... */
  118365. +
  118366. + struct iw_point data; /* Other large parameters */
  118367. +};
  118368. +
  118369. +/*
  118370. + * The structure to exchange data for ioctl.
  118371. + * This structure is the same as 'struct ifreq', but (re)defined for
  118372. + * convenience...
  118373. + * Do I need to remind you about structure size (32 octets) ?
  118374. + */
  118375. +struct iwreq
  118376. +{
  118377. + union
  118378. + {
  118379. + char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */
  118380. + } ifr_ifrn;
  118381. +
  118382. + /* Data part (defined just above) */
  118383. + union iwreq_data u;
  118384. +};
  118385. +
  118386. +#endif /* _LINUX_WIRELESS_H */
  118387. --- /dev/null
  118388. +++ b/drivers/net/wireless/rtl8192cu/include/mlme_osdep.h
  118389. @@ -0,0 +1,39 @@
  118390. +/******************************************************************************
  118391. + *
  118392. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118393. + *
  118394. + * This program is free software; you can redistribute it and/or modify it
  118395. + * under the terms of version 2 of the GNU General Public License as
  118396. + * published by the Free Software Foundation.
  118397. + *
  118398. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118399. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118400. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118401. + * more details.
  118402. + *
  118403. + * You should have received a copy of the GNU General Public License along with
  118404. + * this program; if not, write to the Free Software Foundation, Inc.,
  118405. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118406. + *
  118407. + *
  118408. + ******************************************************************************/
  118409. +#ifndef __MLME_OSDEP_H_
  118410. +#define __MLME_OSDEP_H_
  118411. +
  118412. +#include <drv_conf.h>
  118413. +#include <osdep_service.h>
  118414. +#include <drv_types.h>
  118415. +
  118416. +#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL)
  118417. +extern int time_after(u32 now, u32 old);
  118418. +#endif
  118419. +
  118420. +extern void rtw_init_mlme_timer(_adapter *padapter);
  118421. +extern void rtw_os_indicate_disconnect( _adapter *adapter );
  118422. +extern void rtw_os_indicate_connect( _adapter *adapter );
  118423. +void rtw_os_indicate_scan_done( _adapter *padapter, bool aborted);
  118424. +extern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie);
  118425. +
  118426. +void rtw_reset_securitypriv( _adapter *adapter );
  118427. +
  118428. +#endif //_MLME_OSDEP_H_
  118429. --- /dev/null
  118430. +++ b/drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h
  118431. @@ -0,0 +1,353 @@
  118432. +/******************************************************************************
  118433. + *
  118434. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118435. + *
  118436. + * This program is free software; you can redistribute it and/or modify it
  118437. + * under the terms of version 2 of the GNU General Public License as
  118438. + * published by the Free Software Foundation.
  118439. + *
  118440. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118441. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118442. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118443. + * more details.
  118444. + *
  118445. + * You should have received a copy of the GNU General Public License along with
  118446. + * this program; if not, write to the Free Software Foundation, Inc.,
  118447. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118448. + *
  118449. + *
  118450. + ******************************************************************************/
  118451. +#ifndef __CUSTOM_OID_H
  118452. +#define __CUSTOM_OID_H
  118453. +
  118454. +// by Owen
  118455. +// 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit
  118456. +// 0xFF818500 - 0xFF81850F RTL8185 Setup Utility
  118457. +// 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility
  118458. +
  118459. +//
  118460. +
  118461. +// by Owen for Production Kit
  118462. +// For Production Kit with Agilent Equipments
  118463. +// in order to make our custom oids hopefully somewhat unique
  118464. +// we will use 0xFF (indicating implementation specific OID)
  118465. +// 81(first byte of non zero Realtek unique identifier)
  118466. +// 80 (second byte of non zero Realtek unique identifier)
  118467. +// XX (the custom OID number - providing 255 possible custom oids)
  118468. +
  118469. +#define OID_RT_PRO_RESET_DUT 0xFF818000
  118470. +#define OID_RT_PRO_SET_DATA_RATE 0xFF818001
  118471. +#define OID_RT_PRO_START_TEST 0xFF818002
  118472. +#define OID_RT_PRO_STOP_TEST 0xFF818003
  118473. +#define OID_RT_PRO_SET_PREAMBLE 0xFF818004
  118474. +#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005
  118475. +#define OID_RT_PRO_SET_FILTER_BB 0xFF818006
  118476. +#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007
  118477. +#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008
  118478. +#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009
  118479. +#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A
  118480. +
  118481. +#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D
  118482. +#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E
  118483. +#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F
  118484. +#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010
  118485. +#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011
  118486. +#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012
  118487. +#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013
  118488. +#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014
  118489. +#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015
  118490. +#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016
  118491. +#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017
  118492. +#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018
  118493. +#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019
  118494. +#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A
  118495. +#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B
  118496. +#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C
  118497. +#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D
  118498. +#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E
  118499. +#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F
  118500. +#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020
  118501. +#define OID_RT_PRO_WRITE_EEPROM 0xFF818021
  118502. +#define OID_RT_PRO_READ_EEPROM 0xFF818022
  118503. +#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023
  118504. +#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024
  118505. +#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025
  118506. +#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026
  118507. +#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027
  118508. +#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028
  118509. +#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029
  118510. +#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A
  118511. +#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C
  118512. +// added by Owen on 04/08/03 for Cameo's request
  118513. +#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D
  118514. +#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E
  118515. +#define OID_RT_PRO_SET_MODULATION 0xFF81802F
  118516. +//
  118517. +
  118518. +//Sean
  118519. +#define OID_RT_DRIVER_OPTION 0xFF818080
  118520. +#define OID_RT_RF_OFF 0xFF818081
  118521. +#define OID_RT_AUTH_STATUS 0xFF818082
  118522. +
  118523. +//========================================================================
  118524. +#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B
  118525. +#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C
  118526. +#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B
  118527. +#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043
  118528. +//========================================================================
  118529. +
  118530. +
  118531. +// by Owen for RTL8185 Phy Status Report Utility
  118532. +#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580
  118533. +#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581
  118534. +#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582
  118535. +#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583
  118536. +#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584
  118537. +#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS 0xFF818585
  118538. +#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586
  118539. +//
  118540. +
  118541. +// by Owen on 03/09/19-03/09/22 for RTL8185
  118542. +#define OID_RT_WIRELESS_MODE 0xFF818500
  118543. +#define OID_RT_SUPPORTED_RATES 0xFF818501
  118544. +#define OID_RT_DESIRED_RATES 0xFF818502
  118545. +#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503
  118546. +//
  118547. +
  118548. +#define OID_RT_GET_CONNECT_STATE 0xFF030001
  118549. +#define OID_RT_RESCAN 0xFF030002
  118550. +#define OID_RT_SET_KEY_LENGTH 0xFF030003
  118551. +#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004
  118552. +
  118553. +#define OID_RT_SET_CHANNEL 0xFF010182
  118554. +#define OID_RT_SET_SNIFFER_MODE 0xFF010183
  118555. +#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184
  118556. +#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185
  118557. +#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186
  118558. +#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187
  118559. +#define OID_RT_GET_TX_RETRY 0xFF010188
  118560. +#define OID_RT_GET_RX_RETRY 0xFF010189
  118561. +#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A//S
  118562. +#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B//S
  118563. +
  118564. +#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190
  118565. +#define OID_RT_GET_TX_BEACON_OK 0xFF010191
  118566. +#define OID_RT_GET_TX_BEACON_ERR 0xFF010192
  118567. +#define OID_RT_GET_RX_ICV_ERR 0xFF010193
  118568. +#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194
  118569. +#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195
  118570. +#define OID_RT_GET_PREAMBLE_MODE 0xFF010196
  118571. +#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197
  118572. +#define OID_RT_GET_AP_IP 0xFF010198
  118573. +#define OID_RT_GET_CHANNELPLAN 0xFF010199
  118574. +#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A
  118575. +#define OID_RT_SET_BCN_INTVL 0xFF01019B
  118576. +#define OID_RT_GET_RF_VENDER 0xFF01019C
  118577. +#define OID_RT_DEDICATE_PROBE 0xFF01019D
  118578. +#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E
  118579. +
  118580. +#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F
  118581. +
  118582. +#define OID_RT_GET_CCA_ERR 0xFF0101A0
  118583. +#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1
  118584. +#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2
  118585. +
  118586. +#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3
  118587. +#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4
  118588. +
  118589. +// by Owen on 03/31/03 for Cameo's request
  118590. +#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5
  118591. +//
  118592. +#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5
  118593. +#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6
  118594. +#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7
  118595. +#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8
  118596. +#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9
  118597. +#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA
  118598. +#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB
  118599. +#define OID_RT_GET_CHANNEL 0xFF0101AC
  118600. +
  118601. +#define OID_RT_SET_CHANNELPLAN 0xFF0101AD
  118602. +#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE
  118603. +#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF
  118604. +#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0
  118605. +#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1
  118606. +#define OID_RT_GET_IS_ROAMING 0xFF0101B2
  118607. +#define OID_RT_GET_IS_PRIVACY 0xFF0101B3
  118608. +#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4
  118609. +#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5
  118610. +#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6
  118611. +#define OID_RT_RESET_LOG 0xFF0101B7
  118612. +#define OID_RT_GET_LOG 0xFF0101B8
  118613. +#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9
  118614. +#define OID_RT_GET_HEADER_FAIL 0xFF0101BA
  118615. +#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB
  118616. +#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC
  118617. +#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD
  118618. +#define OID_RT_GET_TX_INFO 0xFF0101BE
  118619. +#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF
  118620. +#define OID_RT_RF_READ_WRITE 0xFF0101C0
  118621. +
  118622. +// For Netgear request. 2005.01.13, by rcnjko.
  118623. +#define OID_RT_FORCED_DATA_RATE 0xFF0101C1
  118624. +#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2
  118625. +// For Netgear request. 2005.02.17, by rcnjko.
  118626. +#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3
  118627. +// For AZ project. 2005.06.27, by rcnjko.
  118628. +#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4
  118629. +
  118630. +// Vincent 8185MP
  118631. +#define OID_RT_PRO_RX_FILTER 0xFF0111C0
  118632. +
  118633. +//Andy TEST
  118634. +//#define OID_RT_PRO_WRITE_REGISTRY 0xFF0111C1
  118635. +//#define OID_RT_PRO_READ_REGISTRY 0xFF0111C2
  118636. +#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1
  118637. +#define OID_CE_USB_READ_REGISTRY 0xFF0111C2
  118638. +
  118639. +
  118640. +#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3
  118641. +#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4
  118642. +#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5
  118643. +#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6
  118644. +#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7
  118645. +#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8
  118646. +#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9
  118647. +#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA
  118648. +
  118649. +// AP OID
  118650. +#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300
  118651. +#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301
  118652. +#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302
  118653. +#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303
  118654. +#define OID_RT_AP_SUPPORTED 0xFF010304 // Determine if driver supports AP mode. 2004.08.27, by rcnjko.
  118655. +#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 // Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko.
  118656. +
  118657. +// 8187MP. 2004.09.06, by rcnjko.
  118658. +#define OID_RT_PRO8187_WI_POLL 0xFF818780
  118659. +#define OID_RT_PRO_WRITE_BB_REG 0xFF818781
  118660. +#define OID_RT_PRO_READ_BB_REG 0xFF818782
  118661. +#define OID_RT_PRO_WRITE_RF_REG 0xFF818783
  118662. +#define OID_RT_PRO_READ_RF_REG 0xFF818784
  118663. +
  118664. +// Meeting House. added by Annie, 2005-07-20.
  118665. +#define OID_RT_MH_VENDER_ID 0xFFEDC100
  118666. +
  118667. +//8711 MP OID added 20051230.
  118668. +#define OID_RT_PRO8711_JOIN_BSS 0xFF871100//S
  118669. +
  118670. +#define OID_RT_PRO_READ_REGISTER 0xFF871101 //Q
  118671. +#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 //S
  118672. +
  118673. +#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 //Q
  118674. +#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 //S
  118675. +
  118676. +#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 //S
  118677. +
  118678. +#define OID_RT_PRO_READ16_EEPROM 0xFF871106 //Q
  118679. +#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 //S
  118680. +
  118681. +#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 //S
  118682. +#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 //Q
  118683. +
  118684. +#define OID_RT_PRO8711_WI_POLL 0xFF87110A //Q
  118685. +#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B //Q
  118686. +#define OID_RT_RD_ATTRIB_MEM 0xFF87110C//Q
  118687. +#define OID_RT_WR_ATTRIB_MEM 0xFF87110D//S
  118688. +
  118689. +
  118690. +//Method 2 for H2C/C2H
  118691. +#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 //S
  118692. +#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 //Q
  118693. +#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 //S
  118694. +#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 //Q
  118695. +#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114//Q
  118696. +
  118697. +#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 //Q, S
  118698. +
  118699. +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 //S
  118700. +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 //Q,S
  118701. +#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 //Q
  118702. +#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 //Q
  118703. +
  118704. +#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A //S
  118705. +#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B //Q
  118706. +#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C //S
  118707. +#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D //Q
  118708. +#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E //S
  118709. +#define OID_RT_POLL_RX_STATUS 0xFF87111F //Q
  118710. +
  118711. +#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 //Q,S
  118712. +#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121//S
  118713. +#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122//S
  118714. +#define OID_RT_PRO_READ_TSSI 0xFF871123//S
  118715. +#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124//S
  118716. +
  118717. +
  118718. +#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 //Q
  118719. +#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 //S
  118720. +
  118721. +//Method 2 , using workitem
  118722. +#define OID_RT_SET_READ_REG 0xFF871181 //S
  118723. +#define OID_RT_SET_WRITE_REG 0xFF871182 //S
  118724. +#define OID_RT_SET_BURST_READ_REG 0xFF871183 //S
  118725. +#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 //S
  118726. +#define OID_RT_SET_WRITE_TXCMD 0xFF871185 //S
  118727. +#define OID_RT_SET_READ16_EEPROM 0xFF871186 //S
  118728. +#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 //S
  118729. +#define OID_RT_QRY_POLL_WKITEM 0xFF871188 //Q
  118730. +
  118731. +//For SDIO INTERFACE only
  118732. +#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 //Q, S
  118733. +#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1
  118734. +
  118735. +//For USB INTERFACE only
  118736. +#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 //Q, S
  118737. +#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 //S
  118738. +#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 //S
  118739. +#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 //Q
  118740. +#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 //Q
  118741. +
  118742. +#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB //S
  118743. +#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC //S
  118744. +#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE
  118745. +
  118746. +#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 //Q, S
  118747. +#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 //S
  118748. +#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 //S
  118749. +#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 //Q
  118750. +
  118751. +#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 //Q, S
  118752. +
  118753. +#define OID_RT_PRO_READ_EFUSE 0xFF871205 //Q
  118754. +#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 //S
  118755. +#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 //Q, S
  118756. +#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 //Q
  118757. +
  118758. +#define OID_RT_SET_BANDWIDTH 0xFF871209 //S
  118759. +#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A //S
  118760. +
  118761. +#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B //S
  118762. +
  118763. +#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C //Q
  118764. +
  118765. +#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D //S
  118766. +
  118767. +#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E //S
  118768. +
  118769. +#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F //S
  118770. +
  118771. +#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 //Q
  118772. +
  118773. +#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 //S
  118774. +#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 //Q
  118775. +#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 //Q
  118776. +
  118777. +#define OID_RT_SET_POWER_DOWN 0xFF871214 //S
  118778. +
  118779. +#define OID_RT_GET_POWER_MODE 0xFF871215 //Q
  118780. +
  118781. +#define OID_RT_PRO_EFUSE 0xFF871216 //Q, S
  118782. +#define OID_RT_PRO_EFUSE_MAP 0xFF871217 //Q, S
  118783. +
  118784. +#endif //#ifndef __CUSTOM_OID_H
  118785. --- /dev/null
  118786. +++ b/drivers/net/wireless/rtl8192cu/include/nic_spec.h
  118787. @@ -0,0 +1,46 @@
  118788. +/******************************************************************************
  118789. + *
  118790. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118791. + *
  118792. + * This program is free software; you can redistribute it and/or modify it
  118793. + * under the terms of version 2 of the GNU General Public License as
  118794. + * published by the Free Software Foundation.
  118795. + *
  118796. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118797. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118798. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118799. + * more details.
  118800. + *
  118801. + * You should have received a copy of the GNU General Public License along with
  118802. + * this program; if not, write to the Free Software Foundation, Inc.,
  118803. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118804. + *
  118805. + *
  118806. + ******************************************************************************/
  118807. +
  118808. +
  118809. +#ifndef __NIC_SPEC_H__
  118810. +#define __NIC_SPEC_H__
  118811. +
  118812. +#include <drv_conf.h>
  118813. +
  118814. +#define RTL8711_MCTRL_ (0x20000)
  118815. +#define RTL8711_UART_ (0x30000)
  118816. +#define RTL8711_TIMER_ (0x40000)
  118817. +#define RTL8711_FINT_ (0x50000)
  118818. +#define RTL8711_HINT_ (0x50000)
  118819. +#define RTL8711_GPIO_ (0x60000)
  118820. +#define RTL8711_WLANCTRL_ (0x200000)
  118821. +#define RTL8711_WLANFF_ (0xe00000)
  118822. +#define RTL8711_HCICTRL_ (0x600000)
  118823. +#define RTL8711_SYSCFG_ (0x620000)
  118824. +#define RTL8711_SYSCTRL_ (0x620000)
  118825. +#define RTL8711_MCCTRL_ (0x020000)
  118826. +
  118827. +
  118828. +#include <rtl8711_regdef.h>
  118829. +
  118830. +#include <rtl8711_bitdef.h>
  118831. +
  118832. +
  118833. +#endif // __RTL8711_SPEC_H__
  118834. --- /dev/null
  118835. +++ b/drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h
  118836. @@ -0,0 +1,170 @@
  118837. +/******************************************************************************
  118838. + *
  118839. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  118840. + *
  118841. + * This program is free software; you can redistribute it and/or modify it
  118842. + * under the terms of version 2 of the GNU General Public License as
  118843. + * published by the Free Software Foundation.
  118844. + *
  118845. + * This program is distributed in the hope that it will be useful, but WITHOUT
  118846. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  118847. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  118848. + * more details.
  118849. + *
  118850. + * You should have received a copy of the GNU General Public License along with
  118851. + * this program; if not, write to the Free Software Foundation, Inc.,
  118852. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  118853. + *
  118854. + *
  118855. + ******************************************************************************/
  118856. +
  118857. +#ifndef __OSDEP_CE_SERVICE_H_
  118858. +#define __OSDEP_CE_SERVICE_H_
  118859. +
  118860. +
  118861. +#include <ndis.h>
  118862. +#include <ntddndis.h>
  118863. +
  118864. +#ifdef CONFIG_SDIO_HCI
  118865. +#include "SDCardDDK.h"
  118866. +#endif
  118867. +
  118868. +#ifdef CONFIG_USB_HCI
  118869. +#include <usbdi.h>
  118870. +#endif
  118871. +
  118872. +typedef HANDLE _sema;
  118873. +typedef LIST_ENTRY _list;
  118874. +typedef NDIS_STATUS _OS_STATUS;
  118875. +
  118876. +typedef NDIS_SPIN_LOCK _lock;
  118877. +
  118878. +typedef HANDLE _rwlock; //Mutex
  118879. +
  118880. +typedef u32 _irqL;
  118881. +
  118882. +typedef NDIS_HANDLE _nic_hdl;
  118883. +
  118884. +
  118885. +typedef NDIS_MINIPORT_TIMER _timer;
  118886. +
  118887. +struct __queue {
  118888. + LIST_ENTRY queue;
  118889. + _lock lock;
  118890. +};
  118891. +
  118892. +typedef NDIS_PACKET _pkt;
  118893. +typedef NDIS_BUFFER _buffer;
  118894. +typedef struct __queue _queue;
  118895. +
  118896. +typedef HANDLE _thread_hdl_;
  118897. +typedef DWORD thread_return;
  118898. +typedef void* thread_context;
  118899. +typedef NDIS_WORK_ITEM _workitem;
  118900. +
  118901. +#define thread_exit() ExitThread(STATUS_SUCCESS); return 0;
  118902. +
  118903. +
  118904. +#define SEMA_UPBND (0x7FFFFFFF) //8192
  118905. +
  118906. +__inline static _list *get_prev(_list *list)
  118907. +{
  118908. + return list->Blink;
  118909. +}
  118910. +
  118911. +__inline static _list *get_next(_list *list)
  118912. +{
  118913. + return list->Flink;
  118914. +}
  118915. +
  118916. +__inline static _list *get_list_head(_queue *queue)
  118917. +{
  118918. + return (&(queue->queue));
  118919. +}
  118920. +
  118921. +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member)
  118922. +
  118923. +__inline static void _enter_critical(_lock *plock, _irqL *pirqL)
  118924. +{
  118925. + NdisAcquireSpinLock(plock);
  118926. +}
  118927. +
  118928. +__inline static void _exit_critical(_lock *plock, _irqL *pirqL)
  118929. +{
  118930. + NdisReleaseSpinLock(plock);
  118931. +}
  118932. +
  118933. +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL)
  118934. +{
  118935. + NdisDprAcquireSpinLock(plock);
  118936. +}
  118937. +
  118938. +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL)
  118939. +{
  118940. + NdisDprReleaseSpinLock(plock);
  118941. +}
  118942. +
  118943. +
  118944. +__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL)
  118945. +{
  118946. + WaitForSingleObject(*prwlock, INFINITE );
  118947. +
  118948. +}
  118949. +
  118950. +__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL)
  118951. +{
  118952. + ReleaseMutex(*prwlock);
  118953. +}
  118954. +
  118955. +__inline static void rtw_list_delete(_list *plist)
  118956. +{
  118957. + RemoveEntryList(plist);
  118958. + InitializeListHead(plist);
  118959. +}
  118960. +
  118961. +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx)
  118962. +{
  118963. + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx);
  118964. +}
  118965. +
  118966. +__inline static void _set_timer(_timer *ptimer,u32 delay_time)
  118967. +{
  118968. + NdisMSetTimer(ptimer,delay_time);
  118969. +}
  118970. +
  118971. +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)
  118972. +{
  118973. + NdisMCancelTimer(ptimer,bcancelled);
  118974. +}
  118975. +
  118976. +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)
  118977. +{
  118978. +
  118979. + NdisInitializeWorkItem(pwork, pfunc, cntx);
  118980. +}
  118981. +
  118982. +__inline static void _set_workitem(_workitem *pwork)
  118983. +{
  118984. + NdisScheduleWorkItem(pwork);
  118985. +}
  118986. +
  118987. +#define ATOMIC_INIT(i) { (i) }
  118988. +
  118989. +//
  118990. +// Global Mutex: can only be used at PASSIVE level.
  118991. +//
  118992. +
  118993. +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \
  118994. +{ \
  118995. + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\
  118996. + { \
  118997. + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \
  118998. + NdisMSleep(10000); \
  118999. + } \
  119000. +}
  119001. +
  119002. +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \
  119003. +{ \
  119004. + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \
  119005. +}
  119006. +#endif
  119007. --- /dev/null
  119008. +++ b/drivers/net/wireless/rtl8192cu/include/osdep_intf.h
  119009. @@ -0,0 +1,154 @@
  119010. +/******************************************************************************
  119011. + *
  119012. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  119013. + *
  119014. + * This program is free software; you can redistribute it and/or modify it
  119015. + * under the terms of version 2 of the GNU General Public License as
  119016. + * published by the Free Software Foundation.
  119017. + *
  119018. + * This program is distributed in the hope that it will be useful, but WITHOUT
  119019. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  119020. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  119021. + * more details.
  119022. + *
  119023. + * You should have received a copy of the GNU General Public License along with
  119024. + * this program; if not, write to the Free Software Foundation, Inc.,
  119025. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  119026. + *
  119027. + *
  119028. + ******************************************************************************/
  119029. +
  119030. +#ifndef __OSDEP_INTF_H_
  119031. +#define __OSDEP_INTF_H_
  119032. +
  119033. +#include <drv_conf.h>
  119034. +#include <osdep_service.h>
  119035. +#include <drv_types.h>
  119036. +
  119037. +struct intf_priv {
  119038. +
  119039. + u8 *intf_dev;
  119040. + u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64
  119041. + u32 max_xmitsz; //USB2.0: unlimited, SDIO:512
  119042. + u32 max_recvsz; //USB2.0: unlimited, SDIO:512
  119043. +
  119044. + volatile u8 *io_rwmem;
  119045. + volatile u8 *allocated_io_rwmem;
  119046. + u32 io_wsz; //unit: 4bytes
  119047. + u32 io_rsz;//unit: 4bytes
  119048. + u8 intf_status;
  119049. +
  119050. + void (*_bus_io)(u8 *priv);
  119051. +
  119052. +/*
  119053. +Under Sync. IRP (SDIO/USB)
  119054. +A protection mechanism is necessary for the io_rwmem(read/write protocol)
  119055. +
  119056. +Under Async. IRP (SDIO/USB)
  119057. +The protection mechanism is through the pending queue.
  119058. +*/
  119059. +
  119060. + _mutex ioctl_mutex;
  119061. +
  119062. +
  119063. +#ifdef PLATFORM_LINUX
  119064. + #ifdef CONFIG_USB_HCI
  119065. + // when in USB, IO is through interrupt in/out endpoints
  119066. + struct usb_device *udev;
  119067. + PURB piorw_urb;
  119068. + u8 io_irp_cnt;
  119069. + u8 bio_irp_pending;
  119070. + _sema io_retevt;
  119071. + _timer io_timer;
  119072. + u8 bio_irp_timeout;
  119073. + u8 bio_timer_cancel;
  119074. + #endif
  119075. +#endif
  119076. +
  119077. +#ifdef PLATFORM_OS_XP
  119078. + #ifdef CONFIG_SDIO_HCI
  119079. + // below is for io_rwmem...
  119080. + PMDL pmdl;
  119081. + PSDBUS_REQUEST_PACKET sdrp;
  119082. + PSDBUS_REQUEST_PACKET recv_sdrp;
  119083. + PSDBUS_REQUEST_PACKET xmit_sdrp;
  119084. +
  119085. + PIRP piorw_irp;
  119086. +
  119087. + #endif
  119088. + #ifdef CONFIG_USB_HCI
  119089. + PURB piorw_urb;
  119090. + PIRP piorw_irp;
  119091. + u8 io_irp_cnt;
  119092. + u8 bio_irp_pending;
  119093. + _sema io_retevt;
  119094. + #endif
  119095. +#endif
  119096. +
  119097. +};
  119098. +
  119099. +
  119100. +#ifdef CONFIG_R871X_TEST
  119101. +int rtw_start_pseudo_adhoc(_adapter *padapter);
  119102. +int rtw_stop_pseudo_adhoc(_adapter *padapter);
  119103. +#endif
  119104. +
  119105. +struct dvobj_priv *devobj_init(void);
  119106. +void devobj_deinit(struct dvobj_priv *pdvobj);
  119107. +
  119108. +u8 rtw_init_drv_sw(_adapter *padapter);
  119109. +u8 rtw_free_drv_sw(_adapter *padapter);
  119110. +u8 rtw_reset_drv_sw(_adapter *padapter);
  119111. +
  119112. +u32 rtw_start_drv_threads(_adapter *padapter);
  119113. +void rtw_stop_drv_threads (_adapter *padapter);
  119114. +void rtw_cancel_all_timer(_adapter *padapter);
  119115. +
  119116. +#ifdef PLATFORM_LINUX
  119117. +int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
  119118. +
  119119. +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname);
  119120. +struct net_device *rtw_init_netdev(_adapter *padapter);
  119121. +void rtw_unregister_netdevs(struct dvobj_priv *dvobj);
  119122. +
  119123. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  119124. +u16 rtw_recv_select_queue(struct sk_buff *skb);
  119125. +#endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)
  119126. +
  119127. +#ifdef CONFIG_PROC_DEBUG
  119128. +void rtw_proc_init_one(struct net_device *dev);
  119129. +void rtw_proc_remove_one(struct net_device *dev);
  119130. +#else //!CONFIG_PROC_DEBUG
  119131. +static void rtw_proc_init_one(struct net_device *dev){}
  119132. +static void rtw_proc_remove_one(struct net_device *dev){}
  119133. +#endif //!CONFIG_PROC_DEBUG
  119134. +#endif //PLATFORM_LINUX
  119135. +
  119136. +
  119137. +#ifdef PLATFORM_FREEBSD
  119138. +extern int rtw_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data);
  119139. +#endif
  119140. +
  119141. +void rtw_ips_dev_unload(_adapter *padapter);
  119142. +#ifdef CONFIG_IPS
  119143. +int rtw_ips_pwr_up(_adapter *padapter);
  119144. +void rtw_ips_pwr_down(_adapter *padapter);
  119145. +#endif
  119146. +
  119147. +#ifdef CONFIG_CONCURRENT_MODE
  119148. +struct _io_ops;
  119149. +_adapter *rtw_drv_if2_init(_adapter *primary_padapter, void (*set_intf_ops)(struct _io_ops *pops));
  119150. +void rtw_drv_if2_free(_adapter *if2);
  119151. +void rtw_drv_if2_stop(_adapter *if2);
  119152. +#ifdef CONFIG_MULTI_VIR_IFACES
  119153. +struct dvobj_priv;
  119154. +_adapter *rtw_drv_add_vir_if(_adapter *primary_padapter, void (*set_intf_ops)(struct _io_ops *pops));
  119155. +void rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj);
  119156. +void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj);
  119157. +#endif //CONFIG_MULTI_VIR_IFACES
  119158. +#endif
  119159. +
  119160. +int rtw_drv_register_netdev(_adapter *padapter);
  119161. +void rtw_ndev_destructor(_nic_hdl ndev);
  119162. +
  119163. +#endif //_OSDEP_INTF_H_
  119164. --- /dev/null
  119165. +++ b/drivers/net/wireless/rtl8192cu/include/osdep_service.h
  119166. @@ -0,0 +1,1813 @@
  119167. +/******************************************************************************
  119168. + *
  119169. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  119170. + *
  119171. + * This program is free software; you can redistribute it and/or modify it
  119172. + * under the terms of version 2 of the GNU General Public License as
  119173. + * published by the Free Software Foundation.
  119174. + *
  119175. + * This program is distributed in the hope that it will be useful, but WITHOUT
  119176. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  119177. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  119178. + * more details.
  119179. + *
  119180. + * You should have received a copy of the GNU General Public License along with
  119181. + * this program; if not, write to the Free Software Foundation, Inc.,
  119182. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  119183. + *
  119184. + *
  119185. + ******************************************************************************/
  119186. +#ifndef __OSDEP_SERVICE_H_
  119187. +#define __OSDEP_SERVICE_H_
  119188. +
  119189. +#include <drv_conf.h>
  119190. +#include <basic_types.h>
  119191. +//#include <rtl871x_byteorder.h>
  119192. +
  119193. +#define _FAIL 0
  119194. +#define _SUCCESS 1
  119195. +#define RTW_RX_HANDLED 2
  119196. +//#define RTW_STATUS_TIMEDOUT -110
  119197. +
  119198. +#undef _TRUE
  119199. +#define _TRUE 1
  119200. +
  119201. +#undef _FALSE
  119202. +#define _FALSE 0
  119203. +
  119204. +
  119205. +#ifdef PLATFORM_FREEBSD
  119206. +#include <sys/cdefs.h>
  119207. +#include <sys/types.h>
  119208. +#include <sys/systm.h>
  119209. +#include <sys/param.h>
  119210. +#include <sys/sockio.h>
  119211. +#include <sys/sysctl.h>
  119212. +#include <sys/lock.h>
  119213. +#include <sys/mutex.h>
  119214. +#include <sys/mbuf.h>
  119215. +#include <sys/kernel.h>
  119216. +#include <sys/socket.h>
  119217. +#include <sys/systm.h>
  119218. +#include <sys/malloc.h>
  119219. +#include <sys/module.h>
  119220. +#include <sys/bus.h>
  119221. +#include <sys/endian.h>
  119222. +#include <sys/kdb.h>
  119223. +#include <sys/kthread.h>
  119224. +#include <machine/atomic.h>
  119225. +
  119226. +#include <machine/bus.h>
  119227. +#include <machine/resource.h>
  119228. +#include <sys/rman.h>
  119229. +
  119230. +#include <net/bpf.h>
  119231. +#include <net/if.h>
  119232. +#include <net/if_arp.h>
  119233. +#include <net/ethernet.h>
  119234. +#include <net/if_dl.h>
  119235. +#include <net/if_media.h>
  119236. +#include <net/if_types.h>
  119237. +#include <net/route.h>
  119238. +
  119239. +
  119240. +#include <netinet/in.h>
  119241. +#include <netinet/in_systm.h>
  119242. +#include <netinet/in_var.h>
  119243. +#include <netinet/if_ether.h>
  119244. +
  119245. +#include <net80211/ieee80211_var.h>
  119246. +#include <net80211/ieee80211_regdomain.h>
  119247. +#include <net80211/ieee80211_radiotap.h>
  119248. +#include <net80211/ieee80211_ratectl.h>
  119249. +
  119250. +#include <dev/usb/usb.h>
  119251. +#include <dev/usb/usbdi.h>
  119252. +#include "usbdevs.h"
  119253. +
  119254. +#define USB_DEBUG_VAR rum_debug
  119255. +#include <dev/usb/usb_debug.h>
  119256. +
  119257. +#if 1 //Baron porting from linux, it's all temp solution, needs to check again
  119258. +#include <sys/sema.h>
  119259. +#include <sys/pcpu.h> /* XXX for PCPU_GET */
  119260. +// typedef struct semaphore _sema;
  119261. + typedef struct sema _sema;
  119262. +// typedef spinlock_t _lock;
  119263. + typedef struct mtx _lock;
  119264. + typedef struct mtx _mutex;
  119265. + typedef struct timer_list _timer;
  119266. + struct list_head {
  119267. + struct list_head *next, *prev;
  119268. + };
  119269. + struct __queue {
  119270. + struct list_head queue;
  119271. + _lock lock;
  119272. + };
  119273. +
  119274. + //typedef struct sk_buff _pkt;
  119275. + typedef struct mbuf _pkt;
  119276. + typedef struct mbuf _buffer;
  119277. +
  119278. + typedef struct __queue _queue;
  119279. + typedef struct list_head _list;
  119280. + typedef int _OS_STATUS;
  119281. + //typedef u32 _irqL;
  119282. + typedef unsigned long _irqL;
  119283. + typedef struct ifnet * _nic_hdl;
  119284. +
  119285. + typedef pid_t _thread_hdl_;
  119286. +// typedef struct thread _thread_hdl_;
  119287. + typedef void thread_return;
  119288. + typedef void* thread_context;
  119289. +
  119290. + //#define thread_exit() complete_and_exit(NULL, 0)
  119291. +
  119292. + typedef void timer_hdl_return;
  119293. + typedef void* timer_hdl_context;
  119294. + typedef struct work_struct _workitem;
  119295. +
  119296. +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
  119297. +/* emulate a modern version */
  119298. +#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 35)
  119299. +
  119300. +#define WIRELESS_EXT -1
  119301. +#define HZ hz
  119302. +#define spin_lock_irqsave mtx_lock_irqsave
  119303. +#define spin_lock_bh mtx_lock_irqsave
  119304. +#define mtx_lock_irqsave(lock, x) mtx_lock(lock)//{local_irq_save((x)); mtx_lock_spin((lock));}
  119305. +//#define IFT_RTW 0xf9 //ifnet allocate type for RTW
  119306. +#define free_netdev if_free
  119307. +#define LIST_CONTAINOR(ptr, type, member) \
  119308. + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))
  119309. +#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n))
  119310. +/*
  119311. + * Linux timers are emulated using FreeBSD callout functions
  119312. + * (and taskqueue functionality).
  119313. + *
  119314. + * Currently no timer stats functionality.
  119315. + *
  119316. + * See (linux_compat) processes.c
  119317. + *
  119318. + */
  119319. +struct timer_list {
  119320. +
  119321. + /* FreeBSD callout related fields */
  119322. + struct callout callout;
  119323. +
  119324. + //timeout function
  119325. + void (*function)(void*);
  119326. + //argument
  119327. + void *arg;
  119328. +
  119329. +};
  119330. +struct workqueue_struct;
  119331. +struct work_struct;
  119332. +typedef void (*work_func_t)(struct work_struct *work);
  119333. +/* Values for the state of an item of work (work_struct) */
  119334. +typedef enum work_state {
  119335. + WORK_STATE_UNSET = 0,
  119336. + WORK_STATE_CALLOUT_PENDING = 1,
  119337. + WORK_STATE_TASK_PENDING = 2,
  119338. + WORK_STATE_WORK_CANCELLED = 3
  119339. +} work_state_t;
  119340. +
  119341. +struct work_struct {
  119342. + struct task task; /* FreeBSD task */
  119343. + work_state_t state; /* the pending or otherwise state of work. */
  119344. + work_func_t func;
  119345. +};
  119346. +#define spin_unlock_irqrestore mtx_unlock_irqrestore
  119347. +#define spin_unlock_bh mtx_unlock_irqrestore
  119348. +#define mtx_unlock_irqrestore(lock,x) mtx_unlock(lock);
  119349. +extern void _rtw_spinlock_init(_lock *plock);
  119350. +
  119351. +//modify private structure to match freebsd
  119352. +#define BITS_PER_LONG 32
  119353. +union ktime {
  119354. + s64 tv64;
  119355. +#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
  119356. + struct {
  119357. +#ifdef __BIG_ENDIAN
  119358. + s32 sec, nsec;
  119359. +#else
  119360. + s32 nsec, sec;
  119361. +#endif
  119362. + } tv;
  119363. +#endif
  119364. +};
  119365. +#define kmemcheck_bitfield_begin(name)
  119366. +#define kmemcheck_bitfield_end(name)
  119367. +#define CHECKSUM_NONE 0
  119368. +typedef unsigned char *sk_buff_data_t;
  119369. +typedef union ktime ktime_t; /* Kill this */
  119370. +
  119371. +void rtw_mtx_lock(_lock *plock);
  119372. +
  119373. +void rtw_mtx_unlock(_lock *plock);
  119374. +
  119375. +/**
  119376. + * struct sk_buff - socket buffer
  119377. + * @next: Next buffer in list
  119378. + * @prev: Previous buffer in list
  119379. + * @sk: Socket we are owned by
  119380. + * @tstamp: Time we arrived
  119381. + * @dev: Device we arrived on/are leaving by
  119382. + * @transport_header: Transport layer header
  119383. + * @network_header: Network layer header
  119384. + * @mac_header: Link layer header
  119385. + * @_skb_refdst: destination entry (with norefcount bit)
  119386. + * @sp: the security path, used for xfrm
  119387. + * @cb: Control buffer. Free for use by every layer. Put private vars here
  119388. + * @len: Length of actual data
  119389. + * @data_len: Data length
  119390. + * @mac_len: Length of link layer header
  119391. + * @hdr_len: writable header length of cloned skb
  119392. + * @csum: Checksum (must include start/offset pair)
  119393. + * @csum_start: Offset from skb->head where checksumming should start
  119394. + * @csum_offset: Offset from csum_start where checksum should be stored
  119395. + * @local_df: allow local fragmentation
  119396. + * @cloned: Head may be cloned (check refcnt to be sure)
  119397. + * @nohdr: Payload reference only, must not modify header
  119398. + * @pkt_type: Packet class
  119399. + * @fclone: skbuff clone status
  119400. + * @ip_summed: Driver fed us an IP checksum
  119401. + * @priority: Packet queueing priority
  119402. + * @users: User count - see {datagram,tcp}.c
  119403. + * @protocol: Packet protocol from driver
  119404. + * @truesize: Buffer size
  119405. + * @head: Head of buffer
  119406. + * @data: Data head pointer
  119407. + * @tail: Tail pointer
  119408. + * @end: End pointer
  119409. + * @destructor: Destruct function
  119410. + * @mark: Generic packet mark
  119411. + * @nfct: Associated connection, if any
  119412. + * @ipvs_property: skbuff is owned by ipvs
  119413. + * @peeked: this packet has been seen already, so stats have been
  119414. + * done for it, don't do them again
  119415. + * @nf_trace: netfilter packet trace flag
  119416. + * @nfctinfo: Relationship of this skb to the connection
  119417. + * @nfct_reasm: netfilter conntrack re-assembly pointer
  119418. + * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
  119419. + * @skb_iif: ifindex of device we arrived on
  119420. + * @rxhash: the packet hash computed on receive
  119421. + * @queue_mapping: Queue mapping for multiqueue devices
  119422. + * @tc_index: Traffic control index
  119423. + * @tc_verd: traffic control verdict
  119424. + * @ndisc_nodetype: router type (from link layer)
  119425. + * @dma_cookie: a cookie to one of several possible DMA operations
  119426. + * done by skb DMA functions
  119427. + * @secmark: security marking
  119428. + * @vlan_tci: vlan tag control information
  119429. + */
  119430. +
  119431. +struct sk_buff {
  119432. + /* These two members must be first. */
  119433. + struct sk_buff *next;
  119434. + struct sk_buff *prev;
  119435. +
  119436. + ktime_t tstamp;
  119437. +
  119438. + struct sock *sk;
  119439. + //struct net_device *dev;
  119440. + struct ifnet *dev;
  119441. +
  119442. + /*
  119443. + * This is the control buffer. It is free to use for every
  119444. + * layer. Please put your private variables there. If you
  119445. + * want to keep them across layers you have to do a skb_clone()
  119446. + * first. This is owned by whoever has the skb queued ATM.
  119447. + */
  119448. + char cb[48] __aligned(8);
  119449. +
  119450. + unsigned long _skb_refdst;
  119451. +#ifdef CONFIG_XFRM
  119452. + struct sec_path *sp;
  119453. +#endif
  119454. + unsigned int len,
  119455. + data_len;
  119456. + u16 mac_len,
  119457. + hdr_len;
  119458. + union {
  119459. + u32 csum;
  119460. + struct {
  119461. + u16 csum_start;
  119462. + u16 csum_offset;
  119463. + }smbol2;
  119464. + }smbol1;
  119465. + u32 priority;
  119466. + kmemcheck_bitfield_begin(flags1);
  119467. + u8 local_df:1,
  119468. + cloned:1,
  119469. + ip_summed:2,
  119470. + nohdr:1,
  119471. + nfctinfo:3;
  119472. + u8 pkt_type:3,
  119473. + fclone:2,
  119474. + ipvs_property:1,
  119475. + peeked:1,
  119476. + nf_trace:1;
  119477. + kmemcheck_bitfield_end(flags1);
  119478. + u16 protocol;
  119479. +
  119480. + void (*destructor)(struct sk_buff *skb);
  119481. +#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
  119482. + struct nf_conntrack *nfct;
  119483. + struct sk_buff *nfct_reasm;
  119484. +#endif
  119485. +#ifdef CONFIG_BRIDGE_NETFILTER
  119486. + struct nf_bridge_info *nf_bridge;
  119487. +#endif
  119488. +
  119489. + int skb_iif;
  119490. +#ifdef CONFIG_NET_SCHED
  119491. + u16 tc_index; /* traffic control index */
  119492. +#ifdef CONFIG_NET_CLS_ACT
  119493. + u16 tc_verd; /* traffic control verdict */
  119494. +#endif
  119495. +#endif
  119496. +
  119497. + u32 rxhash;
  119498. +
  119499. + kmemcheck_bitfield_begin(flags2);
  119500. + u16 queue_mapping:16;
  119501. +#ifdef CONFIG_IPV6_NDISC_NODETYPE
  119502. + u8 ndisc_nodetype:2,
  119503. + deliver_no_wcard:1;
  119504. +#else
  119505. + u8 deliver_no_wcard:1;
  119506. +#endif
  119507. + kmemcheck_bitfield_end(flags2);
  119508. +
  119509. + /* 0/14 bit hole */
  119510. +
  119511. +#ifdef CONFIG_NET_DMA
  119512. + dma_cookie_t dma_cookie;
  119513. +#endif
  119514. +#ifdef CONFIG_NETWORK_SECMARK
  119515. + u32 secmark;
  119516. +#endif
  119517. + union {
  119518. + u32 mark;
  119519. + u32 dropcount;
  119520. + }symbol3;
  119521. +
  119522. + u16 vlan_tci;
  119523. +
  119524. + sk_buff_data_t transport_header;
  119525. + sk_buff_data_t network_header;
  119526. + sk_buff_data_t mac_header;
  119527. + /* These elements must be at the end, see alloc_skb() for details. */
  119528. + sk_buff_data_t tail;
  119529. + sk_buff_data_t end;
  119530. + unsigned char *head,
  119531. + *data;
  119532. + unsigned int truesize;
  119533. + atomic_t users;
  119534. +};
  119535. +struct sk_buff_head {
  119536. + /* These two members must be first. */
  119537. + struct sk_buff *next;
  119538. + struct sk_buff *prev;
  119539. +
  119540. + u32 qlen;
  119541. + _lock lock;
  119542. +};
  119543. +#define skb_tail_pointer(skb) skb->tail
  119544. +static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
  119545. +{
  119546. + unsigned char *tmp = skb_tail_pointer(skb);
  119547. + //SKB_LINEAR_ASSERT(skb);
  119548. + skb->tail += len;
  119549. + skb->len += len;
  119550. + return tmp;
  119551. +}
  119552. +
  119553. +static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
  119554. +{
  119555. + skb->len -= len;
  119556. + if(skb->len < skb->data_len)
  119557. + printf("%s(),%d,error!\n",__FUNCTION__,__LINE__);
  119558. + return skb->data += len;
  119559. +}
  119560. +static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
  119561. +{
  119562. + #ifdef PLATFORM_FREEBSD
  119563. + return __skb_pull(skb, len);
  119564. + #else
  119565. + return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
  119566. + #endif //PLATFORM_FREEBSD
  119567. +}
  119568. +static inline u32 skb_queue_len(const struct sk_buff_head *list_)
  119569. +{
  119570. + return list_->qlen;
  119571. +}
  119572. +static inline void __skb_insert(struct sk_buff *newsk,
  119573. + struct sk_buff *prev, struct sk_buff *next,
  119574. + struct sk_buff_head *list)
  119575. +{
  119576. + newsk->next = next;
  119577. + newsk->prev = prev;
  119578. + next->prev = prev->next = newsk;
  119579. + list->qlen++;
  119580. +}
  119581. +static inline void __skb_queue_before(struct sk_buff_head *list,
  119582. + struct sk_buff *next,
  119583. + struct sk_buff *newsk)
  119584. +{
  119585. + __skb_insert(newsk, next->prev, next, list);
  119586. +}
  119587. +static inline void skb_queue_tail(struct sk_buff_head *list,
  119588. + struct sk_buff *newsk)
  119589. +{
  119590. + mtx_lock(&list->lock);
  119591. + __skb_queue_before(list, (struct sk_buff *)list, newsk);
  119592. + mtx_unlock(&list->lock);
  119593. +}
  119594. +static inline struct sk_buff *skb_peek(struct sk_buff_head *list_)
  119595. +{
  119596. + struct sk_buff *list = ((struct sk_buff *)list_)->next;
  119597. + if (list == (struct sk_buff *)list_)
  119598. + list = NULL;
  119599. + return list;
  119600. +}
  119601. +static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
  119602. +{
  119603. + struct sk_buff *next, *prev;
  119604. +
  119605. + list->qlen--;
  119606. + next = skb->next;
  119607. + prev = skb->prev;
  119608. + skb->next = skb->prev = NULL;
  119609. + next->prev = prev;
  119610. + prev->next = next;
  119611. +}
  119612. +
  119613. +static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list)
  119614. +{
  119615. + mtx_lock(&list->lock);
  119616. +
  119617. + struct sk_buff *skb = skb_peek(list);
  119618. + if (skb)
  119619. + __skb_unlink(skb, list);
  119620. +
  119621. + mtx_unlock(&list->lock);
  119622. +
  119623. + return skb;
  119624. +}
  119625. +static inline void skb_reserve(struct sk_buff *skb, int len)
  119626. +{
  119627. + skb->data += len;
  119628. + skb->tail += len;
  119629. +}
  119630. +static inline void __skb_queue_head_init(struct sk_buff_head *list)
  119631. +{
  119632. + list->prev = list->next = (struct sk_buff *)list;
  119633. + list->qlen = 0;
  119634. +}
  119635. +/*
  119636. + * This function creates a split out lock class for each invocation;
  119637. + * this is needed for now since a whole lot of users of the skb-queue
  119638. + * infrastructure in drivers have different locking usage (in hardirq)
  119639. + * than the networking core (in softirq only). In the long run either the
  119640. + * network layer or drivers should need annotation to consolidate the
  119641. + * main types of usage into 3 classes.
  119642. + */
  119643. +static inline void skb_queue_head_init(struct sk_buff_head *list)
  119644. +{
  119645. + _rtw_spinlock_init(&list->lock);
  119646. + __skb_queue_head_init(list);
  119647. +}
  119648. +unsigned long copy_from_user(void *to, const void *from, unsigned long n);
  119649. +unsigned long copy_to_user(void *to, const void *from, unsigned long n);
  119650. +struct sk_buff * dev_alloc_skb(unsigned int size);
  119651. +struct sk_buff *skb_clone(const struct sk_buff *skb);
  119652. +void dev_kfree_skb_any(struct sk_buff *skb);
  119653. +#endif //Baron porting from linux, it's all temp solution, needs to check again
  119654. +
  119655. +
  119656. +#if 1 // kenny add Linux compatibility code for Linux USB driver
  119657. +#include <dev/usb/usb_compat_linux.h>
  119658. +
  119659. +#define __init // __attribute ((constructor))
  119660. +#define __exit // __attribute ((destructor))
  119661. +
  119662. +/*
  119663. + * Definitions for module_init and module_exit macros.
  119664. + *
  119665. + * These macros will use the SYSINIT framework to call a specified
  119666. + * function (with no arguments) on module loading or unloading.
  119667. + *
  119668. + */
  119669. +
  119670. +void module_init_exit_wrapper(void *arg);
  119671. +
  119672. +#define module_init(initfn) \
  119673. + SYSINIT(mod_init_ ## initfn, \
  119674. + SI_SUB_KLD, SI_ORDER_FIRST, \
  119675. + module_init_exit_wrapper, initfn)
  119676. +
  119677. +#define module_exit(exitfn) \
  119678. + SYSUNINIT(mod_exit_ ## exitfn, \
  119679. + SI_SUB_KLD, SI_ORDER_ANY, \
  119680. + module_init_exit_wrapper, exitfn)
  119681. +
  119682. +/*
  119683. + * The usb_register and usb_deregister functions are used to register
  119684. + * usb drivers with the usb subsystem.
  119685. + */
  119686. +int usb_register(struct usb_driver *driver);
  119687. +int usb_deregister(struct usb_driver *driver);
  119688. +
  119689. +/*
  119690. + * usb_get_dev and usb_put_dev - increment/decrement the reference count
  119691. + * of the usb device structure.
  119692. + *
  119693. + * Original body of usb_get_dev:
  119694. + *
  119695. + * if (dev)
  119696. + * get_device(&dev->dev);
  119697. + * return dev;
  119698. + *
  119699. + * Reference counts are not currently used in this compatibility
  119700. + * layer. So these functions will do nothing.
  119701. + */
  119702. +static inline struct usb_device *
  119703. +usb_get_dev(struct usb_device *dev)
  119704. +{
  119705. + return dev;
  119706. +}
  119707. +
  119708. +static inline void
  119709. +usb_put_dev(struct usb_device *dev)
  119710. +{
  119711. + return;
  119712. +}
  119713. +
  119714. +
  119715. +// rtw_usb_compat_linux
  119716. +int rtw_usb_submit_urb(struct urb *urb, uint16_t mem_flags);
  119717. +int rtw_usb_unlink_urb(struct urb *urb);
  119718. +int rtw_usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe);
  119719. +int rtw_usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe,
  119720. + uint8_t request, uint8_t requesttype,
  119721. + uint16_t value, uint16_t index, void *data,
  119722. + uint16_t size, usb_timeout_t timeout);
  119723. +int rtw_usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index);
  119724. +int rtw_usb_setup_endpoint(struct usb_device *dev,
  119725. + struct usb_host_endpoint *uhe, usb_size_t bufsize);
  119726. +struct urb *rtw_usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags);
  119727. +struct usb_host_endpoint *rtw_usb_find_host_endpoint(struct usb_device *dev, uint8_t type, uint8_t ep);
  119728. +struct usb_host_interface *rtw_usb_altnum_to_altsetting(const struct usb_interface *intf, uint8_t alt_index);
  119729. +struct usb_interface *rtw_usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no);
  119730. +void *rtw_usb_buffer_alloc(struct usb_device *dev, usb_size_t size, uint8_t *dma_addr);
  119731. +void *rtw_usbd_get_intfdata(struct usb_interface *intf);
  119732. +void rtw_usb_linux_register(void *arg);
  119733. +void rtw_usb_linux_deregister(void *arg);
  119734. +void rtw_usb_linux_free_device(struct usb_device *dev);
  119735. +void rtw_usb_buffer_free(struct usb_device *dev, usb_size_t size,
  119736. + void *addr, uint8_t dma_addr);
  119737. +void rtw_usb_free_urb(struct urb *urb);
  119738. +void rtw_usb_init_urb(struct urb *urb);
  119739. +void rtw_usb_kill_urb(struct urb *urb);
  119740. +void rtw_usb_set_intfdata(struct usb_interface *intf, void *data);
  119741. +void rtw_usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev,
  119742. + struct usb_host_endpoint *uhe, void *buf,
  119743. + int length, usb_complete_t callback, void *arg);
  119744. +int rtw_usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe,
  119745. + void *data, int len, uint16_t *pactlen, usb_timeout_t timeout);
  119746. +void *usb_get_intfdata(struct usb_interface *intf);
  119747. +int usb_linux_init_endpoints(struct usb_device *udev);
  119748. +
  119749. +
  119750. +
  119751. +typedef struct urb * PURB;
  119752. +
  119753. +typedef unsigned gfp_t;
  119754. +#define __GFP_WAIT ((gfp_t)0x10u) /* Can wait and reschedule? */
  119755. +#define __GFP_HIGH ((gfp_t)0x20u) /* Should access emergency pools? */
  119756. +#define __GFP_IO ((gfp_t)0x40u) /* Can start physical IO? */
  119757. +#define __GFP_FS ((gfp_t)0x80u) /* Can call down to low-level FS? */
  119758. +#define __GFP_COLD ((gfp_t)0x100u) /* Cache-cold page required */
  119759. +#define __GFP_NOWARN ((gfp_t)0x200u) /* Suppress page allocation failure warning */
  119760. +#define __GFP_REPEAT ((gfp_t)0x400u) /* Retry the allocation. Might fail */
  119761. +#define __GFP_NOFAIL ((gfp_t)0x800u) /* Retry for ever. Cannot fail */
  119762. +#define __GFP_NORETRY ((gfp_t)0x1000u)/* Do not retry. Might fail */
  119763. +#define __GFP_NO_GROW ((gfp_t)0x2000u)/* Slab internal usage */
  119764. +#define __GFP_COMP ((gfp_t)0x4000u)/* Add compound page metadata */
  119765. +#define __GFP_ZERO ((gfp_t)0x8000u)/* Return zeroed page on success */
  119766. +#define __GFP_NOMEMALLOC ((gfp_t)0x10000u) /* Don't use emergency reserves */
  119767. +#define __GFP_HARDWALL ((gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */
  119768. +
  119769. +/* This equals 0, but use constants in case they ever change */
  119770. +#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH)
  119771. +/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */
  119772. +#define GFP_ATOMIC (__GFP_HIGH)
  119773. +#define GFP_NOIO (__GFP_WAIT)
  119774. +#define GFP_NOFS (__GFP_WAIT | __GFP_IO)
  119775. +#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS)
  119776. +#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL)
  119777. +#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \
  119778. + __GFP_HIGHMEM)
  119779. +
  119780. +
  119781. +#endif // kenny add Linux compatibility code for Linux USB
  119782. +
  119783. +
  119784. +
  119785. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  119786. + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
  119787. +#endif
  119788. +
  119789. +__inline static _list *get_next(_list *list)
  119790. +{
  119791. + return list->next;
  119792. +}
  119793. +
  119794. +__inline static _list *get_list_head(_queue *queue)
  119795. +{
  119796. + return (&(queue->queue));
  119797. +}
  119798. +
  119799. +
  119800. +#define LIST_CONTAINOR(ptr, type, member) \
  119801. + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))
  119802. +
  119803. +
  119804. +__inline static void _enter_critical(_lock *plock, _irqL *pirqL)
  119805. +{
  119806. + spin_lock_irqsave(plock, *pirqL);
  119807. +}
  119808. +
  119809. +__inline static void _exit_critical(_lock *plock, _irqL *pirqL)
  119810. +{
  119811. + spin_unlock_irqrestore(plock, *pirqL);
  119812. +}
  119813. +
  119814. +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL)
  119815. +{
  119816. + spin_lock_irqsave(plock, *pirqL);
  119817. +}
  119818. +
  119819. +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL)
  119820. +{
  119821. + spin_unlock_irqrestore(plock, *pirqL);
  119822. +}
  119823. +
  119824. +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)
  119825. +{
  119826. + spin_lock_bh(plock, *pirqL);
  119827. +}
  119828. +
  119829. +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)
  119830. +{
  119831. + spin_unlock_bh(plock, *pirqL);
  119832. +}
  119833. +
  119834. +__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  119835. +{
  119836. +
  119837. + mtx_lock(pmutex);
  119838. +
  119839. +}
  119840. +
  119841. +
  119842. +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  119843. +{
  119844. +
  119845. + mtx_unlock(pmutex);
  119846. +
  119847. +}
  119848. +static inline void __list_del(struct list_head * prev, struct list_head * next)
  119849. +{
  119850. + next->prev = prev;
  119851. + prev->next = next;
  119852. +}
  119853. +static inline void INIT_LIST_HEAD(struct list_head *list)
  119854. +{
  119855. + list->next = list;
  119856. + list->prev = list;
  119857. +}
  119858. +__inline static void rtw_list_delete(_list *plist)
  119859. +{
  119860. + __list_del(plist->prev, plist->next);
  119861. + INIT_LIST_HEAD(plist);
  119862. +}
  119863. +
  119864. +__inline static void _init_timer(_timer *ptimer,_nic_hdl padapter,void *pfunc,void* cntx)
  119865. +{
  119866. + ptimer->function = pfunc;
  119867. + ptimer->arg = cntx;
  119868. + callout_init(&ptimer->callout, CALLOUT_MPSAFE);
  119869. +}
  119870. +
  119871. +__inline static void _set_timer(_timer *ptimer,u32 delay_time)
  119872. +{
  119873. + // mod_timer(ptimer , (jiffies+(delay_time*HZ/1000)));
  119874. + if(ptimer->function && ptimer->arg){
  119875. + rtw_mtx_lock(NULL);
  119876. + callout_reset(&ptimer->callout, delay_time,ptimer->function, ptimer->arg);
  119877. + rtw_mtx_unlock(NULL);
  119878. + }
  119879. +}
  119880. +
  119881. +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)
  119882. +{
  119883. + // del_timer_sync(ptimer);
  119884. + // *bcancelled= _TRUE;//TRUE ==1; FALSE==0
  119885. + rtw_mtx_lock(NULL);
  119886. + callout_drain(&ptimer->callout);
  119887. + rtw_mtx_unlock(NULL);
  119888. +}
  119889. +
  119890. +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)
  119891. +{
  119892. + printf("%s Not implement yet! \n",__FUNCTION__);
  119893. +}
  119894. +
  119895. +__inline static void _set_workitem(_workitem *pwork)
  119896. +{
  119897. + printf("%s Not implement yet! \n",__FUNCTION__);
  119898. +// schedule_work(pwork);
  119899. +}
  119900. +
  119901. +//
  119902. +// Global Mutex: can only be used at PASSIVE level.
  119903. +//
  119904. +
  119905. +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \
  119906. +{ \
  119907. +}
  119908. +
  119909. +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \
  119910. +{ \
  119911. +}
  119912. +
  119913. +#define ATOMIC_INIT(i) { (i) }
  119914. +
  119915. +#endif //PLATFORM_FREEBSD
  119916. +
  119917. +
  119918. +#ifdef PLATFORM_LINUX
  119919. + #include <linux/version.h>
  119920. + #include <linux/spinlock.h>
  119921. + #include <linux/compiler.h>
  119922. + #include <linux/kernel.h>
  119923. + #include <linux/errno.h>
  119924. + #include <linux/init.h>
  119925. + #include <linux/slab.h>
  119926. + #include <linux/module.h>
  119927. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5))
  119928. + #include <linux/kref.h>
  119929. +#endif
  119930. + //#include <linux/smp_lock.h>
  119931. + #include <linux/netdevice.h>
  119932. + #include <linux/skbuff.h>
  119933. + #include <linux/circ_buf.h>
  119934. + #include <asm/uaccess.h>
  119935. + #include <asm/byteorder.h>
  119936. + #include <asm/atomic.h>
  119937. + #include <asm/io.h>
  119938. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  119939. + #include <asm/semaphore.h>
  119940. +#else
  119941. + #include <linux/semaphore.h>
  119942. +#endif
  119943. + #include <linux/sem.h>
  119944. + #include <linux/sched.h>
  119945. + #include <linux/etherdevice.h>
  119946. + #include <linux/wireless.h>
  119947. + #include <net/iw_handler.h>
  119948. + #include <linux/if_arp.h>
  119949. + #include <linux/rtnetlink.h>
  119950. + #include <linux/delay.h>
  119951. + #include <linux/proc_fs.h> // Necessary because we use the proc fs
  119952. + #include <linux/interrupt.h> // for struct tasklet_struct
  119953. + #include <linux/ip.h>
  119954. + #include <linux/kthread.h>
  119955. +
  119956. +#ifdef CONFIG_IOCTL_CFG80211
  119957. +// #include <linux/ieee80211.h>
  119958. + #include <net/ieee80211_radiotap.h>
  119959. + #include <net/cfg80211.h>
  119960. +#endif //CONFIG_IOCTL_CFG80211
  119961. +
  119962. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  119963. + #include <linux/in.h>
  119964. + #include <linux/udp.h>
  119965. +#endif
  119966. +
  119967. +#ifdef CONFIG_USB_HCI
  119968. + #include <linux/usb.h>
  119969. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
  119970. + #include <linux/usb_ch9.h>
  119971. +#else
  119972. + #include <linux/usb/ch9.h>
  119973. +#endif
  119974. +#endif
  119975. +
  119976. +#ifdef CONFIG_PCI_HCI
  119977. + #include <linux/pci.h>
  119978. +#endif
  119979. +
  119980. +
  119981. +#ifdef CONFIG_USB_HCI
  119982. + typedef struct urb * PURB;
  119983. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22))
  119984. +#ifdef CONFIG_USB_SUSPEND
  119985. +#define CONFIG_AUTOSUSPEND 1
  119986. +#endif
  119987. +#endif
  119988. +#endif
  119989. +
  119990. + typedef struct semaphore _sema;
  119991. + typedef spinlock_t _lock;
  119992. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  119993. + typedef struct mutex _mutex;
  119994. +#else
  119995. + typedef struct semaphore _mutex;
  119996. +#endif
  119997. + typedef struct timer_list _timer;
  119998. +
  119999. + struct __queue {
  120000. + struct list_head queue;
  120001. + _lock lock;
  120002. + };
  120003. +
  120004. + typedef struct sk_buff _pkt;
  120005. + typedef unsigned char _buffer;
  120006. +
  120007. + typedef struct __queue _queue;
  120008. + typedef struct list_head _list;
  120009. + typedef int _OS_STATUS;
  120010. + //typedef u32 _irqL;
  120011. + typedef unsigned long _irqL;
  120012. + typedef struct net_device * _nic_hdl;
  120013. +
  120014. + typedef void* _thread_hdl_;
  120015. + typedef int thread_return;
  120016. + typedef void* thread_context;
  120017. +
  120018. + #define thread_exit() complete_and_exit(NULL, 0)
  120019. +
  120020. + typedef void timer_hdl_return;
  120021. + typedef void* timer_hdl_context;
  120022. + typedef struct work_struct _workitem;
  120023. +
  120024. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  120025. + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
  120026. +#endif
  120027. +
  120028. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  120029. +// Porting from linux kernel, for compatible with old kernel.
  120030. +static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
  120031. +{
  120032. + return skb->tail;
  120033. +}
  120034. +
  120035. +static inline void skb_reset_tail_pointer(struct sk_buff *skb)
  120036. +{
  120037. + skb->tail = skb->data;
  120038. +}
  120039. +
  120040. +static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
  120041. +{
  120042. + skb->tail = skb->data + offset;
  120043. +}
  120044. +
  120045. +static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
  120046. +{
  120047. + return skb->end;
  120048. +}
  120049. +#endif
  120050. +
  120051. +__inline static _list *get_next(_list *list)
  120052. +{
  120053. + return list->next;
  120054. +}
  120055. +
  120056. +__inline static _list *get_list_head(_queue *queue)
  120057. +{
  120058. + return (&(queue->queue));
  120059. +}
  120060. +
  120061. +
  120062. +#define LIST_CONTAINOR(ptr, type, member) \
  120063. + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))
  120064. +
  120065. +
  120066. +__inline static void _enter_critical(_lock *plock, _irqL *pirqL)
  120067. +{
  120068. + spin_lock_irqsave(plock, *pirqL);
  120069. +}
  120070. +
  120071. +__inline static void _exit_critical(_lock *plock, _irqL *pirqL)
  120072. +{
  120073. + spin_unlock_irqrestore(plock, *pirqL);
  120074. +}
  120075. +
  120076. +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL)
  120077. +{
  120078. + spin_lock_irqsave(plock, *pirqL);
  120079. +}
  120080. +
  120081. +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL)
  120082. +{
  120083. + spin_unlock_irqrestore(plock, *pirqL);
  120084. +}
  120085. +
  120086. +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)
  120087. +{
  120088. + spin_lock_bh(plock);
  120089. +}
  120090. +
  120091. +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)
  120092. +{
  120093. + spin_unlock_bh(plock);
  120094. +}
  120095. +
  120096. +__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  120097. +{
  120098. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  120099. + mutex_lock(pmutex);
  120100. +#else
  120101. + down(pmutex);
  120102. +#endif
  120103. +}
  120104. +
  120105. +
  120106. +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  120107. +{
  120108. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  120109. + mutex_unlock(pmutex);
  120110. +#else
  120111. + up(pmutex);
  120112. +#endif
  120113. +}
  120114. +
  120115. +__inline static void rtw_list_delete(_list *plist)
  120116. +{
  120117. + list_del_init(plist);
  120118. +}
  120119. +
  120120. +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx)
  120121. +{
  120122. + //setup_timer(ptimer, pfunc,(u32)cntx);
  120123. + ptimer->function = pfunc;
  120124. + ptimer->data = (unsigned long)cntx;
  120125. + init_timer(ptimer);
  120126. +}
  120127. +
  120128. +__inline static void _set_timer(_timer *ptimer,u32 delay_time)
  120129. +{
  120130. + mod_timer(ptimer , (jiffies+(delay_time*HZ/1000)));
  120131. +}
  120132. +
  120133. +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)
  120134. +{
  120135. + del_timer_sync(ptimer);
  120136. + *bcancelled= _TRUE;//TRUE ==1; FALSE==0
  120137. +}
  120138. +
  120139. +#ifdef PLATFORM_LINUX
  120140. +#define RTW_TIMER_HDL_ARGS void *FunctionContext
  120141. +#elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS)
  120142. +#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3
  120143. +#endif
  120144. +
  120145. +#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl
  120146. +#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS)
  120147. +
  120148. +
  120149. +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)
  120150. +{
  120151. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
  120152. + INIT_WORK(pwork, pfunc);
  120153. +#else
  120154. + INIT_WORK(pwork, pfunc,pwork);
  120155. +#endif
  120156. +}
  120157. +
  120158. +__inline static void _set_workitem(_workitem *pwork)
  120159. +{
  120160. + schedule_work(pwork);
  120161. +}
  120162. +
  120163. +__inline static void _cancel_workitem_sync(_workitem *pwork)
  120164. +{
  120165. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22))
  120166. + cancel_work_sync(pwork);
  120167. +#else
  120168. + flush_scheduled_work();
  120169. +#endif
  120170. +}
  120171. +
  120172. +//
  120173. +// Global Mutex: can only be used at PASSIVE level.
  120174. +//
  120175. +
  120176. +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \
  120177. +{ \
  120178. + while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\
  120179. + { \
  120180. + atomic_dec((atomic_t *)&(_MutexCounter)); \
  120181. + msleep(10); \
  120182. + } \
  120183. +}
  120184. +
  120185. +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \
  120186. +{ \
  120187. + atomic_dec((atomic_t *)&(_MutexCounter)); \
  120188. +}
  120189. +
  120190. +static inline int rtw_netif_queue_stopped(struct net_device *pnetdev)
  120191. +{
  120192. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  120193. + return (netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) &&
  120194. + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 1)) &&
  120195. + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 2)) &&
  120196. + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 3)) );
  120197. +#else
  120198. + return netif_queue_stopped(pnetdev);
  120199. +#endif
  120200. +}
  120201. +
  120202. +static inline void rtw_netif_wake_queue(struct net_device *pnetdev)
  120203. +{
  120204. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  120205. + netif_tx_wake_all_queues(pnetdev);
  120206. +#else
  120207. + netif_wake_queue(pnetdev);
  120208. +#endif
  120209. +}
  120210. +
  120211. +static inline void rtw_netif_start_queue(struct net_device *pnetdev)
  120212. +{
  120213. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  120214. + netif_tx_start_all_queues(pnetdev);
  120215. +#else
  120216. + netif_start_queue(pnetdev);
  120217. +#endif
  120218. +}
  120219. +
  120220. +static inline void rtw_netif_stop_queue(struct net_device *pnetdev)
  120221. +{
  120222. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  120223. + netif_tx_stop_all_queues(pnetdev);
  120224. +#else
  120225. + netif_stop_queue(pnetdev);
  120226. +#endif
  120227. +}
  120228. +
  120229. +#endif // PLATFORM_LINUX
  120230. +
  120231. +
  120232. +#ifdef PLATFORM_OS_XP
  120233. +
  120234. + #include <ndis.h>
  120235. + #include <ntddk.h>
  120236. + #include <ntddndis.h>
  120237. + #include <ntdef.h>
  120238. +
  120239. +#ifdef CONFIG_USB_HCI
  120240. + #include <usb.h>
  120241. + #include <usbioctl.h>
  120242. + #include <usbdlib.h>
  120243. +#endif
  120244. +
  120245. + typedef KSEMAPHORE _sema;
  120246. + typedef LIST_ENTRY _list;
  120247. + typedef NDIS_STATUS _OS_STATUS;
  120248. +
  120249. +
  120250. + typedef NDIS_SPIN_LOCK _lock;
  120251. +
  120252. + typedef KMUTEX _mutex;
  120253. +
  120254. + typedef KIRQL _irqL;
  120255. +
  120256. + // USB_PIPE for WINCE , but handle can be use just integer under windows
  120257. + typedef NDIS_HANDLE _nic_hdl;
  120258. +
  120259. +
  120260. + typedef NDIS_MINIPORT_TIMER _timer;
  120261. +
  120262. + struct __queue {
  120263. + LIST_ENTRY queue;
  120264. + _lock lock;
  120265. + };
  120266. +
  120267. + typedef NDIS_PACKET _pkt;
  120268. + typedef NDIS_BUFFER _buffer;
  120269. + typedef struct __queue _queue;
  120270. +
  120271. + typedef PKTHREAD _thread_hdl_;
  120272. + typedef void thread_return;
  120273. + typedef void* thread_context;
  120274. +
  120275. + typedef NDIS_WORK_ITEM _workitem;
  120276. +
  120277. + #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS);
  120278. +
  120279. + #define HZ 10000000
  120280. + #define SEMA_UPBND (0x7FFFFFFF) //8192
  120281. +
  120282. +__inline static _list *get_next(_list *list)
  120283. +{
  120284. + return list->Flink;
  120285. +}
  120286. +
  120287. +__inline static _list *get_list_head(_queue *queue)
  120288. +{
  120289. + return (&(queue->queue));
  120290. +}
  120291. +
  120292. +
  120293. +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member)
  120294. +
  120295. +
  120296. +__inline static _enter_critical(_lock *plock, _irqL *pirqL)
  120297. +{
  120298. + NdisAcquireSpinLock(plock);
  120299. +}
  120300. +
  120301. +__inline static _exit_critical(_lock *plock, _irqL *pirqL)
  120302. +{
  120303. + NdisReleaseSpinLock(plock);
  120304. +}
  120305. +
  120306. +
  120307. +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL)
  120308. +{
  120309. + NdisDprAcquireSpinLock(plock);
  120310. +}
  120311. +
  120312. +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL)
  120313. +{
  120314. + NdisDprReleaseSpinLock(plock);
  120315. +}
  120316. +
  120317. +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)
  120318. +{
  120319. + NdisDprAcquireSpinLock(plock);
  120320. +}
  120321. +
  120322. +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)
  120323. +{
  120324. + NdisDprReleaseSpinLock(plock);
  120325. +}
  120326. +
  120327. +__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  120328. +{
  120329. + KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL);
  120330. +}
  120331. +
  120332. +
  120333. +__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)
  120334. +{
  120335. + KeReleaseMutex(pmutex, FALSE);
  120336. +}
  120337. +
  120338. +
  120339. +__inline static void rtw_list_delete(_list *plist)
  120340. +{
  120341. + RemoveEntryList(plist);
  120342. + InitializeListHead(plist);
  120343. +}
  120344. +
  120345. +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx)
  120346. +{
  120347. + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx);
  120348. +}
  120349. +
  120350. +__inline static void _set_timer(_timer *ptimer,u32 delay_time)
  120351. +{
  120352. + NdisMSetTimer(ptimer,delay_time);
  120353. +}
  120354. +
  120355. +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)
  120356. +{
  120357. + NdisMCancelTimer(ptimer,bcancelled);
  120358. +}
  120359. +
  120360. +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)
  120361. +{
  120362. +
  120363. + NdisInitializeWorkItem(pwork, pfunc, cntx);
  120364. +}
  120365. +
  120366. +__inline static void _set_workitem(_workitem *pwork)
  120367. +{
  120368. + NdisScheduleWorkItem(pwork);
  120369. +}
  120370. +
  120371. +
  120372. +#define ATOMIC_INIT(i) { (i) }
  120373. +
  120374. +//
  120375. +// Global Mutex: can only be used at PASSIVE level.
  120376. +//
  120377. +
  120378. +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \
  120379. +{ \
  120380. + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\
  120381. + { \
  120382. + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \
  120383. + NdisMSleep(10000); \
  120384. + } \
  120385. +}
  120386. +
  120387. +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \
  120388. +{ \
  120389. + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \
  120390. +}
  120391. +
  120392. +#endif // PLATFORM_OS_XP
  120393. +
  120394. +
  120395. +#ifdef PLATFORM_OS_CE
  120396. +#include <osdep_ce_service.h>
  120397. +#endif
  120398. +
  120399. +#include <rtw_byteorder.h>
  120400. +
  120401. +#ifndef BIT
  120402. + #define BIT(x) ( 1 << (x))
  120403. +#endif
  120404. +
  120405. +extern int RTW_STATUS_CODE(int error_code);
  120406. +
  120407. +#define CONFIG_USE_VMALLOC
  120408. +
  120409. +/* flags used for rtw_mstat_update() */
  120410. +enum mstat_f {
  120411. + /* type: 0x00ff */
  120412. + MSTAT_TYPE_VIR = 0x00,
  120413. + MSTAT_TYPE_PHY= 0x01,
  120414. + MSTAT_TYPE_SKB = 0x02,
  120415. + MSTAT_TYPE_USB = 0x03,
  120416. + MSTAT_TYPE_MAX = 0x04,
  120417. +
  120418. + /* func: 0xff00 */
  120419. + MSTAT_FUNC_UNSPECIFIED = 0x00<<8,
  120420. + MSTAT_FUNC_IO = 0x01<<8,
  120421. + MSTAT_FUNC_TX_IO = 0x02<<8,
  120422. + MSTAT_FUNC_RX_IO = 0x03<<8,
  120423. + MSTAT_FUNC_TX = 0x04<<8,
  120424. + MSTAT_FUNC_RX = 0x05<<8,
  120425. + MSTAT_FUNC_MAX = 0x06<<8,
  120426. +};
  120427. +
  120428. +#define mstat_tf_idx(flags) ((flags)&0xff)
  120429. +#define mstat_ff_idx(flags) (((flags)&0xff00) >> 8)
  120430. +
  120431. +typedef enum mstat_status{
  120432. + MSTAT_ALLOC_SUCCESS = 0,
  120433. + MSTAT_ALLOC_FAIL,
  120434. + MSTAT_FREE
  120435. +} MSTAT_STATUS;
  120436. +
  120437. +#ifdef DBG_MEM_ALLOC
  120438. +void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz);
  120439. +int _rtw_mstat_dump(char *buf, int len);
  120440. +void rtw_mstat_dump (void);
  120441. +u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);
  120442. +u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);
  120443. +void dbg_rtw_vmfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line);
  120444. +u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line);
  120445. +u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);
  120446. +void dbg_rtw_mfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line);
  120447. +
  120448. +struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, const int line);
  120449. +void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);
  120450. +struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);
  120451. +struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);
  120452. +int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line);
  120453. +void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line);
  120454. +
  120455. +#ifdef CONFIG_USB_HCI
  120456. +void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, const int line);
  120457. +void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, const int line);
  120458. +#endif /* CONFIG_USB_HCI */
  120459. +
  120460. +#ifdef CONFIG_USE_VMALLOC
  120461. +#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120462. +#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120463. +#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120464. +#define rtw_vmalloc_f(sz, mstat_f) dbg_rtw_vmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120465. +#define rtw_zvmalloc_f(sz, mstat_f) dbg_rtw_zvmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120466. +#define rtw_vmfree_f(pbuf, sz, mstat_f) dbg_rtw_vmfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)
  120467. +#else /* CONFIG_USE_VMALLOC */
  120468. +#define rtw_vmalloc(sz) dbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120469. +#define rtw_zvmalloc(sz) dbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120470. +#define rtw_vmfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120471. +#define rtw_vmalloc_f(sz, mstat_f) dbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120472. +#define rtw_zvmalloc_f(sz, mstat_f) dbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120473. +#define rtw_vmfree_f(pbuf, sz, mstat_f) dbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120474. +#endif /* CONFIG_USE_VMALLOC */
  120475. +#define rtw_malloc(sz) dbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120476. +#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120477. +#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120478. +#define rtw_malloc_f(sz, mstat_f) dbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120479. +#define rtw_zmalloc_f(sz, mstat_f) dbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120480. +#define rtw_mfree_f(pbuf, sz, mstat_f) dbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)
  120481. +
  120482. +#define rtw_skb_alloc(size) dbg_rtw_skb_alloc((size), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120483. +#define rtw_skb_free(skb) dbg_rtw_skb_free((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120484. +#define rtw_skb_alloc_f(size, mstat_f) dbg_rtw_skb_alloc((size), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120485. +#define rtw_skb_free_f(skb, mstat_f) dbg_rtw_skb_free((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120486. +#define rtw_skb_copy(skb) dbg_rtw_skb_copy((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120487. +#define rtw_skb_clone(skb) dbg_rtw_skb_clone((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120488. +#define rtw_skb_copy_f(skb, mstat_f) dbg_rtw_skb_copy((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120489. +#define rtw_skb_clone_f(skb, mstat_f) dbg_rtw_skb_clone((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120490. +#define rtw_netif_rx(ndev, skb) dbg_rtw_netif_rx(ndev, skb, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120491. +#define rtw_skb_queue_purge(sk_buff_head) dbg_rtw_skb_queue_purge(sk_buff_head, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
  120492. +#ifdef CONFIG_USB_HCI
  120493. +#define rtw_usb_buffer_alloc(dev, size, dma) dbg_rtw_usb_buffer_alloc((dev), (size), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__)
  120494. +#define rtw_usb_buffer_free(dev, size, addr, dma) dbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__)
  120495. +#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f) dbg_rtw_usb_buffer_alloc((dev), (size), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__)
  120496. +#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f) dbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__)
  120497. +#endif /* CONFIG_USB_HCI */
  120498. +
  120499. +#else /* DBG_MEM_ALLOC */
  120500. +#define rtw_mstat_update(flag, status, sz) do {} while(0)
  120501. +#define rtw_mstat_dump() do {} while(0)
  120502. +u8* _rtw_vmalloc(u32 sz);
  120503. +u8* _rtw_zvmalloc(u32 sz);
  120504. +void _rtw_vmfree(u8 *pbuf, u32 sz);
  120505. +u8* _rtw_zmalloc(u32 sz);
  120506. +u8* _rtw_malloc(u32 sz);
  120507. +void _rtw_mfree(u8 *pbuf, u32 sz);
  120508. +
  120509. +struct sk_buff *_rtw_skb_alloc(u32 sz);
  120510. +void _rtw_skb_free(struct sk_buff *skb);
  120511. +struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb);
  120512. +struct sk_buff *_rtw_skb_clone(struct sk_buff *skb);
  120513. +int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb);
  120514. +void _rtw_skb_queue_purge(struct sk_buff_head *list);
  120515. +
  120516. +#ifdef CONFIG_USB_HCI
  120517. +void *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma);
  120518. +void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma);
  120519. +#endif /* CONFIG_USB_HCI */
  120520. +
  120521. +#ifdef CONFIG_USE_VMALLOC
  120522. +#define rtw_vmalloc(sz) _rtw_vmalloc((sz))
  120523. +#define rtw_zvmalloc(sz) _rtw_zvmalloc((sz))
  120524. +#define rtw_vmfree(pbuf, sz) _rtw_vmfree((pbuf), (sz))
  120525. +#define rtw_vmalloc_f(sz, mstat_f) _rtw_vmalloc((sz))
  120526. +#define rtw_zvmalloc_f(sz, mstat_f) _rtw_zvmalloc((sz))
  120527. +#define rtw_vmfree_f(pbuf, sz, mstat_f) _rtw_vmfree((pbuf), (sz))
  120528. +#else /* CONFIG_USE_VMALLOC */
  120529. +#define rtw_vmalloc(sz) _rtw_malloc((sz))
  120530. +#define rtw_zvmalloc(sz) _rtw_zmalloc((sz))
  120531. +#define rtw_vmfree(pbuf, sz) _rtw_mfree((pbuf), (sz))
  120532. +#define rtw_vmalloc_f(sz, mstat_f) _rtw_malloc((sz))
  120533. +#define rtw_zvmalloc_f(sz, mstat_f) _rtw_zmalloc((sz))
  120534. +#define rtw_vmfree_f(pbuf, sz, mstat_f) _rtw_mfree((pbuf), (sz))
  120535. +#endif /* CONFIG_USE_VMALLOC */
  120536. +#define rtw_malloc(sz) _rtw_malloc((sz))
  120537. +#define rtw_zmalloc(sz) _rtw_zmalloc((sz))
  120538. +#define rtw_mfree(pbuf, sz) _rtw_mfree((pbuf), (sz))
  120539. +#define rtw_malloc_f(sz, mstat_f) _rtw_malloc((sz))
  120540. +#define rtw_zmalloc_f(sz, mstat_f) _rtw_zmalloc((sz))
  120541. +#define rtw_mfree_f(pbuf, sz, mstat_f) _rtw_mfree((pbuf), (sz))
  120542. +
  120543. +#define rtw_skb_alloc(size) _rtw_skb_alloc((size))
  120544. +#define rtw_skb_free(skb) _rtw_skb_free((skb))
  120545. +#define rtw_skb_alloc_f(size, mstat_f) _rtw_skb_alloc((size))
  120546. +#define rtw_skb_free_f(skb, mstat_f) _rtw_skb_free((skb))
  120547. +#define rtw_skb_copy(skb) _rtw_skb_copy((skb))
  120548. +#define rtw_skb_clone(skb) _rtw_skb_clone((skb))
  120549. +#define rtw_skb_copy_f(skb, mstat_f) _rtw_skb_copy((skb))
  120550. +#define rtw_skb_clone_f(skb, mstat_f) _rtw_skb_clone((skb))
  120551. +#define rtw_netif_rx(ndev, skb) _rtw_netif_rx(ndev, skb)
  120552. +#define rtw_skb_queue_purge(sk_buff_head) _rtw_skb_queue_purge(sk_buff_head)
  120553. +#ifdef CONFIG_USB_HCI
  120554. +#define rtw_usb_buffer_alloc(dev, size, dma) _rtw_usb_buffer_alloc((dev), (size), (dma))
  120555. +#define rtw_usb_buffer_free(dev, size, addr, dma) _rtw_usb_buffer_free((dev), (size), (addr), (dma))
  120556. +#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f) _rtw_usb_buffer_alloc((dev), (size), (dma))
  120557. +#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f) _rtw_usb_buffer_free((dev), (size), (addr), (dma))
  120558. +#endif /* CONFIG_USB_HCI */
  120559. +#endif /* DBG_MEM_ALLOC */
  120560. +
  120561. +extern void* rtw_malloc2d(int h, int w, int size);
  120562. +extern void rtw_mfree2d(void *pbuf, int h, int w, int size);
  120563. +
  120564. +extern void _rtw_memcpy(void* dec, void* sour, u32 sz);
  120565. +extern int _rtw_memcmp(void *dst, void *src, u32 sz);
  120566. +extern void _rtw_memset(void *pbuf, int c, u32 sz);
  120567. +
  120568. +extern void _rtw_init_listhead(_list *list);
  120569. +extern u32 rtw_is_list_empty(_list *phead);
  120570. +extern void rtw_list_insert_head(_list *plist, _list *phead);
  120571. +extern void rtw_list_insert_tail(_list *plist, _list *phead);
  120572. +#ifndef PLATFORM_FREEBSD
  120573. +extern void rtw_list_delete(_list *plist);
  120574. +#endif //PLATFORM_FREEBSD
  120575. +
  120576. +extern void _rtw_init_sema(_sema *sema, int init_val);
  120577. +extern void _rtw_free_sema(_sema *sema);
  120578. +extern void _rtw_up_sema(_sema *sema);
  120579. +extern u32 _rtw_down_sema(_sema *sema);
  120580. +extern void _rtw_mutex_init(_mutex *pmutex);
  120581. +extern void _rtw_mutex_free(_mutex *pmutex);
  120582. +#ifndef PLATFORM_FREEBSD
  120583. +extern void _rtw_spinlock_init(_lock *plock);
  120584. +#endif //PLATFORM_FREEBSD
  120585. +extern void _rtw_spinlock_free(_lock *plock);
  120586. +extern void _rtw_spinlock(_lock *plock);
  120587. +extern void _rtw_spinunlock(_lock *plock);
  120588. +extern void _rtw_spinlock_ex(_lock *plock);
  120589. +extern void _rtw_spinunlock_ex(_lock *plock);
  120590. +
  120591. +extern void _rtw_init_queue(_queue *pqueue);
  120592. +extern u32 _rtw_queue_empty(_queue *pqueue);
  120593. +extern u32 rtw_end_of_queue_search(_list *queue, _list *pelement);
  120594. +
  120595. +extern u32 rtw_get_current_time(void);
  120596. +extern u32 rtw_systime_to_ms(u32 systime);
  120597. +extern u32 rtw_ms_to_systime(u32 ms);
  120598. +extern s32 rtw_get_passing_time_ms(u32 start);
  120599. +extern s32 rtw_get_time_interval_ms(u32 start, u32 end);
  120600. +
  120601. +extern void rtw_sleep_schedulable(int ms);
  120602. +
  120603. +extern void rtw_msleep_os(int ms);
  120604. +extern void rtw_usleep_os(int us);
  120605. +
  120606. +extern u32 rtw_atoi(u8* s);
  120607. +
  120608. +#ifdef DBG_DELAY_OS
  120609. +#define rtw_mdelay_os(ms) _rtw_mdelay_os((ms), __FUNCTION__, __LINE__)
  120610. +#define rtw_udelay_os(ms) _rtw_udelay_os((ms), __FUNCTION__, __LINE__)
  120611. +extern void _rtw_mdelay_os(int ms, const char *func, const int line);
  120612. +extern void _rtw_udelay_os(int us, const char *func, const int line);
  120613. +#else
  120614. +extern void rtw_mdelay_os(int ms);
  120615. +extern void rtw_udelay_os(int us);
  120616. +#endif
  120617. +
  120618. +extern void rtw_yield_os(void);
  120619. +
  120620. +
  120621. +__inline static unsigned char _cancel_timer_ex(_timer *ptimer)
  120622. +{
  120623. +#ifdef PLATFORM_LINUX
  120624. + return del_timer_sync(ptimer);
  120625. +#endif
  120626. +#ifdef PLATFORM_FREEBSD
  120627. + _cancel_timer(ptimer,0);
  120628. + return 0;
  120629. +#endif
  120630. +#ifdef PLATFORM_WINDOWS
  120631. + u8 bcancelled;
  120632. +
  120633. + _cancel_timer(ptimer, &bcancelled);
  120634. +
  120635. + return bcancelled;
  120636. +#endif
  120637. +}
  120638. +
  120639. +#ifdef PLATFORM_FREEBSD
  120640. +static __inline void thread_enter(void *context);
  120641. +#endif //PLATFORM_FREEBSD
  120642. +static __inline void thread_enter(char *name)
  120643. +{
  120644. +#ifdef PLATFORM_LINUX
  120645. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
  120646. + daemonize("%s", name);
  120647. + #endif
  120648. + allow_signal(SIGTERM);
  120649. +#endif
  120650. +#ifdef PLATFORM_FREEBSD
  120651. + printf("%s", "RTKTHREAD_enter");
  120652. +#endif
  120653. +}
  120654. +
  120655. +#ifdef PLATFORM_FREEBSD
  120656. +#define thread_exit() do{printf("%s", "RTKTHREAD_exit");}while(0)
  120657. +#endif //PLATFORM_FREEBSD
  120658. +__inline static void flush_signals_thread(void)
  120659. +{
  120660. +#ifdef PLATFORM_LINUX
  120661. + if (signal_pending (current))
  120662. + {
  120663. + flush_signals(current);
  120664. + }
  120665. +#endif
  120666. +}
  120667. +
  120668. +__inline static _OS_STATUS res_to_status(sint res)
  120669. +{
  120670. +
  120671. +
  120672. +#if defined (PLATFORM_LINUX) || defined (PLATFORM_MPIXEL) || defined (PLATFORM_FREEBSD)
  120673. + return res;
  120674. +#endif
  120675. +
  120676. +#ifdef PLATFORM_WINDOWS
  120677. +
  120678. + if (res == _SUCCESS)
  120679. + return NDIS_STATUS_SUCCESS;
  120680. + else
  120681. + return NDIS_STATUS_FAILURE;
  120682. +
  120683. +#endif
  120684. +
  120685. +}
  120686. +
  120687. +__inline static void rtw_dump_stack(void)
  120688. +{
  120689. +#ifdef PLATFORM_LINUX
  120690. + dump_stack();
  120691. +#endif
  120692. +}
  120693. +
  120694. +#ifdef PLATFORM_LINUX
  120695. +#define rtw_warn_on(condition) WARN_ON(condition)
  120696. +#else
  120697. +#define rtw_warn_on(condition) do {} while (0)
  120698. +#endif
  120699. +
  120700. +#define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r))
  120701. +#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2)
  120702. +
  120703. +__inline static u32 _RND4(u32 sz)
  120704. +{
  120705. +
  120706. + u32 val;
  120707. +
  120708. + val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2;
  120709. +
  120710. + return val;
  120711. +
  120712. +}
  120713. +
  120714. +__inline static u32 _RND8(u32 sz)
  120715. +{
  120716. +
  120717. + u32 val;
  120718. +
  120719. + val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3;
  120720. +
  120721. + return val;
  120722. +
  120723. +}
  120724. +
  120725. +__inline static u32 _RND128(u32 sz)
  120726. +{
  120727. +
  120728. + u32 val;
  120729. +
  120730. + val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7;
  120731. +
  120732. + return val;
  120733. +
  120734. +}
  120735. +
  120736. +__inline static u32 _RND256(u32 sz)
  120737. +{
  120738. +
  120739. + u32 val;
  120740. +
  120741. + val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8;
  120742. +
  120743. + return val;
  120744. +
  120745. +}
  120746. +
  120747. +__inline static u32 _RND512(u32 sz)
  120748. +{
  120749. +
  120750. + u32 val;
  120751. +
  120752. + val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9;
  120753. +
  120754. + return val;
  120755. +
  120756. +}
  120757. +
  120758. +__inline static u32 bitshift(u32 bitmask)
  120759. +{
  120760. + u32 i;
  120761. +
  120762. + for (i = 0; i <= 31; i++)
  120763. + if (((bitmask>>i) & 0x1) == 1) break;
  120764. +
  120765. + return i;
  120766. +}
  120767. +
  120768. +#ifndef MAC_FMT
  120769. +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
  120770. +#endif
  120771. +#ifndef MAC_ARG
  120772. +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
  120773. +#endif
  120774. +
  120775. +//#ifdef __GNUC__
  120776. +#ifdef PLATFORM_LINUX
  120777. +#define STRUCT_PACKED __attribute__ ((packed))
  120778. +#else
  120779. +#define STRUCT_PACKED
  120780. +#endif
  120781. +
  120782. +
  120783. +// limitation of path length
  120784. +#ifdef PLATFORM_LINUX
  120785. + #define PATH_LENGTH_MAX PATH_MAX
  120786. +#elif defined(PLATFORM_WINDOWS)
  120787. + #define PATH_LENGTH_MAX MAX_PATH
  120788. +#endif
  120789. +
  120790. +
  120791. +// Suspend lock prevent system from going suspend
  120792. +#ifdef CONFIG_WAKELOCK
  120793. +#include <linux/wakelock.h>
  120794. +#elif defined(CONFIG_ANDROID_POWER)
  120795. +#include <linux/android_power.h>
  120796. +#endif
  120797. +
  120798. +extern void rtw_suspend_lock_init(void);
  120799. +extern void rtw_suspend_lock_uninit(void);
  120800. +extern void rtw_lock_suspend(void);
  120801. +extern void rtw_unlock_suspend(void);
  120802. +extern void rtw_lock_suspend_timeout(u32 timeout_ms);
  120803. +
  120804. +
  120805. +//Atomic integer operations
  120806. +#ifdef PLATFORM_LINUX
  120807. + #define ATOMIC_T atomic_t
  120808. +#elif defined(PLATFORM_WINDOWS)
  120809. + #define ATOMIC_T LONG
  120810. +#elif defined(PLATFORM_FREEBSD)
  120811. + typedef uint32_t ATOMIC_T ;
  120812. +#endif
  120813. +
  120814. +extern void ATOMIC_SET(ATOMIC_T *v, int i);
  120815. +extern int ATOMIC_READ(ATOMIC_T *v);
  120816. +extern void ATOMIC_ADD(ATOMIC_T *v, int i);
  120817. +extern void ATOMIC_SUB(ATOMIC_T *v, int i);
  120818. +extern void ATOMIC_INC(ATOMIC_T *v);
  120819. +extern void ATOMIC_DEC(ATOMIC_T *v);
  120820. +extern int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i);
  120821. +extern int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i);
  120822. +extern int ATOMIC_INC_RETURN(ATOMIC_T *v);
  120823. +extern int ATOMIC_DEC_RETURN(ATOMIC_T *v);
  120824. +
  120825. +//File operation APIs, just for linux now
  120826. +extern int rtw_is_file_readable(char *path);
  120827. +extern int rtw_retrive_from_file(char *path, u8* buf, u32 sz);
  120828. +extern int rtw_store_to_file(char *path, u8* buf, u32 sz);
  120829. +
  120830. +
  120831. +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR
  120832. +struct rtw_netdev_priv_indicator {
  120833. + void *priv;
  120834. + u32 sizeof_priv;
  120835. +};
  120836. +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv);
  120837. +extern struct net_device * rtw_alloc_etherdev(int sizeof_priv);
  120838. +
  120839. +#ifndef PLATFORM_FREEBSD
  120840. +#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv )
  120841. +#else //PLATFORM_FREEBSD
  120842. +#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc)
  120843. +#endif //PLATFORM_FREEBSD
  120844. +
  120845. +#ifndef PLATFORM_FREEBSD
  120846. +extern void rtw_free_netdev(struct net_device * netdev);
  120847. +#else //PLATFORM_FREEBSD
  120848. +#define rtw_free_netdev(netdev) if_free((netdev))
  120849. +#endif //PLATFORM_FREEBSD
  120850. +
  120851. +#else //MEM_ALLOC_REFINE_ADAPTOR
  120852. +
  120853. +#define rtw_alloc_etherdev(sizeof_priv) alloc_etherdev((sizeof_priv))
  120854. +
  120855. +#ifndef PLATFORM_FREEBSD
  120856. +#define rtw_netdev_priv(netdev) netdev_priv((netdev))
  120857. +#define rtw_free_netdev(netdev) free_netdev((netdev))
  120858. +#else //PLATFORM_FREEBSD
  120859. +#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc)
  120860. +#define rtw_free_netdev(netdev) if_free((netdev))
  120861. +#endif //PLATFORM_FREEBSD
  120862. +#endif
  120863. +
  120864. +#ifdef PLATFORM_LINUX
  120865. +#define NDEV_FMT "%s"
  120866. +#define NDEV_ARG(ndev) ndev->name
  120867. +#define ADPT_FMT "%s"
  120868. +#define ADPT_ARG(adapter) adapter->pnetdev->name
  120869. +#define FUNC_NDEV_FMT "%s(%s)"
  120870. +#define FUNC_NDEV_ARG(ndev) __func__, ndev->name
  120871. +#define FUNC_ADPT_FMT "%s(%s)"
  120872. +#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name
  120873. +#else
  120874. +#define NDEV_FMT "%s"
  120875. +#define NDEV_ARG(ndev) ""
  120876. +#define ADPT_FMT "%s"
  120877. +#define ADPT_ARG(adapter) ""
  120878. +#define FUNC_NDEV_FMT "%s"
  120879. +#define FUNC_NDEV_ARG(ndev) __func__
  120880. +#define FUNC_ADPT_FMT "%s"
  120881. +#define FUNC_ADPT_ARG(adapter) __func__
  120882. +#endif
  120883. +
  120884. +#ifdef PLATFORM_LINUX
  120885. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
  120886. +#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1)
  120887. +#else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
  120888. +#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1)
  120889. +#endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
  120890. +#endif //PLATFORM_LINUX
  120891. +
  120892. +extern u64 rtw_modular64(u64 x, u64 y);
  120893. +extern u64 rtw_division64(u64 x, u64 y);
  120894. +
  120895. +
  120896. +/* Macros for handling unaligned memory accesses */
  120897. +
  120898. +#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1]))
  120899. +#define RTW_PUT_BE16(a, val) \
  120900. + do { \
  120901. + (a)[0] = ((u16) (val)) >> 8; \
  120902. + (a)[1] = ((u16) (val)) & 0xff; \
  120903. + } while (0)
  120904. +
  120905. +#define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0]))
  120906. +#define RTW_PUT_LE16(a, val) \
  120907. + do { \
  120908. + (a)[1] = ((u16) (val)) >> 8; \
  120909. + (a)[0] = ((u16) (val)) & 0xff; \
  120910. + } while (0)
  120911. +
  120912. +#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \
  120913. + ((u32) (a)[2]))
  120914. +#define RTW_PUT_BE24(a, val) \
  120915. + do { \
  120916. + (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  120917. + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  120918. + (a)[2] = (u8) (((u32) (val)) & 0xff); \
  120919. + } while (0)
  120920. +
  120921. +#define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
  120922. + (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
  120923. +#define RTW_PUT_BE32(a, val) \
  120924. + do { \
  120925. + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \
  120926. + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  120927. + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  120928. + (a)[3] = (u8) (((u32) (val)) & 0xff); \
  120929. + } while (0)
  120930. +
  120931. +#define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \
  120932. + (((u32) (a)[1]) << 8) | ((u32) (a)[0]))
  120933. +#define RTW_PUT_LE32(a, val) \
  120934. + do { \
  120935. + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \
  120936. + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  120937. + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  120938. + (a)[0] = (u8) (((u32) (val)) & 0xff); \
  120939. + } while (0)
  120940. +
  120941. +#define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \
  120942. + (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \
  120943. + (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \
  120944. + (((u64) (a)[6]) << 8) | ((u64) (a)[7]))
  120945. +#define RTW_PUT_BE64(a, val) \
  120946. + do { \
  120947. + (a)[0] = (u8) (((u64) (val)) >> 56); \
  120948. + (a)[1] = (u8) (((u64) (val)) >> 48); \
  120949. + (a)[2] = (u8) (((u64) (val)) >> 40); \
  120950. + (a)[3] = (u8) (((u64) (val)) >> 32); \
  120951. + (a)[4] = (u8) (((u64) (val)) >> 24); \
  120952. + (a)[5] = (u8) (((u64) (val)) >> 16); \
  120953. + (a)[6] = (u8) (((u64) (val)) >> 8); \
  120954. + (a)[7] = (u8) (((u64) (val)) & 0xff); \
  120955. + } while (0)
  120956. +
  120957. +#define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \
  120958. + (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \
  120959. + (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \
  120960. + (((u64) (a)[1]) << 8) | ((u64) (a)[0]))
  120961. +
  120962. +void rtw_buf_free(u8 **buf, u32 *buf_len);
  120963. +void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len);
  120964. +
  120965. +struct rtw_cbuf {
  120966. + u32 write;
  120967. + u32 read;
  120968. + u32 size;
  120969. + void *bufs[0];
  120970. +};
  120971. +
  120972. +bool rtw_cbuf_full(struct rtw_cbuf *cbuf);
  120973. +bool rtw_cbuf_empty(struct rtw_cbuf *cbuf);
  120974. +bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf);
  120975. +void *rtw_cbuf_pop(struct rtw_cbuf *cbuf);
  120976. +struct rtw_cbuf *rtw_cbuf_alloc(u32 size);
  120977. +void rtw_cbuf_free(struct rtw_cbuf *cbuf);
  120978. +
  120979. +#endif
  120980. --- /dev/null
  120981. +++ b/drivers/net/wireless/rtl8192cu/include/pci_hal.h
  120982. @@ -0,0 +1,167 @@
  120983. +/******************************************************************************
  120984. + *
  120985. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  120986. + *
  120987. + * This program is free software; you can redistribute it and/or modify it
  120988. + * under the terms of version 2 of the GNU General Public License as
  120989. + * published by the Free Software Foundation.
  120990. + *
  120991. + * This program is distributed in the hope that it will be useful, but WITHOUT
  120992. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  120993. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  120994. + * more details.
  120995. + *
  120996. + * You should have received a copy of the GNU General Public License along with
  120997. + * this program; if not, write to the Free Software Foundation, Inc.,
  120998. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  120999. + *
  121000. + *
  121001. + ******************************************************************************/
  121002. +#ifndef __PCI_HAL_H__
  121003. +#define __PCI_HAL_H__
  121004. +
  121005. +
  121006. +#define INTEL_VENDOR_ID 0x8086
  121007. +#define SIS_VENDOR_ID 0x1039
  121008. +#define ATI_VENDOR_ID 0x1002
  121009. +#define ATI_DEVICE_ID 0x7914
  121010. +#define AMD_VENDOR_ID 0x1022
  121011. +
  121012. +#define PCI_MAX_BRIDGE_NUMBER 255
  121013. +#define PCI_MAX_DEVICES 32
  121014. +#define PCI_MAX_FUNCTION 8
  121015. +
  121016. +#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address
  121017. +#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data
  121018. +
  121019. +#define PCI_CLASS_BRIDGE_DEV 0x06
  121020. +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
  121021. +
  121022. +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
  121023. +
  121024. +#define U1DONTCARE 0xFF
  121025. +#define U2DONTCARE 0xFFFF
  121026. +#define U4DONTCARE 0xFFFFFFFF
  121027. +
  121028. +#define PCI_VENDER_ID_REALTEK 0x10ec
  121029. +
  121030. +#define HAL_HW_PCI_8180_DEVICE_ID 0x8180
  121031. +#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b
  121032. +#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b
  121033. +#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b
  121034. +#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190
  121035. +#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E
  121036. +#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E
  121037. +#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE
  121038. +#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE
  121039. +#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab
  121040. +#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE
  121041. +#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron
  121042. +#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga
  121043. +#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga
  121044. +#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga
  121045. +#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga
  121046. +#define HAL_HW_PCI_700F_DEVICE_ID 0x700F
  121047. +#define HAL_HW_PCI_701F_DEVICE_ID 0x701F
  121048. +#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304
  121049. +#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce
  121050. +#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce
  121051. +#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce
  121052. +#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce
  121053. +#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce
  121054. +#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de
  121055. +#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD
  121056. +
  121057. +#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers
  121058. +#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00
  121059. +#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers
  121060. +#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01
  121061. +#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers
  121062. +#define HAL_HW_PCI_REVISION_ID_8192SE 0x10
  121063. +#define HAL_HW_PCI_REVISION_ID_8192CE 0x1
  121064. +#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers
  121065. +#define HAL_HW_PCI_REVISION_ID_8192DE 0x0
  121066. +#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers
  121067. +
  121068. +enum pci_bridge_vendor {
  121069. + PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001
  121070. + PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010
  121071. + PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100
  121072. + PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000
  121073. + PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000
  121074. + PCI_BRIDGE_VENDOR_MAX ,//= 0x80
  121075. +} ;
  121076. +
  121077. +struct rt_pci_capabilities_header {
  121078. + u8 capability_id;
  121079. + u8 next;
  121080. +};
  121081. +
  121082. +struct pci_priv{
  121083. + u8 linkctrl_reg;
  121084. +
  121085. + u8 busnumber;
  121086. + u8 devnumber;
  121087. + u8 funcnumber;
  121088. +
  121089. + u8 pcibridge_busnum;
  121090. + u8 pcibridge_devnum;
  121091. + u8 pcibridge_funcnum;
  121092. + u8 pcibridge_vendor;
  121093. + u16 pcibridge_vendorid;
  121094. + u16 pcibridge_deviceid;
  121095. + u8 pcibridge_pciehdr_offset;
  121096. + u8 pcibridge_linkctrlreg;
  121097. +
  121098. + u8 amd_l1_patch;
  121099. +};
  121100. +
  121101. +typedef struct _RT_ISR_CONTENT
  121102. +{
  121103. + union{
  121104. + u32 IntArray[2];
  121105. + u32 IntReg4Byte;
  121106. + u16 IntReg2Byte;
  121107. + };
  121108. +}RT_ISR_CONTENT, *PRT_ISR_CONTENT;
  121109. +
  121110. +//#define RegAddr(addr) (addr + 0xB2000000UL)
  121111. +//some platform macros will def here
  121112. +static inline void NdisRawWritePortUlong(u32 port, u32 val)
  121113. +{
  121114. + outl(val, port);
  121115. + //writel(val, (u8 *)RegAddr(port));
  121116. +}
  121117. +
  121118. +static inline void NdisRawWritePortUchar(u32 port, u8 val)
  121119. +{
  121120. + outb(val, port);
  121121. + //writeb(val, (u8 *)RegAddr(port));
  121122. +}
  121123. +
  121124. +static inline void NdisRawReadPortUchar(u32 port, u8 *pval)
  121125. +{
  121126. + *pval = inb(port);
  121127. + //*pval = readb((u8 *)RegAddr(port));
  121128. +}
  121129. +
  121130. +static inline void NdisRawReadPortUshort(u32 port, u16 *pval)
  121131. +{
  121132. + *pval = inw(port);
  121133. + //*pval = readw((u8 *)RegAddr(port));
  121134. +}
  121135. +
  121136. +static inline void NdisRawReadPortUlong(u32 port, u32 *pval)
  121137. +{
  121138. + *pval = inl(port);
  121139. + //*pval = readl((u8 *)RegAddr(port));
  121140. +}
  121141. +
  121142. +#ifdef CONFIG_RTL8192C
  121143. +void rtl8192ce_set_hal_ops(_adapter * padapter);
  121144. +#endif
  121145. +#ifdef CONFIG_RTL8192D
  121146. +void rtl8192de_set_hal_ops(_adapter * padapter);
  121147. +#endif
  121148. +
  121149. +#endif //__PCIE_HAL_H__
  121150. --- /dev/null
  121151. +++ b/drivers/net/wireless/rtl8192cu/include/pci_ops.h
  121152. @@ -0,0 +1,60 @@
  121153. +/******************************************************************************
  121154. + *
  121155. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121156. + *
  121157. + * This program is free software; you can redistribute it and/or modify it
  121158. + * under the terms of version 2 of the GNU General Public License as
  121159. + * published by the Free Software Foundation.
  121160. + *
  121161. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121162. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121163. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121164. + * more details.
  121165. + *
  121166. + * You should have received a copy of the GNU General Public License along with
  121167. + * this program; if not, write to the Free Software Foundation, Inc.,
  121168. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  121169. + *
  121170. + *
  121171. + ******************************************************************************/
  121172. +#ifndef __PCI_OPS_H_
  121173. +#define __PCI_OPS_H_
  121174. +
  121175. +#include <drv_conf.h>
  121176. +#include <osdep_service.h>
  121177. +#include <drv_types.h>
  121178. +#include <osdep_intf.h>
  121179. +
  121180. +#ifdef CONFIG_RTL8192C
  121181. +u32 rtl8192ce_init_desc_ring(_adapter * padapter);
  121182. +u32 rtl8192ce_free_desc_ring(_adapter * padapter);
  121183. +void rtl8192ce_reset_desc_ring(_adapter * padapter);
  121184. +#ifdef CONFIG_64BIT_DMA
  121185. +u8 PlatformEnable92CEDMA64(PADAPTER Adapter);
  121186. +#endif
  121187. +int rtl8192ce_interrupt(PADAPTER Adapter);
  121188. +void rtl8192ce_xmit_tasklet(void *priv);
  121189. +void rtl8192ce_recv_tasklet(void *priv);
  121190. +void rtl8192ce_prepare_bcn_tasklet(void *priv);
  121191. +void rtl8192ce_set_intf_ops(struct _io_ops *pops);
  121192. +#define pci_set_intf_ops rtl8192ce_set_intf_ops
  121193. +#endif
  121194. +
  121195. +#ifdef CONFIG_RTL8192D
  121196. +u32 rtl8192de_init_desc_ring(_adapter * padapter);
  121197. +u32 rtl8192de_free_desc_ring(_adapter * padapter);
  121198. +void rtl8192de_reset_desc_ring(_adapter * padapter);
  121199. +#ifdef CONFIG_64BIT_DMA
  121200. +u8 PlatformEnable92DEDMA64(PADAPTER Adapter);
  121201. +#endif
  121202. +int rtl8192de_interrupt(PADAPTER Adapter);
  121203. +void rtl8192de_xmit_tasklet(void *priv);
  121204. +void rtl8192de_recv_tasklet(void *priv);
  121205. +void rtl8192de_prepare_bcn_tasklet(void *priv);
  121206. +void rtl8192de_set_intf_ops(struct _io_ops *pops);
  121207. +#define pci_set_intf_ops rtl8192de_set_intf_ops
  121208. +u32 MpReadPCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u8 Direct);
  121209. +void MpWritePCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u32 Value, IN u8 Direct);
  121210. +#endif
  121211. +
  121212. +#endif
  121213. --- /dev/null
  121214. +++ b/drivers/net/wireless/rtl8192cu/include/pci_osintf.h
  121215. @@ -0,0 +1,32 @@
  121216. +/******************************************************************************
  121217. + *
  121218. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121219. + *
  121220. + * This program is free software; you can redistribute it and/or modify it
  121221. + * under the terms of version 2 of the GNU General Public License as
  121222. + * published by the Free Software Foundation.
  121223. + *
  121224. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121225. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121226. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121227. + * more details.
  121228. + *
  121229. + * You should have received a copy of the GNU General Public License along with
  121230. + * this program; if not, write to the Free Software Foundation, Inc.,
  121231. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  121232. + *
  121233. + *
  121234. + ******************************************************************************/
  121235. +#ifndef __PCI_OSINTF_H
  121236. +#define __PCI_OSINTF_H
  121237. +
  121238. +#include <drv_conf.h>
  121239. +#include <osdep_service.h>
  121240. +#include <drv_types.h>
  121241. +
  121242. +
  121243. +void rtw_pci_disable_aspm(_adapter *padapter);
  121244. +void rtw_pci_enable_aspm(_adapter *padapter);
  121245. +
  121246. +
  121247. +#endif
  121248. --- /dev/null
  121249. +++ b/drivers/net/wireless/rtl8192cu/include/recv_osdep.h
  121250. @@ -0,0 +1,57 @@
  121251. +/******************************************************************************
  121252. + *
  121253. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121254. + *
  121255. + * This program is free software; you can redistribute it and/or modify it
  121256. + * under the terms of version 2 of the GNU General Public License as
  121257. + * published by the Free Software Foundation.
  121258. + *
  121259. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121260. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121261. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121262. + * more details.
  121263. + *
  121264. + * You should have received a copy of the GNU General Public License along with
  121265. + * this program; if not, write to the Free Software Foundation, Inc.,
  121266. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  121267. + *
  121268. + *
  121269. + ******************************************************************************/
  121270. +#ifndef __RECV_OSDEP_H_
  121271. +#define __RECV_OSDEP_H_
  121272. +
  121273. +#include <drv_conf.h>
  121274. +#include <osdep_service.h>
  121275. +#include <drv_types.h>
  121276. +
  121277. +
  121278. +extern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter);
  121279. +extern void _rtw_free_recv_priv (struct recv_priv *precvpriv);
  121280. +
  121281. +
  121282. +extern s32 rtw_recv_entry(union recv_frame *precv_frame);
  121283. +extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame);
  121284. +extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt);
  121285. +
  121286. +extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame);
  121287. +extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup);
  121288. +
  121289. +
  121290. +int rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter);
  121291. +void rtw_free_recv_priv (struct recv_priv *precvpriv);
  121292. +
  121293. +
  121294. +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter);
  121295. +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe);
  121296. +void rtw_os_recv_resource_free(struct recv_priv *precvpriv);
  121297. +
  121298. +
  121299. +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf);
  121300. +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf);
  121301. +
  121302. +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf);
  121303. +
  121304. +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl);
  121305. +
  121306. +
  121307. +#endif //
  121308. --- /dev/null
  121309. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h
  121310. @@ -0,0 +1,152 @@
  121311. +/******************************************************************************
  121312. + *
  121313. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121314. + *
  121315. + * This program is free software; you can redistribute it and/or modify it
  121316. + * under the terms of version 2 of the GNU General Public License as
  121317. + * published by the Free Software Foundation.
  121318. + *
  121319. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121320. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121321. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121322. + * more details.
  121323. + *
  121324. + * You should have received a copy of the GNU General Public License along with
  121325. + * this program; if not, write to the Free Software Foundation, Inc.,
  121326. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  121327. + *
  121328. + *
  121329. + ******************************************************************************/
  121330. +#ifndef __RTL8192C_CMD_H_
  121331. +#define __RTL8192C_CMD_H_
  121332. +
  121333. +
  121334. +enum cmd_msg_element_id
  121335. +{
  121336. + NONE_CMDMSG_EID,
  121337. + AP_OFFLOAD_EID=0,
  121338. + SET_PWRMODE_EID=1,
  121339. + JOINBSS_RPT_EID=2,
  121340. + RSVD_PAGE_EID=3,
  121341. + RSSI_4_EID = 4,
  121342. + RSSI_SETTING_EID=5,
  121343. + MACID_CONFIG_EID=6,
  121344. + MACID_PS_MODE_EID=7,
  121345. + P2P_PS_OFFLOAD_EID=8,
  121346. + SELECTIVE_SUSPEND_ROF_CMD=9,
  121347. +#ifdef CONFIG_WOWLAN
  121348. + H2C_WO_WLAN_CMD = 26, // Wake on Wlan.
  121349. + EXT_MACID_PERIOD_EID = 27, // support macid to 64
  121350. + MACID64_CONFIG_EID = 28, // support macid to 64
  121351. +#endif // CONFIG_WOWLAN
  121352. + P2P_PS_CTW_CMD_EID=32,
  121353. + H2C_92C_IO_OFFLOAD=44,
  121354. +#ifdef CONFIG_WOWLAN
  121355. + KEEP_ALIVE_CONTROL_CMD=48,
  121356. + DISCONNECT_DECISION_CTRL_CMD=49,
  121357. + REMOTE_WAKE_CTRL_CMD=60,
  121358. +#endif // CONFIG_WOWLAN
  121359. + H2C_92C_TSF_SYNC=67,
  121360. + H2C_92C_DISABLE_BCN_FUNC=68,
  121361. + H2C_92C_RESET_TSF = 75,
  121362. + H2C_92C_CMD_MAX
  121363. +};
  121364. +
  121365. +struct cmd_msg_parm {
  121366. + u8 eid; //element id
  121367. + u8 sz; // sz
  121368. + u8 buf[6];
  121369. +};
  121370. +
  121371. +typedef struct _SETPWRMODE_PARM{
  121372. + u8 Mode;
  121373. + u8 SmartPS;
  121374. + u8 BcnPassTime; // unit: 100ms
  121375. +}SETPWRMODE_PARM, *PSETPWRMODE_PARM;
  121376. +
  121377. +#ifdef CONFIG_WOWLAN
  121378. +typedef struct _SETWOWLAN_PARM{
  121379. + u8 mode;
  121380. + u8 gpio_index;
  121381. + u8 gpio_duration;
  121382. + u8 second_mode;
  121383. + u8 reserve;
  121384. +}SETWOWLAN_PARM, *PSETWOWLAN_PARM;
  121385. +
  121386. +#define FW_WOWLAN_FUN_EN BIT(0)
  121387. +#define FW_WOWLAN_PATTERN_MATCH BIT(1)
  121388. +#define FW_WOWLAN_MAGIC_PKT BIT(2)
  121389. +#define FW_WOWLAN_UNICAST BIT(3)
  121390. +#define FW_WOWLAN_ALL_PKT_DROP BIT(4)
  121391. +#define FW_WOWLAN_GPIO_ACTIVE BIT(5)
  121392. +#define FW_WOWLAN_REKEY_WAKEUP BIT(6)
  121393. +#define FW_WOWLAN_DEAUTH_WAKEUP BIT(7)
  121394. +
  121395. +#define FW_WOWLAN_GPIO_WAKEUP_EN BIT(0)
  121396. +#define FW_FW_PARSE_MAGIC_PKT BIT(1)
  121397. +#endif // CONFIG_WOWLAN
  121398. +
  121399. +struct H2C_SS_RFOFF_PARAM{
  121400. + u8 ROFOn; // 1: on, 0:off
  121401. + u16 gpio_period; // unit: 1024 us
  121402. +}__attribute__ ((packed));
  121403. +
  121404. +
  121405. +typedef struct JOINBSSRPT_PARM{
  121406. + u8 OpMode; // RT_MEDIA_STATUS
  121407. +}JOINBSSRPT_PARM, *PJOINBSSRPT_PARM;
  121408. +
  121409. +typedef struct _RSVDPAGE_LOC{
  121410. + u8 LocProbeRsp;
  121411. + u8 LocPsPoll;
  121412. + u8 LocNullData;
  121413. +}RSVDPAGE_LOC, *PRSVDPAGE_LOC;
  121414. +
  121415. +struct P2P_PS_Offload_t {
  121416. + unsigned char Offload_En:1;
  121417. + unsigned char role:1; // 1: Owner, 0: Client
  121418. + unsigned char CTWindow_En:1;
  121419. + unsigned char NoA0_En:1;
  121420. + unsigned char NoA1_En:1;
  121421. + unsigned char AllStaSleep:1; // Only valid in Owner
  121422. + unsigned char discovery:1;
  121423. + unsigned char rsvd:1;
  121424. +};
  121425. +
  121426. +struct P2P_PS_CTWPeriod_t {
  121427. + unsigned char CTWPeriod; //TU
  121428. +};
  121429. +
  121430. +// host message to firmware cmd
  121431. +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode);
  121432. +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus);
  121433. +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param);
  121434. +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg);
  121435. +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg);
  121436. +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter*padapter,u8 bfwpoll, u16 period);
  121437. +#ifdef CONFIG_P2P
  121438. +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state);
  121439. +#endif //CONFIG_P2P
  121440. +
  121441. +#ifdef CONFIG_IOL
  121442. +typedef struct _IO_OFFLOAD_LOC{
  121443. + u8 LocCmd;
  121444. +}IO_OFFLOAD_LOC, *PIO_OFFLOAD_LOC;
  121445. +int rtl8192c_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms);
  121446. +#endif //CONFIG_IOL
  121447. +
  121448. +#ifdef CONFIG_BEACON_DISABLE_OFFLOAD
  121449. +u8 rtl8192c_dis_beacon_fun_cmd(_adapter* padapter);
  121450. +#endif // CONFIG_BEACON_DISABLE_OFFLOAD
  121451. +
  121452. +
  121453. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  121454. +int reset_tsf(PADAPTER Adapter, u8 reset_port );
  121455. +#endif // CONFIG_TSF_RESET_OFFLOAD
  121456. +
  121457. +#ifdef CONFIG_WOWLAN
  121458. +void rtl8192c_set_wowlan_cmd(_adapter* padapter);
  121459. +void SetFwRelatedForWoWLAN8192CU(_adapter* padapter,u8 bHostIsGoingtoSleep);
  121460. +#endif // CONFIG_WOWLAN
  121461. +
  121462. +#endif // __RTL8192C_CMD_H_
  121463. --- /dev/null
  121464. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h
  121465. @@ -0,0 +1,515 @@
  121466. +/******************************************************************************
  121467. + *
  121468. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121469. + *
  121470. + * This program is free software; you can redistribute it and/or modify it
  121471. + * under the terms of version 2 of the GNU General Public License as
  121472. + * published by the Free Software Foundation.
  121473. + *
  121474. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121475. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121476. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121477. + * more details.
  121478. + *
  121479. + * You should have received a copy of the GNU General Public License along with
  121480. + * this program; if not, write to the Free Software Foundation, Inc.,
  121481. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  121482. + *
  121483. + *
  121484. + ******************************************************************************/
  121485. +#ifndef __RTL8192C_DM_H__
  121486. +#define __RTL8192C_DM_H__
  121487. +//============================================================
  121488. +// Description:
  121489. +//
  121490. +// This file is for 92CE/92CU dynamic mechanism only
  121491. +//
  121492. +//
  121493. +//============================================================
  121494. +
  121495. +#define RSSI_CCK 0
  121496. +#define RSSI_OFDM 1
  121497. +#define RSSI_DEFAULT 2
  121498. +
  121499. +//============================================================
  121500. +// structure and define
  121501. +//============================================================
  121502. +
  121503. +typedef struct _FALSE_ALARM_STATISTICS{
  121504. + u32 Cnt_Parity_Fail;
  121505. + u32 Cnt_Rate_Illegal;
  121506. + u32 Cnt_Crc8_fail;
  121507. + u32 Cnt_Mcs_fail;
  121508. + u32 Cnt_Ofdm_fail;
  121509. + u32 Cnt_Cck_fail;
  121510. + u32 Cnt_all;
  121511. + u32 Cnt_Fast_Fsync;
  121512. + u32 Cnt_SB_Search_fail;
  121513. +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
  121514. +
  121515. +typedef struct _Dynamic_Power_Saving_
  121516. +{
  121517. + u8 PreCCAState;
  121518. + u8 CurCCAState;
  121519. +
  121520. + u8 PreRFState;
  121521. + u8 CurRFState;
  121522. +
  121523. + s32 Rssi_val_min;
  121524. +
  121525. +}PS_T;
  121526. +
  121527. +typedef struct _Dynamic_Initial_Gain_Threshold_
  121528. +{
  121529. + u8 Dig_Enable_Flag;
  121530. + u8 Dig_Ext_Port_Stage;
  121531. +
  121532. + int RssiLowThresh;
  121533. + int RssiHighThresh;
  121534. +
  121535. + u32 FALowThresh;
  121536. + u32 FAHighThresh;
  121537. +
  121538. + u8 CurSTAConnectState;
  121539. + u8 PreSTAConnectState;
  121540. + u8 CurMultiSTAConnectState;
  121541. +
  121542. + u8 PreIGValue;
  121543. + u8 CurIGValue;
  121544. + u8 BackupIGValue;
  121545. +
  121546. + char BackoffVal;
  121547. + char BackoffVal_range_max;
  121548. + char BackoffVal_range_min;
  121549. + u8 rx_gain_range_max;
  121550. + u8 rx_gain_range_min;
  121551. + u8 Rssi_val_min;
  121552. +
  121553. + u8 PreCCKPDState;
  121554. + u8 CurCCKPDState;
  121555. + u8 PreCCKFAState;
  121556. + u8 CurCCKFAState;
  121557. + u8 PreCCAState;
  121558. + u8 CurCCAState;
  121559. +
  121560. + u8 LargeFAHit;
  121561. + u8 ForbiddenIGI;
  121562. + u32 Recover_cnt;
  121563. + u8 rx_gain_range_min_nolink;
  121564. +
  121565. +}DIG_T;
  121566. +
  121567. +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition
  121568. +{
  121569. + DIG_TYPE_THRESH_HIGH = 0,
  121570. + DIG_TYPE_THRESH_LOW = 1,
  121571. + DIG_TYPE_BACKOFF = 2,
  121572. + DIG_TYPE_RX_GAIN_MIN = 3,
  121573. + DIG_TYPE_RX_GAIN_MAX = 4,
  121574. + DIG_TYPE_ENABLE = 5,
  121575. + DIG_TYPE_DISABLE = 6,
  121576. + DIG_OP_TYPE_MAX
  121577. +}DM_DIG_OP_E;
  121578. +
  121579. +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition
  121580. +{
  121581. + CCK_PD_STAGE_LowRssi = 0,
  121582. + CCK_PD_STAGE_HighRssi = 1,
  121583. + CCK_PD_STAGE_MAX = 3,
  121584. +}DM_CCK_PDTH_E;
  121585. +
  121586. +typedef enum tag_1R_CCA_Type_Definition
  121587. +{
  121588. + CCA_1R =0,
  121589. + CCA_2R = 1,
  121590. + CCA_MAX = 2,
  121591. +}DM_1R_CCA_E;
  121592. +
  121593. +typedef enum tag_RF_Type_Definition
  121594. +{
  121595. + RF_Save =0,
  121596. + RF_Normal = 1,
  121597. + RF_MAX = 2,
  121598. +}DM_RF_E;
  121599. +
  121600. +typedef enum tag_DIG_EXT_PORT_ALGO_Definition
  121601. +{
  121602. + DIG_EXT_PORT_STAGE_0 = 0,
  121603. + DIG_EXT_PORT_STAGE_1 = 1,
  121604. + DIG_EXT_PORT_STAGE_2 = 2,
  121605. + DIG_EXT_PORT_STAGE_3 = 3,
  121606. + DIG_EXT_PORT_STAGE_MAX = 4,
  121607. +}DM_DIG_EXT_PORT_ALG_E;
  121608. +
  121609. +
  121610. +typedef enum tag_DIG_Connect_Definition
  121611. +{
  121612. + DIG_STA_DISCONNECT = 0,
  121613. + DIG_STA_CONNECT = 1,
  121614. + DIG_STA_BEFORE_CONNECT = 2,
  121615. + DIG_MultiSTA_DISCONNECT = 3,
  121616. + DIG_MultiSTA_CONNECT = 4,
  121617. + DIG_CONNECT_MAX
  121618. +}DM_DIG_CONNECT_E;
  121619. +
  121620. +
  121621. +
  121622. +typedef enum _BT_Ant_NUM{
  121623. + Ant_x2 = 0,
  121624. + Ant_x1 = 1
  121625. +} BT_Ant_NUM, *PBT_Ant_NUM;
  121626. +
  121627. +typedef enum _BT_CoType{
  121628. + BT_2Wire = 0,
  121629. + BT_ISSC_3Wire = 1,
  121630. + BT_Accel = 2,
  121631. + BT_CSR_BC4 = 3,
  121632. + BT_CSR_BC8 = 4,
  121633. + BT_RTL8756 = 5,
  121634. +} BT_CoType, *PBT_CoType;
  121635. +
  121636. +typedef enum _BT_CurState{
  121637. + BT_OFF = 0,
  121638. + BT_ON = 1,
  121639. +} BT_CurState, *PBT_CurState;
  121640. +
  121641. +typedef enum _BT_ServiceType{
  121642. + BT_SCO = 0,
  121643. + BT_A2DP = 1,
  121644. + BT_HID = 2,
  121645. + BT_HID_Idle = 3,
  121646. + BT_Scan = 4,
  121647. + BT_Idle = 5,
  121648. + BT_OtherAction = 6,
  121649. + BT_Busy = 7,
  121650. + BT_OtherBusy = 8,
  121651. + BT_PAN = 9,
  121652. +} BT_ServiceType, *PBT_ServiceType;
  121653. +
  121654. +typedef enum _BT_RadioShared{
  121655. + BT_Radio_Shared = 0,
  121656. + BT_Radio_Individual = 1,
  121657. +} BT_RadioShared, *PBT_RadioShared;
  121658. +
  121659. +struct btcoexist_priv {
  121660. + u8 BT_Coexist;
  121661. + u8 BT_Ant_Num;
  121662. + u8 BT_CoexistType;
  121663. + u8 BT_State;
  121664. + u8 BT_CUR_State; //0:on, 1:off
  121665. + u8 BT_Ant_isolation; //0:good, 1:bad
  121666. + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic
  121667. + u8 BT_Service;
  121668. + u8 BT_Ampdu; // 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU.
  121669. + u8 BT_RadioSharedType;
  121670. + u32 Ratio_Tx;
  121671. + u32 Ratio_PRI;
  121672. + u8 BtRfRegOrigin1E;
  121673. + u8 BtRfRegOrigin1F;
  121674. + u8 BtRssiState;
  121675. + u32 BtEdcaUL;
  121676. + u32 BtEdcaDL;
  121677. + u32 BT_EDCA[2];
  121678. + u8 bCOBT;
  121679. +
  121680. + u8 bInitSet;
  121681. + u8 bBTBusyTraffic;
  121682. + u8 bBTTrafficModeSet;
  121683. + u8 bBTNonTrafficModeSet;
  121684. + //BTTraffic BT21TrafficStatistics;
  121685. + u32 CurrentState;
  121686. + u32 PreviousState;
  121687. + u8 BtPreRssiState;
  121688. + u8 bFWCoexistAllOff;
  121689. + u8 bSWCoexistAllOff;
  121690. +};
  121691. +
  121692. +#define BW_AUTO_SWITCH_HIGH_LOW 25
  121693. +#define BW_AUTO_SWITCH_LOW_HIGH 30
  121694. +
  121695. +#define DM_DIG_THRESH_HIGH 40
  121696. +#define DM_DIG_THRESH_LOW 35
  121697. +
  121698. +#define DM_FALSEALARM_THRESH_LOW 400
  121699. +#define DM_FALSEALARM_THRESH_HIGH 1000
  121700. +
  121701. +#define DM_DIG_MAX 0x3e
  121702. +#define DM_DIG_MIN 0x1e //0x22//0x1c
  121703. +
  121704. +#define DM_DIG_FA_UPPER 0x3e
  121705. +#define DM_DIG_FA_LOWER 0x20
  121706. +#define DM_DIG_FA_TH0 0x20
  121707. +#define DM_DIG_FA_TH1 0x100
  121708. +#define DM_DIG_FA_TH2 0x200
  121709. +
  121710. +#define DM_DIG_BACKOFF_MAX 12
  121711. +#define DM_DIG_BACKOFF_MIN (-4)
  121712. +#define DM_DIG_BACKOFF_DEFAULT 10
  121713. +
  121714. +#define RxPathSelection_SS_TH_low 30
  121715. +#define RxPathSelection_diff_TH 18
  121716. +
  121717. +#define DM_RATR_STA_INIT 0
  121718. +#define DM_RATR_STA_HIGH 1
  121719. +#define DM_RATR_STA_MIDDLE 2
  121720. +#define DM_RATR_STA_LOW 3
  121721. +
  121722. +#define CTSToSelfTHVal 30
  121723. +#define RegC38_TH 20
  121724. +
  121725. +#define WAIotTHVal 25
  121726. +
  121727. +//Dynamic Tx Power Control Threshold
  121728. +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
  121729. +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
  121730. +
  121731. +#define TxHighPwrLevel_Normal 0
  121732. +#define TxHighPwrLevel_Level1 1
  121733. +#define TxHighPwrLevel_Level2 2
  121734. +#define TxHighPwrLevel_BT1 3
  121735. +#define TxHighPwrLevel_BT2 4
  121736. +#define TxHighPwrLevel_15 5
  121737. +#define TxHighPwrLevel_35 6
  121738. +#define TxHighPwrLevel_50 7
  121739. +#define TxHighPwrLevel_70 8
  121740. +#define TxHighPwrLevel_100 9
  121741. +
  121742. +#define DM_Type_ByFW 0
  121743. +#define DM_Type_ByDriver 1
  121744. +
  121745. +
  121746. +typedef struct _RATE_ADAPTIVE
  121747. +{
  121748. + u8 RateAdaptiveDisabled;
  121749. + u8 RATRState;
  121750. + u16 reserve;
  121751. +
  121752. + u32 HighRSSIThreshForRA;
  121753. + u32 High2LowRSSIThreshForRA;
  121754. + u8 Low2HighRSSIThreshForRA40M;
  121755. + u32 LowRSSIThreshForRA40M;
  121756. + u8 Low2HighRSSIThreshForRA20M;
  121757. + u32 LowRSSIThreshForRA20M;
  121758. + u32 UpperRSSIThresholdRATR;
  121759. + u32 MiddleRSSIThresholdRATR;
  121760. + u32 LowRSSIThresholdRATR;
  121761. + u32 LowRSSIThresholdRATR40M;
  121762. + u32 LowRSSIThresholdRATR20M;
  121763. + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue
  121764. + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue
  121765. + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue
  121766. + u32 LastRATR;
  121767. + u8 PreRATRState;
  121768. +
  121769. +} RATE_ADAPTIVE, *PRATE_ADAPTIVE;
  121770. +
  121771. +typedef enum tag_SW_Antenna_Switch_Definition
  121772. +{
  121773. + Antenna_B = 1,
  121774. + Antenna_A = 2,
  121775. + Antenna_MAX = 3,
  121776. +}DM_SWAS_E;
  121777. +
  121778. +#ifdef CONFIG_ANTENNA_DIVERSITY
  121779. +// This indicates two different the steps.
  121780. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air.
  121781. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK
  121782. +// with original RSSI to determine if it is necessary to switch antenna.
  121783. +#define SWAW_STEP_PEAK 0
  121784. +#define SWAW_STEP_DETERMINE 1
  121785. +
  121786. +#define TP_MODE 0
  121787. +#define RSSI_MODE 1
  121788. +#define TRAFFIC_LOW 0
  121789. +#define TRAFFIC_HIGH 1
  121790. +
  121791. +typedef struct _SW_Antenna_Switch_
  121792. +{
  121793. + u8 try_flag;
  121794. + s32 PreRSSI;
  121795. + u8 CurAntenna;
  121796. + u8 PreAntenna;
  121797. + u8 RSSI_Trying;
  121798. + u8 TestMode;
  121799. + u8 bTriggerAntennaSwitch;
  121800. + u8 SelectAntennaMap;
  121801. + // Before link Antenna Switch check
  121802. + u8 SWAS_NoLink_State;
  121803. +
  121804. +}SWAT_T;
  121805. +
  121806. +
  121807. +#endif
  121808. +
  121809. +
  121810. +struct dm_priv
  121811. +{
  121812. + u8 DM_Type;
  121813. + u8 DMFlag, DMFlag_tmp;
  121814. +
  121815. +
  121816. + //for DIG
  121817. + u8 bDMInitialGainEnable;
  121818. + u8 binitialized; // for dm_initial_gain_Multi_STA use.
  121819. + DIG_T DM_DigTable;
  121820. +
  121821. + PS_T DM_PSTable;
  121822. +
  121823. + FALSE_ALARM_STATISTICS FalseAlmCnt;
  121824. +
  121825. + //for rate adaptive, in fact, 88c/92c fw will handle this
  121826. + u8 bUseRAMask;
  121827. + RATE_ADAPTIVE RateAdaptive;
  121828. +
  121829. + //* Upper and Lower Signal threshold for Rate Adaptive*/
  121830. + int UndecoratedSmoothedPWDB;
  121831. + int UndecoratedSmoothedCCK;
  121832. + int EntryMinUndecoratedSmoothedPWDB;
  121833. + int EntryMaxUndecoratedSmoothedPWDB;
  121834. +
  121835. +
  121836. + //for High Power
  121837. + u8 bDynamicTxPowerEnable;
  121838. + u8 LastDTPLvl;
  121839. + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06
  121840. +
  121841. + //for tx power tracking
  121842. + //u8 bTXPowerTracking;
  121843. + u8 TXPowercount;
  121844. + u8 bTXPowerTrackingInit;
  121845. + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default
  121846. + u8 TM_Trigger;
  121847. +
  121848. + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1
  121849. + u8 ThermalValue;
  121850. + u8 ThermalValue_LCK;
  121851. + u8 ThermalValue_IQK;
  121852. + u8 ThermalValue_DPK;
  121853. +
  121854. + u8 bRfPiEnable;
  121855. +
  121856. + //for APK
  121857. + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a
  121858. + u8 bAPKdone;
  121859. + u8 bAPKThermalMeterIgnore;
  121860. + u8 bDPdone;
  121861. + u8 bDPPathAOK;
  121862. + u8 bDPPathBOK;
  121863. +
  121864. + //for IQK
  121865. + u32 RegC04;
  121866. + u32 Reg874;
  121867. + u32 RegC08;
  121868. + u32 RegB68;
  121869. + u32 RegB6C;
  121870. + u32 Reg870;
  121871. + u32 Reg860;
  121872. + u32 Reg864;
  121873. + u32 ADDA_backup[IQK_ADDA_REG_NUM];
  121874. + u32 IQK_MAC_backup[IQK_MAC_REG_NUM];
  121875. + u32 IQK_BB_backup_recover[9];
  121876. + u32 IQK_BB_backup[IQK_BB_REG_NUM];
  121877. + u8 PowerIndex_backup[6];
  121878. +
  121879. + u8 bCCKinCH14;
  121880. +
  121881. + char CCK_index;
  121882. + char OFDM_index[2];
  121883. +
  121884. + BOOLEAN bDoneTxpower;
  121885. + char CCK_index_HP;
  121886. + char OFDM_index_HP[2];
  121887. + u8 ThermalValue_HP[HP_THERMAL_NUM];
  121888. + u8 ThermalValue_HP_index;
  121889. +
  121890. + //for TxPwrTracking
  121891. + int RegE94;
  121892. + int RegE9C;
  121893. + int RegEB4;
  121894. + int RegEBC;
  121895. +
  121896. + u32 TXPowerTrackingCallbackCnt; //cosa add for debug
  121897. +
  121898. + u32 prv_traffic_idx; // edca turbo
  121899. +
  121900. + // for dm_RF_Saving
  121901. + u8 initialize;
  121902. + u32 rf_saving_Reg874;
  121903. + u32 rf_saving_RegC70;
  121904. + u32 rf_saving_Reg85C;
  121905. + u32 rf_saving_RegA74;
  121906. +
  121907. + //for Antenna diversity
  121908. +#ifdef CONFIG_ANTENNA_DIVERSITY
  121909. + SWAT_T DM_SWAT_Table;
  121910. +#endif
  121911. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  121912. + _timer SwAntennaSwitchTimer;
  121913. +
  121914. + u64 lastTxOkCnt;
  121915. + u64 lastRxOkCnt;
  121916. + u64 TXByteCnt_A;
  121917. + u64 TXByteCnt_B;
  121918. + u64 RXByteCnt_A;
  121919. + u64 RXByteCnt_B;
  121920. + u8 DoubleComfirm;
  121921. + u8 TrafficLoad;
  121922. +#endif
  121923. +
  121924. + s32 OFDM_Pkt_Cnt;
  121925. + u8 RSSI_Select;
  121926. + u8 DIG_Dynamic_MIN ;
  121927. +
  121928. + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas
  121929. + u8 INIDATA_RATE[32];
  121930. +
  121931. +#ifdef CONFIG_DM_ADAPTIVITY
  121932. + /* Ported from ODM, for ESTI Adaptivity test */
  121933. + s8 TH_L2H_ini;
  121934. + s8 TH_EDCCA_HL_diff;
  121935. + s8 IGI_Base;
  121936. + u8 IGI_target;
  121937. + bool ForceEDCCA;
  121938. + u8 AdapEn_RSSI;
  121939. + s8 Force_TH_H;
  121940. + s8 Force_TH_L;
  121941. + u8 IGI_LowerBound;
  121942. +
  121943. + bool bPreEdccaEnable;
  121944. +#endif
  121945. +};
  121946. +
  121947. +
  121948. +/*------------------------Export global variable----------------------------*/
  121949. +/*------------------------Export global variable----------------------------*/
  121950. +/*------------------------Export Marco Definition---------------------------*/
  121951. +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}
  121952. +
  121953. +
  121954. +//============================================================
  121955. +// function prototype
  121956. +//============================================================
  121957. +void rtl8192c_init_dm_priv(IN PADAPTER Adapter);
  121958. +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter);
  121959. +void rtl8192c_InitHalDm(IN PADAPTER Adapter);
  121960. +void rtl8192c_HalDmWatchDog(IN PADAPTER Adapter);
  121961. +
  121962. +VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter);
  121963. +
  121964. +void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal);
  121965. +
  121966. +#ifdef CONFIG_BT_COEXIST
  121967. +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart);
  121968. +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir);
  121969. +#endif
  121970. +
  121971. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  121972. +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll);
  121973. +void SwAntDivRestAfterLink8192C(IN PADAPTER Adapter);
  121974. +#endif
  121975. +#ifdef CONFIG_ANTENNA_DIVERSITY
  121976. +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);
  121977. +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter);
  121978. +#endif
  121979. +
  121980. +#endif //__HAL8190PCIDM_H__
  121981. --- /dev/null
  121982. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h
  121983. @@ -0,0 +1,26 @@
  121984. +/******************************************************************************
  121985. + *
  121986. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  121987. + *
  121988. + * This program is free software; you can redistribute it and/or modify it
  121989. + * under the terms of version 2 of the GNU General Public License as
  121990. + * published by the Free Software Foundation.
  121991. + *
  121992. + * This program is distributed in the hope that it will be useful, but WITHOUT
  121993. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  121994. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  121995. + * more details.
  121996. + *
  121997. + * You should have received a copy of the GNU General Public License along with
  121998. + * this program; if not, write to the Free Software Foundation, Inc.,
  121999. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  122000. + *
  122001. + *
  122002. + ******************************************************************************/
  122003. +#ifndef _RTL8192C_EVENT_H_
  122004. +#define _RTL8192C_EVENT_H_
  122005. +
  122006. +
  122007. +
  122008. +
  122009. +#endif
  122010. --- /dev/null
  122011. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h
  122012. @@ -0,0 +1,934 @@
  122013. +/******************************************************************************
  122014. + *
  122015. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  122016. + *
  122017. + * This program is free software; you can redistribute it and/or modify it
  122018. + * under the terms of version 2 of the GNU General Public License as
  122019. + * published by the Free Software Foundation.
  122020. + *
  122021. + * This program is distributed in the hope that it will be useful, but WITHOUT
  122022. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  122023. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  122024. + * more details.
  122025. + *
  122026. + * You should have received a copy of the GNU General Public License along with
  122027. + * this program; if not, write to the Free Software Foundation, Inc.,
  122028. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  122029. + *
  122030. + *
  122031. + ******************************************************************************/
  122032. +#ifndef __RTL8192C_HAL_H__
  122033. +#define __RTL8192C_HAL_H__
  122034. +
  122035. +#include "hal_com.h"
  122036. +#include "rtl8192c_spec.h"
  122037. +#include "Hal8192CPhyReg.h"
  122038. +#include "Hal8192CPhyCfg.h"
  122039. +#include "rtl8192c_rf.h"
  122040. +#include "rtl8192c_dm.h"
  122041. +#include "rtl8192c_recv.h"
  122042. +#include "rtl8192c_xmit.h"
  122043. +#include "rtl8192c_cmd.h"
  122044. +#ifdef DBG_CONFIG_ERROR_DETECT
  122045. +#include "rtl8192c_sreset.h"
  122046. +#endif
  122047. +
  122048. +#ifdef CONFIG_PCI_HCI
  122049. +
  122050. + #include "Hal8192CEHWImg.h"
  122051. +
  122052. + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R
  122053. + //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R
  122054. + #define RTL819X_TOTAL_RF_PATH 2
  122055. +
  122056. + //2TODO: The following need to check!!
  122057. + #define RTL8192C_FW_TSMC_IMG "rtl8192CE\\rtl8192cfwT.bin"
  122058. + #define RTL8192C_FW_UMC_IMG "rtl8192CE\\rtl8192cfwU.bin"
  122059. + #define RTL8192C_FW_UMC_B_IMG "rtl8192CE\\rtl8192cfwU_B.bin"
  122060. +
  122061. + #define RTL8188C_PHY_REG "rtl8192CE\\PHY_REG_1T.txt"
  122062. + #define RTL8188C_PHY_RADIO_A "rtl8192CE\\radio_a_1T.txt"
  122063. + #define RTL8188C_PHY_RADIO_B "rtl8192CE\\radio_b_1T.txt"
  122064. + #define RTL8188C_AGC_TAB "rtl8192CE\\AGC_TAB_1T.txt"
  122065. + #define RTL8188C_PHY_MACREG "rtl8192CE\\MACREG_1T.txt"
  122066. +
  122067. + #define RTL8192C_PHY_REG "rtl8192CE\\PHY_REG_2T.txt"
  122068. + #define RTL8192C_PHY_RADIO_A "rtl8192CE\\radio_a_2T.txt"
  122069. + #define RTL8192C_PHY_RADIO_B "rtl8192CE\\radio_b_2T.txt"
  122070. + #define RTL8192C_AGC_TAB "rtl8192CE\\AGC_TAB_2T.txt"
  122071. + #define RTL8192C_PHY_MACREG "rtl8192CE\\MACREG_2T.txt"
  122072. +
  122073. + #define RTL819X_PHY_MACPHY_REG "rtl8192CE\\MACPHY_reg.txt"
  122074. + #define RTL819X_PHY_MACPHY_REG_PG "rtl8192CE\\MACPHY_reg_PG.txt"
  122075. + #define RTL819X_PHY_MACREG "rtl8192CE\\MAC_REG.txt"
  122076. + #define RTL819X_PHY_REG "rtl8192CE\\PHY_REG.txt"
  122077. + #define RTL819X_PHY_REG_1T2R "rtl8192CE\\PHY_REG_1T2R.txt"
  122078. + #define RTL819X_PHY_REG_to1T1R "rtl8192CE\\phy_to1T1R_a.txt"
  122079. + #define RTL819X_PHY_REG_to1T2R "rtl8192CE\\phy_to1T2R.txt"
  122080. + #define RTL819X_PHY_REG_to2T2R "rtl8192CE\\phy_to2T2R.txt"
  122081. + #define RTL819X_PHY_REG_PG "rtl8192CE\\PHY_REG_PG.txt"
  122082. + #define RTL819X_AGC_TAB "rtl8192CE\\AGC_TAB.txt"
  122083. + #define RTL819X_PHY_RADIO_A "rtl8192CE\\radio_a.txt"
  122084. + #define RTL819X_PHY_RADIO_A_1T "rtl8192CE\\radio_a_1t.txt"
  122085. + #define RTL819X_PHY_RADIO_A_2T "rtl8192CE\\radio_a_2t.txt"
  122086. + #define RTL819X_PHY_RADIO_B "rtl8192CE\\radio_b.txt"
  122087. + #define RTL819X_PHY_RADIO_B_GM "rtl8192CE\\radio_b_gm.txt"
  122088. + #define RTL819X_PHY_RADIO_C "rtl8192CE\\radio_c.txt"
  122089. + #define RTL819X_PHY_RADIO_D "rtl8192CE\\radio_d.txt"
  122090. + #define RTL819X_EEPROM_MAP "rtl8192CE\\8192ce.map"
  122091. + #define RTL819X_EFUSE_MAP "rtl8192CE\\8192ce.map"
  122092. +
  122093. +//---------------------------------------------------------------------
  122094. +// RTL8723E From file
  122095. +//---------------------------------------------------------------------
  122096. + #define RTL8723_FW_UMC_IMG "rtl8723E\\rtl8723fw.bin"
  122097. + #define RTL8723_PHY_REG "rtl8723E\\PHY_REG_1T.txt"
  122098. + #define RTL8723_PHY_RADIO_A "rtl8723E\\radio_a_1T.txt"
  122099. + #define RTL8723_PHY_RADIO_B "rtl8723E\\radio_b_1T.txt"
  122100. + #define RTL8723_AGC_TAB "rtl8723E\\AGC_TAB_1T.txt"
  122101. + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt"
  122102. + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt"
  122103. + #define RTL8723_PHY_REG_PG "rtl8723E\\PHY_REG_PG.txt"
  122104. + #define RTL8723_PHY_REG_MP "rtl8723E\\PHY_REG_MP.txt"
  122105. +
  122106. + // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24.
  122107. + #define Rtl819XFwTSMCImageArray Rtl8192CEFwTSMCImgArray
  122108. + #define Rtl819XFwUMCACutImageArray Rtl8192CEFwUMCACutImgArray
  122109. + #define Rtl819XFwUMCBCutImageArray Rtl8192CEFwUMCBCutImgArray
  122110. +
  122111. + #define Rtl8723FwUMCImageArray Rtl8192CEFwUMC8723ImgArray
  122112. + #define Rtl819XMAC_Array Rtl8192CEMAC_2T_Array
  122113. + #define Rtl819XAGCTAB_2TArray Rtl8192CEAGCTAB_2TArray
  122114. + #define Rtl819XAGCTAB_1TArray Rtl8192CEAGCTAB_1TArray
  122115. + #define Rtl819XPHY_REG_2TArray Rtl8192CEPHY_REG_2TArray
  122116. + #define Rtl819XPHY_REG_1TArray Rtl8192CEPHY_REG_1TArray
  122117. + #define Rtl819XRadioA_2TArray Rtl8192CERadioA_2TArray
  122118. + #define Rtl819XRadioA_1TArray Rtl8192CERadioA_1TArray
  122119. + #define Rtl819XRadioB_2TArray Rtl8192CERadioB_2TArray
  122120. + #define Rtl819XRadioB_1TArray Rtl8192CERadioB_1TArray
  122121. + #define Rtl819XPHY_REG_Array_PG Rtl8192CEPHY_REG_Array_PG
  122122. + #define Rtl819XPHY_REG_Array_MP Rtl8192CEPHY_REG_Array_MP
  122123. +
  122124. +#elif defined(CONFIG_USB_HCI)
  122125. +
  122126. + #include "Hal8192CUHWImg.h"
  122127. +#ifdef CONFIG_WOWLAN
  122128. + #include "Hal8192CUHWImg_wowlan.h"
  122129. +#endif //CONFIG_WOWLAN
  122130. + //2TODO: We should define 8192S firmware related macro settings here!!
  122131. + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R
  122132. + #define RTL819X_TOTAL_RF_PATH 2
  122133. +
  122134. + //TODO: The following need to check!!
  122135. + #define RTL8192C_FW_TSMC_IMG "rtl8192CU\\rtl8192cfwT.bin"
  122136. + #define RTL8192C_FW_UMC_IMG "rtl8192CU\\rtl8192cfwU.bin"
  122137. + #define RTL8192C_FW_UMC_B_IMG "rtl8192CU\\rtl8192cfwU_B.bin"
  122138. +#ifdef CONFIG_WOWLAN
  122139. + #define RTL8192C_FW_TSMC_WW_IMG "rtl8192CU\\rtl8192cfwTww.bin"
  122140. + #define RTL8192C_FW_UMC_WW_IMG "rtl8192CU\\rtl8192cfwUww.bin"
  122141. + #define RTL8192C_FW_UMC_B_WW_IMG "rtl8192CU\\rtl8192cfwU_Bww.bin"
  122142. +#endif // CONFIG_WOWLAN
  122143. + //#define RTL819X_FW_BOOT_IMG "rtl8192CU\\boot.img"
  122144. + //#define RTL819X_FW_MAIN_IMG "rtl8192CU\\main.img"
  122145. + //#define RTL819X_FW_DATA_IMG "rtl8192CU\\data.img"
  122146. +
  122147. + #define RTL8188C_PHY_REG "rtl8188CU\\PHY_REG.txt"
  122148. + #define RTL8188C_PHY_RADIO_A "rtl8188CU\\radio_a.txt"
  122149. + #define RTL8188C_PHY_RADIO_B "rtl8188CU\\radio_b.txt"
  122150. + #define RTL8188C_PHY_RADIO_A_mCard "rtl8192CU\\radio_a_1T_mCard.txt"
  122151. + #define RTL8188C_PHY_RADIO_B_mCard "rtl8192CU\\radio_b_1T_mCard.txt"
  122152. + #define RTL8188C_PHY_RADIO_A_HP "rtl8192CU\\radio_a_1T_HP.txt"
  122153. + #define RTL8188C_AGC_TAB "rtl8188CU\\AGC_TAB.txt"
  122154. + #define RTL8188C_PHY_MACREG "rtl8188CU\\MACREG.txt"
  122155. +
  122156. + #define RTL8192C_PHY_REG "rtl8192CU\\PHY_REG.txt"
  122157. + #define RTL8192C_PHY_RADIO_A "rtl8192CU\\radio_a.txt"
  122158. + #define RTL8192C_PHY_RADIO_B "rtl8192CU\\radio_b.txt"
  122159. + #define RTL8192C_AGC_TAB "rtl8192CU\\AGC_TAB.txt"
  122160. + #define RTL8192C_PHY_MACREG "rtl8192CU\\MACREG.txt"
  122161. +
  122162. + #define RTL819X_PHY_REG_PG "rtl8192CU\\PHY_REG_PG.txt"
  122163. +
  122164. +//---------------------------------------------------------------------
  122165. +// RTL8723U From file
  122166. +//---------------------------------------------------------------------
  122167. + #define RTL8723_FW_UMC_IMG "rtl8723U\\rtl8723fw.bin"
  122168. + #define RTL8723_PHY_REG "rtl8723U\\PHY_REG_1T.txt"
  122169. + #define RTL8723_PHY_RADIO_A "rtl8723U\\radio_a_1T.txt"
  122170. + #define RTL8723_PHY_RADIO_B "rtl8723U\\radio_b_1T.txt"
  122171. + #define RTL8723_AGC_TAB "rtl8723U\\AGC_TAB_1T.txt"
  122172. + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt"
  122173. + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt"
  122174. + #define RTL8723_PHY_REG_PG "rtl8723U\\PHY_REG_PG.txt"
  122175. + #define RTL8723_PHY_REG_MP "rtl8723U\\PHY_REG_MP.txt"
  122176. +
  122177. + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24.
  122178. + #define Rtl819XFwImageArray Rtl8192CUFwTSMCImgArray
  122179. + #define Rtl819XFwTSMCImageArray Rtl8192CUFwTSMCImgArray
  122180. + #define Rtl819XFwUMCACutImageArray Rtl8192CUFwUMCACutImgArray
  122181. + #define Rtl819XFwUMCBCutImageArray Rtl8192CUFwUMCBCutImgArray
  122182. +#ifdef CONFIG_WOWLAN
  122183. + #define Rtl8192C_FwTSMCWWImageArray Rtl8192CUFwTSMCWWImgArray
  122184. + #define Rtl8192C_FwUMCWWImageArray Rtl8192CUFwUMCACutWWImgArray
  122185. + #define Rtl8192C_FwUMCBCutWWImageArray Rtl8192CUFwUMCBCutWWImgArray
  122186. +#endif //CONFIG_WOWLAN
  122187. + #define Rtl819XMAC_Array Rtl8192CUMAC_2T_Array
  122188. + #define Rtl819XAGCTAB_2TArray Rtl8192CUAGCTAB_2TArray
  122189. + #define Rtl819XAGCTAB_1TArray Rtl8192CUAGCTAB_1TArray
  122190. + #define Rtl819XAGCTAB_1T_HPArray Rtl8192CUAGCTAB_1T_HPArray
  122191. + #define Rtl819XPHY_REG_2TArray Rtl8192CUPHY_REG_2TArray
  122192. + #define Rtl819XPHY_REG_1TArray Rtl8192CUPHY_REG_1TArray
  122193. + #define Rtl819XPHY_REG_1T_mCardArray Rtl8192CUPHY_REG_1T_mCardArray
  122194. + #define Rtl819XPHY_REG_2T_mCardArray Rtl8192CUPHY_REG_2T_mCardArray
  122195. + #define Rtl819XPHY_REG_1T_HPArray Rtl8192CUPHY_REG_1T_HPArray
  122196. + #define Rtl819XRadioA_2TArray Rtl8192CURadioA_2TArray
  122197. + #define Rtl819XRadioA_1TArray Rtl8192CURadioA_1TArray
  122198. + #define Rtl819XRadioA_1T_mCardArray Rtl8192CURadioA_1T_mCardArray
  122199. + #define Rtl819XRadioB_2TArray Rtl8192CURadioB_2TArray
  122200. + #define Rtl819XRadioB_1TArray Rtl8192CURadioB_1TArray
  122201. + #define Rtl819XRadioB_1T_mCardArray Rtl8192CURadioB_1T_mCardArray
  122202. + #define Rtl819XRadioA_1T_HPArray Rtl8192CURadioA_1T_HPArray
  122203. + #define Rtl819XPHY_REG_Array_PG Rtl8192CUPHY_REG_Array_PG
  122204. + #define Rtl819XPHY_REG_Array_PG_mCard Rtl8192CUPHY_REG_Array_PG_mCard
  122205. + #define Rtl819XPHY_REG_Array_PG_HP Rtl8192CUPHY_REG_Array_PG_HP
  122206. + #define Rtl819XPHY_REG_Array_MP Rtl8192CUPHY_REG_Array_MP
  122207. +#endif
  122208. +
  122209. +#define DRVINFO_SZ 4 // unit is 8bytes
  122210. +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0))
  122211. +
  122212. +#define FW_8192C_SIZE 16384+32//16k
  122213. +#define FW_8192C_START_ADDRESS 0x1000
  122214. +//#define FW_8192C_END_ADDRESS 0x3FFF //Filen said this is for test chip
  122215. +#define FW_8192C_END_ADDRESS 0x1FFF
  122216. +
  122217. +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes
  122218. +
  122219. +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\
  122220. + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\
  122221. + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300)
  122222. +
  122223. +typedef enum _FIRMWARE_SOURCE{
  122224. + FW_SOURCE_IMG_FILE = 0,
  122225. + FW_SOURCE_HEADER_FILE = 1, //from header file
  122226. +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE;
  122227. +
  122228. +typedef struct _RT_FIRMWARE{
  122229. + FIRMWARE_SOURCE eFWSource;
  122230. + u8* szFwBuffer;
  122231. + u32 ulFwLength;
  122232. +#ifdef CONFIG_WOWLAN
  122233. + u8* szWoWLANFwBuffer;
  122234. + u32 ulWoWLANFwLength;
  122235. +#endif //CONFIG_WOWLAN
  122236. +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92C, *PRT_FIRMWARE_92C;
  122237. +
  122238. +//
  122239. +// This structure must be cared byte-ordering
  122240. +//
  122241. +// Added by tynli. 2009.12.04.
  122242. +typedef struct _RT_8192C_FIRMWARE_HDR {//8-byte alinment required
  122243. +
  122244. + //--- LONG WORD 0 ----
  122245. + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut
  122246. + u8 Category; // AP/NIC and USB/PCI
  122247. + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions
  122248. + u16 Version; // FW Version
  122249. + u8 Subversion; // FW Subversion, default 0x00
  122250. + u16 Rsvd1;
  122251. +
  122252. +
  122253. + //--- LONG WORD 1 ----
  122254. + u8 Month; // Release time Month field
  122255. + u8 Date; // Release time Date field
  122256. + u8 Hour; // Release time Hour field
  122257. + u8 Minute; // Release time Minute field
  122258. + u16 RamCodeSize; // The size of RAM code
  122259. + u16 Rsvd2;
  122260. +
  122261. + //--- LONG WORD 2 ----
  122262. + u32 SvnIdx; // The SVN entry index
  122263. + u32 Rsvd3;
  122264. +
  122265. + //--- LONG WORD 3 ----
  122266. + u32 Rsvd4;
  122267. + u32 Rsvd5;
  122268. +
  122269. +}RT_8192C_FIRMWARE_HDR, *PRT_8192C_FIRMWARE_HDR;
  122270. +
  122271. +#define DRIVER_EARLY_INT_TIME 0x05
  122272. +#define BCN_DMA_ATIME_INT_TIME 0x02
  122273. +
  122274. +#ifdef CONFIG_USB_RX_AGGREGATION
  122275. +
  122276. +typedef enum _USB_RX_AGG_MODE{
  122277. + USB_RX_AGG_DISABLE,
  122278. + USB_RX_AGG_DMA,
  122279. + USB_RX_AGG_USB,
  122280. + USB_RX_AGG_MIX
  122281. +}USB_RX_AGG_MODE;
  122282. +
  122283. +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer
  122284. +
  122285. +#endif
  122286. +
  122287. +
  122288. +#define TX_SELE_HQ BIT(0) // High Queue
  122289. +#define TX_SELE_LQ BIT(1) // Low Queue
  122290. +#define TX_SELE_NQ BIT(2) // Normal Queue
  122291. +
  122292. +
  122293. +// Note: We will divide number of page equally for each queue other than public queue!
  122294. +
  122295. +#define TX_TOTAL_PAGE_NUMBER 0xF8
  122296. +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1)
  122297. +
  122298. +// For Normal Chip Setting
  122299. +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER
  122300. +#define NORMAL_PAGE_NUM_PUBQ 0xE7
  122301. +#define NORMAL_PAGE_NUM_HPQ 0x0C
  122302. +#define NORMAL_PAGE_NUM_LPQ 0x02
  122303. +#define NORMAL_PAGE_NUM_NPQ 0x02
  122304. +
  122305. +
  122306. +// For Test Chip Setting
  122307. +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER
  122308. +#define TEST_PAGE_NUM_PUBQ 0x7E
  122309. +
  122310. +
  122311. +// For Test Chip Setting
  122312. +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5
  122313. +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6
  122314. +
  122315. +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3
  122316. +#define WMM_TEST_PAGE_NUM_HPQ 0x29
  122317. +#define WMM_TEST_PAGE_NUM_LPQ 0x29
  122318. +
  122319. +
  122320. +//Note: For Normal Chip Setting ,modify later
  122321. +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5
  122322. +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6
  122323. +
  122324. +#define WMM_NORMAL_PAGE_NUM_PUBQ 0x65
  122325. +#define WMM_NORMAL_PAGE_NUM_HPQ 0x30
  122326. +#define WMM_NORMAL_PAGE_NUM_LPQ 0x30
  122327. +#define WMM_NORMAL_PAGE_NUM_NPQ 0x30
  122328. +
  122329. +//-------------------------------------------------------------------------
  122330. +// Chip specific
  122331. +//-------------------------------------------------------------------------
  122332. +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
  122333. +#define CHIP_BONDING_92C_1T2R 0x1
  122334. +#define CHIP_BONDING_88C_USB_MCARD 0x2
  122335. +#define CHIP_BONDING_88C_USB_HP 0x1
  122336. +
  122337. +//
  122338. +// 2011.01.06. Define new structure of chip version for RTL8723 and so on. Added by tynli.
  122339. +//
  122340. +/*
  122341. + | BIT15:12 | BIT11:8 | BIT 7 | BIT6:4 | BIT3 | BIT2:0 |
  122342. + |-------------+-----------+-----------+-------+-----------+-------|
  122343. + | IC version(CUT) | ROM version | Manufacturer | RF type | Chip type | IC Type |
  122344. + | | | TSMC/UMC | | TEST/NORMAL| |
  122345. +*/
  122346. +// [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3
  122347. +// [7] Manufacturer: TSMC=0, UMC=1
  122348. +// [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2
  122349. +// [3] Chip type: TEST=0, NORMAL=1
  122350. +// [2:0] IC type: 81xxC=0, 8723=1, 92D=2
  122351. +
  122352. +#define CHIP_8723 BIT(0)
  122353. +#define CHIP_92D BIT(1)
  122354. +#define NORMAL_CHIP BIT(3)
  122355. +#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
  122356. +#define RF_TYPE_1T2R BIT(4)
  122357. +#define RF_TYPE_2T2R BIT(5)
  122358. +#define CHIP_VENDOR_UMC BIT(7)
  122359. +#define B_CUT_VERSION BIT(12)
  122360. +#define C_CUT_VERSION BIT(13)
  122361. +#define D_CUT_VERSION ((BIT(13)|BIT(14)))
  122362. +
  122363. +
  122364. +// MASK
  122365. +#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
  122366. +#define CHIP_TYPE_MASK BIT(3)
  122367. +#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
  122368. +#define MANUFACTUER_MASK BIT(7)
  122369. +#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
  122370. +#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
  122371. +
  122372. +// Get element
  122373. +#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
  122374. +#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
  122375. +#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
  122376. +#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
  122377. +#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
  122378. +#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
  122379. +
  122380. +#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0)? _TRUE : _FALSE)
  122381. +#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723)? _TRUE : _FALSE)
  122382. +#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_92D)? _TRUE : _FALSE)
  122383. +#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version))? _FALSE : _TRUE)
  122384. +#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? _TRUE : _FALSE)
  122385. +#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? _TRUE : _FALSE)
  122386. +#define IS_NORMAL_CHIP(version) ((GET_CVID_CHIP_TYPE(version))? _TRUE: _FALSE)
  122387. +#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version))? _TRUE: _FALSE)
  122388. +
  122389. +#define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE)
  122390. +#define IS_92D_TEST_CHIP(version) ((IS_92D(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE)
  122391. +#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? _TRUE : _FALSE)
  122392. +#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE)
  122393. +#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE)
  122394. +// <tynli_Note> 88/92C UMC B-cut vendor is set to TSMC so we need to check CHIP_VENDOR_UMC bit is not 1.
  122395. +#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? _TRUE : _FALSE):_FALSE)
  122396. +#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? _TRUE: _FALSE) : _FALSE)
  122397. +#define IS_92D_C_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x2) ? _TRUE : _FALSE) : _FALSE)
  122398. +#define IS_92D_D_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x3) ? _TRUE : _FALSE) : _FALSE)
  122399. +
  122400. +typedef enum _VERSION_8192C{
  122401. + VERSION_TEST_CHIP_88C = 0x0000,
  122402. + VERSION_TEST_CHIP_92C = 0x0020,
  122403. + VERSION_TEST_UMC_CHIP_8723 = 0x0081,
  122404. + VERSION_NORMAL_TSMC_CHIP_88C = 0x0008,
  122405. + VERSION_NORMAL_TSMC_CHIP_92C = 0x0028,
  122406. + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018,
  122407. + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088,
  122408. + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8,
  122409. + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098,
  122410. + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089,
  122411. + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089,
  122412. + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088,
  122413. + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8,
  122414. + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090,
  122415. + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x0022,
  122416. + VERSION_TEST_CHIP_92D_DUALPHY = 0x0002,
  122417. + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x002a,
  122418. + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a,
  122419. + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a,
  122420. + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a,
  122421. + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a,
  122422. + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a,
  122423. +}VERSION_8192C,*PVERSION_8192C;
  122424. +
  122425. +
  122426. +
  122427. +//-------------------------------------------------------------------------
  122428. +// Channel Plan
  122429. +//-------------------------------------------------------------------------
  122430. +enum ChannelPlan{
  122431. + CHPL_FCC = 0,
  122432. + CHPL_IC = 1,
  122433. + CHPL_ETSI = 2,
  122434. + CHPL_SPAIN = 3,
  122435. + CHPL_FRANCE = 4,
  122436. + CHPL_MKK = 5,
  122437. + CHPL_MKK1 = 6,
  122438. + CHPL_ISRAEL = 7,
  122439. + CHPL_TELEC = 8,
  122440. + CHPL_GLOBAL = 9,
  122441. + CHPL_WORLD = 10,
  122442. +};
  122443. +
  122444. +typedef struct _TxPowerInfo{
  122445. + u8 CCKIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122446. + u8 HT40_1SIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122447. + u8 HT40_2SIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122448. + s8 HT20IndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122449. + u8 OFDMIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122450. + u8 HT40MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122451. + u8 HT20MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  122452. + u8 TSSI_A;
  122453. + u8 TSSI_B;
  122454. +}TxPowerInfo, *PTxPowerInfo;
  122455. +
  122456. +#define EFUSE_REAL_CONTENT_LEN 512
  122457. +#define EFUSE_MAP_LEN 128
  122458. +#define EFUSE_MAX_SECTION 16
  122459. +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02.
  122460. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN)
  122461. +//
  122462. +// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section
  122463. +// 9bytes + 1byt + 5bytes and pre 1byte.
  122464. +// For worst case:
  122465. +// | 1byte|----8bytes----|1byte|--5bytes--|
  122466. +// | | Reserved(14bytes) |
  122467. +//
  122468. +#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.
  122469. +
  122470. +
  122471. +#define EFUSE_MAP_LEN_8723 256
  122472. +#define EFUSE_MAX_SECTION_8723 32
  122473. +
  122474. +//========================================================
  122475. +// EFUSE for BT definition
  122476. +//========================================================
  122477. +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3
  122478. +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes
  122479. +#define EFUSE_BT_MAX_SECTION 128 // 1024/8
  122480. +
  122481. +#define EFUSE_PROTECT_BYTES_BANK 16
  122482. +
  122483. +//
  122484. +// <Roger_Notes> For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06.
  122485. +//
  122486. +typedef enum _RT_MULTI_FUNC{
  122487. + RT_MULTI_FUNC_NONE = 0x00,
  122488. + RT_MULTI_FUNC_WIFI = 0x01,
  122489. + RT_MULTI_FUNC_BT = 0x02,
  122490. + RT_MULTI_FUNC_GPS = 0x04,
  122491. +}RT_MULTI_FUNC,*PRT_MULTI_FUNC;
  122492. +
  122493. +//
  122494. +// <Roger_Notes> For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08.
  122495. +//
  122496. +typedef enum _RT_POLARITY_CTL{
  122497. + RT_POLARITY_LOW_ACT = 0,
  122498. + RT_POLARITY_HIGH_ACT = 1,
  122499. +}RT_POLARITY_CTL,*PRT_POLARITY_CTL;
  122500. +
  122501. +// For RTL8723 regulator mode. by tynli. 2011.01.14.
  122502. +typedef enum _RT_REGULATOR_MODE{
  122503. + RT_SWITCHING_REGULATOR = 0,
  122504. + RT_LDO_REGULATOR = 1,
  122505. +}RT_REGULATOR_MODE,*PRT_REGULATOR_MODE;
  122506. +
  122507. +enum c2h_id_8192c {
  122508. + C2H_DBG = 0,
  122509. + C2H_TSF = 1,
  122510. + C2H_AP_RPT_RSP = 2,
  122511. + C2H_CCX_TX_RPT = 3,
  122512. + C2H_BT_RSSI = 4,
  122513. + C2H_BT_OP_MODE = 5,
  122514. + C2H_EXT_RA_RPT = 6,
  122515. + C2H_HW_INFO_EXCH = 10,
  122516. + C2H_C2H_H2C_TEST = 11,
  122517. + C2H_BT_INFO = 12,
  122518. + C2H_BT_MP_INFO = 15,
  122519. + MAX_C2HEVENT
  122520. +};
  122521. +
  122522. +#ifdef CONFIG_PCI_HCI
  122523. +struct hal_data_8192ce
  122524. +{
  122525. + VERSION_8192C VersionID;
  122526. + RT_MULTI_FUNC MultiFunc; // For multi-function consideration.
  122527. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control.
  122528. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO
  122529. + u16 CustomerID;
  122530. +
  122531. + u16 FirmwareVersion;
  122532. + u16 FirmwareVersionRev;
  122533. + u16 FirmwareSubVersion;
  122534. +
  122535. + u32 IntrMask[2];
  122536. + u32 IntrMaskToSet[2];
  122537. +
  122538. + u32 DisabledFunctions;
  122539. +
  122540. + //current WIFI_PHY values
  122541. + u32 ReceiveConfig;
  122542. + u32 TransmitConfig;
  122543. + WIRELESS_MODE CurrentWirelessMode;
  122544. + HT_CHANNEL_WIDTH CurrentChannelBW;
  122545. + u8 CurrentChannel;
  122546. + u8 nCur40MhzPrimeSC;// Control channel sub-carrier
  122547. +
  122548. + u16 BasicRateSet;
  122549. +
  122550. + //rf_ctrl
  122551. + _lock rf_lock;
  122552. + u8 rf_chip;
  122553. + u8 rf_type;
  122554. + u8 NumTotalRFPath;
  122555. +
  122556. + INTERFACE_SELECT_8192CPCIe InterfaceSel;
  122557. +
  122558. + //
  122559. + // EEPROM setting.
  122560. + //
  122561. + u16 EEPROMVID;
  122562. + u16 EEPROMDID;
  122563. + u16 EEPROMSVID;
  122564. + u16 EEPROMSMID;
  122565. + u16 EEPROMChannelPlan;
  122566. + u16 EEPROMVersion;
  122567. +
  122568. + u8 EEPROMChnlAreaTxPwrCCK[2][3];
  122569. + u8 EEPROMChnlAreaTxPwrHT40_1S[2][3];
  122570. + u8 EEPROMChnlAreaTxPwrHT40_2SDiff[2][3];
  122571. + u8 EEPROMPwrLimitHT20[3];
  122572. + u8 EEPROMPwrLimitHT40[3];
  122573. +
  122574. + u8 bTXPowerDataReadFromEEPORM;
  122575. + u8 EEPROMThermalMeter;
  122576. + u8 EEPROMTSSI[2];
  122577. +
  122578. + u8 EEPROMCustomerID;
  122579. + u8 EEPROMBoardType;
  122580. + u8 EEPROMRegulatory;
  122581. +
  122582. + u8 bDefaultAntenna;
  122583. + u8 bIQKInitialized;
  122584. +
  122585. + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122586. + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  122587. + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  122588. + s8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
  122589. + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
  122590. + // For power group
  122591. + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122592. + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122593. +
  122594. + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff
  122595. +
  122596. +#ifdef CONFIG_BT_COEXIST
  122597. + struct btcoexist_priv bt_coexist;
  122598. +#endif
  122599. +
  122600. + // Read/write are allow for following hardware information variables
  122601. + u8 framesync;
  122602. + u32 framesyncC34;
  122603. + u8 framesyncMonitor;
  122604. + u8 DefaultInitialGain[4];
  122605. + u8 pwrGroupCnt;
  122606. + u32 MCSTxPowerLevelOriginalOffset[7][16];
  122607. + u32 CCKTxPowerLevelOriginalOffset;
  122608. +
  122609. + u32 AntennaTxPath; // Antenna path Tx
  122610. + u32 AntennaRxPath; // Antenna path Rx
  122611. + u8 BluetoothCoexist;
  122612. + u8 ExternalPA;
  122613. +
  122614. + //u32 LedControlNum;
  122615. + //u32 LedControlMode;
  122616. + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16.
  122617. + //u32 TxPowerTrackControl;
  122618. + u8 b1x1RecvCombine; // for 1T1R receive combining
  122619. +
  122620. + u8 bCurrentTurboEDCA;
  122621. + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo.
  122622. +
  122623. + //vivi, for tx power tracking, 20080407
  122624. + //u16 TSSI_13dBm;
  122625. + //u32 Pwr_Track;
  122626. + // The current Tx Power Level
  122627. + u8 CurrentCckTxPwrIdx;
  122628. + u8 CurrentOfdm24GTxPwrIdx;
  122629. +
  122630. + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D
  122631. +
  122632. + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now.
  122633. +
  122634. + u32 RfRegChnlVal[2];
  122635. +
  122636. + u8 bCckHighPower;
  122637. +
  122638. + //RDG enable
  122639. + BOOLEAN bRDGEnable;
  122640. +
  122641. + //for host message to fw
  122642. + u8 LastHMEBoxNum;
  122643. +
  122644. + u8 fw_ractrl;
  122645. + u8 RegTxPause;
  122646. + // Beacon function related global variable.
  122647. + u32 RegBcnCtrlVal;
  122648. + u8 RegFwHwTxQCtrl;
  122649. + u8 RegReg542;
  122650. + u8 CurAntenna;
  122651. + u8 AntDivCfg;
  122652. +
  122653. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  122654. + //SW Antenna Switch
  122655. + s32 RSSI_sum_A;
  122656. + s32 RSSI_sum_B;
  122657. + s32 RSSI_cnt_A;
  122658. + s32 RSSI_cnt_B;
  122659. + BOOLEAN RSSI_test;
  122660. +#endif
  122661. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  122662. + //Hybrid Antenna Diversity
  122663. + u32 CCK_Ant1_Cnt;
  122664. + u32 CCK_Ant2_Cnt;
  122665. + u32 OFDM_Ant1_Cnt;
  122666. + u32 OFDM_Ant2_Cnt;
  122667. +#endif
  122668. +
  122669. + struct dm_priv dmpriv;
  122670. + u8 bDumpRxPkt;//for debug
  122671. +#ifdef DBG_CONFIG_ERROR_DETECT
  122672. + struct sreset_priv srestpriv;
  122673. +#endif
  122674. + u8 bInterruptMigration;
  122675. + u8 bDisableTxInt;
  122676. + u8 bGpioHwWpsPbc;
  122677. +
  122678. + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.
  122679. +
  122680. + u16 EfuseUsedBytes;
  122681. +
  122682. +#ifdef CONFIG_P2P
  122683. + struct P2P_PS_Offload_t p2p_ps_offload;
  122684. +#endif //CONFIG_P2P
  122685. +};
  122686. +
  122687. +typedef struct hal_data_8192ce HAL_DATA_TYPE, *PHAL_DATA_TYPE;
  122688. +
  122689. +//
  122690. +// Function disabled.
  122691. +//
  122692. +#define DF_TX_BIT BIT0
  122693. +#define DF_RX_BIT BIT1
  122694. +#define DF_IO_BIT BIT2
  122695. +#define DF_IO_D3_BIT BIT3
  122696. +
  122697. +#define RT_DF_TYPE u32
  122698. +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits)))
  122699. +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits))))
  122700. +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )
  122701. +#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE)
  122702. +
  122703. +void InterruptRecognized8192CE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent);
  122704. +VOID UpdateInterruptMask8192CE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);
  122705. +#endif
  122706. +
  122707. +#ifdef CONFIG_USB_HCI
  122708. +struct hal_data_8192cu
  122709. +{
  122710. + VERSION_8192C VersionID;
  122711. + RT_MULTI_FUNC MultiFunc; // For multi-function consideration.
  122712. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control.
  122713. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO
  122714. + u16 CustomerID;
  122715. +
  122716. + u16 FirmwareVersion;
  122717. + u16 FirmwareVersionRev;
  122718. + u16 FirmwareSubVersion;
  122719. +
  122720. + //current WIFI_PHY values
  122721. + u32 ReceiveConfig;
  122722. + WIRELESS_MODE CurrentWirelessMode;
  122723. + HT_CHANNEL_WIDTH CurrentChannelBW;
  122724. + u8 CurrentChannel;
  122725. + u8 nCur40MhzPrimeSC;// Control channel sub-carrier
  122726. +
  122727. + u16 BasicRateSet;
  122728. +
  122729. + //rf_ctrl
  122730. + u8 rf_chip;
  122731. + u8 rf_type;
  122732. + u8 NumTotalRFPath;
  122733. +
  122734. + u8 BoardType;
  122735. + //INTERFACE_SELECT_8192CUSB InterfaceSel;
  122736. +
  122737. + //
  122738. + // EEPROM setting.
  122739. + //
  122740. + u16 EEPROMVID;
  122741. + u16 EEPROMPID;
  122742. + u16 EEPROMSVID;
  122743. + u16 EEPROMSDID;
  122744. + u8 EEPROMCustomerID;
  122745. + u8 EEPROMSubCustomerID;
  122746. + u8 EEPROMVersion;
  122747. + u8 EEPROMRegulatory;
  122748. +
  122749. + u8 bTXPowerDataReadFromEEPORM;
  122750. + u8 EEPROMThermalMeter;
  122751. +
  122752. + u8 bIQKInitialized;
  122753. +
  122754. + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122755. + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  122756. + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  122757. + s8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
  122758. + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
  122759. + // For power group
  122760. + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122761. + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  122762. +
  122763. + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff
  122764. +
  122765. + // Read/write are allow for following hardware information variables
  122766. + u8 framesync;
  122767. + u32 framesyncC34;
  122768. + u8 framesyncMonitor;
  122769. + u8 DefaultInitialGain[4];
  122770. + u8 pwrGroupCnt;
  122771. + u32 MCSTxPowerLevelOriginalOffset[7][16];
  122772. + u32 CCKTxPowerLevelOriginalOffset;
  122773. +
  122774. + u32 AntennaTxPath; // Antenna path Tx
  122775. + u32 AntennaRxPath; // Antenna path Rx
  122776. + u8 BluetoothCoexist;
  122777. + u8 ExternalPA;
  122778. +
  122779. + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16.
  122780. +
  122781. + //u32 LedControlNum;
  122782. + //u32 LedControlMode;
  122783. + //u32 TxPowerTrackControl;
  122784. + u8 b1x1RecvCombine; // for 1T1R receive combining
  122785. +
  122786. + u8 bCurrentTurboEDCA;
  122787. + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo.
  122788. +
  122789. + //vivi, for tx power tracking, 20080407
  122790. + //u16 TSSI_13dBm;
  122791. + //u32 Pwr_Track;
  122792. + // The current Tx Power Level
  122793. + u8 CurrentCckTxPwrIdx;
  122794. + u8 CurrentOfdm24GTxPwrIdx;
  122795. +
  122796. + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D
  122797. +
  122798. + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now.
  122799. +
  122800. + u32 RfRegChnlVal[2];
  122801. +
  122802. + u8 bCckHighPower;
  122803. +
  122804. + //RDG enable
  122805. + BOOLEAN bRDGEnable;
  122806. +
  122807. + //for host message to fw
  122808. + u8 LastHMEBoxNum;
  122809. +
  122810. + u8 fw_ractrl;
  122811. + u8 RegTxPause;
  122812. + // Beacon function related global variable.
  122813. + u32 RegBcnCtrlVal;
  122814. + u8 RegFwHwTxQCtrl;
  122815. + u8 RegReg542;
  122816. +
  122817. + struct dm_priv dmpriv;
  122818. +#ifdef DBG_CONFIG_ERROR_DETECT
  122819. + struct sreset_priv srestpriv;
  122820. +#endif
  122821. +
  122822. +#ifdef CONFIG_BT_COEXIST
  122823. + struct btcoexist_priv bt_coexist;
  122824. +#endif
  122825. + u8 CurAntenna;
  122826. + u8 AntDivCfg;
  122827. +
  122828. +#ifdef CONFIG_SW_ANTENNA_DIVERSITY
  122829. + //SW Antenna Switch
  122830. + s32 RSSI_sum_A;
  122831. + s32 RSSI_sum_B;
  122832. + s32 RSSI_cnt_A;
  122833. + s32 RSSI_cnt_B;
  122834. + BOOLEAN RSSI_test;
  122835. +#endif
  122836. +#ifdef CONFIG_HW_ANTENNA_DIVERSITY
  122837. + //Hybrid Antenna Diversity
  122838. + u32 CCK_Ant1_Cnt;
  122839. + u32 CCK_Ant2_Cnt;
  122840. + u32 OFDM_Ant1_Cnt;
  122841. + u32 OFDM_Ant2_Cnt;
  122842. +#endif
  122843. +
  122844. + u8 bDumpRxPkt;//for debug
  122845. + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.
  122846. +
  122847. + // 2010/08/09 MH Add CU power down mode.
  122848. + BOOLEAN pwrdown;
  122849. +
  122850. + // For 92C USB endpoint setting
  122851. + //
  122852. +
  122853. + u32 UsbBulkOutSize;
  122854. +
  122855. + int RtBulkOutPipe[3];
  122856. + int RtBulkInPipe;
  122857. + int RtIntInPipe;
  122858. + // Add for dual MAC 0--Mac0 1--Mac1
  122859. + u32 interfaceIndex;
  122860. +
  122861. + u8 OutEpQueueSel;
  122862. + u8 OutEpNumber;
  122863. +
  122864. + u8 Queue2EPNum[8];//for out endpoint number mapping
  122865. +
  122866. +#ifdef CONFIG_USB_TX_AGGREGATION
  122867. + u8 UsbTxAggMode;
  122868. + u8 UsbTxAggDescNum;
  122869. +#endif
  122870. +#ifdef CONFIG_USB_RX_AGGREGATION
  122871. + u16 HwRxPageSize; // Hardware setting
  122872. + u32 MaxUsbRxAggBlock;
  122873. +
  122874. + USB_RX_AGG_MODE UsbRxAggMode;
  122875. + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed
  122876. + u8 UsbRxAggBlockTimeout;
  122877. + u8 UsbRxAggPageCount; // 8192C DMA page count
  122878. + u8 UsbRxAggPageTimeout;
  122879. +#endif
  122880. +
  122881. + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme.
  122882. + BOOLEAN UsbRxHighSpeedMode;
  122883. +
  122884. + // 2010/11/22 MH Add for slim combo debug mode selective.
  122885. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock.
  122886. + BOOLEAN SlimComboDbg;
  122887. +
  122888. + u16 EfuseUsedBytes;
  122889. +
  122890. +#ifdef CONFIG_P2P
  122891. + struct P2P_PS_Offload_t p2p_ps_offload;
  122892. +#endif //CONFIG_P2P
  122893. +};
  122894. +
  122895. +typedef struct hal_data_8192cu HAL_DATA_TYPE, *PHAL_DATA_TYPE;
  122896. +#endif
  122897. +
  122898. +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData))
  122899. +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type)
  122900. +
  122901. +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)
  122902. +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)
  122903. +
  122904. +VOID rtl8192c_FirmwareSelfReset(IN PADAPTER Adapter);
  122905. +int FirmwareDownload92C(IN PADAPTER Adapter,IN BOOLEAN bUsedWoWLANFw);
  122906. +VOID InitializeFirmwareVars92C(PADAPTER Adapter);
  122907. +u8 GetEEPROMSize8192C(PADAPTER Adapter);
  122908. +void rtl8192c_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);
  122909. +VERSION_8192C rtl8192c_ReadChipVersion(IN PADAPTER Adapter);
  122910. +void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
  122911. +//void rtl8192c_free_hal_data(_adapter * padapter);
  122912. +VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo);
  122913. +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc);
  122914. +
  122915. +s32 c2h_id_filter_ccx_8192c(u8 id);
  122916. +#endif
  122917. +
  122918. +#ifdef CONFIG_MP_INCLUDED
  122919. +
  122920. +extern void Hal_SetAntenna(PADAPTER pAdapter);
  122921. +extern void Hal_SetBandwidth(PADAPTER pAdapter);
  122922. +
  122923. +extern void Hal_SetTxPower(PADAPTER pAdapter);
  122924. +extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
  122925. +extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart );
  122926. +extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart);
  122927. +extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart);
  122928. +
  122929. +extern void Hal_SetDataRate(PADAPTER pAdapter);
  122930. +extern void Hal_SetChannel(PADAPTER pAdapter);
  122931. +extern void Hal_SetAntennaPathPower(PADAPTER pAdapter);
  122932. +extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
  122933. +extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable);
  122934. +extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable);
  122935. +extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value);
  122936. +extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter);
  122937. +extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14);
  122938. +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven);
  122939. +extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower);
  122940. +extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower);
  122941. +extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter);
  122942. +extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
  122943. +extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
  122944. +extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
  122945. +
  122946. +#endif
  122947. --- /dev/null
  122948. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h
  122949. @@ -0,0 +1,41 @@
  122950. +/******************************************************************************
  122951. + *
  122952. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  122953. + *
  122954. + * This program is free software; you can redistribute it and/or modify it
  122955. + * under the terms of version 2 of the GNU General Public License as
  122956. + * published by the Free Software Foundation.
  122957. + *
  122958. + * This program is distributed in the hope that it will be useful, but WITHOUT
  122959. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  122960. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  122961. + * more details.
  122962. + *
  122963. + * You should have received a copy of the GNU General Public License along with
  122964. + * this program; if not, write to the Free Software Foundation, Inc.,
  122965. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  122966. + *
  122967. + *
  122968. + ******************************************************************************/
  122969. +#ifndef __RTL8192C_LED_H_
  122970. +#define __RTL8192C_LED_H_
  122971. +
  122972. +#include <drv_conf.h>
  122973. +#include <osdep_service.h>
  122974. +#include <drv_types.h>
  122975. +
  122976. +
  122977. +//================================================================================
  122978. +// Interface to manipulate LED objects.
  122979. +//================================================================================
  122980. +#ifdef CONFIG_USB_HCI
  122981. +void rtl8192cu_InitSwLeds(_adapter *padapter);
  122982. +void rtl8192cu_DeInitSwLeds(_adapter *padapter);
  122983. +#endif
  122984. +#ifdef CONFIG_PCI_HCI
  122985. +void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter);
  122986. +void rtl8192ce_InitSwLeds(_adapter *padapter);
  122987. +void rtl8192ce_DeInitSwLeds(_adapter *padapter);
  122988. +#endif
  122989. +
  122990. +#endif
  122991. --- /dev/null
  122992. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h
  122993. @@ -0,0 +1,183 @@
  122994. +/******************************************************************************
  122995. + *
  122996. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  122997. + *
  122998. + * This program is free software; you can redistribute it and/or modify it
  122999. + * under the terms of version 2 of the GNU General Public License as
  123000. + * published by the Free Software Foundation.
  123001. + *
  123002. + * This program is distributed in the hope that it will be useful, but WITHOUT
  123003. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  123004. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  123005. + * more details.
  123006. + *
  123007. + * You should have received a copy of the GNU General Public License along with
  123008. + * this program; if not, write to the Free Software Foundation, Inc.,
  123009. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  123010. + *
  123011. + *
  123012. + ******************************************************************************/
  123013. +#ifndef _RTL8192C_RECV_H_
  123014. +#define _RTL8192C_RECV_H_
  123015. +
  123016. +#include <drv_conf.h>
  123017. +#include <osdep_service.h>
  123018. +#include <drv_types.h>
  123019. +
  123020. +
  123021. +#ifdef PLATFORM_OS_XP
  123022. + #define NR_RECVBUFF (16)
  123023. +#elif defined(PLATFORM_OS_CE)
  123024. + #define NR_RECVBUFF (4)
  123025. +#else
  123026. +#ifdef CONFIG_SINGLE_RECV_BUF
  123027. + #define NR_RECVBUFF (1)
  123028. +#else
  123029. + #define NR_RECVBUFF (4)
  123030. +#endif //CONFIG_SINGLE_RECV_BUF
  123031. +
  123032. + #define NR_PREALLOC_RECV_SKB (8)
  123033. +#endif
  123034. +
  123035. +
  123036. +#define RECV_BLK_SZ 512
  123037. +#define RECV_BLK_CNT 16
  123038. +#define RECV_BLK_TH RECV_BLK_CNT
  123039. +
  123040. +#if defined(CONFIG_USB_HCI)
  123041. +
  123042. +#ifdef PLATFORM_OS_CE
  123043. +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
  123044. +#else
  123045. + #ifndef CONFIG_MINIMAL_MEMORY_USAGE
  123046. + //#define MAX_RECVBUF_SZ (32768) // 32k
  123047. + //#define MAX_RECVBUF_SZ (16384) //16K
  123048. + //#define MAX_RECVBUF_SZ (10240) //10K
  123049. + #ifdef CONFIG_PLATFORM_MSTAR
  123050. + #define MAX_RECVBUF_SZ (8192) // 8K
  123051. + #else
  123052. + #define MAX_RECVBUF_SZ (15360) // 15k < 16k
  123053. + #endif
  123054. + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
  123055. + #else
  123056. + #define MAX_RECVBUF_SZ (4000) // about 4K
  123057. + #endif
  123058. +#endif
  123059. +
  123060. +#elif defined(CONFIG_PCI_HCI)
  123061. +//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
  123062. +// #define MAX_RECVBUF_SZ (9100)
  123063. +//#else
  123064. + #define MAX_RECVBUF_SZ (4000) // about 4K
  123065. +//#endif
  123066. +
  123067. +#define RX_MPDU_QUEUE 0
  123068. +#define RX_CMD_QUEUE 1
  123069. +#define RX_MAX_QUEUE 2
  123070. +#endif
  123071. +
  123072. +
  123073. +#define RECV_BULK_IN_ADDR 0x80
  123074. +#define RECV_INT_IN_ADDR 0x81
  123075. +
  123076. +#define PHY_RSSI_SLID_WIN_MAX 100
  123077. +#define PHY_LINKQUALITY_SLID_WIN_MAX 20
  123078. +
  123079. +
  123080. +struct phy_stat
  123081. +{
  123082. + unsigned int phydw0;
  123083. +
  123084. + unsigned int phydw1;
  123085. +
  123086. + unsigned int phydw2;
  123087. +
  123088. + unsigned int phydw3;
  123089. +
  123090. + unsigned int phydw4;
  123091. +
  123092. + unsigned int phydw5;
  123093. +
  123094. + unsigned int phydw6;
  123095. +
  123096. + unsigned int phydw7;
  123097. +};
  123098. +
  123099. +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd
  123100. +{
  123101. + unsigned char trsw_gain_X[4];
  123102. + unsigned char pwdb_all;
  123103. + unsigned char cfosho_X[4];
  123104. + unsigned char cfotail_X[4];
  123105. + unsigned char rxevm_X[2];
  123106. + unsigned char rxsnr_X[4];
  123107. + unsigned char pdsnr_X[2];
  123108. + unsigned char csi_current_X[2];
  123109. + unsigned char csi_target_X[2];
  123110. + unsigned char sigevm;
  123111. + unsigned char max_ex_pwr;
  123112. +//#ifdef RTL8192SE
  123113. +#ifdef CONFIG_LITTLE_ENDIAN
  123114. + unsigned char ex_intf_flg:1;
  123115. + unsigned char sgi_en:1;
  123116. + unsigned char rxsc:2;
  123117. + //unsigned char rsvd:4;
  123118. + unsigned char idle_long:1;
  123119. + unsigned char r_ant_train_en:1;
  123120. + unsigned char ANTSELB:1;
  123121. + unsigned char ANTSEL:1;
  123122. +#else // _BIG_ENDIAN_
  123123. + //unsigned char rsvd:4;
  123124. + unsigned char ANTSEL:1;
  123125. + unsigned char ANTSELB:1;
  123126. + unsigned char r_ant_train_en:1;
  123127. + unsigned char idle_long:1;
  123128. + unsigned char rxsc:2;
  123129. + unsigned char sgi_en:1;
  123130. + unsigned char ex_intf_flg:1;
  123131. +#endif
  123132. +//#else // RTL8190, RTL8192E
  123133. +// unsigned char sgi_en;
  123134. +// unsigned char rxsc_sgien_exflg;
  123135. +//#endif
  123136. +} __attribute__ ((packed))PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD;
  123137. +
  123138. +typedef struct _Phy_CCK_Rx_Status_Report_8192cd
  123139. +{
  123140. + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend
  123141. + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */
  123142. + u8 adc_pwdb_X[4];
  123143. + u8 SQ_rpt;
  123144. + u8 cck_agc_rpt;
  123145. +} PHY_STS_CCK_8192CD_T;
  123146. +
  123147. +
  123148. +// Rx smooth factor
  123149. +#define Rx_Smooth_Factor (20)
  123150. +
  123151. +
  123152. +#ifdef CONFIG_USB_HCI
  123153. +typedef struct _INTERRUPT_MSG_FORMAT_EX{
  123154. + unsigned int C2H_MSG0;
  123155. + unsigned int C2H_MSG1;
  123156. + unsigned int C2H_MSG2;
  123157. + unsigned int C2H_MSG3;
  123158. + unsigned int HISR; // from HISR Reg0x124, read to clear
  123159. + unsigned int HISRE;// from HISRE Reg0x12c, read to clear
  123160. + unsigned int MSG_EX;
  123161. +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX;
  123162. +
  123163. +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);
  123164. +int rtl8192cu_init_recv_priv(_adapter * padapter);
  123165. +void rtl8192cu_free_recv_priv(_adapter * padapter);
  123166. +#endif
  123167. +
  123168. +#ifdef CONFIG_PCI_HCI
  123169. +int rtl8192ce_init_recv_priv(_adapter * padapter);
  123170. +void rtl8192ce_free_recv_priv(_adapter * padapter);
  123171. +#endif
  123172. +
  123173. +void rtl8192c_translate_rx_signal_stuff(union recv_frame *precvframe, struct phy_stat *pphy_info);
  123174. +void rtl8192c_query_rx_desc_status(union recv_frame *precvframe, struct recv_stat *pdesc);
  123175. +
  123176. +#endif
  123177. --- /dev/null
  123178. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h
  123179. @@ -0,0 +1,91 @@
  123180. +/******************************************************************************
  123181. + *
  123182. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  123183. + *
  123184. + * This program is free software; you can redistribute it and/or modify it
  123185. + * under the terms of version 2 of the GNU General Public License as
  123186. + * published by the Free Software Foundation.
  123187. + *
  123188. + * This program is distributed in the hope that it will be useful, but WITHOUT
  123189. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  123190. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  123191. + * more details.
  123192. + *
  123193. + * You should have received a copy of the GNU General Public License along with
  123194. + * this program; if not, write to the Free Software Foundation, Inc.,
  123195. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  123196. + *
  123197. + *
  123198. + ******************************************************************************/
  123199. +/******************************************************************************
  123200. + *
  123201. + *
  123202. + * Module: rtl8192c_rf.h ( Header File)
  123203. + *
  123204. + * Note: Collect every HAL RF type exter API or constant.
  123205. + *
  123206. + * Function:
  123207. + *
  123208. + * Export:
  123209. + *
  123210. + * Abbrev:
  123211. + *
  123212. + * History:
  123213. + * Data Who Remark
  123214. + *
  123215. + * 09/25/2008 MHC Create initial version.
  123216. + *
  123217. + *
  123218. +******************************************************************************/
  123219. +#ifndef _RTL8192C_RF_H_
  123220. +#define _RTL8192C_RF_H_
  123221. +/* Check to see if the file has been included already. */
  123222. +
  123223. +
  123224. +/*--------------------------Define Parameters-------------------------------*/
  123225. +
  123226. +//
  123227. +// For RF 6052 Series
  123228. +//
  123229. +#define RF6052_MAX_TX_PWR 0x3F
  123230. +#define RF6052_MAX_REG 0x3F
  123231. +#define RF6052_MAX_PATH 2
  123232. +/*--------------------------Define Parameters-------------------------------*/
  123233. +
  123234. +
  123235. +/*------------------------------Define structure----------------------------*/
  123236. +
  123237. +/*------------------------------Define structure----------------------------*/
  123238. +
  123239. +
  123240. +/*------------------------Export global variable----------------------------*/
  123241. +/*------------------------Export global variable----------------------------*/
  123242. +
  123243. +/*------------------------Export Marco Definition---------------------------*/
  123244. +
  123245. +/*------------------------Export Marco Definition---------------------------*/
  123246. +
  123247. +
  123248. +/*--------------------------Exported Function prototype---------------------*/
  123249. +
  123250. +//
  123251. +// RF RL6052 Series API
  123252. +//
  123253. +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter,
  123254. + IN u16 DataRate);
  123255. +void rtl8192c_PHY_RF6052SetBandwidth(
  123256. + IN PADAPTER Adapter,
  123257. + IN HT_CHANNEL_WIDTH Bandwidth);
  123258. +VOID rtl8192c_PHY_RF6052SetCckTxPower(
  123259. + IN PADAPTER Adapter,
  123260. + IN u8* pPowerlevel);
  123261. +VOID rtl8192c_PHY_RF6052SetOFDMTxPower(
  123262. + IN PADAPTER Adapter,
  123263. + IN u8* pPowerLevel,
  123264. + IN u8 Channel);
  123265. +int PHY_RF6052_Config8192C( IN PADAPTER Adapter );
  123266. +
  123267. +/*--------------------------Exported Function prototype---------------------*/
  123268. +
  123269. +
  123270. +#endif/* End of HalRf.h */
  123271. --- /dev/null
  123272. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h
  123273. @@ -0,0 +1,1864 @@
  123274. +/******************************************************************************
  123275. + *
  123276. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  123277. + *
  123278. + * This program is free software; you can redistribute it and/or modify it
  123279. + * under the terms of version 2 of the GNU General Public License as
  123280. + * published by the Free Software Foundation.
  123281. + *
  123282. + * This program is distributed in the hope that it will be useful, but WITHOUT
  123283. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  123284. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  123285. + * more details.
  123286. + *
  123287. + * You should have received a copy of the GNU General Public License along with
  123288. + * this program; if not, write to the Free Software Foundation, Inc.,
  123289. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  123290. + *
  123291. + *
  123292. + ******************************************************************************/
  123293. +#ifndef __RTL8192C_SPEC_H__
  123294. +#define __RTL8192C_SPEC_H__
  123295. +
  123296. +#include <drv_conf.h>
  123297. +
  123298. +#ifndef BIT
  123299. +#define BIT(x) (1 << (x))
  123300. +#endif
  123301. +
  123302. +#define BIT0 0x00000001
  123303. +#define BIT1 0x00000002
  123304. +#define BIT2 0x00000004
  123305. +#define BIT3 0x00000008
  123306. +#define BIT4 0x00000010
  123307. +#define BIT5 0x00000020
  123308. +#define BIT6 0x00000040
  123309. +#define BIT7 0x00000080
  123310. +#define BIT8 0x00000100
  123311. +#define BIT9 0x00000200
  123312. +#define BIT10 0x00000400
  123313. +#define BIT11 0x00000800
  123314. +#define BIT12 0x00001000
  123315. +#define BIT13 0x00002000
  123316. +#define BIT14 0x00004000
  123317. +#define BIT15 0x00008000
  123318. +#define BIT16 0x00010000
  123319. +#define BIT17 0x00020000
  123320. +#define BIT18 0x00040000
  123321. +#define BIT19 0x00080000
  123322. +#define BIT20 0x00100000
  123323. +#define BIT21 0x00200000
  123324. +#define BIT22 0x00400000
  123325. +#define BIT23 0x00800000
  123326. +#define BIT24 0x01000000
  123327. +#define BIT25 0x02000000
  123328. +#define BIT26 0x04000000
  123329. +#define BIT27 0x08000000
  123330. +#define BIT28 0x10000000
  123331. +#define BIT29 0x20000000
  123332. +#define BIT30 0x40000000
  123333. +#define BIT31 0x80000000
  123334. +
  123335. +
  123336. +//============================================================
  123337. +// 8192C Regsiter offset definition
  123338. +//============================================================
  123339. +
  123340. +
  123341. +//============================================================
  123342. +//
  123343. +//============================================================
  123344. +
  123345. +//-----------------------------------------------------
  123346. +//
  123347. +// 0x0000h ~ 0x00FFh System Configuration
  123348. +//
  123349. +//-----------------------------------------------------
  123350. +#define REG_SYS_ISO_CTRL 0x0000
  123351. +#define REG_SYS_FUNC_EN 0x0002
  123352. +#define REG_APS_FSMCO 0x0004
  123353. +#define REG_SYS_CLKR 0x0008
  123354. +#define REG_9346CR 0x000A
  123355. +#define REG_EE_VPD 0x000C
  123356. +#define REG_AFE_MISC 0x0010
  123357. +#define REG_SPS0_CTRL 0x0011
  123358. +#define REG_SPS_OCP_CFG 0x0018
  123359. +#define REG_RSV_CTRL 0x001C
  123360. +#define REG_RF_CTRL 0x001F
  123361. +#define REG_LDOA15_CTRL 0x0020
  123362. +#define REG_LDOV12D_CTRL 0x0021
  123363. +#define REG_LDOHCI12_CTRL 0x0022
  123364. +#define REG_LPLDO_CTRL 0x0023
  123365. +#define REG_AFE_XTAL_CTRL 0x0024
  123366. +#define REG_AFE_PLL_CTRL 0x0028
  123367. +#define REG_EFUSE_CTRL 0x0030
  123368. +#define REG_EFUSE_TEST 0x0034
  123369. +#define REG_PWR_DATA 0x0038
  123370. +#define REG_CAL_TIMER 0x003C
  123371. +#define REG_ACLK_MON 0x003E
  123372. +#define REG_GPIO_MUXCFG 0x0040
  123373. +#define REG_GPIO_IO_SEL 0x0042
  123374. +#define REG_MAC_PINMUX_CFG 0x0043
  123375. +#define REG_GPIO_PIN_CTRL 0x0044
  123376. +#define REG_GPIO_INTM 0x0048
  123377. +#define REG_LEDCFG0 0x004C
  123378. +#define REG_LEDCFG1 0x004D
  123379. +#define REG_LEDCFG2 0x004E
  123380. +#define REG_LEDCFG3 0x004F
  123381. +#define REG_LEDCFG REG_LEDCFG2
  123382. +#define REG_FSIMR 0x0050
  123383. +#define REG_FSISR 0x0054
  123384. +#define REG_HSIMR 0x0058
  123385. +#define REG_HSISR 0x005c
  123386. +#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control.
  123387. +#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select.
  123388. +#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source.
  123389. +#define REG_MCUFWDL 0x0080
  123390. +#ifdef CONFIG_WOWLAN
  123391. +#define REG_WOWLAN_REASON 0x0081
  123392. +#endif //CONFIG_WOWLAN
  123393. +#define REG_HMEBOX_EXT_0 0x0088
  123394. +#define REG_HMEBOX_EXT_1 0x008A
  123395. +#define REG_HMEBOX_EXT_2 0x008C
  123396. +#define REG_HMEBOX_EXT_3 0x008E
  123397. +#define REG_HOST_SUSP_CNT 0x00BC // Host suspend counter on FPGA platform
  123398. +#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723
  123399. +#define REG_BIST_SCAN 0x00D0
  123400. +#define REG_BIST_RPT 0x00D4
  123401. +#define REG_BIST_ROM_RPT 0x00D8
  123402. +#define REG_USB_SIE_INTF 0x00E0
  123403. +#define REG_PCIE_MIO_INTF 0x00E4
  123404. +#define REG_PCIE_MIO_INTD 0x00E8
  123405. +#define REG_HPON_FSM 0x00EC
  123406. +#define REG_SYS_CFG 0x00F0
  123407. +#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only.
  123408. +
  123409. +//-----------------------------------------------------
  123410. +//
  123411. +// 0x0100h ~ 0x01FFh MACTOP General Configuration
  123412. +//
  123413. +//-----------------------------------------------------
  123414. +#define REG_CR 0x0100
  123415. +#define REG_PBP 0x0104
  123416. +#define REG_TRXDMA_CTRL 0x010C
  123417. +#define REG_TRXFF_BNDY 0x0114
  123418. +#define REG_TRXFF_STATUS 0x0118
  123419. +#define REG_RXFF_PTR 0x011C
  123420. +#define REG_HIMR 0x0120
  123421. +#define REG_HISR 0x0124
  123422. +#define REG_HIMRE 0x0128
  123423. +#define REG_HISRE 0x012C
  123424. +#define REG_CPWM 0x012F
  123425. +#define REG_FWIMR 0x0130
  123426. +#define REG_FWISR 0x0134
  123427. +#define REG_PKTBUF_DBG_CTRL 0x0140
  123428. +#define REG_PKTBUF_DBG_DATA_L 0x0144
  123429. +#define REG_PKTBUF_DBG_DATA_H 0x0148
  123430. +
  123431. +#define REG_TC0_CTRL 0x0150
  123432. +#define REG_TC1_CTRL 0x0154
  123433. +#define REG_TC2_CTRL 0x0158
  123434. +#define REG_TC3_CTRL 0x015C
  123435. +#define REG_TC4_CTRL 0x0160
  123436. +#define REG_TCUNIT_BASE 0x0164
  123437. +#define REG_MBIST_START 0x0174
  123438. +#define REG_MBIST_DONE 0x0178
  123439. +#define REG_MBIST_FAIL 0x017C
  123440. +#define REG_C2HEVT_MSG_NORMAL 0x01A0
  123441. +#define REG_C2HEVT_CLEAR 0x01AF
  123442. +#define REG_C2HEVT_MSG_TEST 0x01B8
  123443. +#define REG_MCUTST_1 0x01c0
  123444. +#define REG_FMETHR 0x01C8
  123445. +#define REG_HMETFR 0x01CC
  123446. +#define REG_HMEBOX_0 0x01D0
  123447. +#define REG_HMEBOX_1 0x01D4
  123448. +#define REG_HMEBOX_2 0x01D8
  123449. +#define REG_HMEBOX_3 0x01DC
  123450. +
  123451. +#define REG_LLT_INIT 0x01E0
  123452. +#define REG_BB_ACCEESS_CTRL 0x01E8
  123453. +#define REG_BB_ACCESS_DATA 0x01EC
  123454. +
  123455. +
  123456. +//-----------------------------------------------------
  123457. +//
  123458. +// 0x0200h ~ 0x027Fh TXDMA Configuration
  123459. +//
  123460. +//-----------------------------------------------------
  123461. +#define REG_RQPN 0x0200
  123462. +#define REG_FIFOPAGE 0x0204
  123463. +#define REG_TDECTRL 0x0208
  123464. +#define REG_TXDMA_OFFSET_CHK 0x020C
  123465. +#define REG_TXDMA_STATUS 0x0210
  123466. +#define REG_RQPN_NPQ 0x0214
  123467. +
  123468. +//-----------------------------------------------------
  123469. +//
  123470. +// 0x0280h ~ 0x02FFh RXDMA Configuration
  123471. +//
  123472. +//-----------------------------------------------------
  123473. +#define REG_RXDMA_AGG_PG_TH 0x0280
  123474. +#define REG_RXPKT_NUM 0x0284
  123475. +#define REG_RXDMA_STATUS 0x0288
  123476. +
  123477. +
  123478. +//-----------------------------------------------------
  123479. +//
  123480. +// 0x0300h ~ 0x03FFh PCIe
  123481. +//
  123482. +//-----------------------------------------------------
  123483. +#define REG_PCIE_CTRL_REG 0x0300
  123484. +#define REG_INT_MIG 0x0304 // Interrupt Migration
  123485. +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address
  123486. +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address
  123487. +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address
  123488. +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address
  123489. +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address
  123490. +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address
  123491. +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address
  123492. +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address
  123493. +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration
  123494. +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY
  123495. +#define REG_DBG_SEL 0x0360 // Debug Selection Register
  123496. +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM
  123497. +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM
  123498. +#define REG_UART_CTRL 0x0364 // UART Control
  123499. +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address
  123500. +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address
  123501. +
  123502. +
  123503. +// spec version 11
  123504. +//-----------------------------------------------------
  123505. +//
  123506. +// 0x0400h ~ 0x047Fh Protocol Configuration
  123507. +//
  123508. +//-----------------------------------------------------
  123509. +#define REG_VOQ_INFORMATION 0x0400
  123510. +#define REG_VIQ_INFORMATION 0x0404
  123511. +#define REG_BEQ_INFORMATION 0x0408
  123512. +#define REG_BKQ_INFORMATION 0x040C
  123513. +#define REG_MGQ_INFORMATION 0x0410
  123514. +#define REG_HGQ_INFORMATION 0x0414
  123515. +#define REG_BCNQ_INFORMATION 0x0418
  123516. +
  123517. +
  123518. +#define REG_CPU_MGQ_INFORMATION 0x041C
  123519. +#define REG_FWHW_TXQ_CTRL 0x0420
  123520. +#define REG_HWSEQ_CTRL 0x0423
  123521. +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
  123522. +#define REG_TXPKTBUF_MGQ_BDNY 0x0425
  123523. +#define REG_LIFETIME_EN 0x0426
  123524. +#define REG_MULTI_BCNQ_OFFSET 0x0427
  123525. +#define REG_SPEC_SIFS 0x0428
  123526. +#define REG_RL 0x042A
  123527. +#define REG_DARFRC 0x0430
  123528. +#define REG_RARFRC 0x0438
  123529. +#define REG_RRSR 0x0440
  123530. +#define REG_ARFR0 0x0444
  123531. +#define REG_ARFR1 0x0448
  123532. +#define REG_ARFR2 0x044C
  123533. +#define REG_ARFR3 0x0450
  123534. +#define REG_AGGLEN_LMT 0x0458
  123535. +#define REG_AMPDU_MIN_SPACE 0x045C
  123536. +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
  123537. +#define REG_FAST_EDCA_CTRL 0x0460
  123538. +#define REG_RD_RESP_PKT_TH 0x0463
  123539. +#define REG_INIRTS_RATE_SEL 0x0480
  123540. +#define REG_INIDATA_RATE_SEL 0x0484
  123541. +
  123542. +//#define REG_FW_TSF_SYNC_CNT 0x04A0
  123543. +#define REG_FW_RESET_TSF_CNT_1 0x05FC
  123544. +#define REG_FW_RESET_TSF_CNT_0 0x05FD
  123545. +#define REG_FW_BCN_DIS_CNT 0x05FE
  123546. +
  123547. +#define REG_POWER_STATUS 0x04A4
  123548. +#define REG_POWER_STAGE1 0x04B4
  123549. +#define REG_POWER_STAGE2 0x04B8
  123550. +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0
  123551. +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2
  123552. +#define REG_STBC_SETTING 0x04C4
  123553. +#define REG_PROT_MODE_CTRL 0x04C8
  123554. +#define REG_MAX_AGGR_NUM 0x04CA
  123555. +#define REG_RTS_MAX_AGGR_NUM 0x04CB
  123556. +#define REG_BAR_MODE_CTRL 0x04CC
  123557. +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
  123558. +#define REG_NQOS_SEQ 0x04DC
  123559. +#define REG_QOS_SEQ 0x04DE
  123560. +#define REG_NEED_CPU_HANDLE 0x04E0
  123561. +#define REG_PKT_LOSE_RPT 0x04E1
  123562. +#define REG_PTCL_ERR_STATUS 0x04E2
  123563. +#define REG_DUMMY 0x04FC
  123564. +
  123565. +
  123566. +
  123567. +//-----------------------------------------------------
  123568. +//
  123569. +// 0x0500h ~ 0x05FFh EDCA Configuration
  123570. +//
  123571. +//-----------------------------------------------------
  123572. +#define REG_EDCA_VO_PARAM 0x0500
  123573. +#define REG_EDCA_VI_PARAM 0x0504
  123574. +#define REG_EDCA_BE_PARAM 0x0508
  123575. +#define REG_EDCA_BK_PARAM 0x050C
  123576. +#define REG_BCNTCFG 0x0510
  123577. +#define REG_PIFS 0x0512
  123578. +#define REG_RDG_PIFS 0x0513
  123579. +#define REG_SIFS_CCK 0x0514
  123580. +#define REG_SIFS_OFDM 0x0516
  123581. +#define REG_SIFS_CTX 0x0514
  123582. +#define REG_SIFS_TRX 0x0516
  123583. +#define REG_TSFTR_SYN_OFFSET 0x0518
  123584. +#define REG_AGGR_BREAK_TIME 0x051A
  123585. +#define REG_SLOT 0x051B
  123586. +#define REG_TX_PTCL_CTRL 0x0520
  123587. +#define REG_TXPAUSE 0x0522
  123588. +#define REG_DIS_TXREQ_CLR 0x0523
  123589. +#define REG_RD_CTRL 0x0524
  123590. +#define REG_TBTT_PROHIBIT 0x0540
  123591. +#define REG_RD_NAV_NXT 0x0544
  123592. +#define REG_NAV_PROT_LEN 0x0546
  123593. +#define REG_BCN_CTRL 0x0550
  123594. +#define REG_BCN_CTRL_1 0x0551
  123595. +#define REG_MBID_NUM 0x0552
  123596. +#define REG_DUAL_TSF_RST 0x0553
  123597. +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE
  123598. +#define REG_MBSSID_BCN_SPACE 0x0554
  123599. +#define REG_DRVERLYINT 0x0558
  123600. +#define REG_BCNDMATIM 0x0559
  123601. +#define REG_ATIMWND 0x055A
  123602. +#define REG_BCN_MAX_ERR 0x055D
  123603. +#define REG_RXTSF_OFFSET_CCK 0x055E
  123604. +#define REG_RXTSF_OFFSET_OFDM 0x055F
  123605. +#define REG_TSFTR 0x0560
  123606. +#define REG_TSFTR1 0x0568
  123607. +#define REG_INIT_TSFTR 0x0564
  123608. +#define REG_ATIMWND_1 0x0570
  123609. +#define REG_PSTIMER 0x0580
  123610. +#define REG_TIMER0 0x0584
  123611. +#define REG_TIMER1 0x0588
  123612. +#define REG_ACMHWCTRL 0x05C0
  123613. +#define REG_ACMRSTCTRL 0x05C1
  123614. +#define REG_ACMAVG 0x05C2
  123615. +#define REG_VO_ADMTIME 0x05C4
  123616. +#define REG_VI_ADMTIME 0x05C6
  123617. +#define REG_BE_ADMTIME 0x05C8
  123618. +#define REG_EDCA_RANDOM_GEN 0x05CC
  123619. +#define REG_SCH_TXCMD 0x05D0
  123620. +
  123621. +
  123622. +//-----------------------------------------------------
  123623. +//
  123624. +// 0x0600h ~ 0x07FFh WMAC Configuration
  123625. +//
  123626. +//-----------------------------------------------------
  123627. +#define REG_APSD_CTRL 0x0600
  123628. +#define REG_BWOPMODE 0x0603
  123629. +#define REG_TCR 0x0604
  123630. +#define REG_RCR 0x0608
  123631. +#define REG_RX_PKT_LIMIT 0x060C
  123632. +#define REG_RX_DLK_TIME 0x060D
  123633. +#define REG_RX_DRVINFO_SZ 0x060F
  123634. +
  123635. +#define REG_MACID 0x0610
  123636. +#define REG_BSSID 0x0618
  123637. +#define REG_MAR 0x0620
  123638. +#define REG_MBIDCAMCFG 0x0628
  123639. +
  123640. +#define REG_USTIME_EDCA 0x0638
  123641. +#define REG_MAC_SPEC_SIFS 0x063A
  123642. +
  123643. +// 20100719 Joseph: Hardware register definition change. (HW datasheet v54)
  123644. +#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK
  123645. +#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK
  123646. +#define REG_ACKTO 0x0640
  123647. +#define REG_CTS2TO 0x0641
  123648. +#define REG_EIFS 0x0642
  123649. +
  123650. +//WMA, BA, CCX
  123651. +#define REG_NAV_CTRL 0x0650
  123652. +#define REG_BACAMCMD 0x0654
  123653. +#define REG_BACAMCONTENT 0x0658
  123654. +#define REG_LBDLY 0x0660
  123655. +#define REG_FWDLY 0x0661
  123656. +#define REG_RXERR_RPT 0x0664
  123657. +#define REG_WMAC_TRXPTCL_CTL 0x0668
  123658. +
  123659. +
  123660. +// Security
  123661. +#define REG_CAMCMD 0x0670
  123662. +#define REG_CAMWRITE 0x0674
  123663. +#define REG_CAMREAD 0x0678
  123664. +#define REG_CAMDBG 0x067C
  123665. +#define REG_SECCFG 0x0680
  123666. +
  123667. +// Power
  123668. +#define REG_WOW_CTRL 0x0690
  123669. +#define REG_PSSTATUS 0x0691
  123670. +#define REG_PS_RX_INFO 0x0692
  123671. +#define REG_LPNAV_CTRL 0x0694
  123672. +#define REG_WKFMCAM_CMD 0x0698
  123673. +#define REG_WKFMCAM_RWD 0x069C
  123674. +#define REG_RXFLTMAP0 0x06A0
  123675. +#define REG_RXFLTMAP1 0x06A2
  123676. +#define REG_RXFLTMAP2 0x06A4
  123677. +#define REG_BCN_PSR_RPT 0x06A8
  123678. +#define REG_CALB32K_CTRL 0x06AC
  123679. +#define REG_PKT_MON_CTRL 0x06B4
  123680. +#define REG_BT_COEX_TABLE 0x06C0
  123681. +#define REG_WMAC_RESP_TXINFO 0x06D8
  123682. +
  123683. +#define REG_MACID1 0x0700
  123684. +#define REG_BSSID1 0x0708
  123685. +
  123686. +
  123687. +//-----------------------------------------------------
  123688. +//
  123689. +// 0xFE00h ~ 0xFE55h USB Configuration
  123690. +//
  123691. +//-----------------------------------------------------
  123692. +#define REG_USB_INFO 0xFE17
  123693. +#define REG_USB_SPECIAL_OPTION 0xFE55
  123694. +#define REG_USB_DMA_AGG_TO 0xFE5B
  123695. +#define REG_USB_AGG_TO 0xFE5C
  123696. +#define REG_USB_AGG_TH 0xFE5D
  123697. +
  123698. +// For test chip
  123699. +#define REG_TEST_USB_TXQS 0xFE48
  123700. +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61
  123701. +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63
  123702. +#define REG_TEST_SIE_OPTIONAL 0xFE64
  123703. +#define REG_TEST_SIE_CHIRP_K 0xFE65
  123704. +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B
  123705. +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75
  123706. +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9
  123707. +
  123708. +
  123709. +// For normal chip
  123710. +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61
  123711. +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63
  123712. +#define REG_NORMAL_SIE_OPTIONAL 0xFE64
  123713. +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67
  123714. +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B
  123715. +#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C
  123716. +#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only.
  123717. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75
  123718. +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF
  123719. +
  123720. +
  123721. +//-----------------------------------------------------
  123722. +//
  123723. +// Redifine 8192C register definition for compatibility
  123724. +//
  123725. +//-----------------------------------------------------
  123726. +
  123727. +// TODO: use these definition when using REG_xxx naming rule.
  123728. +// NOTE: DO NOT Remove these definition. Use later.
  123729. +
  123730. +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control.
  123731. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable.
  123732. +#define SYS_CLK REG_SYS_CLKR
  123733. +#define CR9346 REG_9346CR // 93C46/93C56 Command Register.
  123734. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control.
  123735. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test.
  123736. +#define MSR (REG_CR + 2) // Media Status register
  123737. +#define ISR REG_HISR
  123738. +#define TSFR REG_TSFTR // Timing Sync Function Timer Register.
  123739. +
  123740. +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053
  123741. +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055
  123742. +
  123743. +#define PBP REG_PBP
  123744. +
  123745. +// Redifine MACID register, to compatible prior ICs.
  123746. +#define IDR0 MACIDR0
  123747. +#define IDR4 MACIDR4
  123748. +
  123749. +
  123750. +//
  123751. +// 9. Security Control Registers (Offset: )
  123752. +//
  123753. +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd
  123754. +#define WCAMI REG_CAMWRITE // Software write CAM input content
  123755. +#define RCAMO REG_CAMREAD // Software read/write CAM config
  123756. +#define CAMDBG REG_CAMDBG
  123757. +#define SECR REG_SECCFG //Security Configuration Register
  123758. +
  123759. +// Unused register
  123760. +#define UnusedRegister 0x1BF
  123761. +#define DCAM UnusedRegister
  123762. +#define PSR UnusedRegister
  123763. +#define BBAddr UnusedRegister
  123764. +#define PhyDataR UnusedRegister
  123765. +
  123766. +#define InvalidBBRFValue 0x12345678
  123767. +
  123768. +// Min Spacing related settings.
  123769. +#define MAX_MSS_DENSITY_2T 0x13
  123770. +#define MAX_MSS_DENSITY_1T 0x0A
  123771. +
  123772. +//----------------------------------------------------------------------------
  123773. +// 8192C Cmd9346CR bits (Offset 0xA, 16bit)
  123774. +//----------------------------------------------------------------------------
  123775. +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1
  123776. +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346
  123777. +#define Cmd9346CR_9356SEL BIT4
  123778. +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL)
  123779. +#define AutoLoadEFUSE CmdEEPROM_En
  123780. +
  123781. +//----------------------------------------------------------------------------
  123782. +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte)
  123783. +//----------------------------------------------------------------------------
  123784. +#define GPIOSEL_GPIO 0
  123785. +#define GPIOSEL_ENBT BIT5
  123786. +
  123787. +//----------------------------------------------------------------------------
  123788. +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte)
  123789. +//----------------------------------------------------------------------------
  123790. +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value
  123791. +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value
  123792. +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured.
  123793. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
  123794. +
  123795. +//----------------------------------------------------------------------------
  123796. +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits)
  123797. +//----------------------------------------------------------------------------
  123798. +/*
  123799. +Network Type
  123800. +00: No link
  123801. +01: Link in ad hoc network
  123802. +10: Link in infrastructure network
  123803. +11: AP mode
  123804. +Default: 00b.
  123805. +*/
  123806. +#define MSR_NOLINK 0x00
  123807. +#define MSR_ADHOC 0x01
  123808. +#define MSR_INFRA 0x02
  123809. +#define MSR_AP 0x03
  123810. +
  123811. +//
  123812. +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF)
  123813. +//
  123814. +//----------------------------------------------------------------------------
  123815. +// 8192C Response Rate Set Register (offset 0x181, 24bits)
  123816. +//----------------------------------------------------------------------------
  123817. +#define RRSR_RSC_OFFSET 21
  123818. +#define RRSR_SHORT_OFFSET 23
  123819. +#define RRSR_RSC_BW_40M 0x600000
  123820. +#define RRSR_RSC_UPSUBCHNL 0x400000
  123821. +#define RRSR_RSC_LOWSUBCHNL 0x200000
  123822. +#define RRSR_SHORT 0x800000
  123823. +#define RRSR_1M BIT0
  123824. +#define RRSR_2M BIT1
  123825. +#define RRSR_5_5M BIT2
  123826. +#define RRSR_11M BIT3
  123827. +#define RRSR_6M BIT4
  123828. +#define RRSR_9M BIT5
  123829. +#define RRSR_12M BIT6
  123830. +#define RRSR_18M BIT7
  123831. +#define RRSR_24M BIT8
  123832. +#define RRSR_36M BIT9
  123833. +#define RRSR_48M BIT10
  123834. +#define RRSR_54M BIT11
  123835. +#define RRSR_MCS0 BIT12
  123836. +#define RRSR_MCS1 BIT13
  123837. +#define RRSR_MCS2 BIT14
  123838. +#define RRSR_MCS3 BIT15
  123839. +#define RRSR_MCS4 BIT16
  123840. +#define RRSR_MCS5 BIT17
  123841. +#define RRSR_MCS6 BIT18
  123842. +#define RRSR_MCS7 BIT19
  123843. +#define BRSR_AckShortPmb BIT23
  123844. +// CCK ACK: use Short Preamble or not
  123845. +
  123846. +
  123847. +//----------------------------------------------------------------------------
  123848. +// 8192C Rate Definition
  123849. +//----------------------------------------------------------------------------
  123850. +//CCK
  123851. +#define RATR_1M 0x00000001
  123852. +#define RATR_2M 0x00000002
  123853. +#define RATR_55M 0x00000004
  123854. +#define RATR_11M 0x00000008
  123855. +//OFDM
  123856. +#define RATR_6M 0x00000010
  123857. +#define RATR_9M 0x00000020
  123858. +#define RATR_12M 0x00000040
  123859. +#define RATR_18M 0x00000080
  123860. +#define RATR_24M 0x00000100
  123861. +#define RATR_36M 0x00000200
  123862. +#define RATR_48M 0x00000400
  123863. +#define RATR_54M 0x00000800
  123864. +//MCS 1 Spatial Stream
  123865. +#define RATR_MCS0 0x00001000
  123866. +#define RATR_MCS1 0x00002000
  123867. +#define RATR_MCS2 0x00004000
  123868. +#define RATR_MCS3 0x00008000
  123869. +#define RATR_MCS4 0x00010000
  123870. +#define RATR_MCS5 0x00020000
  123871. +#define RATR_MCS6 0x00040000
  123872. +#define RATR_MCS7 0x00080000
  123873. +//MCS 2 Spatial Stream
  123874. +#define RATR_MCS8 0x00100000
  123875. +#define RATR_MCS9 0x00200000
  123876. +#define RATR_MCS10 0x00400000
  123877. +#define RATR_MCS11 0x00800000
  123878. +#define RATR_MCS12 0x01000000
  123879. +#define RATR_MCS13 0x02000000
  123880. +#define RATR_MCS14 0x04000000
  123881. +#define RATR_MCS15 0x08000000
  123882. +
  123883. +//----------------------------------------------------------------------------
  123884. +// 8192C BW_OPMODE bits (Offset 0x203, 8bit)
  123885. +//----------------------------------------------------------------------------
  123886. +#define BW_OPMODE_20MHZ BIT2
  123887. +#define BW_OPMODE_5G BIT1
  123888. +#define BW_OPMODE_11J BIT0
  123889. +
  123890. +
  123891. +//----------------------------------------------------------------------------
  123892. +// 8192C CAM Config Setting (offset 0x250, 1 byte)
  123893. +//----------------------------------------------------------------------------
  123894. +#define CAM_VALID BIT15
  123895. +#define CAM_NOTVALID 0x0000
  123896. +#define CAM_USEDK BIT5
  123897. +
  123898. +#define CAM_CONTENT_COUNT 8
  123899. +
  123900. +#define CAM_NONE 0x0
  123901. +#define CAM_WEP40 0x01
  123902. +#define CAM_TKIP 0x02
  123903. +#define CAM_AES 0x04
  123904. +#define CAM_WEP104 0x05
  123905. +
  123906. +#define TOTAL_CAM_ENTRY 32
  123907. +#define HALF_CAM_ENTRY 16
  123908. +
  123909. +#define CAM_CONFIG_USEDK _TRUE
  123910. +#define CAM_CONFIG_NO_USEDK _FALSE
  123911. +
  123912. +#define CAM_WRITE BIT16
  123913. +#define CAM_READ 0x00000000
  123914. +#define CAM_POLLINIG BIT31
  123915. +
  123916. +#define SCR_UseDK 0x01
  123917. +#define SCR_TxSecEnable 0x02
  123918. +#define SCR_RxSecEnable 0x04
  123919. +
  123920. +
  123921. +//
  123922. +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F)
  123923. +//
  123924. +//----------------------------------------------------------------------------
  123925. +// 8190 IMR/ISR bits (offset 0xfd, 8bits)
  123926. +//----------------------------------------------------------------------------
  123927. +#define IMR8190_DISABLED 0x0
  123928. +// IMR DW0 Bit 0-31
  123929. +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6
  123930. +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5
  123931. +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4
  123932. +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3
  123933. +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2
  123934. +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1
  123935. +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8
  123936. +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7
  123937. +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6
  123938. +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5
  123939. +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4
  123940. +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3
  123941. +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2
  123942. +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1
  123943. +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2
  123944. +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1
  123945. +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow
  123946. +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt
  123947. +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0
  123948. +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow
  123949. +#define IMR_RDU BIT11 // Receive Descriptor Unavailable
  123950. +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt
  123951. +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup
  123952. +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt
  123953. +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup
  123954. +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt
  123955. +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt
  123956. +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt
  123957. +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt
  123958. +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt
  123959. +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt
  123960. +#define IMR_ROK BIT0 // Receive DMA OK Interrupt
  123961. +
  123962. +#define IMR_RX_MASK (IMR_ROK|IMR_RDU|IMR_RXFOVW)
  123963. +#define IMR_TX_MASK (IMR_VODOK|IMR_VIDOK|IMR_BEDOK|IMR_BKDOK|IMR_MGNTDOK|IMR_HIGHDOK|IMR_BDOK)
  123964. +
  123965. +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh)
  123966. +#define IMR_BcnInt_E BIT12
  123967. +#define IMR_TXERR BIT11
  123968. +#define IMR_RXERR BIT10
  123969. +#define IMR_C2HCMD BIT9
  123970. +#define IMR_CPWM BIT8
  123971. +//RSVD [2-7]
  123972. +#define IMR_OCPINT BIT1
  123973. +#define IMR_WLANOFF BIT0
  123974. +
  123975. +
  123976. +
  123977. +//----------------------------------------------------------------------------
  123978. +// 8192C EFUSE
  123979. +//----------------------------------------------------------------------------
  123980. +#define HWSET_MAX_SIZE 128
  123981. +
  123982. +
  123983. +//----------------------------------------------------------------------------
  123984. +// 8192C EEPROM/EFUSE share register definition.
  123985. +//----------------------------------------------------------------------------
  123986. +
  123987. +//
  123988. +// Default Value for EEPROM or EFUSE!!!
  123989. +//
  123990. +#define EEPROM_Default_TSSI 0x0
  123991. +#define EEPROM_Default_TxPowerDiff 0x0
  123992. +#define EEPROM_Default_CrystalCap 0x5
  123993. +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68)
  123994. +#define EEPROM_Default_TxPower 0x1010
  123995. +#define EEPROM_Default_HT2T_TxPwr 0x10
  123996. +
  123997. +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3
  123998. +#define EEPROM_Default_ThermalMeter 0x12
  123999. +
  124000. +#define EEPROM_Default_AntTxPowerDiff 0x0
  124001. +#define EEPROM_Default_TxPwDiff_CrystalCap 0x5
  124002. +#define EEPROM_Default_TxPowerLevel 0x22
  124003. +#define EEPROM_Default_HT40_2SDiff 0x0
  124004. +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference
  124005. +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3
  124006. +#define EEPROM_Default_HT40_PwrMaxOffset 0
  124007. +#define EEPROM_Default_HT20_PwrMaxOffset 0
  124008. +
  124009. +// For debug
  124010. +#define EEPROM_Default_PID 0x1234
  124011. +#define EEPROM_Default_VID 0x5678
  124012. +#define EEPROM_Default_CustomerID 0xAB
  124013. +#define EEPROM_Default_SubCustomerID 0xCD
  124014. +#define EEPROM_Default_Version 0
  124015. +
  124016. +#define EEPROM_CHANNEL_PLAN_FCC 0x0
  124017. +#define EEPROM_CHANNEL_PLAN_IC 0x1
  124018. +#define EEPROM_CHANNEL_PLAN_ETSI 0x2
  124019. +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
  124020. +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
  124021. +#define EEPROM_CHANNEL_PLAN_MKK 0x5
  124022. +#define EEPROM_CHANNEL_PLAN_MKK1 0x6
  124023. +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
  124024. +#define EEPROM_CHANNEL_PLAN_TELEC 0x8
  124025. +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
  124026. +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
  124027. +#define EEPROM_CHANNEL_PLAN_NCC 0xB
  124028. +#define EEPROM_USB_OPTIONAL1 0xE
  124029. +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
  124030. +
  124031. +
  124032. +#define EEPROM_CID_DEFAULT 0x0
  124033. +#define EEPROM_CID_TOSHIBA 0x4
  124034. +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25.
  124035. +#define EEPROM_CID_QMI 0x0D
  124036. +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108
  124037. +
  124038. +
  124039. +#define RTL_EEPROM_ID 0x8129
  124040. +
  124041. +
  124042. +#ifdef CONFIG_PCI_HCI
  124043. +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER)
  124044. +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
  124045. +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS)
  124046. +
  124047. +//
  124048. +// Interface type.
  124049. +//
  124050. +typedef enum _INTERFACE_SELECT_8192CPCIe{
  124051. + INTF_SEL0_SOLO_MINICARD = 0, // WiFi solo-mCard
  124052. + INTF_SEL1_BT_COMBO_MINICARD = 1, // WiFi+BT combo-mCard
  124053. + INTF_SEL2_PCIe = 2, // PCIe Card
  124054. +} INTERFACE_SELECT_8192CPCIe, *PINTERFACE_SELECT_8192CPCIe;
  124055. +
  124056. +#define RTL8190_EEPROM_ID 0x8129 // 0-1
  124057. +#define EEPROM_HPON 0x02 // LDO settings.2-5
  124058. +#define EEPROM_CLK 0x06 // Clock settings.6-7
  124059. +#define EEPROM_TESTR 0x08 // SE Test mode.8
  124060. +
  124061. +#define EEPROM_VID 0x0A // SE Vendor ID.A-B
  124062. +#define EEPROM_DID 0x0C // SE Device ID. C-D
  124063. +#define EEPROM_SVID 0x0E // SE Vendor ID.E-F
  124064. +#define EEPROM_SMID 0x10 // SE PCI Subsystem ID. 10-11
  124065. +
  124066. +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17
  124067. +
  124068. +//----------------------------------------------------------------
  124069. +// Ziv - Let PCIe and USB use the same define. Modify address mapping later.
  124070. +#define EEPROM_CCK_TX_PWR_INX 0x5A
  124071. +#define EEPROM_HT40_1S_TX_PWR_INX 0x60
  124072. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66
  124073. +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69
  124074. +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C
  124075. +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F
  124076. +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72
  124077. +
  124078. +#define EEPROM_CHANNEL_PLAN 0x75
  124079. +#define EEPROM_TSSI_A 0x76
  124080. +#define EEPROM_TSSI_B 0x77
  124081. +#define EEPROM_THERMAL_METER 0x78
  124082. +#define EEPROM_RF_OPT1 0x79
  124083. +#define EEPROM_RF_OPT2 0x7A
  124084. +#define EEPROM_RF_OPT3 0x7B
  124085. +#define EEPROM_RF_OPT4 0x7C
  124086. +#define EEPROM_VERSION 0x7E
  124087. +#define EEPROM_CUSTOMER_ID 0x7F
  124088. +
  124089. +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5]
  124090. +
  124091. +#endif
  124092. +
  124093. +#ifdef CONFIG_USB_HCI
  124094. +
  124095. +//should be renamed and moved to another file
  124096. +typedef enum _BOARD_TYPE_8192CUSB{
  124097. + BOARD_USB_DONGLE = 0, // USB dongle
  124098. + BOARD_USB_High_PA = 1, // USB dongle with high power PA
  124099. + BOARD_MINICARD = 2, // Minicard
  124100. + BOARD_USB_SOLO = 3, // USB solo-Slim module
  124101. + BOARD_USB_COMBO = 4, // USB Combo-Slim module
  124102. +} BOARD_TYPE_8192CUSB, *PBOARD_TYPE_8192CUSB;
  124103. +
  124104. +#define SUPPORT_HW_RADIO_DETECT(pHalData) (pHalData->BoardType == BOARD_MINICARD||\
  124105. + pHalData->BoardType == BOARD_USB_SOLO||\
  124106. + pHalData->BoardType == BOARD_USB_COMBO)
  124107. +
  124108. +//---------------------------------------------------------------
  124109. +// EEPROM address for Test chip
  124110. +//---------------------------------------------------------------
  124111. +#define EEPROM_TEST_USB_OPT 0x0E
  124112. +#define EEPROM_TEST_CHIRP_K 0x0F
  124113. +#define EEPROM_TEST_EP_SETTING 0x0E
  124114. +#define EEPROM_TEST_USB_PHY 0x10
  124115. +
  124116. +
  124117. +//---------------------------------------------------------------
  124118. +// EEPROM address for Normal chip
  124119. +//---------------------------------------------------------------
  124120. +#define EEPROM_NORMAL_USB_OPT 0x0E
  124121. +#define EEPROM_NORMAL_CHIRP_K 0x0E // Changed
  124122. +#define EEPROM_NORMAL_EP_SETTING 0x0F // Changed
  124123. +#define EEPROM_NORMAL_USB_PHY 0x12 // Changed
  124124. +
  124125. +
  124126. +// Test chip and normal chip common define
  124127. +//---------------------------------------------------------------
  124128. +// EEPROM address for both
  124129. +//---------------------------------------------------------------
  124130. +#define EEPROM_ID0 0x00
  124131. +#define EEPROM_ID1 0x01
  124132. +#define EEPROM_RTK_RSV1 0x02
  124133. +#define EEPROM_RTK_RSV2 0x03
  124134. +#define EEPROM_RTK_RSV3 0x04
  124135. +#define EEPROM_RTK_RSV4 0x05
  124136. +#define EEPROM_RTK_RSV5 0x06
  124137. +#define EEPROM_DBG_SEL 0x07
  124138. +#define EEPROM_RTK_RSV6 0x08
  124139. +#define EEPROM_VID 0x0A
  124140. +#define EEPROM_PID 0x0C
  124141. +
  124142. +#define EEPROM_MAC_ADDR 0x16
  124143. +#define EEPROM_STRING 0x1C
  124144. +#define EEPROM_SUBCUSTOMER_ID 0x59
  124145. +#define EEPROM_CCK_TX_PWR_INX 0x5A
  124146. +#define EEPROM_HT40_1S_TX_PWR_INX 0x60
  124147. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66
  124148. +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69
  124149. +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C
  124150. +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F
  124151. +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72
  124152. +
  124153. +#define EEPROM_CHANNEL_PLAN 0x75
  124154. +#define EEPROM_TSSI_A 0x76
  124155. +#define EEPROM_TSSI_B 0x77
  124156. +#define EEPROM_THERMAL_METER 0x78
  124157. +#define EEPROM_RF_OPT1 0x79
  124158. +#define EEPROM_RF_OPT2 0x7A
  124159. +#define EEPROM_RF_OPT3 0x7B
  124160. +#define EEPROM_RF_OPT4 0x7C
  124161. +#define EEPROM_VERSION 0x7E
  124162. +#define EEPROM_CUSTOMER_ID 0x7F
  124163. +
  124164. +#define EEPROM_BoardType 0x54 //0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU
  124165. +#define EEPROM_TxPwIndex 0x5C //0x5C-0x76, Tx Power index.
  124166. +#define EEPROM_PwDiff 0x67 // Difference of gain index between legacy and high throughput OFDM.
  124167. +
  124168. +#define EEPROM_TxPowerCCK 0x5A // CCK Tx Power
  124169. +
  124170. +// 2009/02/09 Cosa Add for SD3 requirement
  124171. +#define EEPROM_TX_PWR_HT20_DIFF 0x6e// HT20 Tx Power Index Difference
  124172. +#define DEFAULT_HT20_TXPWR_DIFF 2 // HT20<->40 default Tx Power Index Difference
  124173. +#define EEPROM_TX_PWR_OFDM_DIFF 0x71// OFDM Tx Power Index Difference
  124174. +
  124175. +#define EEPROM_TxPWRGroup 0x73// Power diff for channel group
  124176. +#define EEPROM_Regulatory 0x79// Check if power safety is need
  124177. +
  124178. +#define EEPROM_BLUETOOTH_COEXIST 0x7E // 92cu, 0x7E[4]
  124179. +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5]
  124180. +#define BOARD_TYPE_NORMAL_MASK 0xE0
  124181. +#define BOARD_TYPE_TEST_MASK 0x0F
  124182. +#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle
  124183. +//-------------------------------------------------------------
  124184. +// EEPROM content definitions
  124185. +//-------------------------------------------------------------
  124186. +#define OS_LINK_SPEED BIT(5)
  124187. +
  124188. +#define BOARD_TYPE_MASK 0xF
  124189. +
  124190. +#define BT_COEXISTENCE BIT(4)
  124191. +#define BT_CO_SHIFT 4
  124192. +
  124193. +#define EP_NUMBER_MASK 0x30 //bit 4:5 0Eh
  124194. +#define EP_NUMBER_SHIFT 4
  124195. +
  124196. +
  124197. +#define USB_PHY_PARA_SIZE 5
  124198. +
  124199. +
  124200. +//-------------------------------------------------------------
  124201. +// EEPROM default value definitions
  124202. +//-------------------------------------------------------------
  124203. +// Use 0xABCD instead of 0x8192 for debug
  124204. +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00
  124205. +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01
  124206. +
  124207. +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03
  124208. +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04
  124209. +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08
  124210. +
  124211. +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A
  124212. +#define EEPROM_DEF_VID_1 0x0B
  124213. +
  124214. +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C
  124215. +#define EEPROM_DEF_PID_1 0x81
  124216. +
  124217. +
  124218. +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E
  124219. +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E
  124220. +
  124221. +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F
  124222. +
  124223. +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10
  124224. +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11
  124225. +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12
  124226. +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13
  124227. +
  124228. +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78
  124229. +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79
  124230. +
  124231. +
  124232. +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A
  124233. +
  124234. +#define RF_OPTION1 0x79// Check if power safety spec is need
  124235. +#define RF_OPTION2 0x7A
  124236. +#define RF_OPTION3 0x7B
  124237. +#define RF_OPTION4 0x7C
  124238. +
  124239. +
  124240. +#define EEPROM_USB_SN BIT(0)
  124241. +#define EEPROM_USB_REMOTE_WAKEUP BIT(1)
  124242. +#define EEPROM_USB_DEVICE_PWR BIT(2)
  124243. +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4))
  124244. +
  124245. +#if 0
  124246. +#define EEPROM_CHANNEL_PLAN_FCC 0x0
  124247. +#define EEPROM_CHANNEL_PLAN_IC 0x1
  124248. +#define EEPROM_CHANNEL_PLAN_ETSI 0x2
  124249. +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
  124250. +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
  124251. +#define EEPROM_CHANNEL_PLAN_MKK 0x5
  124252. +#define EEPROM_CHANNEL_PLAN_MKK1 0x6
  124253. +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
  124254. +#define EEPROM_CHANNEL_PLAN_TELEC 0x8
  124255. +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
  124256. +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
  124257. +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
  124258. +
  124259. +#define EEPROM_CID_DEFAULT 0x0
  124260. +
  124261. +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108
  124262. +
  124263. +
  124264. +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25.
  124265. +#endif
  124266. +
  124267. +#endif
  124268. +
  124269. +
  124270. +/*===================================================================
  124271. +=====================================================================
  124272. +Here the register defines are for 92C. When the define is as same with 92C,
  124273. +we will use the 92C's define for the consistency
  124274. +So the following defines for 92C is not entire!!!!!!
  124275. +=====================================================================
  124276. +=====================================================================*/
  124277. +/*
  124278. +Based on Datasheet V33---090401
  124279. +Register Summary
  124280. +Current IOREG MAP
  124281. +0x0000h ~ 0x00FFh System Configuration (256 Bytes)
  124282. +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes)
  124283. +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes)
  124284. +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes)
  124285. +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes)
  124286. +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes)
  124287. +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes)
  124288. +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes)
  124289. +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes)
  124290. +*/
  124291. +
  124292. +//----------------------------------------------------------------------------
  124293. +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits)
  124294. +//----------------------------------------------------------------------------
  124295. +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload
  124296. +#define RCR_APP_MIC BIT30 //
  124297. +#define RCR_APP_PHYSTS BIT28//
  124298. +#define RCR_APP_ICV BIT29 //
  124299. +#define RCR_APP_PHYST_RXFF BIT28 //
  124300. +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN
  124301. +#define RCR_ENMBID BIT24 //Enable Multiple BssId.
  124302. +#define RCR_LSIGEN BIT23
  124303. +#define RCR_MFBEN BIT22
  124304. +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0
  124305. +#define RCR_AMF BIT13 //Accept management type frame
  124306. +#define RCR_ACF BIT12 //Accept control type frame
  124307. +#define RCR_ADF BIT11 //Accept data type frame
  124308. +#define RCR_AICV BIT9 //Accept ICV error packet
  124309. +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet
  124310. +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp)
  124311. +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data)
  124312. +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet
  124313. +#define RCR_APWRMGT BIT5 //Accept power management packet
  124314. +#define RCR_ADD3 BIT4 //Accept address 3 match packet
  124315. +#define RCR_AB BIT3 //Accept broadcast packet
  124316. +#define RCR_AM BIT2 //Accept multicast packet
  124317. +#define RCR_APM BIT1 //Accept physical match packet
  124318. +#define RCR_AAP BIT0 //Accept all unicast packet
  124319. +#define RCR_MXDMA_OFFSET 8
  124320. +#define RCR_FIFO_OFFSET 13
  124321. +
  124322. +
  124323. +
  124324. +//============================================================================
  124325. +// 8192c USB specific Regsiter Offset and Content definition,
  124326. +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver
  124327. +//============================================================================
  124328. +//#define APS_FSMCO 0x0004 same with 92Ce
  124329. +#define RSV_CTRL 0x001C
  124330. +#define RD_CTRL 0x0524
  124331. +
  124332. +//-----------------------------------------------------
  124333. +//
  124334. +// 0xFE00h ~ 0xFE55h USB Configuration
  124335. +//
  124336. +//-----------------------------------------------------
  124337. +#define REG_USB_INFO 0xFE17
  124338. +#define REG_USB_SPECIAL_OPTION 0xFE55
  124339. +#define REG_USB_DMA_AGG_TO 0xFE5B
  124340. +#define REG_USB_AGG_TO 0xFE5C
  124341. +#define REG_USB_AGG_TH 0xFE5D
  124342. +
  124343. +#define REG_USB_VID 0xFE60
  124344. +#define REG_USB_PID 0xFE62
  124345. +#define REG_USB_OPTIONAL 0xFE64
  124346. +#define REG_USB_CHIRP_K 0xFE65
  124347. +#define REG_USB_PHY 0xFE66
  124348. +#define REG_USB_MAC_ADDR 0xFE70
  124349. +
  124350. +#define REG_USB_HRPWM 0xFE58
  124351. +#define REG_USB_HCPWM 0xFE57
  124352. +
  124353. +#define InvalidBBRFValue 0x12345678
  124354. +
  124355. +//============================================================================
  124356. +// 8192C Regsiter Bit and Content definition
  124357. +//============================================================================
  124358. +//-----------------------------------------------------
  124359. +//
  124360. +// 0x0000h ~ 0x00FFh System Configuration
  124361. +//
  124362. +//-----------------------------------------------------
  124363. +
  124364. +//2 SPS0_CTRL
  124365. +#define SW18_FPWM BIT(3)
  124366. +
  124367. +
  124368. +//2 SYS_ISO_CTRL
  124369. +#define ISO_MD2PP BIT(0)
  124370. +#define ISO_UA2USB BIT(1)
  124371. +#define ISO_UD2CORE BIT(2)
  124372. +#define ISO_PA2PCIE BIT(3)
  124373. +#define ISO_PD2CORE BIT(4)
  124374. +#define ISO_IP2MAC BIT(5)
  124375. +#define ISO_DIOP BIT(6)
  124376. +#define ISO_DIOE BIT(7)
  124377. +#define ISO_EB2CORE BIT(8)
  124378. +#define ISO_DIOR BIT(9)
  124379. +
  124380. +#define PWC_EV25V BIT(14)
  124381. +#define PWC_EV12V BIT(15)
  124382. +
  124383. +
  124384. +//2 SYS_FUNC_EN
  124385. +#define FEN_BBRSTB BIT(0)
  124386. +#define FEN_BB_GLB_RSTn BIT(1)
  124387. +#define FEN_USBA BIT(2)
  124388. +#define FEN_UPLL BIT(3)
  124389. +#define FEN_USBD BIT(4)
  124390. +#define FEN_DIO_PCIE BIT(5)
  124391. +#define FEN_PCIEA BIT(6)
  124392. +#define FEN_PPLL BIT(7)
  124393. +#define FEN_PCIED BIT(8)
  124394. +#define FEN_DIOE BIT(9)
  124395. +#define FEN_CPUEN BIT(10)
  124396. +#define FEN_DCORE BIT(11)
  124397. +#define FEN_ELDR BIT(12)
  124398. +#define FEN_DIO_RF BIT(13)
  124399. +#define FEN_HWPDN BIT(14)
  124400. +#define FEN_MREGEN BIT(15)
  124401. +
  124402. +//2 APS_FSMCO
  124403. +#define PFM_LDALL BIT(0)
  124404. +#define PFM_ALDN BIT(1)
  124405. +#define PFM_LDKP BIT(2)
  124406. +#define PFM_WOWL BIT(3)
  124407. +#define EnPDN BIT(4)
  124408. +#define PDN_PL BIT(5)
  124409. +#define APFM_ONMAC BIT(8)
  124410. +#define APFM_OFF BIT(9)
  124411. +#define APFM_RSM BIT(10)
  124412. +#define AFSM_HSUS BIT(11)
  124413. +#define AFSM_PCIE BIT(12)
  124414. +#define APDM_MAC BIT(13)
  124415. +#define APDM_HOST BIT(14)
  124416. +#define APDM_HPDN BIT(15)
  124417. +#define RDY_MACON BIT(16)
  124418. +#define SUS_HOST BIT(17)
  124419. +#define ROP_ALD BIT(20)
  124420. +#define ROP_PWR BIT(21)
  124421. +#define ROP_SPS BIT(22)
  124422. +#define SOP_MRST BIT(25)
  124423. +#define SOP_FUSE BIT(26)
  124424. +#define SOP_ABG BIT(27)
  124425. +#define SOP_AMB BIT(28)
  124426. +#define SOP_RCK BIT(29)
  124427. +#define SOP_A8M BIT(30)
  124428. +#define XOP_BTCK BIT(31)
  124429. +
  124430. +//2 SYS_CLKR
  124431. +#define ANAD16V_EN BIT(0)
  124432. +#define ANA8M BIT(1)
  124433. +#define MACSLP BIT(4)
  124434. +#define LOADER_CLK_EN BIT(5)
  124435. +#define _80M_SSC_DIS BIT(7)
  124436. +#define _80M_SSC_EN_HO BIT(8)
  124437. +#define PHY_SSC_RSTB BIT(9)
  124438. +#define SEC_CLK_EN BIT(10)
  124439. +#define MAC_CLK_EN BIT(11)
  124440. +#define SYS_CLK_EN BIT(12)
  124441. +#define RING_CLK_EN BIT(13)
  124442. +
  124443. +
  124444. +//2 9346CR
  124445. +
  124446. +
  124447. +#define EEDO BIT(0)
  124448. +#define EEDI BIT(1)
  124449. +#define EESK BIT(2)
  124450. +#define EECS BIT(3)
  124451. +//#define EERPROMSEL BIT(4)
  124452. +//#define EEPROM_EN BIT(5)
  124453. +#define BOOT_FROM_EEPROM BIT(4)
  124454. +#define EEPROM_EN BIT(5)
  124455. +#define EEM0 BIT(6)
  124456. +#define EEM1 BIT(7)
  124457. +
  124458. +
  124459. +//2 AFE_MISC
  124460. +#define AFE_BGEN BIT(0)
  124461. +#define AFE_MBEN BIT(1)
  124462. +#define MAC_ID_EN BIT(7)
  124463. +
  124464. +
  124465. +//2 SPS0_CTRL
  124466. +
  124467. +
  124468. +//2 SPS_OCP_CFG
  124469. +
  124470. +
  124471. +//2 RSV_CTRL
  124472. +#define WLOCK_ALL BIT(0)
  124473. +#define WLOCK_00 BIT(1)
  124474. +#define WLOCK_04 BIT(2)
  124475. +#define WLOCK_08 BIT(3)
  124476. +#define WLOCK_40 BIT(4)
  124477. +#define R_DIS_PRST_0 BIT(5)
  124478. +#define R_DIS_PRST_1 BIT(6)
  124479. +#define LOCK_ALL_EN BIT(7)
  124480. +
  124481. +//2 RF_CTRL
  124482. +#define RF_EN BIT(0)
  124483. +#define RF_RSTB BIT(1)
  124484. +#define RF_SDMRSTB BIT(2)
  124485. +
  124486. +
  124487. +
  124488. +//2 LDOA15_CTRL
  124489. +#define LDA15_EN BIT(0)
  124490. +#define LDA15_STBY BIT(1)
  124491. +#define LDA15_OBUF BIT(2)
  124492. +#define LDA15_REG_VOS BIT(3)
  124493. +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
  124494. +
  124495. +
  124496. +
  124497. +//2 LDOV12D_CTRL
  124498. +#define LDV12_EN BIT(0)
  124499. +#define LDV12_SDBY BIT(1)
  124500. +#define LPLDO_HSM BIT(2)
  124501. +#define LPLDO_LSM_DIS BIT(3)
  124502. +#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
  124503. +
  124504. +
  124505. +//2 AFE_XTAL_CTRL
  124506. +#define XTAL_EN BIT(0)
  124507. +#define XTAL_BSEL BIT(1)
  124508. +#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
  124509. +#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
  124510. +#define XTAL_GATE_USB BIT(8)
  124511. +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9)
  124512. +#define XTAL_GATE_AFE BIT(11)
  124513. +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12)
  124514. +#define XTAL_RF_GATE BIT(14)
  124515. +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15)
  124516. +#define XTAL_GATE_DIG BIT(17)
  124517. +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18)
  124518. +#define XTAL_BT_GATE BIT(20)
  124519. +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
  124520. +#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
  124521. +
  124522. +
  124523. +#define CKDLY_AFE BIT(26)
  124524. +#define CKDLY_USB BIT(27)
  124525. +#define CKDLY_DIG BIT(28)
  124526. +#define CKDLY_BT BIT(29)
  124527. +
  124528. +
  124529. +//2 AFE_PLL_CTRL
  124530. +#define APLL_EN BIT(0)
  124531. +#define APLL_320_EN BIT(1)
  124532. +#define APLL_FREF_SEL BIT(2)
  124533. +#define APLL_EDGE_SEL BIT(3)
  124534. +#define APLL_WDOGB BIT(4)
  124535. +#define APLL_LPFEN BIT(5)
  124536. +
  124537. +#define APLL_REF_CLK_13MHZ 0x1
  124538. +#define APLL_REF_CLK_19_2MHZ 0x2
  124539. +#define APLL_REF_CLK_20MHZ 0x3
  124540. +#define APLL_REF_CLK_25MHZ 0x4
  124541. +#define APLL_REF_CLK_26MHZ 0x5
  124542. +#define APLL_REF_CLK_38_4MHZ 0x6
  124543. +#define APLL_REF_CLK_40MHZ 0x7
  124544. +
  124545. +#define APLL_320EN BIT(14)
  124546. +#define APLL_80EN BIT(15)
  124547. +#define APLL_1MEN BIT(24)
  124548. +
  124549. +
  124550. +//2 EFUSE_CTRL
  124551. +#define ALD_EN BIT(18)
  124552. +#define EF_PD BIT(19)
  124553. +#define EF_FLAG BIT(31)
  124554. +
  124555. +//2 EFUSE_TEST (For RTL8723 partially)
  124556. +#define EF_TRPT BIT(7)
  124557. +#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2
  124558. +#define LDOE25_EN BIT(31)
  124559. +#define EFUSE_SEL(x) (((x) & 0x3) << 8)
  124560. +#define EFUSE_SEL_MASK 0x300
  124561. +#define EFUSE_WIFI_SEL_0 0x0
  124562. +#define EFUSE_BT_SEL_0 0x1
  124563. +#define EFUSE_BT_SEL_1 0x2
  124564. +#define EFUSE_BT_SEL_2 0x3
  124565. +
  124566. +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only.
  124567. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only.
  124568. +
  124569. +//2 PWR_DATA
  124570. +
  124571. +//2 CAL_TIMER
  124572. +
  124573. +//2 ACLK_MON
  124574. +#define RSM_EN BIT(0)
  124575. +#define Timer_EN BIT(4)
  124576. +
  124577. +
  124578. +//2 GPIO_MUXCFG
  124579. +#define TRSW0EN BIT(2)
  124580. +#define TRSW1EN BIT(3)
  124581. +#define EROM_EN BIT(4)
  124582. +#define EnBT BIT(5)
  124583. +#define EnUart BIT(8)
  124584. +#define Uart_910 BIT(9)
  124585. +#define EnPMAC BIT(10)
  124586. +#define SIC_SWRST BIT(11)
  124587. +#define EnSIC BIT(12)
  124588. +#define SIC_23 BIT(13)
  124589. +#define EnHDP BIT(14)
  124590. +#define SIC_LBK BIT(15)
  124591. +
  124592. +//2 GPIO_PIN_CTRL
  124593. +
  124594. +// GPIO BIT
  124595. +#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
  124596. +
  124597. +//2 GPIO_INTM
  124598. +
  124599. +//2 LEDCFG
  124600. +#define LED0PL BIT(4)
  124601. +#define LED0DIS BIT(7)
  124602. +#define LED1DIS BIT(15)
  124603. +#define LED1PL BIT(12)
  124604. +
  124605. +#define SECCAM_CLR BIT(30)
  124606. +
  124607. +
  124608. +//2 FSIMR
  124609. +
  124610. +//2 FSISR
  124611. +
  124612. +
  124613. +//2 8051FWDL
  124614. +//2 MCUFWDL
  124615. +#define MCUFWDL_EN BIT(0)
  124616. +#define MCUFWDL_RDY BIT(1)
  124617. +#define FWDL_ChkSum_rpt BIT(2)
  124618. +#define MACINI_RDY BIT(3)
  124619. +#define BBINI_RDY BIT(4)
  124620. +#define RFINI_RDY BIT(5)
  124621. +#define WINTINI_RDY BIT(6)
  124622. +#define CPRST BIT(23)
  124623. +
  124624. +//2REG_HPON_FSM
  124625. +#define BOND92CE_1T2R_CFG BIT(22)
  124626. +
  124627. +
  124628. +//2 REG_SYS_CFG
  124629. +#define XCLK_VLD BIT(0)
  124630. +#define ACLK_VLD BIT(1)
  124631. +#define UCLK_VLD BIT(2)
  124632. +#define PCLK_VLD BIT(3)
  124633. +#define PCIRSTB BIT(4)
  124634. +#define V15_VLD BIT(5)
  124635. +#define TRP_B15V_EN BIT(7)
  124636. +#define SIC_IDLE BIT(8)
  124637. +#define BD_MAC2 BIT(9)
  124638. +#define BD_MAC1 BIT(10)
  124639. +#define IC_MACPHY_MODE BIT(11)
  124640. +#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15))
  124641. +#define BT_FUNC BIT(16)
  124642. +#define VENDOR_ID BIT(19)
  124643. +#define PAD_HWPD_IDN BIT(22)
  124644. +#define TRP_VAUX_EN BIT(23)
  124645. +#define TRP_BT_EN BIT(24)
  124646. +#define BD_PKG_SEL BIT(25)
  124647. +#define BD_HCI_SEL BIT(26)
  124648. +#define TYPE_ID BIT(27)
  124649. +
  124650. +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15
  124651. +#define CHIP_VER_RTL_SHIFT 12
  124652. +
  124653. +//2REG_GPIO_OUTSTS (For RTL8723 only)
  124654. +#define EFS_HCI_SEL (BIT(0)|BIT(1))
  124655. +#define PAD_HCI_SEL (BIT(2)|BIT(3))
  124656. +#define HCI_SEL (BIT(4)|BIT(5))
  124657. +#define PKG_SEL_HCI BIT(6)
  124658. +#define FEN_GPS BIT(7)
  124659. +#define FEN_BT BIT(8)
  124660. +#define FEN_WL BIT(9)
  124661. +#define FEN_PCI BIT(10)
  124662. +#define FEN_USB BIT(11)
  124663. +#define BTRF_HWPDN_N BIT(12)
  124664. +#define WLRF_HWPDN_N BIT(13)
  124665. +#define PDN_BT_N BIT(14)
  124666. +#define PDN_GPS_N BIT(15)
  124667. +#define BT_CTL_HWPDN BIT(16)
  124668. +#define GPS_CTL_HWPDN BIT(17)
  124669. +#define PPHY_SUSB BIT(20)
  124670. +#define UPHY_SUSB BIT(21)
  124671. +#define PCI_SUSEN BIT(22)
  124672. +#define USB_SUSEN BIT(23)
  124673. +#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28))
  124674. +
  124675. +//-----------------------------------------------------
  124676. +//
  124677. +// 0x0100h ~ 0x01FFh MACTOP General Configuration
  124678. +//
  124679. +//-----------------------------------------------------
  124680. +
  124681. +
  124682. +//2 Function Enable Registers
  124683. +//2 CR
  124684. +
  124685. +#define REG_LBMODE (REG_CR + 3)
  124686. +
  124687. +
  124688. +#define HCI_TXDMA_EN BIT(0)
  124689. +#define HCI_RXDMA_EN BIT(1)
  124690. +#define TXDMA_EN BIT(2)
  124691. +#define RXDMA_EN BIT(3)
  124692. +#define PROTOCOL_EN BIT(4)
  124693. +#define SCHEDULE_EN BIT(5)
  124694. +#define MACTXEN BIT(6)
  124695. +#define MACRXEN BIT(7)
  124696. +#define ENSWBCN BIT(8)
  124697. +#define ENSEC BIT(9)
  124698. +
  124699. +// Network type
  124700. +#define _NETTYPE(x) (((x) & 0x3) << 16)
  124701. +#define MASK_NETTYPE 0x30000
  124702. +#define NT_NO_LINK 0x0
  124703. +#define NT_LINK_AD_HOC 0x1
  124704. +#define NT_LINK_AP 0x2
  124705. +#define NT_AS_AP 0x3
  124706. +
  124707. +#define _LBMODE(x) (((x) & 0xF) << 24)
  124708. +#define MASK_LBMODE 0xF000000
  124709. +#define LOOPBACK_NORMAL 0x0
  124710. +#define LOOPBACK_IMMEDIATELY 0xB
  124711. +#define LOOPBACK_MAC_DELAY 0x3
  124712. +#define LOOPBACK_PHY 0x1
  124713. +#define LOOPBACK_DMA 0x7
  124714. +
  124715. +
  124716. +//2 PBP - Page Size Register
  124717. +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
  124718. +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
  124719. +#define _PSRX_MASK 0xF
  124720. +#define _PSTX_MASK 0xF0
  124721. +#define _PSRX(x) (x)
  124722. +#define _PSTX(x) ((x) << 4)
  124723. +
  124724. +#define PBP_64 0x0
  124725. +#define PBP_128 0x1
  124726. +#define PBP_256 0x2
  124727. +#define PBP_512 0x3
  124728. +#define PBP_1024 0x4
  124729. +
  124730. +
  124731. +//2 TX/RXDMA
  124732. +#define RXDMA_ARBBW_EN BIT(0)
  124733. +#define RXSHFT_EN BIT(1)
  124734. +#define RXDMA_AGG_EN BIT(2)
  124735. +#define QS_VO_QUEUE BIT(8)
  124736. +#define QS_VI_QUEUE BIT(9)
  124737. +#define QS_BE_QUEUE BIT(10)
  124738. +#define QS_BK_QUEUE BIT(11)
  124739. +#define QS_MANAGER_QUEUE BIT(12)
  124740. +#define QS_HIGH_QUEUE BIT(13)
  124741. +
  124742. +#define HQSEL_VOQ BIT(0)
  124743. +#define HQSEL_VIQ BIT(1)
  124744. +#define HQSEL_BEQ BIT(2)
  124745. +#define HQSEL_BKQ BIT(3)
  124746. +#define HQSEL_MGTQ BIT(4)
  124747. +#define HQSEL_HIQ BIT(5)
  124748. +
  124749. +// For normal driver, 0x10C
  124750. +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
  124751. +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
  124752. +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10)
  124753. +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 )
  124754. +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 )
  124755. +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 )
  124756. +
  124757. +#define QUEUE_LOW 1
  124758. +#define QUEUE_NORMAL 2
  124759. +#define QUEUE_HIGH 3
  124760. +
  124761. +
  124762. +
  124763. +//2 TRXFF_BNDY
  124764. +
  124765. +
  124766. +//2 LLT_INIT
  124767. +#define _LLT_NO_ACTIVE 0x0
  124768. +#define _LLT_WRITE_ACCESS 0x1
  124769. +#define _LLT_READ_ACCESS 0x2
  124770. +
  124771. +#define _LLT_INIT_DATA(x) ((x) & 0xFF)
  124772. +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
  124773. +#define _LLT_OP(x) (((x) & 0x3) << 30)
  124774. +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
  124775. +
  124776. +
  124777. +//2 BB_ACCESS_CTRL
  124778. +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
  124779. +#define BB_WRITE_EN BIT(30)
  124780. +#define BB_READ_EN BIT(31)
  124781. +//#define BB_ADDR_MASK 0xFFF
  124782. +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK)
  124783. +
  124784. +//-----------------------------------------------------
  124785. +//
  124786. +// 0x0200h ~ 0x027Fh TXDMA Configuration
  124787. +//
  124788. +//-----------------------------------------------------
  124789. +//2 RQPN
  124790. +#define _HPQ(x) ((x) & 0xFF)
  124791. +#define _LPQ(x) (((x) & 0xFF) << 8)
  124792. +#define _PUBQ(x) (((x) & 0xFF) << 16)
  124793. +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register
  124794. +
  124795. +
  124796. +#define HPQ_PUBLIC_DIS BIT(24)
  124797. +#define LPQ_PUBLIC_DIS BIT(25)
  124798. +#define LD_RQPN BIT(31)
  124799. +
  124800. +
  124801. +//2 TDECTRL
  124802. +#define BCN_VALID BIT(16)
  124803. +#define BCN_HEAD(x) (((x) & 0xFF) << 8)
  124804. +#define BCN_HEAD_MASK 0xFF00
  124805. +
  124806. +//2 TDECTL
  124807. +#define BLK_DESC_NUM_SHIFT 4
  124808. +#define BLK_DESC_NUM_MASK 0xF
  124809. +
  124810. +
  124811. +//2 TXDMA_OFFSET_CHK
  124812. +#define DROP_DATA_EN BIT(9)
  124813. +
  124814. +//-----------------------------------------------------
  124815. +//
  124816. +// 0x0400h ~ 0x047Fh Protocol Configuration
  124817. +//
  124818. +//-----------------------------------------------------
  124819. +//2 FWHW_TXQ_CTRL
  124820. +#define EN_AMPDU_RTY_NEW BIT(7)
  124821. +
  124822. +//2 INIRTSMCS_SEL
  124823. +#define _INIRTSMCS_SEL(x) ((x) & 0x3F)
  124824. +
  124825. +
  124826. +//2 SPEC SIFS
  124827. +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF)
  124828. +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8)
  124829. +
  124830. +
  124831. +//2 RRSR
  124832. +
  124833. +#define RATE_REG_BITMAP_ALL 0xFFFFF
  124834. +
  124835. +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF)
  124836. +
  124837. +#define _RRSR_RSC(x) (((x) & 0x3) << 21)
  124838. +#define RRSR_RSC_RESERVED 0x0
  124839. +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
  124840. +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
  124841. +#define RRSR_RSC_DUPLICATE_MODE 0x3
  124842. +
  124843. +
  124844. +//2 ARFR
  124845. +#define USE_SHORT_G1 BIT(20)
  124846. +
  124847. +//2 AGGLEN_LMT_L
  124848. +#define _AGGLMT_MCS0(x) ((x) & 0xF)
  124849. +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4)
  124850. +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8)
  124851. +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12)
  124852. +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16)
  124853. +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20)
  124854. +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
  124855. +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
  124856. +
  124857. +
  124858. +//2 RL
  124859. +#define RETRY_LIMIT_SHORT_SHIFT 8
  124860. +#define RETRY_LIMIT_LONG_SHIFT 0
  124861. +
  124862. +
  124863. +//2 DARFRC
  124864. +#define _DARF_RC1(x) ((x) & 0x1F)
  124865. +#define _DARF_RC2(x) (((x) & 0x1F) << 8)
  124866. +#define _DARF_RC3(x) (((x) & 0x1F) << 16)
  124867. +#define _DARF_RC4(x) (((x) & 0x1F) << 24)
  124868. +// NOTE: shift starting from address (DARFRC + 4)
  124869. +#define _DARF_RC5(x) ((x) & 0x1F)
  124870. +#define _DARF_RC6(x) (((x) & 0x1F) << 8)
  124871. +#define _DARF_RC7(x) (((x) & 0x1F) << 16)
  124872. +#define _DARF_RC8(x) (((x) & 0x1F) << 24)
  124873. +
  124874. +
  124875. +//2 RARFRC
  124876. +#define _RARF_RC1(x) ((x) & 0x1F)
  124877. +#define _RARF_RC2(x) (((x) & 0x1F) << 8)
  124878. +#define _RARF_RC3(x) (((x) & 0x1F) << 16)
  124879. +#define _RARF_RC4(x) (((x) & 0x1F) << 24)
  124880. +// NOTE: shift starting from address (RARFRC + 4)
  124881. +#define _RARF_RC5(x) ((x) & 0x1F)
  124882. +#define _RARF_RC6(x) (((x) & 0x1F) << 8)
  124883. +#define _RARF_RC7(x) (((x) & 0x1F) << 16)
  124884. +#define _RARF_RC8(x) (((x) & 0x1F) << 24)
  124885. +
  124886. +
  124887. +
  124888. +
  124889. +//-----------------------------------------------------
  124890. +//
  124891. +// 0x0500h ~ 0x05FFh EDCA Configuration
  124892. +//
  124893. +//-----------------------------------------------------
  124894. +
  124895. +
  124896. +
  124897. +//2 EDCA setting
  124898. +#define AC_PARAM_TXOP_LIMIT_OFFSET 16
  124899. +#define AC_PARAM_ECW_MAX_OFFSET 12
  124900. +#define AC_PARAM_ECW_MIN_OFFSET 8
  124901. +#define AC_PARAM_AIFS_OFFSET 0
  124902. +
  124903. +
  124904. +//2 EDCA_VO_PARAM
  124905. +#define _AIFS(x) (x)
  124906. +#define _ECW_MAX_MIN(x) ((x) << 8)
  124907. +#define _TXOP_LIMIT(x) ((x) << 16)
  124908. +
  124909. +
  124910. +#define _BCNIFS(x) ((x) & 0xFF)
  124911. +#define _BCNECW(x) (((x) & 0xF))<< 8)
  124912. +
  124913. +
  124914. +#define _LRL(x) ((x) & 0x3F)
  124915. +#define _SRL(x) (((x) & 0x3F) << 8)
  124916. +
  124917. +
  124918. +//2 SIFS_CCK
  124919. +#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
  124920. +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8);
  124921. +
  124922. +
  124923. +//2 SIFS_OFDM
  124924. +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
  124925. +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8);
  124926. +
  124927. +
  124928. +//2 TBTT PROHIBIT
  124929. +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
  124930. +
  124931. +
  124932. +//2 REG_RD_CTRL
  124933. +#define DIS_EDCA_CNT_DWN BIT(11)
  124934. +
  124935. +
  124936. +//2 BCN_CTRL
  124937. +#define EN_MBSSID BIT(1)
  124938. +#define EN_TXBCN_RPT BIT(2)
  124939. +#define EN_BCN_FUNCTION BIT(3)
  124940. +// The same function but different bit field.
  124941. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
  124942. +#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
  124943. +
  124944. +//2 ACMHWCTRL
  124945. +#define AcmHw_HwEn BIT(0)
  124946. +#define AcmHw_BeqEn BIT(1)
  124947. +#define AcmHw_ViqEn BIT(2)
  124948. +#define AcmHw_VoqEn BIT(3)
  124949. +#define AcmHw_BeqStatus BIT(4)
  124950. +#define AcmHw_ViqStatus BIT(5)
  124951. +#define AcmHw_VoqStatus BIT(6)
  124952. +
  124953. +
  124954. +
  124955. +//-----------------------------------------------------
  124956. +//
  124957. +// 0x0600h ~ 0x07FFh WMAC Configuration
  124958. +//
  124959. +//-----------------------------------------------------
  124960. +
  124961. +//2 APSD_CTRL
  124962. +#define APSDOFF BIT(6)
  124963. +#define APSDOFF_STATUS BIT(7)
  124964. +
  124965. +
  124966. +//2 BWOPMODE
  124967. +#define BW_20MHZ BIT(2)
  124968. +//#define BW_OPMODE_20MHZ BIT(2) // For compability
  124969. +
  124970. +
  124971. +#define RATE_BITMAP_ALL 0xFFFFF
  124972. +
  124973. +// Only use CCK 1M rate for ACK
  124974. +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
  124975. +
  124976. +//2 TCR
  124977. +#define TSFRST BIT(0)
  124978. +#define DIS_GCLK BIT(1)
  124979. +#define PAD_SEL BIT(2)
  124980. +#define PWR_ST BIT(6)
  124981. +#define PWRBIT_OW_EN BIT(7)
  124982. +#define ACRC BIT(8)
  124983. +#define CFENDFORM BIT(9)
  124984. +#define ICV BIT(10)
  124985. +
  124986. +
  124987. +
  124988. +//2 RCR
  124989. +#define AAP BIT(0)
  124990. +#define APM BIT(1)
  124991. +#define AM BIT(2)
  124992. +#define AB BIT(3)
  124993. +#define ADD3 BIT(4)
  124994. +#define APWRMGT BIT(5)
  124995. +#define CBSSID BIT(6)
  124996. +#define CBSSID_BCN BIT(7)
  124997. +#define ACRC32 BIT(8)
  124998. +#define AICV BIT(9)
  124999. +#define ADF BIT(11)
  125000. +#define ACF BIT(12)
  125001. +#define AMF BIT(13)
  125002. +#define HTC_LOC_CTRL BIT(14)
  125003. +#define UC_DATA_EN BIT(16)
  125004. +#define BM_DATA_EN BIT(17)
  125005. +#define MFBEN BIT(22)
  125006. +#define LSIGEN BIT(23)
  125007. +#define EnMBID BIT(24)
  125008. +#define APP_BASSN BIT(27)
  125009. +#define APP_PHYSTS BIT(28)
  125010. +#define APP_ICV BIT(29)
  125011. +#define APP_MIC BIT(30)
  125012. +#define APP_FCS BIT(31)
  125013. +
  125014. +//2 RX_PKT_LIMIT
  125015. +
  125016. +//2 RX_DLK_TIME
  125017. +
  125018. +//2 MBIDCAMCFG
  125019. +
  125020. +
  125021. +
  125022. +//2 AMPDU_MIN_SPACE
  125023. +#define _MIN_SPACE(x) ((x) & 0x7)
  125024. +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
  125025. +
  125026. +
  125027. +//2 RXERR_RPT
  125028. +#define RXERR_TYPE_OFDM_PPDU 0
  125029. +#define RXERR_TYPE_OFDM_FALSE_ALARM 1
  125030. +#define RXERR_TYPE_OFDM_MPDU_OK 2
  125031. +#define RXERR_TYPE_OFDM_MPDU_FAIL 3
  125032. +#define RXERR_TYPE_CCK_PPDU 4
  125033. +#define RXERR_TYPE_CCK_FALSE_ALARM 5
  125034. +#define RXERR_TYPE_CCK_MPDU_OK 6
  125035. +#define RXERR_TYPE_CCK_MPDU_FAIL 7
  125036. +#define RXERR_TYPE_HT_PPDU 8
  125037. +#define RXERR_TYPE_HT_FALSE_ALARM 9
  125038. +#define RXERR_TYPE_HT_MPDU_TOTAL 10
  125039. +#define RXERR_TYPE_HT_MPDU_OK 11
  125040. +#define RXERR_TYPE_HT_MPDU_FAIL 12
  125041. +#define RXERR_TYPE_RX_FULL_DROP 15
  125042. +
  125043. +#define RXERR_COUNTER_MASK 0xFFFFF
  125044. +#define RXERR_RPT_RST BIT(27)
  125045. +#define _RXERR_RPT_SEL(type) ((type) << 28)
  125046. +
  125047. +
  125048. +//2 SECCFG
  125049. +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key
  125050. +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key
  125051. +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption
  125052. +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption
  125053. +#define SCR_SKByA2 BIT(4) //Search kEY BY A2
  125054. +#define SCR_NoSKMC BIT(5) //No Key Search Multicast
  125055. +
  125056. +
  125057. +
  125058. +//-----------------------------------------------------
  125059. +//
  125060. +// 0xFE00h ~ 0xFE55h USB Configuration
  125061. +//
  125062. +//-----------------------------------------------------
  125063. +
  125064. +//2 USB Information (0xFE17)
  125065. +#define USB_IS_HIGH_SPEED 0
  125066. +#define USB_IS_FULL_SPEED 1
  125067. +#define USB_SPEED_MASK BIT(5)
  125068. +
  125069. +#define USB_NORMAL_SIE_EP_MASK 0xF
  125070. +#define USB_NORMAL_SIE_EP_SHIFT 4
  125071. +
  125072. +#define USB_TEST_EP_MASK 0x30
  125073. +#define USB_TEST_EP_SHIFT 4
  125074. +
  125075. +//2 Special Option
  125076. +#define USB_AGG_EN BIT(3)
  125077. +
  125078. +
  125079. +//2REG_C2HEVT_CLEAR
  125080. +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message
  125081. +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver.
  125082. +
  125083. +
  125084. +//2REG_MULTI_FUNC_CTRL(For RTL8723 Only)
  125085. +#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source
  125086. +#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control
  125087. +#define WL_FUNC_EN BIT2 // WiFi function enable
  125088. +#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source
  125089. +#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source
  125090. +#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control
  125091. +#define BT_FUNC_EN BIT18 // BT function enable
  125092. +#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source
  125093. +#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source
  125094. +#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control
  125095. +#define GPS_FUNC_EN BIT22 // GPS function enable
  125096. +
  125097. +//3 REG_LIFECTRL_CTRL
  125098. +#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3
  125099. +#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2
  125100. +#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1
  125101. +#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0
  125102. +
  125103. +#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim.
  125104. +
  125105. +//========================================================
  125106. +// General definitions
  125107. +//========================================================
  125108. +
  125109. +#define MAC_ADDR_LEN 6
  125110. +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255
  125111. +
  125112. +#define POLLING_LLT_THRESHOLD 20
  125113. +#define POLLING_READY_TIMEOUT_COUNT 1000
  125114. +
  125115. +// Min Spacing related settings.
  125116. +#define MAX_MSS_DENSITY_2T 0x13
  125117. +#define MAX_MSS_DENSITY_1T 0x0A
  125118. +
  125119. +//----------------------------------------------------------------------------
  125120. +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte)
  125121. +//----------------------------------------------------------------------------
  125122. +#define GPIOSEL_GPIO 0
  125123. +#define GPIOSEL_ENBT BIT5
  125124. +
  125125. +//----------------------------------------------------------------------------
  125126. +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte)
  125127. +//----------------------------------------------------------------------------
  125128. +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value
  125129. +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value
  125130. +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured.
  125131. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
  125132. +
  125133. +
  125134. +
  125135. +#include "basic_types.h"
  125136. +
  125137. +#endif
  125138. --- /dev/null
  125139. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h
  125140. @@ -0,0 +1,32 @@
  125141. +/******************************************************************************
  125142. + *
  125143. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  125144. + *
  125145. + * This program is free software; you can redistribute it and/or modify it
  125146. + * under the terms of version 2 of the GNU General Public License as
  125147. + * published by the Free Software Foundation.
  125148. + *
  125149. + * This program is distributed in the hope that it will be useful, but WITHOUT
  125150. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  125151. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  125152. + * more details.
  125153. + *
  125154. + * You should have received a copy of the GNU General Public License along with
  125155. + * this program; if not, write to the Free Software Foundation, Inc.,
  125156. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  125157. + *
  125158. + *
  125159. + ******************************************************************************/
  125160. +#ifndef _RTL8192C_SRESET_C_
  125161. +#define _RTL8192C_SRESET_C_
  125162. +
  125163. +#include <drv_conf.h>
  125164. +#include <osdep_service.h>
  125165. +#include <drv_types.h>
  125166. +#include <rtw_sreset.h>
  125167. +
  125168. +#ifdef DBG_CONFIG_ERROR_DETECT
  125169. +extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter);
  125170. +extern void rtl8192c_sreset_linked_status_check(_adapter *padapter);
  125171. +#endif
  125172. +#endif
  125173. --- /dev/null
  125174. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h
  125175. @@ -0,0 +1,128 @@
  125176. +/******************************************************************************
  125177. + *
  125178. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  125179. + *
  125180. + * This program is free software; you can redistribute it and/or modify it
  125181. + * under the terms of version 2 of the GNU General Public License as
  125182. + * published by the Free Software Foundation.
  125183. + *
  125184. + * This program is distributed in the hope that it will be useful, but WITHOUT
  125185. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  125186. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  125187. + * more details.
  125188. + *
  125189. + * You should have received a copy of the GNU General Public License along with
  125190. + * this program; if not, write to the Free Software Foundation, Inc.,
  125191. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  125192. + *
  125193. + *
  125194. + ******************************************************************************/
  125195. +#ifndef _RTL8192C_XMIT_H_
  125196. +#define _RTL8192C_XMIT_H_
  125197. +
  125198. +//
  125199. +// Queue Select Value in TxDesc
  125200. +//
  125201. +#define QSLT_BK 0x2//0x01
  125202. +#define QSLT_BE 0x0
  125203. +#define QSLT_VI 0x5//0x4
  125204. +#define QSLT_VO 0x7//0x6
  125205. +#define QSLT_BEACON 0x10
  125206. +#define QSLT_HIGH 0x11
  125207. +#define QSLT_MGNT 0x12
  125208. +#define QSLT_CMD 0x13
  125209. +
  125210. +struct txrpt_ccx_8192c {
  125211. + /* offset 0 */
  125212. + u8 retry_cnt:6;
  125213. + u8 rsvd_0:2;
  125214. +
  125215. + /* offset 1 */
  125216. + u8 rts_retry_cnt:6;
  125217. + u8 rsvd_1:2;
  125218. +
  125219. + /* offset 2 */
  125220. + u8 ccx_qtime0;
  125221. + u8 ccx_qtime1;
  125222. +
  125223. + /* offset 4 */
  125224. + u8 missed_pkt_num:5;
  125225. + u8 rsvd_4:3;
  125226. +
  125227. + /* offset 5 */
  125228. + u8 mac_id:5;
  125229. + u8 des1_fragssn:3;
  125230. +
  125231. + /* offset 6 */
  125232. + u8 rpt_pkt_num:5;
  125233. + u8 pkt_drop:1;
  125234. + u8 lifetime_over:1;
  125235. + u8 retry_over:1;
  125236. +
  125237. + /* offset 7*/
  125238. + u8 edca_tx_queue:4;
  125239. + u8 rsvd_7:1;
  125240. + u8 bmc:1;
  125241. + u8 pkt_ok:1;
  125242. + u8 int_ccx:1;
  125243. +};
  125244. +
  125245. +#define txrpt_ccx_qtime_8192c(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))
  125246. +
  125247. +#ifdef CONFIG_XMIT_ACK
  125248. +void dump_txrpt_ccx_8192c(void *buf);
  125249. +void handle_txrpt_ccx_8192c(_adapter *adapter, void *buf);
  125250. +#else
  125251. +#define dump_txrpt_ccx_8192c(buf) do {} while(0)
  125252. +#define handle_txrpt_ccx_8192c(adapter, buf) do {} while(0)
  125253. +#endif
  125254. +
  125255. +#ifdef CONFIG_USB_HCI
  125256. +
  125257. +#ifdef CONFIG_USB_TX_AGGREGATION
  125258. +#define MAX_TX_AGG_PACKET_NUMBER 0xFF
  125259. +#endif
  125260. +
  125261. +s32 rtl8192cu_init_xmit_priv(_adapter * padapter);
  125262. +
  125263. +void rtl8192cu_free_xmit_priv(_adapter * padapter);
  125264. +
  125265. +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc);
  125266. +
  125267. +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
  125268. +
  125269. +s32 rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);
  125270. +
  125271. +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);
  125272. +
  125273. +s32 rtl8192cu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  125274. +
  125275. +#ifdef CONFIG_HOSTAPD_MLME
  125276. +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);
  125277. +#endif
  125278. +
  125279. +#endif
  125280. +
  125281. +#ifdef CONFIG_PCI_HCI
  125282. +s32 rtl8192ce_init_xmit_priv(_adapter * padapter);
  125283. +void rtl8192ce_free_xmit_priv(_adapter * padapter);
  125284. +
  125285. +s32 rtl8192ce_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf);
  125286. +struct xmit_buf *rtl8192ce_dequeue_xmitbuf(struct rtw_tx_ring *ring);
  125287. +
  125288. +void rtl8192ce_xmitframe_resume(_adapter *padapter);
  125289. +
  125290. +s32 rtl8192ce_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);
  125291. +
  125292. +s32 rtl8192ce_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);
  125293. +
  125294. +s32 rtl8192ce_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  125295. +
  125296. +
  125297. +#ifdef CONFIG_HOSTAPD_MLME
  125298. +s32 rtl8192ce_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);
  125299. +#endif
  125300. +
  125301. +#endif
  125302. +
  125303. +#endif
  125304. --- /dev/null
  125305. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h
  125306. @@ -0,0 +1,140 @@
  125307. +/******************************************************************************
  125308. + *
  125309. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  125310. + *
  125311. + * This program is free software; you can redistribute it and/or modify it
  125312. + * under the terms of version 2 of the GNU General Public License as
  125313. + * published by the Free Software Foundation.
  125314. + *
  125315. + * This program is distributed in the hope that it will be useful, but WITHOUT
  125316. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  125317. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  125318. + * more details.
  125319. + *
  125320. + * You should have received a copy of the GNU General Public License along with
  125321. + * this program; if not, write to the Free Software Foundation, Inc.,
  125322. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  125323. + *
  125324. + *
  125325. + ******************************************************************************/
  125326. +#ifndef __RTL8192D_CMD_H_
  125327. +#define __RTL8192D_CMD_H_
  125328. +
  125329. +
  125330. +//--------------------------------------------
  125331. +//3 Host Message Box
  125332. +//--------------------------------------------
  125333. +
  125334. +// User Define Message [31:8]
  125335. +
  125336. +//_SETPWRMODE_PARM
  125337. +#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
  125338. +#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
  125339. +#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
  125340. +
  125341. +//JOINBSSRPT_PARM
  125342. +#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
  125343. +
  125344. +//_RSVDPAGE_LOC
  125345. +#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
  125346. +#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
  125347. +#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
  125348. +
  125349. +//P2P_PS_OFFLOAD
  125350. +
  125351. +struct P2P_PS_Offload_t {
  125352. + unsigned char Offload_En:1;
  125353. + unsigned char role:1; // 1: Owner, 0: Client
  125354. + unsigned char CTWindow_En:1;
  125355. + unsigned char NoA0_En:1;
  125356. + unsigned char NoA1_En:1;
  125357. + unsigned char AllStaSleep:1; // Only valid in Owner
  125358. + unsigned char discovery:1;
  125359. + unsigned char rsvd:1;
  125360. +};
  125361. +
  125362. +#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
  125363. +#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
  125364. +#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
  125365. +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
  125366. +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
  125367. +#define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
  125368. +#define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
  125369. +
  125370. +// Description: Determine the types of H2C commands that are the same in driver and Fw.
  125371. +// Fisrt constructed by tynli. 2009.10.09.
  125372. +typedef enum _RTL8192D_H2C_CMD
  125373. +{
  125374. + H2C_AP_OFFLOAD = 0, /*0*/
  125375. + H2C_SETPWRMODE = 1, /*1*/
  125376. + H2C_JOINBSSRPT = 2, /*2*/
  125377. + H2C_RSVDPAGE = 3,
  125378. + H2C_RSSI_REPORT = 5,
  125379. + H2C_RA_MASK = 6,
  125380. + H2C_P2P_PS_OFFLOAD = 8,
  125381. + H2C_MAC_MODE_SEL = 9,
  125382. + H2C_PWRM=15,
  125383. +#ifdef CONFIG_WOWLAN
  125384. + H2C_WO_WLAN_CMD = 20, // Wake on Wlan.
  125385. +#endif // CONFIG_WOWLAN
  125386. + H2C_P2P_PS_CTW_CMD = 24,
  125387. + H2C_PathDiv = 26, //PathDiv--NeilChen--2011.07.15
  125388. +#ifdef CONFIG_WOWLAN
  125389. + KEEP_ALIVE_CONTROL_CMD=31, //keep alive for wake on wlan
  125390. + DISCONNECT_DECISION_CTRL_CMD=32,
  125391. + REMOTE_WAKE_CTRL_CMD=34,
  125392. +#endif // CONFIG_WOWLAN
  125393. + H2C_92D_TSF_SYNC=36,
  125394. + H2C_92D_RESET_TSF = 43,
  125395. + H2C_CMD_MAX
  125396. +}RTL8192D_H2C_CMD;
  125397. +
  125398. +struct cmd_msg_parm {
  125399. + u8 eid; //element id
  125400. + u8 sz; // sz
  125401. + u8 buf[6];
  125402. +};
  125403. +
  125404. +
  125405. +void FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer);
  125406. +
  125407. +// host message to firmware cmd
  125408. +void rtl8192d_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode);
  125409. +void rtl8192d_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus);
  125410. +u8 rtl8192d_set_rssi_cmd(_adapter*padapter, u8 *param);
  125411. +u8 rtl8192d_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg);
  125412. +void rtl8192d_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg);
  125413. +#ifdef CONFIG_P2P
  125414. +void rtl8192d_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state);
  125415. +#endif //CONFIG_P2P
  125416. +
  125417. +#ifdef CONFIG_TSF_RESET_OFFLOAD
  125418. +int reset_tsf(PADAPTER Adapter, u8 reset_port );
  125419. +#endif // CONFIG_TSF_RESET_OFFLOAD
  125420. +
  125421. +#ifdef CONFIG_WOWLAN
  125422. +typedef struct _SETWOWLAN_PARM{
  125423. + u8 mode;
  125424. + u8 gpio_index;
  125425. + u8 gpio_duration;
  125426. + u8 second_mode;
  125427. + u8 reserve;
  125428. +}SETWOWLAN_PARM, *PSETWOWLAN_PARM;
  125429. +
  125430. +#define FW_WOWLAN_FUN_EN BIT(0)
  125431. +#define FW_WOWLAN_PATTERN_MATCH BIT(1)
  125432. +#define FW_WOWLAN_MAGIC_PKT BIT(2)
  125433. +#define FW_WOWLAN_UNICAST BIT(3)
  125434. +#define FW_WOWLAN_ALL_PKT_DROP BIT(4)
  125435. +#define FW_WOWLAN_GPIO_ACTIVE BIT(5)
  125436. +#define FW_WOWLAN_REKEY_WAKEUP BIT(6)
  125437. +#define FW_WOWLAN_DEAUTH_WAKEUP BIT(7)
  125438. +
  125439. +#define FW_WOWLAN_GPIO_WAKEUP_EN BIT(0)
  125440. +#define FW_FW_PARSE_MAGIC_PKT BIT(1)
  125441. +
  125442. +void rtl8192d_set_wowlan_cmd(_adapter* padapter);
  125443. +void SetFwRelatedForWoWLAN8192DU(_adapter* padapter,u8 bHostIsGoingtoSleep);
  125444. +#endif // CONFIG_WOWLAN
  125445. +
  125446. +#endif // __RTL8192D_CMD_H_
  125447. --- /dev/null
  125448. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h
  125449. @@ -0,0 +1,420 @@
  125450. +/******************************************************************************
  125451. + *
  125452. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  125453. + *
  125454. + * This program is free software; you can redistribute it and/or modify it
  125455. + * under the terms of version 2 of the GNU General Public License as
  125456. + * published by the Free Software Foundation.
  125457. + *
  125458. + * This program is distributed in the hope that it will be useful, but WITHOUT
  125459. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  125460. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  125461. + * more details.
  125462. + *
  125463. + * You should have received a copy of the GNU General Public License along with
  125464. + * this program; if not, write to the Free Software Foundation, Inc.,
  125465. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  125466. + *
  125467. + *
  125468. + ******************************************************************************/
  125469. +#ifndef __RTL8192D_DM_H__
  125470. +#define __RTL8192D_DM_H__
  125471. +//============================================================
  125472. +// Description:
  125473. +//
  125474. +// This file is for 92CE/92CU dynamic mechanism only
  125475. +//
  125476. +//
  125477. +//============================================================
  125478. +//============================================================
  125479. +// Global var
  125480. +//============================================================
  125481. +
  125482. +extern u32 EDCAParam[maxAP][3] ;
  125483. +
  125484. +//============================================================
  125485. +// structure and define
  125486. +//============================================================
  125487. +
  125488. +typedef struct _FALSE_ALARM_STATISTICS{
  125489. + u32 Cnt_Parity_Fail;
  125490. + u32 Cnt_Rate_Illegal;
  125491. + u32 Cnt_Crc8_fail;
  125492. + u32 Cnt_Mcs_fail;
  125493. + u32 Cnt_Ofdm_fail;
  125494. + u32 Cnt_Cck_fail;
  125495. + u32 Cnt_all;
  125496. + u32 Cnt_Fast_Fsync;
  125497. + u32 Cnt_SB_Search_fail;
  125498. +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
  125499. +
  125500. +typedef struct _Dynamic_Power_Saving_
  125501. +{
  125502. + u8 PreCCAState;
  125503. + u8 CurCCAState;
  125504. +
  125505. + u8 PreRFState;
  125506. + u8 CurRFState;
  125507. +
  125508. + //int Rssi_val_min;
  125509. +
  125510. +}PS_T,*pPS_T;
  125511. +
  125512. +typedef struct _Dynamic_Initial_Gain_Threshold_
  125513. +{
  125514. + u8 Dig_Enable_Flag;
  125515. + u8 Dig_Ext_Port_Stage;
  125516. +
  125517. + int RssiLowThresh;
  125518. + int RssiHighThresh;
  125519. +
  125520. + u32 FALowThresh;
  125521. + u32 FAHighThresh;
  125522. +
  125523. + u8 CurSTAConnectState;
  125524. + u8 PreSTAConnectState;
  125525. + u8 CurMultiSTAConnectState;
  125526. +
  125527. + u8 PreIGValue;
  125528. + u8 CurIGValue;
  125529. + u8 BackupIGValue;
  125530. +
  125531. + char BackoffVal;
  125532. + char BackoffVal_range_max;
  125533. + char BackoffVal_range_min;
  125534. + u8 rx_gain_range_max;
  125535. + u8 rx_gain_range_min;
  125536. + u8 Rssi_val_min;
  125537. +
  125538. + u8 PreCCKPDState;
  125539. + u8 CurCCKPDState;
  125540. +
  125541. + u8 LargeFAHit;
  125542. + u8 ForbiddenIGI;
  125543. + u32 Recover_cnt;
  125544. + u8 rx_gain_range_min_nolink;
  125545. +}DIG_T,*pDIG_T;
  125546. +
  125547. +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition
  125548. +{
  125549. + DIG_TYPE_THRESH_HIGH = 0,
  125550. + DIG_TYPE_THRESH_LOW = 1,
  125551. + DIG_TYPE_BACKOFF = 2,
  125552. + DIG_TYPE_RX_GAIN_MIN = 3,
  125553. + DIG_TYPE_RX_GAIN_MAX = 4,
  125554. + DIG_TYPE_ENABLE = 5,
  125555. + DIG_TYPE_DISABLE = 6,
  125556. + DIG_OP_TYPE_MAX
  125557. +}DM_DIG_OP_E;
  125558. +
  125559. +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition
  125560. +{
  125561. + CCK_PD_STAGE_LowRssi = 0,
  125562. + CCK_PD_STAGE_HighRssi = 1,
  125563. + CCK_PD_STAGE_MAX = 3,
  125564. +}DM_CCK_PDTH_E;
  125565. +
  125566. +typedef enum tag_1R_CCA_Type_Definition
  125567. +{
  125568. + CCA_MIN = 0,
  125569. + CCA_1R =1,
  125570. + CCA_2R = 2,
  125571. + CCA_MAX = 3,
  125572. +}DM_1R_CCA_E;
  125573. +
  125574. +typedef enum tag_RF_Type_Definition
  125575. +{
  125576. + RF_Save =0,
  125577. + RF_Normal = 1,
  125578. + RF_MAX = 2,
  125579. +}DM_RF_E;
  125580. +
  125581. +typedef enum tag_DIG_EXT_PORT_ALGO_Definition
  125582. +{
  125583. + DIG_EXT_PORT_STAGE_0 = 0,
  125584. + DIG_EXT_PORT_STAGE_1 = 1,
  125585. + DIG_EXT_PORT_STAGE_2 = 2,
  125586. + DIG_EXT_PORT_STAGE_3 = 3,
  125587. + DIG_EXT_PORT_STAGE_MAX = 4,
  125588. +}DM_DIG_EXT_PORT_ALG_E;
  125589. +
  125590. +
  125591. +typedef enum tag_DIG_Connect_Definition
  125592. +{
  125593. + DIG_STA_DISCONNECT = 0,
  125594. + DIG_STA_CONNECT = 1,
  125595. + DIG_STA_BEFORE_CONNECT = 2,
  125596. + DIG_MultiSTA_DISCONNECT = 3,
  125597. + DIG_MultiSTA_CONNECT = 4,
  125598. + DIG_CONNECT_MAX
  125599. +}DM_DIG_CONNECT_E;
  125600. +
  125601. +
  125602. +#define DM_DIG_THRESH_HIGH 40
  125603. +#define DM_DIG_THRESH_LOW 35
  125604. +
  125605. +#define DM_FALSEALARM_THRESH_LOW 400
  125606. +#define DM_FALSEALARM_THRESH_HIGH 1000
  125607. +
  125608. +#define DM_DIG_MAX 0x3e
  125609. +#define DM_DIG_MIN 0x1e //0x22//0x1c
  125610. +
  125611. +#define DM_DIG_FA_UPPER 0x32
  125612. +#define DM_DIG_FA_LOWER 0x20
  125613. +
  125614. +//vivi 92c&92d has different definition, 20110504
  125615. +//this is for 92c
  125616. +#define DM_DIG_FA_TH0 0x200//0x20
  125617. +#define DM_DIG_FA_TH1 0x300//0x100
  125618. +#define DM_DIG_FA_TH2 0x400//0x200
  125619. +//this is for 92d
  125620. +#define DM_DIG_FA_TH0_92D 0x100
  125621. +#define DM_DIG_FA_TH1_92D 0x150
  125622. +#define DM_DIG_FA_TH2_92D 0x250
  125623. +
  125624. +#define DM_DIG_BACKOFF_MAX 12
  125625. +#define DM_DIG_BACKOFF_MIN (-4)
  125626. +#define DM_DIG_BACKOFF_DEFAULT 10
  125627. +
  125628. +#define RxPathSelection_SS_TH_low 30
  125629. +#define RxPathSelection_diff_TH 18
  125630. +
  125631. +#define DM_RATR_STA_INIT 0
  125632. +#define DM_RATR_STA_HIGH 1
  125633. +#define DM_RATR_STA_MIDDLE 2
  125634. +#define DM_RATR_STA_LOW 3
  125635. +
  125636. +#define CTSToSelfTHVal 30
  125637. +#define RegC38_TH 20
  125638. +
  125639. +#define WAIotTHVal 25
  125640. +
  125641. +//Dynamic Tx Power Control Threshold
  125642. +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
  125643. +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
  125644. +
  125645. +#define TxHighPwrLevel_Normal 0
  125646. +#define TxHighPwrLevel_Level1 1
  125647. +#define TxHighPwrLevel_Level2 2
  125648. +#define TxHighPwrLevel_BT1 3
  125649. +#define TxHighPwrLevel_BT2 4
  125650. +#define TxHighPwrLevel_15 5
  125651. +#define TxHighPwrLevel_35 6
  125652. +#define TxHighPwrLevel_50 7
  125653. +#define TxHighPwrLevel_70 8
  125654. +#define TxHighPwrLevel_100 9
  125655. +
  125656. +#define DM_Type_ByFW 0
  125657. +#define DM_Type_ByDriver 1
  125658. +
  125659. +typedef struct _RATE_ADAPTIVE
  125660. +{
  125661. + u8 RateAdaptiveDisabled;
  125662. + u8 RATRState;
  125663. + u16 reserve;
  125664. +
  125665. + u32 HighRSSIThreshForRA;
  125666. + u32 High2LowRSSIThreshForRA;
  125667. + u8 Low2HighRSSIThreshForRA40M;
  125668. + u32 LowRSSIThreshForRA40M;
  125669. + u8 Low2HighRSSIThreshForRA20M;
  125670. + u32 LowRSSIThreshForRA20M;
  125671. + u32 UpperRSSIThresholdRATR;
  125672. + u32 MiddleRSSIThresholdRATR;
  125673. + u32 LowRSSIThresholdRATR;
  125674. + u32 LowRSSIThresholdRATR40M;
  125675. + u32 LowRSSIThresholdRATR20M;
  125676. + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue
  125677. + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue
  125678. + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue
  125679. + u32 LastRATR;
  125680. + u8 PreRATRState;
  125681. +
  125682. +} RATE_ADAPTIVE, *PRATE_ADAPTIVE;
  125683. +
  125684. +typedef enum tag_SW_Antenna_Switch_Definition
  125685. +{
  125686. + Antenna_B = 1,
  125687. + Antenna_A = 2,
  125688. + Antenna_MAX = 3,
  125689. +}DM_SWAS_E;
  125690. +
  125691. +// 20100514 Joseph: Add definition for antenna switching test after link.
  125692. +// This indicates two different the steps.
  125693. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air.
  125694. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK
  125695. +// with original RSSI to determine if it is necessary to switch antenna.
  125696. +#define SWAW_STEP_PEAK 0
  125697. +#define SWAW_STEP_DETERMINE 1
  125698. +
  125699. +#define TP_MODE 0
  125700. +#define RSSI_MODE 1
  125701. +#define TRAFFIC_LOW 0
  125702. +#define TRAFFIC_HIGH 1
  125703. +
  125704. +//=============================
  125705. +//Neil Chen---2011--06--15--
  125706. +//==============================
  125707. +//3 PathDiv
  125708. +typedef struct _SW_Antenna_Switch_
  125709. +{
  125710. + u8 try_flag;
  125711. + s32 PreRSSI;
  125712. + u8 CurAntenna;
  125713. + u8 PreAntenna;
  125714. + u8 RSSI_Trying;
  125715. + u8 TestMode;
  125716. + u8 bTriggerAntennaSwitch;
  125717. + u8 SelectAntennaMap;
  125718. +
  125719. + // Before link Antenna Switch check
  125720. + u8 SWAS_NoLink_State;
  125721. + u32 SWAS_NoLink_BK_Reg860;
  125722. +}SWAT_T, *pSWAT_T;
  125723. +//========================================
  125724. +
  125725. +struct dm_priv
  125726. +{
  125727. + u8 DM_Type;
  125728. + u8 DMFlag, DMFlag_tmp;
  125729. +
  125730. + //for DIG
  125731. + u8 bDMInitialGainEnable;
  125732. + //u8 binitialized; // for dm_initial_gain_Multi_STA use.
  125733. + DIG_T DM_DigTable;
  125734. +
  125735. + PS_T DM_PSTable;
  125736. +
  125737. + FALSE_ALARM_STATISTICS FalseAlmCnt;
  125738. +
  125739. + //for rate adaptive, in fact, 88c/92c fw will handle this
  125740. + u8 bUseRAMask;
  125741. + RATE_ADAPTIVE RateAdaptive;
  125742. +
  125743. + //* Upper and Lower Signal threshold for Rate Adaptive*/
  125744. + int UndecoratedSmoothedPWDB;
  125745. + int EntryMinUndecoratedSmoothedPWDB;
  125746. + int EntryMaxUndecoratedSmoothedPWDB;
  125747. + int MinUndecoratedPWDBForDM;
  125748. + int LastMinUndecoratedPWDBForDM;
  125749. +#ifdef CONFIG_DUALMAC_CONCURRENT
  125750. + int RssiValMinForAnotherMacOfDMSP;
  125751. + u32 CurDigValueForAnotherMacOfDMSP;
  125752. + BOOLEAN bWriteDigForAnotherMacOfDMSP;
  125753. + BOOLEAN bChangeCCKPDStateForAnotherMacOfDMSP;
  125754. + u8 CurCCKPDStateForAnotherMacOfDMSP;
  125755. + BOOLEAN bChangeTxHighPowerLvlForAnotherMacOfDMSP;
  125756. + u8 CurTxHighLvlForAnotherMacOfDMSP;
  125757. +#endif
  125758. +
  125759. + //for High Power
  125760. + u8 bDynamicTxPowerEnable;
  125761. + u8 LastDTPLvl;
  125762. + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06
  125763. +
  125764. + //for tx power tracking
  125765. + u8 bTXPowerTracking;
  125766. + u8 TXPowercount;
  125767. + u8 bTXPowerTrackingInit;
  125768. + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default
  125769. + u8 TM_Trigger;
  125770. +
  125771. + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1
  125772. + u8 ThermalValue;
  125773. + u8 ThermalValue_LCK;
  125774. + u8 ThermalValue_IQK;
  125775. + u8 ThermalValue_AVG[AVG_THERMAL_NUM];
  125776. + u8 ThermalValue_AVG_index;
  125777. + u8 ThermalValue_RxGain;
  125778. + u8 ThermalValue_Crystal;
  125779. + u8 Delta_IQK;
  125780. + u8 Delta_LCK;
  125781. + u8 bRfPiEnable;
  125782. + u8 bReloadtxpowerindex;
  125783. + u8 bDoneTxpower;
  125784. +
  125785. + //for APK
  125786. + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a
  125787. + u8 bAPKdone;
  125788. + u8 bAPKThermalMeterIgnore;
  125789. + BOOLEAN bDPKdone[2];
  125790. + BOOLEAN bDPKstore;
  125791. + BOOLEAN bDPKworking;
  125792. + u8 OFDM_min_index_internalPA_DPK[2];
  125793. + u8 TxPowerLevelDPK[2];
  125794. +
  125795. + u32 RegA24;
  125796. +
  125797. + //for IQK
  125798. + u32 Reg874;
  125799. + u32 RegC08;
  125800. + u32 Reg88C;
  125801. + u8 Reg522;
  125802. + u8 Reg550;
  125803. + u8 Reg551;
  125804. + u32 Reg870;
  125805. + u32 ADDA_backup[IQK_ADDA_REG_NUM];
  125806. + u32 IQK_MAC_backup[IQK_MAC_REG_NUM];
  125807. + u32 IQK_BB_backup[IQK_BB_REG_NUM];
  125808. +
  125809. + u8 bCCKinCH14;
  125810. +
  125811. + char CCK_index;
  125812. + //u8 Record_CCK_20Mindex;
  125813. + //u8 Record_CCK_40Mindex;
  125814. + char OFDM_index[2];
  125815. +
  125816. + SWAT_T DM_SWAT_Table;
  125817. +
  125818. + //for TxPwrTracking
  125819. + int RegE94;
  125820. + int RegE9C;
  125821. + int RegEB4;
  125822. + int RegEBC;
  125823. +#if MP_DRIVER == 1
  125824. + u8 RegC04_MP;
  125825. + u32 RegD04_MP;
  125826. +#endif
  125827. + u32 TXPowerTrackingCallbackCnt; //cosa add for debug
  125828. +
  125829. + u32 prv_traffic_idx; // edca turbo
  125830. +
  125831. + u32 RegRF3C[2]; //pathA / pathB
  125832. +
  125833. + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas
  125834. + u8 INIDATA_RATE[32];
  125835. +
  125836. +#ifdef CONFIG_DM_ADAPTIVITY
  125837. + /* Ported from ODM, for ESTI Adaptivity test */
  125838. + s8 TH_L2H_ini;
  125839. + s8 TH_EDCCA_HL_diff;
  125840. + s8 IGI_Base;
  125841. + u8 IGI_target;
  125842. + bool ForceEDCCA;
  125843. + u8 AdapEn_RSSI;
  125844. + s8 Force_TH_H;
  125845. + s8 Force_TH_L;
  125846. + u8 IGI_LowerBound;
  125847. +
  125848. + bool bPreEdccaEnable;
  125849. +#endif
  125850. +};
  125851. +
  125852. +
  125853. +/*------------------------Export global variable----------------------------*/
  125854. +/*------------------------Export global variable----------------------------*/
  125855. +/*------------------------Export Marco Definition---------------------------*/
  125856. +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}
  125857. +
  125858. +
  125859. +//============================================================
  125860. +// function prototype
  125861. +//============================================================
  125862. +void rtl8192d_init_dm_priv(IN PADAPTER Adapter);
  125863. +void rtl8192d_deinit_dm_priv(IN PADAPTER Adapter);
  125864. +void rtl8192d_InitHalDm(IN PADAPTER Adapter);
  125865. +void rtl8192d_HalDmWatchDog(IN PADAPTER Adapter);
  125866. +
  125867. +VOID rtl8192d_dm_CheckTXPowerTracking(IN PADAPTER Adapter);
  125868. +
  125869. +#endif //__HAL8190PCIDM_H__
  125870. --- /dev/null
  125871. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h
  125872. @@ -0,0 +1,1125 @@
  125873. +/******************************************************************************
  125874. + *
  125875. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  125876. + *
  125877. + * This program is free software; you can redistribute it and/or modify it
  125878. + * under the terms of version 2 of the GNU General Public License as
  125879. + * published by the Free Software Foundation.
  125880. + *
  125881. + * This program is distributed in the hope that it will be useful, but WITHOUT
  125882. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  125883. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  125884. + * more details.
  125885. + *
  125886. + * You should have received a copy of the GNU General Public License along with
  125887. + * this program; if not, write to the Free Software Foundation, Inc.,
  125888. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  125889. + *
  125890. + *
  125891. + ******************************************************************************/
  125892. +#ifndef __RTL8192D_HAL_H__
  125893. +#define __RTL8192D_HAL_H__
  125894. +
  125895. +#include "hal_com.h"
  125896. +#include "rtl8192d_spec.h"
  125897. +#include "Hal8192DPhyReg.h"
  125898. +#include "Hal8192DPhyCfg.h"
  125899. +#include "rtl8192d_rf.h"
  125900. +#include "rtl8192d_dm.h"
  125901. +#include "rtl8192d_recv.h"
  125902. +#include "rtl8192d_xmit.h"
  125903. +#include "rtl8192d_cmd.h"
  125904. +
  125905. +/*---------------------------Define Local Constant---------------------------*/
  125906. +/* Channel switch:The size of command tables for switch channel*/
  125907. +#define MAX_PRECMD_CNT 16
  125908. +#define MAX_RFDEPENDCMD_CNT 16
  125909. +#define MAX_POSTCMD_CNT 16
  125910. +
  125911. +#define MAX_DOZE_WAITING_TIMES_9x 64
  125912. +
  125913. +#define MAX_RF_IMR_INDEX 12
  125914. +#define MAX_RF_IMR_INDEX_NORMAL 13
  125915. +#define RF_REG_NUM_for_C_CUT_5G 6
  125916. +#define RF_REG_NUM_for_C_CUT_5G_internalPA 7
  125917. +#define RF_REG_NUM_for_C_CUT_2G 5
  125918. +#define RF_CHNL_NUM_5G 19
  125919. +#define RF_CHNL_NUM_5G_40M 17
  125920. +#define TARGET_CHNL_NUM_5G 221
  125921. +#define TARGET_CHNL_NUM_2G 14
  125922. +#define TARGET_CHNL_NUM_2G_5G 59
  125923. +#define CV_CURVE_CNT 64
  125924. +
  125925. +//static u32 RF_REG_FOR_5G_SWCHNL[MAX_RF_IMR_INDEX]={0,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x38,0x39,0x0};
  125926. +static u32 RF_REG_FOR_5G_SWCHNL_NORMAL[MAX_RF_IMR_INDEX_NORMAL]={0,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x0};
  125927. +
  125928. +static u8 RF_REG_for_C_CUT_5G[RF_REG_NUM_for_C_CUT_5G] =
  125929. + {RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6};
  125930. +
  125931. +static u8 RF_REG_for_C_CUT_5G_internalPA[RF_REG_NUM_for_C_CUT_5G_internalPA] =
  125932. + {0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E};
  125933. +static u8 RF_REG_for_C_CUT_2G[RF_REG_NUM_for_C_CUT_2G] =
  125934. + {RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8};
  125935. +
  125936. +#if DBG
  125937. +static u32 RF_REG_MASK_for_C_CUT_2G[RF_REG_NUM_for_C_CUT_2G] =
  125938. + {BIT19|BIT18|BIT17|BIT14|BIT1, BIT10|BIT9,
  125939. + BIT18|BIT17|BIT16|BIT1, BIT2|BIT1,
  125940. + BIT15|BIT14|BIT13|BIT12|BIT11};
  125941. +#endif //amy, temp remove
  125942. +static u8 RF_CHNL_5G[RF_CHNL_NUM_5G] =
  125943. + {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140};
  125944. +static u8 RF_CHNL_5G_40M[RF_CHNL_NUM_5G_40M] =
  125945. + {38,42,46,50,54,58,62,102,106,110,114,118,122,126,130,134,138};
  125946. +
  125947. +static u32 RF_REG_Param_for_C_CUT_5G[5][RF_REG_NUM_for_C_CUT_5G] = {
  125948. + {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
  125949. + {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
  125950. + {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
  125951. + {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
  125952. + {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}};
  125953. +
  125954. +static u32 RF_REG_Param_for_C_CUT_2G[3][RF_REG_NUM_for_C_CUT_2G] = {
  125955. + {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
  125956. + {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
  125957. + {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}};
  125958. +
  125959. +#if SWLCK == 1
  125960. +static u32 RF_REG_SYN_G4_for_C_CUT_2G = 0xD1C31&0x7FF;
  125961. +#endif
  125962. +
  125963. +static u32 RF_REG_Param_for_C_CUT_5G_internalPA[3][RF_REG_NUM_for_C_CUT_5G_internalPA] = {
  125964. + {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
  125965. + {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
  125966. + {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}};
  125967. +
  125968. +
  125969. +
  125970. +//[mode][patha+b][reg]
  125971. +static u32 RF_IMR_Param_Normal[1][3][MAX_RF_IMR_INDEX_NORMAL]={{
  125972. + {0x70000,0x00ff0,0x4400f,0x00ff0,0x0,0x0,0x0,0x0,0x0,0x64888,0xe266c,0x00090,0x22fff},// channel 1-14.
  125973. + {0x70000,0x22880,0x4470f,0x55880,0x00070, 0x88000, 0x0,0x88080,0x70000,0x64a82,0xe466c,0x00090,0x32c9a}, //path 36-64
  125974. + {0x70000,0x44880,0x4477f,0x77880,0x00070, 0x88000, 0x0,0x880b0,0x0,0x64b82,0xe466c,0x00090,0x32c9a} //100 -165
  125975. +}
  125976. +};
  125977. +
  125978. +//static u32 CurveIndex_5G[TARGET_CHNL_NUM_5G]={0};
  125979. +//static u32 CurveIndex_2G[TARGET_CHNL_NUM_2G]={0};
  125980. +static u32 CurveIndex[TARGET_CHNL_NUM_2G_5G]={0};
  125981. +
  125982. +static u32 TargetChnl_5G[TARGET_CHNL_NUM_5G] = {
  125983. +25141, 25116, 25091, 25066, 25041,
  125984. +25016, 24991, 24966, 24941, 24917,
  125985. +24892, 24867, 24843, 24818, 24794,
  125986. +24770, 24765, 24721, 24697, 24672,
  125987. +24648, 24624, 24600, 24576, 24552,
  125988. +24528, 24504, 24480, 24457, 24433,
  125989. +24409, 24385, 24362, 24338, 24315,
  125990. +24291, 24268, 24245, 24221, 24198,
  125991. +24175, 24151, 24128, 24105, 24082,
  125992. +24059, 24036, 24013, 23990, 23967,
  125993. +23945, 23922, 23899, 23876, 23854,
  125994. +23831, 23809, 23786, 23764, 23741,
  125995. +23719, 23697, 23674, 23652, 23630,
  125996. +23608, 23586, 23564, 23541, 23519,
  125997. +23498, 23476, 23454, 23432, 23410,
  125998. +23388, 23367, 23345, 23323, 23302,
  125999. +23280, 23259, 23237, 23216, 23194,
  126000. +23173, 23152, 23130, 23109, 23088,
  126001. +23067, 23046, 23025, 23003, 22982,
  126002. +22962, 22941, 22920, 22899, 22878,
  126003. +22857, 22837, 22816, 22795, 22775,
  126004. +22754, 22733, 22713, 22692, 22672,
  126005. +22652, 22631, 22611, 22591, 22570,
  126006. +22550, 22530, 22510, 22490, 22469,
  126007. +22449, 22429, 22409, 22390, 22370,
  126008. +22350, 22336, 22310, 22290, 22271,
  126009. +22251, 22231, 22212, 22192, 22173,
  126010. +22153, 22134, 22114, 22095, 22075,
  126011. +22056, 22037, 22017, 21998, 21979,
  126012. +21960, 21941, 21921, 21902, 21883,
  126013. +21864, 21845, 21826, 21807, 21789,
  126014. +21770, 21751, 21732, 21713, 21695,
  126015. +21676, 21657, 21639, 21620, 21602,
  126016. +21583, 21565, 21546, 21528, 21509,
  126017. +21491, 21473, 21454, 21436, 21418,
  126018. +21400, 21381, 21363, 21345, 21327,
  126019. +21309, 21291, 21273, 21255, 21237,
  126020. +21219, 21201, 21183, 21166, 21148,
  126021. +21130, 21112, 21095, 21077, 21059,
  126022. +21042, 21024, 21007, 20989, 20972,
  126023. +25679, 25653, 25627, 25601, 25575,
  126024. +25549, 25523, 25497, 25471, 25446,
  126025. +25420, 25394, 25369, 25343, 25318,
  126026. +25292, 25267, 25242, 25216, 25191,
  126027. +25166 };
  126028. +
  126029. +static u32 TargetChnl_2G[TARGET_CHNL_NUM_2G] = { // channel 1~14
  126030. +26084, 26030, 25976, 25923, 25869, 25816, 25764,
  126031. +25711, 25658, 25606, 25554, 25502, 25451, 25328
  126032. +};
  126033. +
  126034. +
  126035. +#ifdef CONFIG_PCI_HCI
  126036. + #include <pci_ops.h>
  126037. + #include "Hal8192DEHWImg.h"
  126038. +
  126039. + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R
  126040. +
  126041. +//---------------------------------------------------------------------
  126042. +// RTL8192DE From file
  126043. +//---------------------------------------------------------------------
  126044. + #define RTL8192D_FW_IMG "rtl8192DE\\rtl8192dfw.bin"
  126045. +
  126046. + #define RTL8192D_PHY_REG "rtl8192DE\\PHY_REG.txt"
  126047. + #define RTL8192D_PHY_REG_PG "rtl8192DE\\PHY_REG_PG.txt"
  126048. + #define RTL8192D_PHY_REG_MP "rtl8192DE\\PHY_REG_MP.txt"
  126049. +
  126050. + #define RTL8192D_AGC_TAB "rtl8192DE\\AGC_TAB.txt"
  126051. + #define RTL8192D_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G.txt"
  126052. + #define RTL8192D_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G.txt"
  126053. + #define RTL8192D_PHY_RADIO_A "rtl8192DE\\radio_a.txt"
  126054. + #define RTL8192D_PHY_RADIO_B "rtl8192DE\\radio_b.txt"
  126055. + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DE\\radio_a_intPA.txt"
  126056. + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DE\\radio_b_intPA.txt"
  126057. + #define RTL8192D_PHY_MACREG "rtl8192DE\\MAC_REG.txt"
  126058. +
  126059. +//---------------------------------------------------------------------
  126060. +// RTL8192DE From header
  126061. +//---------------------------------------------------------------------
  126062. +
  126063. + // Fw Array
  126064. + #define Rtl8192D_FwImageArray Rtl8192DEFwImgArray
  126065. +
  126066. + // MAC/BB/PHY Array
  126067. + #define Rtl8192D_MAC_Array Rtl8192DEMAC_2T_Array
  126068. + #define Rtl8192D_AGCTAB_Array Rtl8192DEAGCTAB_Array
  126069. + #define Rtl8192D_AGCTAB_5GArray Rtl8192DEAGCTAB_5GArray
  126070. + #define Rtl8192D_AGCTAB_2GArray Rtl8192DEAGCTAB_2GArray
  126071. + #define Rtl8192D_AGCTAB_2TArray Rtl8192DEAGCTAB_2TArray
  126072. + #define Rtl8192D_AGCTAB_1TArray Rtl8192DEAGCTAB_1TArray
  126073. + #define Rtl8192D_PHY_REG_2TArray Rtl8192DEPHY_REG_2TArray
  126074. + #define Rtl8192D_PHY_REG_1TArray Rtl8192DEPHY_REG_1TArray
  126075. + #define Rtl8192D_PHY_REG_Array_PG Rtl8192DEPHY_REG_Array_PG
  126076. + #define Rtl8192D_PHY_REG_Array_MP Rtl8192DEPHY_REG_Array_MP
  126077. + #define Rtl8192D_RadioA_2TArray Rtl8192DERadioA_2TArray
  126078. + #define Rtl8192D_RadioA_1TArray Rtl8192DERadioA_1TArray
  126079. + #define Rtl8192D_RadioB_2TArray Rtl8192DERadioB_2TArray
  126080. + #define Rtl8192D_RadioB_1TArray Rtl8192DERadioB_1TArray
  126081. + #define Rtl8192D_RadioA_2T_intPAArray Rtl8192DERadioA_2T_intPAArray
  126082. + #define Rtl8192D_RadioB_2T_intPAArray Rtl8192DERadioB_2T_intPAArray
  126083. +
  126084. + // Array length
  126085. + #define Rtl8192D_FwImageArrayLength Rtl8192DEImgArrayLength
  126086. + #define Rtl8192D_MAC_ArrayLength Rtl8192DEMAC_2T_ArrayLength
  126087. + #define Rtl8192D_AGCTAB_5GArrayLength Rtl8192DEAGCTAB_5GArrayLength
  126088. + #define Rtl8192D_AGCTAB_2GArrayLength Rtl8192DEAGCTAB_2GArrayLength
  126089. + #define Rtl8192D_AGCTAB_2TArrayLength Rtl8192DEAGCTAB_2TArrayLength
  126090. + #define Rtl8192D_AGCTAB_1TArrayLength Rtl8192DEAGCTAB_1TArrayLength
  126091. + #define Rtl8192D_AGCTAB_ArrayLength Rtl8192DEAGCTAB_ArrayLength
  126092. + #define Rtl8192D_PHY_REG_2TArrayLength Rtl8192DEPHY_REG_2TArrayLength
  126093. + #define Rtl8192D_PHY_REG_1TArrayLength Rtl8192DEPHY_REG_1TArrayLength
  126094. + #define Rtl8192D_PHY_REG_Array_PGLength Rtl8192DEPHY_REG_Array_PGLength
  126095. + #define Rtl8192D_PHY_REG_Array_MPLength Rtl8192DEPHY_REG_Array_MPLength
  126096. + #define Rtl8192D_RadioA_2TArrayLength Rtl8192DERadioA_2TArrayLength
  126097. + #define Rtl8192D_RadioB_2TArrayLength Rtl8192DERadioB_2TArrayLength
  126098. + #define Rtl8192D_RadioA_2T_intPAArrayLength Rtl8192DERadioA_2T_intPAArrayLength
  126099. + #define Rtl8192D_RadioB_2T_intPAArrayLength Rtl8192DERadioB_2T_intPAArrayLength
  126100. +
  126101. +#elif defined(CONFIG_USB_HCI)
  126102. +
  126103. + #include "Hal8192DUHWImg.h"
  126104. +#ifdef CONFIG_WOWLAN
  126105. + #include "Hal8192DUHWImg_wowlan.h"
  126106. +#endif //CONFIG_WOWLAN
  126107. + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R
  126108. +
  126109. +//---------------------------------------------------------------------
  126110. +// RTL8192DU From file
  126111. +//---------------------------------------------------------------------
  126112. + #define RTL8192D_FW_IMG "rtl8192DU\\rtl8192dfw.bin"
  126113. +
  126114. + #define RTL8192D_PHY_REG "rtl8192DU\\PHY_REG.txt"
  126115. + #define RTL8192D_PHY_REG_PG "rtl8192DU\\PHY_REG_PG.txt"
  126116. + #define RTL8192D_PHY_REG_MP "rtl8192DU\\PHY_REG_MP.txt"
  126117. +
  126118. + #define RTL8192D_AGC_TAB "rtl8192DU\\AGC_TAB.txt"
  126119. + #define RTL8192D_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G.txt"
  126120. + #define RTL8192D_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G.txt"
  126121. + #define RTL8192D_PHY_RADIO_A "rtl8192DU\\radio_a.txt"
  126122. + #define RTL8192D_PHY_RADIO_B "rtl8192DU\\radio_b.txt"
  126123. + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DU\\radio_a_intPA.txt"
  126124. + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DU\\radio_b_intPA.txt"
  126125. + #define RTL8192D_PHY_MACREG "rtl8192DU\\MAC_REG.txt"
  126126. +
  126127. +//---------------------------------------------------------------------
  126128. +// RTL8192DU From header
  126129. +//---------------------------------------------------------------------
  126130. +
  126131. + // Fw Array
  126132. + #define Rtl8192D_FwImageArray Rtl8192DUFwImgArray
  126133. +#ifdef CONFIG_WOWLAN
  126134. + #define Rtl8192D_FwWWImageArray Rtl8192DUFwWWImgArray
  126135. +#endif //CONFIG_WOWLAN
  126136. + // MAC/BB/PHY Array
  126137. + #define Rtl8192D_MAC_Array Rtl8192DUMAC_2T_Array
  126138. + #define Rtl8192D_AGCTAB_Array Rtl8192DUAGCTAB_Array
  126139. + #define Rtl8192D_AGCTAB_5GArray Rtl8192DUAGCTAB_5GArray
  126140. + #define Rtl8192D_AGCTAB_2GArray Rtl8192DUAGCTAB_2GArray
  126141. + #define Rtl8192D_AGCTAB_2TArray Rtl8192DUAGCTAB_2TArray
  126142. + #define Rtl8192D_AGCTAB_1TArray Rtl8192DUAGCTAB_1TArray
  126143. + #define Rtl8192D_PHY_REG_2TArray Rtl8192DUPHY_REG_2TArray
  126144. + #define Rtl8192D_PHY_REG_1TArray Rtl8192DUPHY_REG_1TArray
  126145. + #define Rtl8192D_PHY_REG_Array_PG Rtl8192DUPHY_REG_Array_PG
  126146. + #define Rtl8192D_PHY_REG_Array_MP Rtl8192DUPHY_REG_Array_MP
  126147. + #define Rtl8192D_RadioA_2TArray Rtl8192DURadioA_2TArray
  126148. + #define Rtl8192D_RadioA_1TArray Rtl8192DURadioA_1TArray
  126149. + #define Rtl8192D_RadioB_2TArray Rtl8192DURadioB_2TArray
  126150. + #define Rtl8192D_RadioB_1TArray Rtl8192DURadioB_1TArray
  126151. + #define Rtl8192D_RadioA_2T_intPAArray Rtl8192DURadioA_2T_intPAArray
  126152. + #define Rtl8192D_RadioB_2T_intPAArray Rtl8192DURadioB_2T_intPAArray
  126153. +
  126154. + // Array length
  126155. + #define Rtl8192D_FwImageArrayLength Rtl8192DUImgArrayLength
  126156. + #define Rtl8192D_MAC_ArrayLength Rtl8192DUMAC_2T_ArrayLength
  126157. + #define Rtl8192D_AGCTAB_5GArrayLength Rtl8192DUAGCTAB_5GArrayLength
  126158. + #define Rtl8192D_AGCTAB_2GArrayLength Rtl8192DUAGCTAB_2GArrayLength
  126159. + #define Rtl8192D_AGCTAB_2TArrayLength Rtl8192DUAGCTAB_2TArrayLength
  126160. + #define Rtl8192D_AGCTAB_1TArrayLength Rtl8192DUAGCTAB_1TArrayLength
  126161. + #define Rtl8192D_AGCTAB_ArrayLength Rtl8192DUAGCTAB_ArrayLength
  126162. + #define Rtl8192D_PHY_REG_2TArrayLength Rtl8192DUPHY_REG_2TArrayLength
  126163. + #define Rtl8192D_PHY_REG_1TArrayLength Rtl8192DUPHY_REG_1TArrayLength
  126164. + #define Rtl8192D_PHY_REG_Array_PGLength Rtl8192DUPHY_REG_Array_PGLength
  126165. + #define Rtl8192D_PHY_REG_Array_MPLength Rtl8192DUPHY_REG_Array_MPLength
  126166. + #define Rtl8192D_RadioA_2TArrayLength Rtl8192DURadioA_2TArrayLength
  126167. + #define Rtl8192D_RadioB_2TArrayLength Rtl8192DURadioB_2TArrayLength
  126168. + #define Rtl8192D_RadioA_2T_intPAArrayLength Rtl8192DURadioA_2T_intPAArrayLength
  126169. + #define Rtl8192D_RadioB_2T_intPAArrayLength Rtl8192DURadioB_2T_intPAArrayLength
  126170. +
  126171. + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24.
  126172. +/* #define Rtl819XFwImageArray Rtl8192DUFwImgArray
  126173. + #define Rtl819XMAC_Array Rtl8192DUMAC_2TArray
  126174. + #define Rtl819XAGCTAB_Array Rtl8192DUAGCTAB_Array
  126175. + #define Rtl819XAGCTAB_5GArray Rtl8192DUAGCTAB_5GArray
  126176. + #define Rtl819XAGCTAB_2GArray Rtl8192DUAGCTAB_2GArray
  126177. + #define Rtl819XPHY_REG_2TArray Rtl8192DUPHY_REG_2TArray
  126178. + #define Rtl819XPHY_REG_1TArray Rtl8192DUPHY_REG_1TArray
  126179. + #define Rtl819XRadioA_2TArray Rtl8192DURadioA_2TArray
  126180. + #define Rtl819XRadioA_1TArray Rtl8192DURadioA_1TArray
  126181. + #define Rtl819XRadioA_2T_intPAArray Rtl8192DURadioA_2T_intPAArray
  126182. + #define Rtl819XRadioB_2TArray Rtl8192DURadioB_2TArray
  126183. + #define Rtl819XRadioB_1TArray Rtl8192DURadioB_1TArray
  126184. + #define Rtl819XRadioB_2T_intPAArray Rtl8192DURadioB_2T_intPAArray
  126185. + #define Rtl819XPHY_REG_Array_PG Rtl8192DUPHY_REG_Array_PG
  126186. + #define Rtl819XPHY_REG_Array_MP Rtl8192DUPHY_REG_Array_MP
  126187. +
  126188. + #define Rtl819XAGCTAB_2TArray Rtl8192DUAGCTAB_2TArray
  126189. + #define Rtl819XAGCTAB_1TArray Rtl8192DUAGCTAB_1TArray*/
  126190. +
  126191. +#endif
  126192. +
  126193. +#define DRVINFO_SZ 4 // unit is 8bytes
  126194. +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0))
  126195. +
  126196. +//
  126197. +// Check if FW header exists. We do not consider the lower 4 bits in this case.
  126198. +// By tynli. 2009.12.04.
  126199. +//
  126200. +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\
  126201. + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\
  126202. + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D0 ||\
  126203. + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D1 ||\
  126204. + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D2 ||\
  126205. + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D3 )
  126206. +
  126207. +#define FW_8192D_SIZE 0x8020 // Max FW len = 32k + 32(FW header length).
  126208. +#define FW_8192D_START_ADDRESS 0x1000
  126209. +#define FW_8192D_END_ADDRESS 0x1FFF
  126210. +
  126211. +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes
  126212. +
  126213. +typedef enum _FIRMWARE_SOURCE{
  126214. + FW_SOURCE_IMG_FILE = 0,
  126215. + FW_SOURCE_HEADER_FILE = 1, //from header file
  126216. +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE;
  126217. +
  126218. +typedef struct _RT_FIRMWARE{
  126219. + FIRMWARE_SOURCE eFWSource;
  126220. + u8* szFwBuffer;
  126221. + u32 ulFwLength;
  126222. +#ifdef CONFIG_WOWLAN
  126223. + u8* szWoWLANFwBuffer;
  126224. + u32 ulWoWLANFwLength;
  126225. +#endif //CONFIG_WOWLAN
  126226. +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92D, *PRT_FIRMWARE_92D;
  126227. +
  126228. +//
  126229. +// This structure must be cared byte-ordering
  126230. +//
  126231. +// Added by tynli. 2009.12.04.
  126232. +typedef struct _RT_8192D_FIRMWARE_HDR {//8-byte alinment required
  126233. +
  126234. + //--- LONG WORD 0 ----
  126235. + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut
  126236. + u8 Category; // AP/NIC and USB/PCI
  126237. + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions
  126238. + u16 Version; // FW Version
  126239. + u8 Subversion; // FW Subversion, default 0x00
  126240. + u8 Rsvd1;
  126241. +
  126242. +
  126243. + //--- LONG WORD 1 ----
  126244. + u8 Month; // Release time Month field
  126245. + u8 Date; // Release time Date field
  126246. + u8 Hour; // Release time Hour field
  126247. + u8 Minute; // Release time Minute field
  126248. + u16 RamCodeSize; // The size of RAM code
  126249. + u16 Rsvd2;
  126250. +
  126251. + //--- LONG WORD 2 ----
  126252. + u32 SvnIdx; // The SVN entry index
  126253. + u32 Rsvd3;
  126254. +
  126255. + //--- LONG WORD 3 ----
  126256. + u32 Rsvd4;
  126257. + u32 Rsvd5;
  126258. +
  126259. +}RT_8192D_FIRMWARE_HDR, *PRT_8192D_FIRMWARE_HDR;
  126260. +
  126261. +#define DRIVER_EARLY_INT_TIME 0x05
  126262. +#define BCN_DMA_ATIME_INT_TIME 0x02
  126263. +
  126264. +typedef enum _BT_CoType{
  126265. + BT_2Wire = 0,
  126266. + BT_ISSC_3Wire = 1,
  126267. + BT_Accel = 2,
  126268. + BT_CSR = 3,
  126269. + BT_CSR_ENHAN = 4,
  126270. + BT_RTL8756 = 5,
  126271. +} BT_CoType, *PBT_CoType;
  126272. +
  126273. +typedef enum _BT_CurState{
  126274. + BT_OFF = 0,
  126275. + BT_ON = 1,
  126276. +} BT_CurState, *PBT_CurState;
  126277. +
  126278. +typedef enum _BT_ServiceType{
  126279. + BT_SCO = 0,
  126280. + BT_A2DP = 1,
  126281. + BT_HID = 2,
  126282. + BT_HID_Idle = 3,
  126283. + BT_Scan = 4,
  126284. + BT_Idle = 5,
  126285. + BT_OtherAction = 6,
  126286. + BT_Busy = 7,
  126287. + BT_OtherBusy = 8,
  126288. +} BT_ServiceType, *PBT_ServiceType;
  126289. +
  126290. +typedef enum _BT_RadioShared{
  126291. + BT_Radio_Shared = 0,
  126292. + BT_Radio_Individual = 1,
  126293. +} BT_RadioShared, *PBT_RadioShared;
  126294. +
  126295. +typedef struct _BT_COEXIST_STR{
  126296. + u8 BluetoothCoexist;
  126297. + u8 BT_Ant_Num;
  126298. + u8 BT_CoexistType;
  126299. + u8 BT_State;
  126300. + u8 BT_CUR_State; //0:on, 1:off
  126301. + u8 BT_Ant_isolation; //0:good, 1:bad
  126302. + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic
  126303. + u8 BT_Service;
  126304. + u8 BT_RadioSharedType;
  126305. + u8 Ratio_Tx;
  126306. + u8 Ratio_PRI;
  126307. +}BT_COEXIST_STR, *PBT_COEXIST_STR;
  126308. +
  126309. +//Added for 92D IQK setting.
  126310. +typedef struct _IQK_MATRIX_REGS_SETTING{
  126311. + BOOLEAN bIQKDone;
  126312. +#if 1
  126313. + int Value[1][IQK_Matrix_REG_NUM];
  126314. +#else
  126315. + u32 Mark[IQK_Matrix_REG_NUM];
  126316. + u32 Value[IQK_Matrix_REG_NUM];
  126317. +#endif
  126318. +}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;
  126319. +
  126320. +#ifdef CONFIG_USB_RX_AGGREGATION
  126321. +
  126322. +typedef enum _USB_RX_AGG_MODE{
  126323. + USB_RX_AGG_DISABLE,
  126324. + USB_RX_AGG_DMA,
  126325. + USB_RX_AGG_USB,
  126326. + USB_RX_AGG_DMA_USB
  126327. +}USB_RX_AGG_MODE;
  126328. +
  126329. +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer
  126330. +
  126331. +#endif
  126332. +
  126333. +
  126334. +#define TX_SELE_HQ BIT(0) // High Queue
  126335. +#define TX_SELE_LQ BIT(1) // Low Queue
  126336. +#define TX_SELE_NQ BIT(2) // Normal Queue
  126337. +
  126338. +
  126339. +// Note: We will divide number of page equally for each queue other than public queue!
  126340. +
  126341. +#define TX_TOTAL_PAGE_NUMBER 0xF8
  126342. +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1)
  126343. +
  126344. +// For Normal Chip Setting
  126345. +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER
  126346. +#define NORMAL_PAGE_NUM_PUBQ 0x56
  126347. +
  126348. +
  126349. +// For Test Chip Setting
  126350. +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER
  126351. +#define TEST_PAGE_NUM_PUBQ_92DU 0x89
  126352. +#define TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC 0x7A
  126353. +#define NORMAL_PAGE_NUM_PUBQ_92D_DUAL_MAC 0x5A
  126354. +#define NORMAL_PAGE_NUM_HPQ_92D_DUAL_MAC 0x10
  126355. +#define NORMAL_PAGE_NUM_LPQ_92D_DUAL_MAC 0x10
  126356. +#define NORMAL_PAGE_NUM_NORMALQ_92D_DUAL_MAC 0
  126357. +
  126358. +#define TX_PAGE_BOUNDARY_DUAL_MAC (TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC + 1)
  126359. +
  126360. +// For Test Chip Setting
  126361. +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5
  126362. +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6
  126363. +
  126364. +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3
  126365. +#define WMM_TEST_PAGE_NUM_HPQ 0x29
  126366. +#define WMM_TEST_PAGE_NUM_LPQ 0x29
  126367. +
  126368. +
  126369. +//Note: For Normal Chip Setting ,modify later
  126370. +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5
  126371. +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6
  126372. +
  126373. +#define WMM_NORMAL_PAGE_NUM_PUBQ_92D 0X65//0x82
  126374. +#define WMM_NORMAL_PAGE_NUM_HPQ_92D 0X30//0x29
  126375. +#define WMM_NORMAL_PAGE_NUM_LPQ_92D 0X30
  126376. +#define WMM_NORMAL_PAGE_NUM_NPQ_92D 0X30
  126377. +
  126378. +#define WMM_NORMAL_PAGE_NUM_PUBQ_92D_DUAL_MAC 0X32
  126379. +#define WMM_NORMAL_PAGE_NUM_HPQ_92D_DUAL_MAC 0X18
  126380. +#define WMM_NORMAL_PAGE_NUM_LPQ_92D_DUAL_MAC 0X18
  126381. +#define WMM_NORMAL_PAGE_NUM_NPQ_92D_DUAL_MAC 0X18
  126382. +
  126383. +//-------------------------------------------------------------------------
  126384. +// Chip specific
  126385. +//-------------------------------------------------------------------------
  126386. +
  126387. +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
  126388. +#define CHIP_BONDING_92C_1T2R 0x1
  126389. +#define CHIP_BONDING_88C_USB_MCARD 0x2
  126390. +#define CHIP_BONDING_88C_USB_HP 0x1
  126391. +
  126392. +//
  126393. +// 2011.01.06. Define new structure of chip version for RTL8723 and so on. Added by tynli.
  126394. +//
  126395. +/*
  126396. + | BIT15:12 | BIT11:8 | BIT 7 | BIT6:4 | BIT3 | BIT2:0 |
  126397. + |-------------+-----------+-----------+-------+-----------+-------|
  126398. + | IC version(CUT) | ROM version | Manufacturer | RF type | Chip type | IC Type |
  126399. + | | | TSMC/UMC | | TEST/NORMAL| |
  126400. +*/
  126401. +// [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3
  126402. +// [7] Manufacturer: TSMC=0, UMC=1
  126403. +// [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2
  126404. +// [3] Chip type: TEST=0, NORMAL=1
  126405. +// [2:0] IC type: 81xxC=0, 8723=1, 92D=2
  126406. +
  126407. +#define CHIP_8723 BIT(0)
  126408. +#define CHIP_92D BIT(1)
  126409. +#define NORMAL_CHIP BIT(3)
  126410. +#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
  126411. +#define RF_TYPE_1T2R BIT(4)
  126412. +#define RF_TYPE_2T2R BIT(5)
  126413. +#define CHIP_VENDOR_UMC BIT(7)
  126414. +#define B_CUT_VERSION BIT(12)
  126415. +#define C_CUT_VERSION BIT(13)
  126416. +#define D_CUT_VERSION ((BIT(12)|BIT(13)))
  126417. +#define E_CUT_VERSION BIT(14)
  126418. +
  126419. +
  126420. +// MASK
  126421. +#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
  126422. +#define CHIP_TYPE_MASK BIT(3)
  126423. +#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
  126424. +#define MANUFACTUER_MASK BIT(7)
  126425. +#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
  126426. +#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
  126427. +
  126428. +// Get element
  126429. +#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
  126430. +#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
  126431. +#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
  126432. +#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
  126433. +#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
  126434. +#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
  126435. +
  126436. +#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0)? _TRUE : _FALSE)
  126437. +#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723)? _TRUE : _FALSE)
  126438. +#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_92D)? _TRUE : _FALSE)
  126439. +#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version))? _FALSE : _TRUE)
  126440. +#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? _TRUE : _FALSE)
  126441. +#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? _TRUE : _FALSE)
  126442. +#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version))? _TRUE: _FALSE)
  126443. +
  126444. +#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? _TRUE : _FALSE)
  126445. +#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE)
  126446. +#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE)
  126447. +// <tynli_Note> 88/92C UMC B-cut vendor is set to TSMC so we need to check CHIP_VENDOR_UMC bit is not 1.
  126448. +#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? _TRUE : _FALSE):_FALSE)
  126449. +#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? _TRUE: _FALSE) : _FALSE)
  126450. +
  126451. +#define IS_92D_C_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? _TRUE : _FALSE) : _FALSE)
  126452. +#define IS_92D_D_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? _TRUE : _FALSE) : _FALSE)
  126453. +#define IS_92D_E_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? _TRUE : _FALSE) : _FALSE)
  126454. +#define IS_NORMAL_CHIP92D(version) ((GET_CVID_CHIP_TYPE(version))? _TRUE: _FALSE)
  126455. +
  126456. +typedef enum _VERSION_8192D{
  126457. + VERSION_TEST_CHIP_88C = 0x0000,
  126458. + VERSION_TEST_CHIP_92C = 0x0020,
  126459. + VERSION_TEST_UMC_CHIP_8723 = 0x0081,
  126460. + VERSION_NORMAL_TSMC_CHIP_88C = 0x0008,
  126461. + VERSION_NORMAL_TSMC_CHIP_92C = 0x0028,
  126462. + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018,
  126463. + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088,
  126464. + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8,
  126465. + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098,
  126466. + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089,
  126467. + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089,
  126468. + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088,
  126469. + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8,
  126470. + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090,
  126471. + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x0022,
  126472. + VERSION_TEST_CHIP_92D_DUALPHY = 0x0002,
  126473. + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x002a,
  126474. + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a,
  126475. + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a,
  126476. + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a,
  126477. + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a,
  126478. + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a,
  126479. + VERSION_NORMAL_CHIP_92D_E_CUT_SINGLEPHY = 0x402a,
  126480. + VERSION_NORMAL_CHIP_92D_E_CUT_DUALPHY = 0x400a,
  126481. +}VERSION_8192D,*PVERSION_8192D;
  126482. +
  126483. +
  126484. +//-------------------------------------------------------------------------
  126485. +// Channel Plan
  126486. +//-------------------------------------------------------------------------
  126487. +enum ChannelPlan{
  126488. + CHPL_FCC = 0,
  126489. + CHPL_IC = 1,
  126490. + CHPL_ETSI = 2,
  126491. + CHPL_SPAIN = 3,
  126492. + CHPL_FRANCE = 4,
  126493. + CHPL_MKK = 5,
  126494. + CHPL_MKK1 = 6,
  126495. + CHPL_ISRAEL = 7,
  126496. + CHPL_TELEC = 8,
  126497. + CHPL_GLOBAL = 9,
  126498. + CHPL_WORLD = 10,
  126499. +};
  126500. +
  126501. +typedef struct _TxPowerInfo{
  126502. + u8 CCKIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126503. + u8 HT40_1SIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126504. + u8 HT40_2SIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126505. + s8 HT20IndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126506. + u8 OFDMIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126507. + u8 HT40MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126508. + u8 HT20MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX];
  126509. + u8 TSSI_A[3];
  126510. + u8 TSSI_B[3];
  126511. + u8 TSSI_A_5G[3]; //5GL/5GM/5GH
  126512. + u8 TSSI_B_5G[3];
  126513. +}TxPowerInfo, *PTxPowerInfo;
  126514. +
  126515. +#define EFUSE_REAL_CONTENT_LEN 1024
  126516. +#define EFUSE_MAP_LEN 256
  126517. +#define EFUSE_MAX_SECTION 32
  126518. +#define EFUSE_MAX_SECTION_BASE 16
  126519. +// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section
  126520. +// 9bytes + 1byt + 5bytes and pre 1byte.
  126521. +// For worst case:
  126522. +// | 2byte|----8bytes----|1byte|--7bytes--| //92D
  126523. +#define EFUSE_OOB_PROTECT_BYTES 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.
  126524. +
  126525. +typedef enum _PA_MODE {
  126526. + PA_MODE_EXTERNAL = 0x00,
  126527. + PA_MODE_INTERNAL_SP3T = 0x01,
  126528. + PA_MODE_INTERNAL_SPDT = 0x02
  126529. +} PA_MODE;
  126530. +
  126531. +/* Copy from rtl8192c */
  126532. +enum c2h_id_8192d {
  126533. + C2H_DBG = 0,
  126534. + C2H_TSF = 1,
  126535. + C2H_AP_RPT_RSP = 2,
  126536. + C2H_CCX_TX_RPT = 3,
  126537. + C2H_BT_RSSI = 4,
  126538. + C2H_BT_OP_MODE = 5,
  126539. + C2H_EXT_RA_RPT = 6,
  126540. + C2H_HW_INFO_EXCH = 10,
  126541. + C2H_C2H_H2C_TEST = 11,
  126542. + C2H_BT_INFO = 12,
  126543. + C2H_BT_MP_INFO = 15,
  126544. + MAX_C2HEVENT
  126545. +};
  126546. +
  126547. +#ifdef CONFIG_PCI_HCI
  126548. +struct hal_data_8192de
  126549. +{
  126550. + VERSION_8192D VersionID;
  126551. +
  126552. + // add for 92D Phy mode/mac/Band mode
  126553. + MACPHY_MODE_8192D MacPhyMode92D;
  126554. + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G
  126555. + BAND_TYPE BandSet92D;
  126556. + BOOLEAN bIsVS;
  126557. + BOOLEAN bSupportRemoteWakeUp;
  126558. + u8 AutoLoadStatusFor8192D;
  126559. +
  126560. + BOOLEAN bNOPG;
  126561. +
  126562. + BOOLEAN bMasterOfDMSP;
  126563. + BOOLEAN bSlaveOfDMSP;
  126564. +
  126565. + u16 CustomerID;
  126566. +
  126567. + u16 FirmwareVersion;
  126568. + u16 FirmwareVersionRev;
  126569. + u16 FirmwareSubVersion;
  126570. +
  126571. + u32 IntrMask[2];
  126572. + u32 IntrMaskToSet[2];
  126573. +
  126574. + u32 DisabledFunctions;
  126575. +
  126576. + //current WIFI_PHY values
  126577. + u32 ReceiveConfig;
  126578. + u32 TransmitConfig;
  126579. + WIRELESS_MODE CurrentWirelessMode;
  126580. + HT_CHANNEL_WIDTH CurrentChannelBW;
  126581. + u8 CurrentChannel;
  126582. + u8 nCur40MhzPrimeSC;// Control channel sub-carrier
  126583. + u16 BasicRateSet;
  126584. +
  126585. + //rf_ctrl
  126586. + u8 rf_chip;
  126587. + u8 rf_type;
  126588. + u8 NumTotalRFPath;
  126589. +
  126590. + //
  126591. + // EEPROM setting.
  126592. + //
  126593. + u16 EEPROMVID;
  126594. + u16 EEPROMDID;
  126595. + u16 EEPROMSVID;
  126596. + u16 EEPROMSMID;
  126597. + u16 EEPROMChannelPlan;
  126598. + u16 EEPROMVersion;
  126599. +
  126600. + u8 EEPROMCustomerID;
  126601. + u8 EEPROMBoardType;
  126602. + u8 EEPROMRegulatory;
  126603. +
  126604. + u8 EEPROMThermalMeter;
  126605. +
  126606. + u8 EEPROMC9;
  126607. + u8 EEPROMCC;
  126608. + u8 PAMode;
  126609. +
  126610. + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER_2G];
  126611. + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  126612. + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  126613. + s8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
  126614. + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
  126615. + // For power group
  126616. + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  126617. + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  126618. +
  126619. + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff
  126620. +
  126621. + u8 CrystalCap; // CrystalCap.
  126622. +
  126623. +#ifdef CONFIG_BT_COEXIST
  126624. + struct btcoexist_priv bt_coexist;
  126625. +#endif
  126626. +
  126627. + // Read/write are allow for following hardware information variables
  126628. + u8 framesync;
  126629. + u32 framesyncC34;
  126630. + u8 framesyncMonitor;
  126631. + u8 DefaultInitialGain[4];
  126632. + u8 pwrGroupCnt;
  126633. + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16];
  126634. + u32 CCKTxPowerLevelOriginalOffset;
  126635. +
  126636. + u32 AntennaTxPath; // Antenna path Tx
  126637. + u32 AntennaRxPath; // Antenna path Rx
  126638. + u8 BluetoothCoexist;
  126639. + u8 ExternalPA;
  126640. + u8 InternalPA5G[2]; //pathA / pathB
  126641. +
  126642. + //u32 LedControlNum;
  126643. + //u32 LedControlMode;
  126644. + //u32 TxPowerTrackControl;
  126645. + u8 b1x1RecvCombine; // for 1T1R receive combining
  126646. +
  126647. + u8 bCurrentTurboEDCA;
  126648. + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo.
  126649. +
  126650. + //vivi, for tx power tracking, 20080407
  126651. + //u16 TSSI_13dBm;
  126652. + //u32 Pwr_Track;
  126653. + // The current Tx Power Level
  126654. + u8 CurrentCckTxPwrIdx;
  126655. + u8 CurrentOfdm24GTxPwrIdx;
  126656. +
  126657. + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D
  126658. +
  126659. + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now.
  126660. +
  126661. + u32 RfRegChnlVal[2];
  126662. +
  126663. + u8 bCckHighPower;
  126664. +
  126665. + BOOLEAN bPhyValueInitReady;
  126666. +
  126667. + BOOLEAN bTXPowerDataReadFromEEPORM;
  126668. +
  126669. + BOOLEAN bInSetPower;
  126670. +
  126671. + //RDG enable
  126672. + BOOLEAN bRDGEnable;
  126673. +
  126674. + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress
  126675. + BOOLEAN bNeedIQK;
  126676. +
  126677. + BOOLEAN bLCKInProgress;
  126678. +
  126679. + BOOLEAN bEarlyModeEnable;
  126680. +
  126681. +#if 1
  126682. + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];
  126683. +#else
  126684. + //regc80﹜regc94﹜regc4c﹜regc88﹜regc9c﹜regc14﹜regca0﹜regc1c﹜regc78
  126685. + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM];
  126686. + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel.
  126687. +#endif
  126688. +
  126689. + //for host message to fw
  126690. + u8 LastHMEBoxNum;
  126691. +
  126692. + u8 fw_ractrl;
  126693. + // Beacon function related global variable.
  126694. + u32 RegBcnCtrlVal;
  126695. + u8 RegTxPause;
  126696. + u8 RegFwHwTxQCtrl;
  126697. + u8 RegReg542;
  126698. + u8 RegCR_1;
  126699. +
  126700. + struct dm_priv dmpriv;
  126701. +
  126702. + u8 bInterruptMigration;
  126703. +
  126704. + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.
  126705. +
  126706. + // Add for dual MAC 0--Mac0 1--Mac1
  126707. + u32 interfaceIndex;
  126708. +
  126709. + u16 RegRRSR;
  126710. +
  126711. + u16 EfuseUsedBytes;
  126712. + u8 RTSInitRate; // 2010.11.24.by tynli.
  126713. +#ifdef CONFIG_P2P
  126714. + struct P2P_PS_Offload_t p2p_ps_offload;
  126715. +#endif //CONFIG_P2P
  126716. +};
  126717. +
  126718. +typedef struct hal_data_8192de HAL_DATA_TYPE, *PHAL_DATA_TYPE;
  126719. +
  126720. +//
  126721. +// Function disabled.
  126722. +//
  126723. +#define DF_TX_BIT BIT0
  126724. +#define DF_RX_BIT BIT1
  126725. +#define DF_IO_BIT BIT2
  126726. +#define DF_IO_D3_BIT BIT3
  126727. +
  126728. +#define RT_DF_TYPE u32
  126729. +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits)))
  126730. +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits))))
  126731. +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )
  126732. +
  126733. +void InterruptRecognized8192DE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent);
  126734. +VOID UpdateInterruptMask8192DE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR);
  126735. +#endif
  126736. +
  126737. +#ifdef CONFIG_USB_HCI
  126738. +
  126739. +//should be renamed and moved to another file
  126740. +typedef enum _INTERFACE_SELECT_8192DUSB{
  126741. + INTF_SEL0_USB = 0, // USB
  126742. + INTF_SEL1_MINICARD = 1, // Minicard
  126743. + INTF_SEL2_EKB_PRO = 2, // Eee keyboard proprietary
  126744. + INTF_SEL3_PRO = 3, // Customized proprietary
  126745. +} INTERFACE_SELECT_8192DUSB, *PINTERFACE_SELECT_8192DUSB;
  126746. +
  126747. +typedef INTERFACE_SELECT_8192DUSB INTERFACE_SELECT_USB;
  126748. +
  126749. +struct hal_data_8192du
  126750. +{
  126751. + VERSION_8192D VersionID;
  126752. +
  126753. + // add for 92D Phy mode/mac/Band mode
  126754. + MACPHY_MODE_8192D MacPhyMode92D;
  126755. + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G
  126756. + BAND_TYPE BandSet92D;
  126757. + BOOLEAN bIsVS;
  126758. +
  126759. + BOOLEAN bNOPG;
  126760. +
  126761. + BOOLEAN bSupportRemoteWakeUp;
  126762. + BOOLEAN bMasterOfDMSP;
  126763. + BOOLEAN bSlaveOfDMSP;
  126764. +#ifdef CONFIG_DUALMAC_CONCURRENT
  126765. + BOOLEAN bInModeSwitchProcess;
  126766. +#endif
  126767. +
  126768. + u16 CustomerID;
  126769. +
  126770. + u16 FirmwareVersion;
  126771. + u16 FirmwareVersionRev;
  126772. + u16 FirmwareSubVersion;
  126773. +
  126774. + //current WIFI_PHY values
  126775. + u32 ReceiveConfig;
  126776. + WIRELESS_MODE CurrentWirelessMode;
  126777. + HT_CHANNEL_WIDTH CurrentChannelBW;
  126778. + u8 CurrentChannel;
  126779. + u8 nCur40MhzPrimeSC;// Control channel sub-carrier
  126780. + u16 BasicRateSet;
  126781. +
  126782. + INTERFACE_SELECT_8192DUSB InterfaceSel;
  126783. +
  126784. + //rf_ctrl
  126785. + u8 rf_chip;
  126786. + u8 rf_type;
  126787. + u8 NumTotalRFPath;
  126788. +
  126789. + //
  126790. + // EEPROM setting.
  126791. + //
  126792. + u8 EEPROMVersion;
  126793. + u16 EEPROMVID;
  126794. + u16 EEPROMPID;
  126795. + u16 EEPROMSVID;
  126796. + u16 EEPROMSDID;
  126797. + u8 EEPROMCustomerID;
  126798. + u8 EEPROMSubCustomerID;
  126799. + u8 EEPROMRegulatory;
  126800. +
  126801. + u8 EEPROMThermalMeter;
  126802. +
  126803. + u8 EEPROMC9;
  126804. + u8 EEPROMCC;
  126805. + u8 PAMode;
  126806. +
  126807. + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER_2G];
  126808. + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  126809. + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
  126810. + s8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
  126811. + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
  126812. + // For power group
  126813. + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  126814. + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER];
  126815. +
  126816. + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff
  126817. +
  126818. + u8 CrystalCap; // CrystalCap.
  126819. +
  126820. +#ifdef CONFIG_BT_COEXIST
  126821. + struct btcoexist_priv bt_coexist;
  126822. +#endif
  126823. +
  126824. + // Read/write are allow for following hardware information variables
  126825. + u8 framesync;
  126826. + u32 framesyncC34;
  126827. + u8 framesyncMonitor;
  126828. + u8 DefaultInitialGain[4];
  126829. + u8 pwrGroupCnt;
  126830. + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16];
  126831. + u32 CCKTxPowerLevelOriginalOffset;
  126832. +
  126833. + u32 AntennaTxPath; // Antenna path Tx
  126834. + u32 AntennaRxPath; // Antenna path Rx
  126835. + u8 BluetoothCoexist;
  126836. + u8 ExternalPA;
  126837. + u8 InternalPA5G[2]; //pathA / pathB
  126838. +
  126839. + //u32 LedControlNum;
  126840. + //u32 LedControlMode;
  126841. + //u32 TxPowerTrackControl;
  126842. + u8 b1x1RecvCombine; // for 1T1R receive combining
  126843. +
  126844. + u8 bCurrentTurboEDCA;
  126845. + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo.
  126846. +
  126847. + //vivi, for tx power tracking, 20080407
  126848. + //u16 TSSI_13dBm;
  126849. + //u32 Pwr_Track;
  126850. + // The current Tx Power Level
  126851. + u8 CurrentCckTxPwrIdx;
  126852. + u8 CurrentOfdm24GTxPwrIdx;
  126853. +
  126854. + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D
  126855. +
  126856. + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now.
  126857. +
  126858. + u32 RfRegChnlVal[2];
  126859. +
  126860. + u8 bCckHighPower;
  126861. +
  126862. + BOOLEAN bPhyValueInitReady;
  126863. +
  126864. + BOOLEAN bTXPowerDataReadFromEEPORM;
  126865. +
  126866. + BOOLEAN bInSetPower;
  126867. +
  126868. + //RDG enable
  126869. + BOOLEAN bRDGEnable;
  126870. +
  126871. + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress
  126872. + BOOLEAN bNeedIQK;
  126873. +
  126874. + BOOLEAN bLCKInProgress;
  126875. +
  126876. + BOOLEAN bEarlyModeEnable;
  126877. +
  126878. +#if 1
  126879. + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];
  126880. +#else
  126881. + //regc80﹜regc94﹜regc4c﹜regc88﹜regc9c﹜regc14﹜regca0﹜regc1c﹜regc78
  126882. + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM];
  126883. + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel.
  126884. +#endif
  126885. +
  126886. + //for host message to fw
  126887. + u8 LastHMEBoxNum;
  126888. +
  126889. + u8 fw_ractrl;
  126890. + // Beacon function related global variable.
  126891. + u32 RegBcnCtrlVal;
  126892. + u8 RegTxPause;
  126893. + u8 RegFwHwTxQCtrl;
  126894. + u8 RegReg542;
  126895. + u8 RegCR_1;
  126896. +
  126897. + struct dm_priv dmpriv;
  126898. +
  126899. + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.
  126900. +
  126901. + //Query RF by FW
  126902. + BOOLEAN bReadRFbyFW;
  126903. +
  126904. + // For 92C USB endpoint setting
  126905. + //
  126906. +
  126907. + u32 UsbBulkOutSize;
  126908. +
  126909. + int RtBulkOutPipe[3];
  126910. + int RtBulkInPipe;
  126911. + int RtIntInPipe;
  126912. +
  126913. + // Add for dual MAC 0--Mac0 1--Mac1
  126914. + u32 interfaceIndex;
  126915. +
  126916. + u8 OutEpQueueSel;
  126917. + u8 OutEpNumber;
  126918. +
  126919. + u8 Queue2EPNum[8];//for out endpoint number mapping
  126920. +
  126921. +#ifdef CONFIG_USB_TX_AGGREGATION
  126922. + u8 UsbTxAggMode;
  126923. + u8 UsbTxAggDescNum;
  126924. +#endif
  126925. +#ifdef CONFIG_USB_RX_AGGREGATION
  126926. + u16 HwRxPageSize; // Hardware setting
  126927. + u32 MaxUsbRxAggBlock;
  126928. +
  126929. + USB_RX_AGG_MODE UsbRxAggMode;
  126930. + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed
  126931. + u8 UsbRxAggBlockTimeout;
  126932. + u8 UsbRxAggPageCount; // 8192C DMA page count
  126933. + u8 UsbRxAggPageTimeout;
  126934. +#endif
  126935. +
  126936. + u16 RegRRSR;
  126937. +
  126938. + u16 EfuseUsedBytes;
  126939. + u8 RTSInitRate; // 2010.11.24.by tynli.
  126940. +#ifdef CONFIG_P2P
  126941. + struct P2P_PS_Offload_t p2p_ps_offload;
  126942. +#endif //CONFIG_P2P
  126943. +};
  126944. +
  126945. +typedef struct hal_data_8192du HAL_DATA_TYPE, *PHAL_DATA_TYPE;
  126946. +#endif
  126947. +
  126948. +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData))
  126949. +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type)
  126950. +
  126951. +int FirmwareDownload92D(IN PADAPTER Adapter,IN BOOLEAN bUsedWoWLANFw);
  126952. +VOID rtl8192d_FirmwareSelfReset(IN PADAPTER Adapter);
  126953. +void rtl8192d_ReadChipVersion(IN PADAPTER Adapter);
  126954. +VOID rtl8192d_EfuseParseChnlPlan(PADAPTER Adapter, u8 *hwinfo, BOOLEAN AutoLoadFail);
  126955. +VOID rtl8192d_ReadTxPowerInfo(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail);
  126956. +VOID rtl8192d_ResetDualMacSwitchVariables(IN PADAPTER Adapter);
  126957. +u8 GetEEPROMSize8192D(PADAPTER Adapter);
  126958. +BOOLEAN PHY_CheckPowerOffFor8192D(PADAPTER Adapter);
  126959. +VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter);
  126960. +//void PHY_ConfigMacPhyMode92D(PADAPTER Adapter);
  126961. +void rtl8192d_free_hal_data(_adapter * padapter);
  126962. +void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc);
  126963. +
  126964. +#endif
  126965. +
  126966. +#ifdef CONFIG_MP_INCLUDED
  126967. +
  126968. +
  126969. +extern void Hal_SetAntenna(PADAPTER pAdapter);
  126970. +extern void Hal_SetBandwidth(PADAPTER pAdapter);
  126971. +
  126972. +extern void Hal_SetTxPower(PADAPTER pAdapter);
  126973. +extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
  126974. +extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart );
  126975. +extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart);
  126976. +extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart);
  126977. +extern void Hal_SetBandwidth(PADAPTER pAdapter);
  126978. +
  126979. +extern void Hal_SetDataRate(PADAPTER pAdapter);
  126980. +extern void Hal_SetChannel(PADAPTER pAdapter);
  126981. +extern void Hal_SetAntennaPathPower(PADAPTER pAdapter);
  126982. +extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
  126983. +extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable);
  126984. +extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable);
  126985. +extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value);
  126986. +extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter);
  126987. +extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14);
  126988. +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven);
  126989. +extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower);
  126990. +extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower);
  126991. +extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter);
  126992. +extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
  126993. +extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
  126994. +extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
  126995. +
  126996. +
  126997. +#endif //end CONFIG_MP_INCLUDED
  126998. --- /dev/null
  126999. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h
  127000. @@ -0,0 +1,42 @@
  127001. +/******************************************************************************
  127002. + *
  127003. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  127004. + *
  127005. + * This program is free software; you can redistribute it and/or modify it
  127006. + * under the terms of version 2 of the GNU General Public License as
  127007. + * published by the Free Software Foundation.
  127008. + *
  127009. + * This program is distributed in the hope that it will be useful, but WITHOUT
  127010. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  127011. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  127012. + * more details.
  127013. + *
  127014. + * You should have received a copy of the GNU General Public License along with
  127015. + * this program; if not, write to the Free Software Foundation, Inc.,
  127016. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  127017. + *
  127018. + *
  127019. + ******************************************************************************/
  127020. +#ifndef __RTL8192D_LED_H_
  127021. +#define __RTL8192D_LED_H_
  127022. +
  127023. +#include <drv_conf.h>
  127024. +#include <osdep_service.h>
  127025. +#include <drv_types.h>
  127026. +
  127027. +
  127028. +//================================================================================
  127029. +// Interface to manipulate LED objects.
  127030. +//================================================================================
  127031. +#ifdef CONFIG_USB_HCI
  127032. +void rtl8192du_InitSwLeds(_adapter *padapter);
  127033. +void rtl8192du_DeInitSwLeds(_adapter *padapter);
  127034. +#endif
  127035. +
  127036. +#ifdef CONFIG_PCI_HCI
  127037. +void rtl8192de_gen_RefreshLedState(PADAPTER Adapter);
  127038. +void rtl8192de_InitSwLeds(_adapter *padapter);
  127039. +void rtl8192de_DeInitSwLeds(_adapter *padapter);
  127040. +#endif
  127041. +
  127042. +#endif
  127043. --- /dev/null
  127044. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h
  127045. @@ -0,0 +1,186 @@
  127046. +/******************************************************************************
  127047. + *
  127048. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  127049. + *
  127050. + * This program is free software; you can redistribute it and/or modify it
  127051. + * under the terms of version 2 of the GNU General Public License as
  127052. + * published by the Free Software Foundation.
  127053. + *
  127054. + * This program is distributed in the hope that it will be useful, but WITHOUT
  127055. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  127056. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  127057. + * more details.
  127058. + *
  127059. + * You should have received a copy of the GNU General Public License along with
  127060. + * this program; if not, write to the Free Software Foundation, Inc.,
  127061. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  127062. + *
  127063. + *
  127064. + ******************************************************************************/
  127065. +#ifndef _RTL8192D_RECV_H_
  127066. +#define _RTL8192D_RECV_H_
  127067. +
  127068. +#include <drv_conf.h>
  127069. +#include <osdep_service.h>
  127070. +#include <drv_types.h>
  127071. +
  127072. +
  127073. +#ifdef PLATFORM_OS_XP
  127074. + #ifdef CONFIG_SDIO_HCI
  127075. + #define NR_RECVBUFF 1024//512//128
  127076. + #else
  127077. + #define NR_RECVBUFF (16)
  127078. + #endif
  127079. +#elif defined(PLATFORM_OS_CE)
  127080. + #ifdef CONFIG_SDIO_HCI
  127081. + #define NR_RECVBUFF (128)
  127082. + #else
  127083. + #define NR_RECVBUFF (4)
  127084. + #endif
  127085. +#else
  127086. +#ifdef CONFIG_SINGLE_RECV_BUF
  127087. + #define NR_RECVBUFF (1)
  127088. +#else
  127089. + #define NR_RECVBUFF (4)
  127090. +#endif //CONFIG_SINGLE_RECV_BUF
  127091. + #define NR_PREALLOC_RECV_SKB (8)
  127092. +#endif
  127093. +
  127094. +
  127095. +
  127096. +#define RECV_BLK_SZ 512
  127097. +#define RECV_BLK_CNT 16
  127098. +#define RECV_BLK_TH RECV_BLK_CNT
  127099. +
  127100. +#if defined(CONFIG_USB_HCI)
  127101. +
  127102. +#ifdef PLATFORM_OS_CE
  127103. +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
  127104. +#else
  127105. + #ifndef CONFIG_MINIMAL_MEMORY_USAGE
  127106. + //#define MAX_RECVBUF_SZ (32768) // 32k
  127107. + //#define MAX_RECVBUF_SZ (16384) //16K
  127108. + //#define MAX_RECVBUF_SZ (10240) //10K
  127109. + #ifdef CONFIG_PLATFORM_MSTAR
  127110. + #define MAX_RECVBUF_SZ (8192) // 8K
  127111. + #else
  127112. + #define MAX_RECVBUF_SZ (15360) // 15k < 16k
  127113. + #endif
  127114. + #else
  127115. + #define MAX_RECVBUF_SZ (4000) // about 4K
  127116. + #endif
  127117. +#endif
  127118. +
  127119. +#elif defined(CONFIG_PCI_HCI)
  127120. +//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
  127121. +// #define MAX_RECVBUF_SZ (9100)
  127122. +//#else
  127123. + #define MAX_RECVBUF_SZ (4000) // about 4K
  127124. +//#endif
  127125. +
  127126. +#define RX_MPDU_QUEUE 0
  127127. +#define RX_CMD_QUEUE 1
  127128. +#define RX_MAX_QUEUE 2
  127129. +#endif
  127130. +
  127131. +#define RECV_BULK_IN_ADDR 0x80
  127132. +#define RECV_INT_IN_ADDR 0x81
  127133. +
  127134. +#define PHY_RSSI_SLID_WIN_MAX 100
  127135. +#define PHY_LINKQUALITY_SLID_WIN_MAX 20
  127136. +
  127137. +struct phy_stat
  127138. +{
  127139. + unsigned int phydw0;
  127140. +
  127141. + unsigned int phydw1;
  127142. +
  127143. + unsigned int phydw2;
  127144. +
  127145. + unsigned int phydw3;
  127146. +
  127147. + unsigned int phydw4;
  127148. +
  127149. + unsigned int phydw5;
  127150. +
  127151. + unsigned int phydw6;
  127152. +
  127153. + unsigned int phydw7;
  127154. +};
  127155. +
  127156. +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd
  127157. +{
  127158. + unsigned char trsw_gain_X[4];
  127159. + unsigned char pwdb_all;
  127160. + unsigned char cfosho_X[4];
  127161. + unsigned char cfotail_X[4];
  127162. + unsigned char rxevm_X[2];
  127163. + unsigned char rxsnr_X[4];
  127164. + unsigned char pdsnr_X[2];
  127165. + unsigned char csi_current_X[2];
  127166. + unsigned char csi_target_X[2];
  127167. + unsigned char sigevm;
  127168. + unsigned char max_ex_pwr;
  127169. +//#ifdef RTL8192SE
  127170. +#ifdef CONFIG_LITTLE_ENDIAN
  127171. + unsigned char ex_intf_flg:1;
  127172. + unsigned char sgi_en:1;
  127173. + unsigned char rxsc:2;
  127174. + //unsigned char rsvd:4;
  127175. + unsigned char idle_long:1;
  127176. + unsigned char r_ant_train_en:1;
  127177. + unsigned char ANTSELB:1;
  127178. + unsigned char ANTSEL:1;
  127179. +#else // _BIG_ENDIAN_
  127180. + //unsigned char rsvd:4;
  127181. + unsigned char ANTSEL:1;
  127182. + unsigned char ANTSELB:1;
  127183. + unsigned char r_ant_train_en:1;
  127184. + unsigned char idle_long:1;
  127185. + unsigned char rxsc:2;
  127186. + unsigned char sgi_en:1;
  127187. + unsigned char ex_intf_flg:1;
  127188. +#endif
  127189. +//#else // RTL8190, RTL8192E
  127190. +// unsigned char sgi_en;
  127191. +// unsigned char rxsc_sgien_exflg;
  127192. +//#endif
  127193. +}__attribute__ ((packed)) PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD;
  127194. +
  127195. +typedef struct _Phy_CCK_Rx_Status_Report_8192cd
  127196. +{
  127197. + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend
  127198. + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */
  127199. + u8 adc_pwdb_X[4];
  127200. + u8 SQ_rpt;
  127201. + u8 cck_agc_rpt;
  127202. +} PHY_STS_CCK_8192CD_T;
  127203. +
  127204. +// Rx smooth factor
  127205. +#define Rx_Smooth_Factor (20)
  127206. +
  127207. +#ifdef CONFIG_USB_HCI
  127208. +typedef struct _INTERRUPT_MSG_FORMAT_EX{
  127209. + unsigned int C2H_MSG0;
  127210. + unsigned int C2H_MSG1;
  127211. + unsigned int C2H_MSG2;
  127212. + unsigned int C2H_MSG3;
  127213. + unsigned int HISR; // from HISR Reg0x124, read to clear
  127214. + unsigned int HISRE;// from HISRE Reg0x12c, read to clear
  127215. + unsigned int MSG_EX;
  127216. +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX;
  127217. +
  127218. +void rtl8192du_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);
  127219. +int rtl8192du_init_recv_priv(_adapter * padapter);
  127220. +void rtl8192du_free_recv_priv(_adapter * padapter);
  127221. +#endif
  127222. +
  127223. +#ifdef CONFIG_PCI_HCI
  127224. +int rtl8192de_init_recv_priv(_adapter * padapter);
  127225. +void rtl8192de_free_recv_priv(_adapter * padapter);
  127226. +#endif
  127227. +
  127228. +void rtl8192d_translate_rx_signal_stuff(union recv_frame *precvframe, struct phy_stat *pphy_info);
  127229. +void rtl8192d_query_rx_desc_status(union recv_frame *precvframe, struct recv_stat *pdesc);
  127230. +
  127231. +#endif
  127232. --- /dev/null
  127233. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h
  127234. @@ -0,0 +1,96 @@
  127235. +/******************************************************************************
  127236. + *
  127237. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  127238. + *
  127239. + * This program is free software; you can redistribute it and/or modify it
  127240. + * under the terms of version 2 of the GNU General Public License as
  127241. + * published by the Free Software Foundation.
  127242. + *
  127243. + * This program is distributed in the hope that it will be useful, but WITHOUT
  127244. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  127245. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  127246. + * more details.
  127247. + *
  127248. + * You should have received a copy of the GNU General Public License along with
  127249. + * this program; if not, write to the Free Software Foundation, Inc.,
  127250. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  127251. + *
  127252. + *
  127253. + ******************************************************************************/
  127254. +/******************************************************************************
  127255. + *
  127256. + *
  127257. + * Module: rtl8192d_rf.h ( Header File)
  127258. + *
  127259. + * Note: Collect every HAL RF type exter API or constant.
  127260. + *
  127261. + * Function:
  127262. + *
  127263. + * Export:
  127264. + *
  127265. + * Abbrev:
  127266. + *
  127267. + * History:
  127268. + * Data Who Remark
  127269. + *
  127270. + * 09/25/2008 MHC Create initial version.
  127271. + *
  127272. + *
  127273. +******************************************************************************/
  127274. +#ifndef _RTL8192D_RF_H_
  127275. +#define _RTL8192D_RF_H_
  127276. +/* Check to see if the file has been included already. */
  127277. +
  127278. +
  127279. +/*--------------------------Define Parameters-------------------------------*/
  127280. +
  127281. +//
  127282. +// For RF 6052 Series
  127283. +//
  127284. +#define RF6052_MAX_TX_PWR 0x3F
  127285. +#define RF6052_MAX_REG 0x3F
  127286. +#define RF6052_MAX_PATH 2
  127287. +/*--------------------------Define Parameters-------------------------------*/
  127288. +
  127289. +
  127290. +/*------------------------------Define structure----------------------------*/
  127291. +
  127292. +/*------------------------------Define structure----------------------------*/
  127293. +
  127294. +
  127295. +/*------------------------Export global variable----------------------------*/
  127296. +/*------------------------Export global variable----------------------------*/
  127297. +
  127298. +/*------------------------Export Marco Definition---------------------------*/
  127299. +
  127300. +/*------------------------Export Marco Definition---------------------------*/
  127301. +
  127302. +
  127303. +/*--------------------------Exported Function prototype---------------------*/
  127304. +
  127305. +//
  127306. +// RF RL6052 Series API
  127307. +//
  127308. +void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter,
  127309. + IN u16 DataRate);
  127310. +void rtl8192d_PHY_RF6052SetBandwidth(
  127311. + IN PADAPTER Adapter,
  127312. + IN HT_CHANNEL_WIDTH Bandwidth);
  127313. +VOID rtl8192d_PHY_RF6052SetCckTxPower(
  127314. + IN PADAPTER Adapter,
  127315. + IN u8* pPowerlevel);
  127316. +VOID rtl8192d_PHY_RF6052SetOFDMTxPower(
  127317. + IN PADAPTER Adapter,
  127318. + IN u8* pPowerLevel,
  127319. + IN u8 Channel);
  127320. +int PHY_RF6052_Config8192D( IN PADAPTER Adapter );
  127321. +
  127322. +BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0);
  127323. +
  127324. +void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0);
  127325. +
  127326. +
  127327. +/*--------------------------Exported Function prototype---------------------*/
  127328. +
  127329. +
  127330. +#endif/* End of HalRf.h */
  127331. --- /dev/null
  127332. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h
  127333. @@ -0,0 +1,1840 @@
  127334. +/******************************************************************************
  127335. + *
  127336. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  127337. + *
  127338. + * This program is free software; you can redistribute it and/or modify it
  127339. + * under the terms of version 2 of the GNU General Public License as
  127340. + * published by the Free Software Foundation.
  127341. + *
  127342. + * This program is distributed in the hope that it will be useful, but WITHOUT
  127343. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  127344. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  127345. + * more details.
  127346. + *
  127347. + * You should have received a copy of the GNU General Public License along with
  127348. + * this program; if not, write to the Free Software Foundation, Inc.,
  127349. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  127350. + *
  127351. + *
  127352. + ******************************************************************************/
  127353. +
  127354. +#ifndef __RTL8192D_SPEC_H__
  127355. +#define __RTL8192D_SPEC_H__
  127356. +
  127357. +#include <drv_conf.h>
  127358. +
  127359. +#ifndef BIT
  127360. +#define BIT(x) (1 << (x))
  127361. +#endif
  127362. +
  127363. +#define BIT0 0x00000001
  127364. +#define BIT1 0x00000002
  127365. +#define BIT2 0x00000004
  127366. +#define BIT3 0x00000008
  127367. +#define BIT4 0x00000010
  127368. +#define BIT5 0x00000020
  127369. +#define BIT6 0x00000040
  127370. +#define BIT7 0x00000080
  127371. +#define BIT8 0x00000100
  127372. +#define BIT9 0x00000200
  127373. +#define BIT10 0x00000400
  127374. +#define BIT11 0x00000800
  127375. +#define BIT12 0x00001000
  127376. +#define BIT13 0x00002000
  127377. +#define BIT14 0x00004000
  127378. +#define BIT15 0x00008000
  127379. +#define BIT16 0x00010000
  127380. +#define BIT17 0x00020000
  127381. +#define BIT18 0x00040000
  127382. +#define BIT19 0x00080000
  127383. +#define BIT20 0x00100000
  127384. +#define BIT21 0x00200000
  127385. +#define BIT22 0x00400000
  127386. +#define BIT23 0x00800000
  127387. +#define BIT24 0x01000000
  127388. +#define BIT25 0x02000000
  127389. +#define BIT26 0x04000000
  127390. +#define BIT27 0x08000000
  127391. +#define BIT28 0x10000000
  127392. +#define BIT29 0x20000000
  127393. +#define BIT30 0x40000000
  127394. +#define BIT31 0x80000000
  127395. +
  127396. +
  127397. +//============================================================
  127398. +// 8192D Regsiter offset definition
  127399. +//============================================================
  127400. +
  127401. +
  127402. +//============================================================
  127403. +//
  127404. +//============================================================
  127405. +
  127406. +//-----------------------------------------------------
  127407. +//
  127408. +// 0x0000h ~ 0x00FFh System Configuration
  127409. +//
  127410. +//-----------------------------------------------------
  127411. +#define REG_SYS_ISO_CTRL 0x0000
  127412. +#define REG_SYS_FUNC_EN 0x0002
  127413. +#define REG_APS_FSMCO 0x0004
  127414. +#define REG_SYS_CLKR 0x0008
  127415. +#define REG_9346CR 0x000A
  127416. +#define REG_EE_VPD 0x000C
  127417. +#define REG_AFE_MISC 0x0010
  127418. +#define REG_SPS0_CTRL 0x0011
  127419. +#define REG_POWER_OFF_IN_PROCESS 0x0017
  127420. +#define REG_SPS_OCP_CFG 0x0018
  127421. +#define REG_RSV_CTRL 0x001C
  127422. +#define REG_RF_CTRL 0x001F
  127423. +#define REG_LDOA15_CTRL 0x0020
  127424. +#define REG_LDOV12D_CTRL 0x0021
  127425. +#define REG_LDOHCI12_CTRL 0x0022
  127426. +#define REG_LPLDO_CTRL 0x0023
  127427. +#define REG_AFE_XTAL_CTRL 0x0024
  127428. +#define REG_AFE_PLL_CTRL 0x0028
  127429. +#define REG_MAC_PHY_CTRL 0x002c //for 92d, DMDP,SMSP,DMSP contrl
  127430. +#define REG_EFUSE_CTRL 0x0030
  127431. +#define REG_EFUSE_TEST 0x0034
  127432. +#define REG_PWR_DATA 0x0038
  127433. +#define REG_CAL_TIMER 0x003C
  127434. +#define REG_ACLK_MON 0x003E
  127435. +#define REG_GPIO_MUXCFG 0x0040
  127436. +//#define REG_GPIO_MUXCFG 0x0041
  127437. +#define REG_GPIO_IO_SEL 0x0042
  127438. +#define REG_MAC_PINMUX_CFG 0x0043
  127439. +#define REG_GPIO_PIN_CTRL 0x0044
  127440. +#define REG_GPIO_INTM 0x0048
  127441. +#define REG_LEDCFG0 0x004C
  127442. +#define REG_LEDCFG1 0x004D
  127443. +#define REG_LEDCFG2 0x004E
  127444. +#define REG_LEDCFG3 0x004F
  127445. +#define REG_FSIMR 0x0050
  127446. +#define REG_FSISR 0x0054
  127447. +
  127448. +#define REG_MCUFWDL 0x0080
  127449. +#ifdef CONFIG_WOWLAN
  127450. +#define REG_WOWLAN_REASON 0x00FC
  127451. +#endif // CONFIG_WOWLAN
  127452. +#define REG_HMEBOX_EXT_0 0x0088
  127453. +#define REG_HMEBOX_EXT_1 0x008A
  127454. +#define REG_HMEBOX_EXT_2 0x008C
  127455. +#define REG_HMEBOX_EXT_3 0x008E
  127456. +
  127457. +#define REG_BIST_SCAN 0x00D0
  127458. +#define REG_BIST_RPT 0x00D4
  127459. +#define REG_BIST_ROM_RPT 0x00D8
  127460. +#define REG_USB_SIE_INTF 0x00E0
  127461. +#define REG_PCIE_MIO_INTF 0x00E4
  127462. +#define REG_PCIE_MIO_INTD 0x00E8
  127463. +#define REG_HPON_FSM 0x00EC
  127464. +#define REG_SYS_CFG 0x00F0
  127465. +#define REG_MAC_PHY_CTRL_NORMAL 0x00f8
  127466. +
  127467. +#define REG_MAC0 0x0081
  127468. +#define REG_MAC1 0x0053
  127469. +#define FW_MAC0_ready 0x18
  127470. +#define FW_MAC1_ready 0x1A
  127471. +#define MAC0_ON BIT7
  127472. +#define MAC1_ON BIT0
  127473. +#define mac0_ready BIT0
  127474. +#define mac1_ready BIT0
  127475. +
  127476. +
  127477. +//-----------------------------------------------------
  127478. +//
  127479. +// 0x0100h ~ 0x01FFh MACTOP General Configuration
  127480. +//
  127481. +//-----------------------------------------------------
  127482. +#define REG_CR 0x0100
  127483. +#define REG_PBP 0x0104
  127484. +#define REG_TRXDMA_CTRL 0x010C
  127485. +#define REG_TRXFF_BNDY 0x0114
  127486. +#define REG_TRXFF_STATUS 0x0118
  127487. +#define REG_RXFF_PTR 0x011C
  127488. +#define REG_HIMR 0x0120
  127489. +#define REG_HISR 0x0124
  127490. +#define REG_HIMRE 0x0128
  127491. +#define REG_HISRE 0x012C
  127492. +#define REG_CPWM 0x012F
  127493. +#define REG_FWIMR 0x0130
  127494. +#define REG_FWISR 0x0134
  127495. +#define REG_FTIMR 0x0138
  127496. +#define REG_PKTBUF_DBG_CTRL 0x0140
  127497. +#define REG_PKTBUF_DBG_DATA_L 0x0144
  127498. +#define REG_PKTBUF_DBG_DATA_H 0x0148
  127499. +
  127500. +#define REG_TC0_CTRL 0x0150
  127501. +#define REG_TC1_CTRL 0x0154
  127502. +#define REG_TC2_CTRL 0x0158
  127503. +#define REG_TC3_CTRL 0x015C
  127504. +#define REG_TC4_CTRL 0x0160
  127505. +#define REG_TCUNIT_BASE 0x0164
  127506. +#define REG_MBIST_START 0x0174
  127507. +#define REG_MBIST_DONE 0x0178
  127508. +#define REG_MBIST_FAIL 0x017C
  127509. +#define REG_C2HEVT_MSG_NORMAL 0x01A0
  127510. +#define REG_C2HEVT_CLEAR 0x01AF
  127511. +#define REG_C2HEVT_MSG_TEST 0x01B8
  127512. +#define REG_MCUTST_1 0x01c0
  127513. +#define REG_FMETHR 0x01C8
  127514. +#define REG_HMETFR 0x01CC
  127515. +#define REG_HMEBOX_0 0x01D0
  127516. +#define REG_HMEBOX_1 0x01D4
  127517. +#define REG_HMEBOX_2 0x01D8
  127518. +#define REG_HMEBOX_3 0x01DC
  127519. +
  127520. +#define REG_LLT_INIT 0x01E0
  127521. +#define REG_BB_ACCEESS_CTRL 0x01E8
  127522. +#define REG_BB_ACCESS_DATA 0x01EC
  127523. +
  127524. +
  127525. +//-----------------------------------------------------
  127526. +//
  127527. +// 0x0200h ~ 0x027Fh TXDMA Configuration
  127528. +//
  127529. +//-----------------------------------------------------
  127530. +#define REG_RQPN 0x0200
  127531. +#define REG_FIFOPAGE 0x0204
  127532. +#define REG_TDECTRL 0x0208
  127533. +#define REG_TXDMA_OFFSET_CHK 0x020C
  127534. +#define REG_TXDMA_STATUS 0x0210
  127535. +#define REG_RQPN_NPQ 0x0214
  127536. +
  127537. +//-----------------------------------------------------
  127538. +//
  127539. +// 0x0280h ~ 0x02FFh RXDMA Configuration
  127540. +//
  127541. +//-----------------------------------------------------
  127542. +#define REG_RXDMA_AGG_PG_TH 0x0280
  127543. +#define REG_RXPKT_NUM 0x0284
  127544. +#define REG_RXDMA_STATUS 0x0288
  127545. +
  127546. +
  127547. +//-----------------------------------------------------
  127548. +//
  127549. +// 0x0300h ~ 0x03FFh PCIe
  127550. +//
  127551. +//-----------------------------------------------------
  127552. +#define REG_PCIE_CTRL_REG 0x0300
  127553. +#define REG_INT_MIG 0x0304 // Interrupt Migration
  127554. +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address
  127555. +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address
  127556. +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address
  127557. +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address
  127558. +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address
  127559. +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address
  127560. +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address
  127561. +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address
  127562. +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration
  127563. +//sherry added for DBI Read/Write 20091126
  127564. +#define REG_DBI_WDATA 0x0348 // Backdoor REG for Access Configuration
  127565. +#define REG_DBI_RDATA 0x034C //Backdoor REG for Access Configuration
  127566. +#define REG_DBI_CTRL 0x0350 //Backdoor REG for Access Configuration
  127567. +#define REG_DBI_FLAG 0x0352 //Backdoor REG for Access Configuration#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY
  127568. +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY
  127569. +#define REG_DBG_SEL 0x0360 // Debug Selection Register
  127570. +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM
  127571. +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM
  127572. +#define REG_UART_CTRL 0x0364 // UART Control
  127573. +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address
  127574. +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address
  127575. +
  127576. +
  127577. +// spec version 11
  127578. +//-----------------------------------------------------
  127579. +//
  127580. +// 0x0400h ~ 0x047Fh Protocol Configuration
  127581. +//
  127582. +//-----------------------------------------------------
  127583. +#define REG_VOQ_INFORMATION 0x0400
  127584. +#define REG_VIQ_INFORMATION 0x0404
  127585. +#define REG_BEQ_INFORMATION 0x0408
  127586. +#define REG_BKQ_INFORMATION 0x040C
  127587. +#define REG_MGQ_INFORMATION 0x0410
  127588. +#define REG_HGQ_INFORMATION 0x0414
  127589. +#define REG_BCNQ_INFORMATION 0x0418
  127590. +
  127591. +
  127592. +#define REG_CPU_MGQ_INFORMATION 0x041C
  127593. +#define REG_FWHW_TXQ_CTRL 0x0420
  127594. +#define REG_HWSEQ_CTRL 0x0423
  127595. +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
  127596. +#define REG_TXPKTBUF_MGQ_BDNY 0x0425
  127597. +#define REG_LIFETIME_EN 0x0426
  127598. +#define REG_MULTI_BCNQ_OFFSET 0x0427
  127599. +#define REG_SPEC_SIFS 0x0428
  127600. +#define REG_RL 0x042A
  127601. +#define REG_DARFRC 0x0430
  127602. +#define REG_RARFRC 0x0438
  127603. +#define REG_RRSR 0x0440
  127604. +#define REG_ARFR0 0x0444
  127605. +#define REG_ARFR1 0x0448
  127606. +#define REG_ARFR2 0x044C
  127607. +#define REG_ARFR3 0x0450
  127608. +#define REG_AGGLEN_LMT 0x0458
  127609. +#define REG_AMPDU_MIN_SPACE 0x045C
  127610. +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
  127611. +#define REG_FAST_EDCA_CTRL 0x0460
  127612. +#define REG_RD_RESP_PKT_TH 0x0463
  127613. +#define REG_INIRTS_RATE_SEL 0x0480
  127614. +#define REG_INIDATA_RATE_SEL 0x0484
  127615. +
  127616. +//#define REG_FW_TSF_SYNC_CNT 0x04A0
  127617. +#define REG_FW_RESET_TSF_CNT_1 0x05FC
  127618. +#define REG_FW_RESET_TSF_CNT_0 0x05FD
  127619. +#define REG_FW_BCN_DIS_CNT 0x05FE
  127620. +
  127621. +#define REG_POWER_STATUS 0x04A4
  127622. +#define REG_POWER_STAGE1 0x04B4
  127623. +#define REG_POWER_STAGE2 0x04B8
  127624. +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0
  127625. +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2
  127626. +#define REG_STBC_SETTING 0x04C4
  127627. +#define REG_PROT_MODE_CTRL 0x04C8
  127628. +#define REG_MAX_AGGR_NUM 0x04CA
  127629. +#define REG_RTS_MAX_AGGR_NUM 0x04CB
  127630. +#define REG_BAR_MODE_CTRL 0x04CC
  127631. +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
  127632. +#define REG_EARLY_MODE_CONTROL 0x04D0
  127633. +#define REG_NQOS_SEQ 0x04DC
  127634. +#define REG_QOS_SEQ 0x04DE
  127635. +#define REG_NEED_CPU_HANDLE 0x04E0
  127636. +#define REG_PKT_LOSE_RPT 0x04E1
  127637. +#define REG_PTCL_ERR_STATUS 0x04E2
  127638. +#define REG_DUMMY 0x04FC
  127639. +
  127640. +
  127641. +
  127642. +//-----------------------------------------------------
  127643. +//
  127644. +// 0x0500h ~ 0x05FFh EDCA Configuration
  127645. +//
  127646. +//-----------------------------------------------------
  127647. +#define REG_EDCA_VO_PARAM 0x0500
  127648. +#define REG_EDCA_VI_PARAM 0x0504
  127649. +#define REG_EDCA_BE_PARAM 0x0508
  127650. +#define REG_EDCA_BK_PARAM 0x050C
  127651. +#define REG_BCNTCFG 0x0510
  127652. +#define REG_PIFS 0x0512
  127653. +#define REG_RDG_PIFS 0x0513
  127654. +#define REG_SIFS_CTX 0x0514
  127655. +#define REG_SIFS_TRX 0x0516
  127656. +#define REG_TSFTR_SYN_OFFSET 0x0518
  127657. +#define REG_AGGR_BREAK_TIME 0x051A
  127658. +#define REG_SLOT 0x051B
  127659. +#define REG_TX_PTCL_CTRL 0x0520
  127660. +#define REG_TXPAUSE 0x0522
  127661. +#define REG_DIS_TXREQ_CLR 0x0523
  127662. +#define REG_RD_CTRL 0x0524
  127663. +#define REG_TBTT_PROHIBIT 0x0540
  127664. +#define REG_RD_NAV_NXT 0x0544
  127665. +#define REG_NAV_PROT_LEN 0x0546
  127666. +#define REG_BCN_CTRL 0x0550
  127667. +#define REG_BCN_CTRL_1 0x0551
  127668. +#define REG_MBID_NUM 0x0552
  127669. +#define REG_DUAL_TSF_RST 0x0553
  127670. +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE
  127671. +#define REG_MBSSID_BCN_SPACE 0x0554
  127672. +#define REG_DRVERLYINT 0x0558
  127673. +#define REG_BCNDMATIM 0x0559
  127674. +#define REG_ATIMWND 0x055A
  127675. +#define REG_USTIME_TSF 0x055C
  127676. +#define REG_BCN_MAX_ERR 0x055D
  127677. +#define REG_RXTSF_OFFSET_CCK 0x055E
  127678. +#define REG_RXTSF_OFFSET_OFDM 0x055F
  127679. +#define REG_TSFTR 0x0560
  127680. +#define REG_TSFTR1 0x0568
  127681. +#define REG_INIT_TSFTR 0x0564
  127682. +#define REG_ATIMWND_1 0x0570
  127683. +#define REG_PSTIMER 0x0580
  127684. +#define REG_TIMER0 0x0584
  127685. +#define REG_TIMER1 0x0588
  127686. +#define REG_ACMHWCTRL 0x05C0
  127687. +#define REG_ACMRSTCTRL 0x05C1
  127688. +#define REG_ACMAVG 0x05C2
  127689. +#define REG_VO_ADMTIME 0x05C4
  127690. +#define REG_VI_ADMTIME 0x05C6
  127691. +#define REG_BE_ADMTIME 0x05C8
  127692. +#define REG_EDCA_RANDOM_GEN 0x05CC
  127693. +#define REG_SCH_TXCMD 0x05D0
  127694. +
  127695. +#define REG_DMC 0x05F0 //Dual MAC Co-Existence Register
  127696. +
  127697. +
  127698. +//-----------------------------------------------------
  127699. +//
  127700. +// 0x0600h ~ 0x07FFh WMAC Configuration
  127701. +//
  127702. +//-----------------------------------------------------
  127703. +#define REG_APSD_CTRL 0x0600
  127704. +#define REG_BWOPMODE 0x0603
  127705. +#define REG_TCR 0x0604
  127706. +#define REG_RCR 0x0608
  127707. +#define REG_RX_PKT_LIMIT 0x060C
  127708. +#define REG_RX_DLK_TIME 0x060D
  127709. +#define REG_RX_DRVINFO_SZ 0x060F
  127710. +
  127711. +#define REG_MACID 0x0610
  127712. +#define REG_BSSID 0x0618
  127713. +#define REG_MAR 0x0620
  127714. +#define REG_MBIDCAMCFG 0x0628
  127715. +
  127716. +#define REG_USTIME_EDCA 0x0638
  127717. +#define REG_MAC_SPEC_SIFS 0x063A
  127718. +#define REG_RESP_SIFS_CCK 0x063C
  127719. +#define REG_RESP_SIFS_OFDM 0x063E
  127720. +#define REG_ACKTO 0x0640
  127721. +#define REG_CTS2TO 0x0641
  127722. +#define REG_EIFS 0x0642
  127723. +
  127724. +
  127725. +//WMA, BA, CCX
  127726. +#define REG_NAV_CTRL 0x0650
  127727. +#define REG_BACAMCMD 0x0654
  127728. +#define REG_BACAMCONTENT 0x0658
  127729. +#define REG_LBDLY 0x0660
  127730. +#define REG_FWDLY 0x0661
  127731. +#define REG_RXERR_RPT 0x0664
  127732. +#define REG_WMAC_TRXPTCL_CTL 0x0668
  127733. +
  127734. +
  127735. +// Security
  127736. +#define REG_CAMCMD 0x0670
  127737. +#define REG_CAMWRITE 0x0674
  127738. +#define REG_CAMREAD 0x0678
  127739. +#define REG_CAMDBG 0x067C
  127740. +#define REG_SECCFG 0x0680
  127741. +
  127742. +// Power
  127743. +#define REG_WOW_CTRL 0x0690
  127744. +#define REG_PSSTATUS 0x0691
  127745. +#define REG_PS_RX_INFO 0x0692
  127746. +#define REG_LPNAV_CTRL 0x0694
  127747. +#define REG_WKFMCAM_CMD 0x0698
  127748. +#define REG_WKFMCAM_RWD 0x069C
  127749. +#define REG_RXFLTMAP0 0x06A0
  127750. +#define REG_RXFLTMAP1 0x06A2
  127751. +#define REG_RXFLTMAP2 0x06A4
  127752. +#define REG_BCN_PSR_RPT 0x06A8
  127753. +#define REG_CALB32K_CTRL 0x06AC
  127754. +#define REG_PKT_MON_CTRL 0x06B4
  127755. +#define REG_BT_COEX_TABLE 0x06C0
  127756. +#define REG_WMAC_RESP_TXINFO 0x06D8
  127757. +
  127758. +#define REG_MACID1 0x0700
  127759. +#define REG_BSSID1 0x0708
  127760. +
  127761. +//-----------------------------------------------------
  127762. +//
  127763. +// 0xFE00h ~ 0xFE55h USB Configuration
  127764. +//
  127765. +//-----------------------------------------------------
  127766. +#define REG_USB_INFO 0xFE17
  127767. +#define REG_USB_SPECIAL_OPTION 0xFE55
  127768. +#define REG_USB_DMA_AGG_TO 0xFE5B
  127769. +#define REG_USB_AGG_TO 0xFE5C
  127770. +#define REG_USB_AGG_TH 0xFE5D
  127771. +
  127772. +// for 92DU high_Queue low_Queue Normal_Queue select
  127773. +#define REG_USB_High_NORMAL_Queue_Select_MAC0 0xFE44
  127774. +//#define REG_USB_LOW_Queue_Select_MAC0 0xFE45
  127775. +#define REG_USB_High_NORMAL_Queue_Select_MAC1 0xFE47
  127776. +//#define REG_USB_LOW_Queue_Select_MAC1 0xFE48
  127777. +
  127778. +// For test chip
  127779. +#define REG_TEST_USB_TXQS 0xFE48
  127780. +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61
  127781. +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63
  127782. +#define REG_TEST_SIE_OPTIONAL 0xFE64
  127783. +#define REG_TEST_SIE_CHIRP_K 0xFE65
  127784. +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B
  127785. +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75
  127786. +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9
  127787. +
  127788. +
  127789. +// For normal chip
  127790. +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61
  127791. +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63
  127792. +#define REG_NORMAL_SIE_OPTIONAL 0xFE64
  127793. +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67
  127794. +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B
  127795. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75
  127796. +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF
  127797. +
  127798. +
  127799. +//-----------------------------------------------------
  127800. +//
  127801. +// Redifine 8192C register definition for compatibility
  127802. +//
  127803. +//-----------------------------------------------------
  127804. +
  127805. +// TODO: use these definition when using REG_xxx naming rule.
  127806. +// NOTE: DO NOT Remove these definition. Use later.
  127807. +
  127808. +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control.
  127809. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable.
  127810. +#define SYS_CLK REG_SYS_CLKR
  127811. +#define CR9346 REG_9346CR // 93C46/93C56 Command Register.
  127812. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control.
  127813. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test.
  127814. +#define MSR (REG_CR + 2) // Media Status register
  127815. +#define ISR REG_HISR
  127816. +#define TSFR REG_TSFTR // Timing Sync Function Timer Register.
  127817. +
  127818. +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053
  127819. +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055
  127820. +
  127821. +#define PBP REG_PBP
  127822. +
  127823. +// Redifine MACID register, to compatible prior ICs.
  127824. +#define IDR0 MACIDR0
  127825. +#define IDR4 MACIDR4
  127826. +
  127827. +
  127828. +//
  127829. +// 9. Security Control Registers (Offset: )
  127830. +//
  127831. +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd
  127832. +#define WCAMI REG_CAMWRITE // Software write CAM input content
  127833. +#define RCAMO REG_CAMREAD // Software read/write CAM config
  127834. +#define CAMDBG REG_CAMDBG
  127835. +#define SECR REG_SECCFG //Security Configuration Register
  127836. +
  127837. +// Unused register
  127838. +#define UnusedRegister 0x1BF
  127839. +#define DCAM UnusedRegister
  127840. +#define PSR UnusedRegister
  127841. +#define BBAddr UnusedRegister
  127842. +#define PhyDataR UnusedRegister
  127843. +
  127844. +#define InvalidBBRFValue 0x12345678
  127845. +
  127846. +// Min Spacing related settings.
  127847. +#define MAX_MSS_DENSITY_2T 0x13
  127848. +#define MAX_MSS_DENSITY_1T 0x0A
  127849. +
  127850. +//----------------------------------------------------------------------------
  127851. +// 8192C Cmd9346CR bits (Offset 0xA, 16bit)
  127852. +//----------------------------------------------------------------------------
  127853. +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1
  127854. +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346
  127855. +#define Cmd9346CR_9356SEL BIT4
  127856. +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL)
  127857. +#define AutoLoadEFUSE CmdEEPROM_En
  127858. +
  127859. +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte)
  127860. +//----------------------------------------------------------------------------
  127861. +#define GPIOSEL_GPIO 0
  127862. +#define GPIOSEL_ENBT BIT5
  127863. +
  127864. +//----------------------------------------------------------------------------
  127865. +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte)
  127866. +//----------------------------------------------------------------------------
  127867. +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value
  127868. +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value
  127869. +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured.
  127870. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
  127871. +
  127872. +
  127873. +//----------------------------------------------------------------------------
  127874. +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits)
  127875. +//----------------------------------------------------------------------------
  127876. +/*
  127877. +Network Type
  127878. +00: No link
  127879. +01: Link in ad hoc network
  127880. +10: Link in infrastructure network
  127881. +11: AP mode
  127882. +Default: 00b.
  127883. +*/
  127884. +#define MSR_NOLINK 0x00
  127885. +#define MSR_ADHOC 0x01
  127886. +#define MSR_INFRA 0x02
  127887. +#define MSR_AP 0x03
  127888. +
  127889. +//
  127890. +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF)
  127891. +//
  127892. +//----------------------------------------------------------------------------
  127893. +// 8192C Response Rate Set Register (offset 0x181, 24bits)
  127894. +//----------------------------------------------------------------------------
  127895. +#define RRSR_RSC_OFFSET 21
  127896. +#define RRSR_SHORT_OFFSET 23
  127897. +#define RRSR_RSC_BW_40M 0x600000
  127898. +#define RRSR_RSC_UPSUBCHNL 0x400000
  127899. +#define RRSR_RSC_LOWSUBCHNL 0x200000
  127900. +#define RRSR_SHORT 0x800000
  127901. +#define RRSR_1M BIT0
  127902. +#define RRSR_2M BIT1
  127903. +#define RRSR_5_5M BIT2
  127904. +#define RRSR_11M BIT3
  127905. +#define RRSR_6M BIT4
  127906. +#define RRSR_9M BIT5
  127907. +#define RRSR_12M BIT6
  127908. +#define RRSR_18M BIT7
  127909. +#define RRSR_24M BIT8
  127910. +#define RRSR_36M BIT9
  127911. +#define RRSR_48M BIT10
  127912. +#define RRSR_54M BIT11
  127913. +#define RRSR_MCS0 BIT12
  127914. +#define RRSR_MCS1 BIT13
  127915. +#define RRSR_MCS2 BIT14
  127916. +#define RRSR_MCS3 BIT15
  127917. +#define RRSR_MCS4 BIT16
  127918. +#define RRSR_MCS5 BIT17
  127919. +#define RRSR_MCS6 BIT18
  127920. +#define RRSR_MCS7 BIT19
  127921. +#define BRSR_AckShortPmb BIT23
  127922. +// CCK ACK: use Short Preamble or not
  127923. +
  127924. +
  127925. +//----------------------------------------------------------------------------
  127926. +// 8192C Rate Definition
  127927. +//----------------------------------------------------------------------------
  127928. +//CCK
  127929. +#define RATR_1M 0x00000001
  127930. +#define RATR_2M 0x00000002
  127931. +#define RATR_55M 0x00000004
  127932. +#define RATR_11M 0x00000008
  127933. +//OFDM
  127934. +#define RATR_6M 0x00000010
  127935. +#define RATR_9M 0x00000020
  127936. +#define RATR_12M 0x00000040
  127937. +#define RATR_18M 0x00000080
  127938. +#define RATR_24M 0x00000100
  127939. +#define RATR_36M 0x00000200
  127940. +#define RATR_48M 0x00000400
  127941. +#define RATR_54M 0x00000800
  127942. +//MCS 1 Spatial Stream
  127943. +#define RATR_MCS0 0x00001000
  127944. +#define RATR_MCS1 0x00002000
  127945. +#define RATR_MCS2 0x00004000
  127946. +#define RATR_MCS3 0x00008000
  127947. +#define RATR_MCS4 0x00010000
  127948. +#define RATR_MCS5 0x00020000
  127949. +#define RATR_MCS6 0x00040000
  127950. +#define RATR_MCS7 0x00080000
  127951. +//MCS 2 Spatial Stream
  127952. +#define RATR_MCS8 0x00100000
  127953. +#define RATR_MCS9 0x00200000
  127954. +#define RATR_MCS10 0x00400000
  127955. +#define RATR_MCS11 0x00800000
  127956. +#define RATR_MCS12 0x01000000
  127957. +#define RATR_MCS13 0x02000000
  127958. +#define RATR_MCS14 0x04000000
  127959. +#define RATR_MCS15 0x08000000
  127960. +
  127961. +//----------------------------------------------------------------------------
  127962. +// 8192C BW_OPMODE bits (Offset 0x203, 8bit)
  127963. +//----------------------------------------------------------------------------
  127964. +#define BW_OPMODE_20MHZ BIT2
  127965. +#define BW_OPMODE_5G BIT1
  127966. +#define BW_OPMODE_11J BIT0
  127967. +
  127968. +
  127969. +//----------------------------------------------------------------------------
  127970. +// 8192C CAM Config Setting (offset 0x250, 1 byte)
  127971. +//----------------------------------------------------------------------------
  127972. +#define CAM_VALID BIT15
  127973. +#define CAM_NOTVALID 0x0000
  127974. +#define CAM_USEDK BIT5
  127975. +
  127976. +#define CAM_CONTENT_COUNT 8
  127977. +
  127978. +#define CAM_NONE 0x0
  127979. +#define CAM_WEP40 0x01
  127980. +#define CAM_TKIP 0x02
  127981. +#define CAM_AES 0x04
  127982. +#define CAM_WEP104 0x05
  127983. +#define CAM_SMS4 0x6
  127984. +
  127985. +
  127986. +#define TOTAL_CAM_ENTRY 32
  127987. +#define HALF_CAM_ENTRY 16
  127988. +
  127989. +#define CAM_CONFIG_USEDK _TRUE
  127990. +#define CAM_CONFIG_NO_USEDK _FALSE
  127991. +
  127992. +#define CAM_WRITE BIT16
  127993. +#define CAM_READ 0x00000000
  127994. +#define CAM_POLLINIG BIT31
  127995. +
  127996. +#define SCR_UseDK 0x01
  127997. +#define SCR_TxSecEnable 0x02
  127998. +#define SCR_RxSecEnable 0x04
  127999. +
  128000. +
  128001. +//
  128002. +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F)
  128003. +//
  128004. +//----------------------------------------------------------------------------
  128005. +// 8190 IMR/ISR bits (offset 0xfd, 8bits)
  128006. +//----------------------------------------------------------------------------
  128007. +#define IMR8190_DISABLED 0x0
  128008. +// IMR DW0 Bit 0-31
  128009. +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6
  128010. +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5
  128011. +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4
  128012. +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3
  128013. +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2
  128014. +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1
  128015. +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8
  128016. +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7
  128017. +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6
  128018. +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5
  128019. +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4
  128020. +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3
  128021. +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2
  128022. +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1
  128023. +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2
  128024. +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1
  128025. +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow
  128026. +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt
  128027. +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0
  128028. +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow
  128029. +#define IMR_RDU BIT11 // Receive Descriptor Unavailable
  128030. +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt
  128031. +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup
  128032. +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt
  128033. +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup
  128034. +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt
  128035. +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt
  128036. +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt
  128037. +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt
  128038. +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt
  128039. +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt
  128040. +#define IMR_ROK BIT0 // Receive DMA OK Interrupt
  128041. +
  128042. +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh)
  128043. +#define IMR_TXERR BIT11
  128044. +#define IMR_RXERR BIT10
  128045. +#define IMR_C2HCMD BIT9
  128046. +#define IMR_CPWM BIT8
  128047. +//RSVD [2-7]
  128048. +#define IMR_OCPINT BIT1
  128049. +#define IMR_WLANOFF BIT0
  128050. +
  128051. +
  128052. +
  128053. +//----------------------------------------------------------------------------
  128054. +// 8192D EFUSE
  128055. +//----------------------------------------------------------------------------
  128056. +#define HWSET_MAX_SIZE 256
  128057. +
  128058. +//----------------------------------------------------------------------------
  128059. +// 8192C EEPROM/EFUSE share register definition.
  128060. +//----------------------------------------------------------------------------
  128061. +
  128062. +//
  128063. +// Default Value for EEPROM or EFUSE!!!
  128064. +//
  128065. +#define EEPROM_Default_TSSI 0x0
  128066. +#define EEPROM_Default_TxPowerDiff 0x0
  128067. +#define EEPROM_Default_CrystalCap 0x0 //92D default 0x0
  128068. +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68)
  128069. +#define EEPROM_Default_TxPower 0x1010
  128070. +#define EEPROM_Default_HT2T_TxPwr 0x10
  128071. +
  128072. +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4
  128073. +#define EEPROM_Default_ThermalMeter 0x12
  128074. +
  128075. +#define EEPROM_Default_AntTxPowerDiff 0x0
  128076. +//#define EEPROM_Default_TxPwDiff_CrystalCap 0x5
  128077. +#define EEPROM_Default_TxPowerLevel_2G 0x2C
  128078. +#define EEPROM_Default_TxPowerLevel_5G 0x22
  128079. +
  128080. +#define EEPROM_Default_HT40_2SDiff 0x0
  128081. +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference
  128082. +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 //OFDM Tx Power index diff
  128083. +#define EEPROM_Default_HT40_PwrMaxOffset 0
  128084. +#define EEPROM_Default_HT20_PwrMaxOffset 0
  128085. +
  128086. +// For debug
  128087. +#define EEPROM_Default_PID 0x1234
  128088. +#define EEPROM_Default_VID 0x5678
  128089. +#define EEPROM_Default_CustomerID 0xAB
  128090. +#define EEPROM_Default_SubCustomerID 0xCD
  128091. +#define EEPROM_Default_Version 0
  128092. +
  128093. +#define EEPROM_Default_externalPA_C9 0x00
  128094. +#define EEPROM_Default_externalPA_CC 0xFF
  128095. +#define EEPROM_Default_internalPA_SP3T_C9 0xAA
  128096. +#define EEPROM_Default_internalPA_SP3T_CC 0xAF
  128097. +#define EEPROM_Default_internalPA_SPDT_C9 0xAA
  128098. +#ifdef CONFIG_PCI_HCI
  128099. +#define EEPROM_Default_internalPA_SPDT_CC 0xA0
  128100. +#else
  128101. +#define EEPROM_Default_internalPA_SPDT_CC 0xFA
  128102. +#endif
  128103. +
  128104. +#define EEPROM_CHANNEL_PLAN_FCC 0x0
  128105. +#define EEPROM_CHANNEL_PLAN_IC 0x1
  128106. +#define EEPROM_CHANNEL_PLAN_ETSI 0x2
  128107. +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
  128108. +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
  128109. +#define EEPROM_CHANNEL_PLAN_MKK 0x5
  128110. +#define EEPROM_CHANNEL_PLAN_MKK1 0x6
  128111. +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
  128112. +#define EEPROM_CHANNEL_PLAN_TELEC 0x8
  128113. +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
  128114. +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
  128115. +#define EEPROM_CHANNEL_PLAN_NCC 0xB
  128116. +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
  128117. +
  128118. +
  128119. +#define EEPROM_CID_DEFAULT 0x0
  128120. +#define EEPROM_CID_TOSHIBA 0x4
  128121. +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25.
  128122. +#define EEPROM_CID_QMI 0x0D
  128123. +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108
  128124. +
  128125. +
  128126. +#define RTL8192_EEPROM_ID 0x8129
  128127. +#define EEPROM_WAPI_SUPPORT 0x78
  128128. +
  128129. +
  128130. +#ifdef CONFIG_PCI_HCI
  128131. +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER)
  128132. +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
  128133. +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS)
  128134. +
  128135. +#define RTL8190_EEPROM_ID 0x8129 // 0-1
  128136. +#define EEPROM_HPON 0x02 // LDO settings.2-5
  128137. +#define EEPROM_CLK 0x06 // Clock settings.6-7
  128138. +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8
  128139. +
  128140. +#define EEPROM_VID 0x28 // SE Vendor ID.A-B
  128141. +#define EEPROM_DID 0x2A // SE Device ID. C-D
  128142. +#define EEPROM_SVID 0x2C // SE Vendor ID.E-F
  128143. +#define EEPROM_SMID 0x2E // SE PCI Subsystem ID. 10-11
  128144. +
  128145. +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17
  128146. +#define EEPROM_MAC_ADDR_MAC0_92D 0x55
  128147. +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B
  128148. +//----------------------------------------------------------------
  128149. +// 2.4G band Tx power index setting
  128150. +#define EEPROM_CCK_TX_PWR_INX_2G 0x61
  128151. +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67
  128152. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D
  128153. +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70
  128154. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73
  128155. +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76
  128156. +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79
  128157. +
  128158. +//5GL channel 32-64
  128159. +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C
  128160. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82
  128161. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85
  128162. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88
  128163. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B
  128164. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E
  128165. +
  128166. +//5GM channel 100-140
  128167. +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91
  128168. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97
  128169. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A
  128170. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D
  128171. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0
  128172. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3
  128173. +
  128174. +//5GH channel 149-165
  128175. +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6
  128176. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC
  128177. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF
  128178. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2
  128179. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5
  128180. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8
  128181. +
  128182. +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels.
  128183. +#define EEPROM_IQK_DELTA 0xBC
  128184. +#define EEPROM_LCK_DELTA 0xBC
  128185. +#define EEPROM_XTAL_K 0xBD //[7:5]
  128186. +#define EEPROM_TSSI_A_5G 0xBE
  128187. +#define EEPROM_TSSI_B_5G 0xBF
  128188. +#define EEPROM_TSSI_AB_5G 0xC0
  128189. +#define EEPROM_THERMAL_METER 0xC3 //[4:0]
  128190. +#define EEPROM_PATHDIV 0xC4
  128191. +#define EEPROM_RF_OPT1 0xC4
  128192. +#define EEPROM_RF_OPT2 0xC5
  128193. +#define EEPROM_RF_OPT3 0xC6
  128194. +#define EEPROM_RF_OPT4 0xC7
  128195. +#define EEPROM_RF_OPT5 0xC8
  128196. +#define EEPROM_RF_OPT6 0xC9
  128197. +#define EEPROM_VERSION 0xCA
  128198. +#define EEPROM_CUSTOMER_ID 0xCB
  128199. +#define EEPROM_RF_OPT7 0xCC
  128200. +
  128201. +#define EEPROM_WIDIPAIRING_ADDR 0xF0
  128202. +#define EEPROM_WIDIPAIRING_KEY 0xF6
  128203. +
  128204. +#define EEPROM_DEF_PART_NO 0x3FD //Byte
  128205. +#define EEPROME_CHIP_VERSION_L 0x3FF
  128206. +#define EEPROME_CHIP_VERSION_H 0x3FE
  128207. +#endif
  128208. +
  128209. +#ifdef CONFIG_USB_HCI
  128210. +#define RTL8190_EEPROM_ID 0x8129 // 0-1
  128211. +#define EEPROM_HPON 0x02 // LDO settings.2-5
  128212. +#define EEPROM_CLK 0x06 // Clock settings.6-7
  128213. +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8
  128214. +
  128215. +#define EEPROM_VID 0xC // SE Vendor ID.A-B
  128216. +#define EEPROM_PID 0xE // SE Device ID. C-D
  128217. +#define EEPROM_ENDPOINT_SETTING 0x10
  128218. +#ifdef CONFIG_WOWLAN
  128219. +#define EEPROM_Option_Setting 0x11
  128220. +#endif // CONFIG_WOWLAN
  128221. +#define EEPROM_CHIRP_K 0x12 // Changed
  128222. +#define EEPROM_USB_PHY 0x13 // Changed
  128223. +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5]
  128224. +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17
  128225. +#define EEPROM_STRING 0x1F
  128226. +#define EEPROM_SUBCUSTOMER_ID 0x59
  128227. +
  128228. +#define EEPROM_MAC_ADDR_MAC0_92D 0x19
  128229. +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B
  128230. +//----------------------------------------------------------------
  128231. +// 2.4G band Tx power index setting
  128232. +#define EEPROM_CCK_TX_PWR_INX_2G 0x61
  128233. +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67
  128234. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D
  128235. +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70
  128236. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73
  128237. +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76
  128238. +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79
  128239. +
  128240. +//5GL channel 32-64
  128241. +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C
  128242. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82
  128243. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85
  128244. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88
  128245. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B
  128246. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E
  128247. +
  128248. +//5GM channel 100-140
  128249. +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91
  128250. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97
  128251. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A
  128252. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D
  128253. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0
  128254. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3
  128255. +
  128256. +//5GH channel 149-165
  128257. +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6
  128258. +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC
  128259. +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF
  128260. +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2
  128261. +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5
  128262. +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8
  128263. +
  128264. +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels.
  128265. +#define EEPROM_TEST_CHANNEL_PLAN 0xBB
  128266. +#define EEPROM_IQK_DELTA 0xBC
  128267. +#define EEPROM_LCK_DELTA 0xBC
  128268. +#define EEPROM_XTAL_K 0xBD //[7:5]
  128269. +#define EEPROM_TSSI_A_5G 0xBE
  128270. +#define EEPROM_TSSI_B_5G 0xBF
  128271. +#define EEPROM_TSSI_AB_5G 0xC0
  128272. +#define EEPROM_THERMAL_METER 0xC3 //[4:0]
  128273. +#define EEPROM_RF_OPT1 0xC4
  128274. +#define EEPROM_RF_OPT2 0xC5
  128275. +#define EEPROM_RF_OPT3 0xC6
  128276. +#define EEPROM_RF_OPT4 0xC7
  128277. +#define EEPROM_RF_OPT5 0xC8
  128278. +#define EEPROM_RF_OPT6 0xC9
  128279. +#define EEPROM_VERSION 0xCA
  128280. +#define EEPROM_CUSTOMER_ID 0xCB
  128281. +#define EEPROM_RF_OPT7 0xCC
  128282. +
  128283. +#define EEPROM_DEF_PART_NO 0x3FD //Byte
  128284. +#define EEPROME_CHIP_VERSION_L 0x3FF
  128285. +#define EEPROME_CHIP_VERSION_H 0x3FE
  128286. +
  128287. +//-------------------------------------------------------------
  128288. +// EEPROM content definitions
  128289. +//-------------------------------------------------------------
  128290. +#define OS_LINK_SPEED_NORMAL_MASK BIT3 | BIT2
  128291. +#define OS_LINK_SPEED_TEST_MASK BIT3 | BIT4
  128292. +
  128293. +#define BOARD_TYPE_NORMAL_MASK 0xE0
  128294. +#define BOARD_TYPE_TEST_MASK 0xF
  128295. +
  128296. +#define BT_COEXISTENCE_TEST BIT4
  128297. +#define BT_COEXISTENCE_NORMAL BIT5
  128298. +
  128299. +#define BT_CO_SHIFT_TEST 4
  128300. +#define BT_CO_SHIFT_NORMAL 5
  128301. +
  128302. +#define EP_NUMBER_MASK_TEST 0x30 //bit 4:5 0Eh
  128303. +#define EP_NUMBER_SHIFT_TEST 4
  128304. +
  128305. +#define USB_PHY_PARA_SIZE_TEST 6
  128306. +#define USB_PHY_PARA_SIZE_NORMAL 4
  128307. +
  128308. +//-------------------------------------------------------------
  128309. +// EEPROM default value definitions
  128310. +//-------------------------------------------------------------
  128311. +// Use 0xABCD instead of 0x8192 for debug
  128312. +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00
  128313. +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01
  128314. +
  128315. +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03
  128316. +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04
  128317. +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08
  128318. +
  128319. +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A
  128320. +#define EEPROM_DEF_VID_1 0x0B
  128321. +
  128322. +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C
  128323. +#define EEPROM_DEF_PID_1 0x81
  128324. +
  128325. +
  128326. +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E
  128327. +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E
  128328. +
  128329. +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F
  128330. +
  128331. +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10
  128332. +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11
  128333. +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12
  128334. +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13
  128335. +
  128336. +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78
  128337. +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79
  128338. +
  128339. +
  128340. +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A
  128341. +
  128342. +
  128343. +#define EEPROM_USB_SN BIT(0)
  128344. +#define EEPROM_USB_REMOTE_WAKEUP BIT(1)
  128345. +#define EEPROM_USB_DEVICE_PWR BIT(2)
  128346. +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4))
  128347. +
  128348. +#if 0
  128349. +#define EEPROM_CHANNEL_PLAN_FCC 0x0
  128350. +#define EEPROM_CHANNEL_PLAN_IC 0x1
  128351. +#define EEPROM_CHANNEL_PLAN_ETSI 0x2
  128352. +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
  128353. +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
  128354. +#define EEPROM_CHANNEL_PLAN_MKK 0x5
  128355. +#define EEPROM_CHANNEL_PLAN_MKK1 0x6
  128356. +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
  128357. +#define EEPROM_CHANNEL_PLAN_TELEC 0x8
  128358. +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
  128359. +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
  128360. +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
  128361. +
  128362. +#define EEPROM_CID_DEFAULT 0x0
  128363. +
  128364. +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108
  128365. +
  128366. +
  128367. +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25.
  128368. +
  128369. +#endif
  128370. +#endif
  128371. +
  128372. +
  128373. +/*===================================================================
  128374. +=====================================================================
  128375. +Here the register defines are for 92C. When the define is as same with 92C,
  128376. +we will use the 92C's define for the consistency
  128377. +So the following defines for 92C is not entire!!!!!!
  128378. +=====================================================================
  128379. +=====================================================================*/
  128380. +/*
  128381. +Based on Datasheet V33---090401
  128382. +Register Summary
  128383. +Current IOREG MAP
  128384. +0x0000h ~ 0x00FFh System Configuration (256 Bytes)
  128385. +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes)
  128386. +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes)
  128387. +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes)
  128388. +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes)
  128389. +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes)
  128390. +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes)
  128391. +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes)
  128392. +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes)
  128393. +*/
  128394. +
  128395. +//----------------------------------------------------------------------------
  128396. +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits)
  128397. +//----------------------------------------------------------------------------
  128398. +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload
  128399. +#define RCR_APP_MIC BIT30 //
  128400. +#define RCR_APP_ICV BIT29 //
  128401. +#define RCR_APP_PHYST_RXFF BIT28 //
  128402. +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN
  128403. +#define RCR_ENMBID BIT24 //Enable Multiple BssId.
  128404. +#define RCR_LSIGEN BIT23
  128405. +#define RCR_MFBEN BIT22
  128406. +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0
  128407. +#define RCR_AMF BIT13 //Accept management type frame
  128408. +#define RCR_ACF BIT12 //Accept control type frame
  128409. +#define RCR_ADF BIT11 //Accept data type frame
  128410. +#define RCR_AICV BIT9 //Accept ICV error packet
  128411. +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet
  128412. +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp)
  128413. +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data)
  128414. +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet
  128415. +#define RCR_APWRMGT BIT5 //Accept power management packet
  128416. +#define RCR_ADD3 BIT4 //Accept address 3 match packet
  128417. +#define RCR_AB BIT3 //Accept broadcast packet
  128418. +#define RCR_AM BIT2 //Accept multicast packet
  128419. +#define RCR_APM BIT1 //Accept physical match packet
  128420. +#define RCR_AAP BIT0 //Accept all unicast packet
  128421. +#define RCR_MXDMA_OFFSET 8
  128422. +#define RCR_FIFO_OFFSET 13
  128423. +
  128424. +
  128425. +
  128426. +//============================================================================
  128427. +// 8192c USB specific Regsiter Offset and Content definition,
  128428. +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver
  128429. +//============================================================================
  128430. +//#define APS_FSMCO 0x0004 same with 92Ce
  128431. +#define RSV_CTRL 0x001C
  128432. +#define RD_CTRL 0x0524
  128433. +
  128434. +//-----------------------------------------------------
  128435. +//
  128436. +// 0xFE00h ~ 0xFE55h USB Configuration
  128437. +//
  128438. +//-----------------------------------------------------
  128439. +#define REG_USB_INFO 0xFE17
  128440. +#define REG_USB_SPECIAL_OPTION 0xFE55
  128441. +#define REG_USB_DMA_AGG_TO 0xFE5B
  128442. +#define REG_USB_AGG_TO 0xFE5C
  128443. +#define REG_USB_AGG_TH 0xFE5D
  128444. +
  128445. +#define REG_USB_VID 0xFE60
  128446. +#define REG_USB_PID 0xFE62
  128447. +#define REG_USB_OPTIONAL 0xFE64
  128448. +#define REG_USB_CHIRP_K 0xFE65
  128449. +#define REG_USB_PHY 0xFE66
  128450. +#define REG_USB_MAC_ADDR 0xFE70
  128451. +
  128452. +#define REG_USB_HRPWM 0xFE58
  128453. +#define REG_USB_HCPWM 0xFE57
  128454. +
  128455. +#define InvalidBBRFValue 0x12345678
  128456. +
  128457. +//============================================================================
  128458. +// 8192C Regsiter Bit and Content definition
  128459. +//============================================================================
  128460. +//-----------------------------------------------------
  128461. +//
  128462. +// 0x0000h ~ 0x00FFh System Configuration
  128463. +//
  128464. +//-----------------------------------------------------
  128465. +
  128466. +//2 SPS0_CTRL
  128467. +#define SW18_FPWM BIT(3)
  128468. +
  128469. +
  128470. +//2 SYS_ISO_CTRL
  128471. +#define ISO_MD2PP BIT(0)
  128472. +#define ISO_UA2USB BIT(1)
  128473. +#define ISO_UD2CORE BIT(2)
  128474. +#define ISO_PA2PCIE BIT(3)
  128475. +#define ISO_PD2CORE BIT(4)
  128476. +#define ISO_IP2MAC BIT(5)
  128477. +#define ISO_DIOP BIT(6)
  128478. +#define ISO_DIOE BIT(7)
  128479. +#define ISO_EB2CORE BIT(8)
  128480. +#define ISO_DIOR BIT(9)
  128481. +
  128482. +#define PWC_EV25V BIT(14)
  128483. +#define PWC_EV12V BIT(15)
  128484. +
  128485. +
  128486. +//2 SYS_FUNC_EN
  128487. +#define FEN_BBRSTB BIT(0)
  128488. +#define FEN_BB_GLB_RSTn BIT(1)
  128489. +#define FEN_USBA BIT(2)
  128490. +#define FEN_UPLL BIT(3)
  128491. +#define FEN_USBD BIT(4)
  128492. +#define FEN_DIO_PCIE BIT(5)
  128493. +#define FEN_PCIEA BIT(6)
  128494. +#define FEN_PPLL BIT(7)
  128495. +#define FEN_PCIED BIT(8)
  128496. +#define FEN_DIOE BIT(9)
  128497. +#define FEN_CPUEN BIT(10)
  128498. +#define FEN_DCORE BIT(11)
  128499. +#define FEN_ELDR BIT(12)
  128500. +#define FEN_DIO_RF BIT(13)
  128501. +#define FEN_HWPDN BIT(14)
  128502. +#define FEN_MREGEN BIT(15)
  128503. +
  128504. +//2 APS_FSMCO
  128505. +#define PFM_LDALL BIT(0)
  128506. +#define PFM_ALDN BIT(1)
  128507. +#define PFM_LDKP BIT(2)
  128508. +#define PFM_WOWL BIT(3)
  128509. +#define EnPDN BIT(4)
  128510. +#define PDN_PL BIT(5)
  128511. +#define APFM_ONMAC BIT(8)
  128512. +#define APFM_OFF BIT(9)
  128513. +#define APFM_RSM BIT(10)
  128514. +#define AFSM_HSUS BIT(11)
  128515. +#define AFSM_PCIE BIT(12)
  128516. +#define APDM_MAC BIT(13)
  128517. +#define APDM_HOST BIT(14)
  128518. +#define APDM_HPDN BIT(15)
  128519. +#define RDY_MACON BIT(16)
  128520. +#define SUS_HOST BIT(17)
  128521. +#define ROP_ALD BIT(20)
  128522. +#define ROP_PWR BIT(21)
  128523. +#define ROP_SPS BIT(22)
  128524. +#define SOP_MRST BIT(25)
  128525. +#define SOP_FUSE BIT(26)
  128526. +#define SOP_ABG BIT(27)
  128527. +#define SOP_AMB BIT(28)
  128528. +#define SOP_RCK BIT(29)
  128529. +#define SOP_A8M BIT(30)
  128530. +#define XOP_BTCK BIT(31)
  128531. +
  128532. +//2 SYS_CLKR
  128533. +#define ANAD16V_EN BIT(0)
  128534. +#define ANA8M BIT(1)
  128535. +#define MACSLP BIT(4)
  128536. +#define LOADER_CLK_EN BIT(5)
  128537. +#define _80M_SSC_DIS BIT(7)
  128538. +#define _80M_SSC_EN_HO BIT(8)
  128539. +#define PHY_SSC_RSTB BIT(9)
  128540. +#define SEC_CLK_EN BIT(10)
  128541. +#define MAC_CLK_EN BIT(11)
  128542. +#define SYS_CLK_EN BIT(12)
  128543. +#define RING_CLK_EN BIT(13)
  128544. +
  128545. +
  128546. +//2 9346CR
  128547. +
  128548. +#define BOOT_FROM_EEPROM BIT(4)
  128549. +#define EEPROM_EN BIT(5)
  128550. +
  128551. +
  128552. +//2 AFE_MISC
  128553. +#define AFE_BGEN BIT(0)
  128554. +#define AFE_MBEN BIT(1)
  128555. +#define MAC_ID_EN BIT(7)
  128556. +
  128557. +
  128558. +//2 SPS0_CTRL
  128559. +
  128560. +
  128561. +//2 SPS_OCP_CFG
  128562. +
  128563. +
  128564. +//2 RSV_CTRL
  128565. +#define WLOCK_ALL BIT(0)
  128566. +#define WLOCK_00 BIT(1)
  128567. +#define WLOCK_04 BIT(2)
  128568. +#define WLOCK_08 BIT(3)
  128569. +#define WLOCK_40 BIT(4)
  128570. +#define R_DIS_PRST_0 BIT(5)
  128571. +#define R_DIS_PRST_1 BIT(6)
  128572. +#define LOCK_ALL_EN BIT(7)
  128573. +
  128574. +//2 RF_CTRL
  128575. +#define RF_EN BIT(0)
  128576. +#define RF_RSTB BIT(1)
  128577. +#define RF_SDMRSTB BIT(2)
  128578. +
  128579. +
  128580. +
  128581. +//2 LDOA15_CTRL
  128582. +#define LDA15_EN BIT(0)
  128583. +#define LDA15_STBY BIT(1)
  128584. +#define LDA15_OBUF BIT(2)
  128585. +#define LDA15_REG_VOS BIT(3)
  128586. +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
  128587. +
  128588. +
  128589. +
  128590. +//2 LDOV12D_CTRL
  128591. +#define LDV12_EN BIT(0)
  128592. +#define LDV12_SDBY BIT(1)
  128593. +#define LPLDO_HSM BIT(2)
  128594. +#define LPLDO_LSM_DIS BIT(3)
  128595. +#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
  128596. +
  128597. +
  128598. +//2 AFE_XTAL_CTRL
  128599. +#define XTAL_EN BIT(0)
  128600. +#define XTAL_BSEL BIT(1)
  128601. +#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
  128602. +#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
  128603. +#define XTAL_GATE_USB BIT(8)
  128604. +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9)
  128605. +#define XTAL_GATE_AFE BIT(11)
  128606. +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12)
  128607. +#define XTAL_RF_GATE BIT(14)
  128608. +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15)
  128609. +#define XTAL_GATE_DIG BIT(17)
  128610. +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18)
  128611. +#define XTAL_BT_GATE BIT(20)
  128612. +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
  128613. +#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
  128614. +
  128615. +
  128616. +#define CKDLY_AFE BIT(26)
  128617. +#define CKDLY_USB BIT(27)
  128618. +#define CKDLY_DIG BIT(28)
  128619. +#define CKDLY_BT BIT(29)
  128620. +
  128621. +
  128622. +//2 AFE_PLL_CTRL
  128623. +#define APLL_EN BIT(0)
  128624. +#define APLL_320_EN BIT(1)
  128625. +#define APLL_FREF_SEL BIT(2)
  128626. +#define APLL_EDGE_SEL BIT(3)
  128627. +#define APLL_WDOGB BIT(4)
  128628. +#define APLL_LPFEN BIT(5)
  128629. +
  128630. +#define APLL_REF_CLK_13MHZ 0x1
  128631. +#define APLL_REF_CLK_19_2MHZ 0x2
  128632. +#define APLL_REF_CLK_20MHZ 0x3
  128633. +#define APLL_REF_CLK_25MHZ 0x4
  128634. +#define APLL_REF_CLK_26MHZ 0x5
  128635. +#define APLL_REF_CLK_38_4MHZ 0x6
  128636. +#define APLL_REF_CLK_40MHZ 0x7
  128637. +
  128638. +#define APLL_320EN BIT(14)
  128639. +#define APLL_80EN BIT(15)
  128640. +#define APLL_1MEN BIT(24)
  128641. +
  128642. +
  128643. +//2 EFUSE_CTRL
  128644. +#define ALD_EN BIT(18)
  128645. +#define EF_PD BIT(19)
  128646. +#define EF_FLAG BIT(31)
  128647. +
  128648. +//2 EFUSE_TEST
  128649. +#define EF_TRPT BIT(7)
  128650. +#define LDOE25_EN BIT(31)
  128651. +
  128652. +//2 PWR_DATA
  128653. +
  128654. +//2 CAL_TIMER
  128655. +
  128656. +//2 ACLK_MON
  128657. +#define RSM_EN BIT(0)
  128658. +#define Timer_EN BIT(4)
  128659. +
  128660. +
  128661. +//2 GPIO_MUXCFG
  128662. +#define TRSW0EN BIT(2)
  128663. +#define TRSW1EN BIT(3)
  128664. +#define EROM_EN BIT(4)
  128665. +#define EnBT BIT(5)
  128666. +#define EnUart BIT(8)
  128667. +#define Uart_910 BIT(9)
  128668. +#define EnPMAC BIT(10)
  128669. +#define SIC_SWRST BIT(11)
  128670. +#define EnSIC BIT(12)
  128671. +#define SIC_23 BIT(13)
  128672. +#define EnHDP BIT(14)
  128673. +#define SIC_LBK BIT(15)
  128674. +
  128675. +//2 GPIO_PIN_CTRL
  128676. +
  128677. +
  128678. +
  128679. +//2 GPIO_INTM
  128680. +
  128681. +//2 LEDCFG
  128682. +#define LED0PL BIT(4)
  128683. +#define LED1PL BIT(12)
  128684. +#define LED0DIS BIT(7)
  128685. +
  128686. +#define SECCAM_CLR BIT(30)
  128687. +
  128688. +//2 FSIMR
  128689. +
  128690. +//2 FSISR
  128691. +
  128692. +
  128693. +//2 8051FWDL
  128694. +//2 MCUFWDL
  128695. +#define MCUFWDL_EN BIT(0)
  128696. +#define MCUFWDL_RDY BIT(1)
  128697. +#define FWDL_ChkSum_rpt BIT(2)
  128698. +#define MACINI_RDY BIT(3)
  128699. +#define BBINI_RDY BIT(4)
  128700. +#define RFINI_RDY BIT(5)
  128701. +#define WINTINI_RDY BIT(6)
  128702. +#define MAC1_WINTINI_RDY BIT(11)// 0X81 BIT3
  128703. +#define CPRST BIT(23)
  128704. +
  128705. +
  128706. +
  128707. +
  128708. +//2 REG_SYS_CFG
  128709. +#define XCLK_VLD BIT(0)
  128710. +#define ACLK_VLD BIT(1)
  128711. +#define UCLK_VLD BIT(2)
  128712. +#define PCLK_VLD BIT(3)
  128713. +#define PCIRSTB BIT(4)
  128714. +#define V15_VLD BIT(5)
  128715. +#define TRP_B15V_EN BIT(7)
  128716. +#define SIC_IDLE BIT(8)
  128717. +#define BD_MAC2 BIT(9)
  128718. +#define BD_MAC1 BIT(10)
  128719. +#define IC_MACPHY_MODE BIT(11)
  128720. +#define PAD_HWPD_IDN BIT(22)
  128721. +#define TRP_VAUX_EN BIT(23)
  128722. +#define TRP_BT_EN BIT(24)
  128723. +#define BD_PKG_SEL BIT(25)
  128724. +#define BD_HCI_SEL BIT(26)
  128725. +#define TYPE_ID BIT(27)
  128726. +
  128727. +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15
  128728. +#define CHIP_VER_RTL_SHIFT 12
  128729. +
  128730. +//-----------------------------------------------------
  128731. +//
  128732. +// 0x0100h ~ 0x01FFh MACTOP General Configuration
  128733. +//
  128734. +//-----------------------------------------------------
  128735. +
  128736. +
  128737. +//2 Function Enable Registers
  128738. +//2 CR
  128739. +
  128740. +#define REG_LBMODE (REG_CR + 3)
  128741. +
  128742. +
  128743. +#define HCI_TXDMA_EN BIT(0)
  128744. +#define HCI_RXDMA_EN BIT(1)
  128745. +#define TXDMA_EN BIT(2)
  128746. +#define RXDMA_EN BIT(3)
  128747. +#define PROTOCOL_EN BIT(4)
  128748. +#define SCHEDULE_EN BIT(5)
  128749. +#define MACTXEN BIT(6)
  128750. +#define MACRXEN BIT(7)
  128751. +#define ENSWBCN BIT(8)
  128752. +#define ENSEC BIT(9)
  128753. +
  128754. +// Network type
  128755. +#define _NETTYPE(x) (((x) & 0x3) << 16)
  128756. +#define MASK_NETTYPE 0x30000
  128757. +#define NT_NO_LINK 0x0
  128758. +#define NT_LINK_AD_HOC 0x1
  128759. +#define NT_LINK_AP 0x2
  128760. +#define NT_AS_AP 0x3
  128761. +
  128762. +#define _LBMODE(x) (((x) & 0xF) << 24)
  128763. +#define MASK_LBMODE 0xF000000
  128764. +#define LOOPBACK_NORMAL 0x0
  128765. +#define LOOPBACK_IMMEDIATELY 0xB
  128766. +#define LOOPBACK_MAC_DELAY 0x3
  128767. +#define LOOPBACK_PHY 0x1
  128768. +#define LOOPBACK_DMA 0x7
  128769. +
  128770. +
  128771. +//2 PBP - Page Size Register
  128772. +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
  128773. +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
  128774. +#define _PSRX_MASK 0xF
  128775. +#define _PSTX_MASK 0xF0
  128776. +#define _PSRX(x) (x)
  128777. +#define _PSTX(x) ((x) << 4)
  128778. +
  128779. +#define PBP_64 0x0
  128780. +#define PBP_128 0x1
  128781. +#define PBP_256 0x2
  128782. +#define PBP_512 0x3
  128783. +#define PBP_1024 0x4
  128784. +
  128785. +
  128786. +//2 TX/RXDMA
  128787. +#define RXDMA_ARBBW_EN BIT(0)
  128788. +#define RXSHFT_EN BIT(1)
  128789. +#define RXDMA_AGG_EN BIT(2)
  128790. +#define QS_VO_QUEUE BIT(8)
  128791. +#define QS_VI_QUEUE BIT(9)
  128792. +#define QS_BE_QUEUE BIT(10)
  128793. +#define QS_BK_QUEUE BIT(11)
  128794. +#define QS_MANAGER_QUEUE BIT(12)
  128795. +#define QS_HIGH_QUEUE BIT(13)
  128796. +
  128797. +#define HQSEL_VOQ BIT(0)
  128798. +#define HQSEL_VIQ BIT(1)
  128799. +#define HQSEL_BEQ BIT(2)
  128800. +#define HQSEL_BKQ BIT(3)
  128801. +#define HQSEL_MGTQ BIT(4)
  128802. +#define HQSEL_HIQ BIT(5)
  128803. +
  128804. +// For normal driver, 0x10C
  128805. +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
  128806. +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
  128807. +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10)
  128808. +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 )
  128809. +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 )
  128810. +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 )
  128811. +
  128812. +#define QUEUE_LOW 1
  128813. +#define QUEUE_NORMAL 2
  128814. +#define QUEUE_HIGH 3
  128815. +
  128816. +
  128817. +
  128818. +//2 TRXFF_BNDY
  128819. +
  128820. +
  128821. +//2 LLT_INIT
  128822. +#define _LLT_NO_ACTIVE 0x0
  128823. +#define _LLT_WRITE_ACCESS 0x1
  128824. +#define _LLT_READ_ACCESS 0x2
  128825. +
  128826. +#define _LLT_INIT_DATA(x) ((x) & 0xFF)
  128827. +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
  128828. +#define _LLT_OP(x) (((x) & 0x3) << 30)
  128829. +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
  128830. +
  128831. +
  128832. +//2 BB_ACCESS_CTRL
  128833. +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
  128834. +#define BB_WRITE_EN BIT(30)
  128835. +#define BB_READ_EN BIT(31)
  128836. +//#define BB_ADDR_MASK 0xFFF
  128837. +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK)
  128838. +
  128839. +//-----------------------------------------------------
  128840. +//
  128841. +// 0x0200h ~ 0x027Fh TXDMA Configuration
  128842. +//
  128843. +//-----------------------------------------------------
  128844. +//2 RQPN
  128845. +#define _HPQ(x) ((x) & 0xFF)
  128846. +#define _LPQ(x) (((x) & 0xFF) << 8)
  128847. +#define _PUBQ(x) (((x) & 0xFF) << 16)
  128848. +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register
  128849. +
  128850. +
  128851. +#define HPQ_PUBLIC_DIS BIT(24)
  128852. +#define LPQ_PUBLIC_DIS BIT(25)
  128853. +#define LD_RQPN BIT(31)
  128854. +
  128855. +
  128856. +//2 TDECTRL
  128857. +#define BCN_VALID BIT(16)
  128858. +#define BCN_HEAD(x) (((x) & 0xFF) << 8)
  128859. +#define BCN_HEAD_MASK 0xFF00
  128860. +
  128861. +//2 TDECTL
  128862. +#define BLK_DESC_NUM_SHIFT 4
  128863. +#define BLK_DESC_NUM_MASK 0xF
  128864. +
  128865. +
  128866. +//2 TXDMA_OFFSET_CHK
  128867. +#define DROP_DATA_EN BIT(9)
  128868. +
  128869. +//-----------------------------------------------------
  128870. +//
  128871. +// 0x0400h ~ 0x047Fh Protocol Configuration
  128872. +//
  128873. +//-----------------------------------------------------
  128874. +//2 FWHW_TXQ_CTRL
  128875. +#define EN_AMPDU_RTY_NEW BIT(7)
  128876. +
  128877. +//2 INIRTSMCS_SEL
  128878. +#define _INIRTSMCS_SEL(x) ((x) & 0x3F)
  128879. +
  128880. +
  128881. +//2 SPEC SIFS
  128882. +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF)
  128883. +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8)
  128884. +
  128885. +
  128886. +//2 RRSR
  128887. +
  128888. +#define RATE_REG_BITMAP_ALL 0xFFFFF
  128889. +
  128890. +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF)
  128891. +
  128892. +#define _RRSR_RSC(x) (((x) & 0x3) << 21)
  128893. +#define RRSR_RSC_RESERVED 0x0
  128894. +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
  128895. +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
  128896. +#define RRSR_RSC_DUPLICATE_MODE 0x3
  128897. +
  128898. +
  128899. +//2 ARFR
  128900. +#define USE_SHORT_G1 BIT(20)
  128901. +
  128902. +//2 AGGLEN_LMT_L
  128903. +#define _AGGLMT_MCS0(x) ((x) & 0xF)
  128904. +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4)
  128905. +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8)
  128906. +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12)
  128907. +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16)
  128908. +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20)
  128909. +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
  128910. +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
  128911. +
  128912. +
  128913. +//2 RL
  128914. +#define RETRY_LIMIT_SHORT_SHIFT 8
  128915. +#define RETRY_LIMIT_LONG_SHIFT 0
  128916. +
  128917. +
  128918. +//2 DARFRC
  128919. +#define _DARF_RC1(x) ((x) & 0x1F)
  128920. +#define _DARF_RC2(x) (((x) & 0x1F) << 8)
  128921. +#define _DARF_RC3(x) (((x) & 0x1F) << 16)
  128922. +#define _DARF_RC4(x) (((x) & 0x1F) << 24)
  128923. +// NOTE: shift starting from address (DARFRC + 4)
  128924. +#define _DARF_RC5(x) ((x) & 0x1F)
  128925. +#define _DARF_RC6(x) (((x) & 0x1F) << 8)
  128926. +#define _DARF_RC7(x) (((x) & 0x1F) << 16)
  128927. +#define _DARF_RC8(x) (((x) & 0x1F) << 24)
  128928. +
  128929. +
  128930. +//2 RARFRC
  128931. +#define _RARF_RC1(x) ((x) & 0x1F)
  128932. +#define _RARF_RC2(x) (((x) & 0x1F) << 8)
  128933. +#define _RARF_RC3(x) (((x) & 0x1F) << 16)
  128934. +#define _RARF_RC4(x) (((x) & 0x1F) << 24)
  128935. +// NOTE: shift starting from address (RARFRC + 4)
  128936. +#define _RARF_RC5(x) ((x) & 0x1F)
  128937. +#define _RARF_RC6(x) (((x) & 0x1F) << 8)
  128938. +#define _RARF_RC7(x) (((x) & 0x1F) << 16)
  128939. +#define _RARF_RC8(x) (((x) & 0x1F) << 24)
  128940. +
  128941. +
  128942. +
  128943. +
  128944. +//-----------------------------------------------------
  128945. +//
  128946. +// 0x0500h ~ 0x05FFh EDCA Configuration
  128947. +//
  128948. +//-----------------------------------------------------
  128949. +
  128950. +
  128951. +
  128952. +//2 EDCA setting
  128953. +#define AC_PARAM_TXOP_LIMIT_OFFSET 16
  128954. +#define AC_PARAM_ECW_MAX_OFFSET 12
  128955. +#define AC_PARAM_ECW_MIN_OFFSET 8
  128956. +#define AC_PARAM_AIFS_OFFSET 0
  128957. +
  128958. +
  128959. +//2 EDCA_VO_PARAM
  128960. +#define _AIFS(x) (x)
  128961. +#define _ECW_MAX_MIN(x) ((x) << 8)
  128962. +#define _TXOP_LIMIT(x) ((x) << 16)
  128963. +
  128964. +
  128965. +#define _BCNIFS(x) ((x) & 0xFF)
  128966. +#define _BCNECW(x) (((x) & 0xF))<< 8)
  128967. +
  128968. +
  128969. +#define _LRL(x) ((x) & 0x3F)
  128970. +#define _SRL(x) (((x) & 0x3F) << 8)
  128971. +
  128972. +
  128973. +//2 SIFS_CCK
  128974. +#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
  128975. +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8);
  128976. +
  128977. +
  128978. +//2 SIFS_OFDM
  128979. +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
  128980. +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8);
  128981. +
  128982. +
  128983. +//2 TBTT PROHIBIT
  128984. +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
  128985. +
  128986. +
  128987. +//2 REG_RD_CTRL
  128988. +#define DIS_EDCA_CNT_DWN BIT(11)
  128989. +
  128990. +
  128991. +//2 BCN_CTRL
  128992. +#define EN_MBSSID BIT(1)
  128993. +#define EN_TXBCN_RPT BIT(2)
  128994. +#define EN_BCN_FUNCTION BIT(3)
  128995. +// The same function but different bit field.
  128996. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
  128997. +#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
  128998. +
  128999. +//2 ACMHWCTRL
  129000. +#define AcmHw_HwEn BIT(0)
  129001. +#define AcmHw_BeqEn BIT(1)
  129002. +#define AcmHw_ViqEn BIT(2)
  129003. +#define AcmHw_VoqEn BIT(3)
  129004. +#define AcmHw_BeqStatus BIT(4)
  129005. +#define AcmHw_ViqStatus BIT(5)
  129006. +#define AcmHw_VoqStatus BIT(6)
  129007. +
  129008. +
  129009. +
  129010. +//-----------------------------------------------------
  129011. +//
  129012. +// 0x0600h ~ 0x07FFh WMAC Configuration
  129013. +//
  129014. +//-----------------------------------------------------
  129015. +
  129016. +//2 APSD_CTRL
  129017. +#define APSDOFF BIT(6)
  129018. +#define APSDOFF_STATUS BIT(7)
  129019. +
  129020. +
  129021. +//2 BWOPMODE
  129022. +#define BW_20MHZ BIT(2)
  129023. +//#define BW_OPMODE_20MHZ BIT(2) // For compability
  129024. +
  129025. +
  129026. +#define RATE_BITMAP_ALL 0xFFFFF
  129027. +
  129028. +// Only use CCK 1M rate for ACK
  129029. +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
  129030. +#define RATE_RRSR_WITHOUT_CCK 0xFFFF0
  129031. +
  129032. +//2 TCR
  129033. +#define TSFRST BIT(0)
  129034. +#define DIS_GCLK BIT(1)
  129035. +#define PAD_SEL BIT(2)
  129036. +#define PWR_ST BIT(6)
  129037. +#define PWRBIT_OW_EN BIT(7)
  129038. +#define ACRC BIT(8)
  129039. +#define CFENDFORM BIT(9)
  129040. +#define ICV BIT(10)
  129041. +
  129042. +
  129043. +
  129044. +//2 RCR
  129045. +#define AAP BIT(0)
  129046. +#define APM BIT(1)
  129047. +#define AM BIT(2)
  129048. +#define AB BIT(3)
  129049. +#define ADD3 BIT(4)
  129050. +#define APWRMGT BIT(5)
  129051. +#define CBSSID BIT(6)
  129052. +#define CBSSID_BCN BIT(7)
  129053. +#define ACRC32 BIT(8)
  129054. +#define AICV BIT(9)
  129055. +#define ADF BIT(11)
  129056. +#define ACF BIT(12)
  129057. +#define AMF BIT(13)
  129058. +#define HTC_LOC_CTRL BIT(14)
  129059. +#define UC_DATA_EN BIT(16)
  129060. +#define BM_DATA_EN BIT(17)
  129061. +#define MFBEN BIT(22)
  129062. +#define LSIGEN BIT(23)
  129063. +#define EnMBID BIT(24)
  129064. +#define APP_BASSN BIT(27)
  129065. +#define APP_PHYSTS BIT(28)
  129066. +#define APP_ICV BIT(29)
  129067. +#define APP_MIC BIT(30)
  129068. +#define APP_FCS BIT(31)
  129069. +
  129070. +//2 RX_PKT_LIMIT
  129071. +
  129072. +//2 RX_DLK_TIME
  129073. +
  129074. +//2 MBIDCAMCFG
  129075. +
  129076. +
  129077. +
  129078. +//2 AMPDU_MIN_SPACE
  129079. +#define _MIN_SPACE(x) ((x) & 0x7)
  129080. +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
  129081. +
  129082. +
  129083. +//2 RXERR_RPT
  129084. +#define RXERR_TYPE_OFDM_PPDU 0
  129085. +#define RXERR_TYPE_OFDM_FALSE_ALARM 1
  129086. +#define RXERR_TYPE_OFDM_MPDU_OK 2
  129087. +#define RXERR_TYPE_OFDM_MPDU_FAIL 3
  129088. +#define RXERR_TYPE_CCK_PPDU 4
  129089. +#define RXERR_TYPE_CCK_FALSE_ALARM 5
  129090. +#define RXERR_TYPE_CCK_MPDU_OK 6
  129091. +#define RXERR_TYPE_CCK_MPDU_FAIL 7
  129092. +#define RXERR_TYPE_HT_PPDU 8
  129093. +#define RXERR_TYPE_HT_FALSE_ALARM 9
  129094. +#define RXERR_TYPE_HT_MPDU_TOTAL 10
  129095. +#define RXERR_TYPE_HT_MPDU_OK 11
  129096. +#define RXERR_TYPE_HT_MPDU_FAIL 12
  129097. +#define RXERR_TYPE_RX_FULL_DROP 15
  129098. +
  129099. +#define RXERR_COUNTER_MASK 0xFFFFF
  129100. +#define RXERR_RPT_RST BIT(27)
  129101. +#define _RXERR_RPT_SEL(type) ((type) << 28)
  129102. +
  129103. +
  129104. +//2 SECCFG
  129105. +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key
  129106. +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key
  129107. +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption
  129108. +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption
  129109. +#define SCR_SKByA2 BIT(4) //Search kEY BY A2
  129110. +#define SCR_NoSKMC BIT(5) //No Key Search Multicast
  129111. +#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key
  129112. +#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key
  129113. +
  129114. +//vivi added for new cam search flow, 20091028
  129115. +#ifdef HW_EN_DE_CRYPTION_FOR_NEW_CAM_SEARCH_FLOW
  129116. +#define SCR_TxUseBroadcastDK BIT6 //Force Tx Use Broadcast Default Key
  129117. +#define SCR_RxUseBroadcastDK BIT7 //Force Rx Use Broadcast Default Key
  129118. +#endif
  129119. +
  129120. +
  129121. +//-----------------------------------------------------
  129122. +//
  129123. +// 0xFE00h ~ 0xFE55h USB Configuration
  129124. +//
  129125. +//-----------------------------------------------------
  129126. +
  129127. +//2 USB Information (0xFE17)
  129128. +#define USB_IS_HIGH_SPEED 0
  129129. +#define USB_IS_FULL_SPEED 1
  129130. +#define USB_SPEED_MASK BIT(5)
  129131. +
  129132. +#define USB_NORMAL_SIE_EP_MASK 0xF
  129133. +#define USB_NORMAL_SIE_EP_SHIFT 4
  129134. +
  129135. +#define USB_TEST_EP_MASK 0x30
  129136. +#define USB_TEST_EP_SHIFT 4
  129137. +
  129138. +//2 Special Option
  129139. +#define USB_AGG_EN BIT(3)
  129140. +
  129141. +
  129142. +//2REG_C2HEVT_CLEAR
  129143. +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message
  129144. +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver.
  129145. +
  129146. +//2 8192D PartNo.
  129147. +#define PARTNO_92D_NIC (BIT7|BIT6)
  129148. +#define PARTNO_92D_NIC_REMARK (BIT5|BIT4)
  129149. +#define PARTNO_SINGLE_BAND_VS BIT3
  129150. +#define PARTNO_SINGLE_BAND_VS_REMARK BIT1
  129151. +#define PARTNO_CONCURRENT_BAND_VC (BIT3|BIT2)
  129152. +#define PARTNO_CONCURRENT_BAND_VC_REMARK (BIT1|BIT0)
  129153. +//========================================================
  129154. +// General definitions
  129155. +//========================================================
  129156. +
  129157. +#define MAC_ADDR_LEN 6
  129158. +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255
  129159. +#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC 127
  129160. +
  129161. +#define POLLING_LLT_THRESHOLD 20
  129162. +#define POLLING_READY_TIMEOUT_COUNT 1000
  129163. +
  129164. +// Min Spacing related settings.
  129165. +#define MAX_MSS_DENSITY_2T 0x13
  129166. +#define MAX_MSS_DENSITY_1T 0x0A
  129167. +// GPIO BIT
  129168. +#define HAL_8192C_HW_GPIO_WPS_BIT BIT2
  129169. +
  129170. +
  129171. +#include "basic_types.h"
  129172. +
  129173. +#endif
  129174. --- /dev/null
  129175. +++ b/drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h
  129176. @@ -0,0 +1,144 @@
  129177. +/******************************************************************************
  129178. + *
  129179. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  129180. + *
  129181. + * This program is free software; you can redistribute it and/or modify it
  129182. + * under the terms of version 2 of the GNU General Public License as
  129183. + * published by the Free Software Foundation.
  129184. + *
  129185. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129186. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129187. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129188. + * more details.
  129189. + *
  129190. + * You should have received a copy of the GNU General Public License along with
  129191. + * this program; if not, write to the Free Software Foundation, Inc.,
  129192. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129193. + *
  129194. + *
  129195. + ******************************************************************************/
  129196. +#ifndef _RTL8192D_XMIT_H_
  129197. +#define _RTL8192D_XMIT_H_
  129198. +
  129199. +//
  129200. +// Queue Select Value in TxDesc
  129201. +//
  129202. +#define QSLT_BK 0x2//0x01
  129203. +#define QSLT_BE 0x0
  129204. +#define QSLT_VI 0x5//0x4
  129205. +#define QSLT_VO 0x7//0x6
  129206. +#define QSLT_BEACON 0x10
  129207. +#define QSLT_HIGH 0x11
  129208. +#define QSLT_MGNT 0x12
  129209. +#define QSLT_CMD 0x13
  129210. +
  129211. +//Because we open EM for normal case, we just always insert 2*8 bytes.by wl
  129212. +#define USB_92D_DUMMY_OFFSET 2
  129213. +#define USB_92D_DUMMY_LENGTH (USB_92D_DUMMY_OFFSET * PACKET_OFFSET_SZ)
  129214. +#define USB_HWDESC_HEADER_LEN (TXDESC_SIZE + USB_92D_DUMMY_LENGTH)
  129215. +
  129216. +//For 92D early mode
  129217. +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)
  129218. +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value)
  129219. +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value)
  129220. +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value)
  129221. +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value)
  129222. +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value)
  129223. +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value)
  129224. +
  129225. +/* Copy from rtl8192c */
  129226. +struct txrpt_ccx_8192d {
  129227. + /* offset 0 */
  129228. + u8 retry_cnt:6;
  129229. + u8 rsvd_0:2;
  129230. +
  129231. + /* offset 1 */
  129232. + u8 rts_retry_cnt:6;
  129233. + u8 rsvd_1:2;
  129234. +
  129235. + /* offset 2 */
  129236. + u8 ccx_qtime0;
  129237. + u8 ccx_qtime1;
  129238. +
  129239. + /* offset 4 */
  129240. + u8 missed_pkt_num:5;
  129241. + u8 rsvd_4:3;
  129242. +
  129243. + /* offset 5 */
  129244. + u8 mac_id:5;
  129245. + u8 des1_fragssn:3;
  129246. +
  129247. + /* offset 6 */
  129248. + u8 rpt_pkt_num:5;
  129249. + u8 pkt_drop:1;
  129250. + u8 lifetime_over:1;
  129251. + u8 retry_over:1;
  129252. +
  129253. + /* offset 7*/
  129254. + u8 edca_tx_queue:4;
  129255. + u8 rsvd_7:1;
  129256. + u8 bmc:1;
  129257. + u8 pkt_ok:1;
  129258. + u8 int_ccx:1;
  129259. +};
  129260. +
  129261. +#define txrpt_ccx_qtime_8192d(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))
  129262. +
  129263. +#ifdef CONFIG_XMIT_ACK
  129264. +void dump_txrpt_ccx_8192d(void *buf);
  129265. +void handle_txrpt_ccx_8192d(_adapter *adapter, void *buf);
  129266. +#else
  129267. +#define dump_txrpt_ccx_8192d(buf) do {} while(0)
  129268. +#define handle_txrpt_ccx_8192d(adapter, buf) do {} while(0)
  129269. +#endif
  129270. +
  129271. +#ifdef CONFIG_USB_HCI
  129272. +
  129273. +#ifdef CONFIG_USB_TX_AGGREGATION
  129274. +#define MAX_TX_AGG_PACKET_NUMBER 0xFF
  129275. +#endif
  129276. +
  129277. +s32 rtl8192du_init_xmit_priv(_adapter * padapter);
  129278. +
  129279. +void rtl8192du_free_xmit_priv(_adapter * padapter);
  129280. +
  129281. +void rtl8192du_cal_txdesc_chksum(struct tx_desc *ptxdesc);
  129282. +
  129283. +s32 rtl8192du_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
  129284. +
  129285. +s32 rtl8192du_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);
  129286. +
  129287. +s32 rtl8192du_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);
  129288. +
  129289. +s32 rtl8192du_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  129290. +
  129291. +
  129292. +#ifdef CONFIG_HOSTAPD_MLME
  129293. +s32 rtl8192du_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);
  129294. +#endif
  129295. +
  129296. +#endif
  129297. +
  129298. +#ifdef CONFIG_PCI_HCI
  129299. +s32 rtl8192de_init_xmit_priv(_adapter * padapter);
  129300. +void rtl8192de_free_xmit_priv(_adapter * padapter);
  129301. +
  129302. +s32 rtl8192de_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf);
  129303. +struct xmit_buf *rtl8192de_dequeue_xmitbuf(struct rtw_tx_ring *ring);
  129304. +
  129305. +void rtl8192de_xmitframe_resume(_adapter *padapter);
  129306. +
  129307. +s32 rtl8192de_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);
  129308. +
  129309. +s32 rtl8192de_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);
  129310. +
  129311. +s32 rtl8192de_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  129312. +
  129313. +#ifdef CONFIG_HOSTAPD_MLME
  129314. +s32 rtl8192de_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);
  129315. +#endif
  129316. +
  129317. +#endif
  129318. +
  129319. +
  129320. +#endif
  129321. --- /dev/null
  129322. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_android.h
  129323. @@ -0,0 +1,89 @@
  129324. +/******************************************************************************
  129325. + *
  129326. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  129327. + *
  129328. + * This program is free software; you can redistribute it and/or modify it
  129329. + * under the terms of version 2 of the GNU General Public License as
  129330. + * published by the Free Software Foundation.
  129331. + *
  129332. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129333. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129334. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129335. + * more details.
  129336. + *
  129337. + * You should have received a copy of the GNU General Public License along with
  129338. + * this program; if not, write to the Free Software Foundation, Inc.,
  129339. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129340. + *
  129341. + *
  129342. + ******************************************************************************/
  129343. +
  129344. +#ifndef __RTW_ANDROID_H__
  129345. +#define __RTW_ANDROID_H__
  129346. +
  129347. +#include <linux/module.h>
  129348. +#include <linux/netdevice.h>
  129349. +
  129350. +enum ANDROID_WIFI_CMD {
  129351. + ANDROID_WIFI_CMD_START,
  129352. + ANDROID_WIFI_CMD_STOP,
  129353. + ANDROID_WIFI_CMD_SCAN_ACTIVE,
  129354. + ANDROID_WIFI_CMD_SCAN_PASSIVE,
  129355. + ANDROID_WIFI_CMD_RSSI,
  129356. + ANDROID_WIFI_CMD_LINKSPEED,
  129357. + ANDROID_WIFI_CMD_RXFILTER_START,
  129358. + ANDROID_WIFI_CMD_RXFILTER_STOP,
  129359. + ANDROID_WIFI_CMD_RXFILTER_ADD,
  129360. + ANDROID_WIFI_CMD_RXFILTER_REMOVE,
  129361. + ANDROID_WIFI_CMD_BTCOEXSCAN_START,
  129362. + ANDROID_WIFI_CMD_BTCOEXSCAN_STOP,
  129363. + ANDROID_WIFI_CMD_BTCOEXMODE,
  129364. + ANDROID_WIFI_CMD_SETSUSPENDOPT,
  129365. + ANDROID_WIFI_CMD_P2P_DEV_ADDR,
  129366. + ANDROID_WIFI_CMD_SETFWPATH,
  129367. + ANDROID_WIFI_CMD_SETBAND,
  129368. + ANDROID_WIFI_CMD_GETBAND,
  129369. + ANDROID_WIFI_CMD_COUNTRY,
  129370. + ANDROID_WIFI_CMD_P2P_SET_NOA,
  129371. + ANDROID_WIFI_CMD_P2P_GET_NOA,
  129372. + ANDROID_WIFI_CMD_P2P_SET_PS,
  129373. + ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,
  129374. +#ifdef PNO_SUPPORT
  129375. + ANDROID_WIFI_CMD_PNOSSIDCLR_SET,
  129376. + ANDROID_WIFI_CMD_PNOSETUP_SET,
  129377. + ANDROID_WIFI_CMD_PNOENABLE_SET,
  129378. + ANDROID_WIFI_CMD_PNODEBUG_SET,
  129379. +#endif
  129380. +
  129381. + ANDROID_WIFI_CMD_MACADDR,
  129382. +
  129383. + ANDROID_WIFI_CMD_BLOCK,
  129384. +
  129385. + ANDROID_WIFI_CMD_WFD_ENABLE,
  129386. + ANDROID_WIFI_CMD_WFD_DISABLE,
  129387. +
  129388. + ANDROID_WIFI_CMD_WFD_SET_TCPPORT,
  129389. + ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT,
  129390. + ANDROID_WIFI_CMD_WFD_SET_DEVTYPE,
  129391. +
  129392. + ANDROID_WIFI_CMD_MAX
  129393. +};
  129394. +
  129395. +int rtw_android_cmdstr_to_num(char *cmdstr);
  129396. +int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
  129397. +
  129398. +#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
  129399. +int rtw_android_wifictrl_func_add(void);
  129400. +void rtw_android_wifictrl_func_del(void);
  129401. +void* wl_android_prealloc(int section, unsigned long size);
  129402. +
  129403. +int wifi_get_irq_number(unsigned long *irq_flags_ptr);
  129404. +int wifi_set_power(int on, unsigned long msec);
  129405. +int wifi_get_mac_addr(unsigned char *buf);
  129406. +void *wifi_get_country_code(char *ccode);
  129407. +#else
  129408. +static int rtw_android_wifictrl_func_add(void) { return 0; }
  129409. +static void rtw_android_wifictrl_func_del(void) {}
  129410. +#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */
  129411. +
  129412. +#endif //__RTW_ANDROID_H__
  129413. --- /dev/null
  129414. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ap.h
  129415. @@ -0,0 +1,63 @@
  129416. +/******************************************************************************
  129417. + *
  129418. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  129419. + *
  129420. + * This program is free software; you can redistribute it and/or modify it
  129421. + * under the terms of version 2 of the GNU General Public License as
  129422. + * published by the Free Software Foundation.
  129423. + *
  129424. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129425. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129426. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129427. + * more details.
  129428. + *
  129429. + * You should have received a copy of the GNU General Public License along with
  129430. + * this program; if not, write to the Free Software Foundation, Inc.,
  129431. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129432. + *
  129433. + *
  129434. + ******************************************************************************/
  129435. +#ifndef __RTW_AP_H_
  129436. +#define __RTW_AP_H_
  129437. +
  129438. +#include <drv_conf.h>
  129439. +#include <osdep_service.h>
  129440. +#include <drv_types.h>
  129441. +
  129442. +
  129443. +#ifdef CONFIG_AP_MODE
  129444. +
  129445. +//external function
  129446. +extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta);
  129447. +extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta);
  129448. +
  129449. +
  129450. +void init_mlme_ap_info(_adapter *padapter);
  129451. +void free_mlme_ap_info(_adapter *padapter);
  129452. +//void update_BCNTIM(_adapter *padapter);
  129453. +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len);
  129454. +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index);
  129455. +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx);
  129456. +void expire_timeout_chk(_adapter *padapter);
  129457. +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta);
  129458. +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len);
  129459. +void rtw_ap_restore_network(_adapter *padapter);
  129460. +void rtw_set_macaddr_acl(_adapter *padapter, int mode);
  129461. +int rtw_acl_add_sta(_adapter *padapter, u8 *addr);
  129462. +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr);
  129463. +
  129464. +#ifdef CONFIG_NATIVEAP_MLME
  129465. +void associated_clients_update(_adapter *padapter, u8 updated);
  129466. +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta);
  129467. +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta);
  129468. +void sta_info_update(_adapter *padapter, struct sta_info *psta);
  129469. +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta);
  129470. +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason);
  129471. +int rtw_sta_flush(_adapter *padapter);
  129472. +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset);
  129473. +void start_ap_mode(_adapter *padapter);
  129474. +void stop_ap_mode(_adapter *padapter);
  129475. +#endif
  129476. +#endif //end of CONFIG_AP_MODE
  129477. +
  129478. +#endif
  129479. --- /dev/null
  129480. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h
  129481. @@ -0,0 +1,75 @@
  129482. +/******************************************************************************
  129483. + *
  129484. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  129485. + *
  129486. + * This program is free software; you can redistribute it and/or modify it
  129487. + * under the terms of version 2 of the GNU General Public License as
  129488. + * published by the Free Software Foundation.
  129489. + *
  129490. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129491. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129492. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129493. + * more details.
  129494. + *
  129495. + * You should have received a copy of the GNU General Public License along with
  129496. + * this program; if not, write to the Free Software Foundation, Inc.,
  129497. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129498. + *
  129499. + *
  129500. + ******************************************************************************/
  129501. +#ifndef _RTW_BR_EXT_H_
  129502. +#define _RTW_BR_EXT_H_
  129503. +
  129504. +#if 1 // rtw_wifi_driver
  129505. +#define CL_IPV6_PASS 1
  129506. +#define MACADDRLEN 6
  129507. +#define _DEBUG_ERR printk
  129508. +#define _DEBUG_INFO //printk
  129509. +#define DEBUG_WARN printk
  129510. +#define DEBUG_INFO //printk
  129511. +#define DEBUG_ERR printk
  129512. +//#define GET_MY_HWADDR ((GET_MIB(priv))->dot11OperationEntry.hwaddr)
  129513. +#define GET_MY_HWADDR(padapter) ((padapter)->eeprompriv.mac_addr)
  129514. +#endif // rtw_wifi_driver
  129515. +
  129516. +#define NAT25_HASH_BITS 4
  129517. +#define NAT25_HASH_SIZE (1 << NAT25_HASH_BITS)
  129518. +#define NAT25_AGEING_TIME 300
  129519. +
  129520. +#ifdef CL_IPV6_PASS
  129521. +#define MAX_NETWORK_ADDR_LEN 17
  129522. +#else
  129523. +#define MAX_NETWORK_ADDR_LEN 11
  129524. +#endif
  129525. +
  129526. +struct nat25_network_db_entry
  129527. +{
  129528. + struct nat25_network_db_entry *next_hash;
  129529. + struct nat25_network_db_entry **pprev_hash;
  129530. + atomic_t use_count;
  129531. + unsigned char macAddr[6];
  129532. + unsigned long ageing_timer;
  129533. + unsigned char networkAddr[MAX_NETWORK_ADDR_LEN];
  129534. +};
  129535. +
  129536. +enum NAT25_METHOD {
  129537. + NAT25_MIN,
  129538. + NAT25_CHECK,
  129539. + NAT25_INSERT,
  129540. + NAT25_LOOKUP,
  129541. + NAT25_PARSE,
  129542. + NAT25_MAX
  129543. +};
  129544. +
  129545. +struct br_ext_info {
  129546. + unsigned int nat25_disable;
  129547. + unsigned int macclone_enable;
  129548. + unsigned int dhcp_bcst_disable;
  129549. + int addPPPoETag; // 1: Add PPPoE relay-SID, 0: disable
  129550. + unsigned char nat25_dmzMac[MACADDRLEN];
  129551. + unsigned int nat25sc_disable;
  129552. +};
  129553. +
  129554. +void nat25_db_cleanup(_adapter *priv);
  129555. +
  129556. +#endif // _RTW_BR_EXT_H_
  129557. --- /dev/null
  129558. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h
  129559. @@ -0,0 +1,39 @@
  129560. +/******************************************************************************
  129561. + *
  129562. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  129563. + *
  129564. + * This program is free software; you can redistribute it and/or modify it
  129565. + * under the terms of version 2 of the GNU General Public License as
  129566. + * published by the Free Software Foundation.
  129567. + *
  129568. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129569. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129570. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129571. + * more details.
  129572. + *
  129573. + * You should have received a copy of the GNU General Public License along with
  129574. + * this program; if not, write to the Free Software Foundation, Inc.,
  129575. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129576. + *
  129577. + *
  129578. + ******************************************************************************/
  129579. +#ifndef _RTL871X_BYTEORDER_H_
  129580. +#define _RTL871X_BYTEORDER_H_
  129581. +
  129582. +#include <drv_conf.h>
  129583. +
  129584. +#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN)
  129585. +#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n"
  129586. +#endif
  129587. +
  129588. +#if defined (CONFIG_LITTLE_ENDIAN)
  129589. +#ifndef CONFIG_PLATFORM_MSTAR389
  129590. +# include <byteorder/little_endian.h>
  129591. +#endif
  129592. +#elif defined (CONFIG_BIG_ENDIAN)
  129593. +# include <byteorder/big_endian.h>
  129594. +#else
  129595. +# error "Must be LITTLE/BIG Endian Host"
  129596. +#endif
  129597. +
  129598. +#endif /* _RTL871X_BYTEORDER_H_ */
  129599. --- /dev/null
  129600. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_cmd.h
  129601. @@ -0,0 +1,1166 @@
  129602. +/******************************************************************************
  129603. + *
  129604. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  129605. + *
  129606. + * This program is free software; you can redistribute it and/or modify it
  129607. + * under the terms of version 2 of the GNU General Public License as
  129608. + * published by the Free Software Foundation.
  129609. + *
  129610. + * This program is distributed in the hope that it will be useful, but WITHOUT
  129611. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  129612. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  129613. + * more details.
  129614. + *
  129615. + * You should have received a copy of the GNU General Public License along with
  129616. + * this program; if not, write to the Free Software Foundation, Inc.,
  129617. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  129618. + *
  129619. + *
  129620. + ******************************************************************************/
  129621. +#ifndef __RTW_CMD_H_
  129622. +#define __RTW_CMD_H_
  129623. +
  129624. +#include <drv_conf.h>
  129625. +#include <wlan_bssdef.h>
  129626. +#include <rtw_rf.h>
  129627. +#include <rtw_led.h>
  129628. +
  129629. +#define C2H_MEM_SZ (16*1024)
  129630. +
  129631. +#ifndef CONFIG_RTL8711FW
  129632. +
  129633. + #include <osdep_service.h>
  129634. + #include <ieee80211.h> // <ieee80211/ieee80211.h>
  129635. +
  129636. +
  129637. + #define FREE_CMDOBJ_SZ 128
  129638. +
  129639. + #define MAX_CMDSZ 1024
  129640. + #define MAX_RSPSZ 512
  129641. + #define MAX_EVTSZ 1024
  129642. +
  129643. +#ifdef PLATFORM_OS_CE
  129644. + #define CMDBUFF_ALIGN_SZ 4
  129645. +#else
  129646. + #define CMDBUFF_ALIGN_SZ 512
  129647. +#endif
  129648. +
  129649. + struct cmd_obj {
  129650. + _adapter *padapter;
  129651. + u16 cmdcode;
  129652. + u8 res;
  129653. + u8 *parmbuf;
  129654. + u32 cmdsz;
  129655. + u8 *rsp;
  129656. + u32 rspsz;
  129657. + //_sema cmd_sem;
  129658. + _list list;
  129659. + };
  129660. +
  129661. + struct cmd_priv {
  129662. + _sema cmd_queue_sema;
  129663. + //_sema cmd_done_sema;
  129664. + _sema terminate_cmdthread_sema;
  129665. + _queue cmd_queue;
  129666. + u8 cmd_seq;
  129667. + u8 *cmd_buf; //shall be non-paged, and 4 bytes aligned
  129668. + u8 *cmd_allocated_buf;
  129669. + u8 *rsp_buf; //shall be non-paged, and 4 bytes aligned
  129670. + u8 *rsp_allocated_buf;
  129671. + u32 cmd_issued_cnt;
  129672. + u32 cmd_done_cnt;
  129673. + u32 rsp_cnt;
  129674. + u8 cmdthd_running;
  129675. + u8 stop_req;
  129676. + _adapter *padapter;
  129677. + };
  129678. +
  129679. +#ifdef CONFIG_EVENT_THREAD_MODE
  129680. + struct evt_obj {
  129681. + u16 evtcode;
  129682. + u8 res;
  129683. + u8 *parmbuf;
  129684. + u32 evtsz;
  129685. + _list list;
  129686. + };
  129687. +#endif
  129688. +
  129689. + struct evt_priv {
  129690. +#ifdef CONFIG_EVENT_THREAD_MODE
  129691. + _sema evt_notify;
  129692. + _sema terminate_evtthread_sema;
  129693. + _queue evt_queue;
  129694. +#endif
  129695. +
  129696. +//#define CONFIG_C2H_WK
  129697. +#ifdef CONFIG_C2H_WK
  129698. + _workitem c2h_wk;
  129699. + bool c2h_wk_alive;
  129700. + struct rtw_cbuf *c2h_queue;
  129701. + #define C2H_QUEUE_MAX_LEN 10
  129702. +#endif
  129703. +
  129704. +#ifdef CONFIG_H2CLBK
  129705. + _sema lbkevt_done;
  129706. + u8 lbkevt_limit;
  129707. + u8 lbkevt_num;
  129708. + u8 *cmdevt_parm;
  129709. +#endif
  129710. + ATOMIC_T event_seq;
  129711. + u8 *evt_buf; //shall be non-paged, and 4 bytes aligned
  129712. + u8 *evt_allocated_buf;
  129713. + u32 evt_done_cnt;
  129714. +#ifdef CONFIG_SDIO_HCI
  129715. + u8 *c2h_mem;
  129716. + u8 *allocated_c2h_mem;
  129717. +#ifdef PLATFORM_OS_XP
  129718. + PMDL pc2h_mdl;
  129719. +#endif
  129720. +#endif
  129721. +
  129722. + };
  129723. +
  129724. +#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \
  129725. +do {\
  129726. + _rtw_init_listhead(&pcmd->list);\
  129727. + pcmd->cmdcode = code;\
  129728. + pcmd->parmbuf = (u8 *)(pparm);\
  129729. + pcmd->cmdsz = sizeof (*pparm);\
  129730. + pcmd->rsp = NULL;\
  129731. + pcmd->rspsz = 0;\
  129732. +} while(0)
  129733. +
  129734. +struct c2h_evt_hdr {
  129735. + u8 id:4;
  129736. + u8 plen:4;
  129737. + u8 seq;
  129738. + u8 payload[0];
  129739. +};
  129740. +
  129741. +#define c2h_evt_exist(c2h_evt) ((c2h_evt)->id || (c2h_evt)->plen)
  129742. +
  129743. +extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);
  129744. +extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv);
  129745. +extern void rtw_free_cmd_obj(struct cmd_obj *pcmd);
  129746. +
  129747. +#ifdef CONFIG_EVENT_THREAD_MODE
  129748. +extern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj);
  129749. +extern struct evt_obj *rtw_dequeue_evt(_queue *queue);
  129750. +extern void rtw_free_evt_obj(struct evt_obj *pcmd);
  129751. +#endif
  129752. +
  129753. +void rtw_stop_cmd_thread(_adapter *adapter);
  129754. +thread_return rtw_cmd_thread(thread_context context);
  129755. +
  129756. +extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv);
  129757. +extern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv);
  129758. +
  129759. +extern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv);
  129760. +extern void rtw_free_evt_priv (struct evt_priv *pevtpriv);
  129761. +extern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv);
  129762. +extern void rtw_evt_notify_isr(struct evt_priv *pevtpriv);
  129763. +#ifdef CONFIG_P2P
  129764. +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType );
  129765. +#endif //CONFIG_P2P
  129766. +
  129767. +#else
  129768. + #include <ieee80211.h>
  129769. +#endif /* CONFIG_RTL8711FW */
  129770. +
  129771. +enum rtw_drvextra_cmd_id
  129772. +{
  129773. + NONE_WK_CID,
  129774. + DYNAMIC_CHK_WK_CID,
  129775. + DM_CTRL_WK_CID,
  129776. + PBC_POLLING_WK_CID,
  129777. + POWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend
  129778. + LPS_CTRL_WK_CID,
  129779. + ANT_SELECT_WK_CID,
  129780. + P2P_PS_WK_CID,
  129781. + P2P_PROTO_WK_CID,
  129782. + CHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty
  129783. + INTEl_WIDI_WK_CID,
  129784. + C2H_WK_CID,
  129785. + RESET_SECURITYPRIV, // add for CONFIG_IEEE80211W, none 11w also can use
  129786. + FREE_ASSOC_RESOURCES, // add for CONFIG_IEEE80211W, none 11w also can use
  129787. + MAX_WK_CID
  129788. +};
  129789. +
  129790. +enum LPS_CTRL_TYPE
  129791. +{
  129792. + LPS_CTRL_SCAN=0,
  129793. + LPS_CTRL_JOINBSS=1,
  129794. + LPS_CTRL_CONNECT=2,
  129795. + LPS_CTRL_DISCONNECT=3,
  129796. + LPS_CTRL_SPECIAL_PACKET=4,
  129797. +};
  129798. +
  129799. +enum RFINTFS {
  129800. + SWSI,
  129801. + HWSI,
  129802. + HWPI,
  129803. +};
  129804. +
  129805. +/*
  129806. +Caller Mode: Infra, Ad-HoC(C)
  129807. +
  129808. +Notes: To enter USB suspend mode
  129809. +
  129810. +Command Mode
  129811. +
  129812. +*/
  129813. +struct usb_suspend_parm {
  129814. + u32 action;// 1: sleep, 0:resume
  129815. +};
  129816. +
  129817. +/*
  129818. +Caller Mode: Infra, Ad-HoC
  129819. +
  129820. +Notes: To join a known BSS.
  129821. +
  129822. +Command-Event Mode
  129823. +
  129824. +*/
  129825. +
  129826. +/*
  129827. +Caller Mode: Infra, Ad-Hoc
  129828. +
  129829. +Notes: To join the specified bss
  129830. +
  129831. +Command Event Mode
  129832. +
  129833. +*/
  129834. +struct joinbss_parm {
  129835. + WLAN_BSSID_EX network;
  129836. +};
  129837. +
  129838. +/*
  129839. +Caller Mode: Infra, Ad-HoC(C)
  129840. +
  129841. +Notes: To disconnect the current associated BSS
  129842. +
  129843. +Command Mode
  129844. +
  129845. +*/
  129846. +struct disconnect_parm {
  129847. + u32 deauth_timeout_ms;
  129848. +};
  129849. +
  129850. +/*
  129851. +Caller Mode: AP, Ad-HoC(M)
  129852. +
  129853. +Notes: To create a BSS
  129854. +
  129855. +Command Mode
  129856. +*/
  129857. +struct createbss_parm {
  129858. + WLAN_BSSID_EX network;
  129859. +};
  129860. +
  129861. +/*
  129862. +Caller Mode: AP, Ad-HoC, Infra
  129863. +
  129864. +Notes: To set the NIC mode of RTL8711
  129865. +
  129866. +Command Mode
  129867. +
  129868. +The definition of mode:
  129869. +
  129870. +#define IW_MODE_AUTO 0 // Let the driver decides which AP to join
  129871. +#define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients)
  129872. +#define IW_MODE_INFRA 2 // Multi cell network, roaming, ..
  129873. +#define IW_MODE_MASTER 3 // Synchronisation master or Access Point
  129874. +#define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder)
  129875. +#define IW_MODE_SECOND 5 // Secondary master/repeater (backup)
  129876. +#define IW_MODE_MONITOR 6 // Passive monitor (listen only)
  129877. +
  129878. +*/
  129879. +struct setopmode_parm {
  129880. + u8 mode;
  129881. + u8 rsvd[3];
  129882. +};
  129883. +
  129884. +/*
  129885. +Caller Mode: AP, Ad-HoC, Infra
  129886. +
  129887. +Notes: To ask RTL8711 performing site-survey
  129888. +
  129889. +Command-Event Mode
  129890. +
  129891. +*/
  129892. +
  129893. +#define RTW_SSID_SCAN_AMOUNT 9 // for WEXT_CSCAN_AMOUNT 9
  129894. +#define RTW_CHANNEL_SCAN_AMOUNT (14+37)
  129895. +struct sitesurvey_parm {
  129896. + sint scan_mode; //active: 1, passive: 0
  129897. + /* sint bsslimit; // 1 ~ 48 */
  129898. + u8 ssid_num;
  129899. + u8 ch_num;
  129900. + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
  129901. + struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
  129902. +};
  129903. +
  129904. +/*
  129905. +Caller Mode: Any
  129906. +
  129907. +Notes: To set the auth type of RTL8711. open/shared/802.1x
  129908. +
  129909. +Command Mode
  129910. +
  129911. +*/
  129912. +struct setauth_parm {
  129913. + u8 mode; //0: legacy open, 1: legacy shared 2: 802.1x
  129914. + u8 _1x; //0: PSK, 1: TLS
  129915. + u8 rsvd[2];
  129916. +};
  129917. +
  129918. +/*
  129919. +Caller Mode: Infra
  129920. +
  129921. +a. algorithm: wep40, wep104, tkip & aes
  129922. +b. keytype: grp key/unicast key
  129923. +c. key contents
  129924. +
  129925. +when shared key ==> keyid is the camid
  129926. +when 802.1x ==> keyid [0:1] ==> grp key
  129927. +when 802.1x ==> keyid > 2 ==> unicast key
  129928. +
  129929. +*/
  129930. +struct setkey_parm {
  129931. + u8 algorithm; // encryption algorithm, could be none, wep40, TKIP, CCMP, wep104
  129932. + u8 keyid;
  129933. + u8 grpkey; // 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x
  129934. + u8 set_tx; // 1: main tx key for wep. 0: other key.
  129935. + u8 key[16]; // this could be 40 or 104
  129936. +};
  129937. +
  129938. +/*
  129939. +When in AP or Ad-Hoc mode, this is used to
  129940. +allocate an sw/hw entry for a newly associated sta.
  129941. +
  129942. +Command
  129943. +
  129944. +when shared key ==> algorithm/keyid
  129945. +
  129946. +*/
  129947. +struct set_stakey_parm {
  129948. + u8 addr[ETH_ALEN];
  129949. + u8 algorithm;
  129950. + u8 id;// currently for erasing cam entry if algorithm == _NO_PRIVACY_
  129951. + u8 key[16];
  129952. +};
  129953. +
  129954. +struct set_stakey_rsp {
  129955. + u8 addr[ETH_ALEN];
  129956. + u8 keyid;
  129957. + u8 rsvd;
  129958. +};
  129959. +
  129960. +/*
  129961. +Caller Ad-Hoc/AP
  129962. +
  129963. +Command -Rsp(AID == CAMID) mode
  129964. +
  129965. +This is to force fw to add an sta_data entry per driver's request.
  129966. +
  129967. +FW will write an cam entry associated with it.
  129968. +
  129969. +*/
  129970. +struct set_assocsta_parm {
  129971. + u8 addr[ETH_ALEN];
  129972. +};
  129973. +
  129974. +struct set_assocsta_rsp {
  129975. + u8 cam_id;
  129976. + u8 rsvd[3];
  129977. +};
  129978. +
  129979. +/*
  129980. + Caller Ad-Hoc/AP
  129981. +
  129982. + Command mode
  129983. +
  129984. + This is to force fw to del an sta_data entry per driver's request
  129985. +
  129986. + FW will invalidate the cam entry associated with it.
  129987. +
  129988. +*/
  129989. +struct del_assocsta_parm {
  129990. + u8 addr[ETH_ALEN];
  129991. +};
  129992. +
  129993. +/*
  129994. +Caller Mode: AP/Ad-HoC(M)
  129995. +
  129996. +Notes: To notify fw that given staid has changed its power state
  129997. +
  129998. +Command Mode
  129999. +
  130000. +*/
  130001. +struct setstapwrstate_parm {
  130002. + u8 staid;
  130003. + u8 status;
  130004. + u8 hwaddr[6];
  130005. +};
  130006. +
  130007. +/*
  130008. +Caller Mode: Any
  130009. +
  130010. +Notes: To setup the basic rate of RTL8711
  130011. +
  130012. +Command Mode
  130013. +
  130014. +*/
  130015. +struct setbasicrate_parm {
  130016. + u8 basicrates[NumRates];
  130017. +};
  130018. +
  130019. +/*
  130020. +Caller Mode: Any
  130021. +
  130022. +Notes: To read the current basic rate
  130023. +
  130024. +Command-Rsp Mode
  130025. +
  130026. +*/
  130027. +struct getbasicrate_parm {
  130028. + u32 rsvd;
  130029. +};
  130030. +
  130031. +struct getbasicrate_rsp {
  130032. + u8 basicrates[NumRates];
  130033. +};
  130034. +
  130035. +/*
  130036. +Caller Mode: Any
  130037. +
  130038. +Notes: To setup the data rate of RTL8711
  130039. +
  130040. +Command Mode
  130041. +
  130042. +*/
  130043. +struct setdatarate_parm {
  130044. +#ifdef MP_FIRMWARE_OFFLOAD
  130045. + u32 curr_rateidx;
  130046. +#else
  130047. + u8 mac_id;
  130048. + u8 datarates[NumRates];
  130049. +#endif
  130050. +};
  130051. +
  130052. +/*
  130053. +Caller Mode: Any
  130054. +
  130055. +Notes: To read the current data rate
  130056. +
  130057. +Command-Rsp Mode
  130058. +
  130059. +*/
  130060. +struct getdatarate_parm {
  130061. + u32 rsvd;
  130062. +
  130063. +};
  130064. +struct getdatarate_rsp {
  130065. + u8 datarates[NumRates];
  130066. +};
  130067. +
  130068. +
  130069. +/*
  130070. +Caller Mode: Any
  130071. +AP: AP can use the info for the contents of beacon frame
  130072. +Infra: STA can use the info when sitesurveying
  130073. +Ad-HoC(M): Like AP
  130074. +Ad-HoC(C): Like STA
  130075. +
  130076. +
  130077. +Notes: To set the phy capability of the NIC
  130078. +
  130079. +Command Mode
  130080. +
  130081. +*/
  130082. +
  130083. +struct setphyinfo_parm {
  130084. + struct regulatory_class class_sets[NUM_REGULATORYS];
  130085. + u8 status;
  130086. +};
  130087. +
  130088. +struct getphyinfo_parm {
  130089. + u32 rsvd;
  130090. +};
  130091. +
  130092. +struct getphyinfo_rsp {
  130093. + struct regulatory_class class_sets[NUM_REGULATORYS];
  130094. + u8 status;
  130095. +};
  130096. +
  130097. +/*
  130098. +Caller Mode: Any
  130099. +
  130100. +Notes: To set the channel/modem/band
  130101. +This command will be used when channel/modem/band is changed.
  130102. +
  130103. +Command Mode
  130104. +
  130105. +*/
  130106. +struct setphy_parm {
  130107. + u8 rfchannel;
  130108. + u8 modem;
  130109. +};
  130110. +
  130111. +/*
  130112. +Caller Mode: Any
  130113. +
  130114. +Notes: To get the current setting of channel/modem/band
  130115. +
  130116. +Command-Rsp Mode
  130117. +
  130118. +*/
  130119. +struct getphy_parm {
  130120. + u32 rsvd;
  130121. +
  130122. +};
  130123. +struct getphy_rsp {
  130124. + u8 rfchannel;
  130125. + u8 modem;
  130126. +};
  130127. +
  130128. +struct readBB_parm {
  130129. + u8 offset;
  130130. +};
  130131. +struct readBB_rsp {
  130132. + u8 value;
  130133. +};
  130134. +
  130135. +struct readTSSI_parm {
  130136. + u8 offset;
  130137. +};
  130138. +struct readTSSI_rsp {
  130139. + u8 value;
  130140. +};
  130141. +
  130142. +struct writeBB_parm {
  130143. + u8 offset;
  130144. + u8 value;
  130145. +};
  130146. +
  130147. +struct readRF_parm {
  130148. + u8 offset;
  130149. +};
  130150. +struct readRF_rsp {
  130151. + u32 value;
  130152. +};
  130153. +
  130154. +struct writeRF_parm {
  130155. + u32 offset;
  130156. + u32 value;
  130157. +};
  130158. +
  130159. +struct getrfintfs_parm {
  130160. + u8 rfintfs;
  130161. +};
  130162. +
  130163. +
  130164. +struct Tx_Beacon_param
  130165. +{
  130166. + WLAN_BSSID_EX network;
  130167. +};
  130168. +
  130169. +/*
  130170. + Notes: This command is used for H2C/C2H loopback testing
  130171. +
  130172. + mac[0] == 0
  130173. + ==> CMD mode, return H2C_SUCCESS.
  130174. + The following condition must be ture under CMD mode
  130175. + mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0;
  130176. + s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7;
  130177. + s2 == (b1 << 8 | b0);
  130178. +
  130179. + mac[0] == 1
  130180. + ==> CMD_RSP mode, return H2C_SUCCESS_RSP
  130181. +
  130182. + The rsp layout shall be:
  130183. + rsp: parm:
  130184. + mac[0] = mac[5];
  130185. + mac[1] = mac[4];
  130186. + mac[2] = mac[3];
  130187. + mac[3] = mac[2];
  130188. + mac[4] = mac[1];
  130189. + mac[5] = mac[0];
  130190. + s0 = s1;
  130191. + s1 = swap16(s0);
  130192. + w0 = swap32(w1);
  130193. + b0 = b1
  130194. + s2 = s0 + s1
  130195. + b1 = b0
  130196. + w1 = w0
  130197. +
  130198. + mac[0] == 2
  130199. + ==> CMD_EVENT mode, return H2C_SUCCESS
  130200. + The event layout shall be:
  130201. + event: parm:
  130202. + mac[0] = mac[5];
  130203. + mac[1] = mac[4];
  130204. + mac[2] = event's sequence number, starting from 1 to parm's marc[3]
  130205. + mac[3] = mac[2];
  130206. + mac[4] = mac[1];
  130207. + mac[5] = mac[0];
  130208. + s0 = swap16(s0) - event.mac[2];
  130209. + s1 = s1 + event.mac[2];
  130210. + w0 = swap32(w0);
  130211. + b0 = b1
  130212. + s2 = s0 + event.mac[2]
  130213. + b1 = b0
  130214. + w1 = swap32(w1) - event.mac[2];
  130215. +
  130216. + parm->mac[3] is the total event counts that host requested.
  130217. +
  130218. +
  130219. + event will be the same with the cmd's param.
  130220. +
  130221. +*/
  130222. +
  130223. +#ifdef CONFIG_H2CLBK
  130224. +
  130225. +struct seth2clbk_parm {
  130226. + u8 mac[6];
  130227. + u16 s0;
  130228. + u16 s1;
  130229. + u32 w0;
  130230. + u8 b0;
  130231. + u16 s2;
  130232. + u8 b1;
  130233. + u32 w1;
  130234. +};
  130235. +
  130236. +struct geth2clbk_parm {
  130237. + u32 rsv;
  130238. +};
  130239. +
  130240. +struct geth2clbk_rsp {
  130241. + u8 mac[6];
  130242. + u16 s0;
  130243. + u16 s1;
  130244. + u32 w0;
  130245. + u8 b0;
  130246. + u16 s2;
  130247. + u8 b1;
  130248. + u32 w1;
  130249. +};
  130250. +
  130251. +#endif /* CONFIG_H2CLBK */
  130252. +
  130253. +// CMD param Formart for driver extra cmd handler
  130254. +struct drvextra_cmd_parm {
  130255. + int ec_id; //extra cmd id
  130256. + int type_size; // Can use this field as the type id or command size
  130257. + unsigned char *pbuf;
  130258. +};
  130259. +
  130260. +/*------------------- Below are used for RF/BB tunning ---------------------*/
  130261. +
  130262. +struct setantenna_parm {
  130263. + u8 tx_antset;
  130264. + u8 rx_antset;
  130265. + u8 tx_antenna;
  130266. + u8 rx_antenna;
  130267. +};
  130268. +
  130269. +struct enrateadaptive_parm {
  130270. + u32 en;
  130271. +};
  130272. +
  130273. +struct settxagctbl_parm {
  130274. + u32 txagc[MAX_RATES_LENGTH];
  130275. +};
  130276. +
  130277. +struct gettxagctbl_parm {
  130278. + u32 rsvd;
  130279. +};
  130280. +struct gettxagctbl_rsp {
  130281. + u32 txagc[MAX_RATES_LENGTH];
  130282. +};
  130283. +
  130284. +struct setagcctrl_parm {
  130285. + u32 agcctrl; // 0: pure hw, 1: fw
  130286. +};
  130287. +
  130288. +
  130289. +struct setssup_parm {
  130290. + u32 ss_ForceUp[MAX_RATES_LENGTH];
  130291. +};
  130292. +
  130293. +struct getssup_parm {
  130294. + u32 rsvd;
  130295. +};
  130296. +struct getssup_rsp {
  130297. + u8 ss_ForceUp[MAX_RATES_LENGTH];
  130298. +};
  130299. +
  130300. +
  130301. +struct setssdlevel_parm {
  130302. + u8 ss_DLevel[MAX_RATES_LENGTH];
  130303. +};
  130304. +
  130305. +struct getssdlevel_parm {
  130306. + u32 rsvd;
  130307. +};
  130308. +struct getssdlevel_rsp {
  130309. + u8 ss_DLevel[MAX_RATES_LENGTH];
  130310. +};
  130311. +
  130312. +struct setssulevel_parm {
  130313. + u8 ss_ULevel[MAX_RATES_LENGTH];
  130314. +};
  130315. +
  130316. +struct getssulevel_parm {
  130317. + u32 rsvd;
  130318. +};
  130319. +struct getssulevel_rsp {
  130320. + u8 ss_ULevel[MAX_RATES_LENGTH];
  130321. +};
  130322. +
  130323. +
  130324. +struct setcountjudge_parm {
  130325. + u8 count_judge[MAX_RATES_LENGTH];
  130326. +};
  130327. +
  130328. +struct getcountjudge_parm {
  130329. + u32 rsvd;
  130330. +};
  130331. +struct getcountjudge_rsp {
  130332. + u8 count_judge[MAX_RATES_LENGTH];
  130333. +};
  130334. +
  130335. +
  130336. +struct setratable_parm {
  130337. + u8 ss_ForceUp[NumRates];
  130338. + u8 ss_ULevel[NumRates];
  130339. + u8 ss_DLevel[NumRates];
  130340. + u8 count_judge[NumRates];
  130341. +};
  130342. +
  130343. +struct getratable_parm {
  130344. + uint rsvd;
  130345. +};
  130346. +struct getratable_rsp {
  130347. + u8 ss_ForceUp[NumRates];
  130348. + u8 ss_ULevel[NumRates];
  130349. + u8 ss_DLevel[NumRates];
  130350. + u8 count_judge[NumRates];
  130351. +};
  130352. +
  130353. +
  130354. +//to get TX,RX retry count
  130355. +struct gettxretrycnt_parm{
  130356. + unsigned int rsvd;
  130357. +};
  130358. +struct gettxretrycnt_rsp{
  130359. + unsigned long tx_retrycnt;
  130360. +};
  130361. +
  130362. +struct getrxretrycnt_parm{
  130363. + unsigned int rsvd;
  130364. +};
  130365. +struct getrxretrycnt_rsp{
  130366. + unsigned long rx_retrycnt;
  130367. +};
  130368. +
  130369. +//to get BCNOK,BCNERR count
  130370. +struct getbcnokcnt_parm{
  130371. + unsigned int rsvd;
  130372. +};
  130373. +struct getbcnokcnt_rsp{
  130374. + unsigned long bcnokcnt;
  130375. +};
  130376. +
  130377. +struct getbcnerrcnt_parm{
  130378. + unsigned int rsvd;
  130379. +};
  130380. +struct getbcnerrcnt_rsp{
  130381. + unsigned long bcnerrcnt;
  130382. +};
  130383. +
  130384. +// to get current TX power level
  130385. +struct getcurtxpwrlevel_parm{
  130386. + unsigned int rsvd;
  130387. +};
  130388. +struct getcurtxpwrlevel_rsp{
  130389. + unsigned short tx_power;
  130390. +};
  130391. +
  130392. +struct setprobereqextraie_parm {
  130393. + unsigned char e_id;
  130394. + unsigned char ie_len;
  130395. + unsigned char ie[0];
  130396. +};
  130397. +
  130398. +struct setassocreqextraie_parm {
  130399. + unsigned char e_id;
  130400. + unsigned char ie_len;
  130401. + unsigned char ie[0];
  130402. +};
  130403. +
  130404. +struct setproberspextraie_parm {
  130405. + unsigned char e_id;
  130406. + unsigned char ie_len;
  130407. + unsigned char ie[0];
  130408. +};
  130409. +
  130410. +struct setassocrspextraie_parm {
  130411. + unsigned char e_id;
  130412. + unsigned char ie_len;
  130413. + unsigned char ie[0];
  130414. +};
  130415. +
  130416. +
  130417. +struct addBaReq_parm
  130418. +{
  130419. + unsigned int tid;
  130420. + u8 addr[ETH_ALEN];
  130421. +};
  130422. +
  130423. +/*H2C Handler index: 46 */
  130424. +struct set_ch_parm {
  130425. + u8 ch;
  130426. + u8 bw;
  130427. + u8 ch_offset;
  130428. +};
  130429. +
  130430. +#ifdef MP_FIRMWARE_OFFLOAD
  130431. +/*H2C Handler index: 47 */
  130432. +struct SetTxPower_parm
  130433. +{
  130434. + u8 TxPower;
  130435. +};
  130436. +
  130437. +/*H2C Handler index: 48 */
  130438. +struct SwitchAntenna_parm
  130439. +{
  130440. + u16 antenna_tx;
  130441. + u16 antenna_rx;
  130442. +// R_ANTENNA_SELECT_CCK cck_txrx;
  130443. + u8 cck_txrx;
  130444. +};
  130445. +
  130446. +/*H2C Handler index: 49 */
  130447. +struct SetCrystalCap_parm
  130448. +{
  130449. + u32 curr_crystalcap;
  130450. +};
  130451. +
  130452. +/*H2C Handler index: 50 */
  130453. +struct SetSingleCarrierTx_parm
  130454. +{
  130455. + u8 bStart;
  130456. +};
  130457. +
  130458. +/*H2C Handler index: 51 */
  130459. +struct SetSingleToneTx_parm
  130460. +{
  130461. + u8 bStart;
  130462. + u8 curr_rfpath;
  130463. +};
  130464. +
  130465. +/*H2C Handler index: 52 */
  130466. +struct SetCarrierSuppressionTx_parm
  130467. +{
  130468. + u8 bStart;
  130469. + u32 curr_rateidx;
  130470. +};
  130471. +
  130472. +/*H2C Handler index: 53 */
  130473. +struct SetContinuousTx_parm
  130474. +{
  130475. + u8 bStart;
  130476. + u8 CCK_flag; /*1:CCK 2:OFDM*/
  130477. + u32 curr_rateidx;
  130478. +};
  130479. +
  130480. +/*H2C Handler index: 54 */
  130481. +struct SwitchBandwidth_parm
  130482. +{
  130483. + u8 curr_bandwidth;
  130484. +};
  130485. +
  130486. +#endif /* MP_FIRMWARE_OFFLOAD */
  130487. +
  130488. +/*H2C Handler index: 59 */
  130489. +struct SetChannelPlan_param
  130490. +{
  130491. + u8 channel_plan;
  130492. +};
  130493. +
  130494. +/*H2C Handler index: 60 */
  130495. +struct LedBlink_param
  130496. +{
  130497. + PLED_871x pLed;
  130498. +};
  130499. +
  130500. +/*H2C Handler index: 61 */
  130501. +struct SetChannelSwitch_param
  130502. +{
  130503. + u8 new_ch_no;
  130504. +};
  130505. +
  130506. +/*H2C Handler index: 62 */
  130507. +struct TDLSoption_param
  130508. +{
  130509. + u8 addr[ETH_ALEN];
  130510. + u8 option;
  130511. +};
  130512. +
  130513. +#define GEN_CMD_CODE(cmd) cmd ## _CMD_
  130514. +
  130515. +
  130516. +/*
  130517. +
  130518. +Result:
  130519. +0x00: success
  130520. +0x01: sucess, and check Response.
  130521. +0x02: cmd ignored due to duplicated sequcne number
  130522. +0x03: cmd dropped due to invalid cmd code
  130523. +0x04: reserved.
  130524. +
  130525. +*/
  130526. +
  130527. +#define H2C_RSP_OFFSET 512
  130528. +
  130529. +#define H2C_SUCCESS 0x00
  130530. +#define H2C_SUCCESS_RSP 0x01
  130531. +#define H2C_DUPLICATED 0x02
  130532. +#define H2C_DROPPED 0x03
  130533. +#define H2C_PARAMETERS_ERROR 0x04
  130534. +#define H2C_REJECTED 0x05
  130535. +#define H2C_CMD_OVERFLOW 0x06
  130536. +#define H2C_RESERVED 0x07
  130537. +
  130538. +extern u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr);
  130539. +extern u8 rtw_setstandby_cmd(_adapter *padapter, uint action);
  130540. +u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num, struct rtw_ieee80211_channel *ch, int ch_num);
  130541. +extern u8 rtw_createbss_cmd(_adapter *padapter);
  130542. +extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz);
  130543. +extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch);
  130544. +extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key);
  130545. +extern u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue);
  130546. +extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork);
  130547. +u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue);
  130548. +extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
  130549. +extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset);
  130550. +extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset);
  130551. +extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val);
  130552. +extern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val);
  130553. +extern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval);
  130554. +extern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval);
  130555. +extern u8 rtw_setrfintfs_cmd(_adapter *padapter, u8 mode);
  130556. +extern u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table);
  130557. +extern u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval);
  130558. +
  130559. +extern u8 rtw_gettssi_cmd(_adapter *padapter, u8 offset,u8 *pval);
  130560. +extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type);
  130561. +extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type);
  130562. +
  130563. +extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr);
  130564. +// add for CONFIG_IEEE80211W, none 11w also can use
  130565. +extern u8 rtw_reset_securitypriv_cmd(_adapter*padapter);
  130566. +extern u8 rtw_free_assoc_resources_cmd(_adapter *padapter);
  130567. +extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter);
  130568. +
  130569. +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue);
  130570. +
  130571. +#ifdef CONFIG_ANTENNA_DIVERSITY
  130572. +extern u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue);
  130573. +#endif
  130574. +
  130575. +extern u8 rtw_ps_cmd(_adapter*padapter);
  130576. +
  130577. +
  130578. +#ifdef CONFIG_AP_MODE
  130579. +u8 rtw_chk_hi_queue_cmd(_adapter*padapter);
  130580. +#endif
  130581. +
  130582. +u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue);
  130583. +extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue);
  130584. +extern u8 rtw_led_blink_cmd(_adapter*padapter, PLED_871x pLed);
  130585. +extern u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no);
  130586. +extern u8 rtw_tdls_cmd(_adapter*padapter, u8 *addr, u8 option);
  130587. +
  130588. +extern u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt);
  130589. +
  130590. +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf);
  130591. +
  130592. +extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130593. +extern void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130594. +extern void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130595. +extern void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130596. +extern void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130597. +extern void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd);
  130598. +
  130599. +extern void rtw_setstaKey_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130600. +extern void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130601. +extern void rtw_getrttbl_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd);
  130602. +
  130603. +
  130604. +struct _cmd_callback {
  130605. + u32 cmd_code;
  130606. + void (*callback)(_adapter *padapter, struct cmd_obj *cmd);
  130607. +};
  130608. +
  130609. +enum rtw_h2c_cmd
  130610. +{
  130611. + GEN_CMD_CODE(_Read_MACREG) , /*0*/
  130612. + GEN_CMD_CODE(_Write_MACREG) ,
  130613. + GEN_CMD_CODE(_Read_BBREG) ,
  130614. + GEN_CMD_CODE(_Write_BBREG) ,
  130615. + GEN_CMD_CODE(_Read_RFREG) ,
  130616. + GEN_CMD_CODE(_Write_RFREG) , /*5*/
  130617. + GEN_CMD_CODE(_Read_EEPROM) ,
  130618. + GEN_CMD_CODE(_Write_EEPROM) ,
  130619. + GEN_CMD_CODE(_Read_EFUSE) ,
  130620. + GEN_CMD_CODE(_Write_EFUSE) ,
  130621. +
  130622. + GEN_CMD_CODE(_Read_CAM) , /*10*/
  130623. + GEN_CMD_CODE(_Write_CAM) ,
  130624. + GEN_CMD_CODE(_setBCNITV),
  130625. + GEN_CMD_CODE(_setMBIDCFG),
  130626. + GEN_CMD_CODE(_JoinBss), /*14*/
  130627. + GEN_CMD_CODE(_DisConnect) , /*15*/
  130628. + GEN_CMD_CODE(_CreateBss) ,
  130629. + GEN_CMD_CODE(_SetOpMode) ,
  130630. + GEN_CMD_CODE(_SiteSurvey), /*18*/
  130631. + GEN_CMD_CODE(_SetAuth) ,
  130632. +
  130633. + GEN_CMD_CODE(_SetKey) , /*20*/
  130634. + GEN_CMD_CODE(_SetStaKey) ,
  130635. + GEN_CMD_CODE(_SetAssocSta) ,
  130636. + GEN_CMD_CODE(_DelAssocSta) ,
  130637. + GEN_CMD_CODE(_SetStaPwrState) ,
  130638. + GEN_CMD_CODE(_SetBasicRate) , /*25*/
  130639. + GEN_CMD_CODE(_GetBasicRate) ,
  130640. + GEN_CMD_CODE(_SetDataRate) ,
  130641. + GEN_CMD_CODE(_GetDataRate) ,
  130642. + GEN_CMD_CODE(_SetPhyInfo) ,
  130643. +
  130644. + GEN_CMD_CODE(_GetPhyInfo) , /*30*/
  130645. + GEN_CMD_CODE(_SetPhy) ,
  130646. + GEN_CMD_CODE(_GetPhy) ,
  130647. + GEN_CMD_CODE(_readRssi) ,
  130648. + GEN_CMD_CODE(_readGain) ,
  130649. + GEN_CMD_CODE(_SetAtim) , /*35*/
  130650. + GEN_CMD_CODE(_SetPwrMode) ,
  130651. + GEN_CMD_CODE(_JoinbssRpt),
  130652. + GEN_CMD_CODE(_SetRaTable) ,
  130653. + GEN_CMD_CODE(_GetRaTable) ,
  130654. +
  130655. + GEN_CMD_CODE(_GetCCXReport), /*40*/
  130656. + GEN_CMD_CODE(_GetDTMReport),
  130657. + GEN_CMD_CODE(_GetTXRateStatistics),
  130658. + GEN_CMD_CODE(_SetUsbSuspend),
  130659. + GEN_CMD_CODE(_SetH2cLbk),
  130660. + GEN_CMD_CODE(_AddBAReq) , /*45*/
  130661. + GEN_CMD_CODE(_SetChannel), /*46*/
  130662. + GEN_CMD_CODE(_SetTxPower),
  130663. + GEN_CMD_CODE(_SwitchAntenna),
  130664. + GEN_CMD_CODE(_SetCrystalCap),
  130665. + GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/
  130666. +
  130667. + GEN_CMD_CODE(_SetSingleToneTx),/*51*/
  130668. + GEN_CMD_CODE(_SetCarrierSuppressionTx),
  130669. + GEN_CMD_CODE(_SetContinuousTx),
  130670. + GEN_CMD_CODE(_SwitchBandwidth), /*54*/
  130671. + GEN_CMD_CODE(_TX_Beacon), /*55*/
  130672. +
  130673. + GEN_CMD_CODE(_Set_MLME_EVT), /*56*/
  130674. + GEN_CMD_CODE(_Set_Drv_Extra), /*57*/
  130675. + GEN_CMD_CODE(_Set_H2C_MSG), /*58*/
  130676. +
  130677. + GEN_CMD_CODE(_SetChannelPlan), /*59*/
  130678. + GEN_CMD_CODE(_LedBlink), /*60*/
  130679. +
  130680. + GEN_CMD_CODE(_SetChannelSwitch), /*61*/
  130681. + GEN_CMD_CODE(_TDLS), /*62*/
  130682. +
  130683. + MAX_H2CCMD
  130684. +};
  130685. +
  130686. +#define _GetBBReg_CMD_ _Read_BBREG_CMD_
  130687. +#define _SetBBReg_CMD_ _Write_BBREG_CMD_
  130688. +#define _GetRFReg_CMD_ _Read_RFREG_CMD_
  130689. +#define _SetRFReg_CMD_ _Write_RFREG_CMD_
  130690. +
  130691. +#ifdef _RTW_CMD_C_
  130692. +struct _cmd_callback rtw_cmd_callback[] =
  130693. +{
  130694. + {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/
  130695. + {GEN_CMD_CODE(_Write_MACREG), NULL},
  130696. + {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback},
  130697. + {GEN_CMD_CODE(_Write_BBREG), NULL},
  130698. + {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback},
  130699. + {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/
  130700. + {GEN_CMD_CODE(_Read_EEPROM), NULL},
  130701. + {GEN_CMD_CODE(_Write_EEPROM), NULL},
  130702. + {GEN_CMD_CODE(_Read_EFUSE), NULL},
  130703. + {GEN_CMD_CODE(_Write_EFUSE), NULL},
  130704. +
  130705. + {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/
  130706. + {GEN_CMD_CODE(_Write_CAM), NULL},
  130707. + {GEN_CMD_CODE(_setBCNITV), NULL},
  130708. + {GEN_CMD_CODE(_setMBIDCFG), NULL},
  130709. + {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/
  130710. + {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/
  130711. + {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback},
  130712. + {GEN_CMD_CODE(_SetOpMode), NULL},
  130713. + {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/
  130714. + {GEN_CMD_CODE(_SetAuth), NULL},
  130715. +
  130716. + {GEN_CMD_CODE(_SetKey), NULL}, /*20*/
  130717. + {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback},
  130718. + {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback},
  130719. + {GEN_CMD_CODE(_DelAssocSta), NULL},
  130720. + {GEN_CMD_CODE(_SetStaPwrState), NULL},
  130721. + {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/
  130722. + {GEN_CMD_CODE(_GetBasicRate), NULL},
  130723. + {GEN_CMD_CODE(_SetDataRate), NULL},
  130724. + {GEN_CMD_CODE(_GetDataRate), NULL},
  130725. + {GEN_CMD_CODE(_SetPhyInfo), NULL},
  130726. +
  130727. + {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/
  130728. + {GEN_CMD_CODE(_SetPhy), NULL},
  130729. + {GEN_CMD_CODE(_GetPhy), NULL},
  130730. + {GEN_CMD_CODE(_readRssi), NULL},
  130731. + {GEN_CMD_CODE(_readGain), NULL},
  130732. + {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/
  130733. + {GEN_CMD_CODE(_SetPwrMode), NULL},
  130734. + {GEN_CMD_CODE(_JoinbssRpt), NULL},
  130735. + {GEN_CMD_CODE(_SetRaTable), NULL},
  130736. + {GEN_CMD_CODE(_GetRaTable) , NULL},
  130737. +
  130738. + {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/
  130739. + {GEN_CMD_CODE(_GetDTMReport), NULL},
  130740. + {GEN_CMD_CODE(_GetTXRateStatistics), NULL},
  130741. + {GEN_CMD_CODE(_SetUsbSuspend), NULL},
  130742. + {GEN_CMD_CODE(_SetH2cLbk), NULL},
  130743. + {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/
  130744. + {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/
  130745. + {GEN_CMD_CODE(_SetTxPower), NULL},
  130746. + {GEN_CMD_CODE(_SwitchAntenna), NULL},
  130747. + {GEN_CMD_CODE(_SetCrystalCap), NULL},
  130748. + {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/
  130749. +
  130750. + {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/
  130751. + {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL},
  130752. + {GEN_CMD_CODE(_SetContinuousTx), NULL},
  130753. + {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/
  130754. + {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/
  130755. +
  130756. + {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/
  130757. + {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/
  130758. + {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/
  130759. + {GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/
  130760. + {GEN_CMD_CODE(_LedBlink), NULL},/*60*/
  130761. +
  130762. + {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/
  130763. + {GEN_CMD_CODE(_TDLS), NULL},/*62*/
  130764. +};
  130765. +#endif
  130766. +
  130767. +#endif // _CMD_H_
  130768. --- /dev/null
  130769. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_debug.h
  130770. @@ -0,0 +1,537 @@
  130771. +/******************************************************************************
  130772. + *
  130773. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  130774. + *
  130775. + * This program is free software; you can redistribute it and/or modify it
  130776. + * under the terms of version 2 of the GNU General Public License as
  130777. + * published by the Free Software Foundation.
  130778. + *
  130779. + * This program is distributed in the hope that it will be useful, but WITHOUT
  130780. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  130781. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  130782. + * more details.
  130783. + *
  130784. + * You should have received a copy of the GNU General Public License along with
  130785. + * this program; if not, write to the Free Software Foundation, Inc.,
  130786. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  130787. + *
  130788. + *
  130789. + ******************************************************************************/
  130790. +#ifndef __RTW_DEBUG_H__
  130791. +#define __RTW_DEBUG_H__
  130792. +
  130793. +#include <drv_conf.h>
  130794. +#include <osdep_service.h>
  130795. +#include <drv_types.h>
  130796. +
  130797. +
  130798. +#define _no_debug_ 0
  130799. +#define _drv_emerg_ 1
  130800. +#define _drv_alert_ 2
  130801. +#define _drv_crit_ 3
  130802. +#define _drv_err_ 4
  130803. +#define _drv_warning_ 5
  130804. +#define _drv_notice_ 6
  130805. +#define _drv_info_ 7
  130806. +#define _drv_dump_ 8
  130807. +#define _drv_debug_ 9
  130808. +#define _drv_always_ _drv_emerg_
  130809. +
  130810. +#define _module_rtl871x_xmit_c_ BIT(0)
  130811. +#define _module_xmit_osdep_c_ BIT(1)
  130812. +#define _module_rtl871x_recv_c_ BIT(2)
  130813. +#define _module_recv_osdep_c_ BIT(3)
  130814. +#define _module_rtl871x_mlme_c_ BIT(4)
  130815. +#define _module_mlme_osdep_c_ BIT(5)
  130816. +#define _module_rtl871x_sta_mgt_c_ BIT(6)
  130817. +#define _module_rtl871x_cmd_c_ BIT(7)
  130818. +#define _module_cmd_osdep_c_ BIT(8)
  130819. +#define _module_rtl871x_io_c_ BIT(9)
  130820. +#define _module_io_osdep_c_ BIT(10)
  130821. +#define _module_os_intfs_c_ BIT(11)
  130822. +#define _module_rtl871x_security_c_ BIT(12)
  130823. +#define _module_rtl871x_eeprom_c_ BIT(13)
  130824. +#define _module_hal_init_c_ BIT(14)
  130825. +#define _module_hci_hal_init_c_ BIT(15)
  130826. +#define _module_rtl871x_ioctl_c_ BIT(16)
  130827. +#define _module_rtl871x_ioctl_set_c_ BIT(17)
  130828. +#define _module_rtl871x_ioctl_query_c_ BIT(18)
  130829. +#define _module_rtl871x_pwrctrl_c_ BIT(19)
  130830. +#define _module_hci_intfs_c_ BIT(20)
  130831. +#define _module_hci_ops_c_ BIT(21)
  130832. +#define _module_osdep_service_c_ BIT(22)
  130833. +#define _module_mp_ BIT(23)
  130834. +#define _module_hci_ops_os_c_ BIT(24)
  130835. +#define _module_rtl871x_ioctl_os_c BIT(25)
  130836. +#define _module_rtl8712_cmd_c_ BIT(26)
  130837. +//#define _module_efuse_ BIT(27)
  130838. +#define _module_rtl8192c_xmit_c_ BIT(28)
  130839. +#define _module_hal_xmit_c_ BIT(28)
  130840. +#define _module_efuse_ BIT(29)
  130841. +#define _module_rtl8712_recv_c_ BIT(30)
  130842. +#define _module_rtl8712_led_c_ BIT(31)
  130843. +
  130844. +#undef _MODULE_DEFINE_
  130845. +
  130846. +#if defined _RTW_XMIT_C_
  130847. + #define _MODULE_DEFINE_ _module_rtl871x_xmit_c_
  130848. +#elif defined _XMIT_OSDEP_C_
  130849. + #define _MODULE_DEFINE_ _module_xmit_osdep_c_
  130850. +#elif defined _RTW_RECV_C_
  130851. + #define _MODULE_DEFINE_ _module_rtl871x_recv_c_
  130852. +#elif defined _RECV_OSDEP_C_
  130853. + #define _MODULE_DEFINE_ _module_recv_osdep_c_
  130854. +#elif defined _RTW_MLME_C_
  130855. + #define _MODULE_DEFINE_ _module_rtl871x_mlme_c_
  130856. +#elif defined _MLME_OSDEP_C_
  130857. + #define _MODULE_DEFINE_ _module_mlme_osdep_c_
  130858. +#elif defined _RTW_MLME_EXT_C_
  130859. + #define _MODULE_DEFINE_ 1
  130860. +#elif defined _RTW_STA_MGT_C_
  130861. + #define _MODULE_DEFINE_ _module_rtl871x_sta_mgt_c_
  130862. +#elif defined _RTW_CMD_C_
  130863. + #define _MODULE_DEFINE_ _module_rtl871x_cmd_c_
  130864. +#elif defined _CMD_OSDEP_C_
  130865. + #define _MODULE_DEFINE_ _module_cmd_osdep_c_
  130866. +#elif defined _RTW_IO_C_
  130867. + #define _MODULE_DEFINE_ _module_rtl871x_io_c_
  130868. +#elif defined _IO_OSDEP_C_
  130869. + #define _MODULE_DEFINE_ _module_io_osdep_c_
  130870. +#elif defined _OS_INTFS_C_
  130871. + #define _MODULE_DEFINE_ _module_os_intfs_c_
  130872. +#elif defined _RTW_SECURITY_C_
  130873. + #define _MODULE_DEFINE_ _module_rtl871x_security_c_
  130874. +#elif defined _RTW_EEPROM_C_
  130875. + #define _MODULE_DEFINE_ _module_rtl871x_eeprom_c_
  130876. +#elif defined _HAL_INTF_C_
  130877. + #define _MODULE_DEFINE_ _module_hal_init_c_
  130878. +#elif defined _HCI_HAL_INIT_C_
  130879. + #define _MODULE_DEFINE_ _module_hci_hal_init_c_
  130880. +#elif defined _RTL871X_IOCTL_C_
  130881. + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_c_
  130882. +#elif defined _RTL871X_IOCTL_SET_C_
  130883. + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_set_c_
  130884. +#elif defined _RTL871X_IOCTL_QUERY_C_
  130885. + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_query_c_
  130886. +#elif defined _RTL871X_PWRCTRL_C_
  130887. + #define _MODULE_DEFINE_ _module_rtl871x_pwrctrl_c_
  130888. +#elif defined _RTW_PWRCTRL_C_
  130889. + #define _MODULE_DEFINE_ 1
  130890. +#elif defined _HCI_INTF_C_
  130891. + #define _MODULE_DEFINE_ _module_hci_intfs_c_
  130892. +#elif defined _HCI_OPS_C_
  130893. + #define _MODULE_DEFINE_ _module_hci_ops_c_
  130894. +#elif defined _SDIO_OPS_C_
  130895. + #define _MODULE_DEFINE_ 1
  130896. +#elif defined _OSDEP_HCI_INTF_C_
  130897. + #define _MODULE_DEFINE_ _module_hci_intfs_c_
  130898. +#elif defined _OSDEP_SERVICE_C_
  130899. + #define _MODULE_DEFINE_ _module_osdep_service_c_
  130900. +#elif defined _HCI_OPS_OS_C_
  130901. + #define _MODULE_DEFINE_ _module_hci_ops_os_c_
  130902. +#elif defined _RTL871X_IOCTL_LINUX_C_
  130903. + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_os_c
  130904. +#elif defined _RTL8712_CMD_C_
  130905. + #define _MODULE_DEFINE_ _module_rtl8712_cmd_c_
  130906. +#elif defined _RTL8192C_XMIT_C_
  130907. + #define _MODULE_DEFINE_ 1
  130908. +#elif defined _RTL8723AS_XMIT_C_
  130909. + #define _MODULE_DEFINE_ 1
  130910. +#elif defined _RTL8712_RECV_C_
  130911. + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_
  130912. +#elif defined _RTL8192CU_RECV_C_
  130913. + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_
  130914. +#elif defined _RTL871X_MLME_EXT_C_
  130915. + #define _MODULE_DEFINE_ _module_mlme_osdep_c_
  130916. +#elif defined _RTW_MP_C_
  130917. + #define _MODULE_DEFINE_ _module_mp_
  130918. +#elif defined _RTW_MP_IOCTL_C_
  130919. + #define _MODULE_DEFINE_ _module_mp_
  130920. +#elif defined _RTW_EFUSE_C_
  130921. + #define _MODULE_DEFINE_ _module_efuse_
  130922. +#endif
  130923. +
  130924. +#ifdef PLATFORM_OS_CE
  130925. +extern void rtl871x_cedbg(const char *fmt, ...);
  130926. +#endif
  130927. +
  130928. +#define RT_TRACE(_Comp, _Level, Fmt) do{}while(0)
  130929. +#define _func_enter_ do{}while(0)
  130930. +#define _func_exit_ do{}while(0)
  130931. +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) do{}while(0)
  130932. +
  130933. +#undef _dbgdump
  130934. +
  130935. +#ifdef CONFIG_DEBUG_RTL871X
  130936. +
  130937. +#ifndef _RTL871X_DEBUG_C_
  130938. + extern u32 GlobalDebugLevel;
  130939. + extern u64 GlobalDebugComponents;
  130940. +#endif
  130941. +
  130942. +#ifdef PLATFORM_WINDOWS
  130943. +
  130944. + #ifdef PLATFORM_OS_XP
  130945. +
  130946. + #define _dbgdump DbgPrint
  130947. +
  130948. + #elif defined PLATFORM_OS_CE
  130949. +
  130950. + #define _dbgdump rtl871x_cedbg
  130951. +
  130952. + #endif
  130953. +
  130954. +#elif defined PLATFORM_LINUX
  130955. +
  130956. + #define _dbgdump printk
  130957. +
  130958. +#elif defined PLATFORM_FREEBSD
  130959. +
  130960. + #define _dbgdump printf
  130961. +
  130962. +#endif
  130963. +
  130964. +#endif /* CONFIG_DEBUG_RTL871X */
  130965. +
  130966. +
  130967. +#if defined (_dbgdump) && defined (_MODULE_DEFINE_)
  130968. +
  130969. + #undef RT_TRACE
  130970. + #define RT_TRACE(_Comp, _Level, Fmt)\
  130971. + do {\
  130972. + if((_Comp & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) {\
  130973. + _dbgdump("%s [0x%08x,%d]", RTL871X_MODULE_NAME, (unsigned int)_Comp, _Level);\
  130974. + _dbgdump Fmt;\
  130975. + }\
  130976. + }while(0)
  130977. +
  130978. +#endif
  130979. +
  130980. +
  130981. +#if defined (_dbgdump)
  130982. +
  130983. + #undef _func_enter_
  130984. + #define _func_enter_ \
  130985. + do { \
  130986. + if (GlobalDebugLevel >= _drv_debug_) \
  130987. + { \
  130988. + _dbgdump("\n %s : %s enters at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__);\
  130989. + } \
  130990. + } while(0)
  130991. +
  130992. + #undef _func_exit_
  130993. + #define _func_exit_ \
  130994. + do { \
  130995. + if (GlobalDebugLevel >= _drv_debug_) \
  130996. + { \
  130997. + _dbgdump("\n %s : %s exits at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__); \
  130998. + } \
  130999. + } while(0)
  131000. +
  131001. + #undef RT_PRINT_DATA
  131002. + #define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) \
  131003. + if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \
  131004. + { \
  131005. + int __i; \
  131006. + u8 *ptr = (u8 *)_HexData; \
  131007. + _dbgdump("Rtl871x: "); \
  131008. + _dbgdump(_TitleString); \
  131009. + for( __i=0; __i<(int)_HexDataLen; __i++ ) \
  131010. + { \
  131011. + _dbgdump("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" "); \
  131012. + if (((__i + 1) % 16) == 0) _dbgdump("\n"); \
  131013. + } \
  131014. + _dbgdump("\n"); \
  131015. + }
  131016. +#endif
  131017. +
  131018. +
  131019. +#ifdef CONFIG_DEBUG_RTL819X
  131020. +
  131021. +#undef _dbgdump
  131022. +
  131023. +#ifdef PLATFORM_WINDOWS
  131024. +
  131025. + #ifdef PLATFORM_OS_XP
  131026. +
  131027. + #define _dbgdump DbgPrint
  131028. +
  131029. + #elif defined PLATFORM_OS_CE
  131030. +
  131031. + #define _dbgdump rtl871x_cedbg
  131032. +
  131033. + #endif
  131034. +
  131035. +#elif defined PLATFORM_LINUX
  131036. +
  131037. + #define _dbgdump printk
  131038. +
  131039. +#elif defined PLATFORM_FREEBSD
  131040. +
  131041. + #define _dbgdump printf
  131042. +
  131043. +#endif
  131044. +
  131045. +#endif /* CONFIG_DEBUG_RTL819X */
  131046. +
  131047. +
  131048. +#ifdef PLATFORM_WINDOWS
  131049. + #define DBG_871X do {} while(0)
  131050. + #define MSG_8192C do {} while(0)
  131051. + #define DBG_8192C do {} while(0)
  131052. + #define WRN_8192C do {} while(0)
  131053. + #define ERR_8192C do {} while(0)
  131054. +#endif
  131055. +
  131056. +#ifdef PLATFORM_LINUX
  131057. + #define DBG_871X(x, ...) do {} while(0)
  131058. + #define MSG_8192C(x, ...) do {} while(0)
  131059. + #define DBG_8192C(x,...) do {} while(0)
  131060. + #define WRN_8192C(x,...) do {} while(0)
  131061. + #define ERR_8192C(x,...) do {} while(0)
  131062. +#endif
  131063. +
  131064. +#ifdef PLATFORM_FREEBSD
  131065. + #define _dbgdump printf
  131066. + #define DBG_871X(x, ...) do {} while(0)
  131067. + #define MSG_8192C(x, ...) do {} while(0)
  131068. + #define DBG_8192C(x,...) do {} while(0)
  131069. + #define WRN_8192C(x,...) do {} while(0)
  131070. + #define ERR_8192C(x,...) do {} while(0)
  131071. +#endif
  131072. +
  131073. +extern u32 GlobalDebugLevel;
  131074. +#define LOG_LEVEL(level, ...)\
  131075. + do {\
  131076. + if(level <= GlobalDebugLevel) {\
  131077. + printk(__VA_ARGS__);\
  131078. + }\
  131079. + }while(0)
  131080. +
  131081. +#define DBG_871X_LEVEL LOG_LEVEL
  131082. +
  131083. +#if defined (_dbgdump)
  131084. + #undef DBG_871X
  131085. +// #define DBG_871X _dbgdump
  131086. + #define DBG_871X(...) LOG_LEVEL(_drv_emerg_ , __VA_ARGS__)
  131087. +
  131088. + #undef MSG_8192C
  131089. +// #define MSG_8192C _dbgdump
  131090. + #define MSG_8192C(...) LOG_LEVEL(_drv_emerg_ , __VA_ARGS__)
  131091. +
  131092. + #undef DBG_8192C
  131093. +// #define DBG_8192C _dbgdump
  131094. + #define DBG_8192C(...) LOG_LEVEL(_drv_emerg_ , __VA_ARGS__)
  131095. +
  131096. +
  131097. + #undef WRN_8192C
  131098. + #define WRN_8192C _dbgdump
  131099. +
  131100. + #undef ERR_8192C
  131101. + #define ERR_8192C _dbgdump
  131102. +#endif
  131103. +
  131104. +
  131105. +#ifdef CONFIG_PROC_DEBUG
  131106. +
  131107. + int proc_get_drv_version(char *page, char **start,
  131108. + off_t offset, int count,
  131109. + int *eof, void *data);
  131110. +
  131111. + int proc_get_log_level(char *page, char **start,
  131112. + off_t offset, int count,
  131113. + int *eof, void *data);
  131114. +
  131115. + int proc_set_log_level(struct file *file, const char *buffer,
  131116. + unsigned long count, void *data);
  131117. +
  131118. +#ifdef DBG_MEM_ALLOC
  131119. + int proc_get_mstat(char *page, char **start,
  131120. + off_t offset, int count,
  131121. + int *eof, void *data);
  131122. +#endif /* DBG_MEM_ALLOC */
  131123. +
  131124. + int proc_get_write_reg(char *page, char **start,
  131125. + off_t offset, int count,
  131126. + int *eof, void *data);
  131127. +
  131128. + int proc_set_write_reg(struct file *file, const char *buffer,
  131129. + unsigned long count, void *data);
  131130. +
  131131. + int proc_get_read_reg(char *page, char **start,
  131132. + off_t offset, int count,
  131133. + int *eof, void *data);
  131134. +
  131135. + int proc_set_read_reg(struct file *file, const char *buffer,
  131136. + unsigned long count, void *data);
  131137. +
  131138. +
  131139. + int proc_get_fwstate(char *page, char **start,
  131140. + off_t offset, int count,
  131141. + int *eof, void *data);
  131142. +
  131143. + int proc_get_sec_info(char *page, char **start,
  131144. + off_t offset, int count,
  131145. + int *eof, void *data);
  131146. +
  131147. + int proc_get_mlmext_state(char *page, char **start,
  131148. + off_t offset, int count,
  131149. + int *eof, void *data);
  131150. +
  131151. + int proc_get_qos_option(char *page, char **start,
  131152. + off_t offset, int count,
  131153. + int *eof, void *data);
  131154. +
  131155. + int proc_get_ht_option(char *page, char **start,
  131156. + off_t offset, int count,
  131157. + int *eof, void *data);
  131158. +
  131159. + int proc_get_rf_info(char *page, char **start,
  131160. + off_t offset, int count,
  131161. + int *eof, void *data);
  131162. +
  131163. + int proc_get_ap_info(char *page, char **start,
  131164. + off_t offset, int count,
  131165. + int *eof, void *data);
  131166. +
  131167. + int proc_get_adapter_state(char *page, char **start,
  131168. + off_t offset, int count,
  131169. + int *eof, void *data);
  131170. +
  131171. + int proc_get_trx_info(char *page, char **start,
  131172. + off_t offset, int count,
  131173. + int *eof, void *data);
  131174. +
  131175. + int proc_get_mac_reg_dump1(char *page, char **start,
  131176. + off_t offset, int count,
  131177. + int *eof, void *data);
  131178. +
  131179. + int proc_get_mac_reg_dump2(char *page, char **start,
  131180. + off_t offset, int count,
  131181. + int *eof, void *data);
  131182. +
  131183. + int proc_get_mac_reg_dump3(char *page, char **start,
  131184. + off_t offset, int count,
  131185. + int *eof, void *data);
  131186. +
  131187. + int proc_get_bb_reg_dump1(char *page, char **start,
  131188. + off_t offset, int count,
  131189. + int *eof, void *data);
  131190. +
  131191. + int proc_get_bb_reg_dump2(char *page, char **start,
  131192. + off_t offset, int count,
  131193. + int *eof, void *data);
  131194. +
  131195. + int proc_get_bb_reg_dump3(char *page, char **start,
  131196. + off_t offset, int count,
  131197. + int *eof, void *data);
  131198. +
  131199. + int proc_get_rf_reg_dump1(char *page, char **start,
  131200. + off_t offset, int count,
  131201. + int *eof, void *data);
  131202. +
  131203. + int proc_get_rf_reg_dump2(char *page, char **start,
  131204. + off_t offset, int count,
  131205. + int *eof, void *data);
  131206. +
  131207. + int proc_get_rf_reg_dump3(char *page, char **start,
  131208. + off_t offset, int count,
  131209. + int *eof, void *data);
  131210. +
  131211. + int proc_get_rf_reg_dump4(char *page, char **start,
  131212. + off_t offset, int count,
  131213. + int *eof, void *data);
  131214. +
  131215. +#ifdef CONFIG_AP_MODE
  131216. +
  131217. + int proc_get_all_sta_info(char *page, char **start,
  131218. + off_t offset, int count,
  131219. + int *eof, void *data);
  131220. +
  131221. +#endif
  131222. +
  131223. +#ifdef DBG_MEMORY_LEAK
  131224. + int proc_get_malloc_cnt(char *page, char **start,
  131225. + off_t offset, int count,
  131226. + int *eof, void *data);
  131227. +#endif
  131228. +
  131229. +#ifdef CONFIG_FIND_BEST_CHANNEL
  131230. + int proc_get_best_channel(char *page, char **start,
  131231. + off_t offset, int count,
  131232. + int *eof, void *data);
  131233. + int proc_set_best_channel(struct file *file, const char *buffer,
  131234. + unsigned long count, void *data);
  131235. +#endif
  131236. +
  131237. + int proc_get_rx_signal(char *page, char **start,
  131238. + off_t offset, int count,
  131239. + int *eof, void *data);
  131240. +
  131241. + int proc_set_rx_signal(struct file *file, const char *buffer,
  131242. + unsigned long count, void *data);
  131243. +
  131244. + int proc_get_ht_enable(char *page, char **start,
  131245. + off_t offset, int count,
  131246. + int *eof, void *data);
  131247. +
  131248. + int proc_set_ht_enable(struct file *file, const char *buffer,
  131249. + unsigned long count, void *data);
  131250. +
  131251. + int proc_get_cbw40_enable(char *page, char **start,
  131252. + off_t offset, int count,
  131253. + int *eof, void *data);
  131254. +
  131255. + int proc_set_cbw40_enable(struct file *file, const char *buffer,
  131256. + unsigned long count, void *data);
  131257. +
  131258. + int proc_get_ampdu_enable(char *page, char **start,
  131259. + off_t offset, int count,
  131260. + int *eof, void *data);
  131261. +
  131262. + int proc_set_ampdu_enable(struct file *file, const char *buffer,
  131263. + unsigned long count, void *data);
  131264. +
  131265. + int proc_get_two_path_rssi(char *page, char **start,
  131266. + off_t offset, int count,
  131267. + int *eof, void *data);
  131268. +
  131269. + int proc_get_rx_stbc(char *page, char **start,
  131270. + off_t offset, int count,
  131271. + int *eof, void *data);
  131272. +
  131273. + int proc_set_rx_stbc(struct file *file, const char *buffer,
  131274. + unsigned long count, void *data);
  131275. +
  131276. +
  131277. + int proc_get_vid(char *page, char **start,
  131278. + off_t offset, int count,
  131279. + int *eof, void *data);
  131280. +
  131281. + int proc_get_pid(char *page, char **start,
  131282. + off_t offset, int count,
  131283. + int *eof, void *data);
  131284. +
  131285. + int proc_get_rssi_disp(char *page, char **start,
  131286. + off_t offset, int count,
  131287. + int *eof, void *data);
  131288. +
  131289. + int proc_set_rssi_disp(struct file *file, const char *buffer,
  131290. + unsigned long count, void *data);
  131291. +
  131292. +#if defined(DBG_CONFIG_ERROR_DETECT)
  131293. +int proc_get_sreset(char *page, char **start, off_t offset, int count, int *eof, void *data);
  131294. +int proc_set_sreset(struct file *file, const char *buffer, unsigned long count, void *data);
  131295. +#endif /* DBG_CONFIG_ERROR_DETECT */
  131296. +
  131297. +#ifdef CONFIG_DM_ADAPTIVITY
  131298. +int proc_get_dm_adaptivity(char *page, char **start,
  131299. + off_t offset, int count,
  131300. + int *eof, void *data);
  131301. +int proc_set_dm_adaptivity(struct file *file, const char *buffer,
  131302. + unsigned long count, void *data);
  131303. +#endif /* CONFIG_DM_ADAPTIVITY */
  131304. +
  131305. +#endif //CONFIG_PROC_DEBUG
  131306. +
  131307. +#endif //__RTW_DEBUG_H__
  131308. --- /dev/null
  131309. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h
  131310. @@ -0,0 +1,152 @@
  131311. +/******************************************************************************
  131312. + *
  131313. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  131314. + *
  131315. + * This program is free software; you can redistribute it and/or modify it
  131316. + * under the terms of version 2 of the GNU General Public License as
  131317. + * published by the Free Software Foundation.
  131318. + *
  131319. + * This program is distributed in the hope that it will be useful, but WITHOUT
  131320. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  131321. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  131322. + * more details.
  131323. + *
  131324. + * You should have received a copy of the GNU General Public License along with
  131325. + * this program; if not, write to the Free Software Foundation, Inc.,
  131326. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  131327. + *
  131328. + *
  131329. + ******************************************************************************/
  131330. +#ifndef __RTW_EEPROM_H__
  131331. +#define __RTW_EEPROM_H__
  131332. +
  131333. +#include <drv_conf.h>
  131334. +#include <osdep_service.h>
  131335. +#include <drv_types.h>
  131336. +
  131337. +#define RTL8712_EEPROM_ID 0x8712
  131338. +#define EEPROM_MAX_SIZE 256
  131339. +#define CLOCK_RATE 50 //100us
  131340. +
  131341. +//- EEPROM opcodes
  131342. +#define EEPROM_READ_OPCODE 06
  131343. +#define EEPROM_WRITE_OPCODE 05
  131344. +#define EEPROM_ERASE_OPCODE 07
  131345. +#define EEPROM_EWEN_OPCODE 19 // Erase/write enable
  131346. +#define EEPROM_EWDS_OPCODE 16 // Erase/write disable
  131347. +
  131348. +//Country codes
  131349. +#define USA 0x555320
  131350. +#define EUROPE 0x1 //temp, should be provided later
  131351. +#define JAPAN 0x2 //temp, should be provided later
  131352. +
  131353. +#ifdef CONFIG_SDIO_HCI
  131354. +#define eeprom_cis0_sz 17
  131355. +#define eeprom_cis1_sz 50
  131356. +#endif
  131357. +
  131358. +#define EEPROM_CID_DEFAULT 0x0
  131359. +#define EEPROM_CID_ALPHA 0x1
  131360. +#define EEPROM_CID_Senao 0x3
  131361. +#define EEPROM_CID_NetCore 0x5
  131362. +#define EEPROM_CID_CAMEO 0X8
  131363. +#define EEPROM_CID_SITECOM 0x9
  131364. +#define EEPROM_CID_COREGA 0xB
  131365. +#define EEPROM_CID_EDIMAX_BELKIN 0xC
  131366. +#define EEPROM_CID_SERCOMM_BELKIN 0xE
  131367. +#define EEPROM_CID_CAMEO1 0xF
  131368. +#define EEPROM_CID_WNC_COREGA 0x12
  131369. +#define EEPROM_CID_CLEVO 0x13
  131370. +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108
  131371. +
  131372. +//
  131373. +// Customer ID, note that:
  131374. +// This variable is initiailzed through EEPROM or registry,
  131375. +// however, its definition may be different with that in EEPROM for
  131376. +// EEPROM size consideration. So, we have to perform proper translation between them.
  131377. +// Besides, CustomerID of registry has precedence of that of EEPROM.
  131378. +// defined below. 060703, by rcnjko.
  131379. +//
  131380. +typedef enum _RT_CUSTOMER_ID
  131381. +{
  131382. + RT_CID_DEFAULT = 0,
  131383. + RT_CID_8187_ALPHA0 = 1,
  131384. + RT_CID_8187_SERCOMM_PS = 2,
  131385. + RT_CID_8187_HW_LED = 3,
  131386. + RT_CID_8187_NETGEAR = 4,
  131387. + RT_CID_WHQL = 5,
  131388. + RT_CID_819x_CAMEO = 6,
  131389. + RT_CID_819x_RUNTOP = 7,
  131390. + RT_CID_819x_Senao = 8,
  131391. + RT_CID_TOSHIBA = 9, // Merge by Jacken, 2008/01/31.
  131392. + RT_CID_819x_Netcore = 10,
  131393. + RT_CID_Nettronix = 11,
  131394. + RT_CID_DLINK = 12,
  131395. + RT_CID_PRONET = 13,
  131396. + RT_CID_COREGA = 14,
  131397. + RT_CID_CHINA_MOBILE = 15,
  131398. + RT_CID_819x_ALPHA = 16,
  131399. + RT_CID_819x_Sitecom = 17,
  131400. + RT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17.
  131401. + RT_CID_819x_Lenovo = 19,
  131402. + RT_CID_819x_QMI = 20,
  131403. + RT_CID_819x_Edimax_Belkin = 21,
  131404. + RT_CID_819x_Sercomm_Belkin = 22,
  131405. + RT_CID_819x_CAMEO1 = 23,
  131406. + RT_CID_819x_MSI = 24,
  131407. + RT_CID_819x_Acer = 25,
  131408. + RT_CID_819x_AzWave_ASUS = 26,
  131409. + RT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus
  131410. + RT_CID_819x_HP = 28,
  131411. + RT_CID_819x_WNC_COREGA = 29,
  131412. + RT_CID_819x_Arcadyan_Belkin = 30,
  131413. + RT_CID_819x_SAMSUNG = 31,
  131414. + RT_CID_819x_CLEVO = 32,
  131415. + RT_CID_819x_DELL = 33,
  131416. + RT_CID_819x_PRONETS = 34,
  131417. + RT_CID_819x_Edimax_ASUS = 35,
  131418. + RT_CID_819x_CAMEO_NETGEAR = 36,
  131419. +}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID;
  131420. +
  131421. +struct eeprom_priv
  131422. +{
  131423. + u8 bautoload_fail_flag;
  131424. + //u8 bempty;
  131425. + //u8 sys_config;
  131426. + u8 mac_addr[6]; //PermanentAddress
  131427. + //u8 config0;
  131428. + u16 channel_plan;
  131429. + //u8 country_string[3];
  131430. + //u8 tx_power_b[15];
  131431. + //u8 tx_power_g[15];
  131432. + //u8 tx_power_a[201];
  131433. +
  131434. + u8 EepromOrEfuse;
  131435. +
  131436. + u8 efuse_eeprom_data[EEPROM_MAX_SIZE];
  131437. +
  131438. +#ifdef CONFIG_SDIO_HCI
  131439. + u8 sdio_setting;
  131440. + u32 ocr;
  131441. + u8 cis0[eeprom_cis0_sz];
  131442. + u8 cis1[eeprom_cis1_sz];
  131443. +#endif
  131444. +};
  131445. +
  131446. +
  131447. +extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data);
  131448. +extern u16 eeprom_read16(_adapter *padapter, u16 reg);
  131449. +extern void read_eeprom_content(_adapter *padapter);
  131450. +extern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz);
  131451. +
  131452. +extern void read_eeprom_content_by_attrib(_adapter * padapter );
  131453. +
  131454. +#ifdef PLATFORM_LINUX
  131455. +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  131456. +extern int isAdaptorInfoFileValid(void);
  131457. +extern int storeAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv);
  131458. +extern int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv);
  131459. +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
  131460. +#endif //PLATFORM_LINUX
  131461. +
  131462. +#endif //__RTL871X_EEPROM_H__
  131463. --- /dev/null
  131464. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_efuse.h
  131465. @@ -0,0 +1,123 @@
  131466. +/******************************************************************************
  131467. + *
  131468. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  131469. + *
  131470. + * This program is free software; you can redistribute it and/or modify it
  131471. + * under the terms of version 2 of the GNU General Public License as
  131472. + * published by the Free Software Foundation.
  131473. + *
  131474. + * This program is distributed in the hope that it will be useful, but WITHOUT
  131475. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  131476. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  131477. + * more details.
  131478. + *
  131479. + * You should have received a copy of the GNU General Public License along with
  131480. + * this program; if not, write to the Free Software Foundation, Inc.,
  131481. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  131482. + *
  131483. + *
  131484. + ******************************************************************************/
  131485. +#ifndef __RTW_EFUSE_H__
  131486. +#define __RTW_EFUSE_H__
  131487. +
  131488. +#include <drv_conf.h>
  131489. +#include <osdep_service.h>
  131490. +
  131491. +#define EFUSE_ERROE_HANDLE 1
  131492. +
  131493. +#define PG_STATE_HEADER 0x01
  131494. +#define PG_STATE_WORD_0 0x02
  131495. +#define PG_STATE_WORD_1 0x04
  131496. +#define PG_STATE_WORD_2 0x08
  131497. +#define PG_STATE_WORD_3 0x10
  131498. +#define PG_STATE_DATA 0x20
  131499. +
  131500. +#define PG_SWBYTE_H 0x01
  131501. +#define PG_SWBYTE_L 0x02
  131502. +
  131503. +#define PGPKT_DATA_SIZE 8
  131504. +
  131505. +#define EFUSE_WIFI 0
  131506. +#define EFUSE_BT 1
  131507. +
  131508. +enum _EFUSE_DEF_TYPE {
  131509. + TYPE_EFUSE_MAX_SECTION = 0,
  131510. + TYPE_EFUSE_REAL_CONTENT_LEN = 1,
  131511. + TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2,
  131512. + TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3,
  131513. + TYPE_EFUSE_MAP_LEN = 4,
  131514. + TYPE_EFUSE_PROTECT_BYTES_BANK = 5,
  131515. +};
  131516. +
  131517. +#define EFUSE_MAX_MAP_LEN 256
  131518. +#define EFUSE_MAX_HW_SIZE 512
  131519. +#define EFUSE_MAX_SECTION_BASE 16
  131520. +
  131521. +#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F)
  131522. +#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F)
  131523. +#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5)
  131524. +
  131525. +#define EFUSE_REPEAT_THRESHOLD_ 3
  131526. +
  131527. +//=============================================
  131528. +// The following is for BT Efuse definition
  131529. +//=============================================
  131530. +#define EFUSE_BT_MAX_MAP_LEN 1024
  131531. +#define EFUSE_MAX_BANK 4
  131532. +#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1)
  131533. +//=============================================
  131534. +/*--------------------------Define Parameters-------------------------------*/
  131535. +#define EFUSE_MAX_WORD_UNIT 4
  131536. +
  131537. +/*------------------------------Define structure----------------------------*/
  131538. +typedef struct PG_PKT_STRUCT_A{
  131539. + u8 offset;
  131540. + u8 word_en;
  131541. + u8 data[8];
  131542. + u8 word_cnts;
  131543. +}PGPKT_STRUCT,*PPGPKT_STRUCT;
  131544. +/*------------------------------Define structure----------------------------*/
  131545. +
  131546. +
  131547. +/*------------------------Export global variable----------------------------*/
  131548. +extern u8 fakeEfuseBank;
  131549. +extern u32 fakeEfuseUsedBytes;
  131550. +extern u8 fakeEfuseContent[];
  131551. +extern u8 fakeEfuseInitMap[];
  131552. +extern u8 fakeEfuseModifiedMap[];
  131553. +
  131554. +extern u32 BTEfuseUsedBytes;
  131555. +extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
  131556. +extern u8 BTEfuseInitMap[];
  131557. +extern u8 BTEfuseModifiedMap[];
  131558. +
  131559. +extern u32 fakeBTEfuseUsedBytes;
  131560. +extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
  131561. +extern u8 fakeBTEfuseInitMap[];
  131562. +extern u8 fakeBTEfuseModifiedMap[];
  131563. +/*------------------------Export global variable----------------------------*/
  131564. +
  131565. +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size);
  131566. +u16 efuse_GetMaxSize(PADAPTER padapter);
  131567. +u8 rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data);
  131568. +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
  131569. +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);
  131570. +
  131571. +u16 Efuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
  131572. +u8 Efuse_CalculateWordCnts(u8 word_en);
  131573. +void ReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ;
  131574. +void EFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, void *pOut, BOOLEAN bPseudoTest);
  131575. +u8 efuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN bPseudoTest);
  131576. +u8 efuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN bPseudoTest);
  131577. +
  131578. +void Efuse_PowerSwitch(PADAPTER pAdapter,u8 bWrite,u8 PwrState);
  131579. +int Efuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest);
  131580. +int Efuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
  131581. +void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata);
  131582. +u8 Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest);
  131583. +
  131584. +u8 EFUSE_Read1Byte(PADAPTER pAdapter, u16 Address);
  131585. +void EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
  131586. +void EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value);
  131587. +
  131588. +#endif
  131589. --- /dev/null
  131590. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_event.h
  131591. @@ -0,0 +1,153 @@
  131592. +/******************************************************************************
  131593. + *
  131594. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  131595. + *
  131596. + * This program is free software; you can redistribute it and/or modify it
  131597. + * under the terms of version 2 of the GNU General Public License as
  131598. + * published by the Free Software Foundation.
  131599. + *
  131600. + * This program is distributed in the hope that it will be useful, but WITHOUT
  131601. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  131602. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  131603. + * more details.
  131604. + *
  131605. + * You should have received a copy of the GNU General Public License along with
  131606. + * this program; if not, write to the Free Software Foundation, Inc.,
  131607. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  131608. + *
  131609. + *
  131610. + ******************************************************************************/
  131611. +#ifndef _RTW_EVENT_H_
  131612. +#define _RTW_EVENT_H_
  131613. +#include <drv_conf.h>
  131614. +#include <osdep_service.h>
  131615. +
  131616. +#ifndef CONFIG_RTL8711FW
  131617. +#ifdef PLATFORM_LINUX
  131618. +#include <wlan_bssdef.h>
  131619. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  131620. +#include <asm/semaphore.h>
  131621. +#else
  131622. +#include <linux/semaphore.h>
  131623. +#endif
  131624. +#include <linux/sem.h>
  131625. +#endif
  131626. +#else
  131627. +#include <wlan_bssdef.h>
  131628. +#endif//CONFIG_RTL8711FW
  131629. +
  131630. +
  131631. +
  131632. +#ifdef CONFIG_H2CLBK
  131633. +#include <h2clbk.h>
  131634. +#endif
  131635. +
  131636. +/*
  131637. +Used to report a bss has been scanned
  131638. +
  131639. +*/
  131640. +struct survey_event {
  131641. + WLAN_BSSID_EX bss;
  131642. +};
  131643. +
  131644. +/*
  131645. +Used to report that the requested site survey has been done.
  131646. +
  131647. +bss_cnt indicates the number of bss that has been reported.
  131648. +
  131649. +
  131650. +*/
  131651. +struct surveydone_event {
  131652. + unsigned int bss_cnt;
  131653. +
  131654. +};
  131655. +
  131656. +/*
  131657. +Used to report the link result of joinning the given bss
  131658. +
  131659. +
  131660. +join_res:
  131661. +-1: authentication fail
  131662. +-2: association fail
  131663. +> 0: TID
  131664. +
  131665. +*/
  131666. +struct joinbss_event {
  131667. + struct wlan_network network;
  131668. +};
  131669. +
  131670. +/*
  131671. +Used to report a given STA has joinned the created BSS.
  131672. +It is used in AP/Ad-HoC(M) mode.
  131673. +
  131674. +
  131675. +*/
  131676. +struct stassoc_event {
  131677. + unsigned char macaddr[6];
  131678. + unsigned char rsvd[2];
  131679. + int cam_id;
  131680. +
  131681. +};
  131682. +
  131683. +struct stadel_event {
  131684. + unsigned char macaddr[6];
  131685. + unsigned char rsvd[2]; //for reason
  131686. + int mac_id;
  131687. +};
  131688. +
  131689. +struct addba_event
  131690. +{
  131691. + unsigned int tid;
  131692. +};
  131693. +
  131694. +
  131695. +#ifdef CONFIG_H2CLBK
  131696. +struct c2hlbk_event{
  131697. + unsigned char mac[6];
  131698. + unsigned short s0;
  131699. + unsigned short s1;
  131700. + unsigned int w0;
  131701. + unsigned char b0;
  131702. + unsigned short s2;
  131703. + unsigned char b1;
  131704. + unsigned int w1;
  131705. +};
  131706. +#endif//CONFIG_H2CLBK
  131707. +
  131708. +#define GEN_EVT_CODE(event) event ## _EVT_
  131709. +
  131710. +
  131711. +
  131712. +struct fwevent {
  131713. + u32 parmsize;
  131714. + void (*event_callback)(_adapter *dev, u8 *pbuf);
  131715. +};
  131716. +
  131717. +
  131718. +#define C2HEVENT_SZ 32
  131719. +
  131720. +struct event_node{
  131721. + unsigned char *node;
  131722. + unsigned char evt_code;
  131723. + unsigned short evt_sz;
  131724. + volatile int *caller_ff_tail;
  131725. + int caller_ff_sz;
  131726. +};
  131727. +
  131728. +struct c2hevent_queue {
  131729. + volatile int head;
  131730. + volatile int tail;
  131731. + struct event_node nodes[C2HEVENT_SZ];
  131732. + unsigned char seq;
  131733. +};
  131734. +
  131735. +#define NETWORK_QUEUE_SZ 4
  131736. +
  131737. +struct network_queue {
  131738. + volatile int head;
  131739. + volatile int tail;
  131740. + WLAN_BSSID_EX networks[NETWORK_QUEUE_SZ];
  131741. +};
  131742. +
  131743. +
  131744. +#endif // _WLANEVENT_H_
  131745. --- /dev/null
  131746. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ht.h
  131747. @@ -0,0 +1,49 @@
  131748. +/******************************************************************************
  131749. + *
  131750. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  131751. + *
  131752. + * This program is free software; you can redistribute it and/or modify it
  131753. + * under the terms of version 2 of the GNU General Public License as
  131754. + * published by the Free Software Foundation.
  131755. + *
  131756. + * This program is distributed in the hope that it will be useful, but WITHOUT
  131757. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  131758. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  131759. + * more details.
  131760. + *
  131761. + * You should have received a copy of the GNU General Public License along with
  131762. + * this program; if not, write to the Free Software Foundation, Inc.,
  131763. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  131764. + *
  131765. + *
  131766. + ******************************************************************************/
  131767. +#ifndef _RTW_HT_H_
  131768. +#define _RTW_HT_H_
  131769. +
  131770. +#include <drv_conf.h>
  131771. +#include <osdep_service.h>
  131772. +#include "wifi.h"
  131773. +
  131774. +struct ht_priv
  131775. +{
  131776. + u32 ht_option;
  131777. + u32 ampdu_enable;//for enable Tx A-MPDU
  131778. + //u8 baddbareq_issued[16];
  131779. + u32 tx_amsdu_enable;//for enable Tx A-MSDU
  131780. + u32 tx_amdsu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx
  131781. + u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback.
  131782. +
  131783. + u8 bwmode;//
  131784. + u8 ch_offset;//PRIME_CHNL_OFFSET
  131785. + u8 sgi;//short GI
  131786. +
  131787. + //for processing Tx A-MPDU
  131788. + u8 agg_enable_bitmap;
  131789. + //u8 ADDBA_retry_count;
  131790. + u8 candidate_tid_bitmap;
  131791. +
  131792. + struct rtw_ieee80211_ht_cap ht_cap;
  131793. +
  131794. +};
  131795. +
  131796. +#endif //_RTL871X_HT_H_
  131797. --- /dev/null
  131798. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_io.h
  131799. @@ -0,0 +1,504 @@
  131800. +/******************************************************************************
  131801. + *
  131802. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  131803. + *
  131804. + * This program is free software; you can redistribute it and/or modify it
  131805. + * under the terms of version 2 of the GNU General Public License as
  131806. + * published by the Free Software Foundation.
  131807. + *
  131808. + * This program is distributed in the hope that it will be useful, but WITHOUT
  131809. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  131810. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  131811. + * more details.
  131812. + *
  131813. + * You should have received a copy of the GNU General Public License along with
  131814. + * this program; if not, write to the Free Software Foundation, Inc.,
  131815. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  131816. + *
  131817. + *
  131818. + ******************************************************************************/
  131819. +
  131820. +#ifndef _RTW_IO_H_
  131821. +#define _RTW_IO_H_
  131822. +
  131823. +#include <drv_conf.h>
  131824. +#include <osdep_service.h>
  131825. +#include <osdep_intf.h>
  131826. +
  131827. +#ifdef PLATFORM_LINUX
  131828. +#include <asm/byteorder.h>
  131829. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  131830. +#include <asm/semaphore.h>
  131831. +#else
  131832. +#include <linux/semaphore.h>
  131833. +#endif
  131834. +#include <linux/list.h>
  131835. +//#include <linux/smp_lock.h>
  131836. +#include <linux/spinlock.h>
  131837. +#include <asm/atomic.h>
  131838. +
  131839. +#ifdef CONFIG_USB_HCI
  131840. +#include <linux/usb.h>
  131841. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
  131842. +#include <linux/usb_ch9.h>
  131843. +#else
  131844. +#include <linux/usb/ch9.h>
  131845. +#endif
  131846. +#endif //CONFIG_USB_HCI
  131847. +
  131848. +#endif //PLATFORM_LINUX
  131849. +
  131850. +
  131851. +#define NUM_IOREQ 8
  131852. +
  131853. +#ifdef PLATFORM_WINDOWS
  131854. +#define MAX_PROT_SZ 64
  131855. +#endif
  131856. +#ifdef PLATFORM_LINUX
  131857. +#define MAX_PROT_SZ (64-16)
  131858. +#endif
  131859. +
  131860. +#define _IOREADY 0
  131861. +#define _IO_WAIT_COMPLETE 1
  131862. +#define _IO_WAIT_RSP 2
  131863. +
  131864. +// IO COMMAND TYPE
  131865. +#define _IOSZ_MASK_ (0x7F)
  131866. +#define _IO_WRITE_ BIT(7)
  131867. +#define _IO_FIXED_ BIT(8)
  131868. +#define _IO_BURST_ BIT(9)
  131869. +#define _IO_BYTE_ BIT(10)
  131870. +#define _IO_HW_ BIT(11)
  131871. +#define _IO_WORD_ BIT(12)
  131872. +#define _IO_SYNC_ BIT(13)
  131873. +#define _IO_CMDMASK_ (0x1F80)
  131874. +
  131875. +
  131876. +/*
  131877. + For prompt mode accessing, caller shall free io_req
  131878. + Otherwise, io_handler will free io_req
  131879. +*/
  131880. +
  131881. +
  131882. +
  131883. +// IO STATUS TYPE
  131884. +#define _IO_ERR_ BIT(2)
  131885. +#define _IO_SUCCESS_ BIT(1)
  131886. +#define _IO_DONE_ BIT(0)
  131887. +
  131888. +
  131889. +#define IO_RD32 (_IO_SYNC_ | _IO_WORD_)
  131890. +#define IO_RD16 (_IO_SYNC_ | _IO_HW_)
  131891. +#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_)
  131892. +
  131893. +#define IO_RD32_ASYNC (_IO_WORD_)
  131894. +#define IO_RD16_ASYNC (_IO_HW_)
  131895. +#define IO_RD8_ASYNC (_IO_BYTE_)
  131896. +
  131897. +#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_)
  131898. +#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_)
  131899. +#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_)
  131900. +
  131901. +#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_)
  131902. +#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_)
  131903. +#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_)
  131904. +
  131905. +/*
  131906. +
  131907. + Only Sync. burst accessing is provided.
  131908. +
  131909. +*/
  131910. +
  131911. +#define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
  131912. +#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
  131913. +
  131914. +
  131915. +
  131916. +//below is for the intf_option bit defition...
  131917. +
  131918. +#define _INTF_ASYNC_ BIT(0) //support async io
  131919. +
  131920. +struct intf_priv;
  131921. +struct intf_hdl;
  131922. +struct io_queue;
  131923. +
  131924. +struct _io_ops
  131925. +{
  131926. + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
  131927. + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
  131928. + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
  131929. +
  131930. + int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
  131931. + int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
  131932. + int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
  131933. + int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);
  131934. +
  131935. + int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
  131936. + int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
  131937. + int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
  131938. +
  131939. + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  131940. + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  131941. +
  131942. + void (*_sync_irp_protocol_rw)(struct io_queue *pio_q);
  131943. +
  131944. + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
  131945. +
  131946. + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  131947. + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  131948. +
  131949. + u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem);
  131950. +
  131951. + void (*_read_port_cancel)(struct intf_hdl *pintfhdl);
  131952. + void (*_write_port_cancel)(struct intf_hdl *pintfhdl);
  131953. +
  131954. +};
  131955. +
  131956. +struct io_req {
  131957. + _list list;
  131958. + u32 addr;
  131959. + volatile u32 val;
  131960. + u32 command;
  131961. + u32 status;
  131962. + u8 *pbuf;
  131963. + _sema sema;
  131964. +
  131965. +#ifdef PLATFORM_OS_CE
  131966. +#ifdef CONFIG_USB_HCI
  131967. + // URB handler for rtw_write_mem
  131968. + USB_TRANSFER usb_transfer_write_mem;
  131969. +#endif
  131970. +#endif
  131971. +
  131972. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt);
  131973. + u8 *cnxt;
  131974. +
  131975. +#ifdef PLATFORM_OS_XP
  131976. + PMDL pmdl;
  131977. + PIRP pirp;
  131978. +
  131979. +#ifdef CONFIG_SDIO_HCI
  131980. + PSDBUS_REQUEST_PACKET sdrp;
  131981. +#endif
  131982. +
  131983. +#endif
  131984. +
  131985. +
  131986. +};
  131987. +
  131988. +struct intf_hdl {
  131989. +
  131990. +/*
  131991. + u32 intf_option;
  131992. + u32 bus_status;
  131993. + u32 do_flush;
  131994. + u8 *adapter;
  131995. + u8 *intf_dev;
  131996. + struct intf_priv *pintfpriv;
  131997. + u8 cnt;
  131998. + void (*intf_hdl_init)(u8 *priv);
  131999. + void (*intf_hdl_unload)(u8 *priv);
  132000. + void (*intf_hdl_open)(u8 *priv);
  132001. + void (*intf_hdl_close)(u8 *priv);
  132002. + struct _io_ops io_ops;
  132003. + //u8 intf_status;//moved to struct intf_priv
  132004. + u16 len;
  132005. + u16 done_len;
  132006. +*/
  132007. + _adapter *padapter;
  132008. + struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv);
  132009. +
  132010. + struct _io_ops io_ops;
  132011. +
  132012. +};
  132013. +
  132014. +struct reg_protocol_rd {
  132015. +
  132016. +#ifdef CONFIG_LITTLE_ENDIAN
  132017. +
  132018. + //DW1
  132019. + u32 NumOfTrans:4;
  132020. + u32 Reserved1:4;
  132021. + u32 Reserved2:24;
  132022. + //DW2
  132023. + u32 ByteCount:7;
  132024. + u32 WriteEnable:1; //0:read, 1:write
  132025. + u32 FixOrContinuous:1; //0:continuous, 1: Fix
  132026. + u32 BurstMode:1;
  132027. + u32 Byte1Access:1;
  132028. + u32 Byte2Access:1;
  132029. + u32 Byte4Access:1;
  132030. + u32 Reserved3:3;
  132031. + u32 Reserved4:16;
  132032. + //DW3
  132033. + u32 BusAddress;
  132034. + //DW4
  132035. + //u32 Value;
  132036. +#else
  132037. +
  132038. +
  132039. +//DW1
  132040. + u32 Reserved1 :4;
  132041. + u32 NumOfTrans :4;
  132042. +
  132043. + u32 Reserved2 :24;
  132044. +
  132045. + //DW2
  132046. + u32 WriteEnable : 1;
  132047. + u32 ByteCount :7;
  132048. +
  132049. +
  132050. + u32 Reserved3 : 3;
  132051. + u32 Byte4Access : 1;
  132052. +
  132053. + u32 Byte2Access : 1;
  132054. + u32 Byte1Access : 1;
  132055. + u32 BurstMode :1 ;
  132056. + u32 FixOrContinuous : 1;
  132057. +
  132058. + u32 Reserved4 : 16;
  132059. +
  132060. + //DW3
  132061. + u32 BusAddress;
  132062. +
  132063. + //DW4
  132064. + //u32 Value;
  132065. +
  132066. +#endif
  132067. +
  132068. +};
  132069. +
  132070. +
  132071. +struct reg_protocol_wt {
  132072. +
  132073. +
  132074. +#ifdef CONFIG_LITTLE_ENDIAN
  132075. +
  132076. + //DW1
  132077. + u32 NumOfTrans:4;
  132078. + u32 Reserved1:4;
  132079. + u32 Reserved2:24;
  132080. + //DW2
  132081. + u32 ByteCount:7;
  132082. + u32 WriteEnable:1; //0:read, 1:write
  132083. + u32 FixOrContinuous:1; //0:continuous, 1: Fix
  132084. + u32 BurstMode:1;
  132085. + u32 Byte1Access:1;
  132086. + u32 Byte2Access:1;
  132087. + u32 Byte4Access:1;
  132088. + u32 Reserved3:3;
  132089. + u32 Reserved4:16;
  132090. + //DW3
  132091. + u32 BusAddress;
  132092. + //DW4
  132093. + u32 Value;
  132094. +
  132095. +#else
  132096. + //DW1
  132097. + u32 Reserved1 :4;
  132098. + u32 NumOfTrans :4;
  132099. +
  132100. + u32 Reserved2 :24;
  132101. +
  132102. + //DW2
  132103. + u32 WriteEnable : 1;
  132104. + u32 ByteCount :7;
  132105. +
  132106. + u32 Reserved3 : 3;
  132107. + u32 Byte4Access : 1;
  132108. +
  132109. + u32 Byte2Access : 1;
  132110. + u32 Byte1Access : 1;
  132111. + u32 BurstMode :1 ;
  132112. + u32 FixOrContinuous : 1;
  132113. +
  132114. + u32 Reserved4 : 16;
  132115. +
  132116. + //DW3
  132117. + u32 BusAddress;
  132118. +
  132119. + //DW4
  132120. + u32 Value;
  132121. +
  132122. +#endif
  132123. +
  132124. +};
  132125. +
  132126. +
  132127. +
  132128. +/*
  132129. +Below is the data structure used by _io_handler
  132130. +
  132131. +*/
  132132. +
  132133. +struct io_queue {
  132134. + _lock lock;
  132135. + _list free_ioreqs;
  132136. + _list pending; //The io_req list that will be served in the single protocol read/write.
  132137. + _list processing;
  132138. + u8 *free_ioreqs_buf; // 4-byte aligned
  132139. + u8 *pallocated_free_ioreqs_buf;
  132140. + struct intf_hdl intf;
  132141. +};
  132142. +
  132143. +struct io_priv{
  132144. +
  132145. + _adapter *padapter;
  132146. +
  132147. + struct intf_hdl intf;
  132148. +
  132149. +};
  132150. +
  132151. +extern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);
  132152. +extern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue);
  132153. +extern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);
  132154. +
  132155. +
  132156. +extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue);
  132157. +extern struct io_req *alloc_ioreq(struct io_queue *pio_q);
  132158. +
  132159. +extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl);
  132160. +extern void unregister_intf_hdl(struct intf_hdl *pintfhdl);
  132161. +
  132162. +extern void _rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132163. +extern void _rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132164. +
  132165. +extern u8 _rtw_read8(_adapter *adapter, u32 addr);
  132166. +extern u16 _rtw_read16(_adapter *adapter, u32 addr);
  132167. +extern u32 _rtw_read32(_adapter *adapter, u32 addr);
  132168. +extern void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132169. +extern void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132170. +extern void _rtw_read_port_cancel(_adapter *adapter);
  132171. +
  132172. +
  132173. +extern int _rtw_write8(_adapter *adapter, u32 addr, u8 val);
  132174. +extern int _rtw_write16(_adapter *adapter, u32 addr, u16 val);
  132175. +extern int _rtw_write32(_adapter *adapter, u32 addr, u32 val);
  132176. +extern int _rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata);
  132177. +
  132178. +extern int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val);
  132179. +extern int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val);
  132180. +extern int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val);
  132181. +
  132182. +extern void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132183. +extern u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132184. +u32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms);
  132185. +extern void _rtw_write_port_cancel(_adapter *adapter);
  132186. +
  132187. +#ifdef DBG_IO
  132188. +bool match_read_sniff_ranges(u16 addr, u16 len);
  132189. +bool match_write_sniff_ranges(u16 addr, u16 len);
  132190. +
  132191. +extern u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line);
  132192. +extern u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line);
  132193. +extern u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line);
  132194. +
  132195. +extern int dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line);
  132196. +extern int dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line);
  132197. +extern int dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line);
  132198. +extern int dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line);
  132199. +
  132200. +#define rtw_read8(adapter, addr) dbg_rtw_read8((adapter), (addr), __FUNCTION__, __LINE__)
  132201. +#define rtw_read16(adapter, addr) dbg_rtw_read16((adapter), (addr), __FUNCTION__, __LINE__)
  132202. +#define rtw_read32(adapter, addr) dbg_rtw_read32((adapter), (addr), __FUNCTION__, __LINE__)
  132203. +#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))
  132204. +#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))
  132205. +#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))
  132206. +
  132207. +#define rtw_write8(adapter, addr, val) dbg_rtw_write8((adapter), (addr), (val), __FUNCTION__, __LINE__)
  132208. +#define rtw_write16(adapter, addr, val) dbg_rtw_write16((adapter), (addr), (val), __FUNCTION__, __LINE__)
  132209. +#define rtw_write32(adapter, addr, val) dbg_rtw_write32((adapter), (addr), (val), __FUNCTION__, __LINE__)
  132210. +#define rtw_writeN(adapter, addr, length, data) dbg_rtw_writeN((adapter), (addr), (length), (data), __FUNCTION__, __LINE__)
  132211. +
  132212. +#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))
  132213. +#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))
  132214. +#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))
  132215. +
  132216. +#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), addr, cnt, mem)
  132217. +#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port(adapter, addr, cnt, mem)
  132218. +#define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))
  132219. +#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel(adapter)
  132220. +#else //DBG_IO
  132221. +#define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr))
  132222. +#define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr))
  132223. +#define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr))
  132224. +#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))
  132225. +#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))
  132226. +#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))
  132227. +
  132228. +#define rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val))
  132229. +#define rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val))
  132230. +#define rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val))
  132231. +#define rtw_writeN(adapter, addr, length, data) _rtw_writeN((adapter), (addr), (length), (data))
  132232. +
  132233. +#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))
  132234. +#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))
  132235. +#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))
  132236. +
  132237. +#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), (addr), (cnt), (mem))
  132238. +#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port((adapter), (addr), (cnt), (mem))
  132239. +#define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))
  132240. +#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel((adapter))
  132241. +#endif //DBG_IO
  132242. +
  132243. +extern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem);
  132244. +
  132245. +//ioreq
  132246. +extern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval);
  132247. +extern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval);
  132248. +extern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval);
  132249. +extern void ioreq_write8(_adapter *adapter, u32 addr, u8 val);
  132250. +extern void ioreq_write16(_adapter *adapter, u32 addr, u16 val);
  132251. +extern void ioreq_write32(_adapter *adapter, u32 addr, u32 val);
  132252. +
  132253. +
  132254. +extern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff,
  132255. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132256. +extern uint async_read16(_adapter *adapter, u32 addr, u8 *pbuff,
  132257. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132258. +extern uint async_read32(_adapter *adapter, u32 addr, u8 *pbuff,
  132259. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132260. +
  132261. +extern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132262. +extern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132263. +
  132264. +extern void async_write8(_adapter *adapter, u32 addr, u8 val,
  132265. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132266. +extern void async_write16(_adapter *adapter, u32 addr, u16 val,
  132267. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132268. +extern void async_write32(_adapter *adapter, u32 addr, u32 val,
  132269. + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
  132270. +
  132271. +extern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132272. +extern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
  132273. +
  132274. +
  132275. +int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops));
  132276. +
  132277. +
  132278. +extern uint alloc_io_queue(_adapter *adapter);
  132279. +extern void free_io_queue(_adapter *adapter);
  132280. +extern void async_bus_io(struct io_queue *pio_q);
  132281. +extern void bus_sync_io(struct io_queue *pio_q);
  132282. +extern u32 _ioreq2rwmem(struct io_queue *pio_q);
  132283. +extern void dev_power_down(_adapter * Adapter, u8 bpwrup);
  132284. +
  132285. +/*
  132286. +#define RTL_R8(reg) rtw_read8(padapter, reg)
  132287. +#define RTL_R16(reg) rtw_read16(padapter, reg)
  132288. +#define RTL_R32(reg) rtw_read32(padapter, reg)
  132289. +#define RTL_W8(reg, val8) rtw_write8(padapter, reg, val8)
  132290. +#define RTL_W16(reg, val16) rtw_write16(padapter, reg, val16)
  132291. +#define RTL_W32(reg, val32) rtw_write32(padapter, reg, val32)
  132292. +*/
  132293. +
  132294. +/*
  132295. +#define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8)
  132296. +#define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16)
  132297. +#define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32)
  132298. +
  132299. +#define RTL_WRITE_BB(reg, val32) phy_SetUsbBBReg(padapter, reg, val32)
  132300. +#define RTL_READ_BB(reg) phy_QueryUsbBBReg(padapter, reg)
  132301. +*/
  132302. +
  132303. +#endif //_RTL8711_IO_H_
  132304. --- /dev/null
  132305. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h
  132306. @@ -0,0 +1,268 @@
  132307. +/******************************************************************************
  132308. + *
  132309. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132310. + *
  132311. + * This program is free software; you can redistribute it and/or modify it
  132312. + * under the terms of version 2 of the GNU General Public License as
  132313. + * published by the Free Software Foundation.
  132314. + *
  132315. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132316. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132317. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132318. + * more details.
  132319. + *
  132320. + * You should have received a copy of the GNU General Public License along with
  132321. + * this program; if not, write to the Free Software Foundation, Inc.,
  132322. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132323. + *
  132324. + *
  132325. + ******************************************************************************/
  132326. +#ifndef _RTW_IOCTL_H_
  132327. +#define _RTW_IOCTL_H_
  132328. +
  132329. +#include <drv_conf.h>
  132330. +#include <osdep_service.h>
  132331. +#include <drv_types.h>
  132332. +
  132333. +#ifndef OID_802_11_CAPABILITY
  132334. + #define OID_802_11_CAPABILITY 0x0d010122
  132335. +#endif
  132336. +
  132337. +#ifndef OID_802_11_PMKID
  132338. + #define OID_802_11_PMKID 0x0d010123
  132339. +#endif
  132340. +
  132341. +
  132342. +// For DDK-defined OIDs
  132343. +#define OID_NDIS_SEG1 0x00010100
  132344. +#define OID_NDIS_SEG2 0x00010200
  132345. +#define OID_NDIS_SEG3 0x00020100
  132346. +#define OID_NDIS_SEG4 0x01010100
  132347. +#define OID_NDIS_SEG5 0x01020100
  132348. +#define OID_NDIS_SEG6 0x01020200
  132349. +#define OID_NDIS_SEG7 0xFD010100
  132350. +#define OID_NDIS_SEG8 0x0D010100
  132351. +#define OID_NDIS_SEG9 0x0D010200
  132352. +#define OID_NDIS_SEG10 0x0D020200
  132353. +
  132354. +#define SZ_OID_NDIS_SEG1 23
  132355. +#define SZ_OID_NDIS_SEG2 3
  132356. +#define SZ_OID_NDIS_SEG3 6
  132357. +#define SZ_OID_NDIS_SEG4 6
  132358. +#define SZ_OID_NDIS_SEG5 4
  132359. +#define SZ_OID_NDIS_SEG6 8
  132360. +#define SZ_OID_NDIS_SEG7 7
  132361. +#define SZ_OID_NDIS_SEG8 36
  132362. +#define SZ_OID_NDIS_SEG9 24
  132363. +#define SZ_OID_NDIS_SEG10 19
  132364. +
  132365. +// For Realtek-defined OIDs
  132366. +#define OID_MP_SEG1 0xFF871100
  132367. +#define OID_MP_SEG2 0xFF818000
  132368. +
  132369. +#define OID_MP_SEG3 0xFF818700
  132370. +#define OID_MP_SEG4 0xFF011100
  132371. +
  132372. +#define DEBUG_OID(dbg, str) \
  132373. + if((!dbg)) \
  132374. + { \
  132375. + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_info_,("%s(%d): %s", __FUNCTION__, __LINE__, str)); \
  132376. + }
  132377. +
  132378. +
  132379. +enum oid_type
  132380. +{
  132381. + QUERY_OID,
  132382. + SET_OID
  132383. +};
  132384. +
  132385. +struct oid_funs_node {
  132386. + unsigned int oid_start; //the starting number for OID
  132387. + unsigned int oid_end; //the ending number for OID
  132388. + struct oid_obj_priv *node_array;
  132389. + unsigned int array_sz; //the size of node_array
  132390. + int query_counter; //count the number of query hits for this segment
  132391. + int set_counter; //count the number of set hits for this segment
  132392. +};
  132393. +
  132394. +struct oid_par_priv
  132395. +{
  132396. + void *adapter_context;
  132397. + NDIS_OID oid;
  132398. + void *information_buf;
  132399. + u32 information_buf_len;
  132400. + u32 *bytes_rw;
  132401. + u32 *bytes_needed;
  132402. + enum oid_type type_of_oid;
  132403. + u32 dbg;
  132404. +};
  132405. +
  132406. +struct oid_obj_priv {
  132407. + unsigned char dbg; // 0: without OID debug message 1: with OID debug message
  132408. + NDIS_STATUS (*oidfuns)(struct oid_par_priv *poid_par_priv);
  132409. +};
  132410. +
  132411. +#if (defined(CONFIG_MP_INCLUDED) && defined(_RTW_MP_IOCTL_C_)) || \
  132412. + (defined(PLATFORM_WINDOWS) && defined(_RTW_IOCTL_RTL_C_))
  132413. +static NDIS_STATUS oid_null_function(struct oid_par_priv* poid_par_priv)
  132414. +{
  132415. + _func_enter_;
  132416. + _func_exit_;
  132417. + return NDIS_STATUS_SUCCESS;
  132418. +}
  132419. +#endif
  132420. +
  132421. +#ifdef PLATFORM_WINDOWS
  132422. +
  132423. +int TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE ndisPsMode);
  132424. +
  132425. +//OID Handler for Segment 1
  132426. +NDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv* poid_par_priv);
  132427. +NDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv* poid_par_priv);
  132428. +NDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv* poid_par_priv);
  132429. +NDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv* poid_par_priv);
  132430. +NDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv* poid_par_priv);
  132431. +NDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv* poid_par_priv);
  132432. +NDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv* poid_par_priv);
  132433. +NDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv* poid_par_priv);
  132434. +NDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv* poid_par_priv);
  132435. +NDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv* poid_par_priv);
  132436. +NDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv* poid_par_priv);
  132437. +NDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv* poid_par_priv);
  132438. +NDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv* poid_par_priv);
  132439. +NDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv* poid_par_priv);
  132440. +NDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv* poid_par_priv);
  132441. +NDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv* poid_par_priv);
  132442. +NDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv* poid_par_priv);
  132443. +NDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv* poid_par_priv);
  132444. +NDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv* poid_par_priv);
  132445. +NDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv* poid_par_priv);
  132446. +NDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv* poid_par_priv);
  132447. +NDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv* poid_par_priv);
  132448. +
  132449. +
  132450. +//OID Handler for Segment 2
  132451. +NDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv* poid_par_priv);
  132452. +
  132453. +//OID Handler for Segment 3
  132454. +NDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv* poid_par_priv);
  132455. +NDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv* poid_par_priv);
  132456. +NDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv* poid_par_priv);
  132457. +NDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv* poid_par_priv);
  132458. +NDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv* poid_par_priv);
  132459. +
  132460. +
  132461. +//OID Handler for Segment 4
  132462. +NDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv* poid_par_priv);
  132463. +NDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv* poid_par_priv);
  132464. +NDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv* poid_par_priv);
  132465. +NDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv* poid_par_priv);
  132466. +NDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv* poid_par_priv);
  132467. +
  132468. +
  132469. +
  132470. +//OID Handler for Segment 5
  132471. +NDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv* poid_par_priv);
  132472. +NDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv* poid_par_priv);
  132473. +NDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv* poid_par_priv);
  132474. +
  132475. +
  132476. +//OID Handler for Segment 6
  132477. +NDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv* poid_par_priv);
  132478. +NDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv* poid_par_priv);
  132479. +NDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv* poid_par_priv);
  132480. +NDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv* poid_par_priv);
  132481. +NDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv* poid_par_priv);
  132482. +NDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv* poid_par_priv);
  132483. +NDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv* poid_par_priv);
  132484. +
  132485. +
  132486. +
  132487. +//OID Handler for Segment 7
  132488. +NDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv* poid_par_priv);
  132489. +NDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv* poid_par_priv);
  132490. +NDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv* poid_par_priv);
  132491. +NDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv);
  132492. +NDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv);
  132493. +NDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv* poid_par_priv);
  132494. +NDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv* poid_par_priv);
  132495. +
  132496. +
  132497. +
  132498. +//OID Handler for Segment 8
  132499. +NDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv* poid_par_priv);
  132500. +NDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv* poid_par_priv);
  132501. +NDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv* poid_par_priv);
  132502. +NDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv* poid_par_priv);
  132503. +NDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv* poid_par_priv);
  132504. +NDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv* poid_par_priv);
  132505. +NDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv* poid_par_priv);
  132506. +NDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv* poid_par_priv);
  132507. +NDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv* poid_par_priv);
  132508. +NDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv* poid_par_priv);
  132509. +NDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv* poid_par_priv);
  132510. +NDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv* poid_par_priv);
  132511. +NDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv* poid_par_priv);
  132512. +NDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv* poid_par_priv);
  132513. +NDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv* poid_par_priv);
  132514. +NDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv* poid_par_priv);
  132515. +NDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv* poid_par_priv);
  132516. +NDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv* poid_par_priv);
  132517. +
  132518. +
  132519. +
  132520. +
  132521. +
  132522. +//OID Handler for Segment 9
  132523. +NDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv* poid_par_priv);
  132524. +NDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv* poid_par_priv);
  132525. +NDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv* poid_par_priv);
  132526. +NDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv* poid_par_priv);
  132527. +NDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv* poid_par_priv);
  132528. +NDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv* poid_par_priv);
  132529. +NDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv* poid_par_priv);
  132530. +NDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv* poid_par_priv);
  132531. +NDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv);
  132532. +NDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv);
  132533. +NDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv* poid_par_priv);
  132534. +NDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv* poid_par_priv);
  132535. +NDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv* poid_par_priv);
  132536. +NDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv* poid_par_priv);
  132537. +NDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv* poid_par_priv);
  132538. +
  132539. +
  132540. +//OID Handler for Segment 10
  132541. +NDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv* poid_par_priv);
  132542. +
  132543. +
  132544. +//OID Handler for Segment ED
  132545. +NDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv* poid_par_priv);
  132546. +
  132547. +void Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast);
  132548. +
  132549. +#endif// end of PLATFORM_WINDOWS
  132550. +
  132551. +
  132552. +#if defined(PLATFORM_LINUX) && defined(CONFIG_WIRELESS_EXT)
  132553. +extern struct iw_handler_def rtw_handlers_def;
  132554. +#endif
  132555. +
  132556. +extern NDIS_STATUS drv_query_info(
  132557. + IN _nic_hdl MiniportAdapterContext,
  132558. + IN NDIS_OID Oid,
  132559. + IN void * InformationBuffer,
  132560. + IN u32 InformationBufferLength,
  132561. + OUT u32* BytesWritten,
  132562. + OUT u32* BytesNeeded
  132563. + );
  132564. +
  132565. +extern NDIS_STATUS drv_set_info(
  132566. + IN _nic_hdl MiniportAdapterContext,
  132567. + IN NDIS_OID Oid,
  132568. + IN void * InformationBuffer,
  132569. + IN u32 InformationBufferLength,
  132570. + OUT u32* BytesRead,
  132571. + OUT u32* BytesNeeded
  132572. + );
  132573. +
  132574. +#endif // #ifndef __INC_CEINFO_
  132575. --- /dev/null
  132576. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h
  132577. @@ -0,0 +1,35 @@
  132578. +/******************************************************************************
  132579. + *
  132580. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132581. + *
  132582. + * This program is free software; you can redistribute it and/or modify it
  132583. + * under the terms of version 2 of the GNU General Public License as
  132584. + * published by the Free Software Foundation.
  132585. + *
  132586. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132587. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132588. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132589. + * more details.
  132590. + *
  132591. + * You should have received a copy of the GNU General Public License along with
  132592. + * this program; if not, write to the Free Software Foundation, Inc.,
  132593. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132594. + *
  132595. + *
  132596. + ******************************************************************************/
  132597. +#ifndef _RTW_IOCTL_QUERY_H_
  132598. +#define _RTW_IOCTL_QUERY_H_
  132599. +
  132600. +#include <drv_conf.h>
  132601. +#include <drv_types.h>
  132602. +
  132603. +
  132604. +#ifdef PLATFORM_WINDOWS
  132605. +
  132606. +u8 query_802_11_capability(_adapter* padapter,u8* pucBuf,u32 * pulOutLen);
  132607. +u8 query_802_11_association_information (_adapter * padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo);
  132608. +
  132609. +#endif
  132610. +
  132611. +
  132612. +#endif
  132613. --- /dev/null
  132614. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h
  132615. @@ -0,0 +1,83 @@
  132616. +/******************************************************************************
  132617. + *
  132618. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132619. + *
  132620. + * This program is free software; you can redistribute it and/or modify it
  132621. + * under the terms of version 2 of the GNU General Public License as
  132622. + * published by the Free Software Foundation.
  132623. + *
  132624. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132625. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132626. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132627. + * more details.
  132628. + *
  132629. + * You should have received a copy of the GNU General Public License along with
  132630. + * this program; if not, write to the Free Software Foundation, Inc.,
  132631. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132632. + *
  132633. + *
  132634. + ******************************************************************************/
  132635. +#ifndef _RTW_IOCTL_RTL_H_
  132636. +#define _RTW_IOCTL_RTL_H_
  132637. +
  132638. +#include <drv_conf.h>
  132639. +#include <osdep_service.h>
  132640. +#include <drv_types.h>
  132641. +
  132642. +//************** oid_rtl_seg_01_01 **************
  132643. +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv);//84
  132644. +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv);
  132645. +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv);
  132646. +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv);
  132647. +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv);
  132648. +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv);
  132649. +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv);
  132650. +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv);
  132651. +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv);
  132652. +
  132653. +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv); //8a
  132654. +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv); //8b
  132655. +
  132656. +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv);//93
  132657. +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv);
  132658. +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv);
  132659. +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv);
  132660. +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv);
  132661. +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv);
  132662. +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv);
  132663. +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv);
  132664. +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv);
  132665. +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv);
  132666. +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv);
  132667. +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv);
  132668. +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv);
  132669. +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv);
  132670. +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv);
  132671. +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv);
  132672. +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv);
  132673. +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);
  132674. +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv);
  132675. +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv);
  132676. +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv);
  132677. +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv);
  132678. +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);
  132679. +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv);
  132680. +
  132681. +//************** oid_rtl_seg_01_03 section start **************
  132682. +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv);
  132683. +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv);
  132684. +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv);
  132685. +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv);
  132686. +
  132687. +// oid_rtl_seg_01_11
  132688. +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv);
  132689. +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv);
  132690. +
  132691. +//************** oid_rtl_seg_03_00 section start **************
  132692. +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv);
  132693. +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv);
  132694. +
  132695. +
  132696. +
  132697. +
  132698. +#endif
  132699. --- /dev/null
  132700. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h
  132701. @@ -0,0 +1,78 @@
  132702. +/******************************************************************************
  132703. + *
  132704. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132705. + *
  132706. + * This program is free software; you can redistribute it and/or modify it
  132707. + * under the terms of version 2 of the GNU General Public License as
  132708. + * published by the Free Software Foundation.
  132709. + *
  132710. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132711. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132712. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132713. + * more details.
  132714. + *
  132715. + * You should have received a copy of the GNU General Public License along with
  132716. + * this program; if not, write to the Free Software Foundation, Inc.,
  132717. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132718. + *
  132719. + *
  132720. + ******************************************************************************/
  132721. +#ifndef __RTW_IOCTL_SET_H_
  132722. +#define __RTW_IOCTL_SET_H_
  132723. +
  132724. +#include <drv_conf.h>
  132725. +#include <drv_types.h>
  132726. +
  132727. +
  132728. +typedef u8 NDIS_802_11_PMKID_VALUE[16];
  132729. +
  132730. +typedef struct _BSSIDInfo {
  132731. + NDIS_802_11_MAC_ADDRESS BSSID;
  132732. + NDIS_802_11_PMKID_VALUE PMKID;
  132733. +} BSSIDInfo, *PBSSIDInfo;
  132734. +
  132735. +
  132736. +#ifdef PLATFORM_OS_XP
  132737. +typedef struct _NDIS_802_11_PMKID {
  132738. + u32 Length;
  132739. + u32 BSSIDInfoCount;
  132740. + BSSIDInfo BSSIDInfo[1];
  132741. +} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID;
  132742. +#endif
  132743. +
  132744. +
  132745. +#ifdef PLATFORM_WINDOWS
  132746. +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults);
  132747. +u8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test);
  132748. +u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid);
  132749. +
  132750. +u8 rtw_pnp_set_power_sleep(_adapter* padapter);
  132751. +u8 rtw_pnp_set_power_wakeup(_adapter* padapter);
  132752. +
  132753. +void rtw_pnp_resume_wk(void *context);
  132754. +void rtw_pnp_sleep_wk(void * context);
  132755. +
  132756. +#endif
  132757. +
  132758. +u8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key);
  132759. +u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode);
  132760. +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid);
  132761. +u8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep);
  132762. +u8 rtw_set_802_11_disassociate(_adapter * padapter);
  132763. +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num);
  132764. +u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
  132765. +u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex);
  132766. +u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid);
  132767. +u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid);
  132768. +u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key);
  132769. +
  132770. +u8 rtw_validate_bssid(u8 *bssid);
  132771. +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid);
  132772. +
  132773. +u16 rtw_get_cur_max_rate(_adapter *adapter);
  132774. +int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode);
  132775. +int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan);
  132776. +int rtw_set_country(_adapter *adapter, const char *country_code);
  132777. +int rtw_set_band(_adapter *adapter, enum _BAND band);
  132778. +
  132779. +#endif
  132780. --- /dev/null
  132781. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_iol.h
  132782. @@ -0,0 +1,89 @@
  132783. +/******************************************************************************
  132784. + *
  132785. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132786. + *
  132787. + * This program is free software; you can redistribute it and/or modify it
  132788. + * under the terms of version 2 of the GNU General Public License as
  132789. + * published by the Free Software Foundation.
  132790. + *
  132791. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132792. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132793. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132794. + * more details.
  132795. + *
  132796. + * You should have received a copy of the GNU General Public License along with
  132797. + * this program; if not, write to the Free Software Foundation, Inc.,
  132798. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132799. + *
  132800. + *
  132801. + ******************************************************************************/
  132802. +#ifndef __RTW_IOL_H_
  132803. +#define __RTW_IOL_H_
  132804. +
  132805. +#include <drv_conf.h>
  132806. +#include <osdep_service.h>
  132807. +#include <drv_types.h>
  132808. +
  132809. +typedef struct _io_offload_cmd {
  132810. + u8 rsvd0;
  132811. + u8 cmd;
  132812. + u16 address;
  132813. + u32 value;
  132814. +} IO_OFFLOAD_CMD, IOL_CMD;
  132815. +
  132816. +#define IOL_CMD_LLT 0x00
  132817. +//#define IOL_CMD_R_EFUSE 0x01
  132818. +#define IOL_CMD_WB_REG 0x02
  132819. +#define IOL_CMD_WW_REG 0x03
  132820. +#define IOL_CMD_WD_REG 0x04
  132821. +//#define IOL_CMD_W_RF 0x05
  132822. +#define IOL_CMD_DELAY_US 0x80
  132823. +#define IOL_CMD_DELAY_MS 0x81
  132824. +//#define IOL_CMD_DELAY_S 0x82
  132825. +#define IOL_CMD_END 0x83
  132826. +
  132827. +/*****************************************************
  132828. +CMD Address Value
  132829. +(B1) (B2/B3:H/L addr) (B4:B7 : MSB:LSB)
  132830. +******************************************************
  132831. +IOL_CMD_LLT - B7: PGBNDY
  132832. +//IOL_CMD_R_EFUSE - -
  132833. +IOL_CMD_WB_REG 0x0~0xFFFF B7
  132834. +IOL_CMD_WW_REG 0x0~0xFFFF B6~B7
  132835. +IOL_CMD_WD_REG 0x0~0xFFFF B4~B7
  132836. +//IOL_CMD_W_RF RF Reg B5~B7
  132837. +IOL_CMD_DELAY_US - B6~B7
  132838. +IOL_CMD_DELAY_MS - B6~B7
  132839. +//IOL_CMD_DELAY_S - B6~B7
  132840. +IOL_CMD_END - -
  132841. +******************************************************/
  132842. +
  132843. +struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter);
  132844. +int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len);
  132845. +int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary);
  132846. +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value);
  132847. +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value);
  132848. +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value);
  132849. +int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us);
  132850. +int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms);
  132851. +int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame);
  132852. +int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms);
  132853. +int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms);
  132854. +int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms);
  132855. +
  132856. +#ifdef DBG_IO
  132857. +int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line);
  132858. +int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line);
  132859. +int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line);
  132860. +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)
  132861. +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)
  132862. +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)
  132863. +#else
  132864. +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value))
  132865. +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value))
  132866. +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value))
  132867. +#endif
  132868. +
  132869. +bool rtw_IOL_applied(ADAPTER *adapter);
  132870. +
  132871. +#endif //__RTW_IOL_H_
  132872. --- /dev/null
  132873. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_led.h
  132874. @@ -0,0 +1,216 @@
  132875. +/******************************************************************************
  132876. + *
  132877. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  132878. + *
  132879. + * This program is free software; you can redistribute it and/or modify it
  132880. + * under the terms of version 2 of the GNU General Public License as
  132881. + * published by the Free Software Foundation.
  132882. + *
  132883. + * This program is distributed in the hope that it will be useful, but WITHOUT
  132884. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  132885. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  132886. + * more details.
  132887. + *
  132888. + * You should have received a copy of the GNU General Public License along with
  132889. + * this program; if not, write to the Free Software Foundation, Inc.,
  132890. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  132891. + *
  132892. + *
  132893. + ******************************************************************************/
  132894. +#ifndef __RTW_LED_H_
  132895. +#define __RTW_LED_H_
  132896. +
  132897. +#include <drv_conf.h>
  132898. +#include <osdep_service.h>
  132899. +#include <drv_types.h>
  132900. +
  132901. +#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)
  132902. +
  132903. +typedef enum _LED_CTL_MODE{
  132904. + LED_CTL_POWER_ON = 1,
  132905. + LED_CTL_LINK = 2,
  132906. + LED_CTL_NO_LINK = 3,
  132907. + LED_CTL_TX = 4,
  132908. + LED_CTL_RX = 5,
  132909. + LED_CTL_SITE_SURVEY = 6,
  132910. + LED_CTL_POWER_OFF = 7,
  132911. + LED_CTL_START_TO_LINK = 8,
  132912. + LED_CTL_START_WPS = 9,
  132913. + LED_CTL_STOP_WPS = 10,
  132914. + LED_CTL_START_WPS_BOTTON = 11, //added for runtop
  132915. + LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA
  132916. + LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN
  132917. +}LED_CTL_MODE;
  132918. +
  132919. +
  132920. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
  132921. +//================================================================================
  132922. +// LED object.
  132923. +//================================================================================
  132924. +
  132925. +typedef enum _LED_STATE_871x{
  132926. + LED_UNKNOWN = 0,
  132927. + RTW_LED_ON = 1,
  132928. + RTW_LED_OFF = 2,
  132929. + LED_BLINK_NORMAL = 3,
  132930. + LED_BLINK_SLOWLY = 4,
  132931. + LED_POWER_ON_BLINK = 5,
  132932. + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning.
  132933. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state.
  132934. + LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case
  132935. + LED_BLINK_WPS = 9, // LED is blinkg during WPS communication
  132936. + LED_TXRX_BLINK = 10,
  132937. + LED_BLINK_WPS_STOP = 11, //for ALPHA
  132938. + LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN
  132939. +}LED_STATE_871x;
  132940. +
  132941. +#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \
  132942. + || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \
  132943. + || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress)
  132944. +
  132945. +#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \
  132946. + ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress)
  132947. +
  132948. +typedef enum _LED_PIN_871x{
  132949. + LED_PIN_GPIO0,
  132950. + LED_PIN_LED0,
  132951. + LED_PIN_LED1
  132952. +}LED_PIN_871x;
  132953. +
  132954. +typedef struct _LED_871x{
  132955. + _adapter *padapter;
  132956. + LED_PIN_871x LedPin; // Identify how to implement this SW led.
  132957. + LED_STATE_871x CurrLedState; // Current LED state.
  132958. + u8 bLedOn; // true if LED is ON, false if LED is OFF.
  132959. +
  132960. + u8 bSWLedCtrl;
  132961. +
  132962. + u8 bLedBlinkInProgress; // true if it is blinking, false o.w..
  132963. + // ALPHA, added by chiyoko, 20090106
  132964. + u8 bLedNoLinkBlinkInProgress;
  132965. + u8 bLedLinkBlinkInProgress;
  132966. + u8 bLedStartToLinkBlinkInProgress;
  132967. + u8 bLedScanBlinkInProgress;
  132968. + u8 bLedWPSBlinkInProgress;
  132969. +
  132970. + u32 BlinkTimes; // Number of times to toggle led state for blinking.
  132971. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are.
  132972. +
  132973. + _timer BlinkTimer; // Timer object for led blinking.
  132974. +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)|| defined PLATFORM_FREEBSD
  132975. + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED.
  132976. +#endif
  132977. +} LED_871x, *PLED_871x;
  132978. +
  132979. +
  132980. +//================================================================================
  132981. +// LED customization.
  132982. +//================================================================================
  132983. +
  132984. +typedef enum _LED_STRATEGY_871x{
  132985. + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.
  132986. + SW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA.
  132987. + SW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard.
  132988. + SW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case.
  132989. + SW_LED_MODE4, //for Edimax / Belkin
  132990. + SW_LED_MODE5, //for Sercomm / Belkin
  132991. + SW_LED_MODE6, //for 88CU minicard, porting from ce SW_LED_MODE7
  132992. + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.)
  132993. +}LED_STRATEGY_871x, *PLED_STRATEGY_871x;
  132994. +#endif //CONFIG_USB_HCI
  132995. +
  132996. +#ifdef CONFIG_PCI_HCI
  132997. +//================================================================================
  132998. +// LED object.
  132999. +//================================================================================
  133000. +
  133001. +typedef enum _LED_STATE_871x{
  133002. + LED_UNKNOWN = 0,
  133003. + RTW_LED_ON = 1,
  133004. + RTW_LED_OFF = 2,
  133005. + LED_BLINK_NORMAL = 3,
  133006. + LED_BLINK_SLOWLY = 4,
  133007. + LED_POWER_ON_BLINK = 5,
  133008. + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning.
  133009. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state.
  133010. + LED_BLINK_StartToBlink = 8,
  133011. + LED_BLINK_TXRX = 9,
  133012. + LED_BLINK_RUNTOP = 10, // Customized for RunTop
  133013. + LED_BLINK_CAMEO = 11,
  133014. +}LED_STATE_871x;
  133015. +
  133016. +typedef enum _LED_PIN_871x{
  133017. + LED_PIN_GPIO0,
  133018. + LED_PIN_LED0,
  133019. + LED_PIN_LED1,
  133020. + LED_PIN_LED2
  133021. +}LED_PIN_871x;
  133022. +
  133023. +typedef struct _LED_871x{
  133024. + _adapter *padapter;
  133025. +
  133026. + LED_PIN_871x LedPin; // Identify how to implement this SW led.
  133027. +
  133028. + LED_STATE_871x CurrLedState; // Current LED state.
  133029. + u8 bLedOn; // TRUE if LED is ON, FALSE if LED is OFF.
  133030. +
  133031. + u8 bLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w..
  133032. + u8 bLedWPSBlinkInProgress; // TRUE if it is blinking, FALSE o.w..
  133033. +
  133034. + u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode
  133035. + u32 BlinkTimes; // Number of times to toggle led state for blinking.
  133036. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are.
  133037. +
  133038. + _timer BlinkTimer; // Timer object for led blinking.
  133039. +
  133040. + u8 bLedLinkBlinkInProgress;
  133041. + u8 bLedNoLinkBlinkInProgress;
  133042. + u8 bLedScanBlinkInProgress;
  133043. +} LED_871x, *PLED_871x;
  133044. +
  133045. +
  133046. +//================================================================================
  133047. +// LED customization.
  133048. +//================================================================================
  133049. +
  133050. +typedef enum _LED_STRATEGY_871x{
  133051. + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.
  133052. + SW_LED_MODE1, // SW control for PCI Express
  133053. + SW_LED_MODE2, // SW control for Cameo.
  133054. + SW_LED_MODE3, // SW contorl for RunTop.
  133055. + SW_LED_MODE4, // SW control for Netcore
  133056. + SW_LED_MODE5, //added by vivi, for led new mode, DLINK
  133057. + SW_LED_MODE6, //added by vivi, for led new mode, PRONET
  133058. + SW_LED_MODE7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec
  133059. + SW_LED_MODE8, //added by chiyokolin, for QMI
  133060. + SW_LED_MODE9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1
  133061. + SW_LED_MODE10, //added by chiyokolin, for Edimax-ASUS
  133062. + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes)
  133063. +}LED_STRATEGY_871x, *PLED_STRATEGY_871x;
  133064. +
  133065. +#define LED_CM8_BLINK_INTERVAL 500 //for QMI
  133066. +#endif //CONFIG_PCI_HCI
  133067. +
  133068. +struct led_priv{
  133069. + /* add for led controll */
  133070. + LED_871x SwLed0;
  133071. + LED_871x SwLed1;
  133072. + LED_STRATEGY_871x LedStrategy;
  133073. + u8 bRegUseLed;
  133074. + void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction);
  133075. + /* add for led controll */
  133076. +};
  133077. +
  133078. +#ifdef CONFIG_SW_LED
  133079. +#define rtw_led_control(adapter, LedAction) \
  133080. + do { \
  133081. + if((adapter)->ledpriv.LedControlHandler) \
  133082. + (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \
  133083. + } while(0)
  133084. +#else //CONFIG_SW_LED
  133085. +#define rtw_led_control(adapter, LedAction)
  133086. +#endif //CONFIG_SW_LED
  133087. +
  133088. +extern void BlinkHandler(PLED_871x pLed);
  133089. +
  133090. +#endif //__RTW_LED_H_
  133091. --- /dev/null
  133092. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_mlme.h
  133093. @@ -0,0 +1,843 @@
  133094. +/******************************************************************************
  133095. + *
  133096. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  133097. + *
  133098. + * This program is free software; you can redistribute it and/or modify it
  133099. + * under the terms of version 2 of the GNU General Public License as
  133100. + * published by the Free Software Foundation.
  133101. + *
  133102. + * This program is distributed in the hope that it will be useful, but WITHOUT
  133103. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  133104. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  133105. + * more details.
  133106. + *
  133107. + * You should have received a copy of the GNU General Public License along with
  133108. + * this program; if not, write to the Free Software Foundation, Inc.,
  133109. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  133110. + *
  133111. + *
  133112. + ******************************************************************************/
  133113. +#ifndef __RTW_MLME_H_
  133114. +#define __RTW_MLME_H_
  133115. +
  133116. +#include <drv_conf.h>
  133117. +#include <osdep_service.h>
  133118. +#include <mlme_osdep.h>
  133119. +#include <drv_types.h>
  133120. +#include <wlan_bssdef.h>
  133121. +
  133122. +#ifdef CONFIG_INTEL_WIDI
  133123. +#include <rtw_intel_widi.h>
  133124. +#endif
  133125. +
  133126. +#define MAX_BSS_CNT 128
  133127. +//#define MAX_JOIN_TIMEOUT 2000
  133128. +//#define MAX_JOIN_TIMEOUT 2500
  133129. +#define MAX_JOIN_TIMEOUT 6500
  133130. +
  133131. +// Commented by Albert 20101105
  133132. +// Increase the scanning timeout because of increasing the SURVEY_TO value.
  133133. +
  133134. +#define SCANNING_TIMEOUT 8000
  133135. +
  133136. +#define SCAN_INTERVAL (30) // unit:2sec, 30*2=60sec
  133137. +
  133138. +#ifdef PALTFORM_OS_WINCE
  133139. +#define SCANQUEUE_LIFETIME 12000000 // unit:us
  133140. +#else
  133141. +#define SCANQUEUE_LIFETIME 20 // unit:sec
  133142. +#endif
  133143. +
  133144. +#define WIFI_NULL_STATE 0x00000000
  133145. +
  133146. +#define WIFI_ASOC_STATE 0x00000001 // Under Linked state...
  133147. +#define WIFI_REASOC_STATE 0x00000002
  133148. +#define WIFI_SLEEP_STATE 0x00000004
  133149. +#define WIFI_STATION_STATE 0x00000008
  133150. +
  133151. +#define WIFI_AP_STATE 0x00000010
  133152. +#define WIFI_ADHOC_STATE 0x00000020
  133153. +#define WIFI_ADHOC_MASTER_STATE 0x00000040
  133154. +#define WIFI_UNDER_LINKING 0x00000080
  133155. +
  133156. +#define WIFI_UNDER_WPS 0x00000100
  133157. +//#define WIFI_UNDER_CMD 0x00000200
  133158. +//#define WIFI_UNDER_P2P 0x00000400
  133159. +#define WIFI_STA_ALIVE_CHK_STATE 0x00000400
  133160. +#define WIFI_SITE_MONITOR 0x00000800 //to indicate the station is under site surveying
  133161. +
  133162. +#ifdef WDS
  133163. +#define WIFI_WDS 0x00001000
  133164. +#define WIFI_WDS_RX_BEACON 0x00002000 // already rx WDS AP beacon
  133165. +#endif
  133166. +#ifdef AUTO_CONFIG
  133167. +#define WIFI_AUTOCONF 0x00004000
  133168. +#define WIFI_AUTOCONF_IND 0x00008000
  133169. +#endif
  133170. +
  133171. +/*
  133172. +// ========== P2P Section Start ===============
  133173. +#define WIFI_P2P_LISTEN_STATE 0x00010000
  133174. +#define WIFI_P2P_GROUP_FORMATION_STATE 0x00020000
  133175. +// ========== P2P Section End ===============
  133176. +*/
  133177. +
  133178. +//#ifdef UNDER_MPTEST
  133179. +#define WIFI_MP_STATE 0x00010000
  133180. +#define WIFI_MP_CTX_BACKGROUND 0x00020000 // in continous tx background
  133181. +#define WIFI_MP_CTX_ST 0x00040000 // in continous tx with single-tone
  133182. +#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 // pending in continous tx background due to out of skb
  133183. +#define WIFI_MP_CTX_CCK_HW 0x00100000 // in continous tx
  133184. +#define WIFI_MP_CTX_CCK_CS 0x00200000 // in continous tx with carrier suppression
  133185. +#define WIFI_MP_LPBK_STATE 0x00400000
  133186. +//#endif
  133187. +
  133188. +//#define _FW_UNDER_CMD WIFI_UNDER_CMD
  133189. +#define _FW_UNDER_LINKING WIFI_UNDER_LINKING
  133190. +#define _FW_LINKED WIFI_ASOC_STATE
  133191. +#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR
  133192. +
  133193. +
  133194. +enum dot11AuthAlgrthmNum {
  133195. + dot11AuthAlgrthm_Open = 0,
  133196. + dot11AuthAlgrthm_Shared,
  133197. + dot11AuthAlgrthm_8021X,
  133198. + dot11AuthAlgrthm_Auto,
  133199. + dot11AuthAlgrthm_MaxNum
  133200. +};
  133201. +
  133202. +// Scan type including active and passive scan.
  133203. +typedef enum _RT_SCAN_TYPE
  133204. +{
  133205. + SCAN_PASSIVE,
  133206. + SCAN_ACTIVE,
  133207. + SCAN_MIX,
  133208. +}RT_SCAN_TYPE, *PRT_SCAN_TYPE;
  133209. +
  133210. +enum DriverInterface {
  133211. + DRIVER_WEXT = 1,
  133212. + DRIVER_CFG80211 = 2
  133213. +};
  133214. +
  133215. +enum _BAND
  133216. +{
  133217. + GHZ24_50 = 0,
  133218. + GHZ_50,
  133219. + GHZ_24,
  133220. + GHZ_MAX,
  133221. +};
  133222. +
  133223. +#define rtw_band_valid(band) ((band) >= GHZ24_50 && (band) < GHZ_MAX)
  133224. +
  133225. +enum SCAN_RESULT_TYPE
  133226. +{
  133227. + SCAN_RESULT_P2P_ONLY = 0, // Will return all the P2P devices.
  133228. + SCAN_RESULT_ALL = 1, // Will return all the scanned device, include AP.
  133229. + SCAN_RESULT_WFD_TYPE = 2 // Will just return the correct WFD device.
  133230. + // If this device is Miracast sink device, it will just return all the Miracast source devices.
  133231. +};
  133232. +
  133233. +/*
  133234. +
  133235. +there are several "locks" in mlme_priv,
  133236. +since mlme_priv is a shared resource between many threads,
  133237. +like ISR/Call-Back functions, the OID handlers, and even timer functions.
  133238. +
  133239. +
  133240. +Each _queue has its own locks, already.
  133241. +Other items are protected by mlme_priv.lock.
  133242. +
  133243. +To avoid possible dead lock, any thread trying to modifiying mlme_priv
  133244. +SHALL not lock up more than one locks at a time!
  133245. +
  133246. +*/
  133247. +
  133248. +
  133249. +#define traffic_threshold 10
  133250. +#define traffic_scan_period 500
  133251. +
  133252. +struct sitesurvey_ctrl {
  133253. + u64 last_tx_pkts;
  133254. + uint last_rx_pkts;
  133255. + sint traffic_busy;
  133256. + _timer sitesurvey_ctrl_timer;
  133257. +};
  133258. +
  133259. +typedef struct _RT_LINK_DETECT_T{
  133260. + u32 NumTxOkInPeriod;
  133261. + u32 NumRxOkInPeriod;
  133262. + u32 NumRxUnicastOkInPeriod;
  133263. + BOOLEAN bBusyTraffic;
  133264. + BOOLEAN bTxBusyTraffic;
  133265. + BOOLEAN bRxBusyTraffic;
  133266. + BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose.
  133267. + BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic.
  133268. + BOOLEAN bHigherBusyTxTraffic; // We may disable Tx interrupt according as Tx traffic.
  133269. +}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
  133270. +
  133271. +struct profile_info {
  133272. + u8 ssidlen;
  133273. + u8 ssid[ WLAN_SSID_MAXLEN ];
  133274. + u8 peermac[ ETH_ALEN ];
  133275. +};
  133276. +
  133277. +struct tx_invite_req_info{
  133278. + u8 token;
  133279. + u8 benable;
  133280. + u8 go_ssid[ WLAN_SSID_MAXLEN ];
  133281. + u8 ssidlen;
  133282. + u8 go_bssid[ ETH_ALEN ];
  133283. + u8 peer_macaddr[ ETH_ALEN ];
  133284. + u8 operating_ch; // This information will be set by using the p2p_set op_ch=x
  133285. + u8 peer_ch; // The listen channel for peer P2P device
  133286. +
  133287. +};
  133288. +
  133289. +struct tx_invite_resp_info{
  133290. + u8 token; // Used to record the dialog token of p2p invitation request frame.
  133291. +};
  133292. +
  133293. +#ifdef CONFIG_WFD
  133294. +
  133295. +struct wifi_display_info{
  133296. + u16 wfd_enable; // Eanble/Disable the WFD function.
  133297. + u16 rtsp_ctrlport; // TCP port number at which the this WFD device listens for RTSP messages
  133298. + u16 peer_rtsp_ctrlport; // TCP port number at which the peer WFD device listens for RTSP messages
  133299. + // This filed should be filled when receiving the gropu negotiation request
  133300. +
  133301. + u8 peer_session_avail; // WFD session is available or not for the peer wfd device.
  133302. + // This variable will be set when sending the provisioning discovery request to peer WFD device.
  133303. + // And this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command.
  133304. +
  133305. + u8 ip_address[4];
  133306. + u8 peer_ip_address[4];
  133307. + u8 wfd_pc; // WFD preferred connection
  133308. + // 0 -> Prefer to use the P2P for WFD connection on peer side.
  133309. + // 1 -> Prefer to use the TDLS for WFD connection on peer side.
  133310. +
  133311. + u8 wfd_device_type; // WFD Device Type
  133312. + // 0 -> WFD Source Device
  133313. + // 1 -> WFD Primary Sink Device
  133314. + enum SCAN_RESULT_TYPE scan_result_type; // Used when P2P is enable. This parameter will impact the scan result.
  133315. +};
  133316. +#endif //CONFIG_WFD
  133317. +
  133318. +struct tx_provdisc_req_info{
  133319. + u16 wps_config_method_request; // Used when sending the provisioning request frame
  133320. + u16 peer_channel_num[2]; // The channel number which the receiver stands.
  133321. + NDIS_802_11_SSID ssid;
  133322. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address
  133323. + u8 peerIFAddr[ ETH_ALEN ]; // Peer interface address
  133324. + u8 benable; // This provision discovery request frame is trigger to send or not
  133325. +};
  133326. +
  133327. +struct rx_provdisc_req_info{ //When peer device issue prov_disc_req first, we should store the following informations
  133328. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address
  133329. + u8 strconfig_method_desc_of_prov_disc_req[4]; // description for the config method located in the provisioning discovery request frame.
  133330. + // The UI must know this information to know which config method the remote p2p device is requiring.
  133331. +};
  133332. +
  133333. +struct tx_nego_req_info{
  133334. + u16 peer_channel_num[2]; // The channel number which the receiver stands.
  133335. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address
  133336. + u8 benable; // This negoitation request frame is trigger to send or not
  133337. +};
  133338. +
  133339. +struct group_id_info{
  133340. + u8 go_device_addr[ ETH_ALEN ]; // The GO's device address of this P2P group
  133341. + u8 ssid[ WLAN_SSID_MAXLEN ]; // The SSID of this P2P group
  133342. +};
  133343. +
  133344. +struct scan_limit_info{
  133345. + u8 scan_op_ch_only; // When this flag is set, the driver should just scan the operation channel
  133346. +#ifndef P2P_OP_CHECK_SOCIAL_CH
  133347. + u8 operation_ch[2]; // Store the operation channel of invitation request frame
  133348. +#else
  133349. + u8 operation_ch[5]; // Store additional channel 1,6,11 for Android 4.2 IOT & Nexus 4
  133350. +#endif //P2P_OP_CHECK_SOCIAL_CH
  133351. +};
  133352. +
  133353. +#ifdef CONFIG_IOCTL_CFG80211
  133354. +struct cfg80211_wifidirect_info{
  133355. + _timer remain_on_ch_timer;
  133356. + u8 restore_channel;
  133357. + struct ieee80211_channel remain_on_ch_channel;
  133358. + enum nl80211_channel_type remain_on_ch_type;
  133359. + u64 remain_on_ch_cookie;
  133360. + bool is_ro_ch;
  133361. +};
  133362. +#endif //CONFIG_IOCTL_CFG80211
  133363. +
  133364. +struct wifidirect_info{
  133365. + _adapter* padapter;
  133366. + _timer find_phase_timer;
  133367. + _timer restore_p2p_state_timer;
  133368. +
  133369. + // Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer.
  133370. + _timer pre_tx_scan_timer;
  133371. + _timer reset_ch_sitesurvey;
  133372. + _timer reset_ch_sitesurvey2; // Just for resetting the scan limit function by using p2p nego
  133373. +#ifdef CONFIG_CONCURRENT_MODE
  133374. + // Used to switch the channel between legacy AP and listen state.
  133375. + _timer ap_p2p_switch_timer;
  133376. +#endif
  133377. + struct tx_provdisc_req_info tx_prov_disc_info;
  133378. + struct rx_provdisc_req_info rx_prov_disc_info;
  133379. + struct tx_invite_req_info invitereq_info;
  133380. + struct profile_info profileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ]; // Store the profile information of persistent group
  133381. + struct tx_invite_resp_info inviteresp_info;
  133382. + struct tx_nego_req_info nego_req_info;
  133383. + struct group_id_info groupid_info; // Store the group id information when doing the group negotiation handshake.
  133384. + struct scan_limit_info rx_invitereq_info; // Used for get the limit scan channel from the Invitation procedure
  133385. + struct scan_limit_info p2p_info; // Used for get the limit scan channel from the P2P negotiation handshake
  133386. +#ifdef CONFIG_WFD
  133387. + struct wifi_display_info *wfd_info;
  133388. +#endif
  133389. + enum P2P_ROLE role;
  133390. + enum P2P_STATE pre_p2p_state;
  133391. + enum P2P_STATE p2p_state;
  133392. + u8 device_addr[ETH_ALEN]; // The device address should be the mac address of this device.
  133393. + u8 interface_addr[ETH_ALEN];
  133394. + u8 social_chan[4];
  133395. + u8 listen_channel;
  133396. + u8 operating_channel;
  133397. + u8 listen_dwell; // This value should be between 1 and 3
  133398. + u8 support_rate[8];
  133399. + u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN];
  133400. + u8 intent; // should only include the intent value.
  133401. + u8 p2p_peer_interface_addr[ ETH_ALEN ];
  133402. + u8 p2p_peer_device_addr[ ETH_ALEN ];
  133403. + u8 peer_intent; // Included the intent value and tie breaker value.
  133404. + u8 device_name[ WPS_MAX_DEVICE_NAME_LEN ]; // Device name for displaying on searching device screen
  133405. + u8 device_name_len;
  133406. + u8 profileindex; // Used to point to the index of profileinfo array
  133407. + u8 peer_operating_ch;
  133408. + u8 find_phase_state_exchange_cnt;
  133409. + u16 device_password_id_for_nego; // The device password ID for group negotation
  133410. + u8 negotiation_dialog_token;
  133411. + u8 nego_ssid[ WLAN_SSID_MAXLEN ]; // SSID information for group negotitation
  133412. + u8 nego_ssidlen;
  133413. + u8 p2p_group_ssid[WLAN_SSID_MAXLEN];
  133414. + u8 p2p_group_ssid_len;
  133415. + u8 persistent_supported; // Flag to know the persistent function should be supported or not.
  133416. + // In the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI.
  133417. + // 0: disable
  133418. + // 1: enable
  133419. + u8 session_available; // Flag to set the WFD session available to enable or disable "by Sigma"
  133420. + // In the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI.
  133421. + // 0: disable
  133422. + // 1: enable
  133423. + u8 wfd_tdls_enable; // Flag to enable or disable the TDLS by WFD Sigma
  133424. + // 0: disable
  133425. + // 1: enable
  133426. + u8 wfd_tdls_weaksec; // Flag to enable or disable the weak security function for TDLS by WFD Sigma
  133427. + // 0: disable
  133428. + // In this case, the driver can't issue the tdsl setup request frame.
  133429. + // 1: enable
  133430. + // In this case, the driver can issue the tdls setup request frame
  133431. + // even the current security is weak security.
  133432. +
  133433. + enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user.
  133434. + u16 supported_wps_cm; // This field describes the WPS config method which this driver supported.
  133435. + // The value should be the combination of config method defined in page104 of WPS v2.0 spec.
  133436. + u8 external_uuid; // UUID flag
  133437. + u8 uuid[16]; // UUID
  133438. + uint channel_list_attr_len; // This field will contain the length of body of P2P Channel List attribute of group negotitation response frame.
  133439. + u8 channel_list_attr[100]; // This field will contain the body of P2P Channel List attribute of group negotitation response frame.
  133440. + // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame.
  133441. + u8 driver_interface; // Indicate DRIVER_WEXT or DRIVER_CFG80211
  133442. +
  133443. +#ifdef CONFIG_CONCURRENT_MODE
  133444. + u16 ext_listen_interval; // The interval to be available with legacy AP (ms)
  133445. + u16 ext_listen_period; // The time period to be available for P2P listen state (ms)
  133446. +#endif
  133447. +#ifdef CONFIG_P2P_PS
  133448. + enum P2P_PS_MODE p2p_ps_mode; // indicate p2p ps mode
  133449. + enum P2P_PS_STATE p2p_ps_state; // indicate p2p ps state
  133450. + u8 noa_index; // Identifies and instance of Notice of Absence timing.
  133451. + u8 ctwindow; // Client traffic window. A period of time in TU after TBTT.
  133452. + u8 opp_ps; // opportunistic power save.
  133453. + u8 noa_num; // number of NoA descriptor in P2P IE.
  133454. + u8 noa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client.
  133455. + u32 noa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client.
  133456. + u32 noa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client.
  133457. + u32 noa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer.
  133458. +#endif // CONFIG_P2P_PS
  133459. +};
  133460. +
  133461. +struct tdls_ss_record{ //signal strength record; recording the tdls sta with lowerest ss
  133462. + u8 macaddr[ETH_ALEN];
  133463. + u8 RxPWDBAll;
  133464. + u8 is_tdls_sta; // _TRUE: direct link sta, _FALSE: else
  133465. +};
  133466. +
  133467. +struct tdls_info{
  133468. + u8 ap_prohibited;
  133469. + uint setup_state;
  133470. + u8 sta_cnt;
  133471. + u8 sta_maximum; // 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else;
  133472. + struct tdls_ss_record ss_record;
  133473. + u8 macid_index; //macid entry that is ready to write
  133474. + u8 clear_cam; //cam entry that is trying to clear, using it in direct link teardown
  133475. + u8 ch_sensing;
  133476. + u8 cur_channel;
  133477. + u8 candidate_ch;
  133478. + u8 collect_pkt_num[MAX_CHANNEL_NUM];
  133479. + _lock cmd_lock;
  133480. + _lock hdl_lock;
  133481. + u8 watchdog_count;
  133482. + u8 dev_discovered; //WFD_TDLS: for sigma test
  133483. + u8 enable;
  133484. +#ifdef CONFIG_WFD
  133485. + struct wifi_display_info *wfd_info;
  133486. +#endif
  133487. +};
  133488. +
  133489. +struct mlme_priv {
  133490. +
  133491. + _lock lock;
  133492. + sint fw_state; //shall we protect this variable? maybe not necessarily...
  133493. +
  133494. + u8 to_join; //flag
  133495. + #ifdef CONFIG_LAYER2_ROAMING
  133496. + u8 to_roaming; // roaming trying times
  133497. + #endif
  133498. +
  133499. + u8 *nic_hdl;
  133500. +
  133501. + u8 not_indic_disco;
  133502. + _list *pscanned;
  133503. + _queue free_bss_pool;
  133504. + _queue scanned_queue;
  133505. + u8 *free_bss_buf;
  133506. + u32 num_of_scanned;
  133507. +
  133508. + NDIS_802_11_SSID assoc_ssid;
  133509. + u8 assoc_bssid[6];
  133510. +
  133511. + struct wlan_network cur_network;
  133512. +
  133513. + //uint wireless_mode; no used, remove it
  133514. +
  133515. + u32 scan_interval;
  133516. +
  133517. + _timer assoc_timer;
  133518. +
  133519. + uint assoc_by_bssid;
  133520. + uint assoc_by_rssi;
  133521. +
  133522. + _timer scan_to_timer; // driver itself handles scan_timeout status.
  133523. + u32 scan_start_time; // used to evaluate the time spent in scanning
  133524. +
  133525. + #ifdef CONFIG_SET_SCAN_DENY_TIMER
  133526. + _timer set_scan_deny_timer;
  133527. + ATOMIC_T set_scan_deny; //0: allowed, 1: deny
  133528. + #endif
  133529. +
  133530. + struct qos_priv qospriv;
  133531. +
  133532. +#ifdef CONFIG_80211N_HT
  133533. +
  133534. + /* Number of non-HT AP/stations */
  133535. + int num_sta_no_ht;
  133536. +
  133537. + /* Number of HT AP/stations 20 MHz */
  133538. + //int num_sta_ht_20mhz;
  133539. +
  133540. +
  133541. + int num_FortyMHzIntolerant;
  133542. +
  133543. + struct ht_priv htpriv;
  133544. +
  133545. +#endif
  133546. +
  133547. + RT_LINK_DETECT_T LinkDetectInfo;
  133548. + _timer dynamic_chk_timer; //dynamic/periodic check timer
  133549. +
  133550. + u8 acm_mask; // for wmm acm mask
  133551. + u8 ChannelPlan;
  133552. + RT_SCAN_TYPE scan_mode; // active: 1, passive: 0
  133553. +
  133554. + //u8 probereq_wpsie[MAX_WPS_IE_LEN];//added in probe req
  133555. + //int probereq_wpsie_len;
  133556. + u8 *wps_probe_req_ie;
  133557. + u32 wps_probe_req_ie_len;
  133558. +
  133559. +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  133560. + /* Number of associated Non-ERP stations (i.e., stations using 802.11b
  133561. + * in 802.11g BSS) */
  133562. + int num_sta_non_erp;
  133563. +
  133564. + /* Number of associated stations that do not support Short Slot Time */
  133565. + int num_sta_no_short_slot_time;
  133566. +
  133567. + /* Number of associated stations that do not support Short Preamble */
  133568. + int num_sta_no_short_preamble;
  133569. +
  133570. + int olbc; /* Overlapping Legacy BSS Condition */
  133571. +
  133572. + /* Number of HT associated stations that do not support greenfield */
  133573. + int num_sta_ht_no_gf;
  133574. +
  133575. + /* Number of associated non-HT stations */
  133576. + //int num_sta_no_ht;
  133577. +
  133578. + /* Number of HT associated stations 20 MHz */
  133579. + int num_sta_ht_20mhz;
  133580. +
  133581. + /* Overlapping BSS information */
  133582. + int olbc_ht;
  133583. +
  133584. +#ifdef CONFIG_80211N_HT
  133585. + u16 ht_op_mode;
  133586. +#endif /* CONFIG_80211N_HT */
  133587. +
  133588. + u8 *assoc_req;
  133589. + u32 assoc_req_len;
  133590. + u8 *assoc_rsp;
  133591. + u32 assoc_rsp_len;
  133592. +
  133593. + u8 *wps_beacon_ie;
  133594. + //u8 *wps_probe_req_ie;
  133595. + u8 *wps_probe_resp_ie;
  133596. + u8 *wps_assoc_resp_ie; // for CONFIG_IOCTL_CFG80211, this IE could include p2p ie / wfd ie
  133597. +
  133598. + u32 wps_beacon_ie_len;
  133599. + //u32 wps_probe_req_ie_len;
  133600. + u32 wps_probe_resp_ie_len;
  133601. + u32 wps_assoc_resp_ie_len; // for CONFIG_IOCTL_CFG80211, this IE len could include p2p ie / wfd ie
  133602. +
  133603. + u8 *p2p_beacon_ie;
  133604. + u8 *p2p_probe_req_ie;
  133605. + u8 *p2p_probe_resp_ie;
  133606. + u8 *p2p_go_probe_resp_ie; //for GO
  133607. + u8 *p2p_assoc_req_ie;
  133608. +
  133609. + u32 p2p_beacon_ie_len;
  133610. + u32 p2p_probe_req_ie_len;
  133611. + u32 p2p_probe_resp_ie_len;
  133612. + u32 p2p_go_probe_resp_ie_len; //for GO
  133613. + u32 p2p_assoc_req_ie_len;
  133614. +/*
  133615. +#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
  133616. + //u8 *wps_p2p_beacon_ie;
  133617. + u8 *p2p_beacon_ie;
  133618. + u8 *wps_p2p_probe_resp_ie;
  133619. + u8 *wps_p2p_assoc_resp_ie;
  133620. + //u32 wps_p2p_beacon_ie_len;
  133621. + u32 p2p_beacon_ie_len;
  133622. + u32 wps_p2p_probe_resp_ie_len;
  133623. + u32 wps_p2p_assoc_resp_ie_len;
  133624. +#endif
  133625. +*/
  133626. +
  133627. + _lock bcn_update_lock;
  133628. + u8 update_bcn;
  133629. +
  133630. +
  133631. +#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
  133632. +
  133633. +#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)
  133634. +
  133635. + u8 *wfd_beacon_ie;
  133636. + u8 *wfd_probe_req_ie;
  133637. + u8 *wfd_probe_resp_ie;
  133638. + u8 *wfd_go_probe_resp_ie; //for GO
  133639. + u8 *wfd_assoc_req_ie;
  133640. +
  133641. + u32 wfd_beacon_ie_len;
  133642. + u32 wfd_probe_req_ie_len;
  133643. + u32 wfd_probe_resp_ie_len;
  133644. + u32 wfd_go_probe_resp_ie_len; //for GO
  133645. + u32 wfd_assoc_req_ie_len;
  133646. +
  133647. +#endif
  133648. +
  133649. +#ifdef RTK_DMP_PLATFORM
  133650. + // DMP kobject_hotplug function signal need in passive level
  133651. + _workitem Linkup_workitem;
  133652. + _workitem Linkdown_workitem;
  133653. +#endif
  133654. +
  133655. +#ifdef CONFIG_INTEL_WIDI
  133656. + int widi_state;
  133657. + int listen_state;
  133658. + _timer listen_timer;
  133659. + ATOMIC_T rx_probe_rsp; // 1:receive probe respone from RDS source.
  133660. + u8 *l2sdTaBuffer;
  133661. + u8 channel_idx;
  133662. + s8 group_cnt; //For WiDi 3.5, they specified another scan algo. for WFD/RDS co-existed
  133663. + u8 sa_ext[L2SDTA_SERVICE_VE_LEN];
  133664. +
  133665. + u8 widi_enable;
  133666. + /**
  133667. + * For WiDi 4; upper layer would set
  133668. + * p2p_primary_device_type_category_id
  133669. + * p2p_primary_device_type_sub_category_id
  133670. + * p2p_secondary_device_type_category_id
  133671. + * p2p_secondary_device_type_sub_category_id
  133672. + */
  133673. + u16 p2p_pdt_cid;
  133674. + u16 p2p_pdt_scid;
  133675. + u8 num_p2p_sdt;
  133676. + u16 p2p_sdt_cid[MAX_NUM_P2P_SDT];
  133677. + u16 p2p_sdt_scid[MAX_NUM_P2P_SDT];
  133678. + u8 p2p_reject_disable; //When starting NL80211 wpa_supplicant/hostapd, it will call netdev_close
  133679. + //such that it will cause p2p disabled. Use this flag to reject.
  133680. +#endif // CONFIG_INTEL_WIDI
  133681. +
  133682. +#ifdef CONFIG_CONCURRENT_MODE
  133683. + u8 scanning_via_buddy_intf;
  133684. +#endif
  133685. +};
  133686. +
  133687. +#ifdef CONFIG_AP_MODE
  133688. +
  133689. +struct hostapd_priv
  133690. +{
  133691. + _adapter *padapter;
  133692. +
  133693. +#ifdef CONFIG_HOSTAPD_MLME
  133694. + struct net_device *pmgnt_netdev;
  133695. + struct usb_anchor anchored;
  133696. +#endif
  133697. +
  133698. +};
  133699. +
  133700. +extern int hostapd_mode_init(_adapter *padapter);
  133701. +extern void hostapd_mode_unload(_adapter *padapter);
  133702. +#endif
  133703. +
  133704. +
  133705. +extern void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf);
  133706. +extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf);
  133707. +extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf);
  133708. +extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf);
  133709. +extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);
  133710. +extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);
  133711. +extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);
  133712. +extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);
  133713. +
  133714. +#ifdef PLATFORM_WINDOWS
  133715. +extern thread_return event_thread(void *context);
  133716. +
  133717. +extern void rtw_join_timeout_handler (
  133718. + IN PVOID SystemSpecific1,
  133719. + IN PVOID FunctionContext,
  133720. + IN PVOID SystemSpecific2,
  133721. + IN PVOID SystemSpecific3
  133722. + );
  133723. +
  133724. +extern void _rtw_scan_timeout_handler (
  133725. + IN PVOID SystemSpecific1,
  133726. + IN PVOID FunctionContext,
  133727. + IN PVOID SystemSpecific2,
  133728. + IN PVOID SystemSpecific3
  133729. + );
  133730. +
  133731. +#endif
  133732. +
  133733. +#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)
  133734. +extern int event_thread(void *context);
  133735. +extern void rtw_join_timeout_handler(void* FunctionContext);
  133736. +extern void _rtw_scan_timeout_handler(void* FunctionContext);
  133737. +#endif
  133738. +
  133739. +extern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall);
  133740. +extern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv);
  133741. +
  133742. +extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv);
  133743. +
  133744. +
  133745. +extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv);
  133746. +extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx);
  133747. +extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv);
  133748. +
  133749. +__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv)
  133750. +{ //if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid
  133751. + // if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address
  133752. + return pmlmepriv->cur_network.network.MacAddress;
  133753. +}
  133754. +
  133755. +__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state)
  133756. +{
  133757. + if (pmlmepriv->fw_state & state)
  133758. + return _TRUE;
  133759. +
  133760. + return _FALSE;
  133761. +}
  133762. +
  133763. +__inline static sint get_fwstate(struct mlme_priv *pmlmepriv)
  133764. +{
  133765. + return pmlmepriv->fw_state;
  133766. +}
  133767. +
  133768. +/*
  133769. + * No Limit on the calling context,
  133770. + * therefore set it to be the critical section...
  133771. + *
  133772. + * ### NOTE:#### (!!!!)
  133773. + * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
  133774. + */
  133775. +__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state)
  133776. +{
  133777. + pmlmepriv->fw_state |= state;
  133778. +}
  133779. +
  133780. +__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state)
  133781. +{
  133782. + pmlmepriv->fw_state &= ~state;
  133783. +}
  133784. +
  133785. +/*
  133786. + * No Limit on the calling context,
  133787. + * therefore set it to be the critical section...
  133788. + */
  133789. +__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state)
  133790. +{
  133791. + _irqL irqL;
  133792. +
  133793. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  133794. + if (check_fwstate(pmlmepriv, state) == _TRUE)
  133795. + pmlmepriv->fw_state ^= state;
  133796. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  133797. +}
  133798. +
  133799. +__inline static void clr_fwstate_ex(struct mlme_priv *pmlmepriv, sint state)
  133800. +{
  133801. + _irqL irqL;
  133802. +
  133803. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  133804. + _clr_fwstate_(pmlmepriv, state);
  133805. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  133806. +}
  133807. +
  133808. +__inline static void up_scanned_network(struct mlme_priv *pmlmepriv)
  133809. +{
  133810. + _irqL irqL;
  133811. +
  133812. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  133813. + pmlmepriv->num_of_scanned++;
  133814. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  133815. +}
  133816. +
  133817. +#ifdef CONFIG_CONCURRENT_MODE
  133818. +sint rtw_buddy_adapter_up(_adapter *padapter);
  133819. +sint check_buddy_fwstate(_adapter *padapter, sint state);
  133820. +#endif //CONFIG_CONCURRENT_MODE
  133821. +
  133822. +__inline static void down_scanned_network(struct mlme_priv *pmlmepriv)
  133823. +{
  133824. + _irqL irqL;
  133825. +
  133826. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  133827. + pmlmepriv->num_of_scanned--;
  133828. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  133829. +}
  133830. +
  133831. +__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val)
  133832. +{
  133833. + _irqL irqL;
  133834. +
  133835. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  133836. + pmlmepriv->num_of_scanned = val;
  133837. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  133838. +}
  133839. +
  133840. +extern u16 rtw_get_capability(WLAN_BSSID_EX *bss);
  133841. +extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target);
  133842. +extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc);
  133843. +extern void rtw_generate_random_ibss(u8 *pibss);
  133844. +extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr);
  133845. +extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue);
  133846. +
  133847. +extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue);
  133848. +extern void rtw_indicate_disconnect(_adapter* adapter);
  133849. +extern void rtw_indicate_connect(_adapter* adapter);
  133850. +void rtw_indicate_scan_done( _adapter *padapter, bool aborted);
  133851. +void rtw_scan_abort(_adapter *adapter);
  133852. +
  133853. +extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len);
  133854. +extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len);
  133855. +extern void rtw_init_registrypriv_dev_network(_adapter *adapter);
  133856. +
  133857. +extern void rtw_update_registrypriv_dev_network(_adapter *adapter);
  133858. +
  133859. +extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter);
  133860. +
  133861. +extern void _rtw_join_timeout_handler(_adapter *adapter);
  133862. +extern void rtw_scan_timeout_handler(_adapter *adapter);
  133863. +
  133864. +extern void rtw_dynamic_check_timer_handlder(_adapter *adapter);
  133865. +#ifdef CONFIG_SET_SCAN_DENY_TIMER
  133866. +bool rtw_is_scan_deny(_adapter *adapter);
  133867. +void rtw_clear_scan_deny(_adapter *adapter);
  133868. +void rtw_set_scan_deny_timer_hdl(_adapter *adapter);
  133869. +void rtw_set_scan_deny(_adapter *adapter, u32 ms);
  133870. +#else
  133871. +#define rtw_is_scan_deny(adapter) _FALSE
  133872. +#define rtw_clear_scan_deny(adapter) do {} while (0)
  133873. +#define rtw_set_scan_deny_timer_hdl(adapter) do {} while (0)
  133874. +#define rtw_set_scan_deny(adapter, ms) do {} while (0)
  133875. +#endif
  133876. +
  133877. +
  133878. +extern int _rtw_init_mlme_priv(_adapter *padapter);
  133879. +
  133880. +void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv);
  133881. +
  133882. +extern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv);
  133883. +
  133884. +extern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork);
  133885. +
  133886. +extern struct wlan_network* _rtw_dequeue_network(_queue *queue);
  133887. +
  133888. +extern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv);
  133889. +
  133890. +
  133891. +extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall);
  133892. +extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork);
  133893. +
  133894. +
  133895. +extern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr);
  133896. +
  133897. +extern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall);
  133898. +
  133899. +extern sint rtw_if_up(_adapter *padapter);
  133900. +
  133901. +
  133902. +u8 *rtw_get_capability_from_ie(u8 *ie);
  133903. +u8 *rtw_get_timestampe_from_ie(u8 *ie);
  133904. +u8 *rtw_get_beacon_interval_from_ie(u8 *ie);
  133905. +
  133906. +
  133907. +void rtw_joinbss_reset(_adapter *padapter);
  133908. +
  133909. +#ifdef CONFIG_80211N_HT
  133910. +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel);
  133911. +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel);
  133912. +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe);
  133913. +#endif
  133914. +
  133915. +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork);
  133916. +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst);
  133917. +
  133918. +#ifdef CONFIG_LAYER2_ROAMING
  133919. +void _rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);
  133920. +void rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);
  133921. +void rtw_set_roaming(_adapter *adapter, u8 to_roaming);
  133922. +u8 rtw_to_roaming(_adapter *adapter);
  133923. +#else
  133924. +#define _rtw_roaming(adapter, tgt_network) do {} while(0)
  133925. +#define rtw_roaming(adapter, tgt_network) do {} while(0)
  133926. +#define rtw_set_roaming(adapter, to_roaming) do {} while(0)
  133927. +#define rtw_to_roaming(adapter) 0
  133928. +#endif
  133929. +
  133930. +
  133931. +#ifdef CONFIG_INTEL_PROXIM
  133932. +void rtw_proxim_enable(_adapter *padapter);
  133933. +void rtw_proxim_disable(_adapter *padapter);
  133934. +void rtw_proxim_send_packet(_adapter *padapter,u8 *pbuf,u16 len,u8 hw_rate);
  133935. +#endif //CONFIG_INTEL_PROXIM
  133936. +#endif //__RTL871X_MLME_H_
  133937. --- /dev/null
  133938. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h
  133939. @@ -0,0 +1,962 @@
  133940. +/******************************************************************************
  133941. + *
  133942. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  133943. + *
  133944. + * This program is free software; you can redistribute it and/or modify it
  133945. + * under the terms of version 2 of the GNU General Public License as
  133946. + * published by the Free Software Foundation.
  133947. + *
  133948. + * This program is distributed in the hope that it will be useful, but WITHOUT
  133949. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  133950. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  133951. + * more details.
  133952. + *
  133953. + * You should have received a copy of the GNU General Public License along with
  133954. + * this program; if not, write to the Free Software Foundation, Inc.,
  133955. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  133956. + *
  133957. + *
  133958. + ******************************************************************************/
  133959. +#ifndef __RTW_MLME_EXT_H_
  133960. +#define __RTW_MLME_EXT_H_
  133961. +
  133962. +#include <drv_conf.h>
  133963. +#include <osdep_service.h>
  133964. +#include <drv_types.h>
  133965. +#include <wlan_bssdef.h>
  133966. +
  133967. +
  133968. +// Commented by Albert 20101105
  133969. +// Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms )
  133970. +// The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request.
  133971. +// So, this driver tried to extend the dwell time for each scanning channel.
  133972. +// This will increase the chance to receive the probe response from SoftAP.
  133973. +
  133974. +#define SURVEY_TO (100)
  133975. +#define REAUTH_TO (300) //(50)
  133976. +#define REASSOC_TO (300) //(50)
  133977. +//#define DISCONNECT_TO (3000)
  133978. +#define ADDBA_TO (2000)
  133979. +
  133980. +#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec
  133981. +
  133982. +#define REAUTH_LIMIT (4)
  133983. +#define REASSOC_LIMIT (4)
  133984. +#define READDBA_LIMIT (2)
  133985. +
  133986. +//#define IOCMD_REG0 0x10250370
  133987. +//#define IOCMD_REG1 0x10250374
  133988. +//#define IOCMD_REG2 0x10250378
  133989. +
  133990. +//#define FW_DYNAMIC_FUN_SWITCH 0x10250364
  133991. +
  133992. +//#define WRITE_BB_CMD 0xF0000001
  133993. +//#define SET_CHANNEL_CMD 0xF3000000
  133994. +//#define UPDATE_RA_CMD 0xFD0000A2
  133995. +
  133996. +#define DYNAMIC_FUNC_DISABLE (0x0)
  133997. +#define DYNAMIC_FUNC_DIG BIT(0)
  133998. +#define DYNAMIC_FUNC_HP BIT(1)
  133999. +#define DYNAMIC_FUNC_SS BIT(2) //Tx Power Tracking
  134000. +#define DYNAMIC_FUNC_BT BIT(3)
  134001. +#define DYNAMIC_FUNC_ANT_DIV BIT(4)
  134002. +#define DYNAMIC_FUNC_ADAPTIVITY BIT(5)
  134003. +
  134004. +#define _HW_STATE_NOLINK_ 0x00
  134005. +#define _HW_STATE_ADHOC_ 0x01
  134006. +#define _HW_STATE_STATION_ 0x02
  134007. +#define _HW_STATE_AP_ 0x03
  134008. +
  134009. +
  134010. +#define _1M_RATE_ 0
  134011. +#define _2M_RATE_ 1
  134012. +#define _5M_RATE_ 2
  134013. +#define _11M_RATE_ 3
  134014. +#define _6M_RATE_ 4
  134015. +#define _9M_RATE_ 5
  134016. +#define _12M_RATE_ 6
  134017. +#define _18M_RATE_ 7
  134018. +#define _24M_RATE_ 8
  134019. +#define _36M_RATE_ 9
  134020. +#define _48M_RATE_ 10
  134021. +#define _54M_RATE_ 11
  134022. +
  134023. +
  134024. +extern unsigned char RTW_WPA_OUI[];
  134025. +extern unsigned char WMM_OUI[];
  134026. +extern unsigned char WPS_OUI[];
  134027. +extern unsigned char WFD_OUI[];
  134028. +extern unsigned char P2P_OUI[];
  134029. +
  134030. +extern unsigned char WMM_INFO_OUI[];
  134031. +extern unsigned char WMM_PARA_OUI[];
  134032. +
  134033. +
  134034. +//
  134035. +// Channel Plan Type.
  134036. +// Note:
  134037. +// We just add new channel plan when the new channel plan is different from any of the following
  134038. +// channel plan.
  134039. +// If you just wnat to customize the acitions(scan period or join actions) about one of the channel plan,
  134040. +// customize them in RT_CHANNEL_INFO in the RT_CHANNEL_LIST.
  134041. +//
  134042. +typedef enum _RT_CHANNEL_DOMAIN
  134043. +{
  134044. + //===== old channel plan mapping =====//
  134045. + RT_CHANNEL_DOMAIN_FCC = 0x00,
  134046. + RT_CHANNEL_DOMAIN_IC = 0x01,
  134047. + RT_CHANNEL_DOMAIN_ETSI = 0x02,
  134048. + RT_CHANNEL_DOMAIN_SPAIN = 0x03,
  134049. + RT_CHANNEL_DOMAIN_FRANCE = 0x04,
  134050. + RT_CHANNEL_DOMAIN_MKK = 0x05,
  134051. + RT_CHANNEL_DOMAIN_MKK1 = 0x06,
  134052. + RT_CHANNEL_DOMAIN_ISRAEL = 0x07,
  134053. + RT_CHANNEL_DOMAIN_TELEC = 0x08,
  134054. + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09,
  134055. + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A,
  134056. + RT_CHANNEL_DOMAIN_TAIWAN = 0x0B,
  134057. + RT_CHANNEL_DOMAIN_CHINA = 0x0C,
  134058. + RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D,
  134059. + RT_CHANNEL_DOMAIN_KOREA = 0x0E,
  134060. + RT_CHANNEL_DOMAIN_TURKEY = 0x0F,
  134061. + RT_CHANNEL_DOMAIN_JAPAN = 0x10,
  134062. + RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11,
  134063. + RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12,
  134064. + RT_CHANNEL_DOMAIN_WORLD_WIDE_5G = 0x13,
  134065. + RT_CHANNEL_DOMAIN_TAIWAN_NO_DFS = 0x14,
  134066. +
  134067. + //===== new channel plan mapping, (2GDOMAIN_5GDOMAIN) =====//
  134068. + RT_CHANNEL_DOMAIN_WORLD_NULL = 0x20,
  134069. + RT_CHANNEL_DOMAIN_ETSI1_NULL = 0x21,
  134070. + RT_CHANNEL_DOMAIN_FCC1_NULL = 0x22,
  134071. + RT_CHANNEL_DOMAIN_MKK1_NULL = 0x23,
  134072. + RT_CHANNEL_DOMAIN_ETSI2_NULL = 0x24,
  134073. + RT_CHANNEL_DOMAIN_FCC1_FCC1 = 0x25,
  134074. + RT_CHANNEL_DOMAIN_WORLD_ETSI1 = 0x26,
  134075. + RT_CHANNEL_DOMAIN_MKK1_MKK1 = 0x27,
  134076. + RT_CHANNEL_DOMAIN_WORLD_KCC1 = 0x28,
  134077. + RT_CHANNEL_DOMAIN_WORLD_FCC2 = 0x29,
  134078. + RT_CHANNEL_DOMAIN_WORLD_FCC3 = 0x30,
  134079. + RT_CHANNEL_DOMAIN_WORLD_FCC4 = 0x31,
  134080. + RT_CHANNEL_DOMAIN_WORLD_FCC5 = 0x32,
  134081. + RT_CHANNEL_DOMAIN_WORLD_FCC6 = 0x33,
  134082. + RT_CHANNEL_DOMAIN_FCC1_FCC7 = 0x34,
  134083. + RT_CHANNEL_DOMAIN_WORLD_ETSI2 = 0x35,
  134084. + RT_CHANNEL_DOMAIN_WORLD_ETSI3 = 0x36,
  134085. + RT_CHANNEL_DOMAIN_MKK1_MKK2 = 0x37,
  134086. + RT_CHANNEL_DOMAIN_MKK1_MKK3 = 0x38,
  134087. + RT_CHANNEL_DOMAIN_FCC1_NCC1 = 0x39,
  134088. + RT_CHANNEL_DOMAIN_FCC1_NCC2 = 0x40,
  134089. +
  134090. + //===== Add new channel plan above this line===============//
  134091. + RT_CHANNEL_DOMAIN_MAX,
  134092. + RT_CHANNEL_DOMAIN_REALTEK_DEFINE = 0x7F,
  134093. +}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN;
  134094. +
  134095. +typedef enum _RT_CHANNEL_DOMAIN_2G
  134096. +{
  134097. + RT_CHANNEL_DOMAIN_2G_WORLD = 0x00, //Worldwird 13
  134098. + RT_CHANNEL_DOMAIN_2G_ETSI1 = 0x01, //Europe
  134099. + RT_CHANNEL_DOMAIN_2G_FCC1 = 0x02, //US
  134100. + RT_CHANNEL_DOMAIN_2G_MKK1 = 0x03, //Japan
  134101. + RT_CHANNEL_DOMAIN_2G_ETSI2 = 0x04, //France
  134102. + RT_CHANNEL_DOMAIN_2G_NULL = 0x05,
  134103. + //===== Add new channel plan above this line===============//
  134104. + RT_CHANNEL_DOMAIN_2G_MAX,
  134105. +}RT_CHANNEL_DOMAIN_2G, *PRT_CHANNEL_DOMAIN_2G;
  134106. +
  134107. +typedef enum _RT_CHANNEL_DOMAIN_5G
  134108. +{
  134109. + RT_CHANNEL_DOMAIN_5G_NULL = 0x00,
  134110. + RT_CHANNEL_DOMAIN_5G_ETSI1 = 0x01, //Europe
  134111. + RT_CHANNEL_DOMAIN_5G_ETSI2 = 0x02, //Australia, New Zealand
  134112. + RT_CHANNEL_DOMAIN_5G_ETSI3 = 0x03, //Russia
  134113. + RT_CHANNEL_DOMAIN_5G_FCC1 = 0x04, //US
  134114. + RT_CHANNEL_DOMAIN_5G_FCC2 = 0x05, //FCC o/w DFS Channels
  134115. + RT_CHANNEL_DOMAIN_5G_FCC3 = 0x06, //India, Mexico
  134116. + RT_CHANNEL_DOMAIN_5G_FCC4 = 0x07, //Venezuela
  134117. + RT_CHANNEL_DOMAIN_5G_FCC5 = 0x08, //China
  134118. + RT_CHANNEL_DOMAIN_5G_FCC6 = 0x09, //Israel
  134119. + RT_CHANNEL_DOMAIN_5G_FCC7_IC1 = 0x0A, //US, Canada
  134120. + RT_CHANNEL_DOMAIN_5G_KCC1 = 0x0B, //Korea
  134121. + RT_CHANNEL_DOMAIN_5G_MKK1 = 0x0C, //Japan
  134122. + RT_CHANNEL_DOMAIN_5G_MKK2 = 0x0D, //Japan (W52, W53)
  134123. + RT_CHANNEL_DOMAIN_5G_MKK3 = 0x0E, //Japan (W56)
  134124. + RT_CHANNEL_DOMAIN_5G_NCC1 = 0x0F, //Taiwan
  134125. + RT_CHANNEL_DOMAIN_5G_NCC2 = 0x10, //Taiwan o/w DFS
  134126. + //===== Add new channel plan above this line===============//
  134127. + //===== Driver Self Defined =====//
  134128. + RT_CHANNEL_DOMAIN_5G_FCC = 0x11,
  134129. + RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS = 0x12,
  134130. + RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS = 0x13,
  134131. + RT_CHANNEL_DOMAIN_5G_MAX,
  134132. +}RT_CHANNEL_DOMAIN_5G, *PRT_CHANNEL_DOMAIN_5G;
  134133. +
  134134. +#define rtw_is_channel_plan_valid(chplan) (chplan<RT_CHANNEL_DOMAIN_MAX || chplan == RT_CHANNEL_DOMAIN_REALTEK_DEFINE)
  134135. +
  134136. +typedef struct _RT_CHANNEL_PLAN
  134137. +{
  134138. + unsigned char Channel[MAX_CHANNEL_NUM];
  134139. + unsigned char Len;
  134140. +}RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN;
  134141. +
  134142. +typedef struct _RT_CHANNEL_PLAN_2G
  134143. +{
  134144. + unsigned char Channel[MAX_CHANNEL_NUM_2G];
  134145. + unsigned char Len;
  134146. +}RT_CHANNEL_PLAN_2G, *PRT_CHANNEL_PLAN_2G;
  134147. +
  134148. +typedef struct _RT_CHANNEL_PLAN_5G
  134149. +{
  134150. + unsigned char Channel[MAX_CHANNEL_NUM_5G];
  134151. + unsigned char Len;
  134152. +}RT_CHANNEL_PLAN_5G, *PRT_CHANNEL_PLAN_5G;
  134153. +
  134154. +typedef struct _RT_CHANNEL_PLAN_MAP
  134155. +{
  134156. + unsigned char Index2G;
  134157. + unsigned char Index5G;
  134158. +}RT_CHANNEL_PLAN_MAP, *PRT_CHANNEL_PLAN_MAP;
  134159. +
  134160. +enum Associated_AP
  134161. +{
  134162. + atherosAP = 0,
  134163. + broadcomAP = 1,
  134164. + ciscoAP = 2,
  134165. + marvellAP = 3,
  134166. + ralinkAP = 4,
  134167. + realtekAP = 5,
  134168. + airgocapAP = 6,
  134169. + unknownAP = 7,
  134170. + maxAP,
  134171. +};
  134172. +
  134173. +enum SCAN_STATE
  134174. +{
  134175. + SCAN_DISABLE = 0,
  134176. + SCAN_START = 1,
  134177. + SCAN_TXNULL = 2,
  134178. + SCAN_PROCESS = 3,
  134179. + SCAN_COMPLETE = 4,
  134180. + SCAN_STATE_MAX,
  134181. +};
  134182. +
  134183. +struct mlme_handler {
  134184. + unsigned int num;
  134185. + char* str;
  134186. + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);
  134187. +};
  134188. +
  134189. +struct action_handler {
  134190. + unsigned int num;
  134191. + char* str;
  134192. + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);
  134193. +};
  134194. +
  134195. +struct ss_res
  134196. +{
  134197. + int state;
  134198. + int bss_cnt;
  134199. + int channel_idx;
  134200. + int scan_mode;
  134201. + u8 ssid_num;
  134202. + u8 ch_num;
  134203. + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
  134204. + struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
  134205. +};
  134206. +
  134207. +//#define AP_MODE 0x0C
  134208. +//#define STATION_MODE 0x08
  134209. +//#define AD_HOC_MODE 0x04
  134210. +//#define NO_LINK_MODE 0x00
  134211. +
  134212. +#define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_
  134213. +#define WIFI_FW_STATION_STATE _HW_STATE_STATION_
  134214. +#define WIFI_FW_AP_STATE _HW_STATE_AP_
  134215. +#define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_
  134216. +
  134217. +#define WIFI_FW_AUTH_NULL 0x00000100
  134218. +#define WIFI_FW_AUTH_STATE 0x00000200
  134219. +#define WIFI_FW_AUTH_SUCCESS 0x00000400
  134220. +
  134221. +#define WIFI_FW_ASSOC_STATE 0x00002000
  134222. +#define WIFI_FW_ASSOC_SUCCESS 0x00004000
  134223. +
  134224. +#define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE)
  134225. +
  134226. +#ifdef CONFIG_TDLS
  134227. +// 1: Write RCR DATA BIT
  134228. +// 2: Issue peer traffic indication
  134229. +// 3: Go back to the channel linked with AP, terminating channel switch procedure
  134230. +// 4: Init channel sensing, receive all data and mgnt frame
  134231. +// 5: Channel sensing and report candidate channel
  134232. +// 6: First time set channel to off channel
  134233. +// 7: Go back tp the channel linked with AP when set base channel as target channel
  134234. +// 8: Set channel back to base channel
  134235. +// 9: Set channel back to off channel
  134236. +// 10: Restore RCR DATA BIT
  134237. +// 11: Check alive
  134238. +// 12: Check alive
  134239. +// 13: Free TDLS sta
  134240. +enum TDLS_option
  134241. +{
  134242. + TDLS_WRCR = 1,
  134243. + TDLS_SD_PTI = 2,
  134244. + TDLS_CS_OFF = 3,
  134245. + TDLS_INIT_CH_SEN = 4,
  134246. + TDLS_DONE_CH_SEN = 5,
  134247. + TDLS_OFF_CH = 6,
  134248. + TDLS_BASE_CH = 7,
  134249. + TDLS_P_OFF_CH = 8,
  134250. + TDLS_P_BASE_CH = 9,
  134251. + TDLS_RS_RCR = 10,
  134252. + TDLS_CKALV_PH1 = 11,
  134253. + TDLS_CKALV_PH2 = 12,
  134254. + TDLS_FREE_STA = 13,
  134255. + maxTDLS,
  134256. +};
  134257. +
  134258. +#endif //CONFIG_TDLS
  134259. +
  134260. +struct FW_Sta_Info
  134261. +{
  134262. + struct sta_info *psta;
  134263. + u32 status;
  134264. + u32 rx_pkt;
  134265. + u32 retry;
  134266. + NDIS_802_11_RATES_EX SupportedRates;
  134267. +};
  134268. +
  134269. +/*
  134270. + * Usage:
  134271. + * When one iface acted as AP mode and the other iface is STA mode and scanning,
  134272. + * it should switch back to AP's operating channel periodically.
  134273. + * Parameters info:
  134274. + * When the driver scanned RTW_SCAN_NUM_OF_CH channels, it would switch back to AP's operating channel for
  134275. + * RTW_STAY_AP_CH_MILLISECOND * SURVEY_TO milliseconds.
  134276. + * Example:
  134277. + * For chip supports 2.4G + 5GHz and AP mode is operating in channel 1,
  134278. + * RTW_SCAN_NUM_OF_CH is 8, RTW_STAY_AP_CH_MILLISECOND is 3 and SURVEY_TO is 100.
  134279. + * When it's STA mode gets set_scan command,
  134280. + * it would
  134281. + * 1. Doing the scan on channel 1.2.3.4.5.6.7.8
  134282. + * 2. Back to channel 1 for 300 milliseconds
  134283. + * 3. Go through doing site survey on channel 9.10.11.36.40.44.48.52
  134284. + * 4. Back to channel 1 for 300 milliseconds
  134285. + * 5. ... and so on, till survey done.
  134286. + */
  134287. +#if defined CONFIG_STA_MODE_SCAN_UNDER_AP_MODE && defined CONFIG_CONCURRENT_MODE
  134288. +#define RTW_SCAN_NUM_OF_CH 8
  134289. +#define RTW_STAY_AP_CH_MILLISECOND 3 // this value is a multiplier,for example, when this value is 3, it would stay AP's op ch for
  134290. + // 3 * SURVEY_TO millisecond.
  134291. +#endif //defined CONFIG_STA_MODE_SCAN_UNDER_AP_MODE && defined CONFIG_CONCURRENT_MODE
  134292. +
  134293. +struct mlme_ext_info
  134294. +{
  134295. + u32 state;
  134296. + u32 reauth_count;
  134297. + u32 reassoc_count;
  134298. + u32 link_count;
  134299. + u32 auth_seq;
  134300. + u32 auth_algo; // 802.11 auth, could be open, shared, auto
  134301. + u32 authModeToggle;
  134302. + u32 enc_algo;//encrypt algorithm;
  134303. + u32 key_index; // this is only valid for legendary wep, 0~3 for key id.
  134304. + u32 iv;
  134305. + u8 chg_txt[128];
  134306. + u16 aid;
  134307. + u16 bcn_interval;
  134308. + u16 capability;
  134309. + u8 assoc_AP_vendor;
  134310. + u8 slotTime;
  134311. + u8 preamble_mode;
  134312. + u8 WMM_enable;
  134313. + u8 ERP_enable;
  134314. + u8 ERP_IE;
  134315. + u8 HT_enable;
  134316. + u8 HT_caps_enable;
  134317. + u8 HT_info_enable;
  134318. + u8 HT_protection;
  134319. + u8 turboMode_cts2self;
  134320. + u8 turboMode_rtsen;
  134321. + u8 SM_PS;
  134322. + u8 agg_enable_bitmap;
  134323. + u8 ADDBA_retry_count;
  134324. + u8 candidate_tid_bitmap;
  134325. + u8 dialogToken;
  134326. + // Accept ADDBA Request
  134327. + BOOLEAN bAcceptAddbaReq;
  134328. + u8 bwmode_updated;
  134329. + u8 hidden_ssid_mode;
  134330. +
  134331. + struct ADDBA_request ADDBA_req;
  134332. + struct WMM_para_element WMM_param;
  134333. + struct HT_caps_element HT_caps;
  134334. + struct HT_info_element HT_info;
  134335. + WLAN_BSSID_EX network;//join network or bss_network, if in ap mode, it is the same to cur_network.network
  134336. + struct FW_Sta_Info FW_sta_info[NUM_STA];
  134337. +
  134338. +#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  134339. + u8 scan_cnt;
  134340. +#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
  134341. +};
  134342. +
  134343. +// The channel information about this channel including joining, scanning, and power constraints.
  134344. +typedef struct _RT_CHANNEL_INFO
  134345. +{
  134346. + u8 ChannelNum; // The channel number.
  134347. + RT_SCAN_TYPE ScanType; // Scan type such as passive or active scan.
  134348. + //u16 ScanPeriod; // Listen time in millisecond in this channel.
  134349. + //s32 MaxTxPwrDbm; // Max allowed tx power.
  134350. + //u32 ExInfo; // Extended Information for this channel.
  134351. +#ifdef CONFIG_FIND_BEST_CHANNEL
  134352. + u32 rx_count;
  134353. +#endif
  134354. +}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO;
  134355. +
  134356. +int rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch);
  134357. +bool rtw_mlme_band_check(_adapter *adapter, const u32 ch);
  134358. +
  134359. +// P2P_MAX_REG_CLASSES - Maximum number of regulatory classes
  134360. +#define P2P_MAX_REG_CLASSES 10
  134361. +
  134362. +// P2P_MAX_REG_CLASS_CHANNELS - Maximum number of channels per regulatory class
  134363. +#define P2P_MAX_REG_CLASS_CHANNELS 20
  134364. +
  134365. +// struct p2p_channels - List of supported channels
  134366. +struct p2p_channels {
  134367. + // struct p2p_reg_class - Supported regulatory class
  134368. + struct p2p_reg_class {
  134369. + // reg_class - Regulatory class (IEEE 802.11-2007, Annex J)
  134370. + u8 reg_class;
  134371. +
  134372. + // channel - Supported channels
  134373. + u8 channel[P2P_MAX_REG_CLASS_CHANNELS];
  134374. +
  134375. + // channels - Number of channel entries in use
  134376. + size_t channels;
  134377. + } reg_class[P2P_MAX_REG_CLASSES];
  134378. +
  134379. + // reg_classes - Number of reg_class entries in use
  134380. + size_t reg_classes;
  134381. +};
  134382. +
  134383. +struct p2p_oper_class_map {
  134384. + enum hw_mode {IEEE80211G,IEEE80211A} mode;
  134385. + u8 op_class;
  134386. + u8 min_chan;
  134387. + u8 max_chan;
  134388. + u8 inc;
  134389. + enum { BW20, BW40PLUS, BW40MINUS } bw;
  134390. +};
  134391. +
  134392. +struct mlme_ext_priv
  134393. +{
  134394. + _adapter *padapter;
  134395. + u8 mlmeext_init;
  134396. + ATOMIC_T event_seq;
  134397. + u16 mgnt_seq;
  134398. +#ifdef CONFIG_IEEE80211W
  134399. + u16 sa_query_seq;
  134400. + u64 mgnt_80211w_IPN;
  134401. + u64 mgnt_80211w_IPN_rx;
  134402. +#endif //CONFIG_IEEE80211W
  134403. + //struct fw_priv fwpriv;
  134404. +
  134405. + unsigned char cur_channel;
  134406. + unsigned char cur_bwmode;
  134407. + unsigned char cur_ch_offset;//PRIME_CHNL_OFFSET
  134408. + unsigned char cur_wireless_mode;
  134409. +
  134410. + unsigned char max_chan_nums;
  134411. + RT_CHANNEL_INFO channel_set[MAX_CHANNEL_NUM];
  134412. + struct p2p_channels channel_list;
  134413. + unsigned char basicrate[NumRates];
  134414. + unsigned char datarate[NumRates];
  134415. +
  134416. + struct ss_res sitesurvey_res;
  134417. + struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info.
  134418. + //for ap mode, network includes ap's cap_info
  134419. + _timer survey_timer;
  134420. + _timer link_timer;
  134421. +#ifdef CONFIG_IEEE80211W
  134422. + _timer sa_query_timer;
  134423. +#endif //CONFIG_IEEE80211W
  134424. + //_timer ADDBA_timer;
  134425. + u16 chan_scan_time;
  134426. +
  134427. + u8 scan_abort;
  134428. + u8 tx_rate; // TXRATE when USERATE is set.
  134429. +
  134430. + u32 retry; //retry for issue probereq
  134431. +
  134432. + u64 TSFValue;
  134433. +
  134434. +#ifdef CONFIG_AP_MODE
  134435. + unsigned char bstart_bss;
  134436. +#endif
  134437. +
  134438. + //recv_decache check for Action_public frame
  134439. + u8 action_public_dialog_token;
  134440. + u16 action_public_rxseq;
  134441. +
  134442. +#ifdef CONFIG_80211D
  134443. + u8 update_channel_plan_by_ap_done;
  134444. +#endif
  134445. +
  134446. +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
  134447. + u8 active_keep_alive_check;
  134448. +#endif
  134449. +
  134450. +};
  134451. +
  134452. +int init_mlme_ext_priv(_adapter* padapter);
  134453. +int init_hw_mlme_ext(_adapter *padapter);
  134454. +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext);
  134455. +extern void init_mlme_ext_timer(_adapter *padapter);
  134456. +extern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta);
  134457. +extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv);
  134458. +struct xmit_frame *alloc_mgtxmitframe_once(struct xmit_priv *pxmitpriv);
  134459. +
  134460. +//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv);
  134461. +
  134462. +unsigned char networktype_to_raid(unsigned char network_type);
  134463. +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);
  134464. +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);
  134465. +void UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS);
  134466. +void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);
  134467. +void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
  134468. +
  134469. +void Save_DM_Func_Flag(_adapter *padapter);
  134470. +void Restore_DM_Func_Flag(_adapter *padapter);
  134471. +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable);
  134472. +
  134473. +//void Set_NETYPE1_MSR(_adapter *padapter, u8 type);
  134474. +//void Set_NETYPE0_MSR(_adapter *padapter, u8 type);
  134475. +void Set_MSR(_adapter *padapter, u8 type);
  134476. +
  134477. +u8 rtw_get_oper_ch(_adapter *adapter);
  134478. +void rtw_set_oper_ch(_adapter *adapter, u8 ch);
  134479. +u8 rtw_get_oper_bw(_adapter *adapter);
  134480. +void rtw_set_oper_bw(_adapter *adapter, u8 bw);
  134481. +u8 rtw_get_oper_choffset(_adapter *adapter);
  134482. +void rtw_set_oper_choffset(_adapter *adapter, u8 offset);
  134483. +u32 rtw_get_on_oper_ch_time(_adapter *adapter);
  134484. +u32 rtw_get_on_cur_ch_time(_adapter *adapter);
  134485. +
  134486. +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode);
  134487. +void SelectChannel(_adapter *padapter, unsigned char channel);
  134488. +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset);
  134489. +
  134490. +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);
  134491. +
  134492. +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
  134493. +void clear_cam_entry(_adapter *padapter, u8 entry);
  134494. +
  134495. +void invalidate_cam_all(_adapter *padapter);
  134496. +void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex);
  134497. +
  134498. +
  134499. +int allocate_fw_sta_entry(_adapter *padapter);
  134500. +void flush_all_cam_entry(_adapter *padapter);
  134501. +
  134502. +BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel);
  134503. +
  134504. +void site_survey(_adapter *padapter);
  134505. +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid);
  134506. +
  134507. +int get_bsstype(unsigned short capability);
  134508. +u8* get_my_bssid(WLAN_BSSID_EX *pnetwork);
  134509. +u16 get_beacon_interval(WLAN_BSSID_EX *bss);
  134510. +
  134511. +int is_client_associated_to_ap(_adapter *padapter);
  134512. +int is_client_associated_to_ibss(_adapter *padapter);
  134513. +int is_IBSS_empty(_adapter *padapter);
  134514. +
  134515. +unsigned char check_assoc_AP(u8 *pframe, uint len);
  134516. +
  134517. +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
  134518. +#ifdef CONFIG_WFD
  134519. +int WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
  134520. +#endif
  134521. +void WMMOnAssocRsp(_adapter *padapter);
  134522. +
  134523. +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
  134524. +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
  134525. +void HTOnAssocRsp(_adapter *padapter);
  134526. +
  134527. +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
  134528. +void VCS_update(_adapter *padapter, struct sta_info *psta);
  134529. +
  134530. +void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);
  134531. +#ifdef CONFIG_DFS
  134532. +void process_csa_ie(_adapter *padapter, u8 *pframe, uint len);
  134533. +#endif //CONFIG_DFS
  134534. +void update_IOT_info(_adapter *padapter);
  134535. +void update_capinfo(PADAPTER Adapter, u16 updateCap);
  134536. +void update_wireless_mode(_adapter * padapter);
  134537. +void update_tx_basic_rate(_adapter *padapter, u8 modulation);
  134538. +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id);
  134539. +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx);
  134540. +
  134541. +//for sta/adhoc mode
  134542. +void update_sta_info(_adapter *padapter, struct sta_info *psta);
  134543. +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz);
  134544. +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz);
  134545. +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps);
  134546. +void Update_RA_Entry(_adapter *padapter, u32 mac_id);
  134547. +void set_sta_rate(_adapter *padapter, struct sta_info *psta);
  134548. +
  134549. +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason);
  134550. +
  134551. +unsigned char get_highest_rate_idx(u32 mask);
  134552. +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps);
  134553. +unsigned int is_ap_in_tkip(_adapter *padapter);
  134554. +
  134555. +
  134556. +void report_join_res(_adapter *padapter, int res);
  134557. +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame);
  134558. +void report_surveydone_event(_adapter *padapter);
  134559. +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason);
  134560. +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);
  134561. +
  134562. +void beacon_timing_control(_adapter *padapter);
  134563. +extern u8 set_tx_beacon_cmd(_adapter*padapter);
  134564. +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame);
  134565. +void update_mgnt_tx_rate(_adapter *padapter, u8 rate);
  134566. +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
  134567. +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe);
  134568. +s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms);
  134569. +s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe);
  134570. +
  134571. +#ifdef CONFIG_P2P
  134572. +void issue_probersp_p2p(_adapter *padapter, unsigned char *da);
  134573. +void issue_p2p_provision_request( _adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr);
  134574. +void issue_p2p_GO_request(_adapter *padapter, u8* raddr);
  134575. +void issue_probereq_p2p(_adapter *padapter, u8 *da);
  134576. +int issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms);
  134577. +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success);
  134578. +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr );
  134579. +#endif //CONFIG_P2P
  134580. +void issue_beacon(_adapter *padapter);
  134581. +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq);
  134582. +void issue_assocreq(_adapter *padapter);
  134583. +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type);
  134584. +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status);
  134585. +void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da);
  134586. +s32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, int try_cnt, int wait_ms);
  134587. +int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
  134588. +int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms);
  134589. +int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason);
  134590. +int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms);
  134591. +void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset);
  134592. +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status);
  134593. +#ifdef CONFIG_IEEE80211W
  134594. +void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid);
  134595. +#endif //CONFIG_IEEE80211W
  134596. +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr);
  134597. +unsigned int send_beacon(_adapter *padapter);
  134598. +
  134599. +void start_clnt_assoc(_adapter *padapter);
  134600. +void start_clnt_auth(_adapter* padapter);
  134601. +void start_clnt_join(_adapter* padapter);
  134602. +void start_create_ibss(_adapter* padapter);
  134603. +
  134604. +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame);
  134605. +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame);
  134606. +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame);
  134607. +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame);
  134608. +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame);
  134609. +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame);
  134610. +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame);
  134611. +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame);
  134612. +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame);
  134613. +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame);
  134614. +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame);
  134615. +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame);
  134616. +
  134617. +unsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame);
  134618. +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame);
  134619. +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame);
  134620. +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame);
  134621. +unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame);
  134622. +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame);
  134623. +#ifdef CONFIG_IEEE80211W
  134624. +unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame);
  134625. +#endif //CONFIG_IEEE80211W
  134626. +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame);
  134627. +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame);
  134628. +
  134629. +
  134630. +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res);
  134631. +void mlmeext_sta_del_event_callback(_adapter *padapter);
  134632. +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta);
  134633. +
  134634. +void linked_status_chk(_adapter *padapter);
  134635. +
  134636. +void survey_timer_hdl (_adapter *padapter);
  134637. +void link_timer_hdl (_adapter *padapter);
  134638. +void addba_timer_hdl(struct sta_info *psta);
  134639. +#ifdef CONFIG_IEEE80211W
  134640. +void sa_query_timer_hdl(_adapter *padapter);
  134641. +#endif //CONFIG_IEEE80211W
  134642. +//void reauth_timer_hdl(_adapter *padapter);
  134643. +//void reassoc_timer_hdl(_adapter *padapter);
  134644. +
  134645. +#define set_survey_timer(mlmeext, ms) \
  134646. + do { \
  134647. + /*DBG_871X("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
  134648. + _set_timer(&(mlmeext)->survey_timer, (ms)); \
  134649. + } while(0)
  134650. +
  134651. +#define set_link_timer(mlmeext, ms) \
  134652. + do { \
  134653. + /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
  134654. + _set_timer(&(mlmeext)->link_timer, (ms)); \
  134655. + } while(0)
  134656. +#ifdef CONFIG_IEEE80211W
  134657. +#define set_sa_query_timer(mlmeext, ms) \
  134658. + do { \
  134659. + DBG_871X("%s set_sa_query_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms)); \
  134660. + _set_timer(&(mlmeext)->sa_query_timer, (ms)); \
  134661. + } while(0)
  134662. +#endif //CONFIG_IEEE80211W
  134663. +extern int cckrates_included(unsigned char *rate, int ratelen);
  134664. +extern int cckratesonly_included(unsigned char *rate, int ratelen);
  134665. +
  134666. +extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr);
  134667. +
  134668. +extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
  134669. +extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext);
  134670. +
  134671. +
  134672. +#ifdef CONFIG_CONCURRENT_MODE
  134673. + sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state);
  134674. +void concurrent_chk_joinbss_done(_adapter *padapter, int join_res);
  134675. +#endif //CONFIG_CONCURRENT_MODE
  134676. +
  134677. +#ifdef CONFIG_DUALMAC_CONCURRENT
  134678. +void dc_SelectChannel(_adapter *padapter, unsigned char channel);
  134679. +void dc_SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset);
  134680. +void dc_set_channel_bwmode_disconnect(_adapter *padapter);
  134681. +u8 dc_handle_join_request(_adapter *padapter);
  134682. +void dc_handle_join_done(_adapter *padapter, u8 join_res);
  134683. +sint dc_check_fwstate(_adapter *padapter, sint fw_state);
  134684. +u8 dc_handle_site_survey(_adapter *padapter);
  134685. +void dc_report_survey_event(_adapter *padapter, union recv_frame *precv_frame);
  134686. +void dc_set_channel_bwmode_survey_done(_adapter *padapter);
  134687. +void dc_set_ap_channel_bandwidth(_adapter *padapter, u8 channel, u8 channel_offset, u8 bwmode);
  134688. +void dc_resume_xmit(_adapter *padapter);
  134689. +u8 dc_check_xmit(_adapter *padapter);
  134690. +#endif
  134691. +
  134692. +int rtw_chk_start_clnt_join(_adapter *padapter);
  134693. +int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset);
  134694. +
  134695. +struct cmd_hdl {
  134696. + uint parmsize;
  134697. + u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf);
  134698. +};
  134699. +
  134700. +
  134701. +u8 read_macreg_hdl(_adapter *padapter, u8 *pbuf);
  134702. +u8 write_macreg_hdl(_adapter *padapter, u8 *pbuf);
  134703. +u8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf);
  134704. +u8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf);
  134705. +u8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf);
  134706. +u8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf);
  134707. +
  134708. +
  134709. +u8 NULL_hdl(_adapter *padapter, u8 *pbuf);
  134710. +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf);
  134711. +u8 disconnect_hdl(_adapter *padapter, u8 *pbuf);
  134712. +u8 createbss_hdl(_adapter *padapter, u8 *pbuf);
  134713. +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf);
  134714. +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf);
  134715. +u8 setauth_hdl(_adapter *padapter, u8 *pbuf);
  134716. +u8 setkey_hdl(_adapter *padapter, u8 *pbuf);
  134717. +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf);
  134718. +u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf);
  134719. +u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf);
  134720. +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf);
  134721. +
  134722. +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf);
  134723. +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf);
  134724. +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf);
  134725. +u8 set_ch_hdl(_adapter *padapter, u8 *pbuf);
  134726. +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);
  134727. +u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf);
  134728. +u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf); //Kurt: Handling DFS channel switch announcement ie.
  134729. +u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf);
  134730. +
  134731. +
  134732. +#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl},
  134733. +#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd},
  134734. +
  134735. +#ifdef _RTW_CMD_C_
  134736. +
  134737. +struct cmd_hdl wlancmds[] =
  134738. +{
  134739. + GEN_DRV_CMD_HANDLER(0, NULL) /*0*/
  134740. + GEN_DRV_CMD_HANDLER(0, NULL)
  134741. + GEN_DRV_CMD_HANDLER(0, NULL)
  134742. + GEN_DRV_CMD_HANDLER(0, NULL)
  134743. + GEN_DRV_CMD_HANDLER(0, NULL)
  134744. + GEN_DRV_CMD_HANDLER(0, NULL)
  134745. + GEN_MLME_EXT_HANDLER(0, NULL)
  134746. + GEN_MLME_EXT_HANDLER(0, NULL)
  134747. + GEN_MLME_EXT_HANDLER(0, NULL)
  134748. + GEN_MLME_EXT_HANDLER(0, NULL)
  134749. + GEN_MLME_EXT_HANDLER(0, NULL) /*10*/
  134750. + GEN_MLME_EXT_HANDLER(0, NULL)
  134751. + GEN_MLME_EXT_HANDLER(0, NULL)
  134752. + GEN_MLME_EXT_HANDLER(0, NULL)
  134753. + GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/
  134754. + GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl)
  134755. + GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl)
  134756. + GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl)
  134757. + GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/
  134758. + GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl)
  134759. + GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/
  134760. + GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl)
  134761. + GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL)
  134762. + GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL)
  134763. + GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL)
  134764. + GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL)
  134765. + GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL)
  134766. + GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL)
  134767. + GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL)
  134768. + GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL)
  134769. + GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/
  134770. + GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL)
  134771. + GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL)
  134772. + GEN_MLME_EXT_HANDLER(0, NULL)
  134773. + GEN_MLME_EXT_HANDLER(0, NULL)
  134774. + GEN_MLME_EXT_HANDLER(0, NULL)
  134775. + GEN_MLME_EXT_HANDLER(0, NULL)
  134776. + GEN_MLME_EXT_HANDLER(0, NULL)
  134777. + GEN_MLME_EXT_HANDLER(0, NULL)
  134778. + GEN_MLME_EXT_HANDLER(0, NULL)
  134779. + GEN_MLME_EXT_HANDLER(0, NULL) /*40*/
  134780. + GEN_MLME_EXT_HANDLER(0, NULL)
  134781. + GEN_MLME_EXT_HANDLER(0, NULL)
  134782. + GEN_MLME_EXT_HANDLER(0, NULL)
  134783. + GEN_MLME_EXT_HANDLER(0, NULL)
  134784. + GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl)
  134785. + GEN_MLME_EXT_HANDLER(sizeof(struct set_ch_parm), set_ch_hdl) /* 46 */
  134786. + GEN_MLME_EXT_HANDLER(0, NULL)
  134787. + GEN_MLME_EXT_HANDLER(0, NULL)
  134788. + GEN_MLME_EXT_HANDLER(0, NULL)
  134789. + GEN_MLME_EXT_HANDLER(0, NULL) /*50*/
  134790. + GEN_MLME_EXT_HANDLER(0, NULL)
  134791. + GEN_MLME_EXT_HANDLER(0, NULL)
  134792. + GEN_MLME_EXT_HANDLER(0, NULL)
  134793. + GEN_MLME_EXT_HANDLER(0, NULL)
  134794. + GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/
  134795. +
  134796. + GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/
  134797. + GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/
  134798. +
  134799. + GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/
  134800. + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/
  134801. + GEN_MLME_EXT_HANDLER(sizeof(struct LedBlink_param), led_blink_hdl) /*60*/
  134802. + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/
  134803. + GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/
  134804. +};
  134805. +
  134806. +#endif
  134807. +
  134808. +struct C2HEvent_Header
  134809. +{
  134810. +
  134811. +#ifdef CONFIG_LITTLE_ENDIAN
  134812. +
  134813. + unsigned int len:16;
  134814. + unsigned int ID:8;
  134815. + unsigned int seq:8;
  134816. +
  134817. +#elif defined(CONFIG_BIG_ENDIAN)
  134818. +
  134819. + unsigned int seq:8;
  134820. + unsigned int ID:8;
  134821. + unsigned int len:16;
  134822. +
  134823. +#else
  134824. +
  134825. +# error "Must be LITTLE or BIG Endian"
  134826. +
  134827. +#endif
  134828. +
  134829. + unsigned int rsvd;
  134830. +
  134831. +};
  134832. +
  134833. +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf);
  134834. +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf);
  134835. +
  134836. +enum rtw_c2h_event
  134837. +{
  134838. + GEN_EVT_CODE(_Read_MACREG)=0, /*0*/
  134839. + GEN_EVT_CODE(_Read_BBREG),
  134840. + GEN_EVT_CODE(_Read_RFREG),
  134841. + GEN_EVT_CODE(_Read_EEPROM),
  134842. + GEN_EVT_CODE(_Read_EFUSE),
  134843. + GEN_EVT_CODE(_Read_CAM), /*5*/
  134844. + GEN_EVT_CODE(_Get_BasicRate),
  134845. + GEN_EVT_CODE(_Get_DataRate),
  134846. + GEN_EVT_CODE(_Survey), /*8*/
  134847. + GEN_EVT_CODE(_SurveyDone), /*9*/
  134848. +
  134849. + GEN_EVT_CODE(_JoinBss) , /*10*/
  134850. + GEN_EVT_CODE(_AddSTA),
  134851. + GEN_EVT_CODE(_DelSTA),
  134852. + GEN_EVT_CODE(_AtimDone) ,
  134853. + GEN_EVT_CODE(_TX_Report),
  134854. + GEN_EVT_CODE(_CCX_Report), /*15*/
  134855. + GEN_EVT_CODE(_DTM_Report),
  134856. + GEN_EVT_CODE(_TX_Rate_Statistics),
  134857. + GEN_EVT_CODE(_C2HLBK),
  134858. + GEN_EVT_CODE(_FWDBG),
  134859. + GEN_EVT_CODE(_C2HFEEDBACK), /*20*/
  134860. + GEN_EVT_CODE(_ADDBA),
  134861. + GEN_EVT_CODE(_C2HBCN),
  134862. + GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB
  134863. + GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM
  134864. + MAX_C2HEVT
  134865. +};
  134866. +
  134867. +
  134868. +#ifdef _RTW_MLME_EXT_C_
  134869. +
  134870. +static struct fwevent wlanevents[] =
  134871. +{
  134872. + {0, rtw_dummy_event_callback}, /*0*/
  134873. + {0, NULL},
  134874. + {0, NULL},
  134875. + {0, NULL},
  134876. + {0, NULL},
  134877. + {0, NULL},
  134878. + {0, NULL},
  134879. + {0, NULL},
  134880. + {0, &rtw_survey_event_callback}, /*8*/
  134881. + {sizeof (struct surveydone_event), &rtw_surveydone_event_callback}, /*9*/
  134882. +
  134883. + {0, &rtw_joinbss_event_callback}, /*10*/
  134884. + {sizeof(struct stassoc_event), &rtw_stassoc_event_callback},
  134885. + {sizeof(struct stadel_event), &rtw_stadel_event_callback},
  134886. + {0, &rtw_atimdone_event_callback},
  134887. + {0, rtw_dummy_event_callback},
  134888. + {0, NULL}, /*15*/
  134889. + {0, NULL},
  134890. + {0, NULL},
  134891. + {0, NULL},
  134892. + {0, rtw_fwdbg_event_callback},
  134893. + {0, NULL}, /*20*/
  134894. + {0, NULL},
  134895. + {0, NULL},
  134896. + {0, &rtw_cpwm_event_callback},
  134897. +};
  134898. +
  134899. +#endif//_RTL8192C_CMD_C_
  134900. +
  134901. +#endif
  134902. --- /dev/null
  134903. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_mp.h
  134904. @@ -0,0 +1,711 @@
  134905. +/******************************************************************************
  134906. + *
  134907. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  134908. + *
  134909. + * This program is free software; you can redistribute it and/or modify it
  134910. + * under the terms of version 2 of the GNU General Public License as
  134911. + * published by the Free Software Foundation.
  134912. + *
  134913. + * This program is distributed in the hope that it will be useful, but WITHOUT
  134914. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  134915. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  134916. + * more details.
  134917. + *
  134918. + * You should have received a copy of the GNU General Public License along with
  134919. + * this program; if not, write to the Free Software Foundation, Inc.,
  134920. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  134921. + *
  134922. + *
  134923. + ******************************************************************************/
  134924. +#ifndef _RTW_MP_H_
  134925. +#define _RTW_MP_H_
  134926. +
  134927. +#ifndef PLATFORM_WINDOWS
  134928. +// 00 - Success
  134929. +// 11 - Error
  134930. +#define STATUS_SUCCESS (0x00000000L)
  134931. +#define STATUS_PENDING (0x00000103L)
  134932. +
  134933. +#define STATUS_UNSUCCESSFUL (0xC0000001L)
  134934. +#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL)
  134935. +#define STATUS_NOT_SUPPORTED (0xC00000BBL)
  134936. +
  134937. +#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS)
  134938. +#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING)
  134939. +#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L)
  134940. +#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L)
  134941. +#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L)
  134942. +#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L)
  134943. +
  134944. +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL)
  134945. +#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
  134946. +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L)
  134947. +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L)
  134948. +#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L)
  134949. +#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L)
  134950. +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L)
  134951. +#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L)
  134952. +#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L)
  134953. +#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL)
  134954. +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL)
  134955. +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL)
  134956. +#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL)
  134957. +#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL)
  134958. +#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED)
  134959. +#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL)
  134960. +#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L)
  134961. +#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L)
  134962. +#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L)
  134963. +#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L)
  134964. +#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L)
  134965. +#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L)
  134966. +#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
  134967. +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L)
  134968. +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L)
  134969. +#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L)
  134970. +#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL)
  134971. +#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL)
  134972. +#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL)
  134973. +#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL)
  134974. +#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL)
  134975. +#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL)
  134976. +
  134977. +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L)
  134978. +#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L)
  134979. +#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L)
  134980. +#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L)
  134981. +#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27
  134982. +#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45
  134983. +#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37
  134984. +#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49
  134985. +#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93
  134986. +#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3
  134987. +#endif /* #ifndef PLATFORM_WINDOWS */
  134988. +
  134989. +#if 0
  134990. +#define MPT_NOOP 0
  134991. +#define MPT_READ_MAC_1BYTE 1
  134992. +#define MPT_READ_MAC_2BYTE 2
  134993. +#define MPT_READ_MAC_4BYTE 3
  134994. +#define MPT_WRITE_MAC_1BYTE 4
  134995. +#define MPT_WRITE_MAC_2BYTE 5
  134996. +#define MPT_WRITE_MAC_4BYTE 6
  134997. +#define MPT_READ_BB_CCK 7
  134998. +#define MPT_WRITE_BB_CCK 8
  134999. +#define MPT_READ_BB_OFDM 9
  135000. +#define MPT_WRITE_BB_OFDM 10
  135001. +#define MPT_READ_RF 11
  135002. +#define MPT_WRITE_RF 12
  135003. +#define MPT_READ_EEPROM_1BYTE 13
  135004. +#define MPT_WRITE_EEPROM_1BYTE 14
  135005. +#define MPT_READ_EEPROM_2BYTE 15
  135006. +#define MPT_WRITE_EEPROM_2BYTE 16
  135007. +#define MPT_SET_CSTHRESHOLD 21
  135008. +#define MPT_SET_INITGAIN 22
  135009. +#define MPT_SWITCH_BAND 23
  135010. +#define MPT_SWITCH_CHANNEL 24
  135011. +#define MPT_SET_DATARATE 25
  135012. +#define MPT_SWITCH_ANTENNA 26
  135013. +#define MPT_SET_TX_POWER 27
  135014. +#define MPT_SET_CONT_TX 28
  135015. +#define MPT_SET_SINGLE_CARRIER 29
  135016. +#define MPT_SET_CARRIER_SUPPRESSION 30
  135017. +#define MPT_GET_RATE_TABLE 31
  135018. +#define MPT_READ_TSSI 32
  135019. +#define MPT_GET_THERMAL_METER 33
  135020. +#endif
  135021. +
  135022. +#define MAX_MP_XMITBUF_SZ 2048
  135023. +#define NR_MP_XMITFRAME 8
  135024. +
  135025. +struct mp_xmit_frame
  135026. +{
  135027. + _list list;
  135028. +
  135029. + struct pkt_attrib attrib;
  135030. +
  135031. + _pkt *pkt;
  135032. +
  135033. + int frame_tag;
  135034. +
  135035. + _adapter *padapter;
  135036. +
  135037. +#ifdef CONFIG_USB_HCI
  135038. +
  135039. + //insert urb, irp, and irpcnt info below...
  135040. + //max frag_cnt = 8
  135041. +
  135042. + u8 *mem_addr;
  135043. + u32 sz[8];
  135044. +
  135045. +#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX)
  135046. + PURB pxmit_urb[8];
  135047. +#endif
  135048. +
  135049. +#ifdef PLATFORM_OS_XP
  135050. + PIRP pxmit_irp[8];
  135051. +#endif
  135052. +
  135053. + u8 bpending[8];
  135054. + sint ac_tag[8];
  135055. + sint last[8];
  135056. + uint irpcnt;
  135057. + uint fragcnt;
  135058. +#endif /* CONFIG_USB_HCI */
  135059. +
  135060. + uint mem[(MAX_MP_XMITBUF_SZ >> 2)];
  135061. +};
  135062. +
  135063. +struct mp_wiparam
  135064. +{
  135065. + u32 bcompleted;
  135066. + u32 act_type;
  135067. + u32 io_offset;
  135068. + u32 io_value;
  135069. +};
  135070. +
  135071. +typedef void(*wi_act_func)(void* padapter);
  135072. +
  135073. +#ifdef PLATFORM_WINDOWS
  135074. +struct mp_wi_cntx
  135075. +{
  135076. + u8 bmpdrv_unload;
  135077. +
  135078. + // Work Item
  135079. + NDIS_WORK_ITEM mp_wi;
  135080. + NDIS_EVENT mp_wi_evt;
  135081. + _lock mp_wi_lock;
  135082. + u8 bmp_wi_progress;
  135083. + wi_act_func curractfunc;
  135084. + // Variable needed in each implementation of CurrActFunc.
  135085. + struct mp_wiparam param;
  135086. +};
  135087. +#endif
  135088. +
  135089. +struct mp_tx
  135090. +{
  135091. + u8 stop;
  135092. + u32 count, sended;
  135093. + u8 payload;
  135094. + struct pkt_attrib attrib;
  135095. + struct tx_desc desc;
  135096. + u8 *pallocated_buf;
  135097. + u8 *buf;
  135098. + u32 buf_size, write_size;
  135099. + _thread_hdl_ PktTxThread;
  135100. +};
  135101. +
  135102. +//#if (MP_DRIVER == 1)
  135103. +#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) || defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8188E)
  135104. +#ifdef CONFIG_RTL8192C
  135105. +#include <Hal8192CPhyCfg.h>
  135106. +#endif
  135107. +#ifdef CONFIG_RTL8192D
  135108. +#include <Hal8192DPhyCfg.h>
  135109. +#endif
  135110. +#ifdef CONFIG_RTL8723A
  135111. +#include <Hal8723APhyCfg.h>
  135112. +#endif
  135113. +#ifdef CONFIG_RTL8188E
  135114. +#include <rtl8188e_hal.h>
  135115. +#endif
  135116. +#define MP_MAX_LINES 1000
  135117. +#define MP_MAX_LINES_BYTES 256
  135118. +#define u1Byte u8
  135119. +#define s1Byte s8
  135120. +#define u4Byte u32
  135121. +#define s4Byte s32
  135122. +typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter);
  135123. +typedef struct _MPT_CONTEXT
  135124. +{
  135125. + // Indicate if we have started Mass Production Test.
  135126. + BOOLEAN bMassProdTest;
  135127. +
  135128. + // Indicate if the driver is unloading or unloaded.
  135129. + BOOLEAN bMptDrvUnload;
  135130. +
  135131. + /* 8190 PCI does not support NDIS_WORK_ITEM. */
  135132. + // Work Item for Mass Production Test.
  135133. + //NDIS_WORK_ITEM MptWorkItem;
  135134. +// RT_WORK_ITEM MptWorkItem;
  135135. + // Event used to sync the case unloading driver and MptWorkItem is still in progress.
  135136. +// NDIS_EVENT MptWorkItemEvent;
  135137. + // To protect the following variables.
  135138. +// NDIS_SPIN_LOCK MptWorkItemSpinLock;
  135139. + // Indicate a MptWorkItem is scheduled and not yet finished.
  135140. + BOOLEAN bMptWorkItemInProgress;
  135141. + // An instance which implements function and context of MptWorkItem.
  135142. + MPT_WORK_ITEM_HANDLER CurrMptAct;
  135143. +
  135144. + // 1=Start, 0=Stop from UI.
  135145. + ULONG MptTestStart;
  135146. + // _TEST_MODE, defined in MPT_Req2.h
  135147. + ULONG MptTestItem;
  135148. + // Variable needed in each implementation of CurrMptAct.
  135149. + ULONG MptActType; // Type of action performed in CurrMptAct.
  135150. + // The Offset of IO operation is depend of MptActType.
  135151. + ULONG MptIoOffset;
  135152. + // The Value of IO operation is depend of MptActType.
  135153. + ULONG MptIoValue;
  135154. + // The RfPath of IO operation is depend of MptActType.
  135155. + ULONG MptRfPath;
  135156. +
  135157. + WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch.
  135158. + u8 MptChannelToSw; // Channel to switch.
  135159. + u8 MptInitGainToSet; // Initial gain to set.
  135160. + //ULONG bMptAntennaA; // TRUE if we want to use antenna A.
  135161. + ULONG MptBandWidth; // bandwidth to switch.
  135162. + ULONG MptRateIndex; // rate index.
  135163. + // Register value kept for Single Carrier Tx test.
  135164. + u8 btMpCckTxPower;
  135165. + // Register value kept for Single Carrier Tx test.
  135166. + u8 btMpOfdmTxPower;
  135167. + // For MP Tx Power index
  135168. + u8 TxPwrLevel[2]; // rf-A, rf-B
  135169. +
  135170. + // Content of RCR Regsiter for Mass Production Test.
  135171. + ULONG MptRCR;
  135172. + // TRUE if we only receive packets with specific pattern.
  135173. + BOOLEAN bMptFilterPattern;
  135174. + // Rx OK count, statistics used in Mass Production Test.
  135175. + ULONG MptRxOkCnt;
  135176. + // Rx CRC32 error count, statistics used in Mass Production Test.
  135177. + ULONG MptRxCrcErrCnt;
  135178. +
  135179. + BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test.
  135180. + BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test.
  135181. + BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test.
  135182. + // TRUE if we are in Single Carrier Tx test.
  135183. + BOOLEAN bSingleCarrier;
  135184. + // TRUE if we are in Carrier Suppression Tx Test.
  135185. + BOOLEAN bCarrierSuppression;
  135186. + //TRUE if we are in Single Tone Tx test.
  135187. + BOOLEAN bSingleTone;
  135188. +
  135189. + // ACK counter asked by K.Y..
  135190. + BOOLEAN bMptEnableAckCounter;
  135191. + ULONG MptAckCounter;
  135192. +
  135193. + // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~!
  135194. + //s1Byte BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT];
  135195. + //s1Byte BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES];
  135196. + //s4Byte RfReadLine[2];
  135197. +
  135198. + u8 APK_bound[2]; //for APK path A/path B
  135199. + BOOLEAN bMptIndexEven;
  135200. +
  135201. + u8 backup0xc50;
  135202. + u8 backup0xc58;
  135203. + u8 backup0xc30;
  135204. +}MPT_CONTEXT, *PMPT_CONTEXT;
  135205. +#endif
  135206. +//#endif
  135207. +
  135208. +/* E-Fuse */
  135209. +#ifdef CONFIG_RTL8192D
  135210. +#define EFUSE_MAP_SIZE 255
  135211. +#endif
  135212. +#ifdef CONFIG_RTL8192C
  135213. +#define EFUSE_MAP_SIZE 128
  135214. +#endif
  135215. +#ifdef CONFIG_RTL8723A
  135216. +#define EFUSE_MAP_SIZE 256
  135217. +#endif
  135218. +#ifdef CONFIG_RTL8188E
  135219. +#define EFUSE_MAP_SIZE 256
  135220. +#endif
  135221. +#define EFUSE_MAX_SIZE 512
  135222. +
  135223. +/* end of E-Fuse */
  135224. +
  135225. +//#define RTPRIV_IOCTL_MP ( SIOCIWFIRSTPRIV + 0x17)
  135226. +enum {
  135227. + WRITE_REG = 1,
  135228. + READ_REG,
  135229. + WRITE_RF,
  135230. + READ_RF,
  135231. + MP_START,
  135232. + MP_STOP,
  135233. + MP_RATE,
  135234. + MP_CHANNEL,
  135235. + MP_BANDWIDTH,
  135236. + MP_TXPOWER,
  135237. + MP_ANT_TX,
  135238. + MP_ANT_RX,
  135239. + MP_CTX,
  135240. + MP_QUERY,
  135241. + MP_ARX,
  135242. + MP_PSD,
  135243. + MP_PWRTRK,
  135244. + MP_THER,
  135245. + MP_IOCTL,
  135246. + EFUSE_GET,
  135247. + EFUSE_SET,
  135248. + MP_RESET_STATS,
  135249. + MP_DUMP,
  135250. + MP_PHYPARA,
  135251. + MP_NULL,
  135252. +};
  135253. +
  135254. +struct mp_priv
  135255. +{
  135256. + _adapter *papdater;
  135257. +
  135258. + //Testing Flag
  135259. + u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD)
  135260. +
  135261. + u32 prev_fw_state;
  135262. +
  135263. + //OID cmd handler
  135264. + struct mp_wiparam workparam;
  135265. +// u8 act_in_progress;
  135266. +
  135267. + //Tx Section
  135268. + u8 TID;
  135269. + u32 tx_pktcount;
  135270. + struct mp_tx tx;
  135271. +
  135272. + //Rx Section
  135273. + u32 rx_pktcount;
  135274. + u32 rx_crcerrpktcount;
  135275. + u32 rx_pktloss;
  135276. +
  135277. + struct recv_stat rxstat;
  135278. +
  135279. + //RF/BB relative
  135280. + u8 channel;
  135281. + u8 bandwidth;
  135282. + u8 prime_channel_offset;
  135283. + u8 txpoweridx;
  135284. + u8 txpoweridx_b;
  135285. + u8 rateidx;
  135286. + u32 preamble;
  135287. +// u8 modem;
  135288. + u32 CrystalCap;
  135289. +// u32 curr_crystalcap;
  135290. +
  135291. + u16 antenna_tx;
  135292. + u16 antenna_rx;
  135293. +// u8 curr_rfpath;
  135294. +
  135295. + u8 check_mp_pkt;
  135296. +
  135297. +// uint ForcedDataRate;
  135298. +
  135299. + struct wlan_network mp_network;
  135300. + NDIS_802_11_MAC_ADDRESS network_macaddr;
  135301. +
  135302. +#ifdef PLATFORM_WINDOWS
  135303. + u32 rx_testcnt;
  135304. + u32 rx_testcnt1;
  135305. + u32 rx_testcnt2;
  135306. + u32 tx_testcnt;
  135307. + u32 tx_testcnt1;
  135308. +
  135309. + struct mp_wi_cntx wi_cntx;
  135310. +
  135311. + u8 h2c_result;
  135312. + u8 h2c_seqnum;
  135313. + u16 h2c_cmdcode;
  135314. + u8 h2c_resp_parambuf[512];
  135315. + _lock h2c_lock;
  135316. + _lock wkitm_lock;
  135317. + u32 h2c_cmdcnt;
  135318. + NDIS_EVENT h2c_cmd_evt;
  135319. + NDIS_EVENT c2h_set;
  135320. + NDIS_EVENT h2c_clr;
  135321. + NDIS_EVENT cpwm_int;
  135322. +
  135323. + NDIS_EVENT scsir_full_evt;
  135324. + NDIS_EVENT scsiw_empty_evt;
  135325. +#endif
  135326. +
  135327. + u8 *pallocated_mp_xmitframe_buf;
  135328. + u8 *pmp_xmtframe_buf;
  135329. + _queue free_mp_xmitqueue;
  135330. + u32 free_mp_xmitframe_cnt;
  135331. +
  135332. + MPT_CONTEXT MptCtx;
  135333. +};
  135334. +
  135335. +typedef struct _IOCMD_STRUCT_ {
  135336. + u8 cmdclass;
  135337. + u16 value;
  135338. + u8 index;
  135339. +}IOCMD_STRUCT;
  135340. +
  135341. +struct rf_reg_param {
  135342. + u32 path;
  135343. + u32 offset;
  135344. + u32 value;
  135345. +};
  135346. +
  135347. +struct bb_reg_param {
  135348. + u32 offset;
  135349. + u32 value;
  135350. +};
  135351. +//=======================================================================
  135352. +
  135353. +#define LOWER _TRUE
  135354. +#define RAISE _FALSE
  135355. +
  135356. +/* Hardware Registers */
  135357. +#if 0
  135358. +#if 0
  135359. +#define IOCMD_CTRL_REG 0x102502C0
  135360. +#define IOCMD_DATA_REG 0x102502C4
  135361. +#else
  135362. +#define IOCMD_CTRL_REG 0x10250370
  135363. +#define IOCMD_DATA_REG 0x10250374
  135364. +#endif
  135365. +
  135366. +#define IOCMD_GET_THERMAL_METER 0xFD000028
  135367. +
  135368. +#define IOCMD_CLASS_BB_RF 0xF0
  135369. +#define IOCMD_BB_READ_IDX 0x00
  135370. +#define IOCMD_BB_WRITE_IDX 0x01
  135371. +#define IOCMD_RF_READ_IDX 0x02
  135372. +#define IOCMD_RF_WRIT_IDX 0x03
  135373. +#endif
  135374. +#define BB_REG_BASE_ADDR 0x800
  135375. +
  135376. +/* MP variables */
  135377. +#if 0
  135378. +#define _2MAC_MODE_ 0
  135379. +#define _LOOPBOOK_MODE_ 1
  135380. +#endif
  135381. +typedef enum _MP_MODE_ {
  135382. + MP_OFF,
  135383. + MP_ON,
  135384. + MP_ERR,
  135385. + MP_CONTINUOUS_TX,
  135386. + MP_SINGLE_CARRIER_TX,
  135387. + MP_CARRIER_SUPPRISSION_TX,
  135388. + MP_SINGLE_TONE_TX,
  135389. + MP_PACKET_TX,
  135390. + MP_PACKET_RX
  135391. +} MP_MODE;
  135392. +
  135393. +#ifdef CONFIG_RTL8192C
  135394. +#define RF_PATH_A RF_PATH_A
  135395. +#define RF_PATH_B RF_PATH_B
  135396. +#define RF_PATH_C RF_PATH_C
  135397. +#define RF_PATH_D RF_PATH_D
  135398. +
  135399. +#define MAX_RF_PATH_NUMS RF_PATH_MAX
  135400. +#else
  135401. +#define RF_PATH_A 0
  135402. +#define RF_PATH_B 1
  135403. +#define RF_PATH_C 2
  135404. +#define RF_PATH_D 3
  135405. +
  135406. +#define MAX_RF_PATH_NUMS 2
  135407. +#endif
  135408. +
  135409. +extern u8 mpdatarate[NumRates];
  135410. +
  135411. +/* MP set force data rate base on the definition. */
  135412. +typedef enum _MPT_RATE_INDEX
  135413. +{
  135414. + /* CCK rate. */
  135415. + MPT_RATE_1M, /* 0 */
  135416. + MPT_RATE_2M,
  135417. + MPT_RATE_55M,
  135418. + MPT_RATE_11M, /* 3 */
  135419. +
  135420. + /* OFDM rate. */
  135421. + MPT_RATE_6M, /* 4 */
  135422. + MPT_RATE_9M,
  135423. + MPT_RATE_12M,
  135424. + MPT_RATE_18M,
  135425. + MPT_RATE_24M,
  135426. + MPT_RATE_36M,
  135427. + MPT_RATE_48M,
  135428. + MPT_RATE_54M, /* 11 */
  135429. +
  135430. + /* HT rate. */
  135431. + MPT_RATE_MCS0, /* 12 */
  135432. + MPT_RATE_MCS1,
  135433. + MPT_RATE_MCS2,
  135434. + MPT_RATE_MCS3,
  135435. + MPT_RATE_MCS4,
  135436. + MPT_RATE_MCS5,
  135437. + MPT_RATE_MCS6,
  135438. + MPT_RATE_MCS7, /* 19 */
  135439. + MPT_RATE_MCS8,
  135440. + MPT_RATE_MCS9,
  135441. + MPT_RATE_MCS10,
  135442. + MPT_RATE_MCS11,
  135443. + MPT_RATE_MCS12,
  135444. + MPT_RATE_MCS13,
  135445. + MPT_RATE_MCS14,
  135446. + MPT_RATE_MCS15, /* 27 */
  135447. + MPT_RATE_LAST
  135448. +}MPT_RATE_E, *PMPT_RATE_E;
  135449. +
  135450. +#if 0
  135451. +// Represent Channel Width in HT Capabilities
  135452. +typedef enum _HT_CHANNEL_WIDTH {
  135453. + HT_CHANNEL_WIDTH_20 = 0,
  135454. + HT_CHANNEL_WIDTH_40 = 1,
  135455. +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH;
  135456. +#endif
  135457. +
  135458. +#define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F
  135459. +
  135460. +typedef enum _POWER_MODE_ {
  135461. + POWER_LOW = 0,
  135462. + POWER_NORMAL
  135463. +}POWER_MODE;
  135464. +
  135465. +
  135466. +#define RX_PKT_BROADCAST 1
  135467. +#define RX_PKT_DEST_ADDR 2
  135468. +#define RX_PKT_PHY_MATCH 3
  135469. +
  135470. +#if 0
  135471. +#define RPTMaxCount 0x000FFFFF;
  135472. +
  135473. +// parameter 1 : BitMask
  135474. +// bit 0 : OFDM PPDU
  135475. +// bit 1 : OFDM False Alarm
  135476. +// bit 2 : OFDM MPDU OK
  135477. +// bit 3 : OFDM MPDU Fail
  135478. +// bit 4 : CCK PPDU
  135479. +// bit 5 : CCK False Alarm
  135480. +// bit 6 : CCK MPDU ok
  135481. +// bit 7 : CCK MPDU fail
  135482. +// bit 8 : HT PPDU counter
  135483. +// bit 9 : HT false alarm
  135484. +// bit 10 : HT MPDU total
  135485. +// bit 11 : HT MPDU OK
  135486. +// bit 12 : HT MPDU fail
  135487. +// bit 15 : RX full drop
  135488. +typedef enum _RXPHY_BITMASK_
  135489. +{
  135490. + OFDM_PPDU_BIT = 0,
  135491. + OFDM_FALSE_BIT,
  135492. + OFDM_MPDU_OK_BIT,
  135493. + OFDM_MPDU_FAIL_BIT,
  135494. + CCK_PPDU_BIT,
  135495. + CCK_FALSE_BIT,
  135496. + CCK_MPDU_OK_BIT,
  135497. + CCK_MPDU_FAIL_BIT,
  135498. + HT_PPDU_BIT,
  135499. + HT_FALSE_BIT,
  135500. + HT_MPDU_BIT,
  135501. + HT_MPDU_OK_BIT,
  135502. + HT_MPDU_FAIL_BIT,
  135503. +} RXPHY_BITMASK;
  135504. +#endif
  135505. +
  135506. +typedef enum _ENCRY_CTRL_STATE_ {
  135507. + HW_CONTROL, //hw encryption& decryption
  135508. + SW_CONTROL, //sw encryption& decryption
  135509. + HW_ENCRY_SW_DECRY, //hw encryption & sw decryption
  135510. + SW_ENCRY_HW_DECRY //sw encryption & hw decryption
  135511. +}ENCRY_CTRL_STATE;
  135512. +
  135513. +typedef enum _OFDM_TX_MODE {
  135514. + OFDM_ALL_OFF = 0,
  135515. + OFDM_ContinuousTx = 1,
  135516. + OFDM_SingleCarrier = 2,
  135517. + OFDM_SingleTone = 4,
  135518. +} OFDM_TX_MODE;
  135519. +
  135520. +//=======================================================================
  135521. +//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv);
  135522. +//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe);
  135523. +
  135524. +extern s32 init_mp_priv(PADAPTER padapter);
  135525. +extern void free_mp_priv(struct mp_priv *pmp_priv);
  135526. +extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel);
  135527. +extern void MPT_DeInitAdapter(PADAPTER padapter);
  135528. +extern s32 mp_start_test(PADAPTER padapter);
  135529. +extern void mp_stop_test(PADAPTER padapter);
  135530. +
  135531. +//=======================================================================
  135532. +//extern void IQCalibrateBcut(PADAPTER pAdapter);
  135533. +
  135534. +//extern u32 bb_reg_read(PADAPTER Adapter, u16 offset);
  135535. +//extern u8 bb_reg_write(PADAPTER Adapter, u16 offset, u32 value);
  135536. +//extern u32 rf_reg_read(PADAPTER Adapter, u8 path, u8 offset);
  135537. +//extern u8 rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value);
  135538. +
  135539. +//extern u32 get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask);
  135540. +//extern u8 set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value);
  135541. +//extern u32 get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask);
  135542. +//extern u8 set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value);
  135543. +
  135544. +extern u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask);
  135545. +extern void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val);
  135546. +
  135547. +extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz);
  135548. +extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz);
  135549. +extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask);
  135550. +extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val);
  135551. +extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr);
  135552. +extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val);
  135553. +
  135554. +extern void SetChannel(PADAPTER pAdapter);
  135555. +extern void SetBandwidth(PADAPTER pAdapter);
  135556. +extern void SetTxPower(PADAPTER pAdapter);
  135557. +extern void SetAntennaPathPower(PADAPTER pAdapter);
  135558. +//extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset);
  135559. +extern void SetDataRate(PADAPTER pAdapter);
  135560. +
  135561. +extern void SetAntenna(PADAPTER pAdapter);
  135562. +
  135563. +//extern void SetCrystalCap(PADAPTER pAdapter);
  135564. +
  135565. +extern s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
  135566. +extern void GetThermalMeter(PADAPTER pAdapter, u8 *value);
  135567. +
  135568. +extern void SetContinuousTx(PADAPTER pAdapter, u8 bStart);
  135569. +extern void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);
  135570. +extern void SetSingleToneTx(PADAPTER pAdapter, u8 bStart);
  135571. +extern void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
  135572. +
  135573. +extern void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc);
  135574. +extern void SetPacketTx(PADAPTER padapter);
  135575. +extern void SetPacketRx(PADAPTER pAdapter, u8 bStartRx);
  135576. +
  135577. +extern void ResetPhyRxPktCount(PADAPTER pAdapter);
  135578. +extern u32 GetPhyRxPktReceived(PADAPTER pAdapter);
  135579. +extern u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter);
  135580. +
  135581. +extern s32 SetPowerTracking(PADAPTER padapter, u8 enable);
  135582. +extern void GetPowerTracking(PADAPTER padapter, u8 *enable);
  135583. +
  135584. +extern u32 mp_query_psd(PADAPTER pAdapter, u8 *data);
  135585. +
  135586. +
  135587. +extern void Hal_SetAntenna(PADAPTER pAdapter);
  135588. +extern void Hal_SetBandwidth(PADAPTER pAdapter);
  135589. +
  135590. +extern void Hal_SetTxPower(PADAPTER pAdapter);
  135591. +extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);
  135592. +extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart );
  135593. +extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart);
  135594. +extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart);
  135595. +extern void Hal_SetBandwidth(PADAPTER pAdapter);
  135596. +
  135597. +extern void Hal_SetDataRate(PADAPTER pAdapter);
  135598. +extern void Hal_SetChannel(PADAPTER pAdapter);
  135599. +extern void Hal_SetAntennaPathPower(PADAPTER pAdapter);
  135600. +extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);
  135601. +extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable);
  135602. +extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable);
  135603. +extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value);
  135604. +extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter);
  135605. +extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14);
  135606. +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven);
  135607. +extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower);
  135608. +extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower);
  135609. +extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter);
  135610. +extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
  135611. +extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
  135612. +extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
  135613. +extern void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCapVal);
  135614. +
  135615. +#endif //_RTW_MP_H_
  135616. --- /dev/null
  135617. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h
  135618. @@ -0,0 +1,595 @@
  135619. +/******************************************************************************
  135620. + *
  135621. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  135622. + *
  135623. + * This program is free software; you can redistribute it and/or modify it
  135624. + * under the terms of version 2 of the GNU General Public License as
  135625. + * published by the Free Software Foundation.
  135626. + *
  135627. + * This program is distributed in the hope that it will be useful, but WITHOUT
  135628. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  135629. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  135630. + * more details.
  135631. + *
  135632. + * You should have received a copy of the GNU General Public License along with
  135633. + * this program; if not, write to the Free Software Foundation, Inc.,
  135634. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  135635. + *
  135636. + *
  135637. + ******************************************************************************/
  135638. +#ifndef _RTW_MP_IOCTL_H_
  135639. +#define _RTW_MP_IOCTL_H_
  135640. +
  135641. +//#include <drv_conf.h>
  135642. +//#include <osdep_service.h>
  135643. +#include <drv_types.h>
  135644. +#include <mp_custom_oid.h>
  135645. +#include <rtw_ioctl.h>
  135646. +#include <rtw_ioctl_rtl.h>
  135647. +#include <rtw_efuse.h>
  135648. +#include <rtw_mp.h>
  135649. +
  135650. +#if 0
  135651. +#define TESTFWCMDNUMBER 1000000
  135652. +#define TEST_H2CINT_WAIT_TIME 500
  135653. +#define TEST_C2HINT_WAIT_TIME 500
  135654. +#define HCI_TEST_SYSCFG_HWMASK 1
  135655. +#define _BUSCLK_40M (4 << 2)
  135656. +#endif
  135657. +//------------------------------------------------------------------------------
  135658. +typedef struct CFG_DBG_MSG_STRUCT {
  135659. + u32 DebugLevel;
  135660. + u32 DebugComponent_H32;
  135661. + u32 DebugComponent_L32;
  135662. +}CFG_DBG_MSG_STRUCT,*PCFG_DBG_MSG_STRUCT;
  135663. +
  135664. +typedef struct _RW_REG {
  135665. + u32 offset;
  135666. + u32 width;
  135667. + u32 value;
  135668. +}mp_rw_reg,RW_Reg, *pRW_Reg;
  135669. +
  135670. +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM
  135671. +typedef struct _EEPROM_RW_PARAM {
  135672. + u32 offset;
  135673. + u16 value;
  135674. +}eeprom_rw_param,EEPROM_RWParam, *pEEPROM_RWParam;
  135675. +
  135676. +typedef struct _EFUSE_ACCESS_STRUCT_ {
  135677. + u16 start_addr;
  135678. + u16 cnts;
  135679. + u8 data[0];
  135680. +}EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT;
  135681. +
  135682. +typedef struct _BURST_RW_REG {
  135683. + u32 offset;
  135684. + u32 len;
  135685. + u8 Data[256];
  135686. +}burst_rw_reg,Burst_RW_Reg, *pBurst_RW_Reg;
  135687. +
  135688. +typedef struct _USB_VendorReq{
  135689. + u8 bRequest;
  135690. + u16 wValue;
  135691. + u16 wIndex;
  135692. + u16 wLength;
  135693. + u8 u8Dir;//0:OUT, 1:IN
  135694. + u8 u8InData;
  135695. +}usb_vendor_req, USB_VendorReq, *pUSB_VendorReq;
  135696. +
  135697. +typedef struct _DR_VARIABLE_STRUCT_ {
  135698. + u8 offset;
  135699. + u32 variable;
  135700. +}DR_VARIABLE_STRUCT;
  135701. +
  135702. +//int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid);
  135703. +
  135704. +//void _irqlevel_changed_(_irqL *irqlevel, /*BOOLEAN*/unsigned char bLower);
  135705. +#ifdef PLATFORM_OS_XP
  135706. +static void _irqlevel_changed_(_irqL *irqlevel, u8 bLower)
  135707. +{
  135708. +
  135709. + if (bLower == LOWER) {
  135710. + *irqlevel = KeGetCurrentIrql();
  135711. +
  135712. + if (*irqlevel > PASSIVE_LEVEL) {
  135713. + KeLowerIrql(PASSIVE_LEVEL);
  135714. + }
  135715. + } else {
  135716. + if (KeGetCurrentIrql() == PASSIVE_LEVEL) {
  135717. + KeRaiseIrql(DISPATCH_LEVEL, irqlevel);
  135718. + }
  135719. + }
  135720. +
  135721. +}
  135722. +#else
  135723. +#define _irqlevel_changed_(a,b)
  135724. +#endif
  135725. +
  135726. +//oid_rtl_seg_81_80_00
  135727. +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv* poid_par_priv);
  135728. +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv* poid_par_priv);
  135729. +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv* poid_par_priv);
  135730. +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv* poid_par_priv);
  135731. +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv* poid_par_priv);
  135732. +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv* poid_par_priv);
  135733. +//oid_rtl_seg_81_80_20
  135734. +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv);
  135735. +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);
  135736. +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv);
  135737. +
  135738. +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv);
  135739. +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);
  135740. +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv);
  135741. +
  135742. +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv* poid_par_priv);
  135743. +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv* poid_par_priv);
  135744. +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv* poid_par_priv);
  135745. +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv* poid_par_priv);
  135746. +
  135747. +
  135748. +//oid_rtl_seg_81_87
  135749. +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv* poid_par_priv);
  135750. +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv* poid_par_priv);
  135751. +
  135752. +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv* poid_par_priv);
  135753. +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv* poid_par_priv);
  135754. +
  135755. +
  135756. +//oid_rtl_seg_81_85
  135757. +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);
  135758. +
  135759. +
  135760. +// oid_rtl_seg_87_11_00
  135761. +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv* poid_par_priv);
  135762. +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv* poid_par_priv);
  135763. +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv* poid_par_priv);
  135764. +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv* poid_par_priv);
  135765. +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv* poid_par_priv);
  135766. +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv* poid_par_priv);
  135767. +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv* poid_par_priv);
  135768. +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv* poid_par_priv);
  135769. +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv* poid_par_priv);
  135770. +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv* poid_par_priv);
  135771. +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv* poid_par_priv);
  135772. +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv* poid_par_priv);
  135773. +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv* poid_par_priv);
  135774. +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv* poid_par_priv);
  135775. +// oid_rtl_seg_87_11_20
  135776. +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv* poid_par_priv);
  135777. +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv* poid_par_priv);
  135778. +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv* poid_par_priv);
  135779. +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv* poid_par_priv);
  135780. +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv* poid_par_priv);
  135781. +//oid_rtl_seg_87_11_50
  135782. +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv* poid_par_priv);
  135783. +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv* poid_par_priv);
  135784. +//oid_rtl_seg_87_11_F0
  135785. +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv* poid_par_priv);
  135786. +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv* poid_par_priv);
  135787. +
  135788. +
  135789. +//oid_rtl_seg_87_12_00
  135790. +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv* poid_par_priv);
  135791. +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv* poid_par_priv);
  135792. +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv* poid_par_priv);
  135793. +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv* poid_par_priv);
  135794. +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv);
  135795. +
  135796. +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv);
  135797. +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv);
  135798. +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv);
  135799. +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv);
  135800. +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv);
  135801. +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv);
  135802. +
  135803. +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv* poid_par_priv);
  135804. +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv* poid_par_priv);
  135805. +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv);
  135806. +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv* poid_par_priv);
  135807. +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv* poid_par_priv);
  135808. +
  135809. +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv* poid_par_priv);
  135810. +
  135811. +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv* poid_par_priv);
  135812. +
  135813. +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv* poid_par_priv);
  135814. +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);
  135815. +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv);
  135816. +
  135817. +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv* poid_par_priv);
  135818. +
  135819. +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv* poid_par_priv);
  135820. +
  135821. +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv);
  135822. +
  135823. +#ifdef _RTW_MP_IOCTL_C_
  135824. +
  135825. +const struct oid_obj_priv oid_rtl_seg_81_80_00[] =
  135826. +{
  135827. + {1, &oid_null_function}, //0x00 OID_RT_PRO_RESET_DUT
  135828. + {1, &oid_rt_pro_set_data_rate_hdl}, //0x01
  135829. + {1, &oid_rt_pro_start_test_hdl}, //0x02
  135830. + {1, &oid_rt_pro_stop_test_hdl}, //0x03
  135831. + {1, &oid_null_function}, //0x04 OID_RT_PRO_SET_PREAMBLE
  135832. + {1, &oid_null_function}, //0x05 OID_RT_PRO_SET_SCRAMBLER
  135833. + {1, &oid_null_function}, //0x06 OID_RT_PRO_SET_FILTER_BB
  135834. + {1, &oid_null_function}, //0x07 OID_RT_PRO_SET_MANUAL_DIVERSITY_BB
  135835. + {1, &oid_rt_pro_set_channel_direct_call_hdl}, //0x08
  135836. + {1, &oid_null_function}, //0x09 OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL
  135837. + {1, &oid_null_function}, //0x0A OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL
  135838. + {1, &oid_rt_pro_set_continuous_tx_hdl}, //0x0B OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL
  135839. + {1, &oid_rt_pro_set_single_carrier_tx_hdl}, //0x0C OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS
  135840. + {1, &oid_null_function}, //0x0D OID_RT_PRO_SET_TX_ANTENNA_BB
  135841. + {1, &oid_rt_pro_set_antenna_bb_hdl}, //0x0E
  135842. + {1, &oid_null_function}, //0x0F OID_RT_PRO_SET_CR_SCRAMBLER
  135843. + {1, &oid_null_function}, //0x10 OID_RT_PRO_SET_CR_NEW_FILTER
  135844. + {1, &oid_rt_pro_set_tx_power_control_hdl}, //0x11 OID_RT_PRO_SET_TX_POWER_CONTROL
  135845. + {1, &oid_null_function}, //0x12 OID_RT_PRO_SET_CR_TX_CONFIG
  135846. + {1, &oid_null_function}, //0x13 OID_RT_PRO_GET_TX_POWER_CONTROL
  135847. + {1, &oid_null_function}, //0x14 OID_RT_PRO_GET_CR_SIGNAL_QUALITY
  135848. + {1, &oid_null_function}, //0x15 OID_RT_PRO_SET_CR_SETPOINT
  135849. + {1, &oid_null_function}, //0x16 OID_RT_PRO_SET_INTEGRATOR
  135850. + {1, &oid_null_function}, //0x17 OID_RT_PRO_SET_SIGNAL_QUALITY
  135851. + {1, &oid_null_function}, //0x18 OID_RT_PRO_GET_INTEGRATOR
  135852. + {1, &oid_null_function}, //0x19 OID_RT_PRO_GET_SIGNAL_QUALITY
  135853. + {1, &oid_null_function}, //0x1A OID_RT_PRO_QUERY_EEPROM_TYPE
  135854. + {1, &oid_null_function}, //0x1B OID_RT_PRO_WRITE_MAC_ADDRESS
  135855. + {1, &oid_null_function}, //0x1C OID_RT_PRO_READ_MAC_ADDRESS
  135856. + {1, &oid_null_function}, //0x1D OID_RT_PRO_WRITE_CIS_DATA
  135857. + {1, &oid_null_function}, //0x1E OID_RT_PRO_READ_CIS_DATA
  135858. + {1, &oid_null_function} //0x1F OID_RT_PRO_WRITE_POWER_CONTROL
  135859. +
  135860. +};
  135861. +
  135862. +const struct oid_obj_priv oid_rtl_seg_81_80_20[] =
  135863. +{
  135864. + {1, &oid_null_function}, //0x20 OID_RT_PRO_READ_POWER_CONTROL
  135865. + {1, &oid_null_function}, //0x21 OID_RT_PRO_WRITE_EEPROM
  135866. + {1, &oid_null_function}, //0x22 OID_RT_PRO_READ_EEPROM
  135867. + {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, //0x23
  135868. + {1, &oid_rt_pro_query_tx_packet_sent_hdl}, //0x24
  135869. + {1, &oid_rt_pro_reset_rx_packet_received_hdl}, //0x25
  135870. + {1, &oid_rt_pro_query_rx_packet_received_hdl}, //0x26
  135871. + {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl}, //0x27
  135872. + {1, &oid_null_function}, //0x28 OID_RT_PRO_QUERY_CURRENT_ADDRESS
  135873. + {1, &oid_null_function}, //0x29 OID_RT_PRO_QUERY_PERMANENT_ADDRESS
  135874. + {1, &oid_null_function}, //0x2A OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS
  135875. + {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},//0x2B OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX
  135876. + {1, &oid_null_function}, //0x2C OID_RT_PRO_RECEIVE_PACKET
  135877. + {1, &oid_null_function}, //0x2D OID_RT_PRO_WRITE_EEPROM_BYTE
  135878. + {1, &oid_null_function}, //0x2E OID_RT_PRO_READ_EEPROM_BYTE
  135879. + {1, &oid_rt_pro_set_modulation_hdl} //0x2F
  135880. +
  135881. +};
  135882. +
  135883. +const struct oid_obj_priv oid_rtl_seg_81_80_40[] =
  135884. +{
  135885. + {1, &oid_null_function}, //0x40
  135886. + {1, &oid_null_function}, //0x41
  135887. + {1, &oid_null_function}, //0x42
  135888. + {1, &oid_rt_pro_set_single_tone_tx_hdl}, //0x43
  135889. + {1, &oid_null_function}, //0x44
  135890. + {1, &oid_null_function} //0x45
  135891. +};
  135892. +
  135893. +const struct oid_obj_priv oid_rtl_seg_81_80_80[] =
  135894. +{
  135895. + {1, &oid_null_function}, //0x80 OID_RT_DRIVER_OPTION
  135896. + {1, &oid_null_function}, //0x81 OID_RT_RF_OFF
  135897. + {1, &oid_null_function} //0x82 OID_RT_AUTH_STATUS
  135898. +
  135899. +};
  135900. +
  135901. +const struct oid_obj_priv oid_rtl_seg_81_85[] =
  135902. +{
  135903. + {1, &oid_rt_wireless_mode_hdl} //0x00 OID_RT_WIRELESS_MODE
  135904. +};
  135905. +
  135906. +struct oid_obj_priv oid_rtl_seg_81_87[] =
  135907. +{
  135908. + {1, &oid_null_function}, //0x80 OID_RT_PRO8187_WI_POLL
  135909. + {1, &oid_rt_pro_write_bb_reg_hdl}, //0x81
  135910. + {1, &oid_rt_pro_read_bb_reg_hdl}, //0x82
  135911. + {1, &oid_rt_pro_write_rf_reg_hdl}, //0x82
  135912. + {1, &oid_rt_pro_read_rf_reg_hdl} //0x83
  135913. +};
  135914. +
  135915. +struct oid_obj_priv oid_rtl_seg_87_11_00[] =
  135916. +{
  135917. + {1, &oid_rt_pro8711_join_bss_hdl}, //0x00 //S
  135918. + {1, &oid_rt_pro_read_register_hdl}, //0x01
  135919. + {1, &oid_rt_pro_write_register_hdl}, //0x02
  135920. + {1, &oid_rt_pro_burst_read_register_hdl}, //0x03
  135921. + {1, &oid_rt_pro_burst_write_register_hdl}, //0x04
  135922. + {1, &oid_rt_pro_write_txcmd_hdl}, //0x05
  135923. + {1, &oid_rt_pro_read16_eeprom_hdl}, //0x06
  135924. + {1, &oid_rt_pro_write16_eeprom_hdl}, //0x07
  135925. + {1, &oid_null_function}, //0x08 OID_RT_PRO_H2C_SET_COMMAND
  135926. + {1, &oid_null_function}, //0x09 OID_RT_PRO_H2C_QUERY_RESULT
  135927. + {1, &oid_rt_pro8711_wi_poll_hdl}, //0x0A
  135928. + {1, &oid_rt_pro8711_pkt_loss_hdl}, //0x0B
  135929. + {1, &oid_rt_rd_attrib_mem_hdl}, //0x0C
  135930. + {1, &oid_rt_wr_attrib_mem_hdl}, //0x0D
  135931. + {1, &oid_null_function}, //0x0E
  135932. + {1, &oid_null_function}, //0x0F
  135933. + {1, &oid_null_function}, //0x10 OID_RT_PRO_H2C_CMD_MODE
  135934. + {1, &oid_null_function}, //0x11 OID_RT_PRO_H2C_CMD_RSP_MODE
  135935. + {1, &oid_null_function}, //0X12 OID_RT_PRO_WAIT_C2H_EVENT
  135936. + {1, &oid_null_function}, //0X13 OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST
  135937. + {1, &oid_null_function}, //0X14 OID_RT_PRO_SCSI_ACCESS_TEST
  135938. + {1, &oid_null_function}, //0X15 OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT
  135939. + {1, &oid_null_function}, //0X16 OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN
  135940. + {1, &oid_null_function}, //0X17 OID_RT_RRO_RX_PKT_VIA_IOCTRL
  135941. + {1, &oid_null_function}, //0X18 OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL
  135942. + {1, &oid_null_function}, //0X19 OID_RT_RPO_SET_PWRMGT_TEST
  135943. + {1, &oid_null_function}, //0X1A
  135944. + {1, &oid_null_function}, //0X1B OID_RT_PRO_QRY_PWRMGT_TEST
  135945. + {1, &oid_null_function}, //0X1C OID_RT_RPO_ASYNC_RWIO_TEST
  135946. + {1, &oid_null_function}, //0X1D OID_RT_RPO_ASYNC_RWIO_POLL
  135947. + {1, &oid_rt_pro_set_rf_intfs_hdl}, //0X1E
  135948. + {1, &oid_rt_poll_rx_status_hdl} //0X1F
  135949. +};
  135950. +
  135951. +struct oid_obj_priv oid_rtl_seg_87_11_20[] =
  135952. +{
  135953. + {1, &oid_rt_pro_cfg_debug_message_hdl}, //0x20
  135954. + {1, &oid_rt_pro_set_data_rate_ex_hdl}, //0x21
  135955. + {1, &oid_rt_pro_set_basic_rate_hdl}, //0x22
  135956. + {1, &oid_rt_pro_read_tssi_hdl}, //0x23
  135957. + {1, &oid_rt_pro_set_power_tracking_hdl} //0x24
  135958. +};
  135959. +
  135960. +
  135961. +struct oid_obj_priv oid_rtl_seg_87_11_50[] =
  135962. +{
  135963. + {1, &oid_rt_pro_qry_pwrstate_hdl}, //0x50
  135964. + {1, &oid_rt_pro_set_pwrstate_hdl} //0x51
  135965. +};
  135966. +
  135967. +struct oid_obj_priv oid_rtl_seg_87_11_80[] =
  135968. +{
  135969. + {1, &oid_null_function} //0x80
  135970. +};
  135971. +
  135972. +struct oid_obj_priv oid_rtl_seg_87_11_B0[] =
  135973. +{
  135974. + {1, &oid_null_function} //0xB0
  135975. +};
  135976. +
  135977. +struct oid_obj_priv oid_rtl_seg_87_11_F0[] =
  135978. +{
  135979. + {1, &oid_null_function}, //0xF0
  135980. + {1, &oid_null_function}, //0xF1
  135981. + {1, &oid_null_function}, //0xF2
  135982. + {1, &oid_null_function}, //0xF3
  135983. + {1, &oid_null_function}, //0xF4
  135984. + {1, &oid_null_function}, //0xF5
  135985. + {1, &oid_null_function}, //0xF6
  135986. + {1, &oid_null_function}, //0xF7
  135987. + {1, &oid_null_function}, //0xF8
  135988. + {1, &oid_null_function}, //0xF9
  135989. + {1, &oid_null_function}, //0xFA
  135990. + {1, &oid_rt_pro_h2c_set_rate_table_hdl}, //0xFB
  135991. + {1, &oid_rt_pro_h2c_get_rate_table_hdl}, //0xFC
  135992. + {1, &oid_null_function}, //0xFD
  135993. + {1, &oid_null_function}, //0xFE OID_RT_PRO_H2C_C2H_LBK_TEST
  135994. + {1, &oid_null_function} //0xFF
  135995. +
  135996. +};
  135997. +
  135998. +struct oid_obj_priv oid_rtl_seg_87_12_00[]=
  135999. +{
  136000. + {1, &oid_rt_pro_encryption_ctrl_hdl}, //0x00 Q&S
  136001. + {1, &oid_rt_pro_add_sta_info_hdl}, //0x01 S
  136002. + {1, &oid_rt_pro_dele_sta_info_hdl}, //0x02 S
  136003. + {1, &oid_rt_pro_query_dr_variable_hdl}, //0x03 Q
  136004. + {1, &oid_rt_pro_rx_packet_type_hdl}, //0x04 Q,S
  136005. + {1, &oid_rt_pro_read_efuse_hdl}, //0x05 Q OID_RT_PRO_READ_EFUSE
  136006. + {1, &oid_rt_pro_write_efuse_hdl}, //0x06 S OID_RT_PRO_WRITE_EFUSE
  136007. + {1, &oid_rt_pro_rw_efuse_pgpkt_hdl}, //0x07 Q,S
  136008. + {1, &oid_rt_get_efuse_current_size_hdl}, //0x08 Q
  136009. + {1, &oid_rt_set_bandwidth_hdl}, //0x09
  136010. + {1, &oid_rt_set_crystal_cap_hdl}, //0x0a
  136011. + {1, &oid_rt_set_rx_packet_type_hdl}, //0x0b S
  136012. + {1, &oid_rt_get_efuse_max_size_hdl}, //0x0c
  136013. + {1, &oid_rt_pro_set_tx_agc_offset_hdl}, //0x0d
  136014. + {1, &oid_rt_pro_set_pkt_test_mode_hdl}, //0x0e
  136015. + {1, &oid_null_function}, //0x0f OID_RT_PRO_FOR_EVM_TEST_SETTING
  136016. + {1, &oid_rt_get_thermal_meter_hdl}, //0x10 Q OID_RT_PRO_GET_THERMAL_METER
  136017. + {1, &oid_rt_reset_phy_rx_packet_count_hdl}, //0x11 S OID_RT_RESET_PHY_RX_PACKET_COUNT
  136018. + {1, &oid_rt_get_phy_rx_packet_received_hdl}, //0x12 Q OID_RT_GET_PHY_RX_PACKET_RECEIVED
  136019. + {1, &oid_rt_get_phy_rx_packet_crc32_error_hdl}, //0x13 Q OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR
  136020. + {1, &oid_rt_set_power_down_hdl}, //0x14 Q OID_RT_SET_POWER_DOWN
  136021. + {1, &oid_rt_get_power_mode_hdl} //0x15 Q OID_RT_GET_POWER_MODE
  136022. +};
  136023. +
  136024. +#else /* _RTL871X_MP_IOCTL_C_ */
  136025. +
  136026. +extern struct oid_obj_priv oid_rtl_seg_81_80_00[32];
  136027. +extern struct oid_obj_priv oid_rtl_seg_81_80_20[16];
  136028. +extern struct oid_obj_priv oid_rtl_seg_81_80_40[6];
  136029. +extern struct oid_obj_priv oid_rtl_seg_81_80_80[3];
  136030. +
  136031. +extern struct oid_obj_priv oid_rtl_seg_81_85[1];
  136032. +extern struct oid_obj_priv oid_rtl_seg_81_87[5];
  136033. +
  136034. +extern struct oid_obj_priv oid_rtl_seg_87_11_00[32];
  136035. +extern struct oid_obj_priv oid_rtl_seg_87_11_20[5];
  136036. +extern struct oid_obj_priv oid_rtl_seg_87_11_50[2];
  136037. +extern struct oid_obj_priv oid_rtl_seg_87_11_80[1];
  136038. +extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1];
  136039. +extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16];
  136040. +
  136041. +extern struct oid_obj_priv oid_rtl_seg_87_12_00[32];
  136042. +
  136043. +#endif /* _RTL871X_MP_IOCTL_C_ */
  136044. +
  136045. +struct rwreg_param{
  136046. + u32 offset;
  136047. + u32 width;
  136048. + u32 value;
  136049. +};
  136050. +
  136051. +struct bbreg_param{
  136052. + u32 offset;
  136053. + u32 phymask;
  136054. + u32 value;
  136055. +};
  136056. +/*
  136057. +struct rfchannel_param{
  136058. + u32 ch;
  136059. + u32 modem;
  136060. +};
  136061. +*/
  136062. +struct txpower_param{
  136063. + u32 pwr_index;
  136064. +};
  136065. +
  136066. +
  136067. +struct datarate_param{
  136068. + u32 rate_index;
  136069. +};
  136070. +
  136071. +
  136072. +struct rfintfs_parm {
  136073. + u32 rfintfs;
  136074. +};
  136075. +
  136076. +typedef struct _mp_xmit_parm_ {
  136077. + u8 enable;
  136078. + u32 count;
  136079. + u16 length;
  136080. + u8 payload_type;
  136081. + u8 da[ETH_ALEN];
  136082. +}MP_XMIT_PARM, *PMP_XMIT_PARM;
  136083. +
  136084. +struct mp_xmit_packet {
  136085. + u32 len;
  136086. + u32 mem[MAX_MP_XMITBUF_SZ >> 2];
  136087. +};
  136088. +
  136089. +struct psmode_param {
  136090. + u32 ps_mode;
  136091. + u32 smart_ps;
  136092. +};
  136093. +
  136094. +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM
  136095. +struct eeprom_rw_param {
  136096. + u32 offset;
  136097. + u16 value;
  136098. +};
  136099. +
  136100. +struct mp_ioctl_handler {
  136101. + u32 paramsize;
  136102. + u32 (*handler)(struct oid_par_priv* poid_par_priv);
  136103. + u32 oid;
  136104. +};
  136105. +
  136106. +struct mp_ioctl_param{
  136107. + u32 subcode;
  136108. + u32 len;
  136109. + u8 data[0];
  136110. +};
  136111. +
  136112. +#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_
  136113. +
  136114. +enum RTL871X_MP_IOCTL_SUBCODE {
  136115. + GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/
  136116. + GEN_MP_IOCTL_SUBCODE(MP_STOP),
  136117. + GEN_MP_IOCTL_SUBCODE(READ_REG),
  136118. + GEN_MP_IOCTL_SUBCODE(WRITE_REG),
  136119. + GEN_MP_IOCTL_SUBCODE(READ_BB_REG),
  136120. + GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/
  136121. + GEN_MP_IOCTL_SUBCODE(READ_RF_REG),
  136122. + GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG),
  136123. + GEN_MP_IOCTL_SUBCODE(SET_CHANNEL),
  136124. + GEN_MP_IOCTL_SUBCODE(SET_TXPOWER),
  136125. + GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/
  136126. + GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH),
  136127. + GEN_MP_IOCTL_SUBCODE(SET_ANTENNA),
  136128. + GEN_MP_IOCTL_SUBCODE(CNTU_TX),
  136129. + GEN_MP_IOCTL_SUBCODE(SC_TX),
  136130. + GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/
  136131. + GEN_MP_IOCTL_SUBCODE(ST_TX),
  136132. + GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET),
  136133. + GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE),
  136134. + GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT),
  136135. + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/
  136136. + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR),
  136137. + GEN_MP_IOCTL_SUBCODE(READ16_EEPROM),
  136138. + GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM),
  136139. + GEN_MP_IOCTL_SUBCODE(EFUSE),
  136140. + GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/
  136141. + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE),
  136142. + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE),
  136143. + GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER),
  136144. + GEN_MP_IOCTL_SUBCODE(SET_PTM),
  136145. + GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/
  136146. + GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO),
  136147. + GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*35*/
  136148. + GEN_MP_IOCTL_SUBCODE(DEL_BA), /*36*/
  136149. + GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*37*/
  136150. + MAX_MP_IOCTL_SUBCODE,
  136151. +};
  136152. +
  136153. +u32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv* poid_par_priv);
  136154. +
  136155. +#ifdef _RTW_MP_IOCTL_C_
  136156. +
  136157. +#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid},
  136158. +
  136159. +#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid},
  136160. +
  136161. +
  136162. +struct mp_ioctl_handler mp_ioctl_hdl[] = {
  136163. +
  136164. +/*0*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST)
  136165. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST)
  136166. +
  136167. + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER)
  136168. + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER)
  136169. + GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG)
  136170. +/*5*/ GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG)
  136171. + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY)
  136172. + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY)
  136173. +
  136174. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL)
  136175. + GEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL)
  136176. +/*10*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE)
  136177. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH)
  136178. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB)
  136179. +
  136180. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX)
  136181. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX)
  136182. +/*15*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX)
  136183. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX)
  136184. +
  136185. + EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0)
  136186. +
  136187. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE)
  136188. + GEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT)
  136189. +/*20*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED)
  136190. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR)
  136191. +
  136192. + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0)
  136193. + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0)
  136194. + GEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE)
  136195. +/*25*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP)
  136196. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE)
  136197. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE)
  136198. +
  136199. + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER)
  136200. + GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING)
  136201. +/*30*/ GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN)
  136202. +/*31*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0)
  136203. +
  136204. +
  136205. +};
  136206. +
  136207. +#else /* _RTW_MP_IOCTL_C_ */
  136208. +
  136209. +extern struct mp_ioctl_handler mp_ioctl_hdl[];
  136210. +
  136211. +#endif /* _RTW_MP_IOCTL_C_ */
  136212. +
  136213. +#endif
  136214. --- /dev/null
  136215. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h
  136216. @@ -0,0 +1,1096 @@
  136217. +/******************************************************************************
  136218. + *
  136219. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  136220. + *
  136221. + * This program is free software; you can redistribute it and/or modify it
  136222. + * under the terms of version 2 of the GNU General Public License as
  136223. + * published by the Free Software Foundation.
  136224. + *
  136225. + * This program is distributed in the hope that it will be useful, but WITHOUT
  136226. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  136227. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  136228. + * more details.
  136229. + *
  136230. + * You should have received a copy of the GNU General Public License along with
  136231. + * this program; if not, write to the Free Software Foundation, Inc.,
  136232. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  136233. + *
  136234. + *
  136235. + ******************************************************************************/
  136236. +/*****************************************************************************
  136237. + *
  136238. + * Module: __RTW_MP_PHY_REGDEF_H_
  136239. + *
  136240. + *
  136241. + * Note: 1. Define PMAC/BB register map
  136242. + * 2. Define RF register map
  136243. + * 3. PMAC/BB register bit mask.
  136244. + * 4. RF reg bit mask.
  136245. + * 5. Other BB/RF relative definition.
  136246. + *
  136247. + *
  136248. + * Export: Constants, macro, functions(API), global variables(None).
  136249. + *
  136250. + * Abbrev:
  136251. + *
  136252. + * History:
  136253. + * Data Who Remark
  136254. + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h.
  136255. + * 2. Reorganize code architecture.
  136256. + * 09/25/2008 MH 1. Add RL6052 register definition
  136257. + *
  136258. + *****************************************************************************/
  136259. +#ifndef __RTW_MP_PHY_REGDEF_H_
  136260. +#define __RTW_MP_PHY_REGDEF_H_
  136261. +
  136262. +
  136263. +/*--------------------------Define Parameters-------------------------------*/
  136264. +
  136265. +//============================================================
  136266. +// 8192S Regsiter offset definition
  136267. +//============================================================
  136268. +
  136269. +//
  136270. +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF
  136271. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  136272. +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00
  136273. +// 3. RF register 0x00-2E
  136274. +// 4. Bit Mask for BB/RF register
  136275. +// 5. Other defintion for BB/RF R/W
  136276. +//
  136277. +
  136278. +
  136279. +//
  136280. +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF
  136281. +// 1. Page1(0x100)
  136282. +//
  136283. +#define rPMAC_Reset 0x100
  136284. +#define rPMAC_TxStart 0x104
  136285. +#define rPMAC_TxLegacySIG 0x108
  136286. +#define rPMAC_TxHTSIG1 0x10c
  136287. +#define rPMAC_TxHTSIG2 0x110
  136288. +#define rPMAC_PHYDebug 0x114
  136289. +#define rPMAC_TxPacketNum 0x118
  136290. +#define rPMAC_TxIdle 0x11c
  136291. +#define rPMAC_TxMACHeader0 0x120
  136292. +#define rPMAC_TxMACHeader1 0x124
  136293. +#define rPMAC_TxMACHeader2 0x128
  136294. +#define rPMAC_TxMACHeader3 0x12c
  136295. +#define rPMAC_TxMACHeader4 0x130
  136296. +#define rPMAC_TxMACHeader5 0x134
  136297. +#define rPMAC_TxDataType 0x138
  136298. +#define rPMAC_TxRandomSeed 0x13c
  136299. +#define rPMAC_CCKPLCPPreamble 0x140
  136300. +#define rPMAC_CCKPLCPHeader 0x144
  136301. +#define rPMAC_CCKCRC16 0x148
  136302. +#define rPMAC_OFDMRxCRC32OK 0x170
  136303. +#define rPMAC_OFDMRxCRC32Er 0x174
  136304. +#define rPMAC_OFDMRxParityEr 0x178
  136305. +#define rPMAC_OFDMRxCRC8Er 0x17c
  136306. +#define rPMAC_CCKCRxRC16Er 0x180
  136307. +#define rPMAC_CCKCRxRC32Er 0x184
  136308. +#define rPMAC_CCKCRxRC32OK 0x188
  136309. +#define rPMAC_TxStatus 0x18c
  136310. +
  136311. +//
  136312. +// 2. Page2(0x200)
  136313. +//
  136314. +// The following two definition are only used for USB interface.
  136315. +//#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address.
  136316. +//#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data.
  136317. +
  136318. +//
  136319. +// 3. Page8(0x800)
  136320. +//
  136321. +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting??
  136322. +
  136323. +#define rFPGA0_TxInfo 0x804 // Status report??
  136324. +#define rFPGA0_PSDFunction 0x808
  136325. +
  136326. +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain?
  136327. +
  136328. +#define rFPGA0_RFTiming1 0x810 // Useless now
  136329. +#define rFPGA0_RFTiming2 0x814
  136330. +//#define rFPGA0_XC_RFTiming 0x818
  136331. +//#define rFPGA0_XD_RFTiming 0x81c
  136332. +
  136333. +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register
  136334. +#define rFPGA0_XA_HSSIParameter2 0x824
  136335. +#define rFPGA0_XB_HSSIParameter1 0x828
  136336. +#define rFPGA0_XB_HSSIParameter2 0x82c
  136337. +#define rFPGA0_XC_HSSIParameter1 0x830
  136338. +#define rFPGA0_XC_HSSIParameter2 0x834
  136339. +#define rFPGA0_XD_HSSIParameter1 0x838
  136340. +#define rFPGA0_XD_HSSIParameter2 0x83c
  136341. +#define rFPGA0_XA_LSSIParameter 0x840
  136342. +#define rFPGA0_XB_LSSIParameter 0x844
  136343. +#define rFPGA0_XC_LSSIParameter 0x848
  136344. +#define rFPGA0_XD_LSSIParameter 0x84c
  136345. +
  136346. +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now
  136347. +#define rFPGA0_RFSleepUpParameter 0x854
  136348. +
  136349. +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch
  136350. +#define rFPGA0_XCD_SwitchControl 0x85c
  136351. +
  136352. +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch
  136353. +#define rFPGA0_XB_RFInterfaceOE 0x864
  136354. +#define rFPGA0_XC_RFInterfaceOE 0x868
  136355. +#define rFPGA0_XD_RFInterfaceOE 0x86c
  136356. +
  136357. +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control
  136358. +#define rFPGA0_XCD_RFInterfaceSW 0x874
  136359. +
  136360. +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter
  136361. +#define rFPGA0_XCD_RFParameter 0x87c
  136362. +
  136363. +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4??
  136364. +#define rFPGA0_AnalogParameter2 0x884
  136365. +#define rFPGA0_AnalogParameter3 0x888 // Useless now
  136366. +#define rFPGA0_AnalogParameter4 0x88c
  136367. +
  136368. +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback
  136369. +#define rFPGA0_XB_LSSIReadBack 0x8a4
  136370. +#define rFPGA0_XC_LSSIReadBack 0x8a8
  136371. +#define rFPGA0_XD_LSSIReadBack 0x8ac
  136372. +
  136373. +#define rFPGA0_PSDReport 0x8b4 // Useless now
  136374. +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value
  136375. +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now
  136376. +
  136377. +//
  136378. +// 4. Page9(0x900)
  136379. +//
  136380. +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting??
  136381. +
  136382. +#define rFPGA1_TxBlock 0x904 // Useless now
  136383. +#define rFPGA1_DebugSelect 0x908 // Useless now
  136384. +#define rFPGA1_TxInfo 0x90c // Useless now // Status report??
  136385. +
  136386. +//
  136387. +// 5. PageA(0xA00)
  136388. +//
  136389. +// Set Control channel to upper or lower. These settings are required only for 40MHz
  136390. +#define rCCK0_System 0xa00
  136391. +
  136392. +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI
  136393. +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain
  136394. +
  136395. +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series
  136396. +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC
  136397. +
  136398. +#define rCCK0_RxHP 0xa14
  136399. +
  136400. +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold
  136401. +#define rCCK0_DSPParameter2 0xa1c //SQ threshold
  136402. +
  136403. +#define rCCK0_TxFilter1 0xa20
  136404. +#define rCCK0_TxFilter2 0xa24
  136405. +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3
  136406. +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report
  136407. +#define rCCK0_TRSSIReport 0xa50
  136408. +#define rCCK0_RxReport 0xa54 //0xa57
  136409. +#define rCCK0_FACounterLower 0xa5c //0xa5b
  136410. +#define rCCK0_FACounterUpper 0xa58 //0xa5c
  136411. +
  136412. +//
  136413. +// 6. PageC(0xC00)
  136414. +//
  136415. +#define rOFDM0_LSTF 0xc00
  136416. +
  136417. +#define rOFDM0_TRxPathEnable 0xc04
  136418. +#define rOFDM0_TRMuxPar 0xc08
  136419. +#define rOFDM0_TRSWIsolation 0xc0c
  136420. +
  136421. +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter
  136422. +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix
  136423. +#define rOFDM0_XBRxAFE 0xc18
  136424. +#define rOFDM0_XBRxIQImbalance 0xc1c
  136425. +#define rOFDM0_XCRxAFE 0xc20
  136426. +#define rOFDM0_XCRxIQImbalance 0xc24
  136427. +#define rOFDM0_XDRxAFE 0xc28
  136428. +#define rOFDM0_XDRxIQImbalance 0xc2c
  136429. +
  136430. +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain
  136431. +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync.
  136432. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync.
  136433. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI
  136434. +
  136435. +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path
  136436. +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC
  136437. +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold
  136438. +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA
  136439. +
  136440. +#define rOFDM0_XAAGCCore1 0xc50 // DIG
  136441. +#define rOFDM0_XAAGCCore2 0xc54
  136442. +#define rOFDM0_XBAGCCore1 0xc58
  136443. +#define rOFDM0_XBAGCCore2 0xc5c
  136444. +#define rOFDM0_XCAGCCore1 0xc60
  136445. +#define rOFDM0_XCAGCCore2 0xc64
  136446. +#define rOFDM0_XDAGCCore1 0xc68
  136447. +#define rOFDM0_XDAGCCore2 0xc6c
  136448. +
  136449. +#define rOFDM0_AGCParameter1 0xc70
  136450. +#define rOFDM0_AGCParameter2 0xc74
  136451. +#define rOFDM0_AGCRSSITable 0xc78
  136452. +#define rOFDM0_HTSTFAGC 0xc7c
  136453. +
  136454. +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG
  136455. +#define rOFDM0_XATxAFE 0xc84
  136456. +#define rOFDM0_XBTxIQImbalance 0xc88
  136457. +#define rOFDM0_XBTxAFE 0xc8c
  136458. +#define rOFDM0_XCTxIQImbalance 0xc90
  136459. +#define rOFDM0_XCTxAFE 0xc94
  136460. +#define rOFDM0_XDTxIQImbalance 0xc98
  136461. +#define rOFDM0_XDTxAFE 0xc9c
  136462. +#define rOFDM0_RxIQExtAnta 0xca0
  136463. +
  136464. +#define rOFDM0_RxHPParameter 0xce0
  136465. +#define rOFDM0_TxPseudoNoiseWgt 0xce4
  136466. +#define rOFDM0_FrameSync 0xcf0
  136467. +#define rOFDM0_DFSReport 0xcf4
  136468. +#define rOFDM0_TxCoeff1 0xca4
  136469. +#define rOFDM0_TxCoeff2 0xca8
  136470. +#define rOFDM0_TxCoeff3 0xcac
  136471. +#define rOFDM0_TxCoeff4 0xcb0
  136472. +#define rOFDM0_TxCoeff5 0xcb4
  136473. +#define rOFDM0_TxCoeff6 0xcb8
  136474. +
  136475. +
  136476. +//
  136477. +// 7. PageD(0xD00)
  136478. +//
  136479. +#define rOFDM1_LSTF 0xd00
  136480. +#define rOFDM1_TRxPathEnable 0xd04
  136481. +
  136482. +#define rOFDM1_CFO 0xd08 // No setting now
  136483. +#define rOFDM1_CSI1 0xd10
  136484. +#define rOFDM1_SBD 0xd14
  136485. +#define rOFDM1_CSI2 0xd18
  136486. +#define rOFDM1_CFOTracking 0xd2c
  136487. +#define rOFDM1_TRxMesaure1 0xd34
  136488. +#define rOFDM1_IntfDet 0xd3c
  136489. +#define rOFDM1_PseudoNoiseStateAB 0xd50
  136490. +#define rOFDM1_PseudoNoiseStateCD 0xd54
  136491. +#define rOFDM1_RxPseudoNoiseWgt 0xd58
  136492. +
  136493. +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail
  136494. +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail
  136495. +#define rOFDM_PHYCounter3 0xda8 //MCS not support
  136496. +
  136497. +#define rOFDM_ShortCFOAB 0xdac // No setting now
  136498. +#define rOFDM_ShortCFOCD 0xdb0
  136499. +#define rOFDM_LongCFOAB 0xdb4
  136500. +#define rOFDM_LongCFOCD 0xdb8
  136501. +#define rOFDM_TailCFOAB 0xdbc
  136502. +#define rOFDM_TailCFOCD 0xdc0
  136503. +#define rOFDM_PWMeasure1 0xdc4
  136504. +#define rOFDM_PWMeasure2 0xdc8
  136505. +#define rOFDM_BWReport 0xdcc
  136506. +#define rOFDM_AGCReport 0xdd0
  136507. +#define rOFDM_RxSNR 0xdd4
  136508. +#define rOFDM_RxEVMCSI 0xdd8
  136509. +#define rOFDM_SIGReport 0xddc
  136510. +
  136511. +
  136512. +//
  136513. +// 8. PageE(0xE00)
  136514. +//
  136515. +#define rTxAGC_Rate18_06 0xe00
  136516. +#define rTxAGC_Rate54_24 0xe04
  136517. +#define rTxAGC_CCK_Mcs32 0xe08
  136518. +#define rTxAGC_Mcs03_Mcs00 0xe10
  136519. +#define rTxAGC_Mcs07_Mcs04 0xe14
  136520. +#define rTxAGC_Mcs11_Mcs08 0xe18
  136521. +#define rTxAGC_Mcs15_Mcs12 0xe1c
  136522. +
  136523. +// Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register]
  136524. +#define rRx_Wait_CCCA 0xe70
  136525. +#define rAnapar_Ctrl_BB 0xee0
  136526. +
  136527. +//
  136528. +// 7. RF Register 0x00-0x2E (RF 8256)
  136529. +// RF-0222D 0x00-3F
  136530. +//
  136531. +//Zebra1
  136532. +#define RTL92SE_FPGA_VERIFY 0
  136533. +#define rZebra1_HSSIEnable 0x0 // Useless now
  136534. +#define rZebra1_TRxEnable1 0x1
  136535. +#define rZebra1_TRxEnable2 0x2
  136536. +#define rZebra1_AGC 0x4
  136537. +#define rZebra1_ChargePump 0x5
  136538. +//#if (RTL92SE_FPGA_VERIFY == 1)
  136539. +#define rZebra1_Channel 0x7 // RF channel switch
  136540. +//#else
  136541. +
  136542. +//#endif
  136543. +#define rZebra1_TxGain 0x8 // Useless now
  136544. +#define rZebra1_TxLPF 0x9
  136545. +#define rZebra1_RxLPF 0xb
  136546. +#define rZebra1_RxHPFCorner 0xc
  136547. +
  136548. +//Zebra4
  136549. +#define rGlobalCtrl 0 // Useless now
  136550. +#define rRTL8256_TxLPF 19
  136551. +#define rRTL8256_RxLPF 11
  136552. +
  136553. +//RTL8258
  136554. +#define rRTL8258_TxLPF 0x11 // Useless now
  136555. +#define rRTL8258_RxLPF 0x13
  136556. +#define rRTL8258_RSSILPF 0xa
  136557. +
  136558. +//
  136559. +// RL6052 Register definition
  136560. +//
  136561. +#define RF_AC 0x00 //
  136562. +
  136563. +#define RF_IQADJ_G1 0x01 //
  136564. +#define RF_IQADJ_G2 0x02 //
  136565. +#define RF_POW_TRSW 0x05 //
  136566. +
  136567. +#define RF_GAIN_RX 0x06 //
  136568. +#define RF_GAIN_TX 0x07 //
  136569. +
  136570. +#define RF_TXM_IDAC 0x08 //
  136571. +#define RF_BS_IQGEN 0x0F //
  136572. +
  136573. +#define RF_MODE1 0x10 //
  136574. +#define RF_MODE2 0x11 //
  136575. +
  136576. +#define RF_RX_AGC_HP 0x12 //
  136577. +#define RF_TX_AGC 0x13 //
  136578. +#define RF_BIAS 0x14 //
  136579. +#define RF_IPA 0x15 //
  136580. +#define RF_POW_ABILITY 0x17 //
  136581. +#define RF_MODE_AG 0x18 //
  136582. +#define rRfChannel 0x18 // RF channel and BW switch
  136583. +#define RF_CHNLBW 0x18 // RF channel and BW switch
  136584. +#define RF_TOP 0x19 //
  136585. +
  136586. +#define RF_RX_G1 0x1A //
  136587. +#define RF_RX_G2 0x1B //
  136588. +
  136589. +#define RF_RX_BB2 0x1C //
  136590. +#define RF_RX_BB1 0x1D //
  136591. +
  136592. +#define RF_RCK1 0x1E //
  136593. +#define RF_RCK2 0x1F //
  136594. +
  136595. +#define RF_TX_G1 0x20 //
  136596. +#define RF_TX_G2 0x21 //
  136597. +#define RF_TX_G3 0x22 //
  136598. +
  136599. +#define RF_TX_BB1 0x23 //
  136600. +
  136601. +#define RF_T_METER 0x24 //
  136602. +
  136603. +#define RF_SYN_G1 0x25 // RF TX Power control
  136604. +#define RF_SYN_G2 0x26 // RF TX Power control
  136605. +#define RF_SYN_G3 0x27 // RF TX Power control
  136606. +#define RF_SYN_G4 0x28 // RF TX Power control
  136607. +#define RF_SYN_G5 0x29 // RF TX Power control
  136608. +#define RF_SYN_G6 0x2A // RF TX Power control
  136609. +#define RF_SYN_G7 0x2B // RF TX Power control
  136610. +#define RF_SYN_G8 0x2C // RF TX Power control
  136611. +
  136612. +#define RF_RCK_OS 0x30 // RF TX PA control
  136613. +
  136614. +#define RF_TXPA_G1 0x31 // RF TX PA control
  136615. +#define RF_TXPA_G2 0x32 // RF TX PA control
  136616. +#define RF_TXPA_G3 0x33 // RF TX PA control
  136617. +
  136618. +//
  136619. +//Bit Mask
  136620. +//
  136621. +// 1. Page1(0x100)
  136622. +#define bBBResetB 0x100 // Useless now?
  136623. +#define bGlobalResetB 0x200
  136624. +#define bOFDMTxStart 0x4
  136625. +#define bCCKTxStart 0x8
  136626. +#define bCRC32Debug 0x100
  136627. +#define bPMACLoopback 0x10
  136628. +#define bTxLSIG 0xffffff
  136629. +#define bOFDMTxRate 0xf
  136630. +#define bOFDMTxReserved 0x10
  136631. +#define bOFDMTxLength 0x1ffe0
  136632. +#define bOFDMTxParity 0x20000
  136633. +#define bTxHTSIG1 0xffffff
  136634. +#define bTxHTMCSRate 0x7f
  136635. +#define bTxHTBW 0x80
  136636. +#define bTxHTLength 0xffff00
  136637. +#define bTxHTSIG2 0xffffff
  136638. +#define bTxHTSmoothing 0x1
  136639. +#define bTxHTSounding 0x2
  136640. +#define bTxHTReserved 0x4
  136641. +#define bTxHTAggreation 0x8
  136642. +#define bTxHTSTBC 0x30
  136643. +#define bTxHTAdvanceCoding 0x40
  136644. +#define bTxHTShortGI 0x80
  136645. +#define bTxHTNumberHT_LTF 0x300
  136646. +#define bTxHTCRC8 0x3fc00
  136647. +#define bCounterReset 0x10000
  136648. +#define bNumOfOFDMTx 0xffff
  136649. +#define bNumOfCCKTx 0xffff0000
  136650. +#define bTxIdleInterval 0xffff
  136651. +#define bOFDMService 0xffff0000
  136652. +#define bTxMACHeader 0xffffffff
  136653. +#define bTxDataInit 0xff
  136654. +#define bTxHTMode 0x100
  136655. +#define bTxDataType 0x30000
  136656. +#define bTxRandomSeed 0xffffffff
  136657. +#define bCCKTxPreamble 0x1
  136658. +#define bCCKTxSFD 0xffff0000
  136659. +#define bCCKTxSIG 0xff
  136660. +#define bCCKTxService 0xff00
  136661. +#define bCCKLengthExt 0x8000
  136662. +#define bCCKTxLength 0xffff0000
  136663. +#define bCCKTxCRC16 0xffff
  136664. +#define bCCKTxStatus 0x1
  136665. +#define bOFDMTxStatus 0x2
  136666. +
  136667. +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff))
  136668. +
  136669. +// 2. Page8(0x800)
  136670. +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD
  136671. +#define bJapanMode 0x2
  136672. +#define bCCKTxSC 0x30
  136673. +#define bCCKEn 0x1000000
  136674. +#define bOFDMEn 0x2000000
  136675. +
  136676. +#define bOFDMRxADCPhase 0x10000 // Useless now
  136677. +#define bOFDMTxDACPhase 0x40000
  136678. +#define bXATxAGC 0x3f
  136679. +
  136680. +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage
  136681. +#define bXCTxAGC 0xf000
  136682. +#define bXDTxAGC 0xf0000
  136683. +
  136684. +#define bPAStart 0xf0000000 // Useless now
  136685. +#define bTRStart 0x00f00000
  136686. +#define bRFStart 0x0000f000
  136687. +#define bBBStart 0x000000f0
  136688. +#define bBBCCKStart 0x0000000f
  136689. +#define bPAEnd 0xf //Reg0x814
  136690. +#define bTREnd 0x0f000000
  136691. +#define bRFEnd 0x000f0000
  136692. +#define bCCAMask 0x000000f0 //T2R
  136693. +#define bR2RCCAMask 0x00000f00
  136694. +#define bHSSI_R2TDelay 0xf8000000
  136695. +#define bHSSI_T2RDelay 0xf80000
  136696. +#define bContTxHSSI 0x400 //chane gain at continue Tx
  136697. +#define bIGFromCCK 0x200
  136698. +#define bAGCAddress 0x3f
  136699. +#define bRxHPTx 0x7000
  136700. +#define bRxHPT2R 0x38000
  136701. +#define bRxHPCCKIni 0xc0000
  136702. +#define bAGCTxCode 0xc00000
  136703. +#define bAGCRxCode 0x300000
  136704. +
  136705. +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1
  136706. +#define b3WireAddressLength 0x400
  136707. +
  136708. +#define b3WireRFPowerDown 0x1 // Useless now
  136709. +//#define bHWSISelect 0x8
  136710. +#define b5GPAPEPolarity 0x40000000
  136711. +#define b2GPAPEPolarity 0x80000000
  136712. +#define bRFSW_TxDefaultAnt 0x3
  136713. +#define bRFSW_TxOptionAnt 0x30
  136714. +#define bRFSW_RxDefaultAnt 0x300
  136715. +#define bRFSW_RxOptionAnt 0x3000
  136716. +#define bRFSI_3WireData 0x1
  136717. +#define bRFSI_3WireClock 0x2
  136718. +#define bRFSI_3WireLoad 0x4
  136719. +#define bRFSI_3WireRW 0x8
  136720. +#define bRFSI_3Wire 0xf
  136721. +
  136722. +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW
  136723. +
  136724. +#define bRFSI_TRSW 0x20 // Useless now
  136725. +#define bRFSI_TRSWB 0x40
  136726. +#define bRFSI_ANTSW 0x100
  136727. +#define bRFSI_ANTSWB 0x200
  136728. +#define bRFSI_PAPE 0x400
  136729. +#define bRFSI_PAPE5G 0x800
  136730. +#define bBandSelect 0x1
  136731. +#define bHTSIG2_GI 0x80
  136732. +#define bHTSIG2_Smoothing 0x01
  136733. +#define bHTSIG2_Sounding 0x02
  136734. +#define bHTSIG2_Aggreaton 0x08
  136735. +#define bHTSIG2_STBC 0x30
  136736. +#define bHTSIG2_AdvCoding 0x40
  136737. +#define bHTSIG2_NumOfHTLTF 0x300
  136738. +#define bHTSIG2_CRC8 0x3fc
  136739. +#define bHTSIG1_MCS 0x7f
  136740. +#define bHTSIG1_BandWidth 0x80
  136741. +#define bHTSIG1_HTLength 0xffff
  136742. +#define bLSIG_Rate 0xf
  136743. +#define bLSIG_Reserved 0x10
  136744. +#define bLSIG_Length 0x1fffe
  136745. +#define bLSIG_Parity 0x20
  136746. +#define bCCKRxPhase 0x4
  136747. +#if (RTL92SE_FPGA_VERIFY == 1)
  136748. +#define bLSSIReadAddress 0x3f000000 //LSSI "Read" Address // Reg 0x824 rFPGA0_XA_HSSIParameter2
  136749. +#else
  136750. +#define bLSSIReadAddress 0x7f800000 // T65 RF
  136751. +#endif
  136752. +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal
  136753. +#if (RTL92SE_FPGA_VERIFY == 1)
  136754. +#define bLSSIReadBackData 0xfff // Reg 0x8a0 rFPGA0_XA_LSSIReadBack
  136755. +#else
  136756. +#define bLSSIReadBackData 0xfffff // T65 RF
  136757. +#endif
  136758. +#define bLSSIReadOKFlag 0x1000 // Useless now
  136759. +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz
  136760. +#define bRegulator0Standby 0x1
  136761. +#define bRegulatorPLLStandby 0x2
  136762. +#define bRegulator1Standby 0x4
  136763. +#define bPLLPowerUp 0x8
  136764. +#define bDPLLPowerUp 0x10
  136765. +#define bDA10PowerUp 0x20
  136766. +#define bAD7PowerUp 0x200
  136767. +#define bDA6PowerUp 0x2000
  136768. +#define bXtalPowerUp 0x4000
  136769. +#define b40MDClkPowerUP 0x8000
  136770. +#define bDA6DebugMode 0x20000
  136771. +#define bDA6Swing 0x380000
  136772. +
  136773. +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ
  136774. +
  136775. +#define b80MClkDelay 0x18000000 // Useless
  136776. +#define bAFEWatchDogEnable 0x20000000
  136777. +
  136778. +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap
  136779. +#define bXtalCap23 0x3
  136780. +#define bXtalCap92x 0x0f000000
  136781. +#define bXtalCap 0x0f000000
  136782. +
  136783. +#define bIntDifClkEnable 0x400 // Useless
  136784. +#define bExtSigClkEnable 0x800
  136785. +#define bBandgapMbiasPowerUp 0x10000
  136786. +#define bAD11SHGain 0xc0000
  136787. +#define bAD11InputRange 0x700000
  136788. +#define bAD11OPCurrent 0x3800000
  136789. +#define bIPathLoopback 0x4000000
  136790. +#define bQPathLoopback 0x8000000
  136791. +#define bAFELoopback 0x10000000
  136792. +#define bDA10Swing 0x7e0
  136793. +#define bDA10Reverse 0x800
  136794. +#define bDAClkSource 0x1000
  136795. +#define bAD7InputRange 0x6000
  136796. +#define bAD7Gain 0x38000
  136797. +#define bAD7OutputCMMode 0x40000
  136798. +#define bAD7InputCMMode 0x380000
  136799. +#define bAD7Current 0xc00000
  136800. +#define bRegulatorAdjust 0x7000000
  136801. +#define bAD11PowerUpAtTx 0x1
  136802. +#define bDA10PSAtTx 0x10
  136803. +#define bAD11PowerUpAtRx 0x100
  136804. +#define bDA10PSAtRx 0x1000
  136805. +#define bCCKRxAGCFormat 0x200
  136806. +#define bPSDFFTSamplepPoint 0xc000
  136807. +#define bPSDAverageNum 0x3000
  136808. +#define bIQPathControl 0xc00
  136809. +#define bPSDFreq 0x3ff
  136810. +#define bPSDAntennaPath 0x30
  136811. +#define bPSDIQSwitch 0x40
  136812. +#define bPSDRxTrigger 0x400000
  136813. +#define bPSDTxTrigger 0x80000000
  136814. +#define bPSDSineToneScale 0x7f000000
  136815. +#define bPSDReport 0xffff
  136816. +
  136817. +// 3. Page9(0x900)
  136818. +#define bOFDMTxSC 0x30000000 // Useless
  136819. +#define bCCKTxOn 0x1
  136820. +#define bOFDMTxOn 0x2
  136821. +#define bDebugPage 0xfff //reset debug page and also HWord, LWord
  136822. +#define bDebugItem 0xff //reset debug page and LWord
  136823. +#define bAntL 0x10
  136824. +#define bAntNonHT 0x100
  136825. +#define bAntHT1 0x1000
  136826. +#define bAntHT2 0x10000
  136827. +#define bAntHT1S1 0x100000
  136828. +#define bAntNonHTS1 0x1000000
  136829. +
  136830. +// 4. PageA(0xA00)
  136831. +#define bCCKBBMode 0x3 // Useless
  136832. +#define bCCKTxPowerSaving 0x80
  136833. +#define bCCKRxPowerSaving 0x40
  136834. +
  136835. +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch
  136836. +
  136837. +#define bCCKScramble 0x8 // Useless
  136838. +#define bCCKAntDiversity 0x8000
  136839. +#define bCCKCarrierRecovery 0x4000
  136840. +#define bCCKTxRate 0x3000
  136841. +#define bCCKDCCancel 0x0800
  136842. +#define bCCKISICancel 0x0400
  136843. +#define bCCKMatchFilter 0x0200
  136844. +#define bCCKEqualizer 0x0100
  136845. +#define bCCKPreambleDetect 0x800000
  136846. +#define bCCKFastFalseCCA 0x400000
  136847. +#define bCCKChEstStart 0x300000
  136848. +#define bCCKCCACount 0x080000
  136849. +#define bCCKcs_lim 0x070000
  136850. +#define bCCKBistMode 0x80000000
  136851. +#define bCCKCCAMask 0x40000000
  136852. +#define bCCKTxDACPhase 0x4
  136853. +#define bCCKRxADCPhase 0x20000000 //r_rx_clk
  136854. +#define bCCKr_cp_mode0 0x0100
  136855. +#define bCCKTxDCOffset 0xf0
  136856. +#define bCCKRxDCOffset 0xf
  136857. +#define bCCKCCAMode 0xc000
  136858. +#define bCCKFalseCS_lim 0x3f00
  136859. +#define bCCKCS_ratio 0xc00000
  136860. +#define bCCKCorgBit_sel 0x300000
  136861. +#define bCCKPD_lim 0x0f0000
  136862. +#define bCCKNewCCA 0x80000000
  136863. +#define bCCKRxHPofIG 0x8000
  136864. +#define bCCKRxIG 0x7f00
  136865. +#define bCCKLNAPolarity 0x800000
  136866. +#define bCCKRx1stGain 0x7f0000
  136867. +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity
  136868. +#define bCCKRxAGCSatLevel 0x1f000000
  136869. +#define bCCKRxAGCSatCount 0xe0
  136870. +#define bCCKRxRFSettle 0x1f //AGCsamp_dly
  136871. +#define bCCKFixedRxAGC 0x8000
  136872. +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824
  136873. +#define bCCKAntennaPolarity 0x2000
  136874. +#define bCCKTxFilterType 0x0c00
  136875. +#define bCCKRxAGCReportType 0x0300
  136876. +#define bCCKRxDAGCEn 0x80000000
  136877. +#define bCCKRxDAGCPeriod 0x20000000
  136878. +#define bCCKRxDAGCSatLevel 0x1f000000
  136879. +#define bCCKTimingRecovery 0x800000
  136880. +#define bCCKTxC0 0x3f0000
  136881. +#define bCCKTxC1 0x3f000000
  136882. +#define bCCKTxC2 0x3f
  136883. +#define bCCKTxC3 0x3f00
  136884. +#define bCCKTxC4 0x3f0000
  136885. +#define bCCKTxC5 0x3f000000
  136886. +#define bCCKTxC6 0x3f
  136887. +#define bCCKTxC7 0x3f00
  136888. +#define bCCKDebugPort 0xff0000
  136889. +#define bCCKDACDebug 0x0f000000
  136890. +#define bCCKFalseAlarmEnable 0x8000
  136891. +#define bCCKFalseAlarmRead 0x4000
  136892. +#define bCCKTRSSI 0x7f
  136893. +#define bCCKRxAGCReport 0xfe
  136894. +#define bCCKRxReport_AntSel 0x80000000
  136895. +#define bCCKRxReport_MFOff 0x40000000
  136896. +#define bCCKRxRxReport_SQLoss 0x20000000
  136897. +#define bCCKRxReport_Pktloss 0x10000000
  136898. +#define bCCKRxReport_Lockedbit 0x08000000
  136899. +#define bCCKRxReport_RateError 0x04000000
  136900. +#define bCCKRxReport_RxRate 0x03000000
  136901. +#define bCCKRxFACounterLower 0xff
  136902. +#define bCCKRxFACounterUpper 0xff000000
  136903. +#define bCCKRxHPAGCStart 0xe000
  136904. +#define bCCKRxHPAGCFinal 0x1c00
  136905. +#define bCCKRxFalseAlarmEnable 0x8000
  136906. +#define bCCKFACounterFreeze 0x4000
  136907. +#define bCCKTxPathSel 0x10000000
  136908. +#define bCCKDefaultRxPath 0xc000000
  136909. +#define bCCKOptionRxPath 0x3000000
  136910. +
  136911. +// 5. PageC(0xC00)
  136912. +#define bNumOfSTF 0x3 // Useless
  136913. +#define bShift_L 0xc0
  136914. +#define bGI_TH 0xc
  136915. +#define bRxPathA 0x1
  136916. +#define bRxPathB 0x2
  136917. +#define bRxPathC 0x4
  136918. +#define bRxPathD 0x8
  136919. +#define bTxPathA 0x1
  136920. +#define bTxPathB 0x2
  136921. +#define bTxPathC 0x4
  136922. +#define bTxPathD 0x8
  136923. +#define bTRSSIFreq 0x200
  136924. +#define bADCBackoff 0x3000
  136925. +#define bDFIRBackoff 0xc000
  136926. +#define bTRSSILatchPhase 0x10000
  136927. +#define bRxIDCOffset 0xff
  136928. +#define bRxQDCOffset 0xff00
  136929. +#define bRxDFIRMode 0x1800000
  136930. +#define bRxDCNFType 0xe000000
  136931. +#define bRXIQImb_A 0x3ff
  136932. +#define bRXIQImb_B 0xfc00
  136933. +#define bRXIQImb_C 0x3f0000
  136934. +#define bRXIQImb_D 0xffc00000
  136935. +#define bDC_dc_Notch 0x60000
  136936. +#define bRxNBINotch 0x1f000000
  136937. +#define bPD_TH 0xf
  136938. +#define bPD_TH_Opt2 0xc000
  136939. +#define bPWED_TH 0x700
  136940. +#define bIfMF_Win_L 0x800
  136941. +#define bPD_Option 0x1000
  136942. +#define bMF_Win_L 0xe000
  136943. +#define bBW_Search_L 0x30000
  136944. +#define bwin_enh_L 0xc0000
  136945. +#define bBW_TH 0x700000
  136946. +#define bED_TH2 0x3800000
  136947. +#define bBW_option 0x4000000
  136948. +#define bRatio_TH 0x18000000
  136949. +#define bWindow_L 0xe0000000
  136950. +#define bSBD_Option 0x1
  136951. +#define bFrame_TH 0x1c
  136952. +#define bFS_Option 0x60
  136953. +#define bDC_Slope_check 0x80
  136954. +#define bFGuard_Counter_DC_L 0xe00
  136955. +#define bFrame_Weight_Short 0x7000
  136956. +#define bSub_Tune 0xe00000
  136957. +#define bFrame_DC_Length 0xe000000
  136958. +#define bSBD_start_offset 0x30000000
  136959. +#define bFrame_TH_2 0x7
  136960. +#define bFrame_GI2_TH 0x38
  136961. +#define bGI2_Sync_en 0x40
  136962. +#define bSarch_Short_Early 0x300
  136963. +#define bSarch_Short_Late 0xc00
  136964. +#define bSarch_GI2_Late 0x70000
  136965. +#define bCFOAntSum 0x1
  136966. +#define bCFOAcc 0x2
  136967. +#define bCFOStartOffset 0xc
  136968. +#define bCFOLookBack 0x70
  136969. +#define bCFOSumWeight 0x80
  136970. +#define bDAGCEnable 0x10000
  136971. +#define bTXIQImb_A 0x3ff
  136972. +#define bTXIQImb_B 0xfc00
  136973. +#define bTXIQImb_C 0x3f0000
  136974. +#define bTXIQImb_D 0xffc00000
  136975. +#define bTxIDCOffset 0xff
  136976. +#define bTxQDCOffset 0xff00
  136977. +#define bTxDFIRMode 0x10000
  136978. +#define bTxPesudoNoiseOn 0x4000000
  136979. +#define bTxPesudoNoise_A 0xff
  136980. +#define bTxPesudoNoise_B 0xff00
  136981. +#define bTxPesudoNoise_C 0xff0000
  136982. +#define bTxPesudoNoise_D 0xff000000
  136983. +#define bCCADropOption 0x20000
  136984. +#define bCCADropThres 0xfff00000
  136985. +#define bEDCCA_H 0xf
  136986. +#define bEDCCA_L 0xf0
  136987. +#define bLambda_ED 0x300
  136988. +#define bRxInitialGain 0x7f
  136989. +#define bRxAntDivEn 0x80
  136990. +#define bRxAGCAddressForLNA 0x7f00
  136991. +#define bRxHighPowerFlow 0x8000
  136992. +#define bRxAGCFreezeThres 0xc0000
  136993. +#define bRxFreezeStep_AGC1 0x300000
  136994. +#define bRxFreezeStep_AGC2 0xc00000
  136995. +#define bRxFreezeStep_AGC3 0x3000000
  136996. +#define bRxFreezeStep_AGC0 0xc000000
  136997. +#define bRxRssi_Cmp_En 0x10000000
  136998. +#define bRxQuickAGCEn 0x20000000
  136999. +#define bRxAGCFreezeThresMode 0x40000000
  137000. +#define bRxOverFlowCheckType 0x80000000
  137001. +#define bRxAGCShift 0x7f
  137002. +#define bTRSW_Tri_Only 0x80
  137003. +#define bPowerThres 0x300
  137004. +#define bRxAGCEn 0x1
  137005. +#define bRxAGCTogetherEn 0x2
  137006. +#define bRxAGCMin 0x4
  137007. +#define bRxHP_Ini 0x7
  137008. +#define bRxHP_TRLNA 0x70
  137009. +#define bRxHP_RSSI 0x700
  137010. +#define bRxHP_BBP1 0x7000
  137011. +#define bRxHP_BBP2 0x70000
  137012. +#define bRxHP_BBP3 0x700000
  137013. +#define bRSSI_H 0x7f0000 //the threshold for high power
  137014. +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity
  137015. +#define bRxSettle_TRSW 0x7
  137016. +#define bRxSettle_LNA 0x38
  137017. +#define bRxSettle_RSSI 0x1c0
  137018. +#define bRxSettle_BBP 0xe00
  137019. +#define bRxSettle_RxHP 0x7000
  137020. +#define bRxSettle_AntSW_RSSI 0x38000
  137021. +#define bRxSettle_AntSW 0xc0000
  137022. +#define bRxProcessTime_DAGC 0x300000
  137023. +#define bRxSettle_HSSI 0x400000
  137024. +#define bRxProcessTime_BBPPW 0x800000
  137025. +#define bRxAntennaPowerShift 0x3000000
  137026. +#define bRSSITableSelect 0xc000000
  137027. +#define bRxHP_Final 0x7000000
  137028. +#define bRxHTSettle_BBP 0x7
  137029. +#define bRxHTSettle_HSSI 0x8
  137030. +#define bRxHTSettle_RxHP 0x70
  137031. +#define bRxHTSettle_BBPPW 0x80
  137032. +#define bRxHTSettle_Idle 0x300
  137033. +#define bRxHTSettle_Reserved 0x1c00
  137034. +#define bRxHTRxHPEn 0x8000
  137035. +#define bRxHTAGCFreezeThres 0x30000
  137036. +#define bRxHTAGCTogetherEn 0x40000
  137037. +#define bRxHTAGCMin 0x80000
  137038. +#define bRxHTAGCEn 0x100000
  137039. +#define bRxHTDAGCEn 0x200000
  137040. +#define bRxHTRxHP_BBP 0x1c00000
  137041. +#define bRxHTRxHP_Final 0xe0000000
  137042. +#define bRxPWRatioTH 0x3
  137043. +#define bRxPWRatioEn 0x4
  137044. +#define bRxMFHold 0x3800
  137045. +#define bRxPD_Delay_TH1 0x38
  137046. +#define bRxPD_Delay_TH2 0x1c0
  137047. +#define bRxPD_DC_COUNT_MAX 0x600
  137048. +//#define bRxMF_Hold 0x3800
  137049. +#define bRxPD_Delay_TH 0x8000
  137050. +#define bRxProcess_Delay 0xf0000
  137051. +#define bRxSearchrange_GI2_Early 0x700000
  137052. +#define bRxFrame_Guard_Counter_L 0x3800000
  137053. +#define bRxSGI_Guard_L 0xc000000
  137054. +#define bRxSGI_Search_L 0x30000000
  137055. +#define bRxSGI_TH 0xc0000000
  137056. +#define bDFSCnt0 0xff
  137057. +#define bDFSCnt1 0xff00
  137058. +#define bDFSFlag 0xf0000
  137059. +#define bMFWeightSum 0x300000
  137060. +#define bMinIdxTH 0x7f000000
  137061. +#define bDAFormat 0x40000
  137062. +#define bTxChEmuEnable 0x01000000
  137063. +#define bTRSWIsolation_A 0x7f
  137064. +#define bTRSWIsolation_B 0x7f00
  137065. +#define bTRSWIsolation_C 0x7f0000
  137066. +#define bTRSWIsolation_D 0x7f000000
  137067. +#define bExtLNAGain 0x7c00
  137068. +
  137069. +// 6. PageE(0xE00)
  137070. +#define bSTBCEn 0x4 // Useless
  137071. +#define bAntennaMapping 0x10
  137072. +#define bNss 0x20
  137073. +#define bCFOAntSumD 0x200
  137074. +#define bPHYCounterReset 0x8000000
  137075. +#define bCFOReportGet 0x4000000
  137076. +#define bOFDMContinueTx 0x10000000
  137077. +#define bOFDMSingleCarrier 0x20000000
  137078. +#define bOFDMSingleTone 0x40000000
  137079. +//#define bRxPath1 0x01
  137080. +//#define bRxPath2 0x02
  137081. +//#define bRxPath3 0x04
  137082. +//#define bRxPath4 0x08
  137083. +//#define bTxPath1 0x10
  137084. +//#define bTxPath2 0x20
  137085. +#define bHTDetect 0x100
  137086. +#define bCFOEn 0x10000
  137087. +#define bCFOValue 0xfff00000
  137088. +#define bSigTone_Re 0x3f
  137089. +#define bSigTone_Im 0x7f00
  137090. +#define bCounter_CCA 0xffff
  137091. +#define bCounter_ParityFail 0xffff0000
  137092. +#define bCounter_RateIllegal 0xffff
  137093. +#define bCounter_CRC8Fail 0xffff0000
  137094. +#define bCounter_MCSNoSupport 0xffff
  137095. +#define bCounter_FastSync 0xffff
  137096. +#define bShortCFO 0xfff
  137097. +#define bShortCFOTLength 12 //total
  137098. +#define bShortCFOFLength 11 //fraction
  137099. +#define bLongCFO 0x7ff
  137100. +#define bLongCFOTLength 11
  137101. +#define bLongCFOFLength 11
  137102. +#define bTailCFO 0x1fff
  137103. +#define bTailCFOTLength 13
  137104. +#define bTailCFOFLength 12
  137105. +#define bmax_en_pwdB 0xffff
  137106. +#define bCC_power_dB 0xffff0000
  137107. +#define bnoise_pwdB 0xffff
  137108. +#define bPowerMeasTLength 10
  137109. +#define bPowerMeasFLength 3
  137110. +#define bRx_HT_BW 0x1
  137111. +#define bRxSC 0x6
  137112. +#define bRx_HT 0x8
  137113. +#define bNB_intf_det_on 0x1
  137114. +#define bIntf_win_len_cfg 0x30
  137115. +#define bNB_Intf_TH_cfg 0x1c0
  137116. +#define bRFGain 0x3f
  137117. +#define bTableSel 0x40
  137118. +#define bTRSW 0x80
  137119. +#define bRxSNR_A 0xff
  137120. +#define bRxSNR_B 0xff00
  137121. +#define bRxSNR_C 0xff0000
  137122. +#define bRxSNR_D 0xff000000
  137123. +#define bSNREVMTLength 8
  137124. +#define bSNREVMFLength 1
  137125. +#define bCSI1st 0xff
  137126. +#define bCSI2nd 0xff00
  137127. +#define bRxEVM1st 0xff0000
  137128. +#define bRxEVM2nd 0xff000000
  137129. +#define bSIGEVM 0xff
  137130. +#define bPWDB 0xff00
  137131. +#define bSGIEN 0x10000
  137132. +
  137133. +#define bSFactorQAM1 0xf // Useless
  137134. +#define bSFactorQAM2 0xf0
  137135. +#define bSFactorQAM3 0xf00
  137136. +#define bSFactorQAM4 0xf000
  137137. +#define bSFactorQAM5 0xf0000
  137138. +#define bSFactorQAM6 0xf0000
  137139. +#define bSFactorQAM7 0xf00000
  137140. +#define bSFactorQAM8 0xf000000
  137141. +#define bSFactorQAM9 0xf0000000
  137142. +#define bCSIScheme 0x100000
  137143. +
  137144. +#define bNoiseLvlTopSet 0x3 // Useless
  137145. +#define bChSmooth 0x4
  137146. +#define bChSmoothCfg1 0x38
  137147. +#define bChSmoothCfg2 0x1c0
  137148. +#define bChSmoothCfg3 0xe00
  137149. +#define bChSmoothCfg4 0x7000
  137150. +#define bMRCMode 0x800000
  137151. +#define bTHEVMCfg 0x7000000
  137152. +
  137153. +#define bLoopFitType 0x1 // Useless
  137154. +#define bUpdCFO 0x40
  137155. +#define bUpdCFOOffData 0x80
  137156. +#define bAdvUpdCFO 0x100
  137157. +#define bAdvTimeCtrl 0x800
  137158. +#define bUpdClko 0x1000
  137159. +#define bFC 0x6000
  137160. +#define bTrackingMode 0x8000
  137161. +#define bPhCmpEnable 0x10000
  137162. +#define bUpdClkoLTF 0x20000
  137163. +#define bComChCFO 0x40000
  137164. +#define bCSIEstiMode 0x80000
  137165. +#define bAdvUpdEqz 0x100000
  137166. +#define bUChCfg 0x7000000
  137167. +#define bUpdEqz 0x8000000
  137168. +
  137169. +#define bTxAGCRate18_06 0x7f7f7f7f // Useless
  137170. +#define bTxAGCRate54_24 0x7f7f7f7f
  137171. +#define bTxAGCRateMCS32 0x7f
  137172. +#define bTxAGCRateCCK 0x7f00
  137173. +#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f
  137174. +#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f
  137175. +#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f
  137176. +#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f
  137177. +
  137178. +//Rx Pseduo noise
  137179. +#define bRxPesudoNoiseOn 0x20000000 // Useless
  137180. +#define bRxPesudoNoise_A 0xff
  137181. +#define bRxPesudoNoise_B 0xff00
  137182. +#define bRxPesudoNoise_C 0xff0000
  137183. +#define bRxPesudoNoise_D 0xff000000
  137184. +#define bPesudoNoiseState_A 0xffff
  137185. +#define bPesudoNoiseState_B 0xffff0000
  137186. +#define bPesudoNoiseState_C 0xffff
  137187. +#define bPesudoNoiseState_D 0xffff0000
  137188. +
  137189. +//7. RF Register
  137190. +//Zebra1
  137191. +#define bZebra1_HSSIEnable 0x8 // Useless
  137192. +#define bZebra1_TRxControl 0xc00
  137193. +#define bZebra1_TRxGainSetting 0x07f
  137194. +#define bZebra1_RxCorner 0xc00
  137195. +#define bZebra1_TxChargePump 0x38
  137196. +#define bZebra1_RxChargePump 0x7
  137197. +#define bZebra1_ChannelNum 0xf80
  137198. +#define bZebra1_TxLPFBW 0x400
  137199. +#define bZebra1_RxLPFBW 0x600
  137200. +
  137201. +//Zebra4
  137202. +#define bRTL8256RegModeCtrl1 0x100 // Useless
  137203. +#define bRTL8256RegModeCtrl0 0x40
  137204. +#define bRTL8256_TxLPFBW 0x18
  137205. +#define bRTL8256_RxLPFBW 0x600
  137206. +
  137207. +//RTL8258
  137208. +#define bRTL8258_TxLPFBW 0xc // Useless
  137209. +#define bRTL8258_RxLPFBW 0xc00
  137210. +#define bRTL8258_RSSILPFBW 0xc0
  137211. +
  137212. +
  137213. +//
  137214. +// Other Definition
  137215. +//
  137216. +
  137217. +//byte endable for sb_write
  137218. +#define bByte0 0x1 // Useless
  137219. +#define bByte1 0x2
  137220. +#define bByte2 0x4
  137221. +#define bByte3 0x8
  137222. +#define bWord0 0x3
  137223. +#define bWord1 0xc
  137224. +#define bDWord 0xf
  137225. +
  137226. +//for PutRegsetting & GetRegSetting BitMask
  137227. +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f
  137228. +#define bMaskByte1 0xff00
  137229. +#define bMaskByte2 0xff0000
  137230. +#define bMaskByte3 0xff000000
  137231. +#define bMaskHWord 0xffff0000
  137232. +#define bMaskLWord 0x0000ffff
  137233. +#define bMaskDWord 0xffffffff
  137234. +#define bMaskH4Bits 0xf0000000
  137235. +#define bMaskOFDM_D 0xffc00000
  137236. +#define bMaskCCK 0x3f3f3f3f
  137237. +#define bMask12Bits 0xfff
  137238. +
  137239. +//for PutRFRegsetting & GetRFRegSetting BitMask
  137240. +#if (RTL92SE_FPGA_VERIFY == 1)
  137241. +//#define bMask12Bits 0xfff // RF Reg mask bits
  137242. +//#define bMask20Bits 0xfff // RF Reg mask bits T65 RF
  137243. +#define bRFRegOffsetMask 0xfff
  137244. +#else
  137245. +//#define bMask12Bits 0xfffff // RF Reg mask bits
  137246. +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF
  137247. +#define bRFRegOffsetMask 0xfffff
  137248. +#endif
  137249. +#define bEnable 0x1 // Useless
  137250. +#define bDisable 0x0
  137251. +
  137252. +#define LeftAntenna 0x0 // Useless
  137253. +#define RightAntenna 0x1
  137254. +
  137255. +#define tCheckTxStatus 500 //500ms // Useless
  137256. +#define tUpdateRxCounter 100 //100ms
  137257. +
  137258. +#define rateCCK 0 // Useless
  137259. +#define rateOFDM 1
  137260. +#define rateHT 2
  137261. +
  137262. +//define Register-End
  137263. +#define bPMAC_End 0x1ff // Useless
  137264. +#define bFPGAPHY0_End 0x8ff
  137265. +#define bFPGAPHY1_End 0x9ff
  137266. +#define bCCKPHY0_End 0xaff
  137267. +#define bOFDMPHY0_End 0xcff
  137268. +#define bOFDMPHY1_End 0xdff
  137269. +
  137270. +//define max debug item in each debug page
  137271. +//#define bMaxItem_FPGA_PHY0 0x9
  137272. +//#define bMaxItem_FPGA_PHY1 0x3
  137273. +//#define bMaxItem_PHY_11B 0x16
  137274. +//#define bMaxItem_OFDM_PHY0 0x29
  137275. +//#define bMaxItem_OFDM_PHY1 0x0
  137276. +
  137277. +#define bPMACControl 0x0 // Useless
  137278. +#define bWMACControl 0x1
  137279. +#define bWNICControl 0x2
  137280. +
  137281. +#if 0
  137282. +#define ANTENNA_A 0x1 // Useless
  137283. +#define ANTENNA_B 0x2
  137284. +#define ANTENNA_AB 0x3 // ANTENNA_A|ANTENNA_B
  137285. +
  137286. +#define ANTENNA_C 0x4
  137287. +#define ANTENNA_D 0x8
  137288. +#endif
  137289. +
  137290. +#define RCR_AAP BIT(0) // accept all physical address
  137291. +#define RCR_APM BIT(1) // accept physical match
  137292. +#define RCR_AM BIT(2) // accept multicast
  137293. +#define RCR_AB BIT(3) // accept broadcast
  137294. +#define RCR_ACRC32 BIT(5) // accept error packet
  137295. +#define RCR_9356SEL BIT(6)
  137296. +#define RCR_AICV BIT(12) // Accept ICV error packet
  137297. +#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) // Rx FIFO threshold
  137298. +#define RCR_ADF BIT(18) // Accept Data(frame type) frame
  137299. +#define RCR_ACF BIT(19) // Accept control frame
  137300. +#define RCR_AMF BIT(20) // Accept management frame
  137301. +#define RCR_ADD3 BIT(21)
  137302. +#define RCR_APWRMGT BIT(22) // Accept power management packet
  137303. +#define RCR_CBSSID BIT(23) // Accept BSSID match packet
  137304. +#define RCR_ENMARP BIT(28) // enable mac auto reset phy
  137305. +#define RCR_EnCS1 BIT(29) // enable carrier sense method 1
  137306. +#define RCR_EnCS2 BIT(30) // enable carrier sense method 2
  137307. +#define RCR_OnlyErlPkt BIT(31) // Rx Early mode is performed for packet size greater than 1536
  137308. +
  137309. +/*--------------------------Define Parameters-------------------------------*/
  137310. +
  137311. +
  137312. +#endif //__INC_HAL8192SPHYREG_H
  137313. --- /dev/null
  137314. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_p2p.h
  137315. @@ -0,0 +1,160 @@
  137316. +/******************************************************************************
  137317. + *
  137318. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  137319. + *
  137320. + * This program is free software; you can redistribute it and/or modify it
  137321. + * under the terms of version 2 of the GNU General Public License as
  137322. + * published by the Free Software Foundation.
  137323. + *
  137324. + * This program is distributed in the hope that it will be useful, but WITHOUT
  137325. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  137326. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  137327. + * more details.
  137328. + *
  137329. + * You should have received a copy of the GNU General Public License along with
  137330. + * this program; if not, write to the Free Software Foundation, Inc.,
  137331. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  137332. + *
  137333. + *
  137334. + ******************************************************************************/
  137335. +#ifndef __RTW_P2P_H_
  137336. +#define __RTW_P2P_H_
  137337. +
  137338. +#include <drv_types.h>
  137339. +
  137340. +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137341. +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137342. +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr );
  137343. +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code);
  137344. +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137345. +#ifdef CONFIG_WFD
  137346. +u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137347. +u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled);
  137348. +u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137349. +u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137350. +u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137351. +u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137352. +u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137353. +u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137354. +u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137355. +u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137356. +u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137357. +u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
  137358. +#endif //CONFIG_WFD
  137359. +
  137360. +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);
  137361. +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta);
  137362. +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);
  137363. +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);
  137364. +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);
  137365. +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe);
  137366. +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );
  137367. +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );
  137368. +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );
  137369. +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);
  137370. +
  137371. +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType);
  137372. +
  137373. +#ifdef CONFIG_P2P_PS
  137374. +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength);
  137375. +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state);
  137376. +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue);
  137377. +#endif // CONFIG_P2P_PS
  137378. +
  137379. +#ifdef CONFIG_IOCTL_CFG80211
  137380. +void rtw_init_cfg80211_wifidirect_info( _adapter* padapter);
  137381. +int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx);
  137382. +void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32 *len);
  137383. +#endif //CONFIG_IOCTL_CFG80211
  137384. +
  137385. +void reset_global_wifidirect_info( _adapter* padapter );
  137386. +int rtw_init_wifi_display_info(_adapter* padapter);
  137387. +void rtw_init_wifidirect_timers(_adapter* padapter);
  137388. +void rtw_init_wifidirect_addrs(_adapter* padapter, u8 *dev_addr, u8 *iface_addr);
  137389. +void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role);
  137390. +int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role);
  137391. +
  137392. +static inline void _rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)
  137393. +{
  137394. + if(wdinfo->p2p_state != state) {
  137395. + //wdinfo->pre_p2p_state = wdinfo->p2p_state;
  137396. + wdinfo->p2p_state = state;
  137397. + }
  137398. +}
  137399. +static inline void _rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)
  137400. +{
  137401. + if(wdinfo->pre_p2p_state != state) {
  137402. + wdinfo->pre_p2p_state = state;
  137403. + }
  137404. +}
  137405. +#if 0
  137406. +static inline void _rtw_p2p_restore_state(struct wifidirect_info *wdinfo)
  137407. +{
  137408. + if(wdinfo->pre_p2p_state != -1) {
  137409. + wdinfo->p2p_state = wdinfo->pre_p2p_state;
  137410. + wdinfo->pre_p2p_state = -1;
  137411. + }
  137412. +}
  137413. +#endif
  137414. +static inline void _rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role)
  137415. +{
  137416. + if(wdinfo->role != role) {
  137417. + wdinfo->role = role;
  137418. + }
  137419. +}
  137420. +static inline int _rtw_p2p_state(struct wifidirect_info *wdinfo)
  137421. +{
  137422. + return wdinfo->p2p_state;
  137423. +}
  137424. +static inline int _rtw_p2p_pre_state(struct wifidirect_info *wdinfo)
  137425. +{
  137426. + return wdinfo->pre_p2p_state;
  137427. +}
  137428. +static inline int _rtw_p2p_role(struct wifidirect_info *wdinfo)
  137429. +{
  137430. + return wdinfo->role;
  137431. +}
  137432. +static inline bool _rtw_p2p_chk_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)
  137433. +{
  137434. + return wdinfo->p2p_state == state;
  137435. +}
  137436. +static inline bool _rtw_p2p_chk_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role)
  137437. +{
  137438. + return wdinfo->role == role;
  137439. +}
  137440. +
  137441. +#ifdef CONFIG_DBG_P2P
  137442. +void dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line);
  137443. +void dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line);
  137444. +//void dbg_rtw_p2p_restore_state(struct wifidirect_info *wdinfo, const char *caller, int line);
  137445. +void dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, const char *caller, int line);
  137446. +#define rtw_p2p_set_state(wdinfo, state) dbg_rtw_p2p_set_state(wdinfo, state, __FUNCTION__, __LINE__)
  137447. +#define rtw_p2p_set_pre_state(wdinfo, state) dbg_rtw_p2p_set_pre_state(wdinfo, state, __FUNCTION__, __LINE__)
  137448. +#define rtw_p2p_set_role(wdinfo, role) dbg_rtw_p2p_set_role(wdinfo, role, __FUNCTION__, __LINE__)
  137449. +//#define rtw_p2p_restore_state(wdinfo) dbg_rtw_p2p_restore_state(wdinfo, __FUNCTION__, __LINE__)
  137450. +#else //CONFIG_DBG_P2P
  137451. +#define rtw_p2p_set_state(wdinfo, state) _rtw_p2p_set_state(wdinfo, state)
  137452. +#define rtw_p2p_set_pre_state(wdinfo, state) _rtw_p2p_set_pre_state(wdinfo, state)
  137453. +#define rtw_p2p_set_role(wdinfo, role) _rtw_p2p_set_role(wdinfo, role)
  137454. +//#define rtw_p2p_restore_state(wdinfo) _rtw_p2p_restore_state(wdinfo)
  137455. +#endif //CONFIG_DBG_P2P
  137456. +
  137457. +#define rtw_p2p_state(wdinfo) _rtw_p2p_state(wdinfo)
  137458. +#define rtw_p2p_pre_state(wdinfo) _rtw_p2p_pre_state(wdinfo)
  137459. +#define rtw_p2p_role(wdinfo) _rtw_p2p_role(wdinfo)
  137460. +#define rtw_p2p_chk_state(wdinfo, state) _rtw_p2p_chk_state(wdinfo, state)
  137461. +#define rtw_p2p_chk_role(wdinfo, role) _rtw_p2p_chk_role(wdinfo, role)
  137462. +
  137463. +#define rtw_p2p_findphase_ex_set(wdinfo, value) \
  137464. + (wdinfo)->find_phase_state_exchange_cnt = (value)
  137465. +
  137466. +//is this find phase exchange for social channel scan?
  137467. +#define rtw_p2p_findphase_ex_is_social(wdinfo) \
  137468. + (wdinfo)->find_phase_state_exchange_cnt >= P2P_FINDPHASE_EX_SOCIAL_FIRST
  137469. +
  137470. +//should we need find phase exchange anymore?
  137471. +#define rtw_p2p_findphase_ex_is_needed(wdinfo) \
  137472. + ((wdinfo)->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_MAX && \
  137473. + (wdinfo)->find_phase_state_exchange_cnt != P2P_FINDPHASE_EX_NONE)
  137474. +
  137475. +#endif
  137476. --- /dev/null
  137477. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h
  137478. @@ -0,0 +1,362 @@
  137479. +/******************************************************************************
  137480. + *
  137481. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  137482. + *
  137483. + * This program is free software; you can redistribute it and/or modify it
  137484. + * under the terms of version 2 of the GNU General Public License as
  137485. + * published by the Free Software Foundation.
  137486. + *
  137487. + * This program is distributed in the hope that it will be useful, but WITHOUT
  137488. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  137489. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  137490. + * more details.
  137491. + *
  137492. + * You should have received a copy of the GNU General Public License along with
  137493. + * this program; if not, write to the Free Software Foundation, Inc.,
  137494. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  137495. + *
  137496. + *
  137497. + ******************************************************************************/
  137498. +#ifndef __RTW_PWRCTRL_H_
  137499. +#define __RTW_PWRCTRL_H_
  137500. +
  137501. +#include <drv_conf.h>
  137502. +#include <osdep_service.h>
  137503. +#include <drv_types.h>
  137504. +
  137505. +#ifdef CONFIG_HAS_EARLYSUSPEND
  137506. +#include <linux/earlysuspend.h>
  137507. +#endif //CONFIG_HAS_EARLYSUSPEND
  137508. +
  137509. +
  137510. +#define FW_PWR0 0
  137511. +#define FW_PWR1 1
  137512. +#define FW_PWR2 2
  137513. +#define FW_PWR3 3
  137514. +
  137515. +
  137516. +#define HW_PWR0 7
  137517. +#define HW_PWR1 6
  137518. +#define HW_PWR2 2
  137519. +#define HW_PWR3 0
  137520. +#define HW_PWR4 8
  137521. +
  137522. +#define FW_PWRMSK 0x7
  137523. +
  137524. +
  137525. +#define XMIT_ALIVE BIT(0)
  137526. +#define RECV_ALIVE BIT(1)
  137527. +#define CMD_ALIVE BIT(2)
  137528. +#define EVT_ALIVE BIT(3)
  137529. +
  137530. +
  137531. +enum Power_Mgnt
  137532. +{
  137533. + PS_MODE_ACTIVE = 0 ,
  137534. + PS_MODE_MIN ,
  137535. + PS_MODE_MAX ,
  137536. + PS_MODE_DTIM ,
  137537. + PS_MODE_VOIP ,
  137538. + PS_MODE_UAPSD_WMM ,
  137539. + PS_MODE_UAPSD ,
  137540. + PS_MODE_IBSS ,
  137541. + PS_MODE_WWLAN ,
  137542. + PM_Radio_Off ,
  137543. + PM_Card_Disable ,
  137544. + PS_MODE_NUM
  137545. +};
  137546. +
  137547. +
  137548. +/*
  137549. + BIT[2:0] = HW state
  137550. + BIT[3] = Protocol PS state, 0: register active state , 1: register sleep state
  137551. + BIT[4] = sub-state
  137552. +*/
  137553. +
  137554. +#define PS_DPS BIT(0)
  137555. +#define PS_LCLK (PS_DPS)
  137556. +#define PS_RF_OFF BIT(1)
  137557. +#define PS_ALL_ON BIT(2)
  137558. +#define PS_ST_ACTIVE BIT(3)
  137559. +
  137560. +#define PS_ISR_ENABLE BIT(4)
  137561. +#define PS_IMR_ENABLE BIT(5)
  137562. +#define PS_ACK BIT(6)
  137563. +#define PS_TOGGLE BIT(7)
  137564. +
  137565. +#define PS_STATE_MASK (0x0F)
  137566. +#define PS_STATE_HW_MASK (0x07)
  137567. +#define PS_SEQ_MASK (0xc0)
  137568. +
  137569. +#define PS_STATE(x) (PS_STATE_MASK & (x))
  137570. +#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x))
  137571. +#define PS_SEQ(x) (PS_SEQ_MASK & (x))
  137572. +
  137573. +#define PS_STATE_S0 (PS_DPS)
  137574. +#define PS_STATE_S1 (PS_LCLK)
  137575. +#define PS_STATE_S2 (PS_RF_OFF)
  137576. +#define PS_STATE_S3 (PS_ALL_ON)
  137577. +#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON))
  137578. +
  137579. +
  137580. +#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON))
  137581. +#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE))
  137582. +#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
  137583. +
  137584. +
  137585. +struct reportpwrstate_parm {
  137586. + unsigned char mode;
  137587. + unsigned char state; //the CPWM value
  137588. + unsigned short rsvd;
  137589. +};
  137590. +
  137591. +
  137592. +typedef _sema _pwrlock;
  137593. +
  137594. +
  137595. +__inline static void _init_pwrlock(_pwrlock *plock)
  137596. +{
  137597. + _rtw_init_sema(plock, 1);
  137598. +}
  137599. +
  137600. +__inline static void _free_pwrlock(_pwrlock *plock)
  137601. +{
  137602. + _rtw_free_sema(plock);
  137603. +}
  137604. +
  137605. +
  137606. +__inline static void _enter_pwrlock(_pwrlock *plock)
  137607. +{
  137608. + _rtw_down_sema(plock);
  137609. +}
  137610. +
  137611. +
  137612. +__inline static void _exit_pwrlock(_pwrlock *plock)
  137613. +{
  137614. + _rtw_up_sema(plock);
  137615. +}
  137616. +
  137617. +#define LPS_DELAY_TIME 1*HZ // 1 sec
  137618. +
  137619. +#define EXE_PWR_NONE 0x01
  137620. +#define EXE_PWR_IPS 0x02
  137621. +#define EXE_PWR_LPS 0x04
  137622. +
  137623. +// RF state.
  137624. +typedef enum _rt_rf_power_state
  137625. +{
  137626. + rf_on, // RF is on after RFSleep or RFOff
  137627. + rf_sleep, // 802.11 Power Save mode
  137628. + rf_off, // HW/SW Radio OFF or Inactive Power Save
  137629. + //=====Add the new RF state above this line=====//
  137630. + rf_max
  137631. +}rt_rf_power_state;
  137632. +
  137633. +// RF Off Level for IPS or HW/SW radio off
  137634. +#define RT_RF_OFF_LEVL_ASPM BIT(0) // PCI ASPM
  137635. +#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) // PCI clock request
  137636. +#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) // PCI D3 mode
  137637. +#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) // NIC halt, re-initialize hw parameters
  137638. +#define RT_RF_OFF_LEVL_FREE_FW BIT(4) // FW free, re-download the FW
  137639. +#define RT_RF_OFF_LEVL_FW_32K BIT(5) // FW in 32k
  137640. +#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) // Always enable ASPM and Clock Req in initialization.
  137641. +#define RT_RF_LPS_DISALBE_2R BIT(30) // When LPS is on, disable 2R if no packet is received or transmittd.
  137642. +#define RT_RF_LPS_LEVEL_ASPM BIT(31) // LPS with ASPM
  137643. +
  137644. +#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) ((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE)
  137645. +#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level &= (~(_PS_FLAG)))
  137646. +#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level |= _PS_FLAG)
  137647. +
  137648. +
  137649. +enum _PS_BBRegBackup_ {
  137650. + PSBBREG_RF0 = 0,
  137651. + PSBBREG_RF1,
  137652. + PSBBREG_RF2,
  137653. + PSBBREG_AFE0,
  137654. + PSBBREG_TOTALCNT
  137655. +};
  137656. +
  137657. +enum { // for ips_mode
  137658. + IPS_NONE=0,
  137659. + IPS_NORMAL,
  137660. + IPS_LEVEL_2,
  137661. +};
  137662. +
  137663. +struct pwrctrl_priv
  137664. +{
  137665. + _pwrlock lock;
  137666. + volatile u8 rpwm; // requested power state for fw
  137667. + volatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level
  137668. + volatile u8 tog; // toggling
  137669. + volatile u8 cpwm_tog; // toggling
  137670. + u8 pwr_mode;
  137671. + u8 smart_ps;
  137672. + u32 alives;
  137673. +
  137674. + u8 b_hw_radio_off;
  137675. + u8 reg_rfoff;
  137676. + u8 reg_pdnmode; //powerdown mode
  137677. + u32 rfoff_reason;
  137678. +
  137679. + //RF OFF Level
  137680. + u32 cur_ps_level;
  137681. + u32 reg_rfps_level;
  137682. +
  137683. +
  137684. +
  137685. +#ifdef CONFIG_PCI_HCI
  137686. + //just for PCIE ASPM
  137687. + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00.
  137688. + u8 b_support_backdoor;
  137689. +
  137690. + //just for PCIE ASPM
  137691. + u8 const_amdpci_aspm;
  137692. +#endif
  137693. +
  137694. + uint ips_enter_cnts;
  137695. + uint ips_leave_cnts;
  137696. +
  137697. + u8 ips_mode;
  137698. + u8 ips_mode_req; // used to accept the mode setting request, will update to ipsmode later
  137699. + uint bips_processing;
  137700. + u32 ips_deny_time; /* will deny IPS when system time is smaller than this */
  137701. + u8 ps_processing; /* temporarily used to mark whether in rtw_ps_processor */
  137702. +
  137703. + u8 bLeisurePs;
  137704. + u8 LpsIdleCount;
  137705. + u8 power_mgnt;
  137706. + u8 bFwCurrentInPSMode;
  137707. + u32 DelayLPSLastTimeStamp;
  137708. +
  137709. + s32 pnp_current_pwr_state;
  137710. + u8 pnp_bstop_trx;
  137711. +
  137712. +
  137713. + u8 bInternalAutoSuspend;
  137714. + u8 bInSuspend;
  137715. + u8 bSupportRemoteWakeup;
  137716. +#ifdef CONFIG_WOWLAN
  137717. + u8 wowlan_mode;
  137718. + u8 wowlan_pattern;
  137719. + u8 wowlan_magic;
  137720. + u8 wowlan_unicast;
  137721. + u8 wowlan_pattern_idx;
  137722. + u32 wowlan_pattern_context[8][5];
  137723. +#endif // CONFIG_WOWLAN
  137724. + _timer pwr_state_check_timer;
  137725. + int pwr_state_check_interval;
  137726. + u8 pwr_state_check_cnts;
  137727. +
  137728. + int ps_flag;
  137729. +
  137730. + rt_rf_power_state rf_pwrstate;//cur power state
  137731. + //rt_rf_power_state current_rfpwrstate;
  137732. + rt_rf_power_state change_rfpwrstate;
  137733. +
  137734. + u8 bHWPowerdown;//if support hw power down
  137735. + u8 bHWPwrPindetect;
  137736. + u8 bkeepfwalive;
  137737. + u8 brfoffbyhw;
  137738. + unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT];
  137739. +
  137740. + #ifdef CONFIG_RESUME_IN_WORKQUEUE
  137741. + struct workqueue_struct *rtw_workqueue;
  137742. + _workitem resume_work;
  137743. + #endif
  137744. +
  137745. + #ifdef CONFIG_HAS_EARLYSUSPEND
  137746. + struct early_suspend early_suspend;
  137747. + u8 do_late_resume;
  137748. + #endif //CONFIG_HAS_EARLYSUSPEND
  137749. +
  137750. + #ifdef CONFIG_ANDROID_POWER
  137751. + android_early_suspend_t early_suspend;
  137752. + u8 do_late_resume;
  137753. + #endif
  137754. +
  137755. +};
  137756. +
  137757. +#define rtw_get_ips_mode_req(pwrctrlpriv) \
  137758. + (pwrctrlpriv)->ips_mode_req
  137759. +
  137760. +#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \
  137761. + (pwrctrlpriv)->ips_mode_req = (ips_mode)
  137762. +
  137763. +#define RTW_PWR_STATE_CHK_INTERVAL 2000
  137764. +
  137765. +#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \
  137766. + do { \
  137767. + /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \
  137768. + _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \
  137769. + } while(0)
  137770. +
  137771. +#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \
  137772. + _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_interval)
  137773. +
  137774. +extern void rtw_init_pwrctrl_priv(_adapter *adapter);
  137775. +extern void rtw_free_pwrctrl_priv(_adapter * adapter);
  137776. +
  137777. +#ifdef CONFIG_LPS_LCLK
  137778. +extern s32 rtw_register_tx_alive(PADAPTER padapter);
  137779. +extern void rtw_unregister_tx_alive(PADAPTER padapter);
  137780. +extern s32 rtw_register_rx_alive(PADAPTER padapter);
  137781. +extern void rtw_unregister_rx_alive(PADAPTER padapter);
  137782. +extern s32 rtw_register_cmd_alive(PADAPTER padapter);
  137783. +extern void rtw_unregister_cmd_alive(PADAPTER padapter);
  137784. +extern s32 rtw_register_evt_alive(PADAPTER padapter);
  137785. +extern void rtw_unregister_evt_alive(PADAPTER padapter);
  137786. +extern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportpwrstate);
  137787. +#endif
  137788. +
  137789. +extern void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps);
  137790. +extern void rtw_set_rpwm(_adapter * padapter, u8 val8);
  137791. +extern void LeaveAllPowerSaveMode(PADAPTER Adapter);
  137792. +#ifdef CONFIG_IPS
  137793. +void _ips_enter(_adapter * padapter);
  137794. +void ips_enter(_adapter * padapter);
  137795. +int _ips_leave(_adapter * padapter);
  137796. +int ips_leave(_adapter * padapter);
  137797. +#endif
  137798. +
  137799. +void rtw_ps_processor(_adapter*padapter);
  137800. +
  137801. +#ifdef CONFIG_AUTOSUSPEND
  137802. +int autoresume_enter(_adapter* padapter);
  137803. +#endif
  137804. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  137805. +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter );
  137806. +#endif
  137807. +
  137808. +
  137809. +#ifdef CONFIG_LPS
  137810. +void LPS_Enter(PADAPTER padapter);
  137811. +void LPS_Leave(PADAPTER padapter);
  137812. +#endif
  137813. +
  137814. +#ifdef CONFIG_RESUME_IN_WORKQUEUE
  137815. +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv);
  137816. +#endif //CONFIG_RESUME_IN_WORKQUEUE
  137817. +
  137818. +#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER)
  137819. +bool rtw_is_earlysuspend_registered(struct pwrctrl_priv *pwrpriv);
  137820. +bool rtw_is_do_late_resume(struct pwrctrl_priv *pwrpriv);
  137821. +void rtw_set_do_late_resume(struct pwrctrl_priv *pwrpriv, bool enable);
  137822. +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv);
  137823. +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv);
  137824. +#else
  137825. +#define rtw_is_earlysuspend_registered(pwrpriv) _FALSE
  137826. +#define rtw_is_do_late_resume(pwrpriv) _FALSE
  137827. +#define rtw_set_do_late_resume(pwrpriv, enable) do {} while (0)
  137828. +#define rtw_register_early_suspend(pwrpriv) do {} while (0)
  137829. +#define rtw_unregister_early_suspend(pwrpriv) do {} while (0)
  137830. +#endif /* CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER */
  137831. +
  137832. +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val);
  137833. +void rtw_set_ips_deny(_adapter *padapter, u32 ms);
  137834. +int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller);
  137835. +#define rtw_pwr_wakeup(adapter) _rtw_pwr_wakeup(adapter, RTW_PWR_STATE_CHK_INTERVAL, __FUNCTION__)
  137836. +#define rtw_pwr_wakeup_ex(adapter, ips_deffer_ms) _rtw_pwr_wakeup(adapter, ips_deffer_ms, __FUNCTION__)
  137837. +int rtw_pm_set_ips(_adapter *padapter, u8 mode);
  137838. +int rtw_pm_set_lps(_adapter *padapter, u8 mode);
  137839. +
  137840. +#endif //__RTL871X_PWRCTRL_H_
  137841. --- /dev/null
  137842. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_qos.h
  137843. @@ -0,0 +1,39 @@
  137844. +/******************************************************************************
  137845. + *
  137846. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  137847. + *
  137848. + * This program is free software; you can redistribute it and/or modify it
  137849. + * under the terms of version 2 of the GNU General Public License as
  137850. + * published by the Free Software Foundation.
  137851. + *
  137852. + * This program is distributed in the hope that it will be useful, but WITHOUT
  137853. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  137854. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  137855. + * more details.
  137856. + *
  137857. + * You should have received a copy of the GNU General Public License along with
  137858. + * this program; if not, write to the Free Software Foundation, Inc.,
  137859. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  137860. + *
  137861. + *
  137862. + ******************************************************************************/
  137863. +
  137864. +
  137865. +#ifndef _RTW_QOS_H_
  137866. +#define _RTW_QOS_H_
  137867. +#include <drv_conf.h>
  137868. +#include <osdep_service.h>
  137869. +
  137870. +
  137871. +
  137872. +
  137873. +
  137874. +
  137875. +struct qos_priv {
  137876. +
  137877. + unsigned int qos_option; //bit mask option: u-apsd, s-apsd, ts, block ack...
  137878. +
  137879. +};
  137880. +
  137881. +
  137882. +#endif //_RTL871X_QOS_H_
  137883. --- /dev/null
  137884. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_recv.h
  137885. @@ -0,0 +1,730 @@
  137886. +/******************************************************************************
  137887. + *
  137888. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  137889. + *
  137890. + * This program is free software; you can redistribute it and/or modify it
  137891. + * under the terms of version 2 of the GNU General Public License as
  137892. + * published by the Free Software Foundation.
  137893. + *
  137894. + * This program is distributed in the hope that it will be useful, but WITHOUT
  137895. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  137896. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  137897. + * more details.
  137898. + *
  137899. + * You should have received a copy of the GNU General Public License along with
  137900. + * this program; if not, write to the Free Software Foundation, Inc.,
  137901. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  137902. + *
  137903. + *
  137904. + ******************************************************************************/
  137905. +#ifndef _RTW_RECV_H_
  137906. +#define _RTW_RECV_H_
  137907. +
  137908. +#include <drv_conf.h>
  137909. +#include <osdep_service.h>
  137910. +#include <drv_types.h>
  137911. +
  137912. +
  137913. +#define NR_RECVFRAME 256
  137914. +
  137915. +#define RXFRAME_ALIGN 8
  137916. +#define RXFRAME_ALIGN_SZ (1<<RXFRAME_ALIGN)
  137917. +
  137918. +#define MAX_RXFRAME_CNT 512
  137919. +#define MAX_RX_NUMBLKS (32)
  137920. +#define RECVFRAME_HDR_ALIGN 128
  137921. +
  137922. +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
  137923. +
  137924. +static u8 SNAP_ETH_TYPE_IPX[2] = {0x81, 0x37};
  137925. +
  137926. +static u8 SNAP_ETH_TYPE_APPLETALK_AARP[2] = {0x80, 0xf3};
  137927. +static u8 SNAP_ETH_TYPE_APPLETALK_DDP[2] = {0x80, 0x9b};
  137928. +static u8 SNAP_ETH_TYPE_TDLS[2] = {0x89, 0x0d};
  137929. +static u8 SNAP_HDR_APPLETALK_DDP[3] = {0x08, 0x00, 0x07}; // Datagram Delivery Protocol
  137930. +
  137931. +static u8 oui_8021h[] = {0x00, 0x00, 0xf8};
  137932. +static u8 oui_rfc1042[]= {0x00,0x00,0x00};
  137933. +
  137934. +#define MAX_SUBFRAME_COUNT 64
  137935. +static u8 rtw_rfc1042_header[] =
  137936. +{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
  137937. +/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
  137938. +static u8 rtw_bridge_tunnel_header[] =
  137939. +{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
  137940. +
  137941. +//for Rx reordering buffer control
  137942. +struct recv_reorder_ctrl
  137943. +{
  137944. + _adapter *padapter;
  137945. + u8 enable;
  137946. + u16 indicate_seq;//=wstart_b, init_value=0xffff
  137947. + u16 wend_b;
  137948. + u8 wsize_b;
  137949. + _queue pending_recvframe_queue;
  137950. + _timer reordering_ctrl_timer;
  137951. +};
  137952. +
  137953. +struct stainfo_rxcache {
  137954. + u16 tid_rxseq[16];
  137955. +/*
  137956. + unsigned short tid0_rxseq;
  137957. + unsigned short tid1_rxseq;
  137958. + unsigned short tid2_rxseq;
  137959. + unsigned short tid3_rxseq;
  137960. + unsigned short tid4_rxseq;
  137961. + unsigned short tid5_rxseq;
  137962. + unsigned short tid6_rxseq;
  137963. + unsigned short tid7_rxseq;
  137964. + unsigned short tid8_rxseq;
  137965. + unsigned short tid9_rxseq;
  137966. + unsigned short tid10_rxseq;
  137967. + unsigned short tid11_rxseq;
  137968. + unsigned short tid12_rxseq;
  137969. + unsigned short tid13_rxseq;
  137970. + unsigned short tid14_rxseq;
  137971. + unsigned short tid15_rxseq;
  137972. +*/
  137973. +};
  137974. +
  137975. +
  137976. +struct smooth_rssi_data {
  137977. + u32 elements[100]; //array to store values
  137978. + u32 index; //index to current array to store
  137979. + u32 total_num; //num of valid elements
  137980. + u32 total_val; //sum of valid elements
  137981. +};
  137982. +
  137983. +struct signal_stat {
  137984. + u8 update_req; //used to indicate
  137985. + u8 avg_val; //avg of valid elements
  137986. + u32 total_num; //num of valid elements
  137987. + u32 total_val; //sum of valid elements
  137988. +};
  137989. +
  137990. +struct rx_pkt_attrib
  137991. +{
  137992. + u16 pkt_len;
  137993. + u8 physt;
  137994. + u8 drvinfo_sz;
  137995. + u8 shift_sz;
  137996. + u8 hdrlen; //the WLAN Header Len
  137997. + u8 to_fr_ds;
  137998. + u8 amsdu;
  137999. + u8 qos;
  138000. + u8 priority;
  138001. + u8 pw_save;
  138002. + u8 mdata;
  138003. + u16 seq_num;
  138004. + u8 frag_num;
  138005. + u8 mfrag;
  138006. + u8 order;
  138007. + u8 privacy; //in frame_ctrl field
  138008. + u8 bdecrypted;
  138009. + u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
  138010. + u8 iv_len;
  138011. + u8 icv_len;
  138012. + u8 crc_err;
  138013. + u8 icv_err;
  138014. +
  138015. + u16 eth_type;
  138016. +
  138017. + u8 dst[ETH_ALEN];
  138018. + u8 src[ETH_ALEN];
  138019. + u8 ta[ETH_ALEN];
  138020. + u8 ra[ETH_ALEN];
  138021. + u8 bssid[ETH_ALEN];
  138022. +
  138023. + u8 ack_policy;
  138024. +
  138025. +//#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  138026. + u8 tcpchk_valid; // 0: invalid, 1: valid
  138027. + u8 ip_chkrpt; //0: incorrect, 1: correct
  138028. + u8 tcp_chkrpt; //0: incorrect, 1: correct
  138029. +//#endif
  138030. + u8 key_index;
  138031. +
  138032. + u8 mcs_rate;
  138033. + u8 rxht;
  138034. + u8 sgi;
  138035. + u8 signal_qual;
  138036. + s8 rx_mimo_signal_qual[2];
  138037. + u8 signal_strength;
  138038. + u8 rx_rssi[2]; //This value is percentage
  138039. + u8 rx_snr[2];
  138040. + u32 RxPWDBAll;
  138041. + s32 RecvSignalPower;
  138042. +};
  138043. +
  138044. +
  138045. +//These definition is used for Rx packet reordering.
  138046. +#define SN_LESS(a, b) (((a-b)&0x800)!=0)
  138047. +#define SN_EQUAL(a, b) (a == b)
  138048. +//#define REORDER_WIN_SIZE 128
  138049. +//#define REORDER_ENTRY_NUM 128
  138050. +#define REORDER_WAIT_TIME (50) // (ms)
  138051. +
  138052. +#define RECVBUFF_ALIGN_SZ 8
  138053. +
  138054. +#define RXDESC_SIZE 24
  138055. +#define RXDESC_OFFSET RXDESC_SIZE
  138056. +
  138057. +struct recv_stat
  138058. +{
  138059. + unsigned int rxdw0;
  138060. +
  138061. + unsigned int rxdw1;
  138062. +
  138063. + unsigned int rxdw2;
  138064. +
  138065. + unsigned int rxdw3;
  138066. +
  138067. + unsigned int rxdw4;
  138068. +
  138069. + unsigned int rxdw5;
  138070. +
  138071. +#ifdef CONFIG_PCI_HCI
  138072. + unsigned int rxdw6;
  138073. +
  138074. + unsigned int rxdw7;
  138075. +#endif
  138076. +};
  138077. +
  138078. +#define EOR BIT(30)
  138079. +
  138080. +#ifdef CONFIG_PCI_HCI
  138081. +#define PCI_MAX_RX_QUEUE 1// MSDU packet queue, Rx Command Queue
  138082. +#define PCI_MAX_RX_COUNT 128
  138083. +
  138084. +struct rtw_rx_ring {
  138085. + struct recv_stat *desc;
  138086. + dma_addr_t dma;
  138087. + unsigned int idx;
  138088. + struct sk_buff *rx_buf[PCI_MAX_RX_COUNT];
  138089. +};
  138090. +#endif
  138091. +
  138092. +/*
  138093. +accesser of recv_priv: rtw_recv_entry(dispatch / passive level); recv_thread(passive) ; returnpkt(dispatch)
  138094. +; halt(passive) ;
  138095. +
  138096. +using enter_critical section to protect
  138097. +*/
  138098. +struct recv_priv
  138099. +{
  138100. + _lock lock;
  138101. +
  138102. +#ifdef CONFIG_RECV_THREAD_MODE
  138103. + _sema recv_sema;
  138104. + _sema terminate_recvthread_sema;
  138105. +#endif
  138106. +
  138107. + //_queue blk_strms[MAX_RX_NUMBLKS]; // keeping the block ack frame until return ack
  138108. + _queue free_recv_queue;
  138109. + _queue recv_pending_queue;
  138110. + _queue uc_swdec_pending_queue;
  138111. +
  138112. +
  138113. + u8 *pallocated_frame_buf;
  138114. + u8 *precv_frame_buf;
  138115. +
  138116. + uint free_recvframe_cnt;
  138117. +
  138118. + _adapter *adapter;
  138119. +
  138120. +#ifdef PLATFORM_WINDOWS
  138121. + _nic_hdl RxPktPoolHdl;
  138122. + _nic_hdl RxBufPoolHdl;
  138123. +
  138124. +#ifdef PLATFORM_OS_XP
  138125. + PMDL pbytecnt_mdl;
  138126. +#endif
  138127. + uint counter; //record the number that up-layer will return to drv; only when counter==0 can we release recv_priv
  138128. + NDIS_EVENT recv_resource_evt ;
  138129. +#endif
  138130. +
  138131. + u32 bIsAnyNonBEPkts;
  138132. + u64 rx_bytes;
  138133. + u64 rx_pkts;
  138134. + u64 rx_drop;
  138135. + u64 last_rx_bytes;
  138136. +
  138137. + uint rx_icv_err;
  138138. + uint rx_largepacket_crcerr;
  138139. + uint rx_smallpacket_crcerr;
  138140. + uint rx_middlepacket_crcerr;
  138141. +
  138142. +#ifdef CONFIG_USB_HCI
  138143. + //u8 *pallocated_urb_buf;
  138144. + _sema allrxreturnevt;
  138145. + uint ff_hwaddr;
  138146. + u8 rx_pending_cnt;
  138147. +
  138148. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  138149. +#ifdef PLATFORM_LINUX
  138150. + PURB int_in_urb;
  138151. +#endif
  138152. +
  138153. + u8 *int_in_buf;
  138154. +#endif
  138155. +
  138156. +#endif
  138157. +#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
  138158. +#ifdef PLATFORM_FREEBSD
  138159. + struct task irq_prepare_beacon_tasklet;
  138160. + struct task recv_tasklet;
  138161. +#else //PLATFORM_FREEBSD
  138162. + struct tasklet_struct irq_prepare_beacon_tasklet;
  138163. + struct tasklet_struct recv_tasklet;
  138164. +#endif //PLATFORM_FREEBSD
  138165. + struct sk_buff_head free_recv_skb_queue;
  138166. + struct sk_buff_head rx_skb_queue;
  138167. +#ifdef CONFIG_RX_INDICATE_QUEUE
  138168. + struct task rx_indicate_tasklet;
  138169. + struct ifqueue rx_indicate_queue;
  138170. +#endif // CONFIG_RX_INDICATE_QUEUE
  138171. +
  138172. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  138173. + _queue recv_buf_pending_queue;
  138174. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
  138175. +#endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
  138176. +
  138177. + u8 *pallocated_recv_buf;
  138178. + u8 *precv_buf; // 4 alignment
  138179. + _queue free_recv_buf_queue;
  138180. + u32 free_recv_buf_queue_cnt;
  138181. +
  138182. +#ifdef CONFIG_SDIO_HCI
  138183. + _queue recv_buf_pending_queue;
  138184. +#endif
  138185. +
  138186. +#ifdef CONFIG_PCI_HCI
  138187. + // Rx
  138188. + struct rtw_rx_ring rx_ring[PCI_MAX_RX_QUEUE];
  138189. + int rxringcount;
  138190. + u16 rxbuffersize;
  138191. +#endif
  138192. +
  138193. + //For display the phy informatiom
  138194. + u8 is_signal_dbg; // for debug
  138195. + u8 signal_strength_dbg; // for debug
  138196. + s8 rssi;
  138197. + s8 rxpwdb;
  138198. + u8 signal_strength;
  138199. + u8 signal_qual;
  138200. + u8 noise;
  138201. + int RxSNRdB[2];
  138202. + s8 RxRssi[2];
  138203. + int FalseAlmCnt_all;
  138204. +
  138205. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  138206. + _timer signal_stat_timer;
  138207. + u32 signal_stat_sampling_interval;
  138208. + //u32 signal_stat_converging_constant;
  138209. + struct signal_stat signal_qual_data;
  138210. + struct signal_stat signal_strength_data;
  138211. +#else //CONFIG_NEW_SIGNAL_STAT_PROCESS
  138212. + struct smooth_rssi_data signal_qual_data;
  138213. + struct smooth_rssi_data signal_strength_data;
  138214. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  138215. +
  138216. + u32 recvbuf_skb_alloc_fail_cnt;
  138217. + u32 recvbuf_null_cnt;
  138218. + u32 read_port_complete_EINPROGRESS_cnt;
  138219. + u32 read_port_complete_other_urb_err_cnt;
  138220. +
  138221. +
  138222. +};
  138223. +
  138224. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  138225. +#define rtw_set_signal_stat_timer(recvpriv) _set_timer(&(recvpriv)->signal_stat_timer, (recvpriv)->signal_stat_sampling_interval)
  138226. +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
  138227. +
  138228. +struct sta_recv_priv {
  138229. +
  138230. + _lock lock;
  138231. + sint option;
  138232. +
  138233. + //_queue blk_strms[MAX_RX_NUMBLKS];
  138234. + _queue defrag_q; //keeping the fragment frame until defrag
  138235. +
  138236. + struct stainfo_rxcache rxcache;
  138237. +
  138238. + //uint sta_rx_bytes;
  138239. + //uint sta_rx_pkts;
  138240. + //uint sta_rx_fail;
  138241. +
  138242. +};
  138243. +
  138244. +
  138245. +struct recv_buf
  138246. +{
  138247. + _list list;
  138248. +
  138249. + _lock recvbuf_lock;
  138250. +
  138251. + u32 ref_cnt;
  138252. +
  138253. + PADAPTER adapter;
  138254. +
  138255. + u8 *pbuf;
  138256. + u8 *pallocated_buf;
  138257. +
  138258. + u32 len;
  138259. + u8 *phead;
  138260. + u8 *pdata;
  138261. + u8 *ptail;
  138262. + u8 *pend;
  138263. +
  138264. +#ifdef CONFIG_USB_HCI
  138265. +
  138266. + #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX)||defined(PLATFORM_FREEBSD)
  138267. + PURB purb;
  138268. + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */
  138269. + u32 alloc_sz;
  138270. + #endif
  138271. +
  138272. + #ifdef PLATFORM_OS_XP
  138273. + PIRP pirp;
  138274. + #endif
  138275. +
  138276. + #ifdef PLATFORM_OS_CE
  138277. + USB_TRANSFER usb_transfer_read_port;
  138278. + #endif
  138279. +
  138280. + u8 irp_pending;
  138281. + int transfer_len;
  138282. +
  138283. +#endif
  138284. +
  138285. +#ifdef PLATFORM_LINUX
  138286. + _pkt *pskb;
  138287. + u8 reuse;
  138288. +#endif
  138289. +#ifdef PLATFORM_FREEBSD //skb solution
  138290. + struct sk_buff *pskb;
  138291. + u8 reuse;
  138292. +#endif //PLATFORM_FREEBSD //skb solution
  138293. +};
  138294. +
  138295. +
  138296. +/*
  138297. + head ----->
  138298. +
  138299. + data ----->
  138300. +
  138301. + payload
  138302. +
  138303. + tail ----->
  138304. +
  138305. +
  138306. + end ----->
  138307. +
  138308. + len = (unsigned int )(tail - data);
  138309. +
  138310. +*/
  138311. +struct recv_frame_hdr
  138312. +{
  138313. + _list list;
  138314. +#ifndef CONFIG_BSD_RX_USE_MBUF
  138315. + struct sk_buff *pkt;
  138316. + struct sk_buff *pkt_newalloc;
  138317. +#else // CONFIG_BSD_RX_USE_MBUF
  138318. + _pkt *pkt;
  138319. + _pkt *pkt_newalloc;
  138320. +#endif // CONFIG_BSD_RX_USE_MBUF
  138321. +
  138322. + _adapter *adapter;
  138323. +
  138324. + u8 fragcnt;
  138325. +
  138326. + int frame_tag;
  138327. +
  138328. + struct rx_pkt_attrib attrib;
  138329. +
  138330. + uint len;
  138331. + u8 *rx_head;
  138332. + u8 *rx_data;
  138333. + u8 *rx_tail;
  138334. + u8 *rx_end;
  138335. +
  138336. + void *precvbuf;
  138337. +
  138338. +
  138339. + //
  138340. + struct sta_info *psta;
  138341. +
  138342. + //for A-MPDU Rx reordering buffer control
  138343. + struct recv_reorder_ctrl *preorder_ctrl;
  138344. +
  138345. +};
  138346. +
  138347. +
  138348. +union recv_frame{
  138349. +
  138350. + union{
  138351. + _list list;
  138352. + struct recv_frame_hdr hdr;
  138353. + uint mem[RECVFRAME_HDR_ALIGN>>2];
  138354. + }u;
  138355. +
  138356. + //uint mem[MAX_RXSZ>>2];
  138357. +
  138358. +};
  138359. +
  138360. +
  138361. +extern union recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue
  138362. +extern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue
  138363. +extern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv);
  138364. +extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue);
  138365. +
  138366. +#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue)
  138367. +extern int _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue);
  138368. +extern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue);
  138369. +
  138370. +extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue);
  138371. +u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter);
  138372. +
  138373. +sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue);
  138374. +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue);
  138375. +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue);
  138376. +
  138377. +void rtw_reordering_ctrl_timeout_handler(void *pcontext);
  138378. +
  138379. +__inline static u8 *get_rxmem(union recv_frame *precvframe)
  138380. +{
  138381. + //always return rx_head...
  138382. + if(precvframe==NULL)
  138383. + return NULL;
  138384. +
  138385. + return precvframe->u.hdr.rx_head;
  138386. +}
  138387. +
  138388. +__inline static u8 *get_rx_status(union recv_frame *precvframe)
  138389. +{
  138390. +
  138391. + return get_rxmem(precvframe);
  138392. +
  138393. +}
  138394. +
  138395. +__inline static u8 *get_recvframe_data(union recv_frame *precvframe)
  138396. +{
  138397. +
  138398. + //alwasy return rx_data
  138399. + if(precvframe==NULL)
  138400. + return NULL;
  138401. +
  138402. + return precvframe->u.hdr.rx_data;
  138403. +
  138404. +}
  138405. +
  138406. +__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz)
  138407. +{
  138408. + // append data before rx_data
  138409. +
  138410. + /* add data to the start of recv_frame
  138411. + *
  138412. + * This function extends the used data area of the recv_frame at the buffer
  138413. + * start. rx_data must be still larger than rx_head, after pushing.
  138414. + */
  138415. +
  138416. + if(precvframe==NULL)
  138417. + return NULL;
  138418. +
  138419. +
  138420. + precvframe->u.hdr.rx_data -= sz ;
  138421. + if( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head )
  138422. + {
  138423. + precvframe->u.hdr.rx_data += sz ;
  138424. + return NULL;
  138425. + }
  138426. +
  138427. + precvframe->u.hdr.len +=sz;
  138428. +
  138429. + return precvframe->u.hdr.rx_data;
  138430. +
  138431. +}
  138432. +
  138433. +
  138434. +__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz)
  138435. +{
  138436. + // rx_data += sz; move rx_data sz bytes hereafter
  138437. +
  138438. + //used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller
  138439. +
  138440. +
  138441. + if(precvframe==NULL)
  138442. + return NULL;
  138443. +
  138444. +
  138445. + precvframe->u.hdr.rx_data += sz;
  138446. +
  138447. + if(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail)
  138448. + {
  138449. + precvframe->u.hdr.rx_data -= sz;
  138450. + return NULL;
  138451. + }
  138452. +
  138453. + precvframe->u.hdr.len -=sz;
  138454. +
  138455. + return precvframe->u.hdr.rx_data;
  138456. +
  138457. +}
  138458. +
  138459. +__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz)
  138460. +{
  138461. + // rx_tai += sz; move rx_tail sz bytes hereafter
  138462. +
  138463. + //used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller
  138464. + //after putting, rx_tail must be still larger than rx_end.
  138465. + unsigned char * prev_rx_tail;
  138466. +
  138467. + if(precvframe==NULL)
  138468. + return NULL;
  138469. +
  138470. + prev_rx_tail = precvframe->u.hdr.rx_tail;
  138471. +
  138472. + precvframe->u.hdr.rx_tail += sz;
  138473. +
  138474. + if(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end)
  138475. + {
  138476. + precvframe->u.hdr.rx_tail -= sz;
  138477. + return NULL;
  138478. + }
  138479. +
  138480. + precvframe->u.hdr.len +=sz;
  138481. +
  138482. + return precvframe->u.hdr.rx_tail;
  138483. +
  138484. +}
  138485. +
  138486. +
  138487. +
  138488. +__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz)
  138489. +{
  138490. + // rmv data from rx_tail (by yitsen)
  138491. +
  138492. + //used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller
  138493. + //after pulling, rx_end must be still larger than rx_data.
  138494. +
  138495. + if(precvframe==NULL)
  138496. + return NULL;
  138497. +
  138498. + precvframe->u.hdr.rx_tail -= sz;
  138499. +
  138500. + if(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data)
  138501. + {
  138502. + precvframe->u.hdr.rx_tail += sz;
  138503. + return NULL;
  138504. + }
  138505. +
  138506. + precvframe->u.hdr.len -=sz;
  138507. +
  138508. + return precvframe->u.hdr.rx_tail;
  138509. +
  138510. +}
  138511. +
  138512. +
  138513. +
  138514. +__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe)
  138515. +{
  138516. + _buffer * buf_desc;
  138517. +
  138518. + if(precvframe==NULL)
  138519. + return NULL;
  138520. +#ifdef PLATFORM_WINDOWS
  138521. + NdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL);
  138522. +#endif
  138523. +
  138524. + return buf_desc;
  138525. +}
  138526. +
  138527. +
  138528. +__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem)
  138529. +{
  138530. + //due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame
  138531. + //from any given member of recv_frame.
  138532. + // rxmem indicates the any member/address in recv_frame
  138533. +
  138534. + return (union recv_frame*)(((SIZE_PTR)rxmem >> RXFRAME_ALIGN) << RXFRAME_ALIGN);
  138535. +
  138536. +}
  138537. +
  138538. +__inline static union recv_frame *pkt_to_recvframe(_pkt *pkt)
  138539. +{
  138540. +
  138541. + u8 * buf_star;
  138542. + union recv_frame * precv_frame;
  138543. +#ifdef PLATFORM_WINDOWS
  138544. + _buffer * buf_desc;
  138545. + uint len;
  138546. +
  138547. + NdisQueryPacket(pkt, NULL, NULL, &buf_desc, &len);
  138548. + NdisQueryBufferSafe(buf_desc, &buf_star, &len, HighPagePriority);
  138549. +#endif
  138550. + precv_frame = rxmem_to_recvframe((unsigned char*)buf_star);
  138551. +
  138552. + return precv_frame;
  138553. +}
  138554. +
  138555. +__inline static u8 *pkt_to_recvmem(_pkt *pkt)
  138556. +{
  138557. + // return the rx_head
  138558. +
  138559. + union recv_frame * precv_frame = pkt_to_recvframe(pkt);
  138560. +
  138561. + return precv_frame->u.hdr.rx_head;
  138562. +
  138563. +}
  138564. +
  138565. +__inline static u8 *pkt_to_recvdata(_pkt *pkt)
  138566. +{
  138567. + // return the rx_data
  138568. +
  138569. + union recv_frame * precv_frame =pkt_to_recvframe(pkt);
  138570. +
  138571. + return precv_frame->u.hdr.rx_data;
  138572. +
  138573. +}
  138574. +
  138575. +
  138576. +__inline static sint get_recvframe_len(union recv_frame *precvframe)
  138577. +{
  138578. + return precvframe->u.hdr.len;
  138579. +}
  138580. +
  138581. +__inline static u8 query_rx_pwr_percentage(s8 antpower )
  138582. +{
  138583. + if ((antpower <= -100) || (antpower >= 20))
  138584. + {
  138585. + return 0;
  138586. + }
  138587. + else if (antpower >= 0)
  138588. + {
  138589. + return 100;
  138590. + }
  138591. + else
  138592. + {
  138593. + return (100+antpower);
  138594. + }
  138595. +}
  138596. +
  138597. +__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
  138598. +{
  138599. + s32 SignalPower; // in dBm.
  138600. +
  138601. + // Translate to dBm (x=0.5y-95).
  138602. + SignalPower = (s32)((SignalStrengthIndex + 1) >> 1);
  138603. + SignalPower -= 95;
  138604. +
  138605. + return SignalPower;
  138606. +}
  138607. +
  138608. +
  138609. +struct sta_info;
  138610. +
  138611. +extern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv);
  138612. +
  138613. +extern void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame);
  138614. +
  138615. +#endif
  138616. --- /dev/null
  138617. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_rf.h
  138618. @@ -0,0 +1,151 @@
  138619. +/******************************************************************************
  138620. + *
  138621. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  138622. + *
  138623. + * This program is free software; you can redistribute it and/or modify it
  138624. + * under the terms of version 2 of the GNU General Public License as
  138625. + * published by the Free Software Foundation.
  138626. + *
  138627. + * This program is distributed in the hope that it will be useful, but WITHOUT
  138628. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  138629. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  138630. + * more details.
  138631. + *
  138632. + * You should have received a copy of the GNU General Public License along with
  138633. + * this program; if not, write to the Free Software Foundation, Inc.,
  138634. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  138635. + *
  138636. + *
  138637. + ******************************************************************************/
  138638. +#ifndef __RTW_RF_H_
  138639. +#define __RTW_RF_H_
  138640. +
  138641. +#include <drv_conf.h>
  138642. +#include <rtw_cmd.h>
  138643. +
  138644. +#define OFDM_PHY 1
  138645. +#define MIXED_PHY 2
  138646. +#define CCK_PHY 3
  138647. +
  138648. +#define NumRates (13)
  138649. +
  138650. +// slot time for 11g
  138651. +#define SHORT_SLOT_TIME 9
  138652. +#define NON_SHORT_SLOT_TIME 20
  138653. +
  138654. +#define RTL8711_RF_MAX_SENS 6
  138655. +#define RTL8711_RF_DEF_SENS 4
  138656. +
  138657. +//
  138658. +// We now define the following channels as the max channels in each channel plan.
  138659. +// 2G, total 14 chnls
  138660. +// {1,2,3,4,5,6,7,8,9,10,11,12,13,14}
  138661. +// 5G, total 24 chnls
  138662. +// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}
  138663. +#define MAX_CHANNEL_NUM_2G 14
  138664. +#define MAX_CHANNEL_NUM_5G 24
  138665. +#define MAX_CHANNEL_NUM 38//14+24
  138666. +
  138667. +//#define NUM_REGULATORYS 21
  138668. +#define NUM_REGULATORYS 1
  138669. +
  138670. +//Country codes
  138671. +#define USA 0x555320
  138672. +#define EUROPE 0x1 //temp, should be provided later
  138673. +#define JAPAN 0x2 //temp, should be provided later
  138674. +
  138675. +struct regulatory_class {
  138676. + u32 starting_freq; //MHz,
  138677. + u8 channel_set[MAX_CHANNEL_NUM];
  138678. + u8 channel_cck_power[MAX_CHANNEL_NUM];//dbm
  138679. + u8 channel_ofdm_power[MAX_CHANNEL_NUM];//dbm
  138680. + u8 txpower_limit; //dbm
  138681. + u8 channel_spacing; //MHz
  138682. + u8 modem;
  138683. +};
  138684. +
  138685. +typedef enum _CAPABILITY{
  138686. + cESS = 0x0001,
  138687. + cIBSS = 0x0002,
  138688. + cPollable = 0x0004,
  138689. + cPollReq = 0x0008,
  138690. + cPrivacy = 0x0010,
  138691. + cShortPreamble = 0x0020,
  138692. + cPBCC = 0x0040,
  138693. + cChannelAgility = 0x0080,
  138694. + cSpectrumMgnt = 0x0100,
  138695. + cQos = 0x0200, // For HCCA, use with CF-Pollable and CF-PollReq
  138696. + cShortSlotTime = 0x0400,
  138697. + cAPSD = 0x0800,
  138698. + cRM = 0x1000, // RRM (Radio Request Measurement)
  138699. + cDSSS_OFDM = 0x2000,
  138700. + cDelayedBA = 0x4000,
  138701. + cImmediateBA = 0x8000,
  138702. +}CAPABILITY, *PCAPABILITY;
  138703. +
  138704. +enum _REG_PREAMBLE_MODE{
  138705. + PREAMBLE_LONG = 1,
  138706. + PREAMBLE_AUTO = 2,
  138707. + PREAMBLE_SHORT = 3,
  138708. +};
  138709. +
  138710. +
  138711. +enum _RTL8712_RF_MIMO_CONFIG_{
  138712. + RTL8712_RFCONFIG_1T=0x10,
  138713. + RTL8712_RFCONFIG_2T=0x20,
  138714. + RTL8712_RFCONFIG_1R=0x01,
  138715. + RTL8712_RFCONFIG_2R=0x02,
  138716. + RTL8712_RFCONFIG_1T1R=0x11,
  138717. + RTL8712_RFCONFIG_1T2R=0x12,
  138718. + RTL8712_RFCONFIG_TURBO=0x92,
  138719. + RTL8712_RFCONFIG_2T2R=0x22
  138720. +};
  138721. +
  138722. +
  138723. +// Bandwidth Offset
  138724. +#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
  138725. +#define HAL_PRIME_CHNL_OFFSET_LOWER 1
  138726. +#define HAL_PRIME_CHNL_OFFSET_UPPER 2
  138727. +
  138728. +// Represent Channel Width in HT Capabilities
  138729. +//
  138730. +typedef enum _HT_CHANNEL_WIDTH {
  138731. + HT_CHANNEL_WIDTH_20 = 0,
  138732. + HT_CHANNEL_WIDTH_40 = 1,
  138733. +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH;
  138734. +
  138735. +//
  138736. +// Represent Extention Channel Offset in HT Capabilities
  138737. +// This is available only in 40Mhz mode.
  138738. +//
  138739. +typedef enum _HT_EXTCHNL_OFFSET{
  138740. + HT_EXTCHNL_OFFSET_NO_EXT = 0,
  138741. + HT_EXTCHNL_OFFSET_UPPER = 1,
  138742. + HT_EXTCHNL_OFFSET_NO_DEF = 2,
  138743. + HT_EXTCHNL_OFFSET_LOWER = 3,
  138744. +}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET;
  138745. +
  138746. +/* 2007/11/15 MH Define different RF type. */
  138747. +typedef enum _RT_RF_TYPE_DEFINITION
  138748. +{
  138749. + RF_1T2R = 0,
  138750. + RF_2T4R = 1,
  138751. + RF_2T2R = 2,
  138752. + RF_1T1R = 3,
  138753. + RF_2T2R_GREEN = 4,
  138754. + RF_819X_MAX_TYPE = 5,
  138755. +}RT_RF_TYPE_DEF_E;
  138756. +
  138757. +typedef enum _RF_RADIO_PATH{
  138758. + RF_PATH_A = 0, //Radio Path A
  138759. + RF_PATH_B = 1, //Radio Path B
  138760. + RF_PATH_C = 2, //Radio Path C
  138761. + RF_PATH_D = 3, //Radio Path D
  138762. + //RF_PATH_MAX //Max RF number 90 support
  138763. +}RF_RADIO_PATH_E, *PRF_RADIO_PATH_E;
  138764. +
  138765. +u32 rtw_ch2freq(u32 ch);
  138766. +u32 rtw_freq2ch(u32 freq);
  138767. +
  138768. +
  138769. +#endif //_RTL8711_RF_H_
  138770. --- /dev/null
  138771. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_security.h
  138772. @@ -0,0 +1,446 @@
  138773. +/******************************************************************************
  138774. + *
  138775. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  138776. + *
  138777. + * This program is free software; you can redistribute it and/or modify it
  138778. + * under the terms of version 2 of the GNU General Public License as
  138779. + * published by the Free Software Foundation.
  138780. + *
  138781. + * This program is distributed in the hope that it will be useful, but WITHOUT
  138782. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  138783. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  138784. + * more details.
  138785. + *
  138786. + * You should have received a copy of the GNU General Public License along with
  138787. + * this program; if not, write to the Free Software Foundation, Inc.,
  138788. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  138789. + *
  138790. + *
  138791. + ******************************************************************************/
  138792. +#ifndef __RTW_SECURITY_H_
  138793. +#define __RTW_SECURITY_H_
  138794. +
  138795. +
  138796. +#include <drv_conf.h>
  138797. +#include <osdep_service.h>
  138798. +#include <drv_types.h>
  138799. +
  138800. +
  138801. +#define _NO_PRIVACY_ 0x0
  138802. +#define _WEP40_ 0x1
  138803. +#define _TKIP_ 0x2
  138804. +#define _TKIP_WTMIC_ 0x3
  138805. +#define _AES_ 0x4
  138806. +#define _WEP104_ 0x5
  138807. +#ifdef CONFIG_IEEE80211W
  138808. +#define _BIP_ 0x8
  138809. +#endif //CONFIG_IEEE80211W
  138810. +#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
  138811. +
  138812. +#define _WPA_IE_ID_ 0xdd
  138813. +#define _WPA2_IE_ID_ 0x30
  138814. +
  138815. +#define SHA256_MAC_LEN 32
  138816. +#define AES_BLOCK_SIZE 16
  138817. +#define AES_PRIV_SIZE (4 * 44)
  138818. +
  138819. +#ifndef Ndis802_11AuthModeWPA2
  138820. +#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)
  138821. +#endif
  138822. +
  138823. +#ifndef Ndis802_11AuthModeWPA2PSK
  138824. +#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)
  138825. +#endif
  138826. +
  138827. +union pn48 {
  138828. +
  138829. + u64 val;
  138830. +
  138831. +#ifdef CONFIG_LITTLE_ENDIAN
  138832. +
  138833. +struct {
  138834. + u8 TSC0;
  138835. + u8 TSC1;
  138836. + u8 TSC2;
  138837. + u8 TSC3;
  138838. + u8 TSC4;
  138839. + u8 TSC5;
  138840. + u8 TSC6;
  138841. + u8 TSC7;
  138842. +} _byte_;
  138843. +
  138844. +#elif defined(CONFIG_BIG_ENDIAN)
  138845. +
  138846. +struct {
  138847. + u8 TSC7;
  138848. + u8 TSC6;
  138849. + u8 TSC5;
  138850. + u8 TSC4;
  138851. + u8 TSC3;
  138852. + u8 TSC2;
  138853. + u8 TSC1;
  138854. + u8 TSC0;
  138855. +} _byte_;
  138856. +
  138857. +#endif
  138858. +
  138859. +};
  138860. +
  138861. +union Keytype {
  138862. + u8 skey[16];
  138863. + u32 lkey[4];
  138864. +};
  138865. +
  138866. +
  138867. +typedef struct _RT_PMKID_LIST
  138868. +{
  138869. + u8 bUsed;
  138870. + u8 Bssid[6];
  138871. + u8 PMKID[16];
  138872. + u8 SsidBuf[33];
  138873. + u8* ssid_octet;
  138874. + u16 ssid_length;
  138875. +} RT_PMKID_LIST, *PRT_PMKID_LIST;
  138876. +
  138877. +
  138878. +struct security_priv
  138879. +{
  138880. + u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, 8021x and authswitch
  138881. + u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm.
  138882. +
  138883. + /* WEP */
  138884. + u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index)
  138885. + union Keytype dot11DefKey[4]; // this is only valid for def. key
  138886. + u32 dot11DefKeylen[4];
  138887. + u8 key_mask; /* use to restore wep key after hal_init */
  138888. +
  138889. + u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key
  138890. + u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index)
  138891. + union Keytype dot118021XGrpKey[4]; // 802.1x Group Key, for inx0 and inx1
  138892. + union Keytype dot118021XGrptxmickey[4];
  138893. + union Keytype dot118021XGrprxmickey[4];
  138894. + union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit.
  138895. + union pn48 dot11Grprxpn; // PN48 used for Grp Key recv.
  138896. +#ifdef CONFIG_IEEE80211W
  138897. + u32 dot11wBIPKeyid; // key id used for BIP Key ( tx key index)
  138898. + union Keytype dot11wBIPKey[6]; // BIP Key, for index4 and index5
  138899. + union pn48 dot11wBIPtxpn; // PN48 used for Grp Key xmit.
  138900. + union pn48 dot11wBIPrxpn; // PN48 used for Grp Key recv.
  138901. +#endif //CONFIG_IEEE80211W
  138902. +#ifdef CONFIG_AP_MODE
  138903. + //extend security capabilities for AP_MODE
  138904. + unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x
  138905. + unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2
  138906. + unsigned int wpa_group_cipher;
  138907. + unsigned int wpa2_group_cipher;
  138908. + unsigned int wpa_pairwise_cipher;
  138909. + unsigned int wpa2_pairwise_cipher;
  138910. +#endif
  138911. +
  138912. + u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req
  138913. + int wps_ie_len;
  138914. +
  138915. +
  138916. + u8 binstallGrpkey;
  138917. +#ifdef CONFIG_IEEE80211W
  138918. + u8 binstallBIPkey;
  138919. +#endif //CONFIG_IEEE80211W
  138920. + u8 busetkipkey;
  138921. + //_timer tkip_timer;
  138922. + u8 bcheck_grpkey;
  138923. + u8 bgrpkey_handshake;
  138924. +
  138925. + //u8 packet_cnt;//unused, removed
  138926. +
  138927. + s32 sw_encrypt;//from registry_priv
  138928. + s32 sw_decrypt;//from registry_priv
  138929. +
  138930. + s32 hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready.
  138931. +
  138932. +
  138933. + //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc)
  138934. + u32 ndisauthtype; // NDIS_802_11_AUTHENTICATION_MODE
  138935. + u32 ndisencryptstatus; // NDIS_802_11_ENCRYPTION_STATUS
  138936. +
  138937. + WLAN_BSSID_EX sec_bss; //for joinbss (h2c buffer) usage
  138938. +
  138939. + NDIS_802_11_WEP ndiswep;
  138940. +#ifdef PLATFORM_WINDOWS
  138941. + u8 KeyMaterial[16];// variable length depending on above field.
  138942. +#endif
  138943. +
  138944. + u8 assoc_info[600];
  138945. + u8 szofcapability[256]; //for wpa2 usage
  138946. + u8 oidassociation[512]; //for wpa/wpa2 usage
  138947. + u8 authenticator_ie[256]; //store ap security information element
  138948. + u8 supplicant_ie[256]; //store sta security information element
  138949. +
  138950. +
  138951. + //for tkip countermeasure
  138952. + u32 last_mic_err_time;
  138953. + u8 btkip_countermeasure;
  138954. + u8 btkip_wait_report;
  138955. + u32 btkip_countermeasure_time;
  138956. +
  138957. + //---------------------------------------------------------------------------
  138958. + // For WPA2 Pre-Authentication.
  138959. + //---------------------------------------------------------------------------
  138960. + //u8 RegEnablePreAuth; // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01.
  138961. + //u8 EnablePreAuthentication; // Current Value: Pre-Authentication enabled or not.
  138962. + RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE]; // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13.
  138963. + u8 PMKIDIndex;
  138964. + //u32 PMKIDCount; // Added by Annie, 2006-10-13.
  138965. + //u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
  138966. +
  138967. + u8 bWepDefaultKeyIdxSet;
  138968. +};
  138969. +
  138970. +struct sha256_state {
  138971. + u64 length;
  138972. + u32 state[8], curlen;
  138973. + u8 buf[64];
  138974. +};
  138975. +
  138976. +#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\
  138977. +do{\
  138978. + switch(psecuritypriv->dot11AuthAlgrthm)\
  138979. + {\
  138980. + case dot11AuthAlgrthm_Open:\
  138981. + case dot11AuthAlgrthm_Shared:\
  138982. + case dot11AuthAlgrthm_Auto:\
  138983. + encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\
  138984. + break;\
  138985. + case dot11AuthAlgrthm_8021X:\
  138986. + if(bmcst)\
  138987. + encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\
  138988. + else\
  138989. + encry_algo =(u8) psta->dot118021XPrivacy;\
  138990. + break;\
  138991. + }\
  138992. +}while(0)
  138993. +
  138994. +
  138995. +#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\
  138996. +do{\
  138997. + switch(encrypt)\
  138998. + {\
  138999. + case _WEP40_:\
  139000. + case _WEP104_:\
  139001. + iv_len = 4;\
  139002. + icv_len = 4;\
  139003. + break;\
  139004. + case _TKIP_:\
  139005. + iv_len = 8;\
  139006. + icv_len = 4;\
  139007. + break;\
  139008. + case _AES_:\
  139009. + iv_len = 8;\
  139010. + icv_len = 8;\
  139011. + break;\
  139012. + default:\
  139013. + iv_len = 0;\
  139014. + icv_len = 0;\
  139015. + break;\
  139016. + }\
  139017. +}while(0)
  139018. +
  139019. +
  139020. +#define GET_TKIP_PN(iv,dot11txpn)\
  139021. +do{\
  139022. + dot11txpn._byte_.TSC0=iv[2];\
  139023. + dot11txpn._byte_.TSC1=iv[0];\
  139024. + dot11txpn._byte_.TSC2=iv[4];\
  139025. + dot11txpn._byte_.TSC3=iv[5];\
  139026. + dot11txpn._byte_.TSC4=iv[6];\
  139027. + dot11txpn._byte_.TSC5=iv[7];\
  139028. +}while(0)
  139029. +
  139030. +
  139031. +#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
  139032. +#define ROR32( A, n ) ROL32( (A), 32-(n) )
  139033. +
  139034. +struct mic_data
  139035. +{
  139036. + u32 K0, K1; // Key
  139037. + u32 L, R; // Current state
  139038. + u32 M; // Message accumulator (single word)
  139039. + u32 nBytesInM; // # bytes in M
  139040. +};
  139041. +
  139042. +extern const u32 Te0[256];
  139043. +extern const u32 Te1[256];
  139044. +extern const u32 Te2[256];
  139045. +extern const u32 Te3[256];
  139046. +extern const u32 Te4[256];
  139047. +extern const u32 Td0[256];
  139048. +extern const u32 Td1[256];
  139049. +extern const u32 Td2[256];
  139050. +extern const u32 Td3[256];
  139051. +extern const u32 Td4[256];
  139052. +extern const u32 rcon[10];
  139053. +extern const u8 Td4s[256];
  139054. +extern const u8 rcons[10];
  139055. +
  139056. +#define RCON(i) (rcons[(i)] << 24)
  139057. +
  139058. +static inline u32 rotr(u32 val, int bits)
  139059. +{
  139060. + return (val >> bits) | (val << (32 - bits));
  139061. +}
  139062. +
  139063. +#define TE0(i) Te0[((i) >> 24) & 0xff]
  139064. +#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
  139065. +#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
  139066. +#define TE3(i) rotr(Te0[(i) & 0xff], 24)
  139067. +#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
  139068. +#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
  139069. +#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
  139070. +#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
  139071. +#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
  139072. +#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
  139073. +#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
  139074. +#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
  139075. +#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
  139076. +
  139077. +#define TD0(i) Td0[((i) >> 24) & 0xff]
  139078. +#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
  139079. +#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
  139080. +#define TD3(i) rotr(Td0[(i) & 0xff], 24)
  139081. +#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
  139082. +#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
  139083. +#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
  139084. +#define TD44(i) (Td4s[(i) & 0xff])
  139085. +#define TD0_(i) Td0[(i) & 0xff]
  139086. +#define TD1_(i) rotr(Td0[(i) & 0xff], 8)
  139087. +#define TD2_(i) rotr(Td0[(i) & 0xff], 16)
  139088. +#define TD3_(i) rotr(Td0[(i) & 0xff], 24)
  139089. +
  139090. +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
  139091. + ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
  139092. +
  139093. +#define PUTU32(ct, st) { \
  139094. +(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
  139095. +(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
  139096. +
  139097. +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
  139098. + (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
  139099. +
  139100. +#define WPA_PUT_LE16(a, val) \
  139101. + do { \
  139102. + (a)[1] = ((u16) (val)) >> 8; \
  139103. + (a)[0] = ((u16) (val)) & 0xff; \
  139104. + } while (0)
  139105. +
  139106. +#define WPA_PUT_BE32(a, val) \
  139107. + do { \
  139108. + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \
  139109. + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \
  139110. + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \
  139111. + (a)[3] = (u8) (((u32) (val)) & 0xff); \
  139112. + } while (0)
  139113. +
  139114. +#define WPA_PUT_BE64(a, val) \
  139115. + do { \
  139116. + (a)[0] = (u8) (((u64) (val)) >> 56); \
  139117. + (a)[1] = (u8) (((u64) (val)) >> 48); \
  139118. + (a)[2] = (u8) (((u64) (val)) >> 40); \
  139119. + (a)[3] = (u8) (((u64) (val)) >> 32); \
  139120. + (a)[4] = (u8) (((u64) (val)) >> 24); \
  139121. + (a)[5] = (u8) (((u64) (val)) >> 16); \
  139122. + (a)[6] = (u8) (((u64) (val)) >> 8); \
  139123. + (a)[7] = (u8) (((u64) (val)) & 0xff); \
  139124. + } while (0)
  139125. +
  139126. +/* ===== start - public domain SHA256 implementation ===== */
  139127. +
  139128. +/* This is based on SHA256 implementation in LibTomCrypt that was released into
  139129. + * public domain by Tom St Denis. */
  139130. +
  139131. +/* the K array */
  139132. +static const unsigned long K[64] = {
  139133. + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
  139134. + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
  139135. + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
  139136. + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
  139137. + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
  139138. + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
  139139. + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
  139140. + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
  139141. + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
  139142. + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
  139143. + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
  139144. + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
  139145. + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
  139146. +};
  139147. +
  139148. +
  139149. +/* Various logical functions */
  139150. +#define RORc(x, y) \
  139151. +( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
  139152. + ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
  139153. +#define Ch(x,y,z) (z ^ (x & (y ^ z)))
  139154. +#define Maj(x,y,z) (((x | y) & z) | (x & y))
  139155. +#define S(x, n) RORc((x), (n))
  139156. +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
  139157. +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
  139158. +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
  139159. +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
  139160. +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
  139161. +#ifndef MIN
  139162. +#define MIN(x, y) (((x) < (y)) ? (x) : (y))
  139163. +#endif
  139164. +#ifdef CONFIG_IEEE80211W
  139165. +int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac);
  139166. +#endif //CONFIG_IEEE80211W
  139167. +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key );
  139168. +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b );
  139169. +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes );
  139170. +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst );
  139171. +
  139172. +void rtw_seccalctkipmic(
  139173. + u8 * key,
  139174. + u8 *header,
  139175. + u8 *data,
  139176. + u32 data_len,
  139177. + u8 *Miccode,
  139178. + u8 priority);
  139179. +
  139180. +u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe);
  139181. +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe);
  139182. +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe);
  139183. +
  139184. +u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe);
  139185. +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe);
  139186. +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe);
  139187. +#ifdef CONFIG_IEEE80211W
  139188. +u32 rtw_BIP_verify(_adapter *padapter, u8 *precvframe);
  139189. +#endif //CONFIG_IEEE80211W
  139190. +#ifdef CONFIG_TDLS
  139191. +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta);
  139192. +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq,
  139193. + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,
  139194. + u8 *mic);
  139195. +int tdls_verify_mic(u8 *kck, u8 trans_seq,
  139196. + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie);
  139197. +#endif //CONFIG_TDLS
  139198. +
  139199. +#ifdef PLATFORM_WINDOWS
  139200. +void rtw_use_tkipkey_handler (
  139201. + IN PVOID SystemSpecific1,
  139202. + IN PVOID FunctionContext,
  139203. + IN PVOID SystemSpecific2,
  139204. + IN PVOID SystemSpecific3
  139205. + );
  139206. +#endif
  139207. +#ifdef PLATFORM_LINUX
  139208. +void rtw_use_tkipkey_handler(void* FunctionContext);
  139209. +#endif
  139210. +
  139211. +#ifdef PLATFORM_FREEBSD
  139212. +void rtw_use_tkipkey_handler(void* FunctionContext);
  139213. +#endif //PLATFORM_FREEBSD
  139214. +
  139215. +void rtw_sec_restore_wep_key(_adapter *adapter);
  139216. +u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller);
  139217. +
  139218. +#endif //__RTL871X_SECURITY_H_
  139219. --- /dev/null
  139220. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_sreset.h
  139221. @@ -0,0 +1,73 @@
  139222. +/******************************************************************************
  139223. + *
  139224. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  139225. + *
  139226. + * This program is free software; you can redistribute it and/or modify it
  139227. + * under the terms of version 2 of the GNU General Public License as
  139228. + * published by the Free Software Foundation.
  139229. + *
  139230. + * This program is distributed in the hope that it will be useful, but WITHOUT
  139231. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  139232. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  139233. + * more details.
  139234. + *
  139235. + * You should have received a copy of the GNU General Public License along with
  139236. + * this program; if not, write to the Free Software Foundation, Inc.,
  139237. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  139238. + *
  139239. + *
  139240. + ******************************************************************************/
  139241. +#ifndef _RTW_SRESET_C_
  139242. +#define _RTW_SRESET_C_
  139243. +
  139244. +#include <drv_conf.h>
  139245. +#include <osdep_service.h>
  139246. +#include <drv_types.h>
  139247. +
  139248. +enum {
  139249. + SRESET_TGP_NULL = 0,
  139250. + SRESET_TGP_XMIT_STATUS = 1,
  139251. + SRESET_TGP_LINK_STATUS = 2,
  139252. +};
  139253. +
  139254. +struct sreset_priv {
  139255. + _mutex silentreset_mutex;
  139256. + u8 silent_reset_inprogress;
  139257. + u8 Wifi_Error_Status;
  139258. + unsigned long last_tx_time;
  139259. + unsigned long last_tx_complete_time;
  139260. +
  139261. + s32 dbg_trigger_point;
  139262. +};
  139263. +
  139264. +#ifdef CONFIG_RTL8192C
  139265. +#include <rtl8192c_hal.h>
  139266. +#endif
  139267. +#ifdef CONFIG_RTL8192D
  139268. +#include <rtl8192d_hal.h>
  139269. +#endif
  139270. +#ifdef CONFIG_RTL8723A
  139271. +#include <rtl8723a_hal.h>
  139272. +#endif
  139273. +#ifdef CONFIG_RTL8188E
  139274. +#include <rtl8188e_hal.h>
  139275. +#endif
  139276. +
  139277. +#define WIFI_STATUS_SUCCESS 0
  139278. +#define USB_VEN_REQ_CMD_FAIL BIT0
  139279. +#define USB_READ_PORT_FAIL BIT1
  139280. +#define USB_WRITE_PORT_FAIL BIT2
  139281. +#define WIFI_MAC_TXDMA_ERROR BIT3
  139282. +#define WIFI_TX_HANG BIT4
  139283. +#define WIFI_RX_HANG BIT5
  139284. +#define WIFI_IF_NOT_EXIST BIT6
  139285. +
  139286. +void sreset_init_value(_adapter *padapter);
  139287. +void sreset_reset_value(_adapter *padapter);
  139288. +u8 sreset_get_wifi_status(_adapter *padapter);
  139289. +void sreset_set_wifi_error_status(_adapter *padapter, u32 status);
  139290. +void sreset_set_trigger_point(_adapter *padapter, s32 tgp);
  139291. +bool sreset_inprogress(_adapter *padapter);
  139292. +void sreset_reset(_adapter *padapter);
  139293. +
  139294. +#endif
  139295. --- /dev/null
  139296. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_tdls.h
  139297. @@ -0,0 +1,142 @@
  139298. +/******************************************************************************
  139299. + *
  139300. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  139301. + *
  139302. + * This program is free software; you can redistribute it and/or modify it
  139303. + * under the terms of version 2 of the GNU General Public License as
  139304. + * published by the Free Software Foundation.
  139305. + *
  139306. + * This program is distributed in the hope that it will be useful, but WITHOUT
  139307. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  139308. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  139309. + * more details.
  139310. + *
  139311. + * You should have received a copy of the GNU General Public License along with
  139312. + * this program; if not, write to the Free Software Foundation, Inc.,
  139313. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  139314. + *
  139315. + *
  139316. + ******************************************************************************/
  139317. +#ifndef __RTW_TDLS_H_
  139318. +#define __RTW_TDLS_H_
  139319. +
  139320. +#include <drv_types.h>
  139321. +
  139322. +#ifdef CONFIG_TDLS
  139323. +/* TDLS STA state */
  139324. +#define TDLS_STATE_NONE 0x00000000 //default state
  139325. +#define TDLS_INITIATOR_STATE 0x10000000
  139326. +#define TDLS_RESPONDER_STATE 0x20000000
  139327. +#define TDLS_LINKED_STATE 0x40000000
  139328. +#define TDLS_CH_SWITCH_ON_STATE 0x01000000
  139329. +#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch
  139330. +#define TDLS_AT_OFF_CH_STATE 0x04000000
  139331. +#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp.
  139332. +#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch
  139333. +#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping
  139334. +#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing
  139335. +#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived.
  139336. +
  139337. +#define TPK_RESEND_COUNT 301
  139338. +#define CH_SWITCH_TIME 10
  139339. +#define CH_SWITCH_TIMEOUT 30
  139340. +#define TDLS_STAY_TIME 500
  139341. +#define TDLS_SIGNAL_THRESH 0x20
  139342. +#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec
  139343. +#define TDLS_ALIVE_TIMER_PH1 5000
  139344. +#define TDLS_ALIVE_TIMER_PH2 2000
  139345. +#define TDLS_STAY_TIME 500
  139346. +#define TDLS_HANDSHAKE_TIME 2000
  139347. +#define TDLS_ALIVE_COUNT 3
  139348. +#define TDLS_INI_MACID_ENTRY 6
  139349. +
  139350. +/* TDLS */
  139351. +#define TDLS_MIC_LEN 16
  139352. +#define WPA_NONCE_LEN 32
  139353. +#define TDLS_TIMEOUT_LEN 4
  139354. +
  139355. +struct wpa_tdls_ftie {
  139356. + u8 ie_type; /* FTIE */
  139357. + u8 ie_len;
  139358. + u8 mic_ctrl[2];
  139359. + u8 mic[TDLS_MIC_LEN];
  139360. + u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */
  139361. + u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */
  139362. + /* followed by optional elements */
  139363. +} ;
  139364. +
  139365. +struct wpa_tdls_lnkid {
  139366. + u8 ie_type; /* Link Identifier IE */
  139367. + u8 ie_len;
  139368. + u8 bssid[ETH_ALEN];
  139369. + u8 init_sta[ETH_ALEN];
  139370. + u8 resp_sta[ETH_ALEN];
  139371. +} ;
  139372. +
  139373. +static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1
  139374. + 0x00, 0x0f, 0xac, 0x07, //group sipher suite
  139375. + 0x01, 0x00, //pairwise cipher suite count
  139376. + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only
  139377. + 0x01, 0x00, //AKM suite count
  139378. + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake
  139379. + 0x00, 0x02,
  139380. + //PMKID shall not be present
  139381. + };
  139382. +
  139383. +static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero
  139384. +
  139385. +static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37)
  139386. +
  139387. +// SRC: Supported Regulatory Classes
  139388. +static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 };
  139389. +
  139390. +void rtw_reset_tdls_info(_adapter* padapter);
  139391. +int rtw_init_tdls_info(_adapter* padapter);
  139392. +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo);
  139393. +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode);
  139394. +void init_TPK_timer(_adapter *padapter, struct sta_info *psta);
  139395. +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta);
  139396. +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta);
  139397. +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta);
  139398. +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta);
  139399. +void init_handshake_timer(_adapter *padapter, struct sta_info *psta);
  139400. +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);
  139401. +#ifdef CONFIG_WFD
  139402. +void issue_tunneled_probe_req(_adapter *padapter);
  139403. +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);
  139404. +#endif //CONFIG_WFD
  139405. +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr);
  139406. +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr);
  139407. +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame);
  139408. +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame);
  139409. +void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog);
  139410. +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr);
  139411. +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);
  139412. +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr);
  139413. +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr);
  139414. +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  139415. +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);
  139416. +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  139417. +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);
  139418. +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);
  139419. +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);
  139420. +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  139421. +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame);
  139422. +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame);
  139423. +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139424. +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139425. +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139426. +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139427. +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139428. +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog);
  139429. +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139430. +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139431. +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139432. +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139433. +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);
  139434. +
  139435. +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta);
  139436. +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta);
  139437. +#endif //CONFIG_TDLS
  139438. +
  139439. +#endif
  139440. --- /dev/null
  139441. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_version.h
  139442. @@ -0,0 +1 @@
  139443. +#define DRIVERVERSION "v4.0.2_9000.20130911"
  139444. --- /dev/null
  139445. +++ b/drivers/net/wireless/rtl8192cu/include/rtw_xmit.h
  139446. @@ -0,0 +1,753 @@
  139447. +/******************************************************************************
  139448. + *
  139449. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  139450. + *
  139451. + * This program is free software; you can redistribute it and/or modify it
  139452. + * under the terms of version 2 of the GNU General Public License as
  139453. + * published by the Free Software Foundation.
  139454. + *
  139455. + * This program is distributed in the hope that it will be useful, but WITHOUT
  139456. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  139457. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  139458. + * more details.
  139459. + *
  139460. + * You should have received a copy of the GNU General Public License along with
  139461. + * this program; if not, write to the Free Software Foundation, Inc.,
  139462. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  139463. + *
  139464. + *
  139465. + ******************************************************************************/
  139466. +#ifndef _RTW_XMIT_H_
  139467. +#define _RTW_XMIT_H_
  139468. +
  139469. +#include <drv_conf.h>
  139470. +#include <osdep_service.h>
  139471. +#include <drv_types.h>
  139472. +#ifdef PLATFORM_FREEBSD
  139473. +#include <if_ether.h>
  139474. +#endif //PLATFORM_FREEBSD
  139475. +
  139476. +#ifdef CONFIG_SDIO_HCI
  139477. +//#define MAX_XMITBUF_SZ (30720)// (2048)
  139478. +#define MAX_XMITBUF_SZ (12288)
  139479. +#define NR_XMITBUFF (16)
  139480. +
  139481. +#elif defined (CONFIG_USB_HCI)
  139482. +#ifdef CONFIG_USB_TX_AGGREGATION
  139483. + #if defined(CONFIG_PLATFORM_ARM_SUNxI) || defined(CONFIG_PLATFORM_ARM_SUN6I)
  139484. + #define MAX_XMITBUF_SZ (12288) //12k 1536*8
  139485. + #elif defined (CONFIG_PLATFORM_MSTAR)
  139486. + #define MAX_XMITBUF_SZ 7680 // 7.5k
  139487. + #else
  139488. + #define MAX_XMITBUF_SZ (20480) // 20k
  139489. + #endif
  139490. +#else
  139491. +#define MAX_XMITBUF_SZ (2048)
  139492. +#endif //CONFIG_USB_TX_AGGREGATION
  139493. +#ifdef CONFIG_SINGLE_XMIT_BUF
  139494. +#define NR_XMITBUFF (1)
  139495. +#else
  139496. +#define NR_XMITBUFF (4)
  139497. +#endif //CONFIG_SINGLE_XMIT_BUF
  139498. +
  139499. +#elif defined (CONFIG_PCI_HCI)
  139500. +#define MAX_XMITBUF_SZ (1664)
  139501. +#define NR_XMITBUFF (128)
  139502. +#endif
  139503. +
  139504. +#ifdef PLATFORM_OS_CE
  139505. +#define XMITBUF_ALIGN_SZ 4
  139506. +#else
  139507. +#ifdef CONFIG_PCI_HCI
  139508. +#define XMITBUF_ALIGN_SZ 4
  139509. +#else
  139510. +#define XMITBUF_ALIGN_SZ 512
  139511. +#endif
  139512. +#endif
  139513. +
  139514. +// xmit extension buff defination
  139515. +#define MAX_XMIT_EXTBUF_SZ (1536)
  139516. +#ifdef CONFIG_SINGLE_XMIT_BUF
  139517. +#define NR_XMIT_EXTBUFF (1)
  139518. +#else
  139519. +#define NR_XMIT_EXTBUFF (32)
  139520. +#endif //CONFIG_SINGLE_XMIT_BUF
  139521. +
  139522. +#define MAX_NUMBLKS (1)
  139523. +
  139524. +#define XMIT_VO_QUEUE (0)
  139525. +#define XMIT_VI_QUEUE (1)
  139526. +#define XMIT_BE_QUEUE (2)
  139527. +#define XMIT_BK_QUEUE (3)
  139528. +
  139529. +#define VO_QUEUE_INX 0
  139530. +#define VI_QUEUE_INX 1
  139531. +#define BE_QUEUE_INX 2
  139532. +#define BK_QUEUE_INX 3
  139533. +#define BCN_QUEUE_INX 4
  139534. +#define MGT_QUEUE_INX 5
  139535. +#define HIGH_QUEUE_INX 6
  139536. +#define TXCMD_QUEUE_INX 7
  139537. +
  139538. +#define HW_QUEUE_ENTRY 8
  139539. +
  139540. +#ifdef CONFIG_PCI_HCI
  139541. +//#define TXDESC_NUM 64
  139542. +#define TXDESC_NUM 128
  139543. +#define TXDESC_NUM_BE_QUEUE 128
  139544. +#endif
  139545. +
  139546. +#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\
  139547. +do{\
  139548. + pattrib_iv[0] = dot11txpn._byte_.TSC0;\
  139549. + pattrib_iv[1] = dot11txpn._byte_.TSC1;\
  139550. + pattrib_iv[2] = dot11txpn._byte_.TSC2;\
  139551. + pattrib_iv[3] = ((keyidx & 0x3)<<6);\
  139552. + dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\
  139553. +}while(0)
  139554. +
  139555. +
  139556. +#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\
  139557. +do{\
  139558. + pattrib_iv[0] = dot11txpn._byte_.TSC1;\
  139559. + pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\
  139560. + pattrib_iv[2] = dot11txpn._byte_.TSC0;\
  139561. + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
  139562. + pattrib_iv[4] = dot11txpn._byte_.TSC2;\
  139563. + pattrib_iv[5] = dot11txpn._byte_.TSC3;\
  139564. + pattrib_iv[6] = dot11txpn._byte_.TSC4;\
  139565. + pattrib_iv[7] = dot11txpn._byte_.TSC5;\
  139566. + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
  139567. +}while(0)
  139568. +
  139569. +#define AES_IV(pattrib_iv, dot11txpn, keyidx)\
  139570. +do{\
  139571. + pattrib_iv[0] = dot11txpn._byte_.TSC0;\
  139572. + pattrib_iv[1] = dot11txpn._byte_.TSC1;\
  139573. + pattrib_iv[2] = 0;\
  139574. + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\
  139575. + pattrib_iv[4] = dot11txpn._byte_.TSC2;\
  139576. + pattrib_iv[5] = dot11txpn._byte_.TSC3;\
  139577. + pattrib_iv[6] = dot11txpn._byte_.TSC4;\
  139578. + pattrib_iv[7] = dot11txpn._byte_.TSC5;\
  139579. + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\
  139580. +}while(0)
  139581. +
  139582. +
  139583. +#define HWXMIT_ENTRY 4
  139584. +
  139585. +#define TXDESC_SIZE 32
  139586. +
  139587. +#ifdef CONFIG_SDIO_HCI
  139588. +#define TXDESC_OFFSET TXDESC_SIZE
  139589. +#endif
  139590. +
  139591. +#ifdef CONFIG_USB_HCI
  139592. +#define PACKET_OFFSET_SZ (8)
  139593. +#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ)
  139594. +#endif
  139595. +
  139596. +#ifdef CONFIG_PCI_HCI
  139597. +#define TXDESC_OFFSET 0
  139598. +#define TX_DESC_NEXT_DESC_OFFSET 40
  139599. +#endif
  139600. +
  139601. +//
  139602. +//defined for TX DESC Operation
  139603. +//
  139604. +
  139605. +#define MAX_TID (15)
  139606. +
  139607. +//OFFSET 0
  139608. +#define OFFSET_SZ 0
  139609. +#define OFFSET_SHT 16
  139610. +#define BMC BIT(24)
  139611. +#define LSG BIT(26)
  139612. +#define FSG BIT(27)
  139613. +#define OWN BIT(31)
  139614. +
  139615. +//OFFSET 4
  139616. +#define PKT_OFFSET_SZ 0
  139617. +#define BK BIT(6)
  139618. +#define QSEL_SHT 8
  139619. +#define Rate_ID_SHT 16
  139620. +#define NAVUSEHDR BIT(20)
  139621. +#define PKT_OFFSET_SHT 26
  139622. +#define HWPC BIT(31)
  139623. +
  139624. +//OFFSET 8
  139625. +#define AGG_EN BIT(29)
  139626. +
  139627. +//OFFSET 12
  139628. +#define SEQ_SHT 16
  139629. +
  139630. +//OFFSET 16
  139631. +#define QoS BIT(6)
  139632. +#define HW_SEQ_EN BIT(7)
  139633. +#define USERATE BIT(8)
  139634. +#define DISDATAFB BIT(10)
  139635. +#define DATA_SHORT BIT(24)
  139636. +#define DATA_BW BIT(25)
  139637. +
  139638. +//OFFSET 20
  139639. +#define SGI BIT(6)
  139640. +
  139641. +struct tx_desc{
  139642. +
  139643. + //DWORD 0
  139644. + unsigned int txdw0;
  139645. +
  139646. + unsigned int txdw1;
  139647. +
  139648. + unsigned int txdw2;
  139649. +
  139650. + unsigned int txdw3;
  139651. +
  139652. + unsigned int txdw4;
  139653. +
  139654. + unsigned int txdw5;
  139655. +
  139656. + unsigned int txdw6;
  139657. +
  139658. + unsigned int txdw7;
  139659. +#ifdef CONFIG_PCI_HCI
  139660. + unsigned int txdw8;
  139661. +
  139662. + unsigned int txdw9;
  139663. +
  139664. + unsigned int txdw10;
  139665. +
  139666. + unsigned int txdw11;
  139667. +
  139668. + // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now, our descriptor
  139669. + // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute
  139670. + // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor
  139671. + // number or enlarge descriptor size as 64 bytes.
  139672. + unsigned int txdw12;
  139673. +
  139674. + unsigned int txdw13;
  139675. +
  139676. + unsigned int txdw14;
  139677. +
  139678. + unsigned int txdw15;
  139679. +#endif
  139680. +};
  139681. +
  139682. +
  139683. +union txdesc {
  139684. + struct tx_desc txdesc;
  139685. + unsigned int value[TXDESC_SIZE>>2];
  139686. +};
  139687. +
  139688. +#ifdef CONFIG_PCI_HCI
  139689. +#define PCI_MAX_TX_QUEUE_COUNT 8
  139690. +
  139691. +struct rtw_tx_ring {
  139692. + struct tx_desc *desc;
  139693. + dma_addr_t dma;
  139694. + unsigned int idx;
  139695. + unsigned int entries;
  139696. + _queue queue;
  139697. + u32 qlen;
  139698. +};
  139699. +#endif
  139700. +
  139701. +struct hw_xmit {
  139702. + //_lock xmit_lock;
  139703. + //_list pending;
  139704. + _queue *sta_queue;
  139705. + //struct hw_txqueue *phwtxqueue;
  139706. + //sint txcmdcnt;
  139707. + int accnt;
  139708. +};
  139709. +
  139710. +#if 0
  139711. +struct pkt_attrib
  139712. +{
  139713. + u8 type;
  139714. + u8 subtype;
  139715. + u8 bswenc;
  139716. + u8 dhcp_pkt;
  139717. + u16 ether_type;
  139718. + int pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data)
  139719. + int pkt_hdrlen; //the original 802.3 pkt header len
  139720. + int hdrlen; //the WLAN Header Len
  139721. + int nr_frags;
  139722. + int last_txcmdsz;
  139723. + int encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
  139724. + u8 iv[8];
  139725. + int iv_len;
  139726. + u8 icv[8];
  139727. + int icv_len;
  139728. + int priority;
  139729. + int ack_policy;
  139730. + int mac_id;
  139731. + int vcs_mode; //virtual carrier sense method
  139732. +
  139733. + u8 dst[ETH_ALEN];
  139734. + u8 src[ETH_ALEN];
  139735. + u8 ta[ETH_ALEN];
  139736. + u8 ra[ETH_ALEN];
  139737. +
  139738. + u8 key_idx;
  139739. +
  139740. + u8 qos_en;
  139741. + u8 ht_en;
  139742. + u8 raid;//rate adpative id
  139743. + u8 bwmode;
  139744. + u8 ch_offset;//PRIME_CHNL_OFFSET
  139745. + u8 sgi;//short GI
  139746. + u8 ampdu_en;//tx ampdu enable
  139747. + u8 mdata;//more data bit
  139748. + u8 eosp;
  139749. +
  139750. + u8 pctrl;//per packet txdesc control enable
  139751. + u8 triggered;//for ap mode handling Power Saving sta
  139752. +
  139753. + u32 qsel;
  139754. + u16 seqnum;
  139755. +
  139756. + struct sta_info * psta;
  139757. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  139758. + u8 hw_tcp_csum;
  139759. +#endif
  139760. +};
  139761. +#else
  139762. +//reduce size
  139763. +struct pkt_attrib
  139764. +{
  139765. + u8 type;
  139766. + u8 subtype;
  139767. + u8 bswenc;
  139768. + u8 dhcp_pkt;
  139769. + u16 ether_type;
  139770. + u16 seqnum;
  139771. + u16 pkt_hdrlen; //the original 802.3 pkt header len
  139772. + u16 hdrlen; //the WLAN Header Len
  139773. + u32 pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data)
  139774. + u32 last_txcmdsz;
  139775. + u8 nr_frags;
  139776. + u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith
  139777. + u8 iv_len;
  139778. + u8 icv_len;
  139779. + u8 iv[8];
  139780. + u8 icv[8];
  139781. + u8 priority;
  139782. + u8 ack_policy;
  139783. + u8 mac_id;
  139784. + u8 vcs_mode; //virtual carrier sense method
  139785. + u8 dst[ETH_ALEN];
  139786. + u8 src[ETH_ALEN];
  139787. + u8 ta[ETH_ALEN];
  139788. + u8 ra[ETH_ALEN];
  139789. + u8 key_idx;
  139790. + u8 qos_en;
  139791. + u8 ht_en;
  139792. + u8 raid;//rate adpative id
  139793. + u8 bwmode;
  139794. + u8 ch_offset;//PRIME_CHNL_OFFSET
  139795. + u8 sgi;//short GI
  139796. + u8 ampdu_en;//tx ampdu enable
  139797. + u8 mdata;//more data bit
  139798. + u8 pctrl;//per packet txdesc control enable
  139799. + u8 triggered;//for ap mode handling Power Saving sta
  139800. + u8 qsel;
  139801. + u8 eosp;
  139802. + u8 rate;
  139803. + u8 intel_proxim;
  139804. + u8 retry_ctrl;
  139805. + struct sta_info * psta;
  139806. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  139807. + u8 hw_tcp_csum;
  139808. +#endif
  139809. + union Keytype dot11tkiptxmickey;
  139810. + //union Keytype dot11tkiprxmickey;
  139811. + union Keytype dot118021x_UncstKey;
  139812. +};
  139813. +#endif
  139814. +
  139815. +#ifdef PLATFORM_FREEBSD
  139816. +#define ETH_ALEN 6 /* Octets in one ethernet addr */
  139817. +#define ETH_HLEN 14 /* Total octets in header. */
  139818. +#define ETH_P_IP 0x0800 /* Internet Protocol packet */
  139819. +
  139820. +/*struct rtw_ieee80211_hdr {
  139821. + uint16_t frame_control;
  139822. + uint16_t duration_id;
  139823. + u8 addr1[6];
  139824. + u8 addr2[6];
  139825. + u8 addr3[6];
  139826. + uint16_t seq_ctrl;
  139827. + u8 addr4[6];
  139828. +} ;*/
  139829. +#endif //PLATFORM_FREEBSD
  139830. +
  139831. +#define WLANHDR_OFFSET 64
  139832. +
  139833. +#define NULL_FRAMETAG (0x0)
  139834. +#define DATA_FRAMETAG 0x01
  139835. +#define L2_FRAMETAG 0x02
  139836. +#define MGNT_FRAMETAG 0x03
  139837. +#define AMSDU_FRAMETAG 0x04
  139838. +
  139839. +#define EII_FRAMETAG 0x05
  139840. +#define IEEE8023_FRAMETAG 0x06
  139841. +
  139842. +#define MP_FRAMETAG 0x07
  139843. +
  139844. +#define TXAGG_FRAMETAG 0x08
  139845. +
  139846. +struct submit_ctx{
  139847. + u32 submit_time; /* */
  139848. + u32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */
  139849. + int status; /* status for operation */
  139850. +#ifdef PLATFORM_LINUX
  139851. + struct completion done;
  139852. +#endif
  139853. +};
  139854. +
  139855. +enum {
  139856. + RTW_SCTX_SUBMITTED = -1,
  139857. + RTW_SCTX_DONE_SUCCESS = 0,
  139858. + RTW_SCTX_DONE_UNKNOWN,
  139859. + RTW_SCTX_DONE_TIMEOUT,
  139860. + RTW_SCTX_DONE_BUF_ALLOC,
  139861. + RTW_SCTX_DONE_BUF_FREE,
  139862. + RTW_SCTX_DONE_WRITE_PORT_ERR,
  139863. + RTW_SCTX_DONE_TX_DESC_NA,
  139864. + RTW_SCTX_DONE_TX_DENY,
  139865. + RTW_SCTX_DONE_CCX_PKT_FAIL,
  139866. + RTW_SCTX_DONE_DRV_STOP,
  139867. + RTW_SCTX_DONE_DEV_REMOVE,
  139868. +};
  139869. +
  139870. +
  139871. +void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms);
  139872. +int rtw_sctx_wait(struct submit_ctx *sctx);
  139873. +void rtw_sctx_done_err(struct submit_ctx **sctx, int status);
  139874. +void rtw_sctx_done(struct submit_ctx **sctx);
  139875. +
  139876. +struct xmit_buf
  139877. +{
  139878. + _list list;
  139879. +
  139880. + _adapter *padapter;
  139881. +
  139882. + u8 *pallocated_buf;
  139883. +
  139884. + u8 *pbuf;
  139885. +
  139886. + void *priv_data;
  139887. +
  139888. + u16 ext_tag; // 0: Normal xmitbuf, 1: extension xmitbuf.
  139889. + u16 flags;
  139890. + u32 alloc_sz;
  139891. +
  139892. + struct submit_ctx *sctx;
  139893. +
  139894. +#ifdef CONFIG_USB_HCI
  139895. +
  139896. + u32 sz[8];
  139897. +
  139898. +#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
  139899. + PURB pxmit_urb[8];
  139900. + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */
  139901. +#endif
  139902. +
  139903. +#ifdef PLATFORM_OS_XP
  139904. + PIRP pxmit_irp[8];
  139905. +#endif
  139906. +
  139907. +#ifdef PLATFORM_OS_CE
  139908. + USB_TRANSFER usb_transfer_write_port;
  139909. +#endif
  139910. +
  139911. + u8 bpending[8];
  139912. +
  139913. + sint last[8];
  139914. +
  139915. +#endif
  139916. +
  139917. +#ifdef CONFIG_SDIO_HCI
  139918. + u32 len;
  139919. + u8 *phead;
  139920. + u8 *pdata;
  139921. + u8 *ptail;
  139922. + u8 *pend;
  139923. + u32 ff_hwaddr;
  139924. +#ifdef PLATFORM_OS_XP
  139925. + PMDL pxmitbuf_mdl;
  139926. + PIRP pxmitbuf_irp;
  139927. + PSDBUS_REQUEST_PACKET pxmitbuf_sdrp;
  139928. +#endif
  139929. +#endif
  139930. +
  139931. +#ifdef CONFIG_PCI_HCI
  139932. + u32 len;
  139933. +#endif
  139934. +
  139935. +#ifdef DBG_XMIT_BUF
  139936. + u8 no;
  139937. +#endif
  139938. +
  139939. +};
  139940. +
  139941. +struct xmit_frame
  139942. +{
  139943. + _list list;
  139944. +
  139945. + struct pkt_attrib attrib;
  139946. +
  139947. + _pkt *pkt;
  139948. +
  139949. + int frame_tag;
  139950. +
  139951. + _adapter *padapter;
  139952. +
  139953. + u8 *buf_addr;
  139954. +
  139955. + struct xmit_buf *pxmitbuf;
  139956. +
  139957. +#ifdef CONFIG_SDIO_HCI
  139958. + u8 pg_num;
  139959. + u8 agg_num;
  139960. +#endif
  139961. +
  139962. +#ifdef CONFIG_USB_HCI
  139963. +#ifdef CONFIG_USB_TX_AGGREGATION
  139964. + u8 agg_num;
  139965. +#endif
  139966. + u8 pkt_offset;
  139967. +#ifdef CONFIG_RTL8192D
  139968. + u8 EMPktNum;
  139969. + u16 EMPktLen[5];//The max value by HW
  139970. +#endif
  139971. +#endif
  139972. +#ifdef CONFIG_XMIT_ACK
  139973. + u8 ack_report;
  139974. +#endif
  139975. +
  139976. + u8 *alloc_addr; /* the actual address this xmitframe allocated */
  139977. + u8 ext_tag; /* 0:data, 1:mgmt */
  139978. +
  139979. +};
  139980. +
  139981. +struct tx_servq {
  139982. + _list tx_pending;
  139983. + _queue sta_pending;
  139984. + int qcnt;
  139985. +};
  139986. +
  139987. +
  139988. +
  139989. +struct sta_xmit_priv
  139990. +{
  139991. + _lock lock;
  139992. + sint option;
  139993. + sint apsd_setting; //When bit mask is on, the associated edca queue supports APSD.
  139994. +
  139995. +
  139996. + //struct tx_servq blk_q[MAX_NUMBLKS];
  139997. + struct tx_servq be_q; //priority == 0,3
  139998. + struct tx_servq bk_q; //priority == 1,2
  139999. + struct tx_servq vi_q; //priority == 4,5
  140000. + struct tx_servq vo_q; //priority == 6,7
  140001. + _list legacy_dz;
  140002. + _list apsd;
  140003. +
  140004. + u16 txseq_tid[16];
  140005. +
  140006. + //uint sta_tx_bytes;
  140007. + //u64 sta_tx_pkts;
  140008. + //uint sta_tx_fail;
  140009. +
  140010. +};
  140011. +
  140012. +
  140013. +struct hw_txqueue {
  140014. + volatile sint head;
  140015. + volatile sint tail;
  140016. + volatile sint free_sz; //in units of 64 bytes
  140017. + volatile sint free_cmdsz;
  140018. + volatile sint txsz[8];
  140019. + uint ff_hwaddr;
  140020. + uint cmd_hwaddr;
  140021. + sint ac_tag;
  140022. +};
  140023. +
  140024. +
  140025. +struct xmit_priv {
  140026. +
  140027. + _lock lock;
  140028. +
  140029. + _sema xmit_sema;
  140030. + _sema terminate_xmitthread_sema;
  140031. +
  140032. + //_queue blk_strms[MAX_NUMBLKS];
  140033. + _queue be_pending;
  140034. + _queue bk_pending;
  140035. + _queue vi_pending;
  140036. + _queue vo_pending;
  140037. + _queue bm_pending;
  140038. +
  140039. + //_queue legacy_dz_queue;
  140040. + //_queue apsd_queue;
  140041. +
  140042. + u8 *pallocated_frame_buf;
  140043. + u8 *pxmit_frame_buf;
  140044. + uint free_xmitframe_cnt;
  140045. + _queue free_xmit_queue;
  140046. +
  140047. + //uint mapping_addr;
  140048. + //uint pkt_sz;
  140049. +
  140050. + u8 *xframe_ext_alloc_addr;
  140051. + u8 *xframe_ext;
  140052. + uint free_xframe_ext_cnt;
  140053. + _queue free_xframe_ext_queue;
  140054. +
  140055. + //struct hw_txqueue be_txqueue;
  140056. + //struct hw_txqueue bk_txqueue;
  140057. + //struct hw_txqueue vi_txqueue;
  140058. + //struct hw_txqueue vo_txqueue;
  140059. + //struct hw_txqueue bmc_txqueue;
  140060. +
  140061. + uint frag_len;
  140062. +
  140063. + _adapter *adapter;
  140064. +
  140065. + u8 vcs_setting;
  140066. + u8 vcs;
  140067. + u8 vcs_type;
  140068. + //u16 rts_thresh;
  140069. +
  140070. + u64 tx_bytes;
  140071. + u64 tx_pkts;
  140072. + u64 tx_drop;
  140073. + u64 last_tx_bytes;
  140074. + u64 last_tx_pkts;
  140075. +
  140076. + struct hw_xmit *hwxmits;
  140077. + u8 hwxmit_entry;
  140078. +
  140079. +#ifdef CONFIG_USB_HCI
  140080. + _sema tx_retevt;//all tx return event;
  140081. + u8 txirp_cnt;//
  140082. +
  140083. +#ifdef PLATFORM_OS_CE
  140084. + USB_TRANSFER usb_transfer_write_port;
  140085. +// USB_TRANSFER usb_transfer_write_mem;
  140086. +#endif
  140087. +#ifdef PLATFORM_LINUX
  140088. + struct tasklet_struct xmit_tasklet;
  140089. +#endif
  140090. +#ifdef PLATFORM_FREEBSD
  140091. + struct task xmit_tasklet;
  140092. +#endif
  140093. + //per AC pending irp
  140094. + int beq_cnt;
  140095. + int bkq_cnt;
  140096. + int viq_cnt;
  140097. + int voq_cnt;
  140098. +
  140099. +#endif
  140100. +
  140101. +#ifdef CONFIG_PCI_HCI
  140102. + // Tx
  140103. + struct rtw_tx_ring tx_ring[PCI_MAX_TX_QUEUE_COUNT];
  140104. + int txringcount[PCI_MAX_TX_QUEUE_COUNT];
  140105. +#ifdef PLATFORM_LINUX
  140106. + struct tasklet_struct xmit_tasklet;
  140107. +#endif
  140108. +#endif
  140109. +
  140110. + _queue free_xmitbuf_queue;
  140111. + _queue pending_xmitbuf_queue;
  140112. + u8 *pallocated_xmitbuf;
  140113. + u8 *pxmitbuf;
  140114. + uint free_xmitbuf_cnt;
  140115. +
  140116. + _queue free_xmit_extbuf_queue;
  140117. + u8 *pallocated_xmit_extbuf;
  140118. + u8 *pxmit_extbuf;
  140119. + uint free_xmit_extbuf_cnt;
  140120. +
  140121. + u16 nqos_ssn;
  140122. +
  140123. +#ifdef CONFIG_XMIT_ACK
  140124. + int ack_tx;
  140125. + _mutex ack_tx_mutex;
  140126. + struct submit_ctx ack_tx_ops;
  140127. +#endif
  140128. + _lock lock_sctx;
  140129. +};
  140130. +
  140131. +extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
  140132. +extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
  140133. +
  140134. +extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv);
  140135. +extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
  140136. +
  140137. +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);
  140138. +extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);
  140139. +extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);
  140140. +extern s32 rtw_put_snap(u8 *data, u16 h_proto);
  140141. +
  140142. +extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv);
  140143. +struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv);
  140144. +struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv);
  140145. +extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe);
  140146. +extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue);
  140147. +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac);
  140148. +extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
  140149. +extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry);
  140150. +
  140151. +extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe);
  140152. +extern thread_return rtw_xmit_thread(thread_context context);
  140153. +extern u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib);
  140154. +#define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib)
  140155. +extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
  140156. +#ifdef CONFIG_IEEE80211W
  140157. +extern s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);
  140158. +#endif //CONFIG_IEEE80211W
  140159. +#ifdef CONFIG_TDLS
  140160. +s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action);
  140161. +#endif //CONFIG_TDLS
  140162. +s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag);
  140163. +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);
  140164. +
  140165. +
  140166. +s32 rtw_txframes_pending(_adapter *padapter);
  140167. +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib);
  140168. +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry);
  140169. +
  140170. +
  140171. +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter);
  140172. +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv);
  140173. +
  140174. +
  140175. +void rtw_alloc_hwxmits(_adapter *padapter);
  140176. +void rtw_free_hwxmits(_adapter *padapter);
  140177. +
  140178. +
  140179. +s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
  140180. +
  140181. +#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
  140182. +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
  140183. +void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
  140184. +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta);
  140185. +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta);
  140186. +#endif
  140187. +
  140188. +u8 qos_acm(u8 acm_mask, u8 priority);
  140189. +
  140190. +#ifdef CONFIG_XMIT_ACK
  140191. +int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms);
  140192. +void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status);
  140193. +#endif //CONFIG_XMIT_ACK
  140194. +
  140195. +
  140196. +//include after declaring struct xmit_buf, in order to avoid warning
  140197. +#include <xmit_osdep.h>
  140198. +
  140199. +#endif //_RTL871X_XMIT_H_
  140200. --- /dev/null
  140201. +++ b/drivers/net/wireless/rtl8192cu/include/sta_info.h
  140202. @@ -0,0 +1,431 @@
  140203. +/******************************************************************************
  140204. + *
  140205. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140206. + *
  140207. + * This program is free software; you can redistribute it and/or modify it
  140208. + * under the terms of version 2 of the GNU General Public License as
  140209. + * published by the Free Software Foundation.
  140210. + *
  140211. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140212. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140213. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140214. + * more details.
  140215. + *
  140216. + * You should have received a copy of the GNU General Public License along with
  140217. + * this program; if not, write to the Free Software Foundation, Inc.,
  140218. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140219. + *
  140220. + *
  140221. + ******************************************************************************/
  140222. +#ifndef __STA_INFO_H_
  140223. +#define __STA_INFO_H_
  140224. +
  140225. +#include <drv_conf.h>
  140226. +#include <osdep_service.h>
  140227. +#include <drv_types.h>
  140228. +#include <wifi.h>
  140229. +
  140230. +#define IBSS_START_MAC_ID 2
  140231. +#define NUM_STA 32
  140232. +#define NUM_ACL 16
  140233. +
  140234. +
  140235. +//if mode ==0, then the sta is allowed once the addr is hit.
  140236. +//if mode ==1, then the sta is rejected once the addr is non-hit.
  140237. +struct rtw_wlan_acl_node {
  140238. + _list list;
  140239. + u8 addr[ETH_ALEN];
  140240. + u8 valid;
  140241. +};
  140242. +
  140243. +//mode=0, disable
  140244. +//mode=1, accept unless in deny list
  140245. +//mode=2, deny unless in accept list
  140246. +struct wlan_acl_pool {
  140247. + int mode;
  140248. + int num;
  140249. + struct rtw_wlan_acl_node aclnode[NUM_ACL];
  140250. + _queue acl_node_q;
  140251. +};
  140252. +
  140253. +typedef struct _RSSI_STA{
  140254. + s32 UndecoratedSmoothedPWDB;
  140255. + s32 UndecoratedSmoothedCCK;
  140256. + s32 UndecoratedSmoothedOFDM;
  140257. + u64 PacketMap;
  140258. + u8 ValidBit;
  140259. +}RSSI_STA, *PRSSI_STA;
  140260. +
  140261. +struct stainfo_stats {
  140262. +
  140263. + u64 rx_mgnt_pkts;
  140264. + u64 rx_beacon_pkts;
  140265. + u64 rx_probereq_pkts;
  140266. + u64 rx_probersp_pkts;
  140267. + u64 rx_probersp_bm_pkts;
  140268. + u64 rx_probersp_uo_pkts;
  140269. + u64 rx_ctrl_pkts;
  140270. + u64 rx_data_pkts;
  140271. +
  140272. + u64 last_rx_mgnt_pkts;
  140273. + u64 last_rx_beacon_pkts;
  140274. + u64 last_rx_probereq_pkts;
  140275. + u64 last_rx_probersp_pkts;
  140276. + u64 last_rx_probersp_bm_pkts;
  140277. + u64 last_rx_probersp_uo_pkts;
  140278. + u64 last_rx_ctrl_pkts;
  140279. + u64 last_rx_data_pkts;
  140280. +
  140281. + u64 rx_bytes;
  140282. + u64 rx_drops;
  140283. +
  140284. + u64 tx_pkts;
  140285. + u64 tx_bytes;
  140286. + u64 tx_drops;
  140287. +
  140288. +};
  140289. +
  140290. +#ifdef CONFIG_TDLS
  140291. +struct TDLS_PeerKey {
  140292. + u8 kck[16]; /* TPK-KCK */
  140293. + u8 tk[16]; /* TPK-TK; only CCMP will be used */
  140294. +} ;
  140295. +#endif //CONFIG_TDLS
  140296. +
  140297. +struct sta_info {
  140298. +
  140299. + _lock lock;
  140300. + _list list; //free_sta_queue
  140301. + _list hash_list; //sta_hash
  140302. + //_list asoc_list; //20061114
  140303. + //_list sleep_list;//sleep_q
  140304. + //_list wakeup_list;//wakeup_q
  140305. +
  140306. + struct sta_xmit_priv sta_xmitpriv;
  140307. + struct sta_recv_priv sta_recvpriv;
  140308. +
  140309. + _queue sleep_q;
  140310. + unsigned int sleepq_len;
  140311. +
  140312. + uint state;
  140313. + uint aid;
  140314. + uint mac_id;
  140315. + uint qos_option;
  140316. + u8 hwaddr[ETH_ALEN];
  140317. +
  140318. + uint ieee8021x_blocked; //0: allowed, 1:blocked
  140319. + uint dot118021XPrivacy; //aes, tkip...
  140320. + union Keytype dot11tkiptxmickey;
  140321. + union Keytype dot11tkiprxmickey;
  140322. + union Keytype dot118021x_UncstKey;
  140323. + union pn48 dot11txpn; // PN48 used for Unicast xmit.
  140324. +#ifdef CONFIG_IEEE80211W
  140325. + union pn48 dot11wtxpn; // PN48 used for Unicast mgmt xmit.
  140326. +#endif //CONFIG_IEEE80211W
  140327. + union pn48 dot11rxpn; // PN48 used for Unicast recv.
  140328. +
  140329. +
  140330. + u8 bssrateset[16];
  140331. + u32 bssratelen;
  140332. + s32 rssi;
  140333. + s32 signal_quality;
  140334. +
  140335. + u8 cts2self;
  140336. + u8 rtsen;
  140337. +
  140338. + u8 raid;
  140339. + u8 init_rate;
  140340. + u32 ra_mask;
  140341. + struct stainfo_stats sta_stats;
  140342. +
  140343. +#ifdef CONFIG_TDLS
  140344. + u32 tdls_sta_state;
  140345. + u8 dialog;
  140346. + u8 SNonce[32];
  140347. + u8 ANonce[32];
  140348. + u32 TDLS_PeerKey_Lifetime;
  140349. + u16 TPK_count;
  140350. + _timer TPK_timer;
  140351. + struct TDLS_PeerKey tpk;
  140352. + _adapter *padapter;
  140353. + u16 stat_code;
  140354. + u8 off_ch;
  140355. + u16 ch_switch_time;
  140356. + u16 ch_switch_timeout;
  140357. + u8 option;
  140358. + _timer option_timer;
  140359. + _timer base_ch_timer;
  140360. + _timer off_ch_timer;
  140361. +
  140362. + _timer handshake_timer;
  140363. + _timer alive_timer1;
  140364. + _timer alive_timer2;
  140365. + u8 timer_flag;
  140366. + u8 alive_count;
  140367. +#endif //CONFIG_TDLS
  140368. +
  140369. + //for A-MPDU TX, ADDBA timeout check
  140370. + _timer addba_retry_timer;
  140371. +
  140372. + //for A-MPDU Rx reordering buffer control
  140373. + struct recv_reorder_ctrl recvreorder_ctrl[16];
  140374. +
  140375. + //for A-MPDU Tx
  140376. + //unsigned char ampdu_txen_bitmap;
  140377. + u16 BA_starting_seqctrl[16];
  140378. +
  140379. +
  140380. +#ifdef CONFIG_80211N_HT
  140381. + struct ht_priv htpriv;
  140382. +#endif
  140383. +
  140384. + //Notes:
  140385. + //STA_Mode:
  140386. + //curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO
  140387. + //scan_q: AP CAP/INFO
  140388. +
  140389. + //AP_Mode:
  140390. + //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO
  140391. + //sta_info: (AP & STA) CAP/INFO
  140392. +
  140393. +#ifdef CONFIG_AP_MODE
  140394. +
  140395. + _list asoc_list;
  140396. + _list auth_list;
  140397. +
  140398. + unsigned int expire_to;
  140399. + unsigned int auth_seq;
  140400. + unsigned int authalg;
  140401. + unsigned char chg_txt[128];
  140402. +
  140403. + u16 capability;
  140404. + int flags;
  140405. +
  140406. + int dot8021xalg;//0:disable, 1:psk, 2:802.1x
  140407. + int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2
  140408. + int wpa_group_cipher;
  140409. + int wpa2_group_cipher;
  140410. + int wpa_pairwise_cipher;
  140411. + int wpa2_pairwise_cipher;
  140412. +
  140413. + u8 bpairwise_key_installed;
  140414. +
  140415. +#ifdef CONFIG_NATIVEAP_MLME
  140416. + u8 wpa_ie[32];
  140417. +
  140418. + u8 nonerp_set;
  140419. + u8 no_short_slot_time_set;
  140420. + u8 no_short_preamble_set;
  140421. + u8 no_ht_gf_set;
  140422. + u8 no_ht_set;
  140423. + u8 ht_20mhz_set;
  140424. +#endif // CONFIG_NATIVEAP_MLME
  140425. +
  140426. + unsigned int tx_ra_bitmap;
  140427. + u8 qos_info;
  140428. +
  140429. + u8 max_sp_len;
  140430. + u8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled
  140431. + u8 uapsd_be;
  140432. + u8 uapsd_vi;
  140433. + u8 uapsd_vo;
  140434. +
  140435. + u8 has_legacy_ac;
  140436. + unsigned int sleepq_ac_len;
  140437. +
  140438. +#ifdef CONFIG_P2P
  140439. + //p2p priv data
  140440. + u8 is_p2p_device;
  140441. + u8 p2p_status_code;
  140442. +
  140443. + //p2p client info
  140444. + u8 dev_addr[ETH_ALEN];
  140445. + //u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN]
  140446. + u8 dev_cap;
  140447. + u16 config_methods;
  140448. + u8 primary_dev_type[8];
  140449. + u8 num_of_secdev_type;
  140450. + u8 secdev_types_list[32];// 32/8 == 4;
  140451. + u16 dev_name_len;
  140452. + u8 dev_name[32];
  140453. +#endif //CONFIG_P2P
  140454. +
  140455. +#ifdef CONFIG_TX_MCAST2UNI
  140456. + u8 under_exist_checking;
  140457. +#endif // CONFIG_TX_MCAST2UNI
  140458. +
  140459. + u8 keep_alive_trycnt;
  140460. +
  140461. +#endif // CONFIG_AP_MODE
  140462. +
  140463. +#ifdef CONFIG_IOCTL_CFG80211
  140464. + u8 *passoc_req;
  140465. + u32 assoc_req_len;
  140466. +#endif
  140467. +
  140468. + //for DM
  140469. + RSSI_STA rssi_stat;
  140470. +
  140471. + /* To store the sequence number of received management frame */
  140472. + u16 RxMgmtFrameSeqNum;
  140473. +};
  140474. +
  140475. +#define sta_rx_pkts(sta) \
  140476. + (sta->sta_stats.rx_mgnt_pkts \
  140477. + + sta->sta_stats.rx_ctrl_pkts \
  140478. + + sta->sta_stats.rx_data_pkts)
  140479. +
  140480. +#define sta_last_rx_pkts(sta) \
  140481. + (sta->sta_stats.last_rx_mgnt_pkts \
  140482. + + sta->sta_stats.last_rx_ctrl_pkts \
  140483. + + sta->sta_stats.last_rx_data_pkts)
  140484. +
  140485. +#define sta_rx_data_pkts(sta) \
  140486. + (sta->sta_stats.rx_data_pkts)
  140487. +
  140488. +#define sta_last_rx_data_pkts(sta) \
  140489. + (sta->sta_stats.last_rx_data_pkts)
  140490. +
  140491. +#define sta_rx_mgnt_pkts(sta) \
  140492. + (sta->sta_stats.rx_mgnt_pkts)
  140493. +
  140494. +#define sta_last_rx_mgnt_pkts(sta) \
  140495. + (sta->sta_stats.last_rx_mgnt_pkts)
  140496. +
  140497. +#define sta_rx_beacon_pkts(sta) \
  140498. + (sta->sta_stats.rx_beacon_pkts)
  140499. +
  140500. +#define sta_last_rx_beacon_pkts(sta) \
  140501. + (sta->sta_stats.last_rx_beacon_pkts)
  140502. +
  140503. +#define sta_rx_probereq_pkts(sta) \
  140504. + (sta->sta_stats.rx_probereq_pkts)
  140505. +
  140506. +#define sta_last_rx_probereq_pkts(sta) \
  140507. + (sta->sta_stats.last_rx_probereq_pkts)
  140508. +
  140509. +#define sta_rx_probersp_pkts(sta) \
  140510. + (sta->sta_stats.rx_probersp_pkts)
  140511. +
  140512. +#define sta_last_rx_probersp_pkts(sta) \
  140513. + (sta->sta_stats.last_rx_probersp_pkts)
  140514. +
  140515. +#define sta_rx_probersp_bm_pkts(sta) \
  140516. + (sta->sta_stats.rx_probersp_bm_pkts)
  140517. +
  140518. +#define sta_last_rx_probersp_bm_pkts(sta) \
  140519. + (sta->sta_stats.last_rx_probersp_bm_pkts)
  140520. +
  140521. +#define sta_rx_probersp_uo_pkts(sta) \
  140522. + (sta->sta_stats.rx_probersp_uo_pkts)
  140523. +
  140524. +#define sta_last_rx_probersp_uo_pkts(sta) \
  140525. + (sta->sta_stats.last_rx_probersp_uo_pkts)
  140526. +
  140527. +#define sta_update_last_rx_pkts(sta) \
  140528. + do { \
  140529. + sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \
  140530. + sta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \
  140531. + sta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \
  140532. + sta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \
  140533. + sta->sta_stats.last_rx_probersp_bm_pkts = sta->sta_stats.rx_probersp_bm_pkts; \
  140534. + sta->sta_stats.last_rx_probersp_uo_pkts = sta->sta_stats.rx_probersp_uo_pkts; \
  140535. + sta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \
  140536. + sta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \
  140537. + } while(0)
  140538. +
  140539. +#define STA_RX_PKTS_ARG(sta) \
  140540. + sta->sta_stats.rx_mgnt_pkts \
  140541. + , sta->sta_stats.rx_ctrl_pkts \
  140542. + , sta->sta_stats.rx_data_pkts
  140543. +
  140544. +#define STA_LAST_RX_PKTS_ARG(sta) \
  140545. + sta->sta_stats.last_rx_mgnt_pkts \
  140546. + , sta->sta_stats.last_rx_ctrl_pkts \
  140547. + , sta->sta_stats.last_rx_data_pkts
  140548. +
  140549. +#define STA_RX_PKTS_DIFF_ARG(sta) \
  140550. + sta->sta_stats.rx_mgnt_pkts - sta->sta_stats.last_rx_mgnt_pkts \
  140551. + , sta->sta_stats.rx_ctrl_pkts - sta->sta_stats.last_rx_ctrl_pkts \
  140552. + , sta->sta_stats.rx_data_pkts -sta->sta_stats.last_rx_data_pkts
  140553. +
  140554. +#define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)"
  140555. +
  140556. +struct sta_priv {
  140557. +
  140558. + u8 *pallocated_stainfo_buf;
  140559. + u8 *pstainfo_buf;
  140560. + _queue free_sta_queue;
  140561. +
  140562. + _lock sta_hash_lock;
  140563. + _list sta_hash[NUM_STA];
  140564. + int asoc_sta_count;
  140565. + _queue sleep_q;
  140566. + _queue wakeup_q;
  140567. +
  140568. + _adapter *padapter;
  140569. +
  140570. +
  140571. +#ifdef CONFIG_AP_MODE
  140572. + _list asoc_list;
  140573. + _list auth_list;
  140574. + _lock asoc_list_lock;
  140575. + _lock auth_list_lock;
  140576. + u8 asoc_list_cnt;
  140577. + u8 auth_list_cnt;
  140578. +
  140579. + unsigned int auth_to; //sec, time to expire in authenticating.
  140580. + unsigned int assoc_to; //sec, time to expire before associating.
  140581. + unsigned int expire_to; //sec , time to expire after associated.
  140582. +
  140583. + /* pointers to STA info; based on allocated AID or NULL if AID free
  140584. + * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1
  140585. + * and so on
  140586. + */
  140587. + struct sta_info *sta_aid[NUM_STA];
  140588. +
  140589. + u16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta.
  140590. + u16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15
  140591. +
  140592. + u16 max_num_sta;
  140593. +
  140594. + struct wlan_acl_pool acl_list;
  140595. +#endif
  140596. +
  140597. +};
  140598. +
  140599. +
  140600. +__inline static u32 wifi_mac_hash(u8 *mac)
  140601. +{
  140602. + u32 x;
  140603. +
  140604. + x = mac[0];
  140605. + x = (x << 2) ^ mac[1];
  140606. + x = (x << 2) ^ mac[2];
  140607. + x = (x << 2) ^ mac[3];
  140608. + x = (x << 2) ^ mac[4];
  140609. + x = (x << 2) ^ mac[5];
  140610. +
  140611. + x ^= x >> 8;
  140612. + x = x & (NUM_STA - 1);
  140613. +
  140614. + return x;
  140615. +}
  140616. +
  140617. +
  140618. +extern u32 _rtw_init_sta_priv(struct sta_priv *pstapriv);
  140619. +extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv);
  140620. +
  140621. +#define stainfo_offset_valid(offset) (offset < NUM_STA && offset >= 0)
  140622. +int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta);
  140623. +struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset);
  140624. +
  140625. +extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr);
  140626. +extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta);
  140627. +extern void rtw_free_all_stainfo(_adapter *padapter);
  140628. +extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr);
  140629. +extern u32 rtw_init_bcmc_stainfo(_adapter* padapter);
  140630. +extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter);
  140631. +extern u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr);
  140632. +
  140633. +#endif //_STA_INFO_H_
  140634. --- /dev/null
  140635. +++ b/drivers/net/wireless/rtl8192cu/include/usb_hal.h
  140636. @@ -0,0 +1,36 @@
  140637. +/******************************************************************************
  140638. + *
  140639. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140640. + *
  140641. + * This program is free software; you can redistribute it and/or modify it
  140642. + * under the terms of version 2 of the GNU General Public License as
  140643. + * published by the Free Software Foundation.
  140644. + *
  140645. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140646. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140647. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140648. + * more details.
  140649. + *
  140650. + * You should have received a copy of the GNU General Public License along with
  140651. + * this program; if not, write to the Free Software Foundation, Inc.,
  140652. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140653. + *
  140654. + *
  140655. + ******************************************************************************/
  140656. +#ifndef __USB_HAL_H__
  140657. +#define __USB_HAL_H__
  140658. +
  140659. +
  140660. +void rtl8192cu_set_hal_ops(_adapter * padapter);
  140661. +
  140662. +void rtl8192du_set_hal_ops(_adapter * padapter);
  140663. +#ifdef CONFIG_INTEL_PROXIM
  140664. +extern _adapter *rtw_usb_get_sw_pointer(void);
  140665. +#endif //CONFIG_INTEL_PROXIM
  140666. +#ifdef CONFIG_WOWLAN
  140667. +#ifdef CONFIG_WOWLAN_MANUAL
  140668. +extern int rtw_suspend_toshiba(PADAPTER Adapter);
  140669. +extern int rtw_resume_toshiba(PADAPTER Adapter);
  140670. +#endif // CONFIG_WOWLAN_MANUAL
  140671. +#endif //CONFIG_WOWLAN
  140672. +#endif //__USB_HAL_H__
  140673. --- /dev/null
  140674. +++ b/drivers/net/wireless/rtl8192cu/include/usb_ops.h
  140675. @@ -0,0 +1,109 @@
  140676. +/******************************************************************************
  140677. + *
  140678. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140679. + *
  140680. + * This program is free software; you can redistribute it and/or modify it
  140681. + * under the terms of version 2 of the GNU General Public License as
  140682. + * published by the Free Software Foundation.
  140683. + *
  140684. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140685. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140686. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140687. + * more details.
  140688. + *
  140689. + * You should have received a copy of the GNU General Public License along with
  140690. + * this program; if not, write to the Free Software Foundation, Inc.,
  140691. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140692. + *
  140693. + *
  140694. + ******************************************************************************/
  140695. +#ifndef __USB_OPS_H_
  140696. +#define __USB_OPS_H_
  140697. +
  140698. +#include <drv_conf.h>
  140699. +#include <osdep_service.h>
  140700. +#include <drv_types.h>
  140701. +#include <osdep_intf.h>
  140702. +
  140703. +#define REALTEK_USB_VENQT_READ 0xC0
  140704. +#define REALTEK_USB_VENQT_WRITE 0x40
  140705. +#define REALTEK_USB_VENQT_CMD_REQ 0x05
  140706. +#define REALTEK_USB_VENQT_CMD_IDX 0x00
  140707. +
  140708. +enum{
  140709. + VENDOR_WRITE = 0x00,
  140710. + VENDOR_READ = 0x01,
  140711. +};
  140712. +#define ALIGNMENT_UNIT 16
  140713. +#define MAX_VENDOR_REQ_CMD_SIZE 254 //8188cu SIE Support
  140714. +#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE +ALIGNMENT_UNIT)
  140715. +
  140716. +#ifdef PLATFORM_LINUX
  140717. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12))
  140718. +#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size, timeout_ms) \
  140719. + usb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), (timeout_ms))
  140720. +#define rtw_usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout_ms) \
  140721. + usb_bulk_msg((usb_dev), (pipe), (data), (len), (actual_length), (timeout_ms))
  140722. +#else
  140723. +#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size,timeout_ms) \
  140724. + usb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), \
  140725. + ((timeout_ms) == 0) ||((timeout_ms)*HZ/1000>0)?((timeout_ms)*HZ/1000):1)
  140726. +#define rtw_usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout_ms) \
  140727. + usb_bulk_msg((usb_dev), (pipe), (data), (len), (actual_length), \
  140728. + ((timeout_ms) == 0) ||((timeout_ms)*HZ/1000>0)?((timeout_ms)*HZ/1000):1)
  140729. +#endif
  140730. +#include <usb_ops_linux.h>
  140731. +#endif //PLATFORM_LINUX
  140732. +
  140733. +#ifdef CONFIG_RTL8192C
  140734. +void rtl8192cu_set_intf_ops(struct _io_ops *pops);
  140735. +#define usb_set_intf_ops rtl8192cu_set_intf_ops
  140736. +
  140737. +void rtl8192cu_recv_tasklet(void *priv);
  140738. +
  140739. +void rtl8192cu_xmit_tasklet(void *priv);
  140740. +#endif
  140741. +
  140742. +#ifdef CONFIG_RTL8192D
  140743. +void rtl8192du_set_intf_ops(struct _io_ops *pops);
  140744. +#define usb_set_intf_ops rtl8192du_set_intf_ops
  140745. +
  140746. +#ifndef PLATFORM_FREEBSD
  140747. +void rtl8192du_recv_tasklet(void *priv);
  140748. +#else // PLATFORM_FREEBSD
  140749. +void rtl8192du_recv_tasklet(void *priv, int npending);
  140750. +#ifdef CONFIG_RX_INDICATE_QUEUE
  140751. +void rtw_rx_indicate_tasklet(void *priv, int npending);
  140752. +#endif // CONFIG_RX_INDICATE_QUEUE
  140753. +#endif // PLATFORM_FREEBSD
  140754. +
  140755. +void rtl8192du_xmit_tasklet(void *priv);
  140756. +#endif
  140757. +
  140758. +/*
  140759. +* Increase and check if the continual_urb_error of this @param dvobjprive is larger than MAX_CONTINUAL_URB_ERR
  140760. +* @return _TRUE:
  140761. +* @return _FALSE:
  140762. +*/
  140763. +static inline int rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobj)
  140764. +{
  140765. + int ret = _FALSE;
  140766. + int value;
  140767. + if( (value=ATOMIC_INC_RETURN(&dvobj->continual_urb_error)) > MAX_CONTINUAL_URB_ERR) {
  140768. + DBG_871X("[dvobj:%p][ERROR] continual_urb_error:%d > %d\n", dvobj, value, MAX_CONTINUAL_URB_ERR);
  140769. + ret = _TRUE;
  140770. + } else {
  140771. + //DBG_871X("[dvobj:%p] continual_urb_error:%d\n", dvobj, value);
  140772. + }
  140773. + return ret;
  140774. +}
  140775. +
  140776. +/*
  140777. +* Set the continual_urb_error of this @param dvobjprive to 0
  140778. +*/
  140779. +static inline void rtw_reset_continual_urb_error(struct dvobj_priv *dvobj)
  140780. +{
  140781. + ATOMIC_SET(&dvobj->continual_urb_error, 0);
  140782. +}
  140783. +
  140784. +#endif //__USB_OPS_H_
  140785. --- /dev/null
  140786. +++ b/drivers/net/wireless/rtl8192cu/include/usb_ops_linux.h
  140787. @@ -0,0 +1,62 @@
  140788. +/******************************************************************************
  140789. + *
  140790. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140791. + *
  140792. + * This program is free software; you can redistribute it and/or modify it
  140793. + * under the terms of version 2 of the GNU General Public License as
  140794. + * published by the Free Software Foundation.
  140795. + *
  140796. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140797. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140798. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140799. + * more details.
  140800. + *
  140801. + * You should have received a copy of the GNU General Public License along with
  140802. + * this program; if not, write to the Free Software Foundation, Inc.,
  140803. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140804. + *
  140805. + *
  140806. + ******************************************************************************/
  140807. +#ifndef __USB_OPS_LINUX_H__
  140808. +#define __USB_OPS_LINUX_H__
  140809. +
  140810. +#define VENDOR_CMD_MAX_DATA_LEN 254
  140811. +
  140812. +#define RTW_USB_CONTROL_MSG_TIMEOUT_TEST 10//ms
  140813. +#define RTW_USB_CONTROL_MSG_TIMEOUT 500//ms
  140814. +
  140815. +#if defined(CONFIG_VENDOR_REQ_RETRY) && defined(CONFIG_USB_VENDOR_REQ_MUTEX)
  140816. +/* vendor req retry should be in the situation when each vendor req is atomically submitted from others */
  140817. +#define MAX_USBCTRL_VENDORREQ_TIMES 10
  140818. +#else
  140819. +#define MAX_USBCTRL_VENDORREQ_TIMES 1
  140820. +#endif
  140821. +
  140822. +#define RTW_USB_BULKOUT_TIMEOUT 5000//ms
  140823. +
  140824. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  140825. +#define _usbctrl_vendorreq_async_callback(urb, regs) _usbctrl_vendorreq_async_callback(urb)
  140826. +#define usb_bulkout_zero_complete(purb, regs) usb_bulkout_zero_complete(purb)
  140827. +#define usb_write_mem_complete(purb, regs) usb_write_mem_complete(purb)
  140828. +#define usb_write_port_complete(purb, regs) usb_write_port_complete(purb)
  140829. +#define usb_read_port_complete(purb, regs) usb_read_port_complete(purb)
  140830. +#define usb_read_interrupt_complete(purb, regs) usb_read_interrupt_complete(purb)
  140831. +#endif
  140832. +
  140833. +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
  140834. +int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val);
  140835. +int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val);
  140836. +int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val);
  140837. +#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */
  140838. +
  140839. +unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr);
  140840. +
  140841. +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);
  140842. +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);
  140843. +
  140844. +void usb_read_port_cancel(struct intf_hdl *pintfhdl);
  140845. +
  140846. +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);
  140847. +void usb_write_port_cancel(struct intf_hdl *pintfhdl);
  140848. +
  140849. +#endif
  140850. --- /dev/null
  140851. +++ b/drivers/net/wireless/rtl8192cu/include/usb_osintf.h
  140852. @@ -0,0 +1,37 @@
  140853. +/******************************************************************************
  140854. + *
  140855. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140856. + *
  140857. + * This program is free software; you can redistribute it and/or modify it
  140858. + * under the terms of version 2 of the GNU General Public License as
  140859. + * published by the Free Software Foundation.
  140860. + *
  140861. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140862. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140863. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140864. + * more details.
  140865. + *
  140866. + * You should have received a copy of the GNU General Public License along with
  140867. + * this program; if not, write to the Free Software Foundation, Inc.,
  140868. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140869. + *
  140870. + *
  140871. + ******************************************************************************/
  140872. +#ifndef __USB_OSINTF_H
  140873. +#define __USB_OSINTF_H
  140874. +
  140875. +#include <drv_conf.h>
  140876. +#include <osdep_service.h>
  140877. +#include <drv_types.h>
  140878. +#include <usb_vendor_req.h>
  140879. +
  140880. +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3)
  140881. +
  140882. +
  140883. +//uint usb_dvobj_init(_adapter * adapter);
  140884. +//void usb_dvobj_deinit(_adapter * adapter);
  140885. +
  140886. +u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, RT_USB_BREQUEST brequest, RT_USB_WVALUE wvalue, u8 windex, void* data, u8 datalen, u8 isdirectionin);
  140887. +
  140888. +
  140889. +#endif
  140890. --- /dev/null
  140891. +++ b/drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h
  140892. @@ -0,0 +1,59 @@
  140893. +/******************************************************************************
  140894. + *
  140895. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140896. + *
  140897. + * This program is free software; you can redistribute it and/or modify it
  140898. + * under the terms of version 2 of the GNU General Public License as
  140899. + * published by the Free Software Foundation.
  140900. + *
  140901. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140902. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140903. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140904. + * more details.
  140905. + *
  140906. + * You should have received a copy of the GNU General Public License along with
  140907. + * this program; if not, write to the Free Software Foundation, Inc.,
  140908. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140909. + *
  140910. + *
  140911. + ******************************************************************************/
  140912. +#ifndef _USB_VENDOR_REQUEST_H_
  140913. +#define _USB_VENDOR_REQUEST_H_
  140914. +
  140915. +//4 Set/Get Register related wIndex/Data
  140916. +#define RT_USB_RESET_MASK_OFF 0
  140917. +#define RT_USB_RESET_MASK_ON 1
  140918. +#define RT_USB_SLEEP_MASK_OFF 0
  140919. +#define RT_USB_SLEEP_MASK_ON 1
  140920. +#define RT_USB_LDO_ON 1
  140921. +#define RT_USB_LDO_OFF 0
  140922. +
  140923. +//4 Set/Get SYSCLK related wValue or Data
  140924. +#define RT_USB_SYSCLK_32KHZ 0
  140925. +#define RT_USB_SYSCLK_40MHZ 1
  140926. +#define RT_USB_SYSCLK_60MHZ 2
  140927. +
  140928. +
  140929. +typedef enum _RT_USB_BREQUEST {
  140930. + RT_USB_SET_REGISTER = 1,
  140931. + RT_USB_SET_SYSCLK = 2,
  140932. + RT_USB_GET_SYSCLK = 3,
  140933. + RT_USB_GET_REGISTER = 4
  140934. +} RT_USB_BREQUEST;
  140935. +
  140936. +
  140937. +typedef enum _RT_USB_WVALUE {
  140938. + RT_USB_RESET_MASK = 1,
  140939. + RT_USB_SLEEP_MASK = 2,
  140940. + RT_USB_USB_HRCPWM = 3,
  140941. + RT_USB_LDO = 4,
  140942. + RT_USB_BOOT_TYPE = 5
  140943. +} RT_USB_WVALUE;
  140944. +
  140945. +
  140946. +//BOOLEAN usbvendorrequest(PCE_USB_DEVICE CEdevice, RT_USB_BREQUEST bRequest, RT_USB_WVALUE wValue, UCHAR wIndex, PVOID Data, UCHAR DataLength, BOOLEAN isDirectionIn);
  140947. +//BOOLEAN CEusbGetStatusRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT Index, PVOID Data);
  140948. +//BOOLEAN CEusbFeatureRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT FeatureSelector, IN USHORT Index);
  140949. +//BOOLEAN CEusbGetDescriptorRequest(PCE_USB_DEVICE CEdevice, IN short urbLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageId, IN PVOID TransferBuffer, IN ULONG TransferBufferLength);
  140950. +
  140951. +#endif
  140952. --- /dev/null
  140953. +++ b/drivers/net/wireless/rtl8192cu/include/wifi.h
  140954. @@ -0,0 +1,1245 @@
  140955. +/******************************************************************************
  140956. + *
  140957. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  140958. + *
  140959. + * This program is free software; you can redistribute it and/or modify it
  140960. + * under the terms of version 2 of the GNU General Public License as
  140961. + * published by the Free Software Foundation.
  140962. + *
  140963. + * This program is distributed in the hope that it will be useful, but WITHOUT
  140964. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  140965. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  140966. + * more details.
  140967. + *
  140968. + * You should have received a copy of the GNU General Public License along with
  140969. + * this program; if not, write to the Free Software Foundation, Inc.,
  140970. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  140971. + *
  140972. + *
  140973. + ******************************************************************************/
  140974. +#ifndef _WIFI_H_
  140975. +#define _WIFI_H_
  140976. +
  140977. +#include <rtw_byteorder.h>
  140978. +
  140979. +#ifdef BIT
  140980. +//#error "BIT define occurred earlier elsewhere!\n"
  140981. +#undef BIT
  140982. +#endif
  140983. +#define BIT(x) (1 << (x))
  140984. +
  140985. +
  140986. +#define WLAN_ETHHDR_LEN 14
  140987. +#define WLAN_ETHADDR_LEN 6
  140988. +#define WLAN_IEEE_OUI_LEN 3
  140989. +#define WLAN_ADDR_LEN 6
  140990. +#define WLAN_CRC_LEN 4
  140991. +#define WLAN_BSSID_LEN 6
  140992. +#define WLAN_BSS_TS_LEN 8
  140993. +#define WLAN_HDR_A3_LEN 24
  140994. +#define WLAN_HDR_A4_LEN 30
  140995. +#define WLAN_HDR_A3_QOS_LEN 26
  140996. +#define WLAN_HDR_A4_QOS_LEN 32
  140997. +#define WLAN_SSID_MAXLEN 32
  140998. +#define WLAN_DATA_MAXLEN 2312
  140999. +
  141000. +#define WLAN_A3_PN_OFFSET 24
  141001. +#define WLAN_A4_PN_OFFSET 30
  141002. +
  141003. +#define WLAN_MIN_ETHFRM_LEN 60
  141004. +#define WLAN_MAX_ETHFRM_LEN 1514
  141005. +#define WLAN_ETHHDR_LEN 14
  141006. +
  141007. +#define P80211CAPTURE_VERSION 0x80211001
  141008. +
  141009. +#ifdef GREEN_HILL
  141010. +#pragma pack(1)
  141011. +#endif
  141012. +
  141013. +enum WIFI_FRAME_TYPE {
  141014. + WIFI_MGT_TYPE = (0),
  141015. + WIFI_CTRL_TYPE = (BIT(2)),
  141016. + WIFI_DATA_TYPE = (BIT(3)),
  141017. + WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), //!< QoS Data
  141018. +};
  141019. +
  141020. +enum WIFI_FRAME_SUBTYPE {
  141021. +
  141022. + // below is for mgt frame
  141023. + WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE),
  141024. + WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE),
  141025. + WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE),
  141026. + WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE),
  141027. + WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE),
  141028. + WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE),
  141029. + WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE),
  141030. + WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE),
  141031. + WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE),
  141032. + WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE),
  141033. + WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE),
  141034. + WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE),
  141035. +
  141036. + // below is for control frame
  141037. + WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE),
  141038. + WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
  141039. + WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE),
  141040. + WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE),
  141041. + WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE),
  141042. + WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
  141043. +
  141044. + // below is for data frame
  141045. + WIFI_DATA = (0 | WIFI_DATA_TYPE),
  141046. + WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE),
  141047. + WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE),
  141048. + WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE),
  141049. + WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE),
  141050. + WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE),
  141051. + WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE),
  141052. + WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE),
  141053. + WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE),
  141054. +};
  141055. +
  141056. +enum WIFI_REASON_CODE {
  141057. + _RSON_RESERVED_ = 0,
  141058. + _RSON_UNSPECIFIED_ = 1,
  141059. + _RSON_AUTH_NO_LONGER_VALID_ = 2,
  141060. + _RSON_DEAUTH_STA_LEAVING_ = 3,
  141061. + _RSON_INACTIVITY_ = 4,
  141062. + _RSON_UNABLE_HANDLE_ = 5,
  141063. + _RSON_CLS2_ = 6,
  141064. + _RSON_CLS3_ = 7,
  141065. + _RSON_DISAOC_STA_LEAVING_ = 8,
  141066. + _RSON_ASOC_NOT_AUTH_ = 9,
  141067. +
  141068. + // WPA reason
  141069. + _RSON_INVALID_IE_ = 13,
  141070. + _RSON_MIC_FAILURE_ = 14,
  141071. + _RSON_4WAY_HNDSHK_TIMEOUT_ = 15,
  141072. + _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16,
  141073. + _RSON_DIFF_IE_ = 17,
  141074. + _RSON_MLTCST_CIPHER_NOT_VALID_ = 18,
  141075. + _RSON_UNICST_CIPHER_NOT_VALID_ = 19,
  141076. + _RSON_AKMP_NOT_VALID_ = 20,
  141077. + _RSON_UNSUPPORT_RSNE_VER_ = 21,
  141078. + _RSON_INVALID_RSNE_CAP_ = 22,
  141079. + _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23,
  141080. +
  141081. + //belowing are Realtek definition
  141082. + _RSON_PMK_NOT_AVAILABLE_ = 24,
  141083. + _RSON_TDLS_TEAR_TOOFAR_ = 25,
  141084. + _RSON_TDLS_TEAR_UN_RSN_ = 26,
  141085. +};
  141086. +
  141087. +/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */
  141088. +#if 0
  141089. +#define WLAN_REASON_UNSPECIFIED 1
  141090. +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
  141091. +#define WLAN_REASON_DEAUTH_LEAVING 3
  141092. +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
  141093. +#define WLAN_REASON_DISASSOC_AP_BUSY 5
  141094. +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
  141095. +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
  141096. +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
  141097. +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
  141098. +#endif
  141099. +/* IEEE 802.11h */
  141100. +#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10
  141101. +#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11
  141102. +#if 0
  141103. +/* IEEE 802.11i */
  141104. +#define WLAN_REASON_INVALID_IE 13
  141105. +#define WLAN_REASON_MICHAEL_MIC_FAILURE 14
  141106. +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15
  141107. +#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16
  141108. +#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17
  141109. +#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18
  141110. +#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19
  141111. +#define WLAN_REASON_AKMP_NOT_VALID 20
  141112. +#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21
  141113. +#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22
  141114. +#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23
  141115. +#define WLAN_REASON_CIPHER_SUITE_REJECTED 24
  141116. +#endif
  141117. +
  141118. +enum WIFI_STATUS_CODE {
  141119. + _STATS_SUCCESSFUL_ = 0,
  141120. + _STATS_FAILURE_ = 1,
  141121. + _STATS_CAP_FAIL_ = 10,
  141122. + _STATS_NO_ASOC_ = 11,
  141123. + _STATS_OTHER_ = 12,
  141124. + _STATS_NO_SUPP_ALG_ = 13,
  141125. + _STATS_OUT_OF_AUTH_SEQ_ = 14,
  141126. + _STATS_CHALLENGE_FAIL_ = 15,
  141127. + _STATS_AUTH_TIMEOUT_ = 16,
  141128. + _STATS_UNABLE_HANDLE_STA_ = 17,
  141129. + _STATS_RATE_FAIL_ = 18,
  141130. +};
  141131. +
  141132. +/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */
  141133. +#if 0
  141134. +#define WLAN_STATUS_SUCCESS 0
  141135. +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
  141136. +#define WLAN_STATUS_CAPS_UNSUPPORTED 10
  141137. +#define WLAN_STATUS_REASSOC_NO_ASSOC 11
  141138. +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
  141139. +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
  141140. +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
  141141. +#define WLAN_STATUS_CHALLENGE_FAIL 15
  141142. +#define WLAN_STATUS_AUTH_TIMEOUT 16
  141143. +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
  141144. +#define WLAN_STATUS_ASSOC_DENIED_RATES 18
  141145. +#endif
  141146. +//entended
  141147. +/* IEEE 802.11b */
  141148. +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
  141149. +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20
  141150. +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21
  141151. +/* IEEE 802.11h */
  141152. +#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22
  141153. +#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23
  141154. +#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24
  141155. +/* IEEE 802.11g */
  141156. +#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25
  141157. +#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26
  141158. +#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27
  141159. +/* IEEE 802.11w */
  141160. +#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30
  141161. +#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31
  141162. +/* IEEE 802.11i */
  141163. +#define WLAN_STATUS_INVALID_IE 40
  141164. +#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41
  141165. +#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42
  141166. +#define WLAN_STATUS_AKMP_NOT_VALID 43
  141167. +#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44
  141168. +#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45
  141169. +#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46
  141170. +#define WLAN_STATUS_TS_NOT_CREATED 47
  141171. +#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48
  141172. +#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49
  141173. +#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50
  141174. +#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51
  141175. +/* IEEE 802.11r */
  141176. +#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52
  141177. +#define WLAN_STATUS_INVALID_PMKID 53
  141178. +#define WLAN_STATUS_INVALID_MDIE 54
  141179. +#define WLAN_STATUS_INVALID_FTIE 55
  141180. +
  141181. +
  141182. +enum WIFI_REG_DOMAIN {
  141183. + DOMAIN_FCC = 1,
  141184. + DOMAIN_IC = 2,
  141185. + DOMAIN_ETSI = 3,
  141186. + DOMAIN_SPAIN = 4,
  141187. + DOMAIN_FRANCE = 5,
  141188. + DOMAIN_MKK = 6,
  141189. + DOMAIN_ISRAEL = 7,
  141190. + DOMAIN_MKK1 = 8,
  141191. + DOMAIN_MKK2 = 9,
  141192. + DOMAIN_MKK3 = 10,
  141193. + DOMAIN_MAX
  141194. +};
  141195. +
  141196. +#define _TO_DS_ BIT(8)
  141197. +#define _FROM_DS_ BIT(9)
  141198. +#define _MORE_FRAG_ BIT(10)
  141199. +#define _RETRY_ BIT(11)
  141200. +#define _PWRMGT_ BIT(12)
  141201. +#define _MORE_DATA_ BIT(13)
  141202. +#define _PRIVACY_ BIT(14)
  141203. +#define _ORDER_ BIT(15)
  141204. +
  141205. +#define SetToDs(pbuf) \
  141206. + do { \
  141207. + *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \
  141208. + } while(0)
  141209. +
  141210. +#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0)
  141211. +
  141212. +#define ClearToDs(pbuf) \
  141213. + do { \
  141214. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \
  141215. + } while(0)
  141216. +
  141217. +#define SetFrDs(pbuf) \
  141218. + do { \
  141219. + *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \
  141220. + } while(0)
  141221. +
  141222. +#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0)
  141223. +
  141224. +#define ClearFrDs(pbuf) \
  141225. + do { \
  141226. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \
  141227. + } while(0)
  141228. +
  141229. +#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe))
  141230. +
  141231. +
  141232. +#define SetMFrag(pbuf) \
  141233. + do { \
  141234. + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \
  141235. + } while(0)
  141236. +
  141237. +#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0)
  141238. +
  141239. +#define ClearMFrag(pbuf) \
  141240. + do { \
  141241. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \
  141242. + } while(0)
  141243. +
  141244. +#define SetRetry(pbuf) \
  141245. + do { \
  141246. + *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \
  141247. + } while(0)
  141248. +
  141249. +#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0)
  141250. +
  141251. +#define ClearRetry(pbuf) \
  141252. + do { \
  141253. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \
  141254. + } while(0)
  141255. +
  141256. +#define SetPwrMgt(pbuf) \
  141257. + do { \
  141258. + *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \
  141259. + } while(0)
  141260. +
  141261. +#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0)
  141262. +
  141263. +#define ClearPwrMgt(pbuf) \
  141264. + do { \
  141265. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \
  141266. + } while(0)
  141267. +
  141268. +#define SetMData(pbuf) \
  141269. + do { \
  141270. + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \
  141271. + } while(0)
  141272. +
  141273. +#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0)
  141274. +
  141275. +#define ClearMData(pbuf) \
  141276. + do { \
  141277. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \
  141278. + } while(0)
  141279. +
  141280. +#define SetPrivacy(pbuf) \
  141281. + do { \
  141282. + *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \
  141283. + } while(0)
  141284. +
  141285. +#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0)
  141286. +
  141287. +#define ClearPrivacy(pbuf) \
  141288. + do { \
  141289. + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \
  141290. + } while(0)
  141291. +
  141292. +
  141293. +#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0)
  141294. +
  141295. +#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2)))
  141296. +
  141297. +#define SetFrameType(pbuf,type) \
  141298. + do { \
  141299. + *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \
  141300. + *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \
  141301. + } while(0)
  141302. +
  141303. +#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)))
  141304. +
  141305. +#define SetFrameSubType(pbuf,type) \
  141306. + do { \
  141307. + *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \
  141308. + *(unsigned short *)(pbuf) |= cpu_to_le16(type); \
  141309. + } while(0)
  141310. +
  141311. +#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4)
  141312. +
  141313. +#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f)
  141314. +
  141315. +#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)))
  141316. +
  141317. +#define SetFragNum(pbuf, num) \
  141318. + do { \
  141319. + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \
  141320. + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \
  141321. + cpu_to_le16(0x0f & (num)); \
  141322. + } while(0)
  141323. +
  141324. +#define SetSeqNum(pbuf, num) \
  141325. + do { \
  141326. + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \
  141327. + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \
  141328. + le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \
  141329. + } while(0)
  141330. +
  141331. +#define SetDuration(pbuf, dur) \
  141332. + do { \
  141333. + *(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \
  141334. + } while(0)
  141335. +
  141336. +
  141337. +#define SetPriority(pbuf, tid) \
  141338. + do { \
  141339. + *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \
  141340. + } while(0)
  141341. +
  141342. +#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf)
  141343. +
  141344. +#define SetEOSP(pbuf, eosp) \
  141345. + do { \
  141346. + *(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \
  141347. + } while(0)
  141348. +
  141349. +#define SetAckpolicy(pbuf, ack) \
  141350. + do { \
  141351. + *(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \
  141352. + } while(0)
  141353. +
  141354. +#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3)
  141355. +
  141356. +#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1)
  141357. +
  141358. +#define SetAMsdu(pbuf, amsdu) \
  141359. + do { \
  141360. + *(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \
  141361. + } while(0)
  141362. +
  141363. +#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff)
  141364. +
  141365. +#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f)
  141366. +
  141367. +#define GetAddr1Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 4))
  141368. +
  141369. +#define GetAddr2Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 10))
  141370. +
  141371. +#define GetAddr3Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 16))
  141372. +
  141373. +#define GetAddr4Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 24))
  141374. +
  141375. +#define MacAddr_isBcst(addr) \
  141376. +( \
  141377. + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \
  141378. + (addr[2] == 0xff) && (addr[3] == 0xff) && \
  141379. + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \
  141380. +)
  141381. +
  141382. +__inline static int IS_MCAST(unsigned char *da)
  141383. +{
  141384. + if ((*da) & 0x01)
  141385. + return _TRUE;
  141386. + else
  141387. + return _FALSE;
  141388. +}
  141389. +
  141390. +
  141391. +__inline static unsigned char * get_da(unsigned char *pframe)
  141392. +{
  141393. + unsigned char *da;
  141394. + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
  141395. +
  141396. + switch (to_fr_ds) {
  141397. + case 0x00: // ToDs=0, FromDs=0
  141398. + da = GetAddr1Ptr(pframe);
  141399. + break;
  141400. + case 0x01: // ToDs=0, FromDs=1
  141401. + da = GetAddr1Ptr(pframe);
  141402. + break;
  141403. + case 0x02: // ToDs=1, FromDs=0
  141404. + da = GetAddr3Ptr(pframe);
  141405. + break;
  141406. + default: // ToDs=1, FromDs=1
  141407. + da = GetAddr3Ptr(pframe);
  141408. + break;
  141409. + }
  141410. +
  141411. + return da;
  141412. +}
  141413. +
  141414. +
  141415. +__inline static unsigned char * get_sa(unsigned char *pframe)
  141416. +{
  141417. + unsigned char *sa;
  141418. + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
  141419. +
  141420. + switch (to_fr_ds) {
  141421. + case 0x00: // ToDs=0, FromDs=0
  141422. + sa = GetAddr2Ptr(pframe);
  141423. + break;
  141424. + case 0x01: // ToDs=0, FromDs=1
  141425. + sa = GetAddr3Ptr(pframe);
  141426. + break;
  141427. + case 0x02: // ToDs=1, FromDs=0
  141428. + sa = GetAddr2Ptr(pframe);
  141429. + break;
  141430. + default: // ToDs=1, FromDs=1
  141431. + sa = GetAddr4Ptr(pframe);
  141432. + break;
  141433. + }
  141434. +
  141435. + return sa;
  141436. +}
  141437. +
  141438. +__inline static unsigned char * get_hdr_bssid(unsigned char *pframe)
  141439. +{
  141440. + unsigned char *sa;
  141441. + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
  141442. +
  141443. + switch (to_fr_ds) {
  141444. + case 0x00: // ToDs=0, FromDs=0
  141445. + sa = GetAddr3Ptr(pframe);
  141446. + break;
  141447. + case 0x01: // ToDs=0, FromDs=1
  141448. + sa = GetAddr2Ptr(pframe);
  141449. + break;
  141450. + case 0x02: // ToDs=1, FromDs=0
  141451. + sa = GetAddr1Ptr(pframe);
  141452. + break;
  141453. + case 0x03: // ToDs=1, FromDs=1
  141454. + sa = GetAddr1Ptr(pframe);
  141455. + break;
  141456. + default:
  141457. + sa =NULL; //???????
  141458. + break;
  141459. + }
  141460. +
  141461. + return sa;
  141462. +}
  141463. +
  141464. +
  141465. +__inline static int IsFrameTypeCtrl(unsigned char *pframe)
  141466. +{
  141467. + if(WIFI_CTRL_TYPE == GetFrameType(pframe))
  141468. + return _TRUE;
  141469. + else
  141470. + return _FALSE;
  141471. +}
  141472. +/*-----------------------------------------------------------------------------
  141473. + Below is for the security related definition
  141474. +------------------------------------------------------------------------------*/
  141475. +#define _RESERVED_FRAME_TYPE_ 0
  141476. +#define _SKB_FRAME_TYPE_ 2
  141477. +#define _PRE_ALLOCMEM_ 1
  141478. +#define _PRE_ALLOCHDR_ 3
  141479. +#define _PRE_ALLOCLLCHDR_ 4
  141480. +#define _PRE_ALLOCICVHDR_ 5
  141481. +#define _PRE_ALLOCMICHDR_ 6
  141482. +
  141483. +#define _SIFSTIME_ ((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10)
  141484. +#define _ACKCTSLNG_ 14 //14 bytes long, including crclng
  141485. +#define _CRCLNG_ 4
  141486. +
  141487. +#define _ASOCREQ_IE_OFFSET_ 4 // excluding wlan_hdr
  141488. +#define _ASOCRSP_IE_OFFSET_ 6
  141489. +#define _REASOCREQ_IE_OFFSET_ 10
  141490. +#define _REASOCRSP_IE_OFFSET_ 6
  141491. +#define _PROBEREQ_IE_OFFSET_ 0
  141492. +#define _PROBERSP_IE_OFFSET_ 12
  141493. +#define _AUTH_IE_OFFSET_ 6
  141494. +#define _DEAUTH_IE_OFFSET_ 0
  141495. +#define _BEACON_IE_OFFSET_ 12
  141496. +#define _PUBLIC_ACTION_IE_OFFSET_ 8
  141497. +
  141498. +#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_
  141499. +
  141500. +#define _SSID_IE_ 0
  141501. +#define _SUPPORTEDRATES_IE_ 1
  141502. +#define _DSSET_IE_ 3
  141503. +#define _TIM_IE_ 5
  141504. +#define _IBSS_PARA_IE_ 6
  141505. +#define _COUNTRY_IE_ 7
  141506. +#define _CHLGETXT_IE_ 16
  141507. +#define _POW_CAP_IE_ 33
  141508. +#define _SUPPORTED_CH_IE_ 36
  141509. +#define _CH_SWTICH_ANNOUNCE_ 37 //Secondary Channel Offset
  141510. +#define _RSN_IE_2_ 48
  141511. +#define _SSN_IE_1_ 221
  141512. +#define _ERPINFO_IE_ 42
  141513. +#define _EXT_SUPPORTEDRATES_IE_ 50
  141514. +
  141515. +#define _HT_CAPABILITY_IE_ 45
  141516. +#define _FTIE_ 55
  141517. +#define _TIMEOUT_ITVL_IE_ 56
  141518. +#define _SRC_IE_ 59
  141519. +#define _HT_EXTRA_INFO_IE_ 61
  141520. +#define _HT_ADD_INFO_IE_ 61 //_HT_EXTRA_INFO_IE_
  141521. +
  141522. +#define EID_BSSCoexistence 72 // 20/40 BSS Coexistence
  141523. +#define EID_BSSIntolerantChlReport 73
  141524. +#define _RIC_Descriptor_IE_ 75
  141525. +
  141526. +#ifdef CONFIG_IEEE80211W
  141527. +#define _MME_IE_ 76 //802.11w Management MIC element
  141528. +#endif //CONFIG_IEEE80211W
  141529. +#define _LINK_ID_IE_ 101
  141530. +#define _CH_SWITCH_TIMING_ 104
  141531. +#define _PTI_BUFFER_STATUS_ 106
  141532. +#define _EXT_CAP_IE_ 127
  141533. +#define _VENDOR_SPECIFIC_IE_ 221
  141534. +
  141535. +#define _RESERVED47_ 47
  141536. +
  141537. +/* ---------------------------------------------------------------------------
  141538. + Below is the fixed elements...
  141539. +-----------------------------------------------------------------------------*/
  141540. +#define _AUTH_ALGM_NUM_ 2
  141541. +#define _AUTH_SEQ_NUM_ 2
  141542. +#define _BEACON_ITERVAL_ 2
  141543. +#define _CAPABILITY_ 2
  141544. +#define _CURRENT_APADDR_ 6
  141545. +#define _LISTEN_INTERVAL_ 2
  141546. +#define _RSON_CODE_ 2
  141547. +#define _ASOC_ID_ 2
  141548. +#define _STATUS_CODE_ 2
  141549. +#define _TIMESTAMP_ 8
  141550. +
  141551. +#define AUTH_ODD_TO 0
  141552. +#define AUTH_EVEN_TO 1
  141553. +
  141554. +#define WLAN_ETHCONV_ENCAP 1
  141555. +#define WLAN_ETHCONV_RFC1042 2
  141556. +#define WLAN_ETHCONV_8021h 3
  141557. +
  141558. +#define cap_ESS BIT(0)
  141559. +#define cap_IBSS BIT(1)
  141560. +#define cap_CFPollable BIT(2)
  141561. +#define cap_CFRequest BIT(3)
  141562. +#define cap_Privacy BIT(4)
  141563. +#define cap_ShortPremble BIT(5)
  141564. +#define cap_PBCC BIT(6)
  141565. +#define cap_ChAgility BIT(7)
  141566. +#define cap_SpecMgmt BIT(8)
  141567. +#define cap_QoS BIT(9)
  141568. +#define cap_ShortSlot BIT(10)
  141569. +
  141570. +/*-----------------------------------------------------------------------------
  141571. + Below is the definition for 802.11i / 802.1x
  141572. +------------------------------------------------------------------------------*/
  141573. +#define _IEEE8021X_MGT_ 1 // WPA
  141574. +#define _IEEE8021X_PSK_ 2 // WPA with pre-shared key
  141575. +
  141576. +/*
  141577. +#define _NO_PRIVACY_ 0
  141578. +#define _WEP_40_PRIVACY_ 1
  141579. +#define _TKIP_PRIVACY_ 2
  141580. +#define _WRAP_PRIVACY_ 3
  141581. +#define _CCMP_PRIVACY_ 4
  141582. +#define _WEP_104_PRIVACY_ 5
  141583. +#define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA
  141584. +*/
  141585. +
  141586. +#ifdef CONFIG_IEEE80211W
  141587. +#define _MME_IE_LENGTH_ 18
  141588. +#endif //CONFIG_IEEE80211W
  141589. +/*-----------------------------------------------------------------------------
  141590. + Below is the definition for WMM
  141591. +------------------------------------------------------------------------------*/
  141592. +#define _WMM_IE_Length_ 7 // for WMM STA
  141593. +#define _WMM_Para_Element_Length_ 24
  141594. +
  141595. +
  141596. +/*-----------------------------------------------------------------------------
  141597. + Below is the definition for 802.11n
  141598. +------------------------------------------------------------------------------*/
  141599. +
  141600. +/* block-ack parameters */
  141601. +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
  141602. +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
  141603. +#define RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
  141604. +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
  141605. +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
  141606. +
  141607. +//#ifdef CONFIG_80211N_HT
  141608. +
  141609. +#define SetOrderBit(pbuf) \
  141610. + do { \
  141611. + *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \
  141612. + } while(0)
  141613. +
  141614. +#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0)
  141615. +
  141616. +
  141617. +/**
  141618. + * struct rtw_ieee80211_bar - HT Block Ack Request
  141619. + *
  141620. + * This structure refers to "HT BlockAckReq" as
  141621. + * described in 802.11n draft section 7.2.1.7.1
  141622. + */
  141623. + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW)
  141624. +struct rtw_ieee80211_bar {
  141625. + unsigned short frame_control;
  141626. + unsigned short duration;
  141627. + unsigned char ra[6];
  141628. + unsigned char ta[6];
  141629. + unsigned short control;
  141630. + unsigned short start_seq_num;
  141631. +} __attribute__((packed));
  141632. + #endif
  141633. +
  141634. +/* 802.11 BAR control masks */
  141635. +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000
  141636. +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004
  141637. +
  141638. +
  141639. + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) || defined(PLATFORM_FREEBSD)
  141640. +
  141641. +
  141642. +
  141643. + /**
  141644. + * struct rtw_ieee80211_ht_cap - HT capabilities
  141645. + *
  141646. + * This structure refers to "HT capabilities element" as
  141647. + * described in 802.11n draft section 7.3.2.52
  141648. + */
  141649. +
  141650. +struct rtw_ieee80211_ht_cap {
  141651. + unsigned short cap_info;
  141652. + unsigned char ampdu_params_info;
  141653. + unsigned char supp_mcs_set[16];
  141654. + unsigned short extended_ht_cap_info;
  141655. + unsigned int tx_BF_cap_info;
  141656. + unsigned char antenna_selection_info;
  141657. +} __attribute__ ((packed));
  141658. +
  141659. +/**
  141660. + * struct rtw_ieee80211_ht_cap - HT additional information
  141661. + *
  141662. + * This structure refers to "HT information element" as
  141663. + * described in 802.11n draft section 7.3.2.53
  141664. + */
  141665. +struct ieee80211_ht_addt_info {
  141666. + unsigned char control_chan;
  141667. + unsigned char ht_param;
  141668. + unsigned short operation_mode;
  141669. + unsigned short stbc_param;
  141670. + unsigned char basic_set[16];
  141671. +} __attribute__ ((packed));
  141672. +
  141673. +
  141674. +struct HT_caps_element
  141675. +{
  141676. + union
  141677. + {
  141678. + struct
  141679. + {
  141680. + unsigned short HT_caps_info;
  141681. + unsigned char AMPDU_para;
  141682. + unsigned char MCS_rate[16];
  141683. + unsigned short HT_ext_caps;
  141684. + unsigned int Beamforming_caps;
  141685. + unsigned char ASEL_caps;
  141686. + } HT_cap_element;
  141687. + unsigned char HT_cap[26];
  141688. + }u;
  141689. +} __attribute__ ((packed));
  141690. +
  141691. +struct HT_info_element
  141692. +{
  141693. + unsigned char primary_channel;
  141694. + unsigned char infos[5];
  141695. + unsigned char MCS_rate[16];
  141696. +} __attribute__ ((packed));
  141697. +
  141698. +struct AC_param
  141699. +{
  141700. + unsigned char ACI_AIFSN;
  141701. + unsigned char CW;
  141702. + unsigned short TXOP_limit;
  141703. +} __attribute__ ((packed));
  141704. +
  141705. +struct WMM_para_element
  141706. +{
  141707. + unsigned char QoS_info;
  141708. + unsigned char reserved;
  141709. + struct AC_param ac_param[4];
  141710. +} __attribute__ ((packed));
  141711. +
  141712. +struct ADDBA_request
  141713. +{
  141714. + unsigned char dialog_token;
  141715. + unsigned short BA_para_set;
  141716. + unsigned short BA_timeout_value;
  141717. + unsigned short BA_starting_seqctrl;
  141718. +} __attribute__ ((packed));
  141719. +
  141720. +
  141721. +
  141722. +#endif
  141723. +
  141724. +
  141725. +#ifdef PLATFORM_WINDOWS
  141726. +
  141727. +#pragma pack(1)
  141728. +
  141729. +struct rtw_ieee80211_ht_cap {
  141730. + unsigned short cap_info;
  141731. + unsigned char ampdu_params_info;
  141732. + unsigned char supp_mcs_set[16];
  141733. + unsigned short extended_ht_cap_info;
  141734. + unsigned int tx_BF_cap_info;
  141735. + unsigned char antenna_selection_info;
  141736. +};
  141737. +
  141738. +
  141739. +struct ieee80211_ht_addt_info {
  141740. + unsigned char control_chan;
  141741. + unsigned char ht_param;
  141742. + unsigned short operation_mode;
  141743. + unsigned short stbc_param;
  141744. + unsigned char basic_set[16];
  141745. +};
  141746. +
  141747. +struct HT_caps_element
  141748. +{
  141749. + union
  141750. + {
  141751. + struct
  141752. + {
  141753. + unsigned short HT_caps_info;
  141754. + unsigned char AMPDU_para;
  141755. + unsigned char MCS_rate[16];
  141756. + unsigned short HT_ext_caps;
  141757. + unsigned int Beamforming_caps;
  141758. + unsigned char ASEL_caps;
  141759. + } HT_cap_element;
  141760. + unsigned char HT_cap[26];
  141761. + };
  141762. +};
  141763. +
  141764. +struct HT_info_element
  141765. +{
  141766. + unsigned char primary_channel;
  141767. + unsigned char infos[5];
  141768. + unsigned char MCS_rate[16];
  141769. +};
  141770. +
  141771. +struct AC_param
  141772. +{
  141773. + unsigned char ACI_AIFSN;
  141774. + unsigned char CW;
  141775. + unsigned short TXOP_limit;
  141776. +};
  141777. +
  141778. +struct WMM_para_element
  141779. +{
  141780. + unsigned char QoS_info;
  141781. + unsigned char reserved;
  141782. + struct AC_param ac_param[4];
  141783. +};
  141784. +
  141785. +struct ADDBA_request
  141786. +{
  141787. + unsigned char dialog_token;
  141788. + unsigned short BA_para_set;
  141789. + unsigned short BA_timeout_value;
  141790. + unsigned short BA_starting_seqctrl;
  141791. +};
  141792. +
  141793. +
  141794. +#pragma pack()
  141795. +
  141796. +#endif
  141797. +
  141798. +
  141799. +/* 802.11n HT capabilities masks */
  141800. +#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002
  141801. +#define IEEE80211_HT_CAP_SM_PS 0x000C
  141802. +#define IEEE80211_HT_CAP_GRN_FLD 0x0010
  141803. +#define IEEE80211_HT_CAP_SGI_20 0x0020
  141804. +#define IEEE80211_HT_CAP_SGI_40 0x0040
  141805. +#define IEEE80211_HT_CAP_TX_STBC 0x0080
  141806. +#define IEEE80211_HT_CAP_RX_STBC 0x0300
  141807. +#define IEEE80211_HT_CAP_DELAY_BA 0x0400
  141808. +#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
  141809. +#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
  141810. +/* 802.11n HT capability AMPDU settings */
  141811. +#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03
  141812. +#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C
  141813. +/* 802.11n HT capability MSC set */
  141814. +#define IEEE80211_SUPP_MCS_SET_UEQM 4
  141815. +#define IEEE80211_HT_CAP_MAX_STREAMS 4
  141816. +#define IEEE80211_SUPP_MCS_SET_LEN 10
  141817. +/* maximum streams the spec allows */
  141818. +#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01
  141819. +#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02
  141820. +#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C
  141821. +#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10
  141822. +/* 802.11n HT IE masks */
  141823. +#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03
  141824. +#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00
  141825. +#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01
  141826. +#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03
  141827. +#define IEEE80211_HT_IE_CHA_WIDTH 0x04
  141828. +#define IEEE80211_HT_IE_HT_PROTECTION 0x0003
  141829. +#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004
  141830. +#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010
  141831. +
  141832. +/* block-ack parameters */
  141833. +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
  141834. +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
  141835. +#define RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
  141836. +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
  141837. +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
  141838. +
  141839. +/*
  141840. + * A-PMDU buffer sizes
  141841. + * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
  141842. + */
  141843. +#define IEEE80211_MIN_AMPDU_BUF 0x8
  141844. +#define IEEE80211_MAX_AMPDU_BUF 0x40
  141845. +
  141846. +
  141847. +/* Spatial Multiplexing Power Save Modes */
  141848. +#define WLAN_HT_CAP_SM_PS_STATIC 0
  141849. +#define WLAN_HT_CAP_SM_PS_DYNAMIC 1
  141850. +#define WLAN_HT_CAP_SM_PS_INVALID 2
  141851. +#define WLAN_HT_CAP_SM_PS_DISABLED 3
  141852. +
  141853. +
  141854. +#define OP_MODE_PURE 0
  141855. +#define OP_MODE_MAY_BE_LEGACY_STAS 1
  141856. +#define OP_MODE_20MHZ_HT_STA_ASSOCED 2
  141857. +#define OP_MODE_MIXED 3
  141858. +
  141859. +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1))
  141860. +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0))
  141861. +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1))
  141862. +#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2))
  141863. +#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3))
  141864. +#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4))
  141865. +#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5))
  141866. +
  141867. +#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \
  141868. + ((u16) (0x0001 | 0x0002))
  141869. +#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0
  141870. +#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2))
  141871. +#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3))
  141872. +#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4))
  141873. +
  141874. +#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6))
  141875. +#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7))
  141876. +#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8))
  141877. +#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9))
  141878. +#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10))
  141879. +#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11))
  141880. +
  141881. +
  141882. +
  141883. +//#endif
  141884. +
  141885. +// ===============WPS Section===============
  141886. +// For WPSv1.0
  141887. +#define WPSOUI 0x0050f204
  141888. +// WPS attribute ID
  141889. +#define WPS_ATTR_VER1 0x104A
  141890. +#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044
  141891. +#define WPS_ATTR_RESP_TYPE 0x103B
  141892. +#define WPS_ATTR_UUID_E 0x1047
  141893. +#define WPS_ATTR_MANUFACTURER 0x1021
  141894. +#define WPS_ATTR_MODEL_NAME 0x1023
  141895. +#define WPS_ATTR_MODEL_NUMBER 0x1024
  141896. +#define WPS_ATTR_SERIAL_NUMBER 0x1042
  141897. +#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054
  141898. +#define WPS_ATTR_SEC_DEV_TYPE_LIST 0x1055
  141899. +#define WPS_ATTR_DEVICE_NAME 0x1011
  141900. +#define WPS_ATTR_CONF_METHOD 0x1008
  141901. +#define WPS_ATTR_RF_BANDS 0x103C
  141902. +#define WPS_ATTR_DEVICE_PWID 0x1012
  141903. +#define WPS_ATTR_REQUEST_TYPE 0x103A
  141904. +#define WPS_ATTR_ASSOCIATION_STATE 0x1002
  141905. +#define WPS_ATTR_CONFIG_ERROR 0x1009
  141906. +#define WPS_ATTR_VENDOR_EXT 0x1049
  141907. +#define WPS_ATTR_SELECTED_REGISTRAR 0x1041
  141908. +
  141909. +// Value of WPS attribute "WPS_ATTR_DEVICE_NAME
  141910. +#define WPS_MAX_DEVICE_NAME_LEN 32
  141911. +
  141912. +// Value of WPS Request Type Attribute
  141913. +#define WPS_REQ_TYPE_ENROLLEE_INFO_ONLY 0x00
  141914. +#define WPS_REQ_TYPE_ENROLLEE_OPEN_8021X 0x01
  141915. +#define WPS_REQ_TYPE_REGISTRAR 0x02
  141916. +#define WPS_REQ_TYPE_WLAN_MANAGER_REGISTRAR 0x03
  141917. +
  141918. +// Value of WPS Response Type Attribute
  141919. +#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00
  141920. +#define WPS_RESPONSE_TYPE_8021X 0x01
  141921. +#define WPS_RESPONSE_TYPE_REGISTRAR 0x02
  141922. +#define WPS_RESPONSE_TYPE_AP 0x03
  141923. +
  141924. +// Value of WPS WiFi Simple Configuration State Attribute
  141925. +#define WPS_WSC_STATE_NOT_CONFIG 0x01
  141926. +#define WPS_WSC_STATE_CONFIG 0x02
  141927. +
  141928. +// Value of WPS Version Attribute
  141929. +#define WPS_VERSION_1 0x10
  141930. +
  141931. +// Value of WPS Configuration Method Attribute
  141932. +#define WPS_CONFIG_METHOD_FLASH 0x0001
  141933. +#define WPS_CONFIG_METHOD_ETHERNET 0x0002
  141934. +#define WPS_CONFIG_METHOD_LABEL 0x0004
  141935. +#define WPS_CONFIG_METHOD_DISPLAY 0x0008
  141936. +#define WPS_CONFIG_METHOD_E_NFC 0x0010
  141937. +#define WPS_CONFIG_METHOD_I_NFC 0x0020
  141938. +#define WPS_CONFIG_METHOD_NFC 0x0040
  141939. +#define WPS_CONFIG_METHOD_PBC 0x0080
  141940. +#define WPS_CONFIG_METHOD_KEYPAD 0x0100
  141941. +#define WPS_CONFIG_METHOD_VPBC 0x0280
  141942. +#define WPS_CONFIG_METHOD_PPBC 0x0480
  141943. +#define WPS_CONFIG_METHOD_VDISPLAY 0x2008
  141944. +#define WPS_CONFIG_METHOD_PDISPLAY 0x4008
  141945. +
  141946. +// Value of Category ID of WPS Primary Device Type Attribute
  141947. +#define WPS_PDT_CID_DISPLAYS 0x0007
  141948. +#define WPS_PDT_CID_MULIT_MEDIA 0x0008
  141949. +#define WPS_PDT_CID_RTK_WIDI WPS_PDT_CID_MULIT_MEDIA
  141950. +
  141951. +// Value of Sub Category ID of WPS Primary Device Type Attribute
  141952. +#define WPS_PDT_SCID_MEDIA_SERVER 0x0005
  141953. +#define WPS_PDT_SCID_RTK_DMP WPS_PDT_SCID_MEDIA_SERVER
  141954. +
  141955. +// Value of Device Password ID
  141956. +#define WPS_DPID_PIN 0x0000
  141957. +#define WPS_DPID_USER_SPEC 0x0001
  141958. +#define WPS_DPID_MACHINE_SPEC 0x0002
  141959. +#define WPS_DPID_REKEY 0x0003
  141960. +#define WPS_DPID_PBC 0x0004
  141961. +#define WPS_DPID_REGISTRAR_SPEC 0x0005
  141962. +
  141963. +// Value of WPS RF Bands Attribute
  141964. +#define WPS_RF_BANDS_2_4_GHZ 0x01
  141965. +#define WPS_RF_BANDS_5_GHZ 0x02
  141966. +
  141967. +// Value of WPS Association State Attribute
  141968. +#define WPS_ASSOC_STATE_NOT_ASSOCIATED 0x00
  141969. +#define WPS_ASSOC_STATE_CONNECTION_SUCCESS 0x01
  141970. +#define WPS_ASSOC_STATE_CONFIGURATION_FAILURE 0x02
  141971. +#define WPS_ASSOC_STATE_ASSOCIATION_FAILURE 0x03
  141972. +#define WPS_ASSOC_STATE_IP_FAILURE 0x04
  141973. +
  141974. +// =====================P2P Section=====================
  141975. +// For P2P
  141976. +#define P2POUI 0x506F9A09
  141977. +
  141978. +// P2P Attribute ID
  141979. +#define P2P_ATTR_STATUS 0x00
  141980. +#define P2P_ATTR_MINOR_REASON_CODE 0x01
  141981. +#define P2P_ATTR_CAPABILITY 0x02
  141982. +#define P2P_ATTR_DEVICE_ID 0x03
  141983. +#define P2P_ATTR_GO_INTENT 0x04
  141984. +#define P2P_ATTR_CONF_TIMEOUT 0x05
  141985. +#define P2P_ATTR_LISTEN_CH 0x06
  141986. +#define P2P_ATTR_GROUP_BSSID 0x07
  141987. +#define P2P_ATTR_EX_LISTEN_TIMING 0x08
  141988. +#define P2P_ATTR_INTENTED_IF_ADDR 0x09
  141989. +#define P2P_ATTR_MANAGEABILITY 0x0A
  141990. +#define P2P_ATTR_CH_LIST 0x0B
  141991. +#define P2P_ATTR_NOA 0x0C
  141992. +#define P2P_ATTR_DEVICE_INFO 0x0D
  141993. +#define P2P_ATTR_GROUP_INFO 0x0E
  141994. +#define P2P_ATTR_GROUP_ID 0x0F
  141995. +#define P2P_ATTR_INTERFACE 0x10
  141996. +#define P2P_ATTR_OPERATING_CH 0x11
  141997. +#define P2P_ATTR_INVITATION_FLAGS 0x12
  141998. +
  141999. +// Value of Status Attribute
  142000. +#define P2P_STATUS_SUCCESS 0x00
  142001. +#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01
  142002. +#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02
  142003. +#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03
  142004. +#define P2P_STATUS_FAIL_INVALID_PARAM 0x04
  142005. +#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05
  142006. +#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06
  142007. +#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07
  142008. +#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08
  142009. +#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09
  142010. +#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A
  142011. +#define P2P_STATUS_FAIL_USER_REJECT 0x0B
  142012. +
  142013. +// Value of Inviation Flags Attribute
  142014. +#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0)
  142015. +
  142016. +#define DMP_P2P_DEVCAP_SUPPORT (P2P_DEVCAP_SERVICE_DISCOVERY | \
  142017. + P2P_DEVCAP_CLIENT_DISCOVERABILITY | \
  142018. + P2P_DEVCAP_CONCURRENT_OPERATION | \
  142019. + P2P_DEVCAP_INVITATION_PROC)
  142020. +
  142021. +#define DMP_P2P_GRPCAP_SUPPORT (P2P_GRPCAP_INTRABSS)
  142022. +
  142023. +// Value of Device Capability Bitmap
  142024. +#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0)
  142025. +#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1)
  142026. +#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2)
  142027. +#define P2P_DEVCAP_INFRA_MANAGED BIT(3)
  142028. +#define P2P_DEVCAP_DEVICE_LIMIT BIT(4)
  142029. +#define P2P_DEVCAP_INVITATION_PROC BIT(5)
  142030. +
  142031. +// Value of Group Capability Bitmap
  142032. +#define P2P_GRPCAP_GO BIT(0)
  142033. +#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1)
  142034. +#define P2P_GRPCAP_GROUP_LIMIT BIT(2)
  142035. +#define P2P_GRPCAP_INTRABSS BIT(3)
  142036. +#define P2P_GRPCAP_CROSS_CONN BIT(4)
  142037. +#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5)
  142038. +#define P2P_GRPCAP_GROUP_FORMATION BIT(6)
  142039. +
  142040. +// P2P Public Action Frame ( Management Frame )
  142041. +#define P2P_PUB_ACTION_ACTION 0x09
  142042. +
  142043. +// P2P Public Action Frame Type
  142044. +#define P2P_GO_NEGO_REQ 0
  142045. +#define P2P_GO_NEGO_RESP 1
  142046. +#define P2P_GO_NEGO_CONF 2
  142047. +#define P2P_INVIT_REQ 3
  142048. +#define P2P_INVIT_RESP 4
  142049. +#define P2P_DEVDISC_REQ 5
  142050. +#define P2P_DEVDISC_RESP 6
  142051. +#define P2P_PROVISION_DISC_REQ 7
  142052. +#define P2P_PROVISION_DISC_RESP 8
  142053. +
  142054. +// P2P Action Frame Type
  142055. +#define P2P_NOTICE_OF_ABSENCE 0
  142056. +#define P2P_PRESENCE_REQUEST 1
  142057. +#define P2P_PRESENCE_RESPONSE 2
  142058. +#define P2P_GO_DISC_REQUEST 3
  142059. +
  142060. +
  142061. +#define P2P_MAX_PERSISTENT_GROUP_NUM 10
  142062. +
  142063. +#define P2P_PROVISIONING_SCAN_CNT 3
  142064. +
  142065. +#define P2P_WILDCARD_SSID_LEN 7
  142066. +
  142067. +#define P2P_FINDPHASE_EX_NONE 0 // default value, used when: (1)p2p disabed or (2)p2p enabled but only do 1 scan phase
  142068. +#define P2P_FINDPHASE_EX_FULL 1 // used when p2p enabled and want to do 1 scan phase and P2P_FINDPHASE_EX_MAX-1 find phase
  142069. +#define P2P_FINDPHASE_EX_SOCIAL_FIRST (P2P_FINDPHASE_EX_FULL+1)
  142070. +#define P2P_FINDPHASE_EX_MAX 4
  142071. +#define P2P_FINDPHASE_EX_SOCIAL_LAST P2P_FINDPHASE_EX_MAX
  142072. +
  142073. +#define P2P_PROVISION_TIMEOUT 5000 // 5 seconds timeout for sending the provision discovery request
  142074. +#define P2P_CONCURRENT_PROVISION_TIMEOUT 3000 // 3 seconds timeout for sending the provision discovery request under concurrent mode
  142075. +#define P2P_GO_NEGO_TIMEOUT 5000 // 5 seconds timeout for receiving the group negotation response
  142076. +#define P2P_CONCURRENT_GO_NEGO_TIMEOUT 3000 // 3 seconds timeout for sending the negotiation request under concurrent mode
  142077. +#define P2P_TX_PRESCAN_TIMEOUT 100 // 100ms
  142078. +#define P2P_INVITE_TIMEOUT 5000 // 5 seconds timeout for sending the invitation request
  142079. +#define P2P_CONCURRENT_INVITE_TIMEOUT 3000 // 3 seconds timeout for sending the invitation request under concurrent mode
  142080. +#define P2P_RESET_SCAN_CH 15000 // 15 seconds timeout to reset the scan channel ( based on channel plan )
  142081. +#define P2P_MAX_INTENT 15
  142082. +
  142083. +#define P2P_MAX_NOA_NUM 2
  142084. +
  142085. +// WPS Configuration Method
  142086. +#define WPS_CM_NONE 0x0000
  142087. +#define WPS_CM_LABEL 0x0004
  142088. +#define WPS_CM_DISPLYA 0x0008
  142089. +#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010
  142090. +#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020
  142091. +#define WPS_CM_NFC_INTERFACE 0x0040
  142092. +#define WPS_CM_PUSH_BUTTON 0x0080
  142093. +#define WPS_CM_KEYPAD 0x0100
  142094. +#define WPS_CM_SW_PUHS_BUTTON 0x0280
  142095. +#define WPS_CM_HW_PUHS_BUTTON 0x0480
  142096. +#define WPS_CM_SW_DISPLAY_PIN 0x2008
  142097. +#define WPS_CM_LCD_DISPLAY_PIN 0x4008
  142098. +
  142099. +enum P2P_ROLE {
  142100. + P2P_ROLE_DISABLE = 0,
  142101. + P2P_ROLE_DEVICE = 1,
  142102. + P2P_ROLE_CLIENT = 2,
  142103. + P2P_ROLE_GO = 3
  142104. +};
  142105. +
  142106. +enum P2P_STATE {
  142107. + P2P_STATE_NONE = 0, // P2P disable
  142108. + P2P_STATE_IDLE = 1, // P2P had enabled and do nothing
  142109. + P2P_STATE_LISTEN = 2, // In pure listen state
  142110. + P2P_STATE_SCAN = 3, // In scan phase
  142111. + P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase
  142112. + P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase
  142113. + P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery
  142114. + P2P_STATE_RX_PROVISION_DIS_RSP = 7,
  142115. + P2P_STATE_RX_PROVISION_DIS_REQ = 8,
  142116. + P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake
  142117. + P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success
  142118. + P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure
  142119. + P2P_STATE_RECV_INVITE_REQ_MATCH = 12, // receiving the P2P Inviation request and match with the profile.
  142120. + P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS
  142121. + P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS
  142122. + P2P_STATE_TX_INVITE_REQ = 15, // Transmit the P2P Invitation request
  142123. + P2P_STATE_RX_INVITE_RESP_OK = 16, // Receiving the P2P Invitation response with sucess
  142124. + P2P_STATE_RECV_INVITE_REQ_DISMATCH = 17, // receiving the P2P Inviation request and dismatch with the profile.
  142125. + P2P_STATE_RECV_INVITE_REQ_GO = 18, // receiving the P2P Inviation request and this wifi is GO.
  142126. + P2P_STATE_RECV_INVITE_REQ_JOIN = 19, // receiving the P2P Inviation request to join an existing P2P Group.
  142127. + P2P_STATE_RX_INVITE_RESP_FAIL = 20, // recveing the P2P Inviation response with failure
  142128. + P2P_STATE_RX_INFOR_NOREADY = 21, // receiving p2p negoitation response with information is not available
  142129. + P2P_STATE_TX_INFOR_NOREADY = 22, // sending p2p negoitation response with information is not available
  142130. +};
  142131. +
  142132. +enum P2P_WPSINFO {
  142133. + P2P_NO_WPSINFO = 0,
  142134. + P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1,
  142135. + P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2,
  142136. + P2P_GOT_WPSINFO_PBC = 3,
  142137. +};
  142138. +
  142139. +#define P2P_PRIVATE_IOCTL_SET_LEN 64
  142140. +
  142141. +enum P2P_PROTO_WK_ID
  142142. +{
  142143. + P2P_FIND_PHASE_WK = 0,
  142144. + P2P_RESTORE_STATE_WK = 1,
  142145. + P2P_PRE_TX_PROVDISC_PROCESS_WK = 2,
  142146. + P2P_PRE_TX_NEGOREQ_PROCESS_WK = 3,
  142147. + P2P_PRE_TX_INVITEREQ_PROCESS_WK = 4,
  142148. + P2P_AP_P2P_CH_SWITCH_PROCESS_WK =5,
  142149. + P2P_RO_CH_WK = 6,
  142150. +};
  142151. +
  142152. +#ifdef CONFIG_P2P_PS
  142153. +enum P2P_PS_STATE
  142154. +{
  142155. + P2P_PS_DISABLE = 0,
  142156. + P2P_PS_ENABLE = 1,
  142157. + P2P_PS_SCAN = 2,
  142158. + P2P_PS_SCAN_DONE = 3,
  142159. + P2P_PS_ALLSTASLEEP = 4, // for P2P GO
  142160. +};
  142161. +
  142162. +enum P2P_PS_MODE
  142163. +{
  142164. + P2P_PS_NONE = 0,
  142165. + P2P_PS_CTWINDOW = 1,
  142166. + P2P_PS_NOA = 2,
  142167. + P2P_PS_MIX = 3, // CTWindow and NoA
  142168. +};
  142169. +#endif // CONFIG_P2P_PS
  142170. +
  142171. +// =====================WFD Section=====================
  142172. +// For Wi-Fi Display
  142173. +#define WFD_ATTR_DEVICE_INFO 0x00
  142174. +#define WFD_ATTR_ASSOC_BSSID 0x01
  142175. +#define WFD_ATTR_COUPLED_SINK_INFO 0x06
  142176. +#define WFD_ATTR_LOCAL_IP_ADDR 0x08
  142177. +#define WFD_ATTR_SESSION_INFO 0x09
  142178. +#define WFD_ATTR_ALTER_MAC 0x0a
  142179. +
  142180. +// For WFD Device Information Attribute
  142181. +#define WFD_DEVINFO_SOURCE 0x0000
  142182. +#define WFD_DEVINFO_PSINK 0x0001
  142183. +#define WFD_DEVINFO_SSINK 0x0002
  142184. +#define WFD_DEVINFO_DUAL 0x0003
  142185. +
  142186. +#define WFD_DEVINFO_SESSION_AVAIL 0x0010
  142187. +#define WFD_DEVINFO_WSD 0x0040
  142188. +#define WFD_DEVINFO_PC_TDLS 0x0080
  142189. +#define WFD_DEVINFO_HDCP_SUPPORT 0x0100
  142190. +
  142191. +
  142192. +#ifdef CONFIG_TX_MCAST2UNI
  142193. +#define IP_MCAST_MAC(mac) ((mac[0]==0x01)&&(mac[1]==0x00)&&(mac[2]==0x5e))
  142194. +#define ICMPV6_MCAST_MAC(mac) ((mac[0]==0x33)&&(mac[1]==0x33)&&(mac[2]!=0xff))
  142195. +#endif // CONFIG_TX_MCAST2UNI
  142196. +
  142197. +
  142198. +
  142199. +#endif // _WIFI_H_
  142200. --- /dev/null
  142201. +++ b/drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h
  142202. @@ -0,0 +1,702 @@
  142203. +/******************************************************************************
  142204. + *
  142205. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  142206. + *
  142207. + * This program is free software; you can redistribute it and/or modify it
  142208. + * under the terms of version 2 of the GNU General Public License as
  142209. + * published by the Free Software Foundation.
  142210. + *
  142211. + * This program is distributed in the hope that it will be useful, but WITHOUT
  142212. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  142213. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  142214. + * more details.
  142215. + *
  142216. + * You should have received a copy of the GNU General Public License along with
  142217. + * this program; if not, write to the Free Software Foundation, Inc.,
  142218. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  142219. + *
  142220. + *
  142221. + ******************************************************************************/
  142222. +#ifndef __WLAN_BSSDEF_H__
  142223. +#define __WLAN_BSSDEF_H__
  142224. +
  142225. +
  142226. +#define MAX_IE_SZ 768
  142227. +
  142228. +
  142229. +#ifdef PLATFORM_LINUX
  142230. +
  142231. +#define NDIS_802_11_LENGTH_SSID 32
  142232. +#define NDIS_802_11_LENGTH_RATES 8
  142233. +#define NDIS_802_11_LENGTH_RATES_EX 16
  142234. +
  142235. +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6];
  142236. +typedef long NDIS_802_11_RSSI; // in dBm
  142237. +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates
  142238. +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates
  142239. +
  142240. +
  142241. +typedef ULONG NDIS_802_11_KEY_INDEX;
  142242. +typedef unsigned long long NDIS_802_11_KEY_RSC;
  142243. +
  142244. +
  142245. +typedef struct _NDIS_802_11_SSID
  142246. +{
  142247. + ULONG SsidLength;
  142248. + UCHAR Ssid[32];
  142249. +} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
  142250. +
  142251. +typedef enum _NDIS_802_11_NETWORK_TYPE
  142252. +{
  142253. + Ndis802_11FH,
  142254. + Ndis802_11DS,
  142255. + Ndis802_11OFDM5,
  142256. + Ndis802_11OFDM24,
  142257. + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound
  142258. +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
  142259. +
  142260. +typedef struct _NDIS_802_11_CONFIGURATION_FH
  142261. +{
  142262. + ULONG Length; // Length of structure
  142263. + ULONG HopPattern; // As defined by 802.11, MSB set
  142264. + ULONG HopSet; // to one if non-802.11
  142265. + ULONG DwellTime; // units are Kusec
  142266. +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;
  142267. +
  142268. +
  142269. +/*
  142270. + FW will only save the channel number in DSConfig.
  142271. + ODI Handler will convert the channel number to freq. number.
  142272. +*/
  142273. +typedef struct _NDIS_802_11_CONFIGURATION
  142274. +{
  142275. + ULONG Length; // Length of structure
  142276. + ULONG BeaconPeriod; // units are Kusec
  142277. + ULONG ATIMWindow; // units are Kusec
  142278. + ULONG DSConfig; // Frequency, units are kHz
  142279. + NDIS_802_11_CONFIGURATION_FH FHConfig;
  142280. +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;
  142281. +
  142282. +
  142283. +
  142284. +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
  142285. +{
  142286. + Ndis802_11IBSS,
  142287. + Ndis802_11Infrastructure,
  142288. + Ndis802_11AutoUnknown,
  142289. + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound
  142290. + Ndis802_11APMode
  142291. +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;
  142292. +
  142293. +
  142294. +
  142295. +
  142296. +
  142297. +typedef struct _NDIS_802_11_FIXED_IEs
  142298. +{
  142299. + UCHAR Timestamp[8];
  142300. + USHORT BeaconInterval;
  142301. + USHORT Capabilities;
  142302. +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
  142303. +
  142304. +
  142305. +
  142306. +typedef struct _NDIS_802_11_VARIABLE_IEs
  142307. +{
  142308. + UCHAR ElementID;
  142309. + UCHAR Length;
  142310. + UCHAR data[1];
  142311. +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs;
  142312. +
  142313. +
  142314. +
  142315. +/*
  142316. +
  142317. +
  142318. +
  142319. +Length is the 4 bytes multiples of the sume of
  142320. + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG)
  142321. ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION)
  142322. ++ sizeof (NDIS_802_11_RATES_EX) + IELength
  142323. +
  142324. +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the
  142325. +partial sum.
  142326. +
  142327. +*/
  142328. +#if 0
  142329. +typedef struct _NDIS_WLAN_BSSID_EX
  142330. +{
  142331. + ULONG Length;
  142332. + NDIS_802_11_MAC_ADDRESS MacAddress;
  142333. + UCHAR Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity;
  142334. + NDIS_802_11_SSID Ssid;
  142335. + ULONG Privacy;
  142336. + NDIS_802_11_RSSI Rssi;
  142337. + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
  142338. + NDIS_802_11_CONFIGURATION Configuration;
  142339. + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
  142340. + NDIS_802_11_RATES_EX SupportedRates;
  142341. + ULONG IELength;
  142342. + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information)
  142343. +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;
  142344. +
  142345. +
  142346. +typedef struct _NDIS_802_11_BSSID_LIST_EX
  142347. +{
  142348. + ULONG NumberOfItems;
  142349. + NDIS_WLAN_BSSID_EX Bssid[1];
  142350. +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;
  142351. +#endif
  142352. +
  142353. +typedef enum _NDIS_802_11_AUTHENTICATION_MODE
  142354. +{
  142355. + Ndis802_11AuthModeOpen,
  142356. + Ndis802_11AuthModeShared,
  142357. + Ndis802_11AuthModeAutoSwitch,
  142358. + Ndis802_11AuthModeWPA,
  142359. + Ndis802_11AuthModeWPAPSK,
  142360. + Ndis802_11AuthModeWPANone,
  142361. + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound
  142362. +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;
  142363. +
  142364. +typedef enum _NDIS_802_11_WEP_STATUS
  142365. +{
  142366. + Ndis802_11WEPEnabled,
  142367. + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
  142368. + Ndis802_11WEPDisabled,
  142369. + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
  142370. + Ndis802_11WEPKeyAbsent,
  142371. + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
  142372. + Ndis802_11WEPNotSupported,
  142373. + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
  142374. + Ndis802_11Encryption2Enabled,
  142375. + Ndis802_11Encryption2KeyAbsent,
  142376. + Ndis802_11Encryption3Enabled,
  142377. + Ndis802_11Encryption3KeyAbsent
  142378. +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
  142379. + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
  142380. +
  142381. +
  142382. +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1
  142383. +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2
  142384. +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4
  142385. +
  142386. +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1
  142387. +#define NDIS_802_11_AI_RESFI_STATUSCODE 2
  142388. +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4
  142389. +
  142390. +typedef struct _NDIS_802_11_AI_REQFI
  142391. +{
  142392. + USHORT Capabilities;
  142393. + USHORT ListenInterval;
  142394. + NDIS_802_11_MAC_ADDRESS CurrentAPAddress;
  142395. +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;
  142396. +
  142397. +typedef struct _NDIS_802_11_AI_RESFI
  142398. +{
  142399. + USHORT Capabilities;
  142400. + USHORT StatusCode;
  142401. + USHORT AssociationId;
  142402. +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;
  142403. +
  142404. +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION
  142405. +{
  142406. + ULONG Length;
  142407. + USHORT AvailableRequestFixedIEs;
  142408. + NDIS_802_11_AI_REQFI RequestFixedIEs;
  142409. + ULONG RequestIELength;
  142410. + ULONG OffsetRequestIEs;
  142411. + USHORT AvailableResponseFixedIEs;
  142412. + NDIS_802_11_AI_RESFI ResponseFixedIEs;
  142413. + ULONG ResponseIELength;
  142414. + ULONG OffsetResponseIEs;
  142415. +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;
  142416. +
  142417. +typedef enum _NDIS_802_11_RELOAD_DEFAULTS
  142418. +{
  142419. + Ndis802_11ReloadWEPKeys
  142420. +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;
  142421. +
  142422. +
  142423. +// Key mapping keys require a BSSID
  142424. +typedef struct _NDIS_802_11_KEY
  142425. +{
  142426. + ULONG Length; // Length of this structure
  142427. + ULONG KeyIndex;
  142428. + ULONG KeyLength; // length of key in bytes
  142429. + NDIS_802_11_MAC_ADDRESS BSSID;
  142430. + NDIS_802_11_KEY_RSC KeyRSC;
  142431. + UCHAR KeyMaterial[32]; // variable length depending on above field
  142432. +} NDIS_802_11_KEY, *PNDIS_802_11_KEY;
  142433. +
  142434. +typedef struct _NDIS_802_11_REMOVE_KEY
  142435. +{
  142436. + ULONG Length; // Length of this structure
  142437. + ULONG KeyIndex;
  142438. + NDIS_802_11_MAC_ADDRESS BSSID;
  142439. +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;
  142440. +
  142441. +typedef struct _NDIS_802_11_WEP
  142442. +{
  142443. + ULONG Length; // Length of this structure
  142444. + ULONG KeyIndex; // 0 is the per-client key, 1-N are the global keys
  142445. + ULONG KeyLength; // length of key in bytes
  142446. + UCHAR KeyMaterial[16];// variable length depending on above field
  142447. +} NDIS_802_11_WEP, *PNDIS_802_11_WEP;
  142448. +
  142449. +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST
  142450. +{
  142451. + ULONG Length; // Length of structure
  142452. + NDIS_802_11_MAC_ADDRESS Bssid;
  142453. + ULONG Flags;
  142454. +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST;
  142455. +
  142456. +typedef enum _NDIS_802_11_STATUS_TYPE
  142457. +{
  142458. + Ndis802_11StatusType_Authentication,
  142459. + Ndis802_11StatusType_MediaStreamMode,
  142460. + Ndis802_11StatusType_PMKID_CandidateList,
  142461. + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound
  142462. +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;
  142463. +
  142464. +typedef struct _NDIS_802_11_STATUS_INDICATION
  142465. +{
  142466. + NDIS_802_11_STATUS_TYPE StatusType;
  142467. +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION;
  142468. +
  142469. +// mask for authentication/integrity fields
  142470. +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f
  142471. +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01
  142472. +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02
  142473. +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06
  142474. +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E
  142475. +
  142476. +// MIC check time, 60 seconds.
  142477. +#define MIC_CHECK_TIME 60000000
  142478. +
  142479. +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT
  142480. +{
  142481. + NDIS_802_11_STATUS_INDICATION Status;
  142482. + NDIS_802_11_AUTHENTICATION_REQUEST Request[1];
  142483. +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;
  142484. +
  142485. +typedef struct _NDIS_802_11_TEST
  142486. +{
  142487. + ULONG Length;
  142488. + ULONG Type;
  142489. + union
  142490. + {
  142491. + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;
  142492. + NDIS_802_11_RSSI RssiTrigger;
  142493. + }tt;
  142494. +} NDIS_802_11_TEST, *PNDIS_802_11_TEST;
  142495. +
  142496. +
  142497. +#endif //end of #ifdef PLATFORM_LINUX
  142498. +
  142499. +#ifdef PLATFORM_FREEBSD
  142500. +
  142501. +#define NDIS_802_11_LENGTH_SSID 32
  142502. +#define NDIS_802_11_LENGTH_RATES 8
  142503. +#define NDIS_802_11_LENGTH_RATES_EX 16
  142504. +
  142505. +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6];
  142506. +typedef long NDIS_802_11_RSSI; // in dBm
  142507. +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates
  142508. +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates
  142509. +
  142510. +
  142511. +typedef ULONG NDIS_802_11_KEY_INDEX;
  142512. +typedef unsigned long long NDIS_802_11_KEY_RSC;
  142513. +
  142514. +
  142515. +typedef struct _NDIS_802_11_SSID
  142516. +{
  142517. + ULONG SsidLength;
  142518. + UCHAR Ssid[32];
  142519. +} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
  142520. +
  142521. +typedef enum _NDIS_802_11_NETWORK_TYPE
  142522. +{
  142523. + Ndis802_11FH,
  142524. + Ndis802_11DS,
  142525. + Ndis802_11OFDM5,
  142526. + Ndis802_11OFDM24,
  142527. + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound
  142528. +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
  142529. +
  142530. +typedef struct _NDIS_802_11_CONFIGURATION_FH
  142531. +{
  142532. + ULONG Length; // Length of structure
  142533. + ULONG HopPattern; // As defined by 802.11, MSB set
  142534. + ULONG HopSet; // to one if non-802.11
  142535. + ULONG DwellTime; // units are Kusec
  142536. +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;
  142537. +
  142538. +
  142539. +/*
  142540. + FW will only save the channel number in DSConfig.
  142541. + ODI Handler will convert the channel number to freq. number.
  142542. +*/
  142543. +typedef struct _NDIS_802_11_CONFIGURATION
  142544. +{
  142545. + ULONG Length; // Length of structure
  142546. + ULONG BeaconPeriod; // units are Kusec
  142547. + ULONG ATIMWindow; // units are Kusec
  142548. + ULONG DSConfig; // Frequency, units are kHz
  142549. + NDIS_802_11_CONFIGURATION_FH FHConfig;
  142550. +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;
  142551. +
  142552. +
  142553. +
  142554. +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
  142555. +{
  142556. + Ndis802_11IBSS,
  142557. + Ndis802_11Infrastructure,
  142558. + Ndis802_11AutoUnknown,
  142559. + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound
  142560. + Ndis802_11APMode
  142561. +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;
  142562. +
  142563. +
  142564. +
  142565. +
  142566. +
  142567. +typedef struct _NDIS_802_11_FIXED_IEs
  142568. +{
  142569. + UCHAR Timestamp[8];
  142570. + USHORT BeaconInterval;
  142571. + USHORT Capabilities;
  142572. +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
  142573. +
  142574. +
  142575. +
  142576. +typedef struct _NDIS_802_11_VARIABLE_IEs
  142577. +{
  142578. + UCHAR ElementID;
  142579. + UCHAR Length;
  142580. + UCHAR data[1];
  142581. +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs;
  142582. +
  142583. +
  142584. +
  142585. +/*
  142586. +
  142587. +
  142588. +
  142589. +Length is the 4 bytes multiples of the sume of
  142590. + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG)
  142591. ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION)
  142592. ++ sizeof (NDIS_802_11_RATES_EX) + IELength
  142593. +
  142594. +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the
  142595. +partial sum.
  142596. +
  142597. +*/
  142598. +#if 0
  142599. +typedef struct _NDIS_WLAN_BSSID_EX
  142600. +{
  142601. + ULONG Length;
  142602. + NDIS_802_11_MAC_ADDRESS MacAddress;
  142603. + UCHAR Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity;
  142604. + NDIS_802_11_SSID Ssid;
  142605. + ULONG Privacy;
  142606. + NDIS_802_11_RSSI Rssi;
  142607. + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
  142608. + NDIS_802_11_CONFIGURATION Configuration;
  142609. + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
  142610. + NDIS_802_11_RATES_EX SupportedRates;
  142611. + ULONG IELength;
  142612. + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information)
  142613. +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;
  142614. +
  142615. +
  142616. +typedef struct _NDIS_802_11_BSSID_LIST_EX
  142617. +{
  142618. + ULONG NumberOfItems;
  142619. + NDIS_WLAN_BSSID_EX Bssid[1];
  142620. +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;
  142621. +#endif
  142622. +
  142623. +typedef enum _NDIS_802_11_AUTHENTICATION_MODE
  142624. +{
  142625. + Ndis802_11AuthModeOpen,
  142626. + Ndis802_11AuthModeShared,
  142627. + Ndis802_11AuthModeAutoSwitch,
  142628. + Ndis802_11AuthModeWPA,
  142629. + Ndis802_11AuthModeWPAPSK,
  142630. + Ndis802_11AuthModeWPANone,
  142631. + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound
  142632. +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;
  142633. +
  142634. +typedef enum _NDIS_802_11_WEP_STATUS
  142635. +{
  142636. + Ndis802_11WEPEnabled,
  142637. + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
  142638. + Ndis802_11WEPDisabled,
  142639. + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
  142640. + Ndis802_11WEPKeyAbsent,
  142641. + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
  142642. + Ndis802_11WEPNotSupported,
  142643. + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
  142644. + Ndis802_11Encryption2Enabled,
  142645. + Ndis802_11Encryption2KeyAbsent,
  142646. + Ndis802_11Encryption3Enabled,
  142647. + Ndis802_11Encryption3KeyAbsent
  142648. +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
  142649. + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
  142650. +
  142651. +
  142652. +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1
  142653. +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2
  142654. +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4
  142655. +
  142656. +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1
  142657. +#define NDIS_802_11_AI_RESFI_STATUSCODE 2
  142658. +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4
  142659. +
  142660. +typedef struct _NDIS_802_11_AI_REQFI
  142661. +{
  142662. + USHORT Capabilities;
  142663. + USHORT ListenInterval;
  142664. + NDIS_802_11_MAC_ADDRESS CurrentAPAddress;
  142665. +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;
  142666. +
  142667. +typedef struct _NDIS_802_11_AI_RESFI
  142668. +{
  142669. + USHORT Capabilities;
  142670. + USHORT StatusCode;
  142671. + USHORT AssociationId;
  142672. +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;
  142673. +
  142674. +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION
  142675. +{
  142676. + ULONG Length;
  142677. + USHORT AvailableRequestFixedIEs;
  142678. + NDIS_802_11_AI_REQFI RequestFixedIEs;
  142679. + ULONG RequestIELength;
  142680. + ULONG OffsetRequestIEs;
  142681. + USHORT AvailableResponseFixedIEs;
  142682. + NDIS_802_11_AI_RESFI ResponseFixedIEs;
  142683. + ULONG ResponseIELength;
  142684. + ULONG OffsetResponseIEs;
  142685. +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;
  142686. +
  142687. +typedef enum _NDIS_802_11_RELOAD_DEFAULTS
  142688. +{
  142689. + Ndis802_11ReloadWEPKeys
  142690. +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;
  142691. +
  142692. +
  142693. +// Key mapping keys require a BSSID
  142694. +typedef struct _NDIS_802_11_KEY
  142695. +{
  142696. + ULONG Length; // Length of this structure
  142697. + ULONG KeyIndex;
  142698. + ULONG KeyLength; // length of key in bytes
  142699. + NDIS_802_11_MAC_ADDRESS BSSID;
  142700. + NDIS_802_11_KEY_RSC KeyRSC;
  142701. + UCHAR KeyMaterial[32]; // variable length depending on above field
  142702. +} NDIS_802_11_KEY, *PNDIS_802_11_KEY;
  142703. +
  142704. +typedef struct _NDIS_802_11_REMOVE_KEY
  142705. +{
  142706. + ULONG Length; // Length of this structure
  142707. + ULONG KeyIndex;
  142708. + NDIS_802_11_MAC_ADDRESS BSSID;
  142709. +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;
  142710. +
  142711. +typedef struct _NDIS_802_11_WEP
  142712. +{
  142713. + ULONG Length; // Length of this structure
  142714. + ULONG KeyIndex; // 0 is the per-client key, 1-N are the global keys
  142715. + ULONG KeyLength; // length of key in bytes
  142716. + UCHAR KeyMaterial[16];// variable length depending on above field
  142717. +} NDIS_802_11_WEP, *PNDIS_802_11_WEP;
  142718. +
  142719. +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST
  142720. +{
  142721. + ULONG Length; // Length of structure
  142722. + NDIS_802_11_MAC_ADDRESS Bssid;
  142723. + ULONG Flags;
  142724. +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST;
  142725. +
  142726. +typedef enum _NDIS_802_11_STATUS_TYPE
  142727. +{
  142728. + Ndis802_11StatusType_Authentication,
  142729. + Ndis802_11StatusType_MediaStreamMode,
  142730. + Ndis802_11StatusType_PMKID_CandidateList,
  142731. + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound
  142732. +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;
  142733. +
  142734. +typedef struct _NDIS_802_11_STATUS_INDICATION
  142735. +{
  142736. + NDIS_802_11_STATUS_TYPE StatusType;
  142737. +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION;
  142738. +
  142739. +// mask for authentication/integrity fields
  142740. +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f
  142741. +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01
  142742. +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02
  142743. +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06
  142744. +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E
  142745. +
  142746. +// MIC check time, 60 seconds.
  142747. +#define MIC_CHECK_TIME 60000000
  142748. +
  142749. +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT
  142750. +{
  142751. + NDIS_802_11_STATUS_INDICATION Status;
  142752. + NDIS_802_11_AUTHENTICATION_REQUEST Request[1];
  142753. +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;
  142754. +
  142755. +typedef struct _NDIS_802_11_TEST
  142756. +{
  142757. + ULONG Length;
  142758. + ULONG Type;
  142759. + union
  142760. + {
  142761. + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;
  142762. + NDIS_802_11_RSSI RssiTrigger;
  142763. + }tt;
  142764. +} NDIS_802_11_TEST, *PNDIS_802_11_TEST;
  142765. +
  142766. +
  142767. +#endif //PLATFORM_FREEBSD
  142768. +#ifndef Ndis802_11APMode
  142769. +#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1)
  142770. +#endif
  142771. +
  142772. +typedef struct _WLAN_PHY_INFO
  142773. +{
  142774. + u8 SignalStrength;//(in percentage)
  142775. + u8 SignalQuality;//(in percentage)
  142776. + u8 Optimum_antenna; //for Antenna diversity
  142777. + u8 Reserved_0;
  142778. +}WLAN_PHY_INFO,*PWLAN_PHY_INFO;
  142779. +
  142780. +/* temporally add #pragma pack for structure alignment issue of
  142781. +* WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz()
  142782. +*/
  142783. +#ifdef PLATFORM_WINDOWS
  142784. +#pragma pack(push)
  142785. +#pragma pack(1)
  142786. +#endif
  142787. +typedef struct _WLAN_BSSID_EX
  142788. +{
  142789. + ULONG Length;
  142790. + NDIS_802_11_MAC_ADDRESS MacAddress;
  142791. + UCHAR Reserved[2];//[0]: IS beacon frame
  142792. + NDIS_802_11_SSID Ssid;
  142793. + ULONG Privacy;
  142794. + NDIS_802_11_RSSI Rssi;//(in dBM,raw data ,get from PHY)
  142795. + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
  142796. + NDIS_802_11_CONFIGURATION Configuration;
  142797. + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
  142798. + NDIS_802_11_RATES_EX SupportedRates;
  142799. + WLAN_PHY_INFO PhyInfo;
  142800. + ULONG IELength;
  142801. + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information)
  142802. +}
  142803. +#ifndef PLATFORM_WINDOWS
  142804. +__attribute__((packed))
  142805. +#endif
  142806. +WLAN_BSSID_EX, *PWLAN_BSSID_EX;
  142807. +#ifdef PLATFORM_WINDOWS
  142808. +#pragma pack(pop)
  142809. +#endif
  142810. +
  142811. +__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss)
  142812. +{
  142813. + return (sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + bss->IELength);
  142814. +}
  142815. +
  142816. +struct wlan_network {
  142817. + _list list;
  142818. + int network_type; //refer to ieee80211.h for WIRELESS_11A/B/G
  142819. + int fixed; // set to fixed when not to be removed as site-surveying
  142820. + unsigned long last_scanned; //timestamp for the network
  142821. + int aid; //will only be valid when a BSS is joinned.
  142822. + int join_res;
  142823. + WLAN_BSSID_EX network; //must be the last item
  142824. +#ifdef PLATFORM_WINDOWS
  142825. + unsigned char iebuf[MAX_IE_SZ];
  142826. +#endif
  142827. +
  142828. +};
  142829. +
  142830. +enum VRTL_CARRIER_SENSE
  142831. +{
  142832. + DISABLE_VCS,
  142833. + ENABLE_VCS,
  142834. + AUTO_VCS
  142835. +};
  142836. +
  142837. +enum VCS_TYPE
  142838. +{
  142839. + NONE_VCS,
  142840. + RTS_CTS,
  142841. + CTS_TO_SELF
  142842. +};
  142843. +
  142844. +
  142845. +
  142846. +
  142847. +#define PWR_CAM 0
  142848. +#define PWR_MINPS 1
  142849. +#define PWR_MAXPS 2
  142850. +#define PWR_UAPSD 3
  142851. +#define PWR_VOIP 4
  142852. +
  142853. +
  142854. +enum UAPSD_MAX_SP
  142855. +{
  142856. + NO_LIMIT,
  142857. + TWO_MSDU,
  142858. + FOUR_MSDU,
  142859. + SIX_MSDU
  142860. +};
  142861. +
  142862. +
  142863. +//john
  142864. +#define NUM_PRE_AUTH_KEY 16
  142865. +#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY
  142866. +
  142867. +/*
  142868. +* WPA2
  142869. +*/
  142870. +
  142871. +#ifndef PLATFORM_OS_CE
  142872. +typedef struct _PMKID_CANDIDATE {
  142873. + NDIS_802_11_MAC_ADDRESS BSSID;
  142874. + ULONG Flags;
  142875. +} PMKID_CANDIDATE, *PPMKID_CANDIDATE;
  142876. +
  142877. +typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST
  142878. +{
  142879. + ULONG Version; // Version of the structure
  142880. + ULONG NumCandidates; // No. of pmkid candidates
  142881. + PMKID_CANDIDATE CandidateList[1];
  142882. +} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST;
  142883. +
  142884. +
  142885. +typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION
  142886. +{
  142887. + NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported;
  142888. + NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported;
  142889. +
  142890. +} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION;
  142891. +
  142892. +typedef struct _NDIS_802_11_CAPABILITY
  142893. +{
  142894. + ULONG Length;
  142895. + ULONG Version;
  142896. + ULONG NoOfPMKIDs;
  142897. + ULONG NoOfAuthEncryptPairsSupported;
  142898. + NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];
  142899. +
  142900. +} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;
  142901. +#endif
  142902. +
  142903. +
  142904. +#endif //#ifndef WLAN_BSSDEF_H_
  142905. --- /dev/null
  142906. +++ b/drivers/net/wireless/rtl8192cu/include/xmit_osdep.h
  142907. @@ -0,0 +1,94 @@
  142908. +/******************************************************************************
  142909. + *
  142910. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  142911. + *
  142912. + * This program is free software; you can redistribute it and/or modify it
  142913. + * under the terms of version 2 of the GNU General Public License as
  142914. + * published by the Free Software Foundation.
  142915. + *
  142916. + * This program is distributed in the hope that it will be useful, but WITHOUT
  142917. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  142918. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  142919. + * more details.
  142920. + *
  142921. + * You should have received a copy of the GNU General Public License along with
  142922. + * this program; if not, write to the Free Software Foundation, Inc.,
  142923. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  142924. + *
  142925. + *
  142926. + ******************************************************************************/
  142927. +#ifndef __XMIT_OSDEP_H_
  142928. +#define __XMIT_OSDEP_H_
  142929. +
  142930. +#include <drv_conf.h>
  142931. +#include <osdep_service.h>
  142932. +#include <drv_types.h>
  142933. +
  142934. +struct pkt_file {
  142935. + _pkt *pkt;
  142936. + SIZE_T pkt_len; //the remainder length of the open_file
  142937. + _buffer *cur_buffer;
  142938. + u8 *buf_start;
  142939. + u8 *cur_addr;
  142940. + SIZE_T buf_len;
  142941. +};
  142942. +
  142943. +#ifdef PLATFORM_WINDOWS
  142944. +
  142945. +#ifdef PLATFORM_OS_XP
  142946. +#ifdef CONFIG_USB_HCI
  142947. +#include <usb.h>
  142948. +#include <usbdlib.h>
  142949. +#include <usbioctl.h>
  142950. +#endif
  142951. +#endif
  142952. +
  142953. +#define NR_XMITFRAME 128
  142954. +
  142955. +#define ETH_ALEN 6
  142956. +
  142957. +extern NDIS_STATUS rtw_xmit_entry(
  142958. +IN _nic_hdl cnxt,
  142959. +IN NDIS_PACKET *pkt,
  142960. +IN UINT flags
  142961. +);
  142962. +
  142963. +#endif
  142964. +
  142965. +#ifdef PLATFORM_FREEBSD
  142966. +#define NR_XMITFRAME 256
  142967. +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);
  142968. +extern void rtw_xmit_entry_wrap (struct ifnet * pifp);
  142969. +#endif //PLATFORM_FREEBSD
  142970. +
  142971. +#ifdef PLATFORM_LINUX
  142972. +
  142973. +#define NR_XMITFRAME 256
  142974. +
  142975. +struct xmit_priv;
  142976. +struct pkt_attrib;
  142977. +struct sta_xmit_priv;
  142978. +struct xmit_frame;
  142979. +struct xmit_buf;
  142980. +
  142981. +extern int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);
  142982. +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);
  142983. +
  142984. +#endif
  142985. +
  142986. +void rtw_os_xmit_schedule(_adapter *padapter);
  142987. +
  142988. +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz);
  142989. +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz);
  142990. +
  142991. +extern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib);
  142992. +
  142993. +extern uint rtw_remainder_len(struct pkt_file *pfile);
  142994. +extern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile);
  142995. +extern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen);
  142996. +extern sint rtw_endofpktfile (struct pkt_file *pfile);
  142997. +
  142998. +extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt);
  142999. +extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe);
  143000. +
  143001. +#endif //__XMIT_OSDEP_H_
  143002. --- /dev/null
  143003. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c
  143004. @@ -0,0 +1,5488 @@
  143005. +/******************************************************************************
  143006. + *
  143007. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  143008. + *
  143009. + * This program is free software; you can redistribute it and/or modify it
  143010. + * under the terms of version 2 of the GNU General Public License as
  143011. + * published by the Free Software Foundation.
  143012. + *
  143013. + * This program is distributed in the hope that it will be useful, but WITHOUT
  143014. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  143015. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  143016. + * more details.
  143017. + *
  143018. + * You should have received a copy of the GNU General Public License along with
  143019. + * this program; if not, write to the Free Software Foundation, Inc.,
  143020. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  143021. + *
  143022. + *
  143023. + ******************************************************************************/
  143024. +#define _IOCTL_CFG80211_C_
  143025. +
  143026. +#include <drv_conf.h>
  143027. +#include <osdep_service.h>
  143028. +#include <drv_types.h>
  143029. +#include <rtw_ioctl.h>
  143030. +#include <rtw_ioctl_set.h>
  143031. +#include <rtw_ioctl_query.h>
  143032. +#include <xmit_osdep.h>
  143033. +
  143034. +#ifdef CONFIG_IOCTL_CFG80211
  143035. +
  143036. +#include "ioctl_cfg80211.h"
  143037. +
  143038. +#define RTW_MAX_MGMT_TX_CNT (8)
  143039. +
  143040. +#define RTW_SCAN_IE_LEN_MAX 2304
  143041. +#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms
  143042. +#define RTW_MAX_NUM_PMKIDS 4
  143043. +
  143044. +#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */
  143045. +
  143046. +static const u32 rtw_cipher_suites[] = {
  143047. + WLAN_CIPHER_SUITE_WEP40,
  143048. + WLAN_CIPHER_SUITE_WEP104,
  143049. + WLAN_CIPHER_SUITE_TKIP,
  143050. + WLAN_CIPHER_SUITE_CCMP,
  143051. +#ifdef CONFIG_IEEE80211W
  143052. + WLAN_CIPHER_SUITE_AES_CMAC,
  143053. +#endif //CONFIG_IEEE80211W
  143054. +};
  143055. +
  143056. +#define RATETAB_ENT(_rate, _rateid, _flags) \
  143057. + { \
  143058. + .bitrate = (_rate), \
  143059. + .hw_value = (_rateid), \
  143060. + .flags = (_flags), \
  143061. + }
  143062. +
  143063. +#define CHAN2G(_channel, _freq, _flags) { \
  143064. + .band = IEEE80211_BAND_2GHZ, \
  143065. + .center_freq = (_freq), \
  143066. + .hw_value = (_channel), \
  143067. + .flags = (_flags), \
  143068. + .max_antenna_gain = 0, \
  143069. + .max_power = 30, \
  143070. +}
  143071. +
  143072. +#define CHAN5G(_channel, _flags) { \
  143073. + .band = IEEE80211_BAND_5GHZ, \
  143074. + .center_freq = 5000 + (5 * (_channel)), \
  143075. + .hw_value = (_channel), \
  143076. + .flags = (_flags), \
  143077. + .max_antenna_gain = 0, \
  143078. + .max_power = 30, \
  143079. +}
  143080. +
  143081. +static struct ieee80211_rate rtw_rates[] = {
  143082. + RATETAB_ENT(10, 0x1, 0),
  143083. + RATETAB_ENT(20, 0x2, 0),
  143084. + RATETAB_ENT(55, 0x4, 0),
  143085. + RATETAB_ENT(110, 0x8, 0),
  143086. + RATETAB_ENT(60, 0x10, 0),
  143087. + RATETAB_ENT(90, 0x20, 0),
  143088. + RATETAB_ENT(120, 0x40, 0),
  143089. + RATETAB_ENT(180, 0x80, 0),
  143090. + RATETAB_ENT(240, 0x100, 0),
  143091. + RATETAB_ENT(360, 0x200, 0),
  143092. + RATETAB_ENT(480, 0x400, 0),
  143093. + RATETAB_ENT(540, 0x800, 0),
  143094. +};
  143095. +
  143096. +#define rtw_a_rates (rtw_rates + 4)
  143097. +#define RTW_A_RATES_NUM 8
  143098. +#define rtw_g_rates (rtw_rates + 0)
  143099. +#define RTW_G_RATES_NUM 12
  143100. +
  143101. +#define RTW_2G_CHANNELS_NUM 14
  143102. +#define RTW_5G_CHANNELS_NUM 37
  143103. +
  143104. +static struct ieee80211_channel rtw_2ghz_channels[] = {
  143105. + CHAN2G(1, 2412, 0),
  143106. + CHAN2G(2, 2417, 0),
  143107. + CHAN2G(3, 2422, 0),
  143108. + CHAN2G(4, 2427, 0),
  143109. + CHAN2G(5, 2432, 0),
  143110. + CHAN2G(6, 2437, 0),
  143111. + CHAN2G(7, 2442, 0),
  143112. + CHAN2G(8, 2447, 0),
  143113. + CHAN2G(9, 2452, 0),
  143114. + CHAN2G(10, 2457, 0),
  143115. + CHAN2G(11, 2462, 0),
  143116. + CHAN2G(12, 2467, 0),
  143117. + CHAN2G(13, 2472, 0),
  143118. + CHAN2G(14, 2484, 0),
  143119. +};
  143120. +
  143121. +static struct ieee80211_channel rtw_5ghz_a_channels[] = {
  143122. + CHAN5G(34, 0), CHAN5G(36, 0),
  143123. + CHAN5G(38, 0), CHAN5G(40, 0),
  143124. + CHAN5G(42, 0), CHAN5G(44, 0),
  143125. + CHAN5G(46, 0), CHAN5G(48, 0),
  143126. + CHAN5G(52, 0), CHAN5G(56, 0),
  143127. + CHAN5G(60, 0), CHAN5G(64, 0),
  143128. + CHAN5G(100, 0), CHAN5G(104, 0),
  143129. + CHAN5G(108, 0), CHAN5G(112, 0),
  143130. + CHAN5G(116, 0), CHAN5G(120, 0),
  143131. + CHAN5G(124, 0), CHAN5G(128, 0),
  143132. + CHAN5G(132, 0), CHAN5G(136, 0),
  143133. + CHAN5G(140, 0), CHAN5G(149, 0),
  143134. + CHAN5G(153, 0), CHAN5G(157, 0),
  143135. + CHAN5G(161, 0), CHAN5G(165, 0),
  143136. + CHAN5G(184, 0), CHAN5G(188, 0),
  143137. + CHAN5G(192, 0), CHAN5G(196, 0),
  143138. + CHAN5G(200, 0), CHAN5G(204, 0),
  143139. + CHAN5G(208, 0), CHAN5G(212, 0),
  143140. + CHAN5G(216, 0),
  143141. +};
  143142. +
  143143. +
  143144. +void rtw_2g_channels_init(struct ieee80211_channel *channels)
  143145. +{
  143146. + _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels,
  143147. + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM
  143148. + );
  143149. +}
  143150. +
  143151. +void rtw_5g_channels_init(struct ieee80211_channel *channels)
  143152. +{
  143153. + _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels,
  143154. + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM
  143155. + );
  143156. +}
  143157. +
  143158. +void rtw_2g_rates_init(struct ieee80211_rate *rates)
  143159. +{
  143160. + _rtw_memcpy(rates, rtw_g_rates,
  143161. + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM
  143162. + );
  143163. +}
  143164. +
  143165. +void rtw_5g_rates_init(struct ieee80211_rate *rates)
  143166. +{
  143167. + _rtw_memcpy(rates, rtw_a_rates,
  143168. + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM
  143169. + );
  143170. +}
  143171. +
  143172. +struct ieee80211_supported_band *rtw_spt_band_alloc(
  143173. + enum ieee80211_band band
  143174. + )
  143175. +{
  143176. + struct ieee80211_supported_band *spt_band = NULL;
  143177. + int n_channels, n_bitrates;
  143178. +
  143179. + if(band == IEEE80211_BAND_2GHZ)
  143180. + {
  143181. + n_channels = RTW_2G_CHANNELS_NUM;
  143182. + n_bitrates = RTW_G_RATES_NUM;
  143183. + }
  143184. + else if(band == IEEE80211_BAND_5GHZ)
  143185. + {
  143186. + n_channels = RTW_5G_CHANNELS_NUM;
  143187. + n_bitrates = RTW_A_RATES_NUM;
  143188. + }
  143189. + else
  143190. + {
  143191. + goto exit;
  143192. + }
  143193. +
  143194. + spt_band = (struct ieee80211_supported_band *)rtw_zmalloc(
  143195. + sizeof(struct ieee80211_supported_band)
  143196. + + sizeof(struct ieee80211_channel)*n_channels
  143197. + + sizeof(struct ieee80211_rate)*n_bitrates
  143198. + );
  143199. + if(!spt_band)
  143200. + goto exit;
  143201. +
  143202. + spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band));
  143203. + spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels);
  143204. + spt_band->band = band;
  143205. + spt_band->n_channels = n_channels;
  143206. + spt_band->n_bitrates = n_bitrates;
  143207. +
  143208. + if(band == IEEE80211_BAND_2GHZ)
  143209. + {
  143210. + rtw_2g_channels_init(spt_band->channels);
  143211. + rtw_2g_rates_init(spt_band->bitrates);
  143212. + }
  143213. + else if(band == IEEE80211_BAND_5GHZ)
  143214. + {
  143215. + rtw_5g_channels_init(spt_band->channels);
  143216. + rtw_5g_rates_init(spt_band->bitrates);
  143217. + }
  143218. +
  143219. + //spt_band.ht_cap
  143220. +
  143221. +exit:
  143222. +
  143223. + return spt_band;
  143224. +}
  143225. +
  143226. +void rtw_spt_band_free(struct ieee80211_supported_band *spt_band)
  143227. +{
  143228. + u32 size;
  143229. +
  143230. + if(!spt_band)
  143231. + return;
  143232. +
  143233. + if(spt_band->band == IEEE80211_BAND_2GHZ)
  143234. + {
  143235. + size = sizeof(struct ieee80211_supported_band)
  143236. + + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM
  143237. + + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM;
  143238. + }
  143239. + else if(spt_band->band == IEEE80211_BAND_5GHZ)
  143240. + {
  143241. + size = sizeof(struct ieee80211_supported_band)
  143242. + + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM
  143243. + + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM;
  143244. + }
  143245. + else
  143246. + {
  143247. +
  143248. + }
  143249. + rtw_mfree((u8*)spt_band, size);
  143250. +}
  143251. +
  143252. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  143253. +static const struct ieee80211_txrx_stypes
  143254. +rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
  143255. + [NL80211_IFTYPE_ADHOC] = {
  143256. + .tx = 0xffff,
  143257. + .rx = BIT(IEEE80211_STYPE_ACTION >> 4)
  143258. + },
  143259. + [NL80211_IFTYPE_STATION] = {
  143260. + .tx = 0xffff,
  143261. + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
  143262. + BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
  143263. + },
  143264. + [NL80211_IFTYPE_AP] = {
  143265. + .tx = 0xffff,
  143266. + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
  143267. + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
  143268. + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
  143269. + BIT(IEEE80211_STYPE_DISASSOC >> 4) |
  143270. + BIT(IEEE80211_STYPE_AUTH >> 4) |
  143271. + BIT(IEEE80211_STYPE_DEAUTH >> 4) |
  143272. + BIT(IEEE80211_STYPE_ACTION >> 4)
  143273. + },
  143274. + [NL80211_IFTYPE_AP_VLAN] = {
  143275. + /* copy AP */
  143276. + .tx = 0xffff,
  143277. + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
  143278. + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
  143279. + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
  143280. + BIT(IEEE80211_STYPE_DISASSOC >> 4) |
  143281. + BIT(IEEE80211_STYPE_AUTH >> 4) |
  143282. + BIT(IEEE80211_STYPE_DEAUTH >> 4) |
  143283. + BIT(IEEE80211_STYPE_ACTION >> 4)
  143284. + },
  143285. + [NL80211_IFTYPE_P2P_CLIENT] = {
  143286. + .tx = 0xffff,
  143287. + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
  143288. + BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
  143289. + },
  143290. + [NL80211_IFTYPE_P2P_GO] = {
  143291. + .tx = 0xffff,
  143292. + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
  143293. + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
  143294. + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
  143295. + BIT(IEEE80211_STYPE_DISASSOC >> 4) |
  143296. + BIT(IEEE80211_STYPE_AUTH >> 4) |
  143297. + BIT(IEEE80211_STYPE_DEAUTH >> 4) |
  143298. + BIT(IEEE80211_STYPE_ACTION >> 4)
  143299. + },
  143300. +};
  143301. +#endif
  143302. +
  143303. +static int rtw_ieee80211_channel_to_frequency(int chan, int band)
  143304. +{
  143305. + /* see 802.11 17.3.8.3.2 and Annex J
  143306. + * there are overlapping channel numbers in 5GHz and 2GHz bands */
  143307. +
  143308. + if (band == IEEE80211_BAND_5GHZ) {
  143309. + if (chan >= 182 && chan <= 196)
  143310. + return 4000 + chan * 5;
  143311. + else
  143312. + return 5000 + chan * 5;
  143313. + } else { /* IEEE80211_BAND_2GHZ */
  143314. + if (chan == 14)
  143315. + return 2484;
  143316. + else if (chan < 14)
  143317. + return 2407 + chan * 5;
  143318. + else
  143319. + return 0; /* not supported */
  143320. + }
  143321. +}
  143322. +
  143323. +#define MAX_BSSINFO_LEN 1000
  143324. +static int rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)
  143325. +{
  143326. + int ret=0;
  143327. + struct ieee80211_channel *notify_channel;
  143328. + struct cfg80211_bss *bss;
  143329. + //struct ieee80211_supported_band *band;
  143330. + u16 channel;
  143331. + u32 freq;
  143332. + u64 notify_timestamp;
  143333. + u16 notify_capability;
  143334. + u16 notify_interval;
  143335. + u8 *notify_ie;
  143336. + size_t notify_ielen;
  143337. + s32 notify_signal;
  143338. + u8 buf[MAX_BSSINFO_LEN], *pbuf;
  143339. + size_t len,bssinf_len=0;
  143340. + struct rtw_ieee80211_hdr *pwlanhdr;
  143341. + unsigned short *fctrl;
  143342. + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  143343. +
  143344. + struct wireless_dev *wdev = padapter->rtw_wdev;
  143345. + struct wiphy *wiphy = wdev->wiphy;
  143346. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  143347. +
  143348. +
  143349. + //DBG_8192C("%s\n", __func__);
  143350. +
  143351. + bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr);
  143352. + if(bssinf_len > MAX_BSSINFO_LEN){
  143353. + DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN);
  143354. + goto exit;
  143355. + }
  143356. +
  143357. + //To reduce PBC Overlap rate
  143358. + //_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  143359. + if(wdev_to_priv(wdev)->scan_request != NULL)
  143360. + {
  143361. + u8 *psr=NULL, sr = 0;
  143362. + NDIS_802_11_SSID *pssid = &pnetwork->network.Ssid;
  143363. + struct cfg80211_scan_request *request = wdev_to_priv(wdev)->scan_request;
  143364. + struct cfg80211_ssid *ssids = request->ssids;
  143365. + u32 wpsielen=0;
  143366. + u8 *wpsie=NULL;
  143367. +
  143368. + wpsie = rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);
  143369. +
  143370. + if(wpsie && wpsielen>0)
  143371. + psr = rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);
  143372. +
  143373. + if (sr != 0)
  143374. + {
  143375. + if(request->n_ssids == 1 && request->n_channels == 1) // it means under processing WPS
  143376. + {
  143377. + DBG_8192C("ssid=%s, len=%d\n", pssid->Ssid, pssid->SsidLength);
  143378. +
  143379. + if(pssid->SsidLength == ssids[0].ssid_len &&
  143380. + _rtw_memcmp(pssid->Ssid, ssids[0].ssid, ssids[0].ssid_len))
  143381. + {
  143382. + DBG_871X("%s, got sr and ssid match!\n", __func__);
  143383. + }
  143384. + else
  143385. + {
  143386. + if(psr !=NULL)
  143387. + *psr = 0; //clear sr
  143388. +
  143389. +#if 0
  143390. + WLAN_BSSID_EX *pselect_network = &pnetwork->network;
  143391. + struct cfg80211_bss *pselect_bss = NULL;
  143392. + struct ieee80211_channel *notify_channel = NULL;
  143393. + u32 freq;
  143394. +
  143395. + DBG_871X("%s, got sr, but ssid mismatch, to remove this bss\n", __func__);
  143396. +
  143397. + if (pselect_network->Configuration.DSConfig <= RTW_CH_MAX_2G_CHANNEL)
  143398. + freq = rtw_ieee80211_channel_to_frequency(pselect_network->Configuration.DSConfig, IEEE80211_BAND_2GHZ);
  143399. + else
  143400. + freq = rtw_ieee80211_channel_to_frequency(pselect_network->Configuration.DSConfig, IEEE80211_BAND_5GHZ);
  143401. +
  143402. + notify_channel = ieee80211_get_channel(wiphy, freq);
  143403. + pselect_bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,
  143404. + pselect_network->MacAddress, pselect_network->Ssid.Ssid,
  143405. + pselect_network->Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/,
  143406. + 0/*WLAN_CAPABILITY_ESS*/);
  143407. +
  143408. + if(pselect_bss)
  143409. + {
  143410. + DBG_871X("%s, got bss for cfg80211 for unlinking bss\n", __func__);
  143411. +
  143412. + cfg80211_unlink_bss(wiphy, pselect_bss);
  143413. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
  143414. + cfg80211_put_bss(wiphy, pselect_bss);
  143415. +#else
  143416. + cfg80211_put_bss(pselect_bss);
  143417. +#endif
  143418. +
  143419. + }
  143420. +
  143421. + goto exit;
  143422. +#endif
  143423. + }
  143424. + }
  143425. + }
  143426. + }
  143427. + //_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  143428. +
  143429. + channel = pnetwork->network.Configuration.DSConfig;
  143430. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  143431. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  143432. + else
  143433. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  143434. +
  143435. + notify_channel = ieee80211_get_channel(wiphy, freq);
  143436. +
  143437. + //rtw_get_timestampe_from_ie()
  143438. + notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */
  143439. +
  143440. + notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));
  143441. + notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs));
  143442. +
  143443. +
  143444. + notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;
  143445. + notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;
  143446. +
  143447. + //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm)
  143448. + if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
  143449. + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) {
  143450. + notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm
  143451. + } else {
  143452. + notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
  143453. + }
  143454. +
  143455. +/*
  143456. + DBG_8192C("bssid: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
  143457. + pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], pnetwork->network.MacAddress[2],
  143458. + pnetwork->network.MacAddress[3], pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5]);
  143459. + DBG_8192C("Channel: %d(%d)\n", channel, freq);
  143460. + DBG_8192C("Capability: %X\n", notify_capability);
  143461. + DBG_8192C("Beacon interval: %d\n", notify_interval);
  143462. + DBG_8192C("Signal: %d\n", notify_signal);
  143463. + DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp);
  143464. +*/
  143465. +
  143466. + pbuf = buf;
  143467. +
  143468. + pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf;
  143469. + fctrl = &(pwlanhdr->frame_ctl);
  143470. + *(fctrl) = 0;
  143471. +
  143472. + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
  143473. + //pmlmeext->mgnt_seq++;
  143474. +
  143475. + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON
  143476. + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
  143477. + SetFrameSubType(pbuf, WIFI_BEACON);
  143478. + } else {
  143479. + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN);
  143480. + SetFrameSubType(pbuf, WIFI_PROBERSP);
  143481. + }
  143482. +
  143483. + _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN);
  143484. + _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);
  143485. +
  143486. +
  143487. + pbuf += sizeof(struct rtw_ieee80211_hdr_3addr);
  143488. + len = sizeof (struct rtw_ieee80211_hdr_3addr);
  143489. +
  143490. + _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);
  143491. + len += pnetwork->network.IELength;
  143492. +
  143493. + //#ifdef CONFIG_P2P
  143494. + //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL))
  143495. + //{
  143496. + // DBG_8192C("%s, got p2p_ie\n", __func__);
  143497. + //}
  143498. + //#endif
  143499. +
  143500. +
  143501. +#if 1
  143502. + bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf,
  143503. + len, notify_signal, GFP_ATOMIC);
  143504. +#else
  143505. +
  143506. + bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress,
  143507. + notify_timestamp, notify_capability, notify_interval, notify_ie,
  143508. + notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/);
  143509. +#endif
  143510. +
  143511. + if (unlikely(!bss)) {
  143512. + DBG_8192C("rtw_cfg80211_inform_bss error\n");
  143513. + return -EINVAL;
  143514. + }
  143515. +
  143516. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38))
  143517. +#ifndef COMPAT_KERNEL_RELEASE
  143518. + //patch for cfg80211, update beacon ies to information_elements
  143519. + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON
  143520. +
  143521. + if(bss->len_information_elements != bss->len_beacon_ies)
  143522. + {
  143523. + bss->information_elements = bss->beacon_ies;
  143524. + bss->len_information_elements = bss->len_beacon_ies;
  143525. + }
  143526. + }
  143527. +#endif //COMPAT_KERNEL_RELEASE
  143528. +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)
  143529. +
  143530. +/*
  143531. + {
  143532. + if( bss->information_elements == bss->proberesp_ies)
  143533. + {
  143534. + if( bss->len_information_elements != bss->len_proberesp_ies)
  143535. + {
  143536. + DBG_8192C("error!, len_information_elements != bss->len_proberesp_ies\n");
  143537. + }
  143538. +
  143539. + }
  143540. + else if(bss->len_information_elements < bss->len_beacon_ies)
  143541. + {
  143542. + bss->information_elements = bss->beacon_ies;
  143543. + bss->len_information_elements = bss->len_beacon_ies;
  143544. + }
  143545. + }
  143546. +*/
  143547. +
  143548. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
  143549. + cfg80211_put_bss(wiphy, bss);
  143550. +#else
  143551. + cfg80211_put_bss(bss);
  143552. +#endif
  143553. +
  143554. +exit:
  143555. + return ret;
  143556. +
  143557. +}
  143558. +
  143559. +/*
  143560. + Check the given bss is valid by kernel API cfg80211_get_bss()
  143561. + @padapter : the given adapter
  143562. +
  143563. + return _TRUE if bss is valid, _FALSE for not found.
  143564. +*/
  143565. +int rtw_cfg80211_check_bss(_adapter *padapter)
  143566. +{
  143567. + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);
  143568. + struct cfg80211_bss *bss = NULL;
  143569. + struct ieee80211_channel *notify_channel = NULL;
  143570. + u32 freq;
  143571. +
  143572. + if (!(pnetwork) || !(padapter->rtw_wdev))
  143573. + return _FALSE;
  143574. +
  143575. + if (pnetwork->Configuration.DSConfig <= RTW_CH_MAX_2G_CHANNEL)
  143576. + freq = rtw_ieee80211_channel_to_frequency(pnetwork->Configuration.DSConfig, IEEE80211_BAND_2GHZ);
  143577. + else
  143578. + freq = rtw_ieee80211_channel_to_frequency(pnetwork->Configuration.DSConfig, IEEE80211_BAND_5GHZ);
  143579. +
  143580. + notify_channel = ieee80211_get_channel(padapter->rtw_wdev->wiphy, freq);
  143581. + bss = cfg80211_get_bss(padapter->rtw_wdev->wiphy, notify_channel,
  143582. + pnetwork->MacAddress, pnetwork->Ssid.Ssid,
  143583. + pnetwork->Ssid.SsidLength,
  143584. + WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
  143585. +
  143586. + return (bss!=NULL);
  143587. +}
  143588. +
  143589. +void rtw_cfg80211_indicate_connect(_adapter *padapter)
  143590. +{
  143591. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  143592. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  143593. + struct wireless_dev *pwdev = padapter->rtw_wdev;
  143594. +#ifdef CONFIG_P2P
  143595. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  143596. +#endif
  143597. + struct cfg80211_bss *bss = NULL;
  143598. +
  143599. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  143600. + if (pwdev->iftype != NL80211_IFTYPE_STATION
  143601. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  143602. + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT
  143603. + #endif
  143604. + ) {
  143605. + return;
  143606. + }
  143607. +
  143608. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  143609. + return;
  143610. +
  143611. +#ifdef CONFIG_P2P
  143612. + if(pwdinfo->driver_interface == DRIVER_CFG80211 )
  143613. + {
  143614. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  143615. + {
  143616. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  143617. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
  143618. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  143619. + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
  143620. + }
  143621. + }
  143622. +#endif //CONFIG_P2P
  143623. +
  143624. + #ifdef CONFIG_LAYER2_ROAMING
  143625. + if (rtw_to_roaming(padapter) > 0) {
  143626. + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE)
  143627. + struct wiphy *wiphy = pwdev->wiphy;
  143628. + struct ieee80211_channel *notify_channel;
  143629. + u32 freq;
  143630. + u16 channel = cur_network->network.Configuration.DSConfig;
  143631. +
  143632. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  143633. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  143634. + else
  143635. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  143636. +
  143637. + notify_channel = ieee80211_get_channel(wiphy, freq);
  143638. + #endif
  143639. +
  143640. + DBG_871X("%s call cfg80211_roamed\n", __FUNCTION__);
  143641. + cfg80211_roamed(padapter->pnetdev
  143642. + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE)
  143643. + , notify_channel
  143644. + #endif
  143645. + , cur_network->network.MacAddress
  143646. + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2
  143647. + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2
  143648. + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6
  143649. + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6
  143650. + , GFP_ATOMIC);
  143651. + }
  143652. + else
  143653. + #endif
  143654. + {
  143655. + DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);
  143656. + cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress
  143657. + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2
  143658. + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2
  143659. + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6
  143660. + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6
  143661. + , WLAN_STATUS_SUCCESS, GFP_ATOMIC);
  143662. + DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state);
  143663. + }
  143664. +}
  143665. +
  143666. +void rtw_cfg80211_indicate_disconnect(_adapter *padapter)
  143667. +{
  143668. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  143669. + struct wireless_dev *pwdev = padapter->rtw_wdev;
  143670. +#ifdef CONFIG_P2P
  143671. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  143672. +#endif
  143673. +
  143674. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  143675. +
  143676. + if (pwdev->iftype != NL80211_IFTYPE_STATION
  143677. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  143678. + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT
  143679. + #endif
  143680. + ) {
  143681. + return;
  143682. + }
  143683. +
  143684. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  143685. + return;
  143686. +
  143687. +#ifdef CONFIG_P2P
  143688. + if( pwdinfo->driver_interface == DRIVER_CFG80211 )
  143689. + {
  143690. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  143691. + {
  143692. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  143693. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  143694. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  143695. +
  143696. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  143697. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  143698. +
  143699. + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
  143700. + }
  143701. + }
  143702. +#endif //CONFIG_P2P
  143703. +
  143704. + if (!padapter->mlmepriv.not_indic_disco) {
  143705. + DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);
  143706. +
  143707. + if(pwdev->sme_state==CFG80211_SME_CONNECTING)
  143708. + cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0,
  143709. + WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/);
  143710. + else if(pwdev->sme_state==CFG80211_SME_CONNECTED)
  143711. + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);
  143712. + //else
  143713. + //DBG_8192C("pwdev->sme_state=%d\n", pwdev->sme_state);
  143714. +
  143715. + DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state);
  143716. + }
  143717. +}
  143718. +
  143719. +
  143720. +#ifdef CONFIG_AP_MODE
  143721. +static u8 set_pairwise_key(_adapter *padapter, struct sta_info *psta)
  143722. +{
  143723. + struct cmd_obj* ph2c;
  143724. + struct set_stakey_parm *psetstakey_para;
  143725. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  143726. + u8 res=_SUCCESS;
  143727. +
  143728. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  143729. + if ( ph2c == NULL){
  143730. + res= _FAIL;
  143731. + goto exit;
  143732. + }
  143733. +
  143734. + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
  143735. + if(psetstakey_para==NULL){
  143736. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  143737. + res=_FAIL;
  143738. + goto exit;
  143739. + }
  143740. +
  143741. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
  143742. +
  143743. +
  143744. + psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy;
  143745. +
  143746. + _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN);
  143747. +
  143748. + _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16);
  143749. +
  143750. +
  143751. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  143752. +
  143753. +exit:
  143754. +
  143755. + return res;
  143756. +
  143757. +}
  143758. +
  143759. +static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid)
  143760. +{
  143761. + u8 keylen;
  143762. + struct cmd_obj* pcmd;
  143763. + struct setkey_parm *psetkeyparm;
  143764. + struct cmd_priv *pcmdpriv=&(padapter->cmdpriv);
  143765. + int res=_SUCCESS;
  143766. +
  143767. + DBG_8192C("%s\n", __FUNCTION__);
  143768. +
  143769. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  143770. + if(pcmd==NULL){
  143771. + res= _FAIL;
  143772. + goto exit;
  143773. + }
  143774. + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));
  143775. + if(psetkeyparm==NULL){
  143776. + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
  143777. + res= _FAIL;
  143778. + goto exit;
  143779. + }
  143780. +
  143781. + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));
  143782. +
  143783. + psetkeyparm->keyid=(u8)keyid;
  143784. + if (is_wep_enc(alg))
  143785. + padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid);
  143786. +
  143787. + psetkeyparm->algorithm = alg;
  143788. +
  143789. + psetkeyparm->set_tx = 1;
  143790. +
  143791. + switch(alg)
  143792. + {
  143793. + case _WEP40_:
  143794. + keylen = 5;
  143795. + break;
  143796. + case _WEP104_:
  143797. + keylen = 13;
  143798. + break;
  143799. + case _TKIP_:
  143800. + case _TKIP_WTMIC_:
  143801. + case _AES_:
  143802. + keylen = 16;
  143803. + default:
  143804. + keylen = 16;
  143805. + }
  143806. +
  143807. + _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen);
  143808. +
  143809. + pcmd->cmdcode = _SetKey_CMD_;
  143810. + pcmd->parmbuf = (u8 *)psetkeyparm;
  143811. + pcmd->cmdsz = (sizeof(struct setkey_parm));
  143812. + pcmd->rsp = NULL;
  143813. + pcmd->rspsz = 0;
  143814. +
  143815. +
  143816. + _rtw_init_listhead(&pcmd->list);
  143817. +
  143818. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  143819. +
  143820. +exit:
  143821. +
  143822. + return res;
  143823. +
  143824. +
  143825. +}
  143826. +
  143827. +static int set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid)
  143828. +{
  143829. + u8 alg;
  143830. +
  143831. + switch(keylen)
  143832. + {
  143833. + case 5:
  143834. + alg =_WEP40_;
  143835. + break;
  143836. + case 13:
  143837. + alg =_WEP104_;
  143838. + break;
  143839. + default:
  143840. + alg =_NO_PRIVACY_;
  143841. + }
  143842. +
  143843. + return set_group_key(padapter, key, alg, keyid);
  143844. +
  143845. +}
  143846. +
  143847. +static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)
  143848. +{
  143849. + int ret = 0;
  143850. + u32 wep_key_idx, wep_key_len,wep_total_len;
  143851. + struct sta_info *psta = NULL, *pbcmc_sta = NULL;
  143852. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  143853. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  143854. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  143855. + struct sta_priv *pstapriv = &padapter->stapriv;
  143856. +
  143857. + DBG_8192C("%s\n", __FUNCTION__);
  143858. +
  143859. + param->u.crypt.err = 0;
  143860. + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
  143861. +
  143862. + //sizeof(struct ieee_param) = 64 bytes;
  143863. + //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)
  143864. + if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len)
  143865. + {
  143866. + ret = -EINVAL;
  143867. + goto exit;
  143868. + }
  143869. +
  143870. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  143871. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  143872. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  143873. + {
  143874. + if (param->u.crypt.idx >= WEP_KEYS)
  143875. + {
  143876. + ret = -EINVAL;
  143877. + goto exit;
  143878. + }
  143879. + }
  143880. + else
  143881. + {
  143882. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  143883. + if(!psta)
  143884. + {
  143885. + //ret = -EINVAL;
  143886. + DBG_8192C("rtw_set_encryption(), sta has already been removed or never been added\n");
  143887. + goto exit;
  143888. + }
  143889. + }
  143890. +
  143891. + if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL))
  143892. + {
  143893. + //todo:clear default encryption keys
  143894. +
  143895. + DBG_8192C("clear default encryption keys, keyid=%d\n", param->u.crypt.idx);
  143896. +
  143897. + goto exit;
  143898. + }
  143899. +
  143900. +
  143901. + if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL))
  143902. + {
  143903. + DBG_8192C("r871x_set_encryption, crypt.alg = WEP\n");
  143904. +
  143905. + wep_key_idx = param->u.crypt.idx;
  143906. + wep_key_len = param->u.crypt.key_len;
  143907. +
  143908. + DBG_8192C("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len);
  143909. +
  143910. + if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0))
  143911. + {
  143912. + ret = -EINVAL;
  143913. + goto exit;
  143914. + }
  143915. +
  143916. + if (wep_key_len > 0)
  143917. + {
  143918. + wep_key_len = wep_key_len <= 5 ? 5 : 13;
  143919. + }
  143920. +
  143921. + if (psecuritypriv->bWepDefaultKeyIdxSet == 0)
  143922. + {
  143923. + //wep default key has not been set, so use this key index as default key.
  143924. +
  143925. + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
  143926. + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_;
  143927. + psecuritypriv->dot118021XGrpPrivacy=_WEP40_;
  143928. +
  143929. + if(wep_key_len == 13)
  143930. + {
  143931. + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_;
  143932. + psecuritypriv->dot118021XGrpPrivacy=_WEP104_;
  143933. + }
  143934. +
  143935. + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
  143936. + }
  143937. +
  143938. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);
  143939. +
  143940. + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
  143941. +
  143942. + set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx);
  143943. +
  143944. + goto exit;
  143945. +
  143946. + }
  143947. +
  143948. +
  143949. + if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key
  143950. + {
  143951. + if(param->u.crypt.set_tx == 0) //group key
  143952. + {
  143953. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  143954. + {
  143955. + DBG_8192C("%s, set group_key, WEP\n", __FUNCTION__);
  143956. +
  143957. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  143958. +
  143959. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  143960. + if(param->u.crypt.key_len==13)
  143961. + {
  143962. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  143963. + }
  143964. +
  143965. + }
  143966. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  143967. + {
  143968. + DBG_8192C("%s, set group_key, TKIP\n", __FUNCTION__);
  143969. +
  143970. + psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
  143971. +
  143972. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  143973. +
  143974. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  143975. + //set mic key
  143976. + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
  143977. + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
  143978. +
  143979. + psecuritypriv->busetkipkey = _TRUE;
  143980. +
  143981. + }
  143982. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  143983. + {
  143984. + DBG_8192C("%s, set group_key, CCMP\n", __FUNCTION__);
  143985. +
  143986. + psecuritypriv->dot118021XGrpPrivacy = _AES_;
  143987. +
  143988. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  143989. + }
  143990. + else
  143991. + {
  143992. + DBG_8192C("%s, set group_key, none\n", __FUNCTION__);
  143993. +
  143994. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  143995. + }
  143996. +
  143997. + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
  143998. +
  143999. + psecuritypriv->binstallGrpkey = _TRUE;
  144000. +
  144001. + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!
  144002. +
  144003. + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);
  144004. +
  144005. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  144006. + if(pbcmc_sta)
  144007. + {
  144008. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  144009. + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy
  144010. + }
  144011. +
  144012. + }
  144013. +
  144014. + goto exit;
  144015. +
  144016. + }
  144017. +
  144018. + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x
  144019. + {
  144020. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE))
  144021. + {
  144022. + if(param->u.crypt.set_tx ==1) //pairwise key
  144023. + {
  144024. + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144025. +
  144026. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  144027. + {
  144028. + DBG_8192C("%s, set pairwise key, WEP\n", __FUNCTION__);
  144029. +
  144030. + psta->dot118021XPrivacy = _WEP40_;
  144031. + if(param->u.crypt.key_len==13)
  144032. + {
  144033. + psta->dot118021XPrivacy = _WEP104_;
  144034. + }
  144035. + }
  144036. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  144037. + {
  144038. + DBG_8192C("%s, set pairwise key, TKIP\n", __FUNCTION__);
  144039. +
  144040. + psta->dot118021XPrivacy = _TKIP_;
  144041. +
  144042. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  144043. + //set mic key
  144044. + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);
  144045. + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);
  144046. +
  144047. + psecuritypriv->busetkipkey = _TRUE;
  144048. +
  144049. + }
  144050. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  144051. + {
  144052. +
  144053. + DBG_8192C("%s, set pairwise key, CCMP\n", __FUNCTION__);
  144054. +
  144055. + psta->dot118021XPrivacy = _AES_;
  144056. + }
  144057. + else
  144058. + {
  144059. + DBG_8192C("%s, set pairwise key, none\n", __FUNCTION__);
  144060. +
  144061. + psta->dot118021XPrivacy = _NO_PRIVACY_;
  144062. + }
  144063. +
  144064. + set_pairwise_key(padapter, psta);
  144065. +
  144066. + psta->ieee8021x_blocked = _FALSE;
  144067. +
  144068. + psta->bpairwise_key_installed = _TRUE;
  144069. +
  144070. + }
  144071. + else//group key???
  144072. + {
  144073. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  144074. + {
  144075. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144076. +
  144077. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  144078. + if(param->u.crypt.key_len==13)
  144079. + {
  144080. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  144081. + }
  144082. + }
  144083. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  144084. + {
  144085. + psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
  144086. +
  144087. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144088. +
  144089. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  144090. + //set mic key
  144091. + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
  144092. + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
  144093. +
  144094. + psecuritypriv->busetkipkey = _TRUE;
  144095. +
  144096. + }
  144097. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  144098. + {
  144099. + psecuritypriv->dot118021XGrpPrivacy = _AES_;
  144100. +
  144101. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144102. + }
  144103. + else
  144104. + {
  144105. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  144106. + }
  144107. +
  144108. + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
  144109. +
  144110. + psecuritypriv->binstallGrpkey = _TRUE;
  144111. +
  144112. + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!
  144113. +
  144114. + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);
  144115. +
  144116. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  144117. + if(pbcmc_sta)
  144118. + {
  144119. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  144120. + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy
  144121. + }
  144122. +
  144123. + }
  144124. +
  144125. + }
  144126. +
  144127. + }
  144128. +
  144129. +exit:
  144130. +
  144131. + return ret;
  144132. +
  144133. +}
  144134. +#endif
  144135. +
  144136. +static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)
  144137. +{
  144138. + int ret = 0;
  144139. + u32 wep_key_idx, wep_key_len,wep_total_len;
  144140. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  144141. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  144142. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  144143. +#ifdef CONFIG_P2P
  144144. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  144145. +#endif //CONFIG_P2P
  144146. +
  144147. +_func_enter_;
  144148. +
  144149. + DBG_8192C("%s\n", __func__);
  144150. +
  144151. + param->u.crypt.err = 0;
  144152. + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
  144153. +
  144154. + if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)
  144155. + {
  144156. + ret = -EINVAL;
  144157. + goto exit;
  144158. + }
  144159. +
  144160. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  144161. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  144162. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  144163. + {
  144164. + if (param->u.crypt.idx >= WEP_KEYS
  144165. +#ifdef CONFIG_IEEE80211W
  144166. + && param->u.crypt.idx > BIP_MAX_KEYID
  144167. +#endif //CONFIG_IEEE80211W
  144168. + )
  144169. + {
  144170. + ret = -EINVAL;
  144171. + goto exit;
  144172. + }
  144173. + } else {
  144174. + ret = -EINVAL;
  144175. + goto exit;
  144176. + }
  144177. +
  144178. + if (strcmp(param->u.crypt.alg, "WEP") == 0)
  144179. + {
  144180. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n"));
  144181. + DBG_8192C("wpa_set_encryption, crypt.alg = WEP\n");
  144182. +
  144183. + wep_key_idx = param->u.crypt.idx;
  144184. + wep_key_len = param->u.crypt.key_len;
  144185. +
  144186. + if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0))
  144187. + {
  144188. + ret = -EINVAL;
  144189. + goto exit;
  144190. + }
  144191. +
  144192. + if (psecuritypriv->bWepDefaultKeyIdxSet == 0)
  144193. + {
  144194. + //wep default key has not been set, so use this key index as default key.
  144195. +
  144196. + wep_key_len = wep_key_len <= 5 ? 5 : 13;
  144197. +
  144198. + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
  144199. + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
  144200. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  144201. +
  144202. + if(wep_key_len==13)
  144203. + {
  144204. + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
  144205. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  144206. + }
  144207. +
  144208. + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
  144209. + }
  144210. +
  144211. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);
  144212. +
  144213. + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
  144214. +
  144215. + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0);
  144216. +
  144217. + goto exit;
  144218. + }
  144219. +
  144220. + if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x
  144221. + {
  144222. + struct sta_info * psta,*pbcmc_sta;
  144223. + struct sta_priv * pstapriv = &padapter->stapriv;
  144224. +
  144225. + //DBG_8192C("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \n", __func__);
  144226. +
  144227. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode
  144228. + {
  144229. + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  144230. + if (psta == NULL) {
  144231. + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n"));
  144232. + DBG_8192C("%s, : Obtain Sta_info fail \n", __func__);
  144233. + }
  144234. + else
  144235. + {
  144236. + //Jeff: don't disable ieee8021x_blocked while clearing key
  144237. + if (strcmp(param->u.crypt.alg, "none") != 0)
  144238. + psta->ieee8021x_blocked = _FALSE;
  144239. +
  144240. +
  144241. + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||
  144242. + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled))
  144243. + {
  144244. + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;
  144245. + }
  144246. +
  144247. + if(param->u.crypt.set_tx ==1)//pairwise key
  144248. + {
  144249. +
  144250. + DBG_8192C("%s, : param->u.crypt.set_tx ==1 \n", __func__);
  144251. +
  144252. + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144253. +
  144254. + if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key
  144255. + {
  144256. + //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len));
  144257. + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);
  144258. + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);
  144259. +
  144260. + padapter->securitypriv.busetkipkey=_FALSE;
  144261. + //_set_timer(&padapter->securitypriv.tkip_timer, 50);
  144262. + }
  144263. +
  144264. + //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
  144265. + DBG_871X(" ~~~~set sta key:unicastkey\n");
  144266. +
  144267. + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE);
  144268. + }
  144269. + else//group key
  144270. + {
  144271. + if(strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0)
  144272. + {
  144273. + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144274. + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8);
  144275. + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8);
  144276. + padapter->securitypriv.binstallGrpkey = _TRUE;
  144277. + //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len));
  144278. + DBG_871X(" ~~~~set sta key:groupkey\n");
  144279. +
  144280. + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;
  144281. +
  144282. + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1);
  144283. + }
  144284. +#ifdef CONFIG_IEEE80211W
  144285. + else if(strcmp(param->u.crypt.alg, "BIP") == 0)
  144286. + {
  144287. + int no;
  144288. + //DBG_871X("BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\n", param->u.crypt.key_len, param->u.crypt.idx);
  144289. + //save the IGTK key, length 16 bytes
  144290. + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  144291. + /*DBG_871X("IGTK key below:\n");
  144292. + for(no=0;no<16;no++)
  144293. + printk(" %02x ", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);
  144294. + DBG_871X("\n");*/
  144295. + padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;
  144296. + padapter->securitypriv.binstallBIPkey = _TRUE;
  144297. + DBG_871X(" ~~~~set sta key:IGKT\n");
  144298. + }
  144299. +#endif //CONFIG_IEEE80211W
  144300. +
  144301. +#ifdef CONFIG_P2P
  144302. + if(pwdinfo->driver_interface == DRIVER_CFG80211 )
  144303. + {
  144304. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
  144305. + {
  144306. + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE);
  144307. + }
  144308. + }
  144309. +#endif //CONFIG_P2P
  144310. +
  144311. + }
  144312. + }
  144313. +
  144314. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  144315. + if(pbcmc_sta==NULL)
  144316. + {
  144317. + //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n"));
  144318. + }
  144319. + else
  144320. + {
  144321. + //Jeff: don't disable ieee8021x_blocked while clearing key
  144322. + if (strcmp(param->u.crypt.alg, "none") != 0)
  144323. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  144324. +
  144325. + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||
  144326. + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled))
  144327. + {
  144328. + pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;
  144329. + }
  144330. + }
  144331. + }
  144332. + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode
  144333. + {
  144334. + }
  144335. + }
  144336. +
  144337. +exit:
  144338. +
  144339. + DBG_8192C("%s, ret=%d\n", __func__, ret);
  144340. +
  144341. + _func_exit_;
  144342. +
  144343. + return ret;
  144344. +}
  144345. +
  144346. +static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
  144347. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  144348. + u8 key_index, bool pairwise, const u8 *mac_addr,
  144349. +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144350. + u8 key_index, const u8 *mac_addr,
  144351. +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144352. + struct key_params *params)
  144353. +{
  144354. + char *alg_name;
  144355. + u32 param_len;
  144356. + struct ieee_param *param = NULL;
  144357. + int ret=0;
  144358. + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
  144359. + _adapter *padapter = wiphy_to_adapter(wiphy);
  144360. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  144361. +
  144362. + DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr);
  144363. + DBG_871X("cipher=0x%x\n", params->cipher);
  144364. + DBG_871X("key_len=0x%x\n", params->key_len);
  144365. + DBG_871X("seq_len=0x%x\n", params->seq_len);
  144366. + DBG_871X("key_index=%d\n", key_index);
  144367. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  144368. + DBG_871X("pairwise=%d\n", pairwise);
  144369. +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144370. +
  144371. + param_len = sizeof(struct ieee_param) + params->key_len;
  144372. + param = (struct ieee_param *)rtw_malloc(param_len);
  144373. + if (param == NULL)
  144374. + return -1;
  144375. +
  144376. + _rtw_memset(param, 0, param_len);
  144377. +
  144378. + param->cmd = IEEE_CMD_SET_ENCRYPTION;
  144379. + _rtw_memset(param->sta_addr, 0xff, ETH_ALEN);
  144380. +
  144381. + switch (params->cipher) {
  144382. + case IW_AUTH_CIPHER_NONE:
  144383. + //todo: remove key
  144384. + //remove = 1;
  144385. + alg_name = "none";
  144386. + break;
  144387. + case WLAN_CIPHER_SUITE_WEP40:
  144388. + case WLAN_CIPHER_SUITE_WEP104:
  144389. + alg_name = "WEP";
  144390. + break;
  144391. + case WLAN_CIPHER_SUITE_TKIP:
  144392. + alg_name = "TKIP";
  144393. + break;
  144394. + case WLAN_CIPHER_SUITE_CCMP:
  144395. + alg_name = "CCMP";
  144396. + break;
  144397. +#ifdef CONFIG_IEEE80211W
  144398. + case WLAN_CIPHER_SUITE_AES_CMAC:
  144399. + alg_name = "BIP";
  144400. + break;
  144401. +#endif //CONFIG_IEEE80211W
  144402. + default:
  144403. + return -ENOTSUPP;
  144404. + }
  144405. +
  144406. + strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);
  144407. +
  144408. +
  144409. + if (!mac_addr || is_broadcast_ether_addr(mac_addr))
  144410. + {
  144411. + param->u.crypt.set_tx = 0; //for wpa/wpa2 group key
  144412. + } else {
  144413. + param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key
  144414. + }
  144415. +
  144416. +
  144417. + //param->u.crypt.idx = key_index - 1;
  144418. + param->u.crypt.idx = key_index;
  144419. +
  144420. + if (params->seq_len && params->seq)
  144421. + {
  144422. + _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len);
  144423. + }
  144424. +
  144425. + if(params->key_len && params->key)
  144426. + {
  144427. + param->u.crypt.key_len = params->key_len;
  144428. + _rtw_memcpy(param->u.crypt.key, params->key, params->key_len);
  144429. + }
  144430. +
  144431. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  144432. + {
  144433. + ret = rtw_cfg80211_set_encryption(ndev, param, param_len);
  144434. + }
  144435. + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  144436. + {
  144437. +#ifdef CONFIG_AP_MODE
  144438. + if(mac_addr)
  144439. + _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN);
  144440. +
  144441. + ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);
  144442. +#endif
  144443. + }
  144444. + else
  144445. + {
  144446. + DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);
  144447. +
  144448. + }
  144449. +
  144450. + if(param)
  144451. + {
  144452. + rtw_mfree((u8*)param, param_len);
  144453. + }
  144454. +
  144455. + return ret;
  144456. +
  144457. +}
  144458. +
  144459. +static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
  144460. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  144461. + u8 key_index, bool pairwise, const u8 *mac_addr,
  144462. +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144463. + u8 key_index, const u8 *mac_addr,
  144464. +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144465. + void *cookie,
  144466. + void (*callback)(void *cookie,
  144467. + struct key_params*))
  144468. +{
  144469. +#if 0
  144470. + struct iwm_priv *iwm = ndev_to_iwm(ndev);
  144471. + struct iwm_key *key = &iwm->keys[key_index];
  144472. + struct key_params params;
  144473. +
  144474. + IWM_DBG_WEXT(iwm, DBG, "Getting key %d\n", key_index);
  144475. +
  144476. + memset(&params, 0, sizeof(params));
  144477. +
  144478. + params.cipher = key->cipher;
  144479. + params.key_len = key->key_len;
  144480. + params.seq_len = key->seq_len;
  144481. + params.seq = key->seq;
  144482. + params.key = key->key;
  144483. +
  144484. + callback(cookie, &params);
  144485. +
  144486. + return key->key_len ? 0 : -ENOENT;
  144487. +#endif
  144488. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  144489. + return 0;
  144490. +}
  144491. +
  144492. +static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
  144493. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  144494. + u8 key_index, bool pairwise, const u8 *mac_addr)
  144495. +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144496. + u8 key_index, const u8 *mac_addr)
  144497. +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  144498. +{
  144499. + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  144500. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  144501. +
  144502. + DBG_871X(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index);
  144503. +
  144504. + if (key_index == psecuritypriv->dot11PrivacyKeyIndex)
  144505. + {
  144506. + //clear the flag of wep default key set.
  144507. + psecuritypriv->bWepDefaultKeyIdxSet = 0;
  144508. + }
  144509. +
  144510. + return 0;
  144511. +}
  144512. +
  144513. +static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
  144514. + struct net_device *ndev, u8 key_index
  144515. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  144516. + , bool unicast, bool multicast
  144517. + #endif
  144518. + )
  144519. +{
  144520. + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  144521. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  144522. +
  144523. + DBG_871X(FUNC_NDEV_FMT" key_index=%d"
  144524. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  144525. + ", unicast=%d, multicast=%d"
  144526. + #endif
  144527. + ".\n", FUNC_NDEV_ARG(ndev), key_index
  144528. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  144529. + , unicast, multicast
  144530. + #endif
  144531. + );
  144532. +
  144533. + if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key
  144534. + {
  144535. + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
  144536. +
  144537. + psecuritypriv->dot11PrivacyKeyIndex = key_index;
  144538. +
  144539. + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
  144540. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  144541. + if (psecuritypriv->dot11DefKeylen[key_index] == 13)
  144542. + {
  144543. + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
  144544. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  144545. + }
  144546. +
  144547. + psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set
  144548. + }
  144549. +
  144550. + return 0;
  144551. +
  144552. +}
  144553. +
  144554. +static int cfg80211_rtw_get_station(struct wiphy *wiphy,
  144555. + struct net_device *ndev,
  144556. + u8 *mac, struct station_info *sinfo)
  144557. +{
  144558. + int ret = 0;
  144559. + _adapter *padapter = wiphy_to_adapter(wiphy);
  144560. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  144561. + struct sta_info *psta = NULL;
  144562. + struct sta_priv *pstapriv = &padapter->stapriv;
  144563. +
  144564. + sinfo->filled = 0;
  144565. +
  144566. + if (!mac) {
  144567. + DBG_871X(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac);
  144568. + ret = -ENOENT;
  144569. + goto exit;
  144570. + }
  144571. +
  144572. + psta = rtw_get_stainfo(pstapriv, mac);
  144573. + if (psta == NULL) {
  144574. + DBG_8192C("%s, sta_info is null\n", __func__);
  144575. + ret = -ENOENT;
  144576. + goto exit;
  144577. + }
  144578. +
  144579. +#ifdef CONFIG_DEBUG_CFG80211
  144580. + DBG_871X(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac));
  144581. +#endif
  144582. +
  144583. + //for infra./P2PClient mode
  144584. + if( check_fwstate(pmlmepriv, WIFI_STATION_STATE)
  144585. + && check_fwstate(pmlmepriv, _FW_LINKED)
  144586. + )
  144587. + {
  144588. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  144589. +
  144590. + if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) {
  144591. + DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress));
  144592. + ret = -ENOENT;
  144593. + goto exit;
  144594. + }
  144595. +
  144596. + sinfo->filled |= STATION_INFO_SIGNAL;
  144597. + sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);
  144598. +
  144599. + sinfo->filled |= STATION_INFO_TX_BITRATE;
  144600. + sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter);
  144601. +
  144602. + sinfo->filled |= STATION_INFO_RX_PACKETS;
  144603. + sinfo->rx_packets = sta_rx_data_pkts(psta);
  144604. +
  144605. + sinfo->filled |= STATION_INFO_TX_PACKETS;
  144606. + sinfo->tx_packets = psta->sta_stats.tx_pkts;
  144607. +
  144608. + }
  144609. +
  144610. + //for Ad-Hoc/AP mode
  144611. + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)
  144612. + ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)
  144613. + ||check_fwstate(pmlmepriv, WIFI_AP_STATE))
  144614. + && check_fwstate(pmlmepriv, _FW_LINKED)
  144615. + )
  144616. + {
  144617. + //TODO: should acquire station info...
  144618. + }
  144619. +
  144620. +exit:
  144621. + return ret;
  144622. +}
  144623. +
  144624. +extern int netdev_open(struct net_device *pnetdev);
  144625. +#ifdef CONFIG_CONCURRENT_MODE
  144626. +extern int netdev_if2_open(struct net_device *pnetdev);
  144627. +#endif
  144628. +
  144629. +/*
  144630. +enum nl80211_iftype {
  144631. + NL80211_IFTYPE_UNSPECIFIED,
  144632. + NL80211_IFTYPE_ADHOC, //1
  144633. + NL80211_IFTYPE_STATION, //2
  144634. + NL80211_IFTYPE_AP, //3
  144635. + NL80211_IFTYPE_AP_VLAN,
  144636. + NL80211_IFTYPE_WDS,
  144637. + NL80211_IFTYPE_MONITOR, //6
  144638. + NL80211_IFTYPE_MESH_POINT,
  144639. + NL80211_IFTYPE_P2P_CLIENT, //8
  144640. + NL80211_IFTYPE_P2P_GO, //9
  144641. + //keep last
  144642. + NUM_NL80211_IFTYPES,
  144643. + NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
  144644. +};
  144645. +*/
  144646. +static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
  144647. + struct net_device *ndev,
  144648. + enum nl80211_iftype type, u32 *flags,
  144649. + struct vif_params *params)
  144650. +{
  144651. + enum nl80211_iftype old_type;
  144652. + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ;
  144653. + _adapter *padapter = wiphy_to_adapter(wiphy);
  144654. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  144655. + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
  144656. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  144657. + _irqL irqL;
  144658. + _queue *queue = &pmlmepriv->scanned_queue;
  144659. +#ifdef CONFIG_P2P
  144660. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  144661. +#endif
  144662. + int ret = 0;
  144663. + u8 change = _FALSE;
  144664. +
  144665. + if (adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE) {
  144666. + ret= -EPERM;
  144667. + goto exit;
  144668. + }
  144669. +
  144670. +#ifdef CONFIG_CONCURRENT_MODE
  144671. + if(padapter->adapter_type == SECONDARY_ADAPTER)
  144672. + {
  144673. + DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev));
  144674. + if(netdev_if2_open(ndev) != 0) {
  144675. + ret= -EPERM;
  144676. + goto exit;
  144677. + }
  144678. + }
  144679. + else if(padapter->adapter_type == PRIMARY_ADAPTER)
  144680. +#endif //CONFIG_CONCURRENT_MODE
  144681. + {
  144682. + DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev));
  144683. + if(netdev_open(ndev) != 0) {
  144684. + ret= -EPERM;
  144685. + goto exit;
  144686. + }
  144687. + }
  144688. +
  144689. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  144690. + ret= -EPERM;
  144691. + goto exit;
  144692. + }
  144693. +
  144694. + old_type = rtw_wdev->iftype;
  144695. + DBG_871X(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n",
  144696. + FUNC_NDEV_ARG(ndev), old_type, type);
  144697. +
  144698. + if(old_type != type)
  144699. + {
  144700. + change = _TRUE;
  144701. + pmlmeext->action_public_rxseq = 0xffff;
  144702. + pmlmeext->action_public_dialog_token = 0xff;
  144703. + }
  144704. +
  144705. + switch (type) {
  144706. + case NL80211_IFTYPE_ADHOC:
  144707. + networkType = Ndis802_11IBSS;
  144708. + break;
  144709. +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))
  144710. + case NL80211_IFTYPE_P2P_CLIENT:
  144711. +#endif
  144712. + case NL80211_IFTYPE_STATION:
  144713. + networkType = Ndis802_11Infrastructure;
  144714. + #ifdef CONFIG_P2P
  144715. + if(pwdinfo->driver_interface == DRIVER_CFG80211 )
  144716. + {
  144717. + if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  144718. + {
  144719. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  144720. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  144721. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  144722. +
  144723. + //it means remove GO and change mode from AP(GO) to station(P2P DEVICE)
  144724. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
  144725. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  144726. +
  144727. + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
  144728. + }
  144729. + }
  144730. + #endif //CONFIG_P2P
  144731. + break;
  144732. +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))
  144733. + case NL80211_IFTYPE_P2P_GO:
  144734. +#endif
  144735. + case NL80211_IFTYPE_AP:
  144736. + networkType = Ndis802_11APMode;
  144737. + #ifdef CONFIG_P2P
  144738. + if(pwdinfo->driver_interface == DRIVER_CFG80211 )
  144739. + {
  144740. + if(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  144741. + {
  144742. + //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO)
  144743. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  144744. + }
  144745. + }
  144746. + #endif //CONFIG_P2P
  144747. + break;
  144748. + default:
  144749. + return -EOPNOTSUPP;
  144750. + }
  144751. +
  144752. + rtw_wdev->iftype = type;
  144753. +
  144754. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  144755. + _enter_critical_bh(&queue->lock, &irqL);
  144756. +
  144757. + if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE)
  144758. + {
  144759. + rtw_wdev->iftype = old_type;
  144760. + ret = -EPERM;
  144761. + _exit_critical_bh(&queue->lock, &irqL);
  144762. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  144763. + goto exit;
  144764. + }
  144765. + _exit_critical_bh(&queue->lock, &irqL);
  144766. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  144767. +
  144768. + rtw_setopmode_cmd(padapter, networkType);
  144769. +
  144770. +exit:
  144771. +
  144772. + return ret;
  144773. +}
  144774. +
  144775. +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted)
  144776. +{
  144777. + _irqL irqL;
  144778. +
  144779. + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  144780. + if(pwdev_priv->scan_request != NULL)
  144781. + {
  144782. + //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request;
  144783. +
  144784. + #ifdef CONFIG_DEBUG_CFG80211
  144785. + DBG_871X("%s with scan req\n", __FUNCTION__);
  144786. + #endif
  144787. +
  144788. + //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req);
  144789. + //if(scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req)
  144790. + if(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy)
  144791. + {
  144792. + DBG_8192C("error wiphy compare\n");
  144793. + }
  144794. + else
  144795. + {
  144796. + cfg80211_scan_done(pwdev_priv->scan_request, aborted);
  144797. + }
  144798. +
  144799. + pwdev_priv->scan_request = NULL;
  144800. +
  144801. + } else {
  144802. + #ifdef CONFIG_DEBUG_CFG80211
  144803. + DBG_871X("%s without scan req\n", __FUNCTION__);
  144804. + #endif
  144805. + }
  144806. + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  144807. +}
  144808. +
  144809. +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter)
  144810. +{
  144811. + _irqL irqL;
  144812. + _list *plist, *phead;
  144813. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  144814. + _queue *queue = &(pmlmepriv->scanned_queue);
  144815. + struct wlan_network *pnetwork = NULL;
  144816. + u32 cnt=0;
  144817. + u32 wait_for_surveydone;
  144818. + sint wait_status;
  144819. +#ifdef CONFIG_P2P
  144820. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  144821. +#endif //CONFIG_P2P
  144822. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  144823. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  144824. +
  144825. +#ifdef CONFIG_DEBUG_CFG80211
  144826. + DBG_8192C("%s\n", __func__);
  144827. +#endif
  144828. +
  144829. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  144830. +
  144831. + phead = get_list_head(queue);
  144832. + plist = get_next(phead);
  144833. +
  144834. + while(1)
  144835. + {
  144836. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  144837. + break;
  144838. +
  144839. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  144840. +
  144841. + //report network only if the current channel set contains the channel to which this network belongs
  144842. + if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0
  144843. + && rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE
  144844. + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))
  144845. + )
  144846. + {
  144847. + //ev=translate_scan(padapter, a, pnetwork, ev, stop);
  144848. + rtw_cfg80211_inform_bss(padapter, pnetwork);
  144849. + }
  144850. +
  144851. + plist = get_next(plist);
  144852. +
  144853. + }
  144854. +
  144855. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  144856. +
  144857. + //call this after other things have been done
  144858. + rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), _FALSE);
  144859. +}
  144860. +
  144861. +static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len)
  144862. +{
  144863. + int ret = 0;
  144864. + uint wps_ielen = 0;
  144865. + u8 *wps_ie;
  144866. + u32 p2p_ielen = 0;
  144867. + u8 *p2p_ie;
  144868. + u32 wfd_ielen = 0;
  144869. + u8 *wfd_ie;
  144870. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  144871. +
  144872. +#ifdef CONFIG_DEBUG_CFG80211
  144873. + DBG_8192C("%s, ielen=%d\n", __func__, len);
  144874. +#endif
  144875. +
  144876. + if(len>0)
  144877. + {
  144878. + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))
  144879. + {
  144880. + #ifdef CONFIG_DEBUG_CFG80211
  144881. + DBG_8192C("probe_req_wps_ielen=%d\n", wps_ielen);
  144882. + #endif
  144883. +
  144884. + if(pmlmepriv->wps_probe_req_ie)
  144885. + {
  144886. + u32 free_len = pmlmepriv->wps_probe_req_ie_len;
  144887. + pmlmepriv->wps_probe_req_ie_len = 0;
  144888. + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);
  144889. + pmlmepriv->wps_probe_req_ie = NULL;
  144890. + }
  144891. +
  144892. + pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen);
  144893. + if ( pmlmepriv->wps_probe_req_ie == NULL) {
  144894. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  144895. + return -EINVAL;
  144896. +
  144897. + }
  144898. + _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen);
  144899. + pmlmepriv->wps_probe_req_ie_len = wps_ielen;
  144900. + }
  144901. +
  144902. + //buf += wps_ielen;
  144903. + //len -= wps_ielen;
  144904. +
  144905. + #ifdef CONFIG_P2P
  144906. + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen)))
  144907. + {
  144908. + struct wifidirect_info *wdinfo = &padapter->wdinfo;
  144909. + u32 attr_contentlen = 0;
  144910. + u8 listen_ch_attr[5];
  144911. +
  144912. + #ifdef CONFIG_DEBUG_CFG80211
  144913. + DBG_8192C("probe_req_p2p_ielen=%d\n", p2p_ielen);
  144914. + #endif
  144915. +
  144916. + if(pmlmepriv->p2p_probe_req_ie)
  144917. + {
  144918. + u32 free_len = pmlmepriv->p2p_probe_req_ie_len;
  144919. + pmlmepriv->p2p_probe_req_ie_len = 0;
  144920. + rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len);
  144921. + pmlmepriv->p2p_probe_req_ie = NULL;
  144922. + }
  144923. +
  144924. + pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen);
  144925. + if ( pmlmepriv->p2p_probe_req_ie == NULL) {
  144926. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  144927. + return -EINVAL;
  144928. +
  144929. + }
  144930. + _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen);
  144931. + pmlmepriv->p2p_probe_req_ie_len = p2p_ielen;
  144932. +
  144933. + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8*)listen_ch_attr, (uint*) &attr_contentlen)
  144934. + && attr_contentlen == 5)
  144935. + {
  144936. + if (wdinfo->listen_channel != listen_ch_attr[4]) {
  144937. + DBG_871X(FUNC_ADPT_FMT" listen channel - country:%c%c%c, class:%u, ch:%u\n",
  144938. + FUNC_ADPT_ARG(padapter), listen_ch_attr[0], listen_ch_attr[1], listen_ch_attr[2],
  144939. + listen_ch_attr[3], listen_ch_attr[4]);
  144940. + wdinfo->listen_channel = listen_ch_attr[4];
  144941. + }
  144942. + }
  144943. + }
  144944. + #endif //CONFIG_P2P
  144945. +
  144946. + //buf += p2p_ielen;
  144947. + //len -= p2p_ielen;
  144948. +
  144949. + #ifdef CONFIG_WFD
  144950. + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen))
  144951. + {
  144952. + #ifdef CONFIG_DEBUG_CFG80211
  144953. + DBG_8192C("probe_req_wfd_ielen=%d\n", wfd_ielen);
  144954. + #endif
  144955. +
  144956. + if(pmlmepriv->wfd_probe_req_ie)
  144957. + {
  144958. + u32 free_len = pmlmepriv->wfd_probe_req_ie_len;
  144959. + pmlmepriv->wfd_probe_req_ie_len = 0;
  144960. + rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len);
  144961. + pmlmepriv->wfd_probe_req_ie = NULL;
  144962. + }
  144963. +
  144964. + pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen);
  144965. + if ( pmlmepriv->wfd_probe_req_ie == NULL) {
  144966. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  144967. + return -EINVAL;
  144968. +
  144969. + }
  144970. + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len);
  144971. + }
  144972. + #endif //CONFIG_WFD
  144973. +
  144974. + }
  144975. +
  144976. + return ret;
  144977. +
  144978. +}
  144979. +
  144980. +static int cfg80211_rtw_scan(struct wiphy *wiphy
  144981. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
  144982. + , struct net_device *ndev
  144983. + #endif
  144984. + , struct cfg80211_scan_request *request)
  144985. +{
  144986. + int i;
  144987. + u8 _status = _FALSE;
  144988. + int ret = 0;
  144989. + _adapter *padapter = wiphy_to_adapter(wiphy);
  144990. + struct mlme_priv *pmlmepriv= &padapter->mlmepriv;
  144991. + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
  144992. + struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
  144993. + _irqL irqL;
  144994. + u8 *wps_ie=NULL;
  144995. + uint wps_ielen=0;
  144996. + u8 *p2p_ie=NULL;
  144997. + uint p2p_ielen=0;
  144998. + u8 survey_times=3;
  144999. + u8 survey_times_for_one_ch=6;
  145000. +#ifdef CONFIG_P2P
  145001. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  145002. +#endif //CONFIG_P2P
  145003. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  145004. + struct cfg80211_ssid *ssids = request->ssids;
  145005. + int social_channel = 0, j = 0;
  145006. + bool need_indicate_scan_done = _FALSE;
  145007. +#ifdef CONFIG_CONCURRENT_MODE
  145008. + PADAPTER pbuddy_adapter = NULL;
  145009. + struct mlme_priv *pbuddy_mlmepriv = NULL;
  145010. +#endif //CONFIG_CONCURRENT_MODE
  145011. +
  145012. +//#ifdef CONFIG_DEBUG_CFG80211
  145013. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  145014. +//#endif
  145015. +
  145016. +#ifdef CONFIG_CONCURRENT_MODE
  145017. + if (padapter->pbuddy_adapter) {
  145018. + pbuddy_adapter = padapter->pbuddy_adapter;
  145019. + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  145020. + }
  145021. +#endif //CONFIG_CONCURRENT_MODE
  145022. +
  145023. +#ifdef CONFIG_MP_INCLUDED
  145024. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  145025. + {
  145026. + ret = -EPERM;
  145027. + goto exit;
  145028. + }
  145029. +#endif
  145030. +
  145031. + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  145032. + pwdev_priv->scan_request = request;
  145033. + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
  145034. +
  145035. + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  145036. + {
  145037. +#ifdef CONFIG_DEBUG_CFG80211
  145038. + DBG_871X("%s under WIFI_AP_STATE\n", __FUNCTION__);
  145039. +#endif
  145040. +
  145041. + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  145042. + {
  145043. + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state);
  145044. +
  145045. + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))
  145046. + {
  145047. + DBG_8192C("AP mode process WPS \n");
  145048. + }
  145049. +
  145050. + need_indicate_scan_done = _TRUE;
  145051. + goto check_need_indicate_scan_done;
  145052. + }
  145053. + }
  145054. +
  145055. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  145056. + need_indicate_scan_done = _TRUE;
  145057. + goto check_need_indicate_scan_done;
  145058. + }
  145059. +
  145060. + #ifdef CONFIG_P2P
  145061. + if( pwdinfo->driver_interface == DRIVER_CFG80211 )
  145062. + {
  145063. + if(ssids->ssid != NULL
  145064. + && _rtw_memcmp(ssids->ssid, "DIRECT-", 7)
  145065. + && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL)
  145066. + )
  145067. + {
  145068. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  145069. + {
  145070. + u32 initialgain = 0x30;
  145071. + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE);
  145072. + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE;
  145073. + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)&(initialgain));
  145074. + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)&(initialgain));
  145075. + }
  145076. + else
  145077. + {
  145078. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  145079. + #ifdef CONFIG_DEBUG_CFG80211
  145080. + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
  145081. + #endif
  145082. + }
  145083. + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
  145084. +
  145085. + if(request->n_channels == 3 &&
  145086. + request->channels[0]->hw_value == 1 &&
  145087. + request->channels[1]->hw_value == 6 &&
  145088. + request->channels[2]->hw_value == 11
  145089. + )
  145090. + {
  145091. + social_channel = 1;
  145092. + }
  145093. + }
  145094. + }
  145095. + #endif //CONFIG_P2P
  145096. +
  145097. + if(request->ie && request->ie_len>0)
  145098. + {
  145099. + rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len );
  145100. + }
  145101. +
  145102. + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
  145103. + {
  145104. + DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__);
  145105. + need_indicate_scan_done = _TRUE;
  145106. + goto check_need_indicate_scan_done;
  145107. + }
  145108. + if (rtw_is_scan_deny(padapter)){
  145109. + DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter));
  145110. + need_indicate_scan_done = _TRUE;
  145111. + goto check_need_indicate_scan_done;
  145112. + }
  145113. +
  145114. +#ifdef CONFIG_CONCURRENT_MODE
  145115. + if(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE))
  145116. + {
  145117. + DBG_8192C("%s, bBusyTraffic == _TRUE at buddy_intf\n", __func__);
  145118. + need_indicate_scan_done = _TRUE;
  145119. + goto check_need_indicate_scan_done;
  145120. + }
  145121. +#endif //CONFIG_CONCURRENT_MODE
  145122. +
  145123. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  145124. + {
  145125. + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state);
  145126. + need_indicate_scan_done = _TRUE;
  145127. + goto check_need_indicate_scan_done;
  145128. + }
  145129. +
  145130. +#ifdef CONFIG_CONCURRENT_MODE
  145131. + if (check_buddy_fwstate(padapter,
  145132. + _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)
  145133. + {
  145134. + if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY))
  145135. + {
  145136. + DBG_8192C("scanning_via_buddy_intf\n");
  145137. + pmlmepriv->scanning_via_buddy_intf = _TRUE;
  145138. + }
  145139. +
  145140. + DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state);
  145141. +
  145142. + need_indicate_scan_done = _TRUE;
  145143. + goto check_need_indicate_scan_done;
  145144. + }
  145145. +#endif
  145146. +
  145147. +
  145148. +#ifdef CONFIG_P2P
  145149. + if( pwdinfo->driver_interface == DRIVER_CFG80211 )
  145150. + {
  145151. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  145152. + {
  145153. + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
  145154. + rtw_free_network_queue(padapter, _TRUE);
  145155. +
  145156. + if(social_channel == 0)
  145157. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
  145158. + else
  145159. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);
  145160. + }
  145161. + }
  145162. +#endif //CONFIG_P2P
  145163. +
  145164. +
  145165. + _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT);
  145166. + //parsing request ssids, n_ssids
  145167. + for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) {
  145168. + #ifdef CONFIG_DEBUG_CFG80211
  145169. + DBG_8192C("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len);
  145170. + #endif
  145171. + _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len);
  145172. + ssid[i].SsidLength = ssids[i].ssid_len;
  145173. + }
  145174. +
  145175. +
  145176. + /* parsing channels, n_channels */
  145177. + _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT);
  145178. + for (i=0;i<request->n_channels && i<RTW_CHANNEL_SCAN_AMOUNT;i++) {
  145179. + #ifdef CONFIG_DEBUG_CFG80211
  145180. + DBG_871X(FUNC_ADPT_FMT CHAN_FMT"\n", FUNC_ADPT_ARG(padapter), CHAN_ARG(request->channels[i]));
  145181. + #endif
  145182. + ch[i].hw_value = request->channels[i]->hw_value;
  145183. + ch[i].flags = request->channels[i]->flags;
  145184. + }
  145185. +
  145186. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  145187. + if (request->n_channels == 1) {
  145188. + for(i=1;i<survey_times_for_one_ch;i++)
  145189. + _rtw_memcpy(&ch[i], &ch[0], sizeof(struct rtw_ieee80211_channel));
  145190. + _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times_for_one_ch);
  145191. + } else if (request->n_channels == 2) {
  145192. + _rtw_memcpy(&ch[3], &ch[1], sizeof(struct rtw_ieee80211_channel));
  145193. + for(i=1;i<survey_times;i++) {
  145194. + _rtw_memcpy(&ch[i], &ch[0], sizeof(struct rtw_ieee80211_channel));
  145195. + _rtw_memcpy(&ch[i+3], &ch[3], sizeof(struct rtw_ieee80211_channel));
  145196. + }
  145197. + _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * 2);
  145198. + } else {
  145199. + _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0);
  145200. + }
  145201. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  145202. +
  145203. +
  145204. + if(_status == _FALSE)
  145205. + {
  145206. + ret = -1;
  145207. + }
  145208. +
  145209. +check_need_indicate_scan_done:
  145210. + if(need_indicate_scan_done)
  145211. + rtw_cfg80211_surveydone_event_callback(padapter);
  145212. +
  145213. +exit:
  145214. +
  145215. + return ret;
  145216. +
  145217. +}
  145218. +
  145219. +static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed)
  145220. +{
  145221. +#if 0
  145222. + struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
  145223. +
  145224. + if (changed & WIPHY_PARAM_RTS_THRESHOLD &&
  145225. + (iwm->conf.rts_threshold != wiphy->rts_threshold)) {
  145226. + int ret;
  145227. +
  145228. + iwm->conf.rts_threshold = wiphy->rts_threshold;
  145229. +
  145230. + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,
  145231. + CFG_RTS_THRESHOLD,
  145232. + iwm->conf.rts_threshold);
  145233. + if (ret < 0)
  145234. + return ret;
  145235. + }
  145236. +
  145237. + if (changed & WIPHY_PARAM_FRAG_THRESHOLD &&
  145238. + (iwm->conf.frag_threshold != wiphy->frag_threshold)) {
  145239. + int ret;
  145240. +
  145241. + iwm->conf.frag_threshold = wiphy->frag_threshold;
  145242. +
  145243. + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX,
  145244. + CFG_FRAG_THRESHOLD,
  145245. + iwm->conf.frag_threshold);
  145246. + if (ret < 0)
  145247. + return ret;
  145248. + }
  145249. +#endif
  145250. + DBG_8192C("%s\n", __func__);
  145251. + return 0;
  145252. +}
  145253. +
  145254. +static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
  145255. + struct cfg80211_ibss_params *params)
  145256. +{
  145257. +#if 0
  145258. + struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
  145259. + struct ieee80211_channel *chan = params->channel;
  145260. +
  145261. + if (!test_bit(IWM_STATUS_READY, &iwm->status))
  145262. + return -EIO;
  145263. +
  145264. + /* UMAC doesn't support creating or joining an IBSS network
  145265. + * with specified bssid. */
  145266. + if (params->bssid)
  145267. + return -EOPNOTSUPP;
  145268. +
  145269. + iwm->channel = ieee80211_frequency_to_channel(chan->center_freq);
  145270. + iwm->umac_profile->ibss.band = chan->band;
  145271. + iwm->umac_profile->ibss.channel = iwm->channel;
  145272. + iwm->umac_profile->ssid.ssid_len = params->ssid_len;
  145273. + memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len);
  145274. +
  145275. + return iwm_send_mlme_profile(iwm);
  145276. +#endif
  145277. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  145278. + return 0;
  145279. +}
  145280. +
  145281. +static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
  145282. +{
  145283. +#if 0
  145284. + struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
  145285. +
  145286. + if (iwm->umac_profile_active)
  145287. + return iwm_invalidate_mlme_profile(iwm);
  145288. +#endif
  145289. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  145290. + return 0;
  145291. +}
  145292. +
  145293. +static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version)
  145294. +{
  145295. + DBG_8192C("%s, wpa_version=%d\n", __func__, wpa_version);
  145296. +
  145297. + if (!wpa_version) {
  145298. + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
  145299. + return 0;
  145300. + }
  145301. +
  145302. +
  145303. + if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
  145304. + {
  145305. + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK;
  145306. + }
  145307. +
  145308. +/*
  145309. + if (wpa_version & NL80211_WPA_VERSION_2)
  145310. + {
  145311. + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;
  145312. + }
  145313. +*/
  145314. +
  145315. + return 0;
  145316. +
  145317. +}
  145318. +
  145319. +static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv,
  145320. + enum nl80211_auth_type sme_auth_type)
  145321. +{
  145322. + DBG_8192C("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type);
  145323. +
  145324. +
  145325. + switch (sme_auth_type) {
  145326. + case NL80211_AUTHTYPE_AUTOMATIC:
  145327. +
  145328. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  145329. +
  145330. + break;
  145331. + case NL80211_AUTHTYPE_OPEN_SYSTEM:
  145332. +
  145333. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
  145334. +
  145335. + if(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA)
  145336. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
  145337. +
  145338. + break;
  145339. + case NL80211_AUTHTYPE_SHARED_KEY:
  145340. +
  145341. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared;
  145342. +
  145343. + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145344. +
  145345. +
  145346. + break;
  145347. + default:
  145348. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
  145349. + //return -ENOTSUPP;
  145350. + }
  145351. +
  145352. + return 0;
  145353. +
  145354. +}
  145355. +
  145356. +static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast)
  145357. +{
  145358. + u32 ndisencryptstatus = Ndis802_11EncryptionDisabled;
  145359. +
  145360. + u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm :
  145361. + &psecuritypriv->dot118021XGrpPrivacy;
  145362. +
  145363. + DBG_8192C("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher);
  145364. +
  145365. +
  145366. + if (!cipher) {
  145367. + *profile_cipher = _NO_PRIVACY_;
  145368. + psecuritypriv->ndisencryptstatus = ndisencryptstatus;
  145369. + return 0;
  145370. + }
  145371. +
  145372. + switch (cipher) {
  145373. + case IW_AUTH_CIPHER_NONE:
  145374. + *profile_cipher = _NO_PRIVACY_;
  145375. + ndisencryptstatus = Ndis802_11EncryptionDisabled;
  145376. + break;
  145377. + case WLAN_CIPHER_SUITE_WEP40:
  145378. + *profile_cipher = _WEP40_;
  145379. + ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145380. + break;
  145381. + case WLAN_CIPHER_SUITE_WEP104:
  145382. + *profile_cipher = _WEP104_;
  145383. + ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145384. + break;
  145385. + case WLAN_CIPHER_SUITE_TKIP:
  145386. + *profile_cipher = _TKIP_;
  145387. + ndisencryptstatus = Ndis802_11Encryption2Enabled;
  145388. + break;
  145389. + case WLAN_CIPHER_SUITE_CCMP:
  145390. + *profile_cipher = _AES_;
  145391. + ndisencryptstatus = Ndis802_11Encryption3Enabled;
  145392. + break;
  145393. + default:
  145394. + DBG_8192C("Unsupported cipher: 0x%x\n", cipher);
  145395. + return -ENOTSUPP;
  145396. + }
  145397. +
  145398. + if(ucast)
  145399. + {
  145400. + psecuritypriv->ndisencryptstatus = ndisencryptstatus;
  145401. +
  145402. + //if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_)
  145403. + // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;
  145404. + }
  145405. +
  145406. + return 0;
  145407. +}
  145408. +
  145409. +static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt)
  145410. +{
  145411. + DBG_8192C("%s, key_mgt=0x%x\n", __func__, key_mgt);
  145412. +
  145413. + if (key_mgt == WLAN_AKM_SUITE_8021X)
  145414. + //*auth_type = UMAC_AUTH_TYPE_8021X;
  145415. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
  145416. + else if (key_mgt == WLAN_AKM_SUITE_PSK) {
  145417. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
  145418. + } else {
  145419. + DBG_8192C("Invalid key mgt: 0x%x\n", key_mgt);
  145420. + //return -EINVAL;
  145421. + }
  145422. +
  145423. + return 0;
  145424. +}
  145425. +
  145426. +static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen)
  145427. +{
  145428. + u8 *buf=NULL, *pos=NULL;
  145429. + u32 left;
  145430. + int group_cipher = 0, pairwise_cipher = 0;
  145431. + int ret = 0;
  145432. + int wpa_ielen=0;
  145433. + int wpa2_ielen=0;
  145434. + u8 *pwpa, *pwpa2;
  145435. + u8 null_addr[]= {0,0,0,0,0,0};
  145436. +
  145437. + if (pie == NULL || !ielen) {
  145438. + /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */
  145439. + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
  145440. + goto exit;
  145441. + }
  145442. +
  145443. + if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) {
  145444. + ret = -EINVAL;
  145445. + goto exit;
  145446. + }
  145447. +
  145448. + buf = rtw_zmalloc(ielen);
  145449. + if (buf == NULL){
  145450. + ret = -ENOMEM;
  145451. + goto exit;
  145452. + }
  145453. +
  145454. + _rtw_memcpy(buf, pie , ielen);
  145455. +
  145456. + //dump
  145457. + {
  145458. + int i;
  145459. + DBG_8192C("set wpa_ie(length:%zu):\n", ielen);
  145460. + for(i=0;i<ielen;i=i+8)
  145461. + DBG_8192C("0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5],buf[i+6],buf[i+7]);
  145462. + }
  145463. +
  145464. + pos = buf;
  145465. + if(ielen < RSN_HEADER_LEN){
  145466. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("Ie len too short %d\n", ielen));
  145467. + ret = -1;
  145468. + goto exit;
  145469. + }
  145470. +
  145471. + pwpa = rtw_get_wpa_ie(buf, &wpa_ielen, ielen);
  145472. + if(pwpa && wpa_ielen>0)
  145473. + {
  145474. + if(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  145475. + {
  145476. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  145477. + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK;
  145478. + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2);
  145479. +
  145480. + DBG_8192C("got wpa_ie, wpa_ielen:%u\n", wpa_ielen);
  145481. + }
  145482. + }
  145483. +
  145484. + pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen);
  145485. + if(pwpa2 && wpa2_ielen>0)
  145486. + {
  145487. + if(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher) == _SUCCESS)
  145488. + {
  145489. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  145490. + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK;
  145491. + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2);
  145492. +
  145493. + DBG_8192C("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen);
  145494. + }
  145495. + }
  145496. +
  145497. + if (group_cipher == 0)
  145498. + {
  145499. + group_cipher = WPA_CIPHER_NONE;
  145500. + }
  145501. + if (pairwise_cipher == 0)
  145502. + {
  145503. + pairwise_cipher = WPA_CIPHER_NONE;
  145504. + }
  145505. +
  145506. + switch(group_cipher)
  145507. + {
  145508. + case WPA_CIPHER_NONE:
  145509. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  145510. + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;
  145511. + break;
  145512. + case WPA_CIPHER_WEP40:
  145513. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;
  145514. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145515. + break;
  145516. + case WPA_CIPHER_TKIP:
  145517. + padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_;
  145518. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
  145519. + break;
  145520. + case WPA_CIPHER_CCMP:
  145521. + padapter->securitypriv.dot118021XGrpPrivacy=_AES_;
  145522. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
  145523. + break;
  145524. + case WPA_CIPHER_WEP104:
  145525. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;
  145526. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145527. + break;
  145528. + }
  145529. +
  145530. + switch(pairwise_cipher)
  145531. + {
  145532. + case WPA_CIPHER_NONE:
  145533. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  145534. + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;
  145535. + break;
  145536. + case WPA_CIPHER_WEP40:
  145537. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  145538. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145539. + break;
  145540. + case WPA_CIPHER_TKIP:
  145541. + padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_;
  145542. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
  145543. + break;
  145544. + case WPA_CIPHER_CCMP:
  145545. + padapter->securitypriv.dot11PrivacyAlgrthm=_AES_;
  145546. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
  145547. + break;
  145548. + case WPA_CIPHER_WEP104:
  145549. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  145550. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  145551. + break;
  145552. + }
  145553. +
  145554. + {/* handle wps_ie */
  145555. + uint wps_ielen;
  145556. + u8 *wps_ie;
  145557. +
  145558. + wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen);
  145559. + if (wps_ie && wps_ielen > 0) {
  145560. + DBG_8192C("got wps_ie, wps_ielen:%u\n", wps_ielen);
  145561. + padapter->securitypriv.wps_ie_len = wps_ielen<MAX_WPS_IE_LEN?wps_ielen:MAX_WPS_IE_LEN;
  145562. + _rtw_memcpy(padapter->securitypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len);
  145563. + set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);
  145564. + } else {
  145565. + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
  145566. + }
  145567. + }
  145568. +
  145569. + #ifdef CONFIG_P2P
  145570. + {//check p2p_ie for assoc req;
  145571. + uint p2p_ielen=0;
  145572. + u8 *p2p_ie;
  145573. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  145574. +
  145575. + if((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen)))
  145576. + {
  145577. + #ifdef CONFIG_DEBUG_CFG80211
  145578. + DBG_8192C("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen);
  145579. + #endif
  145580. +
  145581. + if(pmlmepriv->p2p_assoc_req_ie)
  145582. + {
  145583. + u32 free_len = pmlmepriv->p2p_assoc_req_ie_len;
  145584. + pmlmepriv->p2p_assoc_req_ie_len = 0;
  145585. + rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len);
  145586. + pmlmepriv->p2p_assoc_req_ie = NULL;
  145587. + }
  145588. +
  145589. + pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen);
  145590. + if ( pmlmepriv->p2p_assoc_req_ie == NULL) {
  145591. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  145592. + goto exit;
  145593. + }
  145594. + _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen);
  145595. + pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen;
  145596. + }
  145597. + }
  145598. + #endif //CONFIG_P2P
  145599. +
  145600. + #ifdef CONFIG_WFD
  145601. + {//check wfd_ie for assoc req;
  145602. + uint wfd_ielen=0;
  145603. + u8 *wfd_ie;
  145604. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  145605. +
  145606. + if(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen))
  145607. + {
  145608. + #ifdef CONFIG_DEBUG_CFG80211
  145609. + DBG_8192C("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen);
  145610. + #endif
  145611. +
  145612. + if(pmlmepriv->wfd_assoc_req_ie)
  145613. + {
  145614. + u32 free_len = pmlmepriv->wfd_assoc_req_ie_len;
  145615. + pmlmepriv->wfd_assoc_req_ie_len = 0;
  145616. + rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len);
  145617. + pmlmepriv->wfd_assoc_req_ie = NULL;
  145618. + }
  145619. +
  145620. + pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen);
  145621. + if ( pmlmepriv->wfd_assoc_req_ie == NULL) {
  145622. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  145623. + goto exit;
  145624. + }
  145625. + rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len);
  145626. + }
  145627. + }
  145628. + #endif //CONFIG_WFD
  145629. +
  145630. + //TKIP and AES disallow multicast packets until installing group key
  145631. + if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_
  145632. + || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_
  145633. + || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)
  145634. + //WPS open need to enable multicast
  145635. + //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE)
  145636. + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr);
  145637. +
  145638. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  145639. + ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n",
  145640. + pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype));
  145641. +
  145642. +exit:
  145643. + if (buf)
  145644. + rtw_mfree(buf, ielen);
  145645. + if (ret)
  145646. + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
  145647. + return ret;
  145648. +}
  145649. +
  145650. +static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
  145651. + struct cfg80211_connect_params *sme)
  145652. +{
  145653. + int ret=0;
  145654. + _irqL irqL;
  145655. + _list *phead;
  145656. + struct wlan_network *pnetwork = NULL;
  145657. + NDIS_802_11_AUTHENTICATION_MODE authmode;
  145658. + NDIS_802_11_SSID ndis_ssid;
  145659. + u8 *dst_ssid, *src_ssid;
  145660. + u8 *dst_bssid, *src_bssid;
  145661. + //u8 matched_by_bssid=_FALSE;
  145662. + //u8 matched_by_ssid=_FALSE;
  145663. + u8 matched=_FALSE;
  145664. + _adapter *padapter = wiphy_to_adapter(wiphy);
  145665. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  145666. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  145667. + _queue *queue = &pmlmepriv->scanned_queue;
  145668. +
  145669. + DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  145670. + DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n",
  145671. + sme->privacy, sme->key, sme->key_len, sme->key_idx);
  145672. +
  145673. +
  145674. + if(wdev_to_priv(padapter->rtw_wdev)->block == _TRUE)
  145675. + {
  145676. + ret = -EBUSY;
  145677. + DBG_871X("%s wdev_priv.block is set\n", __FUNCTION__);
  145678. + goto exit;
  145679. + }
  145680. +
  145681. +#ifdef CONFIG_PLATFORM_MSTAR
  145682. + printk("MStar Android!\n");
  145683. + if((wdev_to_priv(padapter->rtw_wdev))->bandroid_scan == _FALSE)
  145684. + {
  145685. +#ifdef CONFIG_P2P
  145686. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  145687. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  145688. +#endif //CONFIG_P2P
  145689. + {
  145690. + ret = -EBUSY;
  145691. + printk("Android hasn't attached yet!\n");
  145692. + goto exit;
  145693. + }
  145694. + }
  145695. +#endif
  145696. +
  145697. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  145698. + ret= -EPERM;
  145699. + goto exit;
  145700. + }
  145701. +
  145702. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  145703. + ret = -EPERM;
  145704. + goto exit;
  145705. + }
  145706. +
  145707. +#ifdef CONFIG_CONCURRENT_MODE
  145708. + if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) {
  145709. + DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__);
  145710. + ret = -EINVAL;
  145711. + goto exit;
  145712. + }
  145713. + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) {
  145714. + rtw_scan_abort(padapter->pbuddy_adapter);
  145715. + }
  145716. +#endif
  145717. +
  145718. + if (!sme->ssid || !sme->ssid_len)
  145719. + {
  145720. + ret = -EINVAL;
  145721. + goto exit;
  145722. + }
  145723. +
  145724. + if (sme->ssid_len > IW_ESSID_MAX_SIZE){
  145725. +
  145726. + ret= -E2BIG;
  145727. + goto exit;
  145728. + }
  145729. +
  145730. + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));
  145731. + ndis_ssid.SsidLength = sme->ssid_len;
  145732. + _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len);
  145733. +
  145734. + DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len);
  145735. +
  145736. +
  145737. + if (sme->bssid)
  145738. + DBG_8192C("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid));
  145739. +
  145740. +
  145741. + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {
  145742. + ret = -EBUSY;
  145743. + DBG_8192C("%s, fw_state=0x%x, goto exit\n", __FUNCTION__, pmlmepriv->fw_state);
  145744. + goto exit;
  145745. + }
  145746. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
  145747. + rtw_scan_abort(padapter);
  145748. + }
  145749. +
  145750. + psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;
  145751. + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
  145752. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  145753. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system
  145754. + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
  145755. +
  145756. +
  145757. + ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions);
  145758. + if (ret < 0)
  145759. + goto exit;
  145760. +
  145761. + ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type);
  145762. + if (ret < 0)
  145763. + goto exit;
  145764. +
  145765. + DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len);
  145766. +
  145767. + ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len);
  145768. + if (ret < 0)
  145769. + goto exit;
  145770. +
  145771. + if (sme->crypto.n_ciphers_pairwise) {
  145772. + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE);
  145773. + if (ret < 0)
  145774. + goto exit;
  145775. + }
  145776. +
  145777. + //For WEP Shared auth
  145778. + if((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared
  145779. + || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key
  145780. + )
  145781. + {
  145782. + u32 wep_key_idx, wep_key_len,wep_total_len;
  145783. + NDIS_802_11_WEP *pwep = NULL;
  145784. + DBG_871X("%s(): Shared/Auto WEP\n",__FUNCTION__);
  145785. +
  145786. + wep_key_idx = sme->key_idx;
  145787. + wep_key_len = sme->key_len;
  145788. +
  145789. + if (sme->key_idx > WEP_KEYS) {
  145790. + ret = -EINVAL;
  145791. + goto exit;
  145792. + }
  145793. +
  145794. + if (wep_key_len > 0)
  145795. + {
  145796. + wep_key_len = wep_key_len <= 5 ? 5 : 13;
  145797. + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);
  145798. + pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len);
  145799. + if(pwep == NULL){
  145800. + DBG_871X(" wpa_set_encryption: pwep allocate fail !!!\n");
  145801. + ret = -ENOMEM;
  145802. + goto exit;
  145803. + }
  145804. +
  145805. + _rtw_memset(pwep, 0, wep_total_len);
  145806. +
  145807. + pwep->KeyLength = wep_key_len;
  145808. + pwep->Length = wep_total_len;
  145809. +
  145810. + if(wep_key_len==13)
  145811. + {
  145812. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  145813. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;
  145814. + }
  145815. + }
  145816. + else {
  145817. + ret = -EINVAL;
  145818. + goto exit;
  145819. + }
  145820. +
  145821. + pwep->KeyIndex = wep_key_idx;
  145822. + pwep->KeyIndex |= 0x80000000;
  145823. +
  145824. + _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength);
  145825. +
  145826. + if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL)
  145827. + {
  145828. + ret = -EOPNOTSUPP ;
  145829. + }
  145830. +
  145831. + if (pwep) {
  145832. + rtw_mfree((u8 *)pwep,wep_total_len);
  145833. + }
  145834. +
  145835. + if(ret < 0)
  145836. + goto exit;
  145837. + }
  145838. +
  145839. + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE);
  145840. + if (ret < 0)
  145841. + return ret;
  145842. +
  145843. + if (sme->crypto.n_akm_suites) {
  145844. + ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]);
  145845. + if (ret < 0)
  145846. + goto exit;
  145847. + }
  145848. +
  145849. + authmode = psecuritypriv->ndisauthtype;
  145850. + rtw_set_802_11_authentication_mode(padapter, authmode);
  145851. +
  145852. + //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);
  145853. +
  145854. + if (rtw_set_802_11_connect(padapter, sme->bssid, &ndis_ssid) == _FALSE) {
  145855. + ret = -1;
  145856. + goto exit;
  145857. + }
  145858. +
  145859. + DBG_8192C("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy);
  145860. +
  145861. +exit:
  145862. +
  145863. + DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret);
  145864. +
  145865. + return ret;
  145866. +}
  145867. +
  145868. +static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
  145869. + u16 reason_code)
  145870. +{
  145871. + _adapter *padapter = wiphy_to_adapter(wiphy);
  145872. +
  145873. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  145874. +
  145875. + rtw_set_roaming(padapter, 0);
  145876. +
  145877. + if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))
  145878. + {
  145879. + rtw_scan_abort(padapter);
  145880. + LeaveAllPowerSaveMode(padapter);
  145881. + rtw_disassoc_cmd(padapter, 500, _FALSE);
  145882. +
  145883. + DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__);
  145884. +
  145885. + padapter->mlmepriv.not_indic_disco = _TRUE;
  145886. + rtw_indicate_disconnect(padapter);
  145887. + padapter->mlmepriv.not_indic_disco = _FALSE;
  145888. +
  145889. + rtw_free_assoc_resources(padapter, 1);
  145890. + }
  145891. +
  145892. + return 0;
  145893. +}
  145894. +
  145895. +static int cfg80211_rtw_set_txpower(struct wiphy *wiphy,
  145896. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
  145897. + struct wireless_dev *wdev,
  145898. +#endif
  145899. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE)
  145900. + enum nl80211_tx_power_setting type, int mbm)
  145901. +#else
  145902. + enum tx_power_setting type, int dbm)
  145903. +#endif
  145904. +{
  145905. +#if 0
  145906. + struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
  145907. + int ret;
  145908. +
  145909. + switch (type) {
  145910. + case NL80211_TX_POWER_AUTOMATIC:
  145911. + return 0;
  145912. + case NL80211_TX_POWER_FIXED:
  145913. + if (mbm < 0 || (mbm % 100))
  145914. + return -EOPNOTSUPP;
  145915. +
  145916. + if (!test_bit(IWM_STATUS_READY, &iwm->status))
  145917. + return 0;
  145918. +
  145919. + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,
  145920. + CFG_TX_PWR_LIMIT_USR,
  145921. + MBM_TO_DBM(mbm) * 2);
  145922. + if (ret < 0)
  145923. + return ret;
  145924. +
  145925. + return iwm_tx_power_trigger(iwm);
  145926. + default:
  145927. + IWM_ERR(iwm, "Unsupported power type: %d\n", type);
  145928. + return -EOPNOTSUPP;
  145929. + }
  145930. +#endif
  145931. + DBG_8192C("%s\n", __func__);
  145932. + return 0;
  145933. +}
  145934. +
  145935. +static int cfg80211_rtw_get_txpower(struct wiphy *wiphy,
  145936. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
  145937. + struct wireless_dev *wdev,
  145938. +#endif
  145939. + int *dbm)
  145940. +{
  145941. + //_adapter *padapter = wiphy_to_adapter(wiphy);
  145942. +
  145943. + DBG_8192C("%s\n", __func__);
  145944. +
  145945. + *dbm = (12);
  145946. +
  145947. + return 0;
  145948. +}
  145949. +
  145950. +inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter)
  145951. +{
  145952. + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev);
  145953. + return rtw_wdev_priv->power_mgmt;
  145954. +}
  145955. +
  145956. +static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy,
  145957. + struct net_device *ndev,
  145958. + bool enabled, int timeout)
  145959. +{
  145960. + _adapter *padapter = wiphy_to_adapter(wiphy);
  145961. + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev);
  145962. +
  145963. + DBG_871X(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev),
  145964. + enabled, timeout);
  145965. +
  145966. + rtw_wdev_priv->power_mgmt = enabled;
  145967. +
  145968. + #ifdef CONFIG_LPS
  145969. + if (!enabled)
  145970. + LPS_Leave(padapter);
  145971. + #endif
  145972. +
  145973. + return 0;
  145974. +}
  145975. +
  145976. +static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
  145977. + struct net_device *netdev,
  145978. + struct cfg80211_pmksa *pmksa)
  145979. +{
  145980. + u8 index,blInserted = _FALSE;
  145981. + _adapter *padapter = wiphy_to_adapter(wiphy);
  145982. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  145983. + u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 };
  145984. +
  145985. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev));
  145986. +
  145987. + if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )
  145988. + {
  145989. + return -EINVAL;
  145990. + }
  145991. +
  145992. + blInserted = _FALSE;
  145993. +
  145994. + //overwrite PMKID
  145995. + for(index=0 ; index<NUM_PMKID_CACHE; index++)
  145996. + {
  145997. + if( _rtw_memcmp( psecuritypriv->PMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE )
  145998. + { // BSSID is matched, the same AP => rewrite with new PMKID.
  145999. + DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev));
  146000. +
  146001. + _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN);
  146002. + psecuritypriv->PMKIDList[index].bUsed = _TRUE;
  146003. + psecuritypriv->PMKIDIndex = index+1;
  146004. + blInserted = _TRUE;
  146005. + break;
  146006. + }
  146007. + }
  146008. +
  146009. + if(!blInserted)
  146010. + {
  146011. + // Find a new entry
  146012. + DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n",
  146013. + FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex );
  146014. +
  146015. + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN);
  146016. + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN);
  146017. +
  146018. + psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE;
  146019. + psecuritypriv->PMKIDIndex++ ;
  146020. + if(psecuritypriv->PMKIDIndex==16)
  146021. + {
  146022. + psecuritypriv->PMKIDIndex =0;
  146023. + }
  146024. + }
  146025. +
  146026. + return 0;
  146027. +}
  146028. +
  146029. +static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
  146030. + struct net_device *netdev,
  146031. + struct cfg80211_pmksa *pmksa)
  146032. +{
  146033. + u8 index, bMatched = _FALSE;
  146034. + _adapter *padapter = wiphy_to_adapter(wiphy);
  146035. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  146036. +
  146037. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev));
  146038. +
  146039. + for(index=0 ; index<NUM_PMKID_CACHE; index++)
  146040. + {
  146041. + if( _rtw_memcmp( psecuritypriv->PMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE )
  146042. + { // BSSID is matched, the same AP => Remove this PMKID information and reset it.
  146043. + _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN );
  146044. + _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN );
  146045. + psecuritypriv->PMKIDList[index].bUsed = _FALSE;
  146046. + bMatched = _TRUE;
  146047. + break;
  146048. + }
  146049. + }
  146050. +
  146051. + if(_FALSE == bMatched)
  146052. + {
  146053. + DBG_871X(FUNC_NDEV_FMT" do not have matched BSSID\n"
  146054. + , FUNC_NDEV_ARG(netdev));
  146055. + return -EINVAL;
  146056. + }
  146057. +
  146058. + return 0;
  146059. +}
  146060. +
  146061. +static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy,
  146062. + struct net_device *netdev)
  146063. +{
  146064. + _adapter *padapter = wiphy_to_adapter(wiphy);
  146065. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  146066. +
  146067. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev));
  146068. +
  146069. + _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );
  146070. + psecuritypriv->PMKIDIndex = 0;
  146071. +
  146072. + return 0;
  146073. +}
  146074. +
  146075. +#ifdef CONFIG_AP_MODE
  146076. +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)
  146077. +{
  146078. + s32 freq;
  146079. + int channel;
  146080. + struct wireless_dev *pwdev = padapter->rtw_wdev;
  146081. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146082. + struct net_device *ndev = padapter->pnetdev;
  146083. +
  146084. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  146085. +
  146086. +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE)
  146087. + {
  146088. + struct station_info sinfo;
  146089. + u8 ie_offset;
  146090. + if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ)
  146091. + ie_offset = _ASOCREQ_IE_OFFSET_;
  146092. + else // WIFI_REASSOCREQ
  146093. + ie_offset = _REASOCREQ_IE_OFFSET_;
  146094. +
  146095. + sinfo.filled = 0;
  146096. + sinfo.filled = STATION_INFO_ASSOC_REQ_IES;
  146097. + sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset;
  146098. + sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset;
  146099. + cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC);
  146100. + }
  146101. +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */
  146102. + channel = pmlmeext->cur_channel;
  146103. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  146104. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  146105. + else
  146106. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  146107. +
  146108. + #ifdef COMPAT_KERNEL_RELEASE
  146109. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);
  146110. + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  146111. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);
  146112. + #else //COMPAT_KERNEL_RELEASE
  146113. + {
  146114. + //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc()
  146115. + #ifndef CONFIG_PLATFORM_MSTAR
  146116. + pwdev->iftype = NL80211_IFTYPE_STATION;
  146117. + #endif //CONFIG_PLATFORM_MSTAR
  146118. + DBG_8192C("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype);
  146119. + rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len);
  146120. + DBG_8192C("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype);
  146121. + pwdev->iftype = NL80211_IFTYPE_AP;
  146122. + //cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);
  146123. + }
  146124. + #endif //COMPAT_KERNEL_RELEASE
  146125. +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
  146126. +
  146127. +}
  146128. +
  146129. +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason)
  146130. +{
  146131. + s32 freq;
  146132. + int channel;
  146133. + u8 *pmgmt_frame;
  146134. + uint frame_len;
  146135. + struct rtw_ieee80211_hdr *pwlanhdr;
  146136. + unsigned short *fctrl;
  146137. + u8 mgmt_buf[128] = {0};
  146138. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146139. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  146140. + struct net_device *ndev = padapter->pnetdev;
  146141. +
  146142. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  146143. +
  146144. +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE)
  146145. + cfg80211_del_sta(ndev, da, GFP_ATOMIC);
  146146. +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */
  146147. + channel = pmlmeext->cur_channel;
  146148. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  146149. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  146150. + else
  146151. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  146152. +
  146153. + pmgmt_frame = mgmt_buf;
  146154. + pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame;
  146155. +
  146156. + fctrl = &(pwlanhdr->frame_ctl);
  146157. + *(fctrl) = 0;
  146158. +
  146159. + //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  146160. + //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  146161. + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN);
  146162. + _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN);
  146163. + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  146164. +
  146165. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  146166. + pmlmeext->mgnt_seq++;
  146167. + SetFrameSubType(pmgmt_frame, WIFI_DEAUTH);
  146168. +
  146169. + pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr);
  146170. + frame_len = sizeof(struct rtw_ieee80211_hdr_3addr);
  146171. +
  146172. + reason = cpu_to_le16(reason);
  146173. + pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len);
  146174. +
  146175. + #ifdef COMPAT_KERNEL_RELEASE
  146176. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC);
  146177. + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
  146178. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC);
  146179. + #else //COMPAT_KERNEL_RELEASE
  146180. + cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len);
  146181. + //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC);
  146182. + #endif //COMPAT_KERNEL_RELEASE
  146183. +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
  146184. +}
  146185. +
  146186. +static int rtw_cfg80211_monitor_if_open(struct net_device *ndev)
  146187. +{
  146188. + int ret = 0;
  146189. +
  146190. + DBG_8192C("%s\n", __func__);
  146191. +
  146192. + return ret;
  146193. +}
  146194. +
  146195. +static int rtw_cfg80211_monitor_if_close(struct net_device *ndev)
  146196. +{
  146197. + int ret = 0;
  146198. +
  146199. + DBG_8192C("%s\n", __func__);
  146200. +
  146201. + return ret;
  146202. +}
  146203. +
  146204. +static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev)
  146205. +{
  146206. + int ret = 0;
  146207. + int rtap_len;
  146208. + int qos_len = 0;
  146209. + int dot11_hdr_len = 24;
  146210. + int snap_len = 6;
  146211. + unsigned char *pdata;
  146212. + u16 frame_ctl;
  146213. + unsigned char src_mac_addr[6];
  146214. + unsigned char dst_mac_addr[6];
  146215. + struct ieee80211_hdr *dot11_hdr;
  146216. + struct ieee80211_radiotap_header *rtap_hdr;
  146217. + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  146218. +
  146219. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146220. +
  146221. + if (skb)
  146222. + rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize);
  146223. +
  146224. + if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
  146225. + goto fail;
  146226. +
  146227. + rtap_hdr = (struct ieee80211_radiotap_header *)skb->data;
  146228. + if (unlikely(rtap_hdr->it_version))
  146229. + goto fail;
  146230. +
  146231. + rtap_len = ieee80211_get_radiotap_len(skb->data);
  146232. + if (unlikely(skb->len < rtap_len))
  146233. + goto fail;
  146234. +
  146235. + if(rtap_len != 14)
  146236. + {
  146237. + DBG_8192C("radiotap len (should be 14): %d\n", rtap_len);
  146238. + goto fail;
  146239. + }
  146240. +
  146241. + /* Skip the ratio tap header */
  146242. + skb_pull(skb, rtap_len);
  146243. +
  146244. + dot11_hdr = (struct ieee80211_hdr *)skb->data;
  146245. + frame_ctl = le16_to_cpu(dot11_hdr->frame_control);
  146246. + /* Check if the QoS bit is set */
  146247. + if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {
  146248. + /* Check if this ia a Wireless Distribution System (WDS) frame
  146249. + * which has 4 MAC addresses
  146250. + */
  146251. + if (dot11_hdr->frame_control & 0x0080)
  146252. + qos_len = 2;
  146253. + if ((dot11_hdr->frame_control & 0x0300) == 0x0300)
  146254. + dot11_hdr_len += 6;
  146255. +
  146256. + memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr));
  146257. + memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr));
  146258. +
  146259. + /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for
  146260. + * for two MAC addresses
  146261. + */
  146262. + skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2);
  146263. + pdata = (unsigned char*)skb->data;
  146264. + memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr));
  146265. + memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr));
  146266. +
  146267. + DBG_8192C("should be eapol packet\n");
  146268. +
  146269. + /* Use the real net device to transmit the packet */
  146270. + ret = _rtw_xmit_entry(skb, padapter->pnetdev);
  146271. +
  146272. + return ret;
  146273. +
  146274. + }
  146275. + else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE))
  146276. + == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION)
  146277. + )
  146278. + {
  146279. + //only for action frames
  146280. + struct xmit_frame *pmgntframe;
  146281. + struct pkt_attrib *pattrib;
  146282. + unsigned char *pframe;
  146283. + //u8 category, action, OUI_Subtype, dialogToken=0;
  146284. + //unsigned char *frame_body;
  146285. + struct rtw_ieee80211_hdr *pwlanhdr;
  146286. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  146287. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146288. + u8 *buf = skb->data;
  146289. + u32 len = skb->len;
  146290. + u8 category, action;
  146291. + int type = -1;
  146292. +
  146293. + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) {
  146294. + DBG_8192C(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev),
  146295. + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl));
  146296. + goto fail;
  146297. + }
  146298. +
  146299. + DBG_8192C("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n",
  146300. + MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev));
  146301. + #ifdef CONFIG_P2P
  146302. + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0)
  146303. + goto dump;
  146304. + #endif
  146305. + if (category == RTW_WLAN_CATEGORY_PUBLIC)
  146306. + DBG_871X("RTW_Tx:%s\n", action_public_str(action));
  146307. + else
  146308. + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action);
  146309. +
  146310. +dump:
  146311. + //starting alloc mgmt frame to dump it
  146312. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  146313. + {
  146314. + goto fail;
  146315. + }
  146316. +
  146317. + //update attribute
  146318. + pattrib = &pmgntframe->attrib;
  146319. + update_mgntframe_attrib(padapter, pattrib);
  146320. + pattrib->retry_ctrl = _FALSE;
  146321. +
  146322. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  146323. +
  146324. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  146325. +
  146326. + _rtw_memcpy(pframe, (void*)buf, len);
  146327. + #ifdef CONFIG_WFD
  146328. + if (type >= 0)
  146329. + {
  146330. + struct wifi_display_info *pwfd_info;
  146331. +
  146332. + pwfd_info = padapter->wdinfo.wfd_info;
  146333. +
  146334. + if ( _TRUE == pwfd_info->wfd_enable )
  146335. + {
  146336. + rtw_append_wfd_ie( padapter, pframe, &len );
  146337. + }
  146338. + }
  146339. + #endif // CONFIG_WFD
  146340. + pattrib->pktlen = len;
  146341. +
  146342. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  146343. + //update seq number
  146344. + pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
  146345. + pattrib->seqnum = pmlmeext->mgnt_seq;
  146346. + pmlmeext->mgnt_seq++;
  146347. +
  146348. +
  146349. + pattrib->last_txcmdsz = pattrib->pktlen;
  146350. +
  146351. + dump_mgntframe(padapter, pmgntframe);
  146352. +
  146353. + }
  146354. + else
  146355. + {
  146356. + DBG_8192C("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE));
  146357. + }
  146358. +
  146359. +
  146360. +fail:
  146361. +
  146362. + dev_kfree_skb(skb);
  146363. +
  146364. + return 0;
  146365. +
  146366. +}
  146367. +
  146368. +static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev)
  146369. +{
  146370. + DBG_8192C("%s\n", __func__);
  146371. +}
  146372. +
  146373. +static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr)
  146374. +{
  146375. + int ret = 0;
  146376. +
  146377. + DBG_8192C("%s\n", __func__);
  146378. +
  146379. + return ret;
  146380. +}
  146381. +
  146382. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  146383. +static const struct net_device_ops rtw_cfg80211_monitor_if_ops = {
  146384. + .ndo_open = rtw_cfg80211_monitor_if_open,
  146385. + .ndo_stop = rtw_cfg80211_monitor_if_close,
  146386. + .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry,
  146387. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0))
  146388. + .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list,
  146389. + #endif
  146390. + .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address,
  146391. +};
  146392. +#endif
  146393. +
  146394. +static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev)
  146395. +{
  146396. + int ret = 0;
  146397. + struct net_device* mon_ndev = NULL;
  146398. + struct wireless_dev* mon_wdev = NULL;
  146399. + struct rtw_netdev_priv_indicator *pnpi;
  146400. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  146401. +
  146402. + if (!name ) {
  146403. + DBG_871X(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter));
  146404. + ret = -EINVAL;
  146405. + goto out;
  146406. + }
  146407. +
  146408. + if (pwdev_priv->pmon_ndev) {
  146409. + DBG_871X(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n",
  146410. + FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev));
  146411. + ret = -EBUSY;
  146412. + goto out;
  146413. + }
  146414. +
  146415. + mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));
  146416. + if (!mon_ndev) {
  146417. + DBG_871X(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter));
  146418. + ret = -ENOMEM;
  146419. + goto out;
  146420. + }
  146421. +
  146422. + mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP;
  146423. + strncpy(mon_ndev->name, name, IFNAMSIZ);
  146424. + mon_ndev->name[IFNAMSIZ - 1] = 0;
  146425. + mon_ndev->destructor = rtw_ndev_destructor;
  146426. +
  146427. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  146428. + mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops;
  146429. +#else
  146430. + mon_ndev->open = rtw_cfg80211_monitor_if_open;
  146431. + mon_ndev->stop = rtw_cfg80211_monitor_if_close;
  146432. + mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry;
  146433. + mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address;
  146434. +#endif
  146435. +
  146436. + pnpi = netdev_priv(mon_ndev);
  146437. + pnpi->priv = padapter;
  146438. + pnpi->sizeof_priv = sizeof(_adapter);
  146439. +
  146440. + /* wdev */
  146441. + mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev));
  146442. + if (!mon_wdev) {
  146443. + DBG_871X(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter));
  146444. + ret = -ENOMEM;
  146445. + goto out;
  146446. + }
  146447. +
  146448. + mon_wdev->wiphy = padapter->rtw_wdev->wiphy;
  146449. + mon_wdev->netdev = mon_ndev;
  146450. + mon_wdev->iftype = NL80211_IFTYPE_MONITOR;
  146451. + mon_ndev->ieee80211_ptr = mon_wdev;
  146452. +
  146453. + ret = register_netdevice(mon_ndev);
  146454. + if (ret) {
  146455. + goto out;
  146456. + }
  146457. +
  146458. + *ndev = pwdev_priv->pmon_ndev = mon_ndev;
  146459. + _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1);
  146460. +
  146461. +out:
  146462. + if (ret && mon_wdev) {
  146463. + rtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev));
  146464. + mon_wdev = NULL;
  146465. + }
  146466. +
  146467. + if (ret && mon_ndev) {
  146468. + free_netdev(mon_ndev);
  146469. + *ndev = mon_ndev = NULL;
  146470. + }
  146471. +
  146472. + return ret;
  146473. +}
  146474. +
  146475. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  146476. +static struct wireless_dev *
  146477. +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  146478. +static struct net_device *
  146479. +#else
  146480. +static int
  146481. +#endif
  146482. + cfg80211_rtw_add_virtual_intf(
  146483. + struct wiphy *wiphy,
  146484. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0))
  146485. + const char *name,
  146486. + #else
  146487. + char *name,
  146488. + #endif
  146489. + enum nl80211_iftype type, u32 *flags, struct vif_params *params)
  146490. +{
  146491. + int ret = 0;
  146492. + struct net_device* ndev = NULL;
  146493. + _adapter *padapter = wiphy_to_adapter(wiphy);
  146494. +
  146495. + DBG_871X(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n",
  146496. + FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type);
  146497. +
  146498. + switch (type) {
  146499. + case NL80211_IFTYPE_ADHOC:
  146500. + case NL80211_IFTYPE_AP_VLAN:
  146501. + case NL80211_IFTYPE_WDS:
  146502. + case NL80211_IFTYPE_MESH_POINT:
  146503. + ret = -ENODEV;
  146504. + break;
  146505. + case NL80211_IFTYPE_MONITOR:
  146506. + ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev);
  146507. + break;
  146508. +
  146509. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  146510. + case NL80211_IFTYPE_P2P_CLIENT:
  146511. +#endif
  146512. + case NL80211_IFTYPE_STATION:
  146513. + ret = -ENODEV;
  146514. + break;
  146515. +
  146516. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  146517. + case NL80211_IFTYPE_P2P_GO:
  146518. +#endif
  146519. + case NL80211_IFTYPE_AP:
  146520. + ret = -ENODEV;
  146521. + break;
  146522. + default:
  146523. + ret = -ENODEV;
  146524. + DBG_871X("Unsupported interface type\n");
  146525. + break;
  146526. + }
  146527. +
  146528. + DBG_871X(FUNC_ADPT_FMT" ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), ndev, ret);
  146529. +
  146530. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  146531. + return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret);
  146532. +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  146533. + return ndev ? ndev : ERR_PTR(ret);
  146534. +#else
  146535. + return ret;
  146536. +#endif
  146537. +}
  146538. +
  146539. +static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy,
  146540. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  146541. + struct wireless_dev *wdev
  146542. +#else
  146543. + struct net_device *ndev
  146544. +#endif
  146545. +)
  146546. +{
  146547. + struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy);
  146548. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  146549. + struct net_device *ndev;
  146550. + ndev = wdev ? wdev->netdev : NULL;
  146551. +#endif
  146552. +
  146553. + if (!ndev)
  146554. + goto exit;
  146555. +
  146556. + unregister_netdevice(ndev);
  146557. +
  146558. + if (ndev == pwdev_priv->pmon_ndev) {
  146559. + pwdev_priv->pmon_ndev = NULL;
  146560. + pwdev_priv->ifname_mon[0] = '\0';
  146561. + DBG_871X(FUNC_NDEV_FMT" remove monitor interface\n", FUNC_NDEV_ARG(ndev));
  146562. + }
  146563. +
  146564. +exit:
  146565. + return 0;
  146566. +}
  146567. +
  146568. +static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len)
  146569. +{
  146570. + int ret=0;
  146571. + u8 *pbuf = NULL;
  146572. + uint len, wps_ielen=0;
  146573. + uint p2p_ielen=0;
  146574. + u8 *p2p_ie;
  146575. + u8 got_p2p_ie = _FALSE;
  146576. + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
  146577. + //struct sta_priv *pstapriv = &padapter->stapriv;
  146578. +
  146579. +
  146580. + DBG_8192C("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len);
  146581. +
  146582. +
  146583. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  146584. + return -EINVAL;
  146585. +
  146586. + if(head_len<24)
  146587. + return -EINVAL;
  146588. +
  146589. +
  146590. + pbuf = rtw_zmalloc(head_len+tail_len);
  146591. + if(!pbuf)
  146592. + return -ENOMEM;
  146593. +
  146594. +
  146595. + //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2);
  146596. +
  146597. + //if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0))
  146598. + // pstapriv->max_num_sta = NUM_STA;
  146599. +
  146600. +
  146601. + _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len.
  146602. + _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len);
  146603. +
  146604. + len = head_len+tail_len-24;
  146605. +
  146606. + //check wps ie if inclued
  146607. + if(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen))
  146608. + DBG_8192C("add bcn, wps_ielen=%d\n", wps_ielen);
  146609. +
  146610. +#ifdef CONFIG_P2P
  146611. + //check p2p ie if inclued
  146612. + if( adapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  146613. + {
  146614. + //check p2p if enable
  146615. + if(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen))
  146616. + {
  146617. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  146618. + struct wifidirect_info *pwdinfo= &(adapter->wdinfo);
  146619. +
  146620. + DBG_8192C("got p2p_ie, len=%d\n", p2p_ielen);
  146621. + got_p2p_ie = _TRUE;
  146622. +
  146623. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  146624. + {
  146625. + DBG_8192C("Enable P2P function for the first time\n");
  146626. + rtw_p2p_enable(adapter, P2P_ROLE_GO);
  146627. + wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = _TRUE;
  146628. + }
  146629. + else
  146630. + {
  146631. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  146632. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  146633. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  146634. +
  146635. + DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen);
  146636. +
  146637. + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
  146638. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
  146639. + pwdinfo->intent = 15;
  146640. + }
  146641. + }
  146642. + }
  146643. +#endif // CONFIG_P2P
  146644. +
  146645. + /* pbss_network->IEs will not include p2p_ie, wfd ie */
  146646. + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4);
  146647. + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4);
  146648. +
  146649. + if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS)
  146650. + {
  146651. +#ifdef CONFIG_P2P
  146652. + //check p2p if enable
  146653. + if(got_p2p_ie == _TRUE)
  146654. + {
  146655. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  146656. + struct wifidirect_info *pwdinfo= &(adapter->wdinfo);
  146657. + pwdinfo->operating_channel = pmlmeext->cur_channel;
  146658. + }
  146659. +#endif //CONFIG_P2P
  146660. + ret = 0;
  146661. + }
  146662. + else
  146663. + {
  146664. + ret = -EINVAL;
  146665. + }
  146666. +
  146667. +
  146668. + rtw_mfree(pbuf, head_len+tail_len);
  146669. +
  146670. + return ret;
  146671. +}
  146672. +
  146673. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE)
  146674. +static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev,
  146675. + struct beacon_parameters *info)
  146676. +{
  146677. + int ret=0;
  146678. + _adapter *adapter = wiphy_to_adapter(wiphy);
  146679. +
  146680. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146681. + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len);
  146682. +
  146683. + return ret;
  146684. +}
  146685. +
  146686. +static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev,
  146687. + struct beacon_parameters *info)
  146688. +{
  146689. + _adapter *padapter = wiphy_to_adapter(wiphy);
  146690. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146691. +
  146692. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146693. +
  146694. + pmlmeext->bstart_bss = _TRUE;
  146695. +
  146696. + cfg80211_rtw_add_beacon(wiphy, ndev, info);
  146697. +
  146698. + return 0;
  146699. +}
  146700. +
  146701. +static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev)
  146702. +{
  146703. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146704. +
  146705. + return 0;
  146706. +}
  146707. +#else
  146708. +static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
  146709. + struct cfg80211_ap_settings *settings)
  146710. +{
  146711. + int ret = 0;
  146712. + _adapter *adapter = wiphy_to_adapter(wiphy);
  146713. +
  146714. + DBG_871X(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev),
  146715. + settings->hidden_ssid, settings->auth_type);
  146716. +
  146717. + ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len,
  146718. + settings->beacon.tail, settings->beacon.tail_len);
  146719. +
  146720. + adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid;
  146721. +
  146722. + if (settings->ssid && settings->ssid_len) {
  146723. + WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network;
  146724. + WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network;
  146725. +
  146726. + if(0)
  146727. + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),
  146728. + settings->ssid, settings->ssid_len,
  146729. + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);
  146730. +
  146731. + _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len);
  146732. + pbss_network->Ssid.SsidLength = settings->ssid_len;
  146733. + _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len);
  146734. + pbss_network_ext->Ssid.SsidLength = settings->ssid_len;
  146735. +
  146736. + if(0)
  146737. + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
  146738. + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
  146739. + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
  146740. + }
  146741. +
  146742. + return ret;
  146743. +}
  146744. +
  146745. +static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev,
  146746. + struct cfg80211_beacon_data *info)
  146747. +{
  146748. + int ret = 0;
  146749. + _adapter *adapter = wiphy_to_adapter(wiphy);
  146750. +
  146751. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146752. +
  146753. + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len);
  146754. +
  146755. + return ret;
  146756. +}
  146757. +
  146758. +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
  146759. +{
  146760. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146761. + return 0;
  146762. +}
  146763. +
  146764. +#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
  146765. +
  146766. +static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev,
  146767. + u8 *mac, struct station_parameters *params)
  146768. +{
  146769. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146770. +
  146771. + return 0;
  146772. +}
  146773. +
  146774. +static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev,
  146775. + u8 *mac)
  146776. +{
  146777. + int ret=0;
  146778. + _irqL irqL;
  146779. + _list *phead, *plist;
  146780. + u8 updated;
  146781. + struct sta_info *psta = NULL;
  146782. + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  146783. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  146784. + struct sta_priv *pstapriv = &padapter->stapriv;
  146785. +
  146786. + DBG_871X("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146787. +
  146788. + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)
  146789. + {
  146790. + DBG_8192C("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__);
  146791. + return -EINVAL;
  146792. + }
  146793. +
  146794. +
  146795. + if(!mac)
  146796. + {
  146797. + DBG_8192C("flush all sta, and cam_entry\n");
  146798. +
  146799. + flush_all_cam_entry(padapter); //clear CAM
  146800. +
  146801. + ret = rtw_sta_flush(padapter);
  146802. +
  146803. + return ret;
  146804. + }
  146805. +
  146806. +
  146807. + DBG_8192C("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac));
  146808. +
  146809. + if (mac[0] == 0xff && mac[1] == 0xff &&
  146810. + mac[2] == 0xff && mac[3] == 0xff &&
  146811. + mac[4] == 0xff && mac[5] == 0xff)
  146812. + {
  146813. + return -EINVAL;
  146814. + }
  146815. +
  146816. +
  146817. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  146818. +
  146819. + phead = &pstapriv->asoc_list;
  146820. + plist = get_next(phead);
  146821. +
  146822. + //check asoc_queue
  146823. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  146824. + {
  146825. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  146826. +
  146827. + plist = get_next(plist);
  146828. +
  146829. + if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN))
  146830. + {
  146831. + if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE)
  146832. + {
  146833. + DBG_8192C("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__);
  146834. + }
  146835. + else
  146836. + {
  146837. + DBG_8192C("free psta=%p, aid=%d\n", psta, psta->aid);
  146838. +
  146839. + rtw_list_delete(&psta->asoc_list);
  146840. + pstapriv->asoc_list_cnt--;
  146841. +
  146842. + //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  146843. + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);
  146844. + //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  146845. +
  146846. + psta = NULL;
  146847. +
  146848. + break;
  146849. + }
  146850. +
  146851. + }
  146852. +
  146853. + }
  146854. +
  146855. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  146856. +
  146857. + associated_clients_update(padapter, updated);
  146858. +
  146859. + DBG_871X("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146860. +
  146861. + return ret;
  146862. +
  146863. +}
  146864. +
  146865. +static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev,
  146866. + u8 *mac, struct station_parameters *params)
  146867. +{
  146868. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146869. +
  146870. + return 0;
  146871. +}
  146872. +
  146873. +static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev,
  146874. + int idx, u8 *mac, struct station_info *sinfo)
  146875. +{
  146876. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146877. +
  146878. + //TODO: dump scanned queue
  146879. +
  146880. + return -ENOENT;
  146881. +}
  146882. +
  146883. +static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
  146884. + struct bss_parameters *params)
  146885. +{
  146886. + u8 i;
  146887. +
  146888. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146889. +/*
  146890. + DBG_8192C("use_cts_prot=%d\n", params->use_cts_prot);
  146891. + DBG_8192C("use_short_preamble=%d\n", params->use_short_preamble);
  146892. + DBG_8192C("use_short_slot_time=%d\n", params->use_short_slot_time);
  146893. + DBG_8192C("ap_isolate=%d\n", params->ap_isolate);
  146894. +
  146895. + DBG_8192C("basic_rates_len=%d\n", params->basic_rates_len);
  146896. + for(i=0; i<params->basic_rates_len; i++)
  146897. + {
  146898. + DBG_8192C("basic_rates=%d\n", params->basic_rates[i]);
  146899. +
  146900. + }
  146901. +*/
  146902. + return 0;
  146903. +
  146904. +}
  146905. +
  146906. +static int cfg80211_rtw_set_channel(struct wiphy *wiphy
  146907. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  146908. + , struct net_device *ndev
  146909. + #endif
  146910. + , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type)
  146911. +{
  146912. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  146913. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146914. + #endif
  146915. +
  146916. + return 0;
  146917. +}
  146918. +
  146919. +static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev,
  146920. + struct cfg80211_auth_request *req)
  146921. +{
  146922. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146923. +
  146924. + return 0;
  146925. +}
  146926. +
  146927. +static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev,
  146928. + struct cfg80211_assoc_request *req)
  146929. +{
  146930. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  146931. +
  146932. + return 0;
  146933. +}
  146934. +#endif //CONFIG_AP_MODE
  146935. +
  146936. +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)
  146937. +{
  146938. + int type;
  146939. + s32 freq;
  146940. + int channel;
  146941. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146942. + u8 category, action;
  146943. +
  146944. + channel = rtw_get_oper_ch(padapter);
  146945. +
  146946. + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);
  146947. + #ifdef CONFIG_P2P
  146948. + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE);
  146949. + if (type >= 0)
  146950. + goto indicate;
  146951. + #endif
  146952. + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action);
  146953. + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);
  146954. +
  146955. +indicate:
  146956. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  146957. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  146958. + else
  146959. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  146960. +
  146961. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  146962. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);
  146963. +#else
  146964. + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);
  146965. +#endif
  146966. +}
  146967. +
  146968. +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)
  146969. +{
  146970. + int type;
  146971. + s32 freq;
  146972. + int channel;
  146973. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  146974. + u8 category, action;
  146975. +
  146976. + channel = rtw_get_oper_ch(padapter);
  146977. +
  146978. + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);
  146979. + #ifdef CONFIG_P2P
  146980. + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE);
  146981. + if (type >= 0) {
  146982. + switch (type) {
  146983. + case P2P_GO_NEGO_CONF:
  146984. + case P2P_PROVISION_DISC_RESP:
  146985. + case P2P_INVIT_RESP:
  146986. + rtw_set_scan_deny(padapter, 2000);
  146987. + rtw_clear_scan_deny(padapter);
  146988. + }
  146989. + goto indicate;
  146990. + }
  146991. + #endif
  146992. + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action);
  146993. + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);
  146994. +
  146995. +indicate:
  146996. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  146997. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  146998. + else
  146999. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  147000. +
  147001. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147002. + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);
  147003. +#else
  147004. + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);
  147005. +#endif
  147006. +}
  147007. +
  147008. +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg)
  147009. +{
  147010. + s32 freq;
  147011. + int channel;
  147012. + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
  147013. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev);
  147014. + u8 category, action;
  147015. +
  147016. + channel = rtw_get_oper_ch(adapter);
  147017. +
  147018. + rtw_action_frame_parse(frame, frame_len, &category, &action);
  147019. +
  147020. + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);
  147021. + if (msg)
  147022. + DBG_871X("RTW_Rx:%s\n", msg);
  147023. + else
  147024. + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);
  147025. +
  147026. + if (channel <= RTW_CH_MAX_2G_CHANNEL)
  147027. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);
  147028. + else
  147029. + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);
  147030. +
  147031. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147032. + rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);
  147033. +#else
  147034. + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC);
  147035. +#endif
  147036. +
  147037. +}
  147038. +
  147039. +#ifdef CONFIG_P2P
  147040. +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len)
  147041. +{
  147042. + u16 wps_devicepassword_id = 0x0000;
  147043. + uint wps_devicepassword_id_len = 0;
  147044. + u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 };
  147045. + uint p2p_ielen = 0;
  147046. + uint wpsielen = 0;
  147047. + u32 devinfo_contentlen = 0;
  147048. + u8 devinfo_content[64] = { 0x00 };
  147049. + u16 capability = 0;
  147050. + uint capability_len = 0;
  147051. +
  147052. + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
  147053. + u8 action = P2P_PUB_ACTION_ACTION;
  147054. + u8 dialogToken = 1;
  147055. + u32 p2poui = cpu_to_be32(P2POUI);
  147056. + u8 oui_subtype = P2P_PROVISION_DISC_REQ;
  147057. + u32 p2pielen = 0;
  147058. +#ifdef CONFIG_WFD
  147059. + u32 wfdielen = 0;
  147060. +#endif //CONFIG_WFD
  147061. +
  147062. + struct xmit_frame *pmgntframe;
  147063. + struct pkt_attrib *pattrib;
  147064. + unsigned char *pframe;
  147065. + struct rtw_ieee80211_hdr *pwlanhdr;
  147066. + unsigned short *fctrl;
  147067. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  147068. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  147069. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  147070. +
  147071. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  147072. + u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));
  147073. + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr);
  147074. +
  147075. +
  147076. + DBG_871X( "[%s] In\n", __FUNCTION__ );
  147077. +
  147078. + //prepare for building provision_request frame
  147079. + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN);
  147080. + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN);
  147081. +
  147082. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;
  147083. +
  147084. + rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);
  147085. + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);
  147086. + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );
  147087. +
  147088. + switch(wps_devicepassword_id)
  147089. + {
  147090. + case WPS_DPID_PIN:
  147091. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL;
  147092. + break;
  147093. + case WPS_DPID_USER_SPEC:
  147094. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA;
  147095. + break;
  147096. + case WPS_DPID_MACHINE_SPEC:
  147097. + break;
  147098. + case WPS_DPID_REKEY:
  147099. + break;
  147100. + case WPS_DPID_PBC:
  147101. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;
  147102. + break;
  147103. + case WPS_DPID_REGISTRAR_SPEC:
  147104. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD;
  147105. + break;
  147106. + default:
  147107. + break;
  147108. + }
  147109. +
  147110. +
  147111. + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) )
  147112. + {
  147113. +
  147114. + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen);
  147115. + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len);
  147116. +
  147117. + }
  147118. +
  147119. +
  147120. + //start to build provision_request frame
  147121. + _rtw_memset(wpsie, 0, sizeof(wpsie));
  147122. + _rtw_memset(p2p_ie, 0, sizeof(p2p_ie));
  147123. + p2p_ielen = 0;
  147124. +
  147125. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  147126. + {
  147127. + return;
  147128. + }
  147129. +
  147130. +
  147131. + //update attribute
  147132. + pattrib = &pmgntframe->attrib;
  147133. + update_mgntframe_attrib(padapter, pattrib);
  147134. +
  147135. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  147136. +
  147137. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  147138. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  147139. +
  147140. + fctrl = &(pwlanhdr->frame_ctl);
  147141. + *(fctrl) = 0;
  147142. +
  147143. + _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN);
  147144. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
  147145. + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN);
  147146. +
  147147. + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  147148. + pmlmeext->mgnt_seq++;
  147149. + SetFrameSubType(pframe, WIFI_ACTION);
  147150. +
  147151. + pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  147152. + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  147153. +
  147154. + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  147155. + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
  147156. + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));
  147157. + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));
  147158. + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));
  147159. +
  147160. +
  147161. + //build_prov_disc_request_p2p_ie
  147162. + // P2P OUI
  147163. + p2pielen = 0;
  147164. + p2p_ie[ p2pielen++ ] = 0x50;
  147165. + p2p_ie[ p2pielen++ ] = 0x6F;
  147166. + p2p_ie[ p2pielen++ ] = 0x9A;
  147167. + p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0
  147168. +
  147169. + // Commented by Albert 20110301
  147170. + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes
  147171. + // 1. P2P Capability
  147172. + // 2. Device Info
  147173. + // 3. Group ID ( When joining an operating P2P Group )
  147174. +
  147175. + // P2P Capability ATTR
  147176. + // Type:
  147177. + p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
  147178. +
  147179. + // Length:
  147180. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
  147181. + RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002);
  147182. + p2pielen += 2;
  147183. +
  147184. + // Value:
  147185. + // Device Capability Bitmap, 1 byte
  147186. + // Group Capability Bitmap, 1 byte
  147187. + _rtw_memcpy(p2p_ie + p2pielen, &capability, 2);
  147188. + p2pielen += 2;
  147189. +
  147190. +
  147191. + // Device Info ATTR
  147192. + // Type:
  147193. + p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
  147194. +
  147195. + // Length:
  147196. + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes)
  147197. + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
  147198. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
  147199. + RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen);
  147200. + p2pielen += 2;
  147201. +
  147202. + // Value:
  147203. + _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen);
  147204. + p2pielen += devinfo_contentlen;
  147205. +
  147206. +
  147207. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen);
  147208. + //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr);
  147209. + //pframe += p2pielen;
  147210. + pattrib->pktlen += p2p_ielen;
  147211. +
  147212. + wpsielen = 0;
  147213. + // WPS OUI
  147214. + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
  147215. + wpsielen += 4;
  147216. +
  147217. + // WPS version
  147218. + // Type:
  147219. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
  147220. + wpsielen += 2;
  147221. +
  147222. + // Length:
  147223. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
  147224. + wpsielen += 2;
  147225. +
  147226. + // Value:
  147227. + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0
  147228. +
  147229. + // Config Method
  147230. + // Type:
  147231. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
  147232. + wpsielen += 2;
  147233. +
  147234. + // Length:
  147235. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
  147236. + wpsielen += 2;
  147237. +
  147238. + // Value:
  147239. + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request );
  147240. + wpsielen += 2;
  147241. +
  147242. + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );
  147243. +
  147244. +
  147245. +#ifdef CONFIG_WFD
  147246. + wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
  147247. + pframe += wfdielen;
  147248. + pattrib->pktlen += wfdielen;
  147249. +#endif //CONFIG_WFD
  147250. +
  147251. + pattrib->last_txcmdsz = pattrib->pktlen;
  147252. +
  147253. + //dump_mgntframe(padapter, pmgntframe);
  147254. + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS)
  147255. + DBG_8192C("%s, ack to\n", __func__);
  147256. +
  147257. + //if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)
  147258. + //{
  147259. + // DBG_8192C("waiting for p2p peer key-in PIN CODE\n");
  147260. + // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req.
  147261. + //}
  147262. +
  147263. +}
  147264. +
  147265. +static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
  147266. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  147267. + struct wireless_dev *wdev,
  147268. +#else
  147269. + struct net_device *ndev,
  147270. +#endif
  147271. + struct ieee80211_channel * channel,
  147272. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  147273. + enum nl80211_channel_type channel_type,
  147274. +#endif
  147275. + unsigned int duration, u64 *cookie)
  147276. +{
  147277. + s32 err = 0;
  147278. + _adapter *padapter = wiphy_to_adapter(wiphy);
  147279. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  147280. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  147281. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  147282. + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
  147283. + u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq);
  147284. + u8 ready_on_channel = _FALSE;
  147285. +
  147286. + DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration);
  147287. +
  147288. + if(pcfg80211_wdinfo->is_ro_ch == _TRUE)
  147289. + {
  147290. + DBG_8192C("%s, cancel ro ch timer\n", __func__);
  147291. +
  147292. + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
  147293. +
  147294. +#ifdef CONFIG_CONCURRENT_MODE
  147295. + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);
  147296. +#endif //CONFIG_CONCURRENT_MODE
  147297. +
  147298. + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);
  147299. + }
  147300. +
  147301. + pcfg80211_wdinfo->is_ro_ch = _TRUE;
  147302. +
  147303. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  147304. + err = -EFAULT;
  147305. + goto exit;
  147306. + }
  147307. +
  147308. + _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel));
  147309. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  147310. + pcfg80211_wdinfo->remain_on_ch_type= channel_type;
  147311. + #endif
  147312. + pcfg80211_wdinfo->remain_on_ch_cookie= *cookie;
  147313. +
  147314. + rtw_scan_abort(padapter);
  147315. +#ifdef CONFIG_CONCURRENT_MODE
  147316. + if(rtw_buddy_adapter_up(padapter))
  147317. + rtw_scan_abort(padapter->pbuddy_adapter);
  147318. +#endif //CONFIG_CONCURRENT_MODE
  147319. +
  147320. + //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  147321. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  147322. + {
  147323. + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE);
  147324. + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE;
  147325. + }
  147326. + else
  147327. + {
  147328. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  147329. +#ifdef CONFIG_DEBUG_CFG80211
  147330. + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
  147331. +#endif
  147332. + }
  147333. +
  147334. +
  147335. + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
  147336. +
  147337. +
  147338. + if(duration < 400)
  147339. + duration = duration*3;//extend from exper.
  147340. +
  147341. +
  147342. +#ifdef CONFIG_CONCURRENT_MODE
  147343. + if(check_buddy_fwstate(padapter, _FW_LINKED) &&
  147344. + (duration<pwdinfo->ext_listen_interval))
  147345. + {
  147346. + duration = duration + pwdinfo->ext_listen_interval;
  147347. + }
  147348. +#endif
  147349. +
  147350. + pcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter);
  147351. +
  147352. + if(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) {
  147353. +#ifdef CONFIG_CONCURRENT_MODE
  147354. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  147355. + {
  147356. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  147357. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  147358. +
  147359. + if(remain_ch != pbuddy_mlmeext->cur_channel)
  147360. + {
  147361. + if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 ||
  147362. + (remain_ch != pmlmeext->cur_channel))
  147363. + {
  147364. + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__);
  147365. + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);
  147366. +
  147367. + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0);
  147368. +
  147369. + DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval);
  147370. + _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);
  147371. + }
  147372. + }
  147373. +
  147374. + ready_on_channel = _TRUE;
  147375. + //pmlmeext->cur_channel = remain_ch;
  147376. + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  147377. + }else
  147378. +#endif //CONFIG_CONCURRENT_MODE
  147379. + if(remain_ch != pmlmeext->cur_channel )
  147380. + {
  147381. + ready_on_channel = _TRUE;
  147382. + //pmlmeext->cur_channel = remain_ch;
  147383. + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  147384. + }
  147385. + } else {
  147386. + DBG_871X("%s remain_ch:%u not in channel plan!!!!\n", __FUNCTION__, remain_ch);
  147387. + }
  147388. +
  147389. +
  147390. + //call this after other things have been done
  147391. +#ifdef CONFIG_CONCURRENT_MODE
  147392. + if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 ||
  147393. + (remain_ch != pmlmeext->cur_channel))
  147394. + {
  147395. + u8 co_channel = 0xff;
  147396. + ATOMIC_SET(&pwdev_priv->ro_ch_to, 0);
  147397. +#endif
  147398. +
  147399. + if(ready_on_channel == _TRUE)
  147400. + {
  147401. + if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) )
  147402. + pmlmeext->cur_channel = remain_ch;
  147403. +
  147404. +#ifdef CONFIG_CONCURRENT_MODE
  147405. + co_channel = rtw_get_oper_ch(padapter);
  147406. +
  147407. + if(co_channel !=remain_ch)
  147408. +#endif
  147409. + {
  147410. + if (!padapter->mlmepriv.LinkDetectInfo.bBusyTraffic)
  147411. + set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  147412. + }
  147413. + }
  147414. + DBG_8192C("%s, set ro ch timer, duration=%d\n", __func__, duration);
  147415. + _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration);
  147416. +
  147417. +#ifdef CONFIG_CONCURRENT_MODE
  147418. + }
  147419. +#endif
  147420. +
  147421. + rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL);
  147422. +
  147423. +exit:
  147424. + if (err)
  147425. + pcfg80211_wdinfo->is_ro_ch = _FALSE;
  147426. +
  147427. + return err;
  147428. +}
  147429. +
  147430. +static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
  147431. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  147432. + struct wireless_dev *wdev,
  147433. +#else
  147434. + struct net_device *ndev,
  147435. +#endif
  147436. + u64 cookie)
  147437. +{
  147438. + s32 err = 0;
  147439. + _adapter *padapter = wiphy_to_adapter(wiphy);
  147440. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  147441. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  147442. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  147443. + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
  147444. +
  147445. + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
  147446. +
  147447. + if (pcfg80211_wdinfo->is_ro_ch == _TRUE) {
  147448. + DBG_8192C("%s, cancel ro ch timer\n", __func__);
  147449. + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
  147450. + #ifdef CONFIG_CONCURRENT_MODE
  147451. + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);
  147452. + #endif
  147453. + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);
  147454. + }
  147455. +
  147456. + #if 0
  147457. + // Disable P2P Listen State
  147458. + if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  147459. + {
  147460. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  147461. + {
  147462. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  147463. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  147464. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  147465. +
  147466. + rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
  147467. + _rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info));
  147468. + }
  147469. + }
  147470. + else
  147471. + #endif
  147472. + {
  147473. + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
  147474. +#ifdef CONFIG_DEBUG_CFG80211
  147475. + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
  147476. +#endif
  147477. + }
  147478. + pcfg80211_wdinfo->is_ro_ch = _FALSE;
  147479. +
  147480. + return err;
  147481. +}
  147482. +
  147483. +#endif //CONFIG_P2P
  147484. +
  147485. +static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len)
  147486. +{
  147487. + struct xmit_frame *pmgntframe;
  147488. + struct pkt_attrib *pattrib;
  147489. + unsigned char *pframe;
  147490. + int ret = _FAIL;
  147491. + bool ack = _TRUE;
  147492. + struct rtw_ieee80211_hdr *pwlanhdr;
  147493. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  147494. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  147495. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  147496. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  147497. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  147498. + //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
  147499. +
  147500. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  147501. + ret = -EFAULT;
  147502. + goto exit;
  147503. + }
  147504. +
  147505. + rtw_set_scan_deny(padapter, 1000);
  147506. +
  147507. + rtw_scan_abort(padapter);
  147508. + #ifdef CONFIG_CONCURRENT_MODE
  147509. + if(rtw_buddy_adapter_up(padapter))
  147510. + rtw_scan_abort(padapter->pbuddy_adapter);
  147511. + #endif /* CONFIG_CONCURRENT_MODE */
  147512. +
  147513. + if (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) {
  147514. + //DBG_8192C("%s, cancel ro ch timer\n", __func__);
  147515. + //_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
  147516. + //padapter->cfg80211_wdinfo.is_ro_ch = _FALSE;
  147517. + #ifdef CONFIG_CONCURRENT_MODE
  147518. + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))
  147519. + {
  147520. + DBG_8192C("%s, extend ro ch time\n", __func__);
  147521. + _set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period);
  147522. + }
  147523. + #endif //CONFIG_CONCURRENT_MODE
  147524. + }
  147525. +
  147526. +#ifdef CONFIG_CONCURRENT_MODE
  147527. + if (check_buddy_fwstate(padapter, _FW_LINKED )) {
  147528. + u8 co_channel=0xff;
  147529. + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  147530. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  147531. +
  147532. + co_channel = rtw_get_oper_ch(padapter);
  147533. +
  147534. + if (tx_ch != pbuddy_mlmeext->cur_channel) {
  147535. +
  147536. + u16 ext_listen_period;
  147537. +
  147538. + if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) {
  147539. + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__);
  147540. + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);
  147541. +
  147542. + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0);
  147543. +
  147544. + //DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period);
  147545. + //_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period);
  147546. + }
  147547. +
  147548. + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED ))
  147549. + {
  147550. + ext_listen_period = 500;// 500ms
  147551. + }
  147552. + else
  147553. + {
  147554. + ext_listen_period = pwdinfo->ext_listen_period;
  147555. + }
  147556. +
  147557. + DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, ext_listen_period);
  147558. + _set_timer(&pwdinfo->ap_p2p_switch_timer, ext_listen_period);
  147559. +
  147560. + }
  147561. +
  147562. + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))
  147563. + pmlmeext->cur_channel = tx_ch;
  147564. +
  147565. + if (tx_ch != co_channel)
  147566. + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  147567. + }else
  147568. +#endif //CONFIG_CONCURRENT_MODE
  147569. + //if (tx_ch != pmlmeext->cur_channel) {
  147570. + if(tx_ch != rtw_get_oper_ch(padapter)) {
  147571. + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))
  147572. + pmlmeext->cur_channel = tx_ch;
  147573. + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  147574. + }
  147575. +
  147576. + //starting alloc mgmt frame to dump it
  147577. + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
  147578. + {
  147579. + //ret = -ENOMEM;
  147580. + ret = _FAIL;
  147581. + goto exit;
  147582. + }
  147583. +
  147584. + //update attribute
  147585. + pattrib = &pmgntframe->attrib;
  147586. + update_mgntframe_attrib(padapter, pattrib);
  147587. + pattrib->retry_ctrl = _FALSE;
  147588. +
  147589. + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  147590. +
  147591. + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  147592. +
  147593. + _rtw_memcpy(pframe, (void*)buf, len);
  147594. + pattrib->pktlen = len;
  147595. +
  147596. + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  147597. + //update seq number
  147598. + pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
  147599. + pattrib->seqnum = pmlmeext->mgnt_seq;
  147600. + pmlmeext->mgnt_seq++;
  147601. +
  147602. +#ifdef CONFIG_WFD
  147603. + {
  147604. + struct wifi_display_info *pwfd_info;
  147605. +
  147606. + pwfd_info = padapter->wdinfo.wfd_info;
  147607. +
  147608. + if ( _TRUE == pwfd_info->wfd_enable )
  147609. + {
  147610. + rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen );
  147611. + }
  147612. + }
  147613. +#endif // CONFIG_WFD
  147614. +
  147615. + pattrib->last_txcmdsz = pattrib->pktlen;
  147616. +
  147617. + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS)
  147618. + {
  147619. + ack = _FALSE;
  147620. + ret = _FAIL;
  147621. +
  147622. + #ifdef CONFIG_DEBUG_CFG80211
  147623. + DBG_8192C("%s, ack == _FAIL\n", __func__);
  147624. + #endif
  147625. + }
  147626. + else
  147627. + {
  147628. + #ifdef CONFIG_DEBUG_CFG80211
  147629. + DBG_8192C("%s, ack=%d, ok!\n", __func__, ack);
  147630. + #endif
  147631. + ret = _SUCCESS;
  147632. + }
  147633. +
  147634. +exit:
  147635. +
  147636. + #ifdef CONFIG_DEBUG_CFG80211
  147637. + DBG_8192C("%s, ret=%d\n", __func__, ret);
  147638. + #endif
  147639. +
  147640. + return ret;
  147641. +
  147642. +}
  147643. +
  147644. +static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy,
  147645. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
  147646. + struct wireless_dev *wdev,
  147647. +#else
  147648. + struct net_device *ndev,
  147649. +#endif
  147650. + struct ieee80211_channel *chan,
  147651. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  147652. + bool offchan,
  147653. +#endif
  147654. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  147655. + enum nl80211_channel_type channel_type,
  147656. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147657. + bool channel_type_valid,
  147658. + #endif
  147659. +#endif
  147660. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  147661. + unsigned int wait,
  147662. +#endif
  147663. + const u8 *buf, size_t len,
  147664. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
  147665. + bool no_cck,
  147666. +#endif
  147667. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
  147668. + bool dont_wait_for_ack,
  147669. +#endif
  147670. + u64 *cookie)
  147671. +{
  147672. + _adapter *padapter = (_adapter *)wiphy_to_adapter(wiphy);
  147673. + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
  147674. + int ret = 0;
  147675. + int tx_ret;
  147676. + u32 dump_limit = RTW_MAX_MGMT_TX_CNT;
  147677. + u32 dump_cnt = 0;
  147678. + bool ack = _TRUE;
  147679. + u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq);
  147680. + u8 category, action;
  147681. + int type = (-1);
  147682. + u32 start = rtw_get_current_time();
  147683. +
  147684. + /* cookie generation */
  147685. + *cookie = (unsigned long) buf;
  147686. +
  147687. +#ifdef CONFIG_DEBUG_CFG80211
  147688. + DBG_871X(FUNC_ADPT_FMT" len=%zu, ch=%d"
  147689. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  147690. + ", ch_type=%d"
  147691. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147692. + ", channel_type_valid=%d"
  147693. + #endif
  147694. + #endif
  147695. + "\n", FUNC_ADPT_ARG(padapter),
  147696. + len, tx_ch
  147697. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
  147698. + , channel_type
  147699. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147700. + , channel_type_valid
  147701. + #endif
  147702. + #endif
  147703. + );
  147704. +#endif /* CONFIG_DEBUG_CFG80211 */
  147705. +
  147706. + /* indicate ack before issue frame to avoid racing with rsp frame */
  147707. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  147708. + rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL);
  147709. +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))
  147710. + cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL);
  147711. +#endif
  147712. +
  147713. + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) {
  147714. + DBG_8192C(FUNC_ADPT_FMT" frame_control:0x%x\n", FUNC_ADPT_ARG(padapter),
  147715. + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl));
  147716. + goto exit;
  147717. + }
  147718. +
  147719. + DBG_8192C("RTW_Tx:tx_ch=%d, da="MAC_FMT"\n", tx_ch, MAC_ARG(GetAddr1Ptr(buf)));
  147720. + #ifdef CONFIG_P2P
  147721. + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) {
  147722. + goto dump;
  147723. + }
  147724. + #endif
  147725. + if (category == RTW_WLAN_CATEGORY_PUBLIC)
  147726. + DBG_871X("RTW_Tx:%s\n", action_public_str(action));
  147727. + else
  147728. + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action);
  147729. +
  147730. +dump:
  147731. + do {
  147732. + dump_cnt++;
  147733. + tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);
  147734. + } while (dump_cnt < dump_limit && tx_ret != _SUCCESS);
  147735. +
  147736. + if (tx_ret != _SUCCESS || dump_cnt > 1) {
  147737. + DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter),
  147738. + tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start));
  147739. + }
  147740. +
  147741. + switch (type) {
  147742. + case P2P_GO_NEGO_CONF:
  147743. + rtw_clear_scan_deny(padapter);
  147744. + break;
  147745. + case P2P_INVIT_RESP:
  147746. + if (pwdev_priv->invit_info.flags & BIT(0)
  147747. + && pwdev_priv->invit_info.status == 0)
  147748. + {
  147749. + DBG_871X(FUNC_ADPT_FMT" agree with invitation of persistent group\n",
  147750. + FUNC_ADPT_ARG(padapter));
  147751. + rtw_set_scan_deny(padapter, 5000);
  147752. + rtw_pwr_wakeup_ex(padapter, 5000);
  147753. + rtw_clear_scan_deny(padapter);
  147754. + }
  147755. + break;
  147756. + }
  147757. +
  147758. +exit:
  147759. + return ret;
  147760. +}
  147761. +
  147762. +static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
  147763. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
  147764. + struct wireless_dev *wdev,
  147765. +#else
  147766. + struct net_device *ndev,
  147767. +#endif
  147768. + u16 frame_type, bool reg)
  147769. +{
  147770. + _adapter *adapter = wiphy_to_adapter(wiphy);
  147771. +
  147772. +#ifdef CONFIG_DEBUG_CFG80211
  147773. + DBG_871X(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter),
  147774. + frame_type, reg);
  147775. +#endif
  147776. +
  147777. + if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
  147778. + return;
  147779. +
  147780. + return;
  147781. +}
  147782. +
  147783. +static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len)
  147784. +{
  147785. + int ret = 0;
  147786. + uint wps_ielen = 0;
  147787. + u8 *wps_ie;
  147788. + u32 p2p_ielen = 0;
  147789. + u8 wps_oui[8]={0x0,0x50,0xf2,0x04};
  147790. + u8 *p2p_ie;
  147791. + u32 wfd_ielen = 0;
  147792. + u8 *wfd_ie;
  147793. + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  147794. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  147795. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  147796. +
  147797. + DBG_871X(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len);
  147798. +
  147799. + if(len>0)
  147800. + {
  147801. + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))
  147802. + {
  147803. + #ifdef CONFIG_DEBUG_CFG80211
  147804. + DBG_8192C("bcn_wps_ielen=%d\n", wps_ielen);
  147805. + #endif
  147806. +
  147807. + if(pmlmepriv->wps_beacon_ie)
  147808. + {
  147809. + u32 free_len = pmlmepriv->wps_beacon_ie_len;
  147810. + pmlmepriv->wps_beacon_ie_len = 0;
  147811. + rtw_mfree(pmlmepriv->wps_beacon_ie, free_len);
  147812. + pmlmepriv->wps_beacon_ie = NULL;
  147813. + }
  147814. +
  147815. + pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen);
  147816. + if ( pmlmepriv->wps_beacon_ie == NULL) {
  147817. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  147818. + return -EINVAL;
  147819. +
  147820. + }
  147821. +
  147822. + _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen);
  147823. + pmlmepriv->wps_beacon_ie_len = wps_ielen;
  147824. +
  147825. + update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE);
  147826. +
  147827. + }
  147828. +
  147829. + //buf += wps_ielen;
  147830. + //len -= wps_ielen;
  147831. +
  147832. + #ifdef CONFIG_P2P
  147833. + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen)))
  147834. + {
  147835. + #ifdef CONFIG_DEBUG_CFG80211
  147836. + DBG_8192C("bcn_p2p_ielen=%d\n", p2p_ielen);
  147837. + #endif
  147838. +
  147839. + if(pmlmepriv->p2p_beacon_ie)
  147840. + {
  147841. + u32 free_len = pmlmepriv->p2p_beacon_ie_len;
  147842. + pmlmepriv->p2p_beacon_ie_len = 0;
  147843. + rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len);
  147844. + pmlmepriv->p2p_beacon_ie = NULL;
  147845. + }
  147846. +
  147847. + pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen);
  147848. + if ( pmlmepriv->p2p_beacon_ie == NULL) {
  147849. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  147850. + return -EINVAL;
  147851. +
  147852. + }
  147853. +
  147854. + _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen);
  147855. + pmlmepriv->p2p_beacon_ie_len = p2p_ielen;
  147856. +
  147857. + }
  147858. + #endif //CONFIG_P2P
  147859. +
  147860. + //buf += p2p_ielen;
  147861. + //len -= p2p_ielen;
  147862. +
  147863. + #ifdef CONFIG_WFD
  147864. + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen))
  147865. + {
  147866. + #ifdef CONFIG_DEBUG_CFG80211
  147867. + DBG_8192C("bcn_wfd_ielen=%d\n", wfd_ielen);
  147868. + #endif
  147869. +
  147870. + if(pmlmepriv->wfd_beacon_ie)
  147871. + {
  147872. + u32 free_len = pmlmepriv->wfd_beacon_ie_len;
  147873. + pmlmepriv->wfd_beacon_ie_len = 0;
  147874. + rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len);
  147875. + pmlmepriv->wfd_beacon_ie = NULL;
  147876. + }
  147877. +
  147878. + pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen);
  147879. + if ( pmlmepriv->wfd_beacon_ie == NULL) {
  147880. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  147881. + return -EINVAL;
  147882. +
  147883. + }
  147884. + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len);
  147885. + }
  147886. + #endif //CONFIG_WFD
  147887. +
  147888. + pmlmeext->bstart_bss = _TRUE;
  147889. +
  147890. + }
  147891. +
  147892. + return ret;
  147893. +
  147894. +}
  147895. +
  147896. +static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len)
  147897. +{
  147898. + int ret = 0;
  147899. + uint wps_ielen = 0;
  147900. + u8 *wps_ie;
  147901. + u32 p2p_ielen = 0;
  147902. + u8 *p2p_ie;
  147903. + u32 wfd_ielen = 0;
  147904. + u8 *wfd_ie;
  147905. + _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
  147906. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  147907. +
  147908. +#ifdef CONFIG_DEBUG_CFG80211
  147909. + DBG_8192C("%s, ielen=%d\n", __func__, len);
  147910. +#endif
  147911. +
  147912. + if(len>0)
  147913. + {
  147914. + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))
  147915. + {
  147916. + uint attr_contentlen = 0;
  147917. + u16 uconfig_method, *puconfig_method = NULL;
  147918. +
  147919. + #ifdef CONFIG_DEBUG_CFG80211
  147920. + DBG_8192C("probe_resp_wps_ielen=%d\n", wps_ielen);
  147921. + #endif
  147922. +
  147923. + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))
  147924. + {
  147925. + u8 sr = 0;
  147926. + rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);
  147927. +
  147928. + if (sr != 0)
  147929. + {
  147930. + DBG_871X("%s, got sr\n", __func__);
  147931. + }
  147932. + else
  147933. + {
  147934. + DBG_8192C("GO mode process WPS under site-survey, sr no set\n");
  147935. + return ret;
  147936. + }
  147937. + }
  147938. +
  147939. + if(pmlmepriv->wps_probe_resp_ie)
  147940. + {
  147941. + u32 free_len = pmlmepriv->wps_probe_resp_ie_len;
  147942. + pmlmepriv->wps_probe_resp_ie_len = 0;
  147943. + rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len);
  147944. + pmlmepriv->wps_probe_resp_ie = NULL;
  147945. + }
  147946. +
  147947. + pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen);
  147948. + if ( pmlmepriv->wps_probe_resp_ie == NULL) {
  147949. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  147950. + return -EINVAL;
  147951. +
  147952. + }
  147953. +
  147954. + //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode
  147955. + if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL )
  147956. + {
  147957. + #ifdef CONFIG_DEBUG_CFG80211
  147958. + //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method));
  147959. + #endif
  147960. +
  147961. + uconfig_method = WPS_CM_PUSH_BUTTON;
  147962. + uconfig_method = cpu_to_be16( uconfig_method );
  147963. +
  147964. + *puconfig_method |= uconfig_method;
  147965. + }
  147966. +
  147967. + _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen);
  147968. + pmlmepriv->wps_probe_resp_ie_len = wps_ielen;
  147969. +
  147970. + }
  147971. +
  147972. + //buf += wps_ielen;
  147973. + //len -= wps_ielen;
  147974. +
  147975. + #ifdef CONFIG_P2P
  147976. + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen)))
  147977. + {
  147978. + u8 is_GO = _FALSE;
  147979. + u32 attr_contentlen = 0;
  147980. + u16 cap_attr=0;
  147981. +
  147982. + #ifdef CONFIG_DEBUG_CFG80211
  147983. + DBG_8192C("probe_resp_p2p_ielen=%d\n", p2p_ielen);
  147984. + #endif
  147985. +
  147986. + //Check P2P Capability ATTR
  147987. + if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) )
  147988. + {
  147989. + u8 grp_cap=0;
  147990. + //DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ );
  147991. + cap_attr = le16_to_cpu(cap_attr);
  147992. + grp_cap = (u8)((cap_attr >> 8)&0xff);
  147993. +
  147994. + is_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE;
  147995. +
  147996. + if(is_GO)
  147997. + DBG_8192C("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap);
  147998. + }
  147999. +
  148000. +
  148001. + if(is_GO == _FALSE)
  148002. + {
  148003. + if(pmlmepriv->p2p_probe_resp_ie)
  148004. + {
  148005. + u32 free_len = pmlmepriv->p2p_probe_resp_ie_len;
  148006. + pmlmepriv->p2p_probe_resp_ie_len = 0;
  148007. + rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len);
  148008. + pmlmepriv->p2p_probe_resp_ie = NULL;
  148009. + }
  148010. +
  148011. + pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen);
  148012. + if ( pmlmepriv->p2p_probe_resp_ie == NULL) {
  148013. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  148014. + return -EINVAL;
  148015. +
  148016. + }
  148017. + _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen);
  148018. + pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen;
  148019. + }
  148020. + else
  148021. + {
  148022. + if(pmlmepriv->p2p_go_probe_resp_ie)
  148023. + {
  148024. + u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len;
  148025. + pmlmepriv->p2p_go_probe_resp_ie_len = 0;
  148026. + rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len);
  148027. + pmlmepriv->p2p_go_probe_resp_ie = NULL;
  148028. + }
  148029. +
  148030. + pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen);
  148031. + if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) {
  148032. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  148033. + return -EINVAL;
  148034. +
  148035. + }
  148036. + _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen);
  148037. + pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen;
  148038. + }
  148039. +
  148040. + }
  148041. + #endif //CONFIG_P2P
  148042. +
  148043. + //buf += p2p_ielen;
  148044. + //len -= p2p_ielen;
  148045. +
  148046. + #ifdef CONFIG_WFD
  148047. + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen))
  148048. + {
  148049. + #ifdef CONFIG_DEBUG_CFG80211
  148050. + DBG_8192C("probe_resp_wfd_ielen=%d\n", wfd_ielen);
  148051. + #endif
  148052. +
  148053. + if(pmlmepriv->wfd_probe_resp_ie)
  148054. + {
  148055. + u32 free_len = pmlmepriv->wfd_probe_resp_ie_len;
  148056. + pmlmepriv->wfd_probe_resp_ie_len = 0;
  148057. + rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len);
  148058. + pmlmepriv->wfd_probe_resp_ie = NULL;
  148059. + }
  148060. +
  148061. + pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen);
  148062. + if ( pmlmepriv->wfd_probe_resp_ie == NULL) {
  148063. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  148064. + return -EINVAL;
  148065. +
  148066. + }
  148067. + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len);
  148068. + }
  148069. + #endif //CONFIG_WFD
  148070. +
  148071. + }
  148072. +
  148073. + return ret;
  148074. +
  148075. +}
  148076. +
  148077. +static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len)
  148078. +{
  148079. + int ret = 0;
  148080. + _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
  148081. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  148082. +
  148083. + DBG_8192C("%s, ielen=%d\n", __func__, len);
  148084. +
  148085. + if(len>0)
  148086. + {
  148087. + if(pmlmepriv->wps_assoc_resp_ie)
  148088. + {
  148089. + u32 free_len = pmlmepriv->wps_assoc_resp_ie_len;
  148090. + pmlmepriv->wps_assoc_resp_ie_len = 0;
  148091. + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len);
  148092. + pmlmepriv->wps_assoc_resp_ie = NULL;
  148093. + }
  148094. +
  148095. + pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len);
  148096. + if ( pmlmepriv->wps_assoc_resp_ie == NULL) {
  148097. + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  148098. + return -EINVAL;
  148099. +
  148100. + }
  148101. + _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len);
  148102. + pmlmepriv->wps_assoc_resp_ie_len = len;
  148103. + }
  148104. +
  148105. + return ret;
  148106. +
  148107. +}
  148108. +
  148109. +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
  148110. + int type)
  148111. +{
  148112. + int ret = 0;
  148113. + uint wps_ielen = 0;
  148114. + u32 p2p_ielen = 0;
  148115. +
  148116. +#ifdef CONFIG_DEBUG_CFG80211
  148117. + DBG_8192C("%s, ielen=%d\n", __func__, len);
  148118. +#endif
  148119. +
  148120. + if( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0))
  148121. + #ifdef CONFIG_P2P
  148122. + || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0))
  148123. + #endif
  148124. + )
  148125. + {
  148126. + if (net != NULL)
  148127. + {
  148128. + switch (type)
  148129. + {
  148130. + case 0x1: //BEACON
  148131. + ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len);
  148132. + break;
  148133. + case 0x2: //PROBE_RESP
  148134. + ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len);
  148135. + break;
  148136. + case 0x4: //ASSOC_RESP
  148137. + ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len);
  148138. + break;
  148139. + }
  148140. + }
  148141. + }
  148142. +
  148143. + return ret;
  148144. +
  148145. +}
  148146. +
  148147. +static struct cfg80211_ops rtw_cfg80211_ops = {
  148148. + .change_virtual_intf = cfg80211_rtw_change_iface,
  148149. + .add_key = cfg80211_rtw_add_key,
  148150. + .get_key = cfg80211_rtw_get_key,
  148151. + .del_key = cfg80211_rtw_del_key,
  148152. + .set_default_key = cfg80211_rtw_set_default_key,
  148153. + .get_station = cfg80211_rtw_get_station,
  148154. + .scan = cfg80211_rtw_scan,
  148155. + .set_wiphy_params = cfg80211_rtw_set_wiphy_params,
  148156. + .connect = cfg80211_rtw_connect,
  148157. + .disconnect = cfg80211_rtw_disconnect,
  148158. + .join_ibss = cfg80211_rtw_join_ibss,
  148159. + .leave_ibss = cfg80211_rtw_leave_ibss,
  148160. + .set_tx_power = cfg80211_rtw_set_txpower,
  148161. + .get_tx_power = cfg80211_rtw_get_txpower,
  148162. + .set_power_mgmt = cfg80211_rtw_set_power_mgmt,
  148163. + .set_pmksa = cfg80211_rtw_set_pmksa,
  148164. + .del_pmksa = cfg80211_rtw_del_pmksa,
  148165. + .flush_pmksa = cfg80211_rtw_flush_pmksa,
  148166. +
  148167. +#ifdef CONFIG_AP_MODE
  148168. + .add_virtual_intf = cfg80211_rtw_add_virtual_intf,
  148169. + .del_virtual_intf = cfg80211_rtw_del_virtual_intf,
  148170. +
  148171. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE)
  148172. + .add_beacon = cfg80211_rtw_add_beacon,
  148173. + .set_beacon = cfg80211_rtw_set_beacon,
  148174. + .del_beacon = cfg80211_rtw_del_beacon,
  148175. + #else
  148176. + .start_ap = cfg80211_rtw_start_ap,
  148177. + .change_beacon = cfg80211_rtw_change_beacon,
  148178. + .stop_ap = cfg80211_rtw_stop_ap,
  148179. + #endif
  148180. +
  148181. + .add_station = cfg80211_rtw_add_station,
  148182. + .del_station = cfg80211_rtw_del_station,
  148183. + .change_station = cfg80211_rtw_change_station,
  148184. + .dump_station = cfg80211_rtw_dump_station,
  148185. + .change_bss = cfg80211_rtw_change_bss,
  148186. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
  148187. + .set_channel = cfg80211_rtw_set_channel,
  148188. + #endif
  148189. + //.auth = cfg80211_rtw_auth,
  148190. + //.assoc = cfg80211_rtw_assoc,
  148191. +#endif //CONFIG_AP_MODE
  148192. +
  148193. +#ifdef CONFIG_P2P
  148194. + .remain_on_channel = cfg80211_rtw_remain_on_channel,
  148195. + .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,
  148196. +#endif
  148197. +
  148198. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  148199. + .mgmt_tx = cfg80211_rtw_mgmt_tx,
  148200. + .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
  148201. +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))
  148202. + .action = cfg80211_rtw_mgmt_tx,
  148203. +#endif
  148204. +};
  148205. +
  148206. +static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type)
  148207. +{
  148208. +
  148209. +#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */
  148210. +#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */
  148211. +
  148212. + ht_cap->ht_supported = _TRUE;
  148213. +
  148214. + ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
  148215. + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 |
  148216. + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;
  148217. +
  148218. + /*
  148219. + *Maximum length of AMPDU that the STA can receive.
  148220. + *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
  148221. + */
  148222. + ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
  148223. +
  148224. + /*Minimum MPDU start spacing , */
  148225. + ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
  148226. +
  148227. + ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
  148228. +
  148229. + /*
  148230. + *hw->wiphy->bands[IEEE80211_BAND_2GHZ]
  148231. + *base on ant_num
  148232. + *rx_mask: RX mask
  148233. + *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7
  148234. + *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15
  148235. + *if rx_ant >=3 rx_mask[2]=0xff;
  148236. + *if BW_40 rx_mask[4]=0x01;
  148237. + *highest supported RX rate
  148238. + */
  148239. + if(rf_type == RF_1T1R)
  148240. + {
  148241. + ht_cap->mcs.rx_mask[0] = 0xFF;
  148242. + ht_cap->mcs.rx_mask[1] = 0x00;
  148243. + ht_cap->mcs.rx_mask[4] = 0x01;
  148244. +
  148245. + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7;
  148246. + }
  148247. + else if((rf_type == RF_1T2R) || (rf_type==RF_2T2R))
  148248. + {
  148249. + ht_cap->mcs.rx_mask[0] = 0xFF;
  148250. + ht_cap->mcs.rx_mask[1] = 0xFF;
  148251. + ht_cap->mcs.rx_mask[4] = 0x01;
  148252. +
  148253. + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15;
  148254. + }
  148255. + else
  148256. + {
  148257. + DBG_8192C("%s, error rf_type=%d\n", __func__, rf_type);
  148258. + }
  148259. +
  148260. +}
  148261. +
  148262. +void rtw_cfg80211_init_wiphy(_adapter *padapter)
  148263. +{
  148264. + u8 rf_type;
  148265. + struct ieee80211_supported_band *bands;
  148266. + struct wireless_dev *pwdev = padapter->rtw_wdev;
  148267. + struct wiphy *wiphy = pwdev->wiphy;
  148268. +
  148269. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  148270. +
  148271. + DBG_8192C("%s:rf_type=%d\n", __func__, rf_type);
  148272. +
  148273. + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
  148274. + {
  148275. + bands = wiphy->bands[IEEE80211_BAND_2GHZ];
  148276. + if(bands)
  148277. + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type);
  148278. + }
  148279. +
  148280. + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
  148281. + {
  148282. + bands = wiphy->bands[IEEE80211_BAND_5GHZ];
  148283. + if(bands)
  148284. + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type);
  148285. + }
  148286. +}
  148287. +
  148288. +/*
  148289. +struct ieee80211_iface_limit rtw_limits[] = {
  148290. + { .max = 1, .types = BIT(NL80211_IFTYPE_STATION)
  148291. + | BIT(NL80211_IFTYPE_ADHOC)
  148292. +#ifdef CONFIG_AP_MODE
  148293. + | BIT(NL80211_IFTYPE_AP)
  148294. +#endif
  148295. +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))
  148296. + | BIT(NL80211_IFTYPE_P2P_CLIENT)
  148297. + | BIT(NL80211_IFTYPE_P2P_GO)
  148298. +#endif
  148299. + },
  148300. + {.max = 1, .types = BIT(NL80211_IFTYPE_MONITOR)},
  148301. +};
  148302. +
  148303. +struct ieee80211_iface_combination rtw_combinations = {
  148304. + .limits = rtw_limits,
  148305. + .n_limits = ARRAY_SIZE(rtw_limits),
  148306. + .max_interfaces = 2,
  148307. + .num_different_channels = 1,
  148308. +};
  148309. +*/
  148310. +
  148311. +static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
  148312. +{
  148313. +
  148314. + wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
  148315. +
  148316. + wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT;
  148317. + wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX;
  148318. + wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS;
  148319. +
  148320. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)
  148321. + wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION;
  148322. +#endif
  148323. +
  148324. + wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION)
  148325. + | BIT(NL80211_IFTYPE_ADHOC)
  148326. +#ifdef CONFIG_AP_MODE
  148327. + | BIT(NL80211_IFTYPE_AP)
  148328. + | BIT(NL80211_IFTYPE_MONITOR)
  148329. +#endif
  148330. +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))
  148331. + | BIT(NL80211_IFTYPE_P2P_CLIENT)
  148332. + | BIT(NL80211_IFTYPE_P2P_GO)
  148333. +#endif
  148334. + ;
  148335. +
  148336. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
  148337. +#ifdef CONFIG_AP_MODE
  148338. + wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes;
  148339. +#endif //CONFIG_AP_MODE
  148340. +#endif
  148341. +
  148342. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
  148343. + wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);
  148344. +#endif
  148345. +
  148346. + /*
  148347. + wiphy->iface_combinations = &rtw_combinations;
  148348. + wiphy->n_iface_combinations = 1;
  148349. + */
  148350. +
  148351. + wiphy->cipher_suites = rtw_cipher_suites;
  148352. + wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites);
  148353. +
  148354. + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
  148355. + wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ);
  148356. + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
  148357. + wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ);
  148358. +
  148359. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0))
  148360. + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS;
  148361. +#endif
  148362. +
  148363. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
  148364. + wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
  148365. + wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME;
  148366. +#endif
  148367. +
  148368. + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)
  148369. + wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
  148370. + else
  148371. + wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
  148372. +}
  148373. +
  148374. +int rtw_wdev_alloc(_adapter *padapter, struct device *dev)
  148375. +{
  148376. + int ret = 0;
  148377. + struct wiphy *wiphy;
  148378. + struct wireless_dev *wdev;
  148379. + struct rtw_wdev_priv *pwdev_priv;
  148380. + struct net_device *pnetdev = padapter->pnetdev;
  148381. +
  148382. + DBG_8192C("%s(padapter=%p)\n", __func__, padapter);
  148383. +
  148384. + /* wiphy */
  148385. + wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv));
  148386. + if (!wiphy) {
  148387. + DBG_8192C("Couldn't allocate wiphy device\n");
  148388. + ret = -ENOMEM;
  148389. + goto exit;
  148390. + }
  148391. + set_wiphy_dev(wiphy, dev);
  148392. + rtw_cfg80211_preinit_wiphy(padapter, wiphy);
  148393. +
  148394. + ret = wiphy_register(wiphy);
  148395. + if (ret < 0) {
  148396. + DBG_8192C("Couldn't register wiphy device\n");
  148397. + goto free_wiphy;
  148398. + }
  148399. +
  148400. + /* wdev */
  148401. + wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev));
  148402. + if (!wdev) {
  148403. + DBG_8192C("Couldn't allocate wireless device\n");
  148404. + ret = -ENOMEM;
  148405. + goto unregister_wiphy;
  148406. + }
  148407. + wdev->wiphy = wiphy;
  148408. + wdev->netdev = pnetdev;
  148409. + //wdev->iftype = NL80211_IFTYPE_STATION;
  148410. + wdev->iftype = NL80211_IFTYPE_MONITOR; // for rtw_setopmode_cmd() in cfg80211_rtw_change_iface()
  148411. + padapter->rtw_wdev = wdev;
  148412. + pnetdev->ieee80211_ptr = wdev;
  148413. +
  148414. + //init pwdev_priv
  148415. + pwdev_priv = wdev_to_priv(wdev);
  148416. + pwdev_priv->rtw_wdev = wdev;
  148417. + pwdev_priv->pmon_ndev = NULL;
  148418. + pwdev_priv->ifname_mon[0] = '\0';
  148419. + pwdev_priv->padapter = padapter;
  148420. + pwdev_priv->scan_request = NULL;
  148421. + _rtw_spinlock_init(&pwdev_priv->scan_req_lock);
  148422. +
  148423. + pwdev_priv->p2p_enabled = _FALSE;
  148424. + pwdev_priv->provdisc_req_issued = _FALSE;
  148425. + rtw_wdev_invit_info_init(&pwdev_priv->invit_info);
  148426. + rtw_wdev_nego_info_init(&pwdev_priv->nego_info);
  148427. +
  148428. + pwdev_priv->bandroid_scan = _FALSE;
  148429. +
  148430. + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)
  148431. + pwdev_priv->power_mgmt = _TRUE;
  148432. + else
  148433. + pwdev_priv->power_mgmt = _FALSE;
  148434. +
  148435. +#ifdef CONFIG_CONCURRENT_MODE
  148436. + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1);
  148437. + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);
  148438. +#endif
  148439. +
  148440. + return ret;
  148441. +
  148442. + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev));
  148443. +unregister_wiphy:
  148444. + wiphy_unregister(wiphy);
  148445. + free_wiphy:
  148446. + wiphy_free(wiphy);
  148447. +exit:
  148448. + return ret;
  148449. +
  148450. +}
  148451. +
  148452. +void rtw_wdev_free(struct wireless_dev *wdev)
  148453. +{
  148454. + struct rtw_wdev_priv *pwdev_priv;
  148455. +
  148456. + DBG_8192C("%s(wdev=%p)\n", __func__, wdev);
  148457. +
  148458. + if (!wdev)
  148459. + return;
  148460. +
  148461. + pwdev_priv = wdev_to_priv(wdev);
  148462. +
  148463. + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]);
  148464. + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]);
  148465. +
  148466. + wiphy_free(wdev->wiphy);
  148467. +
  148468. + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev));
  148469. +}
  148470. +
  148471. +void rtw_wdev_unregister(struct wireless_dev *wdev)
  148472. +{
  148473. + struct rtw_wdev_priv *pwdev_priv;
  148474. +
  148475. + DBG_8192C("%s(wdev=%p)\n", __func__, wdev);
  148476. +
  148477. + if (!wdev)
  148478. + return;
  148479. +
  148480. + pwdev_priv = wdev_to_priv(wdev);
  148481. +
  148482. + rtw_cfg80211_indicate_scan_done(pwdev_priv, _TRUE);
  148483. +
  148484. + if (pwdev_priv->pmon_ndev) {
  148485. + DBG_8192C("%s, unregister monitor interface\n", __func__);
  148486. + unregister_netdev(pwdev_priv->pmon_ndev);
  148487. + }
  148488. +
  148489. + wiphy_unregister(wdev->wiphy);
  148490. +}
  148491. +
  148492. +#endif //CONFIG_IOCTL_CFG80211
  148493. --- /dev/null
  148494. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c
  148495. @@ -0,0 +1,11908 @@
  148496. +/******************************************************************************
  148497. + *
  148498. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  148499. + *
  148500. + * This program is free software; you can redistribute it and/or modify it
  148501. + * under the terms of version 2 of the GNU General Public License as
  148502. + * published by the Free Software Foundation.
  148503. + *
  148504. + * This program is distributed in the hope that it will be useful, but WITHOUT
  148505. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  148506. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  148507. + * more details.
  148508. + *
  148509. + * You should have received a copy of the GNU General Public License along with
  148510. + * this program; if not, write to the Free Software Foundation, Inc.,
  148511. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  148512. + *
  148513. + *
  148514. + ******************************************************************************/
  148515. +#define _IOCTL_LINUX_C_
  148516. +
  148517. +#include <drv_conf.h>
  148518. +#include <osdep_service.h>
  148519. +#include <drv_types.h>
  148520. +#include <wlan_bssdef.h>
  148521. +#include <rtw_debug.h>
  148522. +#include <wifi.h>
  148523. +#include <rtw_mlme.h>
  148524. +#include <rtw_mlme_ext.h>
  148525. +#include <rtw_ioctl.h>
  148526. +#include <rtw_ioctl_set.h>
  148527. +#include <rtw_ioctl_query.h>
  148528. +
  148529. +//#ifdef CONFIG_MP_INCLUDED
  148530. +#include <rtw_mp_ioctl.h>
  148531. +//#endif
  148532. +
  148533. +#ifdef CONFIG_USB_HCI
  148534. +#include <usb_ops.h>
  148535. +#endif //CONFIG_USB_HCI
  148536. +#include <rtw_version.h>
  148537. +
  148538. +#ifdef CONFIG_MP_INCLUDED
  148539. +#include <rtw_mp.h>
  148540. +#endif
  148541. +
  148542. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
  148543. +#define iwe_stream_add_event(a, b, c, d, e) iwe_stream_add_event(b, c, d, e)
  148544. +#define iwe_stream_add_point(a, b, c, d, e) iwe_stream_add_point(b, c, d, e)
  148545. +#endif
  148546. +
  148547. +
  148548. +#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
  148549. +
  148550. +#define SCAN_ITEM_SIZE 768
  148551. +#define MAX_CUSTOM_LEN 64
  148552. +#define RATE_COUNT 4
  148553. +
  148554. +#ifdef CONFIG_GLOBAL_UI_PID
  148555. +extern int ui_pid[3];
  148556. +#endif
  148557. +
  148558. +// combo scan
  148559. +#define WEXT_CSCAN_AMOUNT 9
  148560. +#define WEXT_CSCAN_BUF_LEN 360
  148561. +#define WEXT_CSCAN_HEADER "CSCAN S\x01\x00\x00S\x00"
  148562. +#define WEXT_CSCAN_HEADER_SIZE 12
  148563. +#define WEXT_CSCAN_SSID_SECTION 'S'
  148564. +#define WEXT_CSCAN_CHANNEL_SECTION 'C'
  148565. +#define WEXT_CSCAN_NPROBE_SECTION 'N'
  148566. +#define WEXT_CSCAN_ACTV_DWELL_SECTION 'A'
  148567. +#define WEXT_CSCAN_PASV_DWELL_SECTION 'P'
  148568. +#define WEXT_CSCAN_HOME_DWELL_SECTION 'H'
  148569. +#define WEXT_CSCAN_TYPE_SECTION 'T'
  148570. +
  148571. +
  148572. +extern u8 key_2char2num(u8 hch, u8 lch);
  148573. +extern u8 str_2char2num(u8 hch, u8 lch);
  148574. +extern u8 convert_ip_addr(u8 hch, u8 mch, u8 lch);
  148575. +
  148576. +u32 rtw_rates[] = {1000000,2000000,5500000,11000000,
  148577. + 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};
  148578. +
  148579. +static const char * const iw_operation_mode[] =
  148580. +{
  148581. + "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Monitor"
  148582. +};
  148583. +
  148584. +static int hex2num_i(char c)
  148585. +{
  148586. + if (c >= '0' && c <= '9')
  148587. + return c - '0';
  148588. + if (c >= 'a' && c <= 'f')
  148589. + return c - 'a' + 10;
  148590. + if (c >= 'A' && c <= 'F')
  148591. + return c - 'A' + 10;
  148592. + return -1;
  148593. +}
  148594. +
  148595. +static int hex2byte_i(const char *hex)
  148596. +{
  148597. + int a, b;
  148598. + a = hex2num_i(*hex++);
  148599. + if (a < 0)
  148600. + return -1;
  148601. + b = hex2num_i(*hex++);
  148602. + if (b < 0)
  148603. + return -1;
  148604. + return (a << 4) | b;
  148605. +}
  148606. +
  148607. +/**
  148608. + * hwaddr_aton - Convert ASCII string to MAC address
  148609. + * @txt: MAC address as a string (e.g., "00:11:22:33:44:55")
  148610. + * @addr: Buffer for the MAC address (ETH_ALEN = 6 bytes)
  148611. + * Returns: 0 on success, -1 on failure (e.g., string not a MAC address)
  148612. + */
  148613. +static int hwaddr_aton_i(const char *txt, u8 *addr)
  148614. +{
  148615. + int i;
  148616. +
  148617. + for (i = 0; i < 6; i++) {
  148618. + int a, b;
  148619. +
  148620. + a = hex2num_i(*txt++);
  148621. + if (a < 0)
  148622. + return -1;
  148623. + b = hex2num_i(*txt++);
  148624. + if (b < 0)
  148625. + return -1;
  148626. + *addr++ = (a << 4) | b;
  148627. + if (i < 5 && *txt++ != ':')
  148628. + return -1;
  148629. + }
  148630. +
  148631. + return 0;
  148632. +}
  148633. +
  148634. +static void indicate_wx_custom_event(_adapter *padapter, char *msg)
  148635. +{
  148636. +#ifndef CONFIG_IOCTL_CFG80211
  148637. + u8 *buff, *p;
  148638. + union iwreq_data wrqu;
  148639. +
  148640. + if ((u32)strlen(msg) > IW_CUSTOM_MAX) {
  148641. + DBG_871X("%s strlen(msg):%u > IW_CUSTOM_MAX:%u\n", __FUNCTION__ ,(u32)strlen(msg), IW_CUSTOM_MAX);
  148642. + return;
  148643. + }
  148644. +
  148645. + buff = rtw_zmalloc(IW_CUSTOM_MAX+1);
  148646. + if(!buff)
  148647. + return;
  148648. +
  148649. + _rtw_memcpy(buff, msg, strlen(msg));
  148650. +
  148651. + _rtw_memset(&wrqu,0,sizeof(wrqu));
  148652. + wrqu.data.length = strlen(msg);
  148653. +
  148654. + DBG_871X("%s %s\n", __FUNCTION__, buff);
  148655. + wireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff);
  148656. +
  148657. + rtw_mfree(buff, IW_CUSTOM_MAX+1);
  148658. +#endif
  148659. +}
  148660. +
  148661. +
  148662. +static void request_wps_pbc_event(_adapter *padapter)
  148663. +{
  148664. +#ifndef CONFIG_IOCTL_CFG80211
  148665. + u8 *buff, *p;
  148666. + union iwreq_data wrqu;
  148667. +
  148668. + buff = rtw_malloc(IW_CUSTOM_MAX);
  148669. + if(!buff)
  148670. + return;
  148671. +
  148672. + _rtw_memset(buff, 0, IW_CUSTOM_MAX);
  148673. +
  148674. + p=buff;
  148675. +
  148676. + p+=sprintf(p, "WPS_PBC_START.request=TRUE");
  148677. +
  148678. + _rtw_memset(&wrqu,0,sizeof(wrqu));
  148679. +
  148680. + wrqu.data.length = p-buff;
  148681. +
  148682. + wrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;
  148683. +
  148684. + DBG_871X("%s\n", __FUNCTION__);
  148685. +
  148686. + wireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff);
  148687. +
  148688. + if(buff)
  148689. + {
  148690. + rtw_mfree(buff, IW_CUSTOM_MAX);
  148691. + }
  148692. +#endif
  148693. +}
  148694. +
  148695. +
  148696. +void indicate_wx_scan_complete_event(_adapter *padapter)
  148697. +{
  148698. +#ifndef CONFIG_IOCTL_CFG80211
  148699. + union iwreq_data wrqu;
  148700. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  148701. +
  148702. + _rtw_memset(&wrqu, 0, sizeof(union iwreq_data));
  148703. +
  148704. + //DBG_871X("+rtw_indicate_wx_scan_complete_event\n");
  148705. + wireless_send_event(padapter->pnetdev, SIOCGIWSCAN, &wrqu, NULL);
  148706. +#endif
  148707. +}
  148708. +
  148709. +
  148710. +void rtw_indicate_wx_assoc_event(_adapter *padapter)
  148711. +{
  148712. +#ifndef CONFIG_IOCTL_CFG80211
  148713. + union iwreq_data wrqu;
  148714. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  148715. +
  148716. + _rtw_memset(&wrqu, 0, sizeof(union iwreq_data));
  148717. +
  148718. + wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  148719. +
  148720. + _rtw_memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN);
  148721. +
  148722. + //DBG_871X("+rtw_indicate_wx_assoc_event\n");
  148723. + wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);
  148724. +#endif
  148725. +}
  148726. +
  148727. +void rtw_indicate_wx_disassoc_event(_adapter *padapter)
  148728. +{
  148729. +#ifndef CONFIG_IOCTL_CFG80211
  148730. + union iwreq_data wrqu;
  148731. +
  148732. + _rtw_memset(&wrqu, 0, sizeof(union iwreq_data));
  148733. +
  148734. + wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  148735. + _rtw_memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
  148736. +
  148737. + //DBG_871X("+rtw_indicate_wx_disassoc_event\n");
  148738. + wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);
  148739. +#endif
  148740. +}
  148741. +
  148742. +/*
  148743. +uint rtw_is_cckrates_included(u8 *rate)
  148744. +{
  148745. + u32 i = 0;
  148746. +
  148747. + while(rate[i]!=0)
  148748. + {
  148749. + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) ||
  148750. + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) )
  148751. + return _TRUE;
  148752. + i++;
  148753. + }
  148754. +
  148755. + return _FALSE;
  148756. +}
  148757. +
  148758. +uint rtw_is_cckratesonly_included(u8 *rate)
  148759. +{
  148760. + u32 i = 0;
  148761. +
  148762. + while(rate[i]!=0)
  148763. + {
  148764. + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&
  148765. + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) )
  148766. + return _FALSE;
  148767. + i++;
  148768. + }
  148769. +
  148770. + return _TRUE;
  148771. +}
  148772. +*/
  148773. +
  148774. +static char *translate_scan(_adapter *padapter,
  148775. + struct iw_request_info* info, struct wlan_network *pnetwork,
  148776. + char *start, char *stop)
  148777. +{
  148778. + struct iw_event iwe;
  148779. + u16 cap;
  148780. + u32 ht_ielen = 0;
  148781. + char custom[MAX_CUSTOM_LEN];
  148782. + char *p;
  148783. + u16 max_rate=0, rate, ht_cap=_FALSE;
  148784. + u32 i = 0;
  148785. + char *current_val;
  148786. + long rssi;
  148787. + u8 bw_40MHz=0, short_GI=0;
  148788. + u16 mcs_rate=0;
  148789. + struct registry_priv *pregpriv = &padapter->registrypriv;
  148790. +#ifdef CONFIG_P2P
  148791. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  148792. +#endif //CONFIG_P2P
  148793. +
  148794. +#ifdef CONFIG_P2P
  148795. +#ifdef CONFIG_WFD
  148796. + if ( SCAN_RESULT_ALL == pwdinfo->wfd_info->scan_result_type )
  148797. + {
  148798. +
  148799. + }
  148800. + else if ( ( SCAN_RESULT_P2P_ONLY == pwdinfo->wfd_info->scan_result_type ) ||
  148801. + ( SCAN_RESULT_WFD_TYPE == pwdinfo->wfd_info->scan_result_type ) )
  148802. +#endif // CONFIG_WFD
  148803. + {
  148804. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  148805. + {
  148806. + u32 blnGotP2PIE = _FALSE;
  148807. +
  148808. + // User is doing the P2P device discovery
  148809. + // The prefix of SSID should be "DIRECT-" and the IE should contains the P2P IE.
  148810. + // If not, the driver should ignore this AP and go to the next AP.
  148811. +
  148812. + // Verifying the SSID
  148813. + if ( _rtw_memcmp( pnetwork->network.Ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ) )
  148814. + {
  148815. + u32 p2pielen = 0;
  148816. +
  148817. + // Verifying the P2P IE
  148818. + if ( rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen) )
  148819. + {
  148820. + blnGotP2PIE = _TRUE;
  148821. + }
  148822. + }
  148823. +
  148824. + if ( blnGotP2PIE == _FALSE )
  148825. + {
  148826. + return start;
  148827. + }
  148828. +
  148829. + }
  148830. + }
  148831. +
  148832. +#ifdef CONFIG_WFD
  148833. + if ( SCAN_RESULT_WFD_TYPE == pwdinfo->wfd_info->scan_result_type )
  148834. + {
  148835. + u32 blnGotWFD = _FALSE;
  148836. + u8 wfd_ie[ 128 ] = { 0x00 };
  148837. + uint wfd_ielen = 0;
  148838. +
  148839. + if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) )
  148840. + {
  148841. + u8 wfd_devinfo[ 6 ] = { 0x00 };
  148842. + uint wfd_devlen = 6;
  148843. +
  148844. + if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen) )
  148845. + {
  148846. + if ( pwdinfo->wfd_info->wfd_device_type == WFD_DEVINFO_PSINK )
  148847. + {
  148848. + // the first two bits will indicate the WFD device type
  148849. + if ( ( wfd_devinfo[ 1 ] & 0x03 ) == WFD_DEVINFO_SOURCE )
  148850. + {
  148851. + // If this device is Miracast PSink device, the scan reuslt should just provide the Miracast source.
  148852. + blnGotWFD = _TRUE;
  148853. + }
  148854. + }
  148855. + else if ( pwdinfo->wfd_info->wfd_device_type == WFD_DEVINFO_SOURCE )
  148856. + {
  148857. + // the first two bits will indicate the WFD device type
  148858. + if ( ( wfd_devinfo[ 1 ] & 0x03 ) == WFD_DEVINFO_PSINK )
  148859. + {
  148860. + // If this device is Miracast source device, the scan reuslt should just provide the Miracast PSink.
  148861. + // Todo: How about the SSink?!
  148862. + blnGotWFD = _TRUE;
  148863. + }
  148864. + }
  148865. + }
  148866. + }
  148867. +
  148868. + if ( blnGotWFD == _FALSE )
  148869. + {
  148870. + return start;
  148871. + }
  148872. + }
  148873. +#endif // CONFIG_WFD
  148874. +
  148875. +#endif //CONFIG_P2P
  148876. + /* AP MAC address */
  148877. + iwe.cmd = SIOCGIWAP;
  148878. + iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
  148879. +
  148880. + _rtw_memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
  148881. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);
  148882. +
  148883. + /* Add the ESSID */
  148884. + iwe.cmd = SIOCGIWESSID;
  148885. + iwe.u.data.flags = 1;
  148886. + iwe.u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);
  148887. + start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
  148888. +
  148889. + //parsing HT_CAP_IE
  148890. + p = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-12);
  148891. +
  148892. + if(p && ht_ielen>0)
  148893. + {
  148894. + struct rtw_ieee80211_ht_cap *pht_capie;
  148895. + ht_cap = _TRUE;
  148896. + pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);
  148897. + _rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
  148898. + bw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;
  148899. + short_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;
  148900. + }
  148901. +
  148902. + /* Add the protocol name */
  148903. + iwe.cmd = SIOCGIWNAME;
  148904. + if ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
  148905. + {
  148906. + if(ht_cap == _TRUE)
  148907. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bn");
  148908. + else
  148909. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11b");
  148910. + }
  148911. + else if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
  148912. + {
  148913. + if(ht_cap == _TRUE)
  148914. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bgn");
  148915. + else
  148916. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg");
  148917. + }
  148918. + else
  148919. + {
  148920. + if(pnetwork->network.Configuration.DSConfig > 14)
  148921. + {
  148922. + if(ht_cap == _TRUE)
  148923. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11an");
  148924. + else
  148925. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11a");
  148926. + }
  148927. + else
  148928. + {
  148929. + if(ht_cap == _TRUE)
  148930. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11gn");
  148931. + else
  148932. + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11g");
  148933. + }
  148934. + }
  148935. +
  148936. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
  148937. +
  148938. + /* Add mode */
  148939. + iwe.cmd = SIOCGIWMODE;
  148940. + _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
  148941. +
  148942. +
  148943. + cap = le16_to_cpu(cap);
  148944. +
  148945. + if(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){
  148946. + if (cap & WLAN_CAPABILITY_BSS)
  148947. + iwe.u.mode = IW_MODE_MASTER;
  148948. + else
  148949. + iwe.u.mode = IW_MODE_ADHOC;
  148950. +
  148951. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN);
  148952. + }
  148953. +
  148954. + if(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)
  148955. + pnetwork->network.Configuration.DSConfig = 1;
  148956. +
  148957. + /* Add frequency/channel */
  148958. + iwe.cmd = SIOCGIWFREQ;
  148959. + iwe.u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;
  148960. + iwe.u.freq.e = 1;
  148961. + iwe.u.freq.i = pnetwork->network.Configuration.DSConfig;
  148962. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN);
  148963. +
  148964. + /* Add encryption capability */
  148965. + iwe.cmd = SIOCGIWENCODE;
  148966. + if (cap & WLAN_CAPABILITY_PRIVACY)
  148967. + iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
  148968. + else
  148969. + iwe.u.data.flags = IW_ENCODE_DISABLED;
  148970. + iwe.u.data.length = 0;
  148971. + start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
  148972. +
  148973. + /*Add basic and extended rates */
  148974. + max_rate = 0;
  148975. + p = custom;
  148976. + p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
  148977. + while(pnetwork->network.SupportedRates[i]!=0)
  148978. + {
  148979. + rate = pnetwork->network.SupportedRates[i]&0x7F;
  148980. + if (rate > max_rate)
  148981. + max_rate = rate;
  148982. + p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
  148983. + "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
  148984. + i++;
  148985. + }
  148986. +
  148987. + if(ht_cap == _TRUE)
  148988. + {
  148989. + if(mcs_rate&0x8000)//MCS15
  148990. + {
  148991. + max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
  148992. +
  148993. + }
  148994. + else if(mcs_rate&0x0080)//MCS7
  148995. + {
  148996. + max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
  148997. + }
  148998. + else//default MCS7
  148999. + {
  149000. + DBG_871X("wx_get_scan, mcs_rate_bitmap=0x%x\n", mcs_rate);
  149001. + max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
  149002. + }
  149003. +
  149004. + max_rate = max_rate*2;//Mbps/2;
  149005. + }
  149006. +
  149007. + iwe.cmd = SIOCGIWRATE;
  149008. + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
  149009. + iwe.u.bitrate.value = max_rate * 500000;
  149010. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN);
  149011. +
  149012. + //parsing WPA/WPA2 IE
  149013. + {
  149014. + u8 buf[MAX_WPA_IE_LEN];
  149015. + u8 wpa_ie[255],rsn_ie[255];
  149016. + u16 wpa_len=0,rsn_len=0;
  149017. + u8 *p;
  149018. + sint out_len=0;
  149019. + out_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);
  149020. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
  149021. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len));
  149022. +
  149023. + if (wpa_len > 0)
  149024. + {
  149025. + p=buf;
  149026. + _rtw_memset(buf, 0, MAX_WPA_IE_LEN);
  149027. + p += sprintf(p, "wpa_ie=");
  149028. + for (i = 0; i < wpa_len; i++) {
  149029. + p += sprintf(p, "%02x", wpa_ie[i]);
  149030. + }
  149031. +
  149032. + _rtw_memset(&iwe, 0, sizeof(iwe));
  149033. + iwe.cmd = IWEVCUSTOM;
  149034. + iwe.u.data.length = strlen(buf);
  149035. + start = iwe_stream_add_point(info, start, stop, &iwe,buf);
  149036. +
  149037. + _rtw_memset(&iwe, 0, sizeof(iwe));
  149038. + iwe.cmd =IWEVGENIE;
  149039. + iwe.u.data.length = wpa_len;
  149040. + start = iwe_stream_add_point(info, start, stop, &iwe, wpa_ie);
  149041. + }
  149042. + if (rsn_len > 0)
  149043. + {
  149044. + p = buf;
  149045. + _rtw_memset(buf, 0, MAX_WPA_IE_LEN);
  149046. + p += sprintf(p, "rsn_ie=");
  149047. + for (i = 0; i < rsn_len; i++) {
  149048. + p += sprintf(p, "%02x", rsn_ie[i]);
  149049. + }
  149050. + _rtw_memset(&iwe, 0, sizeof(iwe));
  149051. + iwe.cmd = IWEVCUSTOM;
  149052. + iwe.u.data.length = strlen(buf);
  149053. + start = iwe_stream_add_point(info, start, stop, &iwe,buf);
  149054. +
  149055. + _rtw_memset(&iwe, 0, sizeof(iwe));
  149056. + iwe.cmd =IWEVGENIE;
  149057. + iwe.u.data.length = rsn_len;
  149058. + start = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie);
  149059. + }
  149060. + }
  149061. +
  149062. + { //parsing WPS IE
  149063. + uint cnt = 0,total_ielen;
  149064. + u8 *wpsie_ptr=NULL;
  149065. + uint wps_ielen = 0;
  149066. +
  149067. + u8 *ie_ptr = pnetwork->network.IEs +_FIXED_IE_LENGTH_;
  149068. + total_ielen= pnetwork->network.IELength - _FIXED_IE_LENGTH_;
  149069. +
  149070. + while(cnt < total_ielen)
  149071. + {
  149072. + if(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))
  149073. + {
  149074. + wpsie_ptr = &ie_ptr[cnt];
  149075. + iwe.cmd =IWEVGENIE;
  149076. + iwe.u.data.length = (u16)wps_ielen;
  149077. + start = iwe_stream_add_point(info, start, stop, &iwe, wpsie_ptr);
  149078. + }
  149079. + cnt+=ie_ptr[cnt+1]+2; //goto next
  149080. + }
  149081. + }
  149082. +
  149083. +
  149084. +{
  149085. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  149086. + u8 ss, sq;
  149087. +
  149088. + /* Add quality statistics */
  149089. + iwe.cmd = IWEVQUAL;
  149090. + iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID
  149091. + #ifdef CONFIG_SIGNAL_DISPLAY_DBM
  149092. + | IW_QUAL_DBM
  149093. + #endif
  149094. + ;
  149095. +
  149096. + if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
  149097. + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) {
  149098. + ss = padapter->recvpriv.signal_strength;
  149099. + sq = padapter->recvpriv.signal_qual;
  149100. + } else {
  149101. + ss = pnetwork->network.PhyInfo.SignalStrength;
  149102. + sq = pnetwork->network.PhyInfo.SignalQuality;
  149103. + }
  149104. +
  149105. +
  149106. + #ifdef CONFIG_SIGNAL_DISPLAY_DBM
  149107. + iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
  149108. + #else
  149109. + iwe.u.qual.level = (u8)ss;//%
  149110. + #endif
  149111. +
  149112. + iwe.u.qual.qual = (u8)sq; // signal quality
  149113. +
  149114. + #ifdef CONFIG_PLATFORM_ROCKCHIPS
  149115. + iwe.u.qual.noise = -100; // noise level suggest by zhf@rockchips
  149116. + #else
  149117. + iwe.u.qual.noise = 0; // noise level
  149118. + #endif //CONFIG_PLATFORM_ROCKCHIPS
  149119. +
  149120. + //DBG_871X("iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\n", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);
  149121. +
  149122. + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
  149123. +}
  149124. +
  149125. + return start;
  149126. +}
  149127. +
  149128. +static int wpa_set_auth_algs(struct net_device *dev, u32 value)
  149129. +{
  149130. + _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
  149131. + int ret = 0;
  149132. +
  149133. + if ((value & AUTH_ALG_SHARED_KEY)&&(value & AUTH_ALG_OPEN_SYSTEM))
  149134. + {
  149135. + DBG_871X("wpa_set_auth_algs, AUTH_ALG_SHARED_KEY and AUTH_ALG_OPEN_SYSTEM [value:0x%x]\n",value);
  149136. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149137. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;
  149138. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  149139. + }
  149140. + else if (value & AUTH_ALG_SHARED_KEY)
  149141. + {
  149142. + DBG_871X("wpa_set_auth_algs, AUTH_ALG_SHARED_KEY [value:0x%x]\n",value);
  149143. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149144. +
  149145. +#ifdef CONFIG_PLATFORM_MT53XX
  149146. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;
  149147. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  149148. +#else
  149149. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeShared;
  149150. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Shared;
  149151. +#endif
  149152. + }
  149153. + else if(value & AUTH_ALG_OPEN_SYSTEM)
  149154. + {
  149155. + DBG_871X("wpa_set_auth_algs, AUTH_ALG_OPEN_SYSTEM\n");
  149156. + //padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;
  149157. + if(padapter->securitypriv.ndisauthtype < Ndis802_11AuthModeWPAPSK)
  149158. + {
  149159. +#ifdef CONFIG_PLATFORM_MT53XX
  149160. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;
  149161. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  149162. +#else
  149163. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;
  149164. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
  149165. +#endif
  149166. + }
  149167. +
  149168. + }
  149169. + else if(value & AUTH_ALG_LEAP)
  149170. + {
  149171. + DBG_871X("wpa_set_auth_algs, AUTH_ALG_LEAP\n");
  149172. + }
  149173. + else
  149174. + {
  149175. + DBG_871X("wpa_set_auth_algs, error!\n");
  149176. + ret = -EINVAL;
  149177. + }
  149178. +
  149179. + return ret;
  149180. +
  149181. +}
  149182. +
  149183. +static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)
  149184. +{
  149185. + int ret = 0;
  149186. + u32 wep_key_idx, wep_key_len,wep_total_len;
  149187. + NDIS_802_11_WEP *pwep = NULL;
  149188. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149189. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  149190. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  149191. +#ifdef CONFIG_P2P
  149192. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  149193. +#endif //CONFIG_P2P
  149194. +
  149195. +_func_enter_;
  149196. +
  149197. + param->u.crypt.err = 0;
  149198. + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
  149199. +
  149200. + if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)
  149201. + {
  149202. + ret = -EINVAL;
  149203. + goto exit;
  149204. + }
  149205. +
  149206. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  149207. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  149208. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  149209. + {
  149210. +
  149211. + if (param->u.crypt.idx >= WEP_KEYS
  149212. +#ifdef CONFIG_IEEE80211W
  149213. + && param->u.crypt.idx > BIP_MAX_KEYID
  149214. +#endif //CONFIG_IEEE80211W
  149215. + )
  149216. + {
  149217. + ret = -EINVAL;
  149218. + goto exit;
  149219. + }
  149220. + }
  149221. + else
  149222. + {
  149223. +
  149224. + {
  149225. + ret = -EINVAL;
  149226. + goto exit;
  149227. + }
  149228. + }
  149229. +
  149230. + if (strcmp(param->u.crypt.alg, "WEP") == 0)
  149231. + {
  149232. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n"));
  149233. + DBG_871X("wpa_set_encryption, crypt.alg = WEP\n");
  149234. +
  149235. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149236. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  149237. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;
  149238. +
  149239. + wep_key_idx = param->u.crypt.idx;
  149240. + wep_key_len = param->u.crypt.key_len;
  149241. +
  149242. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("(1)wep_key_idx=%d\n", wep_key_idx));
  149243. + DBG_871X("(1)wep_key_idx=%d\n", wep_key_idx);
  149244. +
  149245. + if (wep_key_idx > WEP_KEYS)
  149246. + return -EINVAL;
  149247. +
  149248. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("(2)wep_key_idx=%d\n", wep_key_idx));
  149249. +
  149250. + if (wep_key_len > 0)
  149251. + {
  149252. + wep_key_len = wep_key_len <= 5 ? 5 : 13;
  149253. + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);
  149254. + pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len);
  149255. + if(pwep == NULL){
  149256. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(" wpa_set_encryption: pwep allocate fail !!!\n"));
  149257. + goto exit;
  149258. + }
  149259. +
  149260. + _rtw_memset(pwep, 0, wep_total_len);
  149261. +
  149262. + pwep->KeyLength = wep_key_len;
  149263. + pwep->Length = wep_total_len;
  149264. +
  149265. + if(wep_key_len==13)
  149266. + {
  149267. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  149268. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;
  149269. + }
  149270. + }
  149271. + else {
  149272. + ret = -EINVAL;
  149273. + goto exit;
  149274. + }
  149275. +
  149276. + pwep->KeyIndex = wep_key_idx;
  149277. + pwep->KeyIndex |= 0x80000000;
  149278. +
  149279. + _rtw_memcpy(pwep->KeyMaterial, param->u.crypt.key, pwep->KeyLength);
  149280. +
  149281. + if(param->u.crypt.set_tx)
  149282. + {
  149283. + DBG_871X("wep, set_tx=1\n");
  149284. +
  149285. + if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL)
  149286. + {
  149287. + ret = -EOPNOTSUPP ;
  149288. + }
  149289. + }
  149290. + else
  149291. + {
  149292. + DBG_871X("wep, set_tx=0\n");
  149293. +
  149294. + //don't update "psecuritypriv->dot11PrivacyAlgrthm" and
  149295. + //"psecuritypriv->dot11PrivacyKeyIndex=keyid", but can rtw_set_key to fw/cam
  149296. +
  149297. + if (wep_key_idx >= WEP_KEYS) {
  149298. + ret = -EOPNOTSUPP ;
  149299. + goto exit;
  149300. + }
  149301. +
  149302. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);
  149303. + psecuritypriv->dot11DefKeylen[wep_key_idx]=pwep->KeyLength;
  149304. + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0);
  149305. + }
  149306. +
  149307. + goto exit;
  149308. + }
  149309. +
  149310. + if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x
  149311. + {
  149312. + struct sta_info * psta,*pbcmc_sta;
  149313. + struct sta_priv * pstapriv = &padapter->stapriv;
  149314. +
  149315. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode
  149316. + {
  149317. + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  149318. + if (psta == NULL) {
  149319. + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n"));
  149320. + }
  149321. + else
  149322. + {
  149323. + //Jeff: don't disable ieee8021x_blocked while clearing key
  149324. + if (strcmp(param->u.crypt.alg, "none") != 0)
  149325. + psta->ieee8021x_blocked = _FALSE;
  149326. +
  149327. + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||
  149328. + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled))
  149329. + {
  149330. + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;
  149331. + }
  149332. +
  149333. + if(param->u.crypt.set_tx ==1)//pairwise key
  149334. + {
  149335. + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  149336. +
  149337. + if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key
  149338. + {
  149339. + //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len));
  149340. + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);
  149341. + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);
  149342. +
  149343. + padapter->securitypriv.busetkipkey=_FALSE;
  149344. + //_set_timer(&padapter->securitypriv.tkip_timer, 50);
  149345. + }
  149346. +
  149347. + //DEBUG_ERR(("\n param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
  149348. + //DEBUG_ERR(("\n ~~~~stastakey:unicastkey\n"));
  149349. + DBG_871X("\n ~~~~stastakey:unicastkey\n");
  149350. +
  149351. + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE);
  149352. + }
  149353. + else//group key
  149354. + {
  149355. + if(strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0)
  149356. + {
  149357. + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  149358. + //only TKIP group key need to install this
  149359. + if(param->u.crypt.key_len > 16)
  149360. + {
  149361. + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8);
  149362. + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8);
  149363. + }
  149364. + padapter->securitypriv.binstallGrpkey = _TRUE;
  149365. + //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len));
  149366. + DBG_871X(" ~~~~set sta key:groupkey\n");
  149367. +
  149368. + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;
  149369. +
  149370. + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1);
  149371. + }
  149372. +#ifdef CONFIG_IEEE80211W
  149373. + else if(strcmp(param->u.crypt.alg, "BIP") == 0)
  149374. + {
  149375. + int no;
  149376. + //printk("BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\n", param->u.crypt.key_len, param->u.crypt.idx);
  149377. + //save the IGTK key, length 16 bytes
  149378. + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  149379. + /*printk("IGTK key below:\n");
  149380. + for(no=0;no<16;no++)
  149381. + printk(" %02x ", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);
  149382. + printk("\n");*/
  149383. + padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;
  149384. + padapter->securitypriv.binstallBIPkey = _TRUE;
  149385. + DBG_871X(" ~~~~set sta key:IGKT\n");
  149386. + }
  149387. +#endif //CONFIG_IEEE80211W
  149388. +
  149389. +#ifdef CONFIG_P2P
  149390. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
  149391. + {
  149392. + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE);
  149393. + }
  149394. +#endif //CONFIG_P2P
  149395. +
  149396. + }
  149397. + }
  149398. +
  149399. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  149400. + if(pbcmc_sta==NULL)
  149401. + {
  149402. + //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n"));
  149403. + }
  149404. + else
  149405. + {
  149406. + //Jeff: don't disable ieee8021x_blocked while clearing key
  149407. + if (strcmp(param->u.crypt.alg, "none") != 0)
  149408. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  149409. +
  149410. + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||
  149411. + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled))
  149412. + {
  149413. + pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;
  149414. + }
  149415. + }
  149416. + }
  149417. + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode
  149418. + {
  149419. + }
  149420. + }
  149421. +
  149422. +exit:
  149423. +
  149424. + if (pwep) {
  149425. + rtw_mfree((u8 *)pwep, wep_total_len);
  149426. + }
  149427. +
  149428. + _func_exit_;
  149429. +
  149430. + return ret;
  149431. +}
  149432. +
  149433. +static int rtw_set_wpa_ie(_adapter *padapter, char *pie, unsigned short ielen)
  149434. +{
  149435. + u8 *buf=NULL, *pos=NULL;
  149436. + u32 left;
  149437. + int group_cipher = 0, pairwise_cipher = 0;
  149438. + int ret = 0;
  149439. + u8 null_addr[]= {0,0,0,0,0,0};
  149440. +#ifdef CONFIG_P2P
  149441. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  149442. +#endif //CONFIG_P2P
  149443. +
  149444. + if((ielen > MAX_WPA_IE_LEN) || (pie == NULL)){
  149445. + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
  149446. + if(pie == NULL)
  149447. + return ret;
  149448. + else
  149449. + return -EINVAL;
  149450. + }
  149451. +
  149452. + if(ielen)
  149453. + {
  149454. + buf = rtw_zmalloc(ielen);
  149455. + if (buf == NULL){
  149456. + ret = -ENOMEM;
  149457. + goto exit;
  149458. + }
  149459. +
  149460. + _rtw_memcpy(buf, pie , ielen);
  149461. +
  149462. + //dump
  149463. + {
  149464. + int i;
  149465. + DBG_871X("\n wpa_ie(length:%d):\n", ielen);
  149466. + for(i=0;i<ielen;i=i+8)
  149467. + DBG_871X("0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5],buf[i+6],buf[i+7]);
  149468. + }
  149469. +
  149470. + pos = buf;
  149471. + if(ielen < RSN_HEADER_LEN){
  149472. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("Ie len too short %d\n", ielen));
  149473. + ret = -1;
  149474. + goto exit;
  149475. + }
  149476. +
  149477. +#if 0
  149478. + pos += RSN_HEADER_LEN;
  149479. + left = ielen - RSN_HEADER_LEN;
  149480. +
  149481. + if (left >= RSN_SELECTOR_LEN){
  149482. + pos += RSN_SELECTOR_LEN;
  149483. + left -= RSN_SELECTOR_LEN;
  149484. + }
  149485. + else if (left > 0){
  149486. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("Ie length mismatch, %u too much \n", left));
  149487. + ret =-1;
  149488. + goto exit;
  149489. + }
  149490. +#endif
  149491. +
  149492. + if(rtw_parse_wpa_ie(buf, ielen, &group_cipher, &pairwise_cipher) == _SUCCESS)
  149493. + {
  149494. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  149495. + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK;
  149496. + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen);
  149497. + }
  149498. +
  149499. + if(rtw_parse_wpa2_ie(buf, ielen, &group_cipher, &pairwise_cipher) == _SUCCESS)
  149500. + {
  149501. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;
  149502. + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK;
  149503. + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen);
  149504. + }
  149505. +
  149506. + if (group_cipher == 0)
  149507. + {
  149508. + group_cipher = WPA_CIPHER_NONE;
  149509. + }
  149510. + if (pairwise_cipher == 0)
  149511. + {
  149512. + pairwise_cipher = WPA_CIPHER_NONE;
  149513. + }
  149514. +
  149515. + switch(group_cipher)
  149516. + {
  149517. + case WPA_CIPHER_NONE:
  149518. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  149519. + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;
  149520. + break;
  149521. + case WPA_CIPHER_WEP40:
  149522. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;
  149523. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149524. + break;
  149525. + case WPA_CIPHER_TKIP:
  149526. + padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_;
  149527. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
  149528. + break;
  149529. + case WPA_CIPHER_CCMP:
  149530. + padapter->securitypriv.dot118021XGrpPrivacy=_AES_;
  149531. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
  149532. + break;
  149533. + case WPA_CIPHER_WEP104:
  149534. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;
  149535. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149536. + break;
  149537. + }
  149538. +
  149539. + switch(pairwise_cipher)
  149540. + {
  149541. + case WPA_CIPHER_NONE:
  149542. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  149543. + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;
  149544. + break;
  149545. + case WPA_CIPHER_WEP40:
  149546. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  149547. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149548. + break;
  149549. + case WPA_CIPHER_TKIP:
  149550. + padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_;
  149551. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
  149552. + break;
  149553. + case WPA_CIPHER_CCMP:
  149554. + padapter->securitypriv.dot11PrivacyAlgrthm=_AES_;
  149555. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
  149556. + break;
  149557. + case WPA_CIPHER_WEP104:
  149558. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  149559. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  149560. + break;
  149561. + }
  149562. +
  149563. + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
  149564. + {//set wps_ie
  149565. + u16 cnt = 0;
  149566. + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};
  149567. +
  149568. + while( cnt < ielen )
  149569. + {
  149570. + eid = buf[cnt];
  149571. +
  149572. + if((eid==_VENDOR_SPECIFIC_IE_)&&(_rtw_memcmp(&buf[cnt+2], wps_oui, 4)==_TRUE))
  149573. + {
  149574. + DBG_871X("SET WPS_IE\n");
  149575. +
  149576. + padapter->securitypriv.wps_ie_len = ( (buf[cnt+1]+2) < (MAX_WPA_IE_LEN<<2)) ? (buf[cnt+1]+2):(MAX_WPA_IE_LEN<<2);
  149577. +
  149578. + _rtw_memcpy(padapter->securitypriv.wps_ie, &buf[cnt], padapter->securitypriv.wps_ie_len);
  149579. +
  149580. + set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);
  149581. +
  149582. +#ifdef CONFIG_P2P
  149583. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK))
  149584. + {
  149585. + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_ING);
  149586. + }
  149587. +#endif //CONFIG_P2P
  149588. + cnt += buf[cnt+1]+2;
  149589. +
  149590. + break;
  149591. + } else {
  149592. + cnt += buf[cnt+1]+2; //goto next
  149593. + }
  149594. + }
  149595. + }
  149596. + }
  149597. +
  149598. + //TKIP and AES disallow multicast packets until installing group key
  149599. + if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_
  149600. + || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_
  149601. + || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)
  149602. + //WPS open need to enable multicast
  149603. + //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE)
  149604. + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr);
  149605. +
  149606. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  149607. + ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n",
  149608. + pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype));
  149609. +
  149610. +exit:
  149611. +
  149612. + if (buf) rtw_mfree(buf, ielen);
  149613. +
  149614. + return ret;
  149615. +}
  149616. +
  149617. +static int rtw_wx_get_name(struct net_device *dev,
  149618. + struct iw_request_info *info,
  149619. + union iwreq_data *wrqu, char *extra)
  149620. +{
  149621. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149622. + u16 cap;
  149623. + u32 ht_ielen = 0;
  149624. + char *p;
  149625. + u8 ht_cap=_FALSE;
  149626. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  149627. + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;
  149628. + NDIS_802_11_RATES_EX* prates = NULL;
  149629. +
  149630. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("cmd_code=%x\n", info->cmd));
  149631. +
  149632. + _func_enter_;
  149633. +
  149634. + if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)
  149635. + {
  149636. + //parsing HT_CAP_IE
  149637. + p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength-12);
  149638. + if(p && ht_ielen>0)
  149639. + {
  149640. + ht_cap = _TRUE;
  149641. + }
  149642. +
  149643. + prates = &pcur_bss->SupportedRates;
  149644. +
  149645. + if (rtw_is_cckratesonly_included((u8*)prates) == _TRUE)
  149646. + {
  149647. + if(ht_cap == _TRUE)
  149648. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bn");
  149649. + else
  149650. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
  149651. + }
  149652. + else if ((rtw_is_cckrates_included((u8*)prates)) == _TRUE)
  149653. + {
  149654. + if(ht_cap == _TRUE)
  149655. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bgn");
  149656. + else
  149657. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bg");
  149658. + }
  149659. + else
  149660. + {
  149661. + if(pcur_bss->Configuration.DSConfig > 14)
  149662. + {
  149663. + if(ht_cap == _TRUE)
  149664. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11an");
  149665. + else
  149666. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11a");
  149667. + }
  149668. + else
  149669. + {
  149670. + if(ht_cap == _TRUE)
  149671. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11gn");
  149672. + else
  149673. + snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11g");
  149674. + }
  149675. + }
  149676. + }
  149677. + else
  149678. + {
  149679. + //prates = &padapter->registrypriv.dev_network.SupportedRates;
  149680. + //snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11g");
  149681. + snprintf(wrqu->name, IFNAMSIZ, "unassociated");
  149682. + }
  149683. +
  149684. + _func_exit_;
  149685. +
  149686. + return 0;
  149687. +}
  149688. +
  149689. +static int rtw_wx_set_freq(struct net_device *dev,
  149690. + struct iw_request_info *info,
  149691. + union iwreq_data *wrqu, char *extra)
  149692. +{
  149693. + _func_enter_;
  149694. +
  149695. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_wx_set_freq\n"));
  149696. +
  149697. + _func_exit_;
  149698. +
  149699. + return 0;
  149700. +}
  149701. +
  149702. +static int rtw_wx_get_freq(struct net_device *dev,
  149703. + struct iw_request_info *info,
  149704. + union iwreq_data *wrqu, char *extra)
  149705. +{
  149706. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149707. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  149708. + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;
  149709. +
  149710. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  149711. + {
  149712. + //wrqu->freq.m = ieee80211_wlan_frequencies[pcur_bss->Configuration.DSConfig-1] * 100000;
  149713. + wrqu->freq.m = rtw_ch2freq(pcur_bss->Configuration.DSConfig) * 100000;
  149714. + wrqu->freq.e = 1;
  149715. + wrqu->freq.i = pcur_bss->Configuration.DSConfig;
  149716. +
  149717. + }
  149718. + else{
  149719. + wrqu->freq.m = rtw_ch2freq(padapter->mlmeextpriv.cur_channel) * 100000;
  149720. + wrqu->freq.e = 1;
  149721. + wrqu->freq.i = padapter->mlmeextpriv.cur_channel;
  149722. + }
  149723. +
  149724. + return 0;
  149725. +}
  149726. +
  149727. +static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
  149728. + union iwreq_data *wrqu, char *b)
  149729. +{
  149730. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149731. + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ;
  149732. + int ret = 0;
  149733. + _irqL irqL;
  149734. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  149735. + _queue *queue = &pmlmepriv->scanned_queue;
  149736. + _func_enter_;
  149737. +
  149738. + if(_FAIL == rtw_pwr_wakeup(padapter)) {
  149739. + ret= -EPERM;
  149740. + goto exit;
  149741. + }
  149742. +
  149743. + if (padapter->hw_init_completed==_FALSE){
  149744. + ret = -EPERM;
  149745. + goto exit;
  149746. + }
  149747. +
  149748. + switch(wrqu->mode)
  149749. + {
  149750. + case IW_MODE_AUTO:
  149751. + networkType = Ndis802_11AutoUnknown;
  149752. + DBG_871X("set_mode = IW_MODE_AUTO\n");
  149753. + break;
  149754. + case IW_MODE_ADHOC:
  149755. + networkType = Ndis802_11IBSS;
  149756. + DBG_871X("set_mode = IW_MODE_ADHOC\n");
  149757. + break;
  149758. + case IW_MODE_MASTER:
  149759. + networkType = Ndis802_11APMode;
  149760. + DBG_871X("set_mode = IW_MODE_MASTER\n");
  149761. + //rtw_setopmode_cmd(padapter, networkType);
  149762. + break;
  149763. + case IW_MODE_INFRA:
  149764. + networkType = Ndis802_11Infrastructure;
  149765. + DBG_871X("set_mode = IW_MODE_INFRA\n");
  149766. + break;
  149767. +
  149768. + default :
  149769. + ret = -EINVAL;;
  149770. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("\n Mode: %s is not supported \n", iw_operation_mode[wrqu->mode]));
  149771. + goto exit;
  149772. + }
  149773. +
  149774. +/*
  149775. + if(Ndis802_11APMode == networkType)
  149776. + {
  149777. + rtw_setopmode_cmd(padapter, networkType);
  149778. + }
  149779. + else
  149780. + {
  149781. + rtw_setopmode_cmd(padapter, Ndis802_11AutoUnknown);
  149782. + }
  149783. +*/
  149784. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  149785. + _enter_critical_bh(&queue->lock, &irqL);
  149786. + if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE){
  149787. +
  149788. + ret = -EPERM;
  149789. + _exit_critical_bh(&queue->lock, &irqL);
  149790. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  149791. + goto exit;
  149792. +
  149793. + }
  149794. + _exit_critical_bh(&queue->lock, &irqL);
  149795. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  149796. + rtw_setopmode_cmd(padapter, networkType);
  149797. +
  149798. +exit:
  149799. +
  149800. + _func_exit_;
  149801. +
  149802. + return ret;
  149803. +
  149804. +}
  149805. +
  149806. +static int rtw_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
  149807. + union iwreq_data *wrqu, char *b)
  149808. +{
  149809. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149810. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  149811. +
  149812. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(" rtw_wx_get_mode \n"));
  149813. +
  149814. + _func_enter_;
  149815. +
  149816. + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  149817. + {
  149818. + wrqu->mode = IW_MODE_INFRA;
  149819. + }
  149820. + else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
  149821. + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
  149822. +
  149823. + {
  149824. + wrqu->mode = IW_MODE_ADHOC;
  149825. + }
  149826. + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  149827. + {
  149828. + wrqu->mode = IW_MODE_MASTER;
  149829. + }
  149830. + else
  149831. + {
  149832. + wrqu->mode = IW_MODE_AUTO;
  149833. + }
  149834. +
  149835. + _func_exit_;
  149836. +
  149837. + return 0;
  149838. +
  149839. +}
  149840. +
  149841. +
  149842. +static int rtw_wx_set_pmkid(struct net_device *dev,
  149843. + struct iw_request_info *a,
  149844. + union iwreq_data *wrqu, char *extra)
  149845. +{
  149846. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149847. + u8 j,blInserted = _FALSE;
  149848. + int intReturn = _FALSE;
  149849. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  149850. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  149851. + struct iw_pmksa* pPMK = ( struct iw_pmksa* ) extra;
  149852. + u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 };
  149853. + u8 strIssueBssid[ ETH_ALEN ] = { 0x00 };
  149854. +
  149855. +/*
  149856. + struct iw_pmksa
  149857. + {
  149858. + __u32 cmd;
  149859. + struct sockaddr bssid;
  149860. + __u8 pmkid[IW_PMKID_LEN]; //IW_PMKID_LEN=16
  149861. + }
  149862. + There are the BSSID information in the bssid.sa_data array.
  149863. + If cmd is IW_PMKSA_FLUSH, it means the wpa_suppplicant wants to clear all the PMKID information.
  149864. + If cmd is IW_PMKSA_ADD, it means the wpa_supplicant wants to add a PMKID/BSSID to driver.
  149865. + If cmd is IW_PMKSA_REMOVE, it means the wpa_supplicant wants to remove a PMKID/BSSID from driver.
  149866. + */
  149867. +
  149868. + _rtw_memcpy( strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN);
  149869. + if ( pPMK->cmd == IW_PMKSA_ADD )
  149870. + {
  149871. + DBG_871X( "[rtw_wx_set_pmkid] IW_PMKSA_ADD!\n" );
  149872. + if ( _rtw_memcmp( strIssueBssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )
  149873. + {
  149874. + return( intReturn );
  149875. + }
  149876. + else
  149877. + {
  149878. + intReturn = _TRUE;
  149879. + }
  149880. + blInserted = _FALSE;
  149881. +
  149882. + //overwrite PMKID
  149883. + for(j=0 ; j<NUM_PMKID_CACHE; j++)
  149884. + {
  149885. + if( _rtw_memcmp( psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN) ==_TRUE )
  149886. + { // BSSID is matched, the same AP => rewrite with new PMKID.
  149887. +
  149888. + DBG_871X( "[rtw_wx_set_pmkid] BSSID exists in the PMKList.\n" );
  149889. +
  149890. + _rtw_memcpy( psecuritypriv->PMKIDList[j].PMKID, pPMK->pmkid, IW_PMKID_LEN);
  149891. + psecuritypriv->PMKIDList[ j ].bUsed = _TRUE;
  149892. + psecuritypriv->PMKIDIndex = j+1;
  149893. + blInserted = _TRUE;
  149894. + break;
  149895. + }
  149896. + }
  149897. +
  149898. + if(!blInserted)
  149899. + {
  149900. + // Find a new entry
  149901. + DBG_871X( "[rtw_wx_set_pmkid] Use the new entry index = %d for this PMKID.\n",
  149902. + psecuritypriv->PMKIDIndex );
  149903. +
  149904. + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, strIssueBssid, ETH_ALEN);
  149905. + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pPMK->pmkid, IW_PMKID_LEN);
  149906. +
  149907. + psecuritypriv->PMKIDList[ psecuritypriv->PMKIDIndex ].bUsed = _TRUE;
  149908. + psecuritypriv->PMKIDIndex++ ;
  149909. + if(psecuritypriv->PMKIDIndex==16)
  149910. + {
  149911. + psecuritypriv->PMKIDIndex =0;
  149912. + }
  149913. + }
  149914. + }
  149915. + else if ( pPMK->cmd == IW_PMKSA_REMOVE )
  149916. + {
  149917. + DBG_871X( "[rtw_wx_set_pmkid] IW_PMKSA_REMOVE!\n" );
  149918. + intReturn = _TRUE;
  149919. + for(j=0 ; j<NUM_PMKID_CACHE; j++)
  149920. + {
  149921. + if( _rtw_memcmp( psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN) ==_TRUE )
  149922. + { // BSSID is matched, the same AP => Remove this PMKID information and reset it.
  149923. + _rtw_memset( psecuritypriv->PMKIDList[ j ].Bssid, 0x00, ETH_ALEN );
  149924. + psecuritypriv->PMKIDList[ j ].bUsed = _FALSE;
  149925. + break;
  149926. + }
  149927. + }
  149928. + }
  149929. + else if ( pPMK->cmd == IW_PMKSA_FLUSH )
  149930. + {
  149931. + DBG_871X( "[rtw_wx_set_pmkid] IW_PMKSA_FLUSH!\n" );
  149932. + _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );
  149933. + psecuritypriv->PMKIDIndex = 0;
  149934. + intReturn = _TRUE;
  149935. + }
  149936. + return( intReturn );
  149937. +}
  149938. +
  149939. +static int rtw_wx_get_sens(struct net_device *dev,
  149940. + struct iw_request_info *info,
  149941. + union iwreq_data *wrqu, char *extra)
  149942. +{
  149943. + #ifdef CONFIG_PLATFORM_ROCKCHIPS
  149944. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149945. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  149946. +
  149947. + /*
  149948. + * 20110311 Commented by Jeff
  149949. + * For rockchip platform's wpa_driver_wext_get_rssi
  149950. + */
  149951. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  149952. + //wrqu->sens.value=-padapter->recvpriv.signal_strength;
  149953. + wrqu->sens.value=-padapter->recvpriv.rssi;
  149954. + //DBG_871X("%s: %d\n", __FUNCTION__, wrqu->sens.value);
  149955. + wrqu->sens.fixed = 0; /* no auto select */
  149956. + } else
  149957. + #endif
  149958. + {
  149959. + wrqu->sens.value = 0;
  149960. + wrqu->sens.fixed = 0; /* no auto select */
  149961. + wrqu->sens.disabled = 1;
  149962. + }
  149963. + return 0;
  149964. +}
  149965. +
  149966. +static int rtw_wx_get_range(struct net_device *dev,
  149967. + struct iw_request_info *info,
  149968. + union iwreq_data *wrqu, char *extra)
  149969. +{
  149970. + struct iw_range *range = (struct iw_range *)extra;
  149971. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  149972. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  149973. +
  149974. + u16 val;
  149975. + int i;
  149976. +
  149977. + _func_enter_;
  149978. +
  149979. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_range. cmd_code=%x\n", info->cmd));
  149980. +
  149981. + wrqu->data.length = sizeof(*range);
  149982. + _rtw_memset(range, 0, sizeof(*range));
  149983. +
  149984. + /* Let's try to keep this struct in the same order as in
  149985. + * linux/include/wireless.h
  149986. + */
  149987. +
  149988. + /* TODO: See what values we can set, and remove the ones we can't
  149989. + * set, or fill them with some default data.
  149990. + */
  149991. +
  149992. + /* ~5 Mb/s real (802.11b) */
  149993. + range->throughput = 5 * 1000 * 1000;
  149994. +
  149995. + // TODO: Not used in 802.11b?
  149996. +// range->min_nwid; /* Minimal NWID we are able to set */
  149997. + // TODO: Not used in 802.11b?
  149998. +// range->max_nwid; /* Maximal NWID we are able to set */
  149999. +
  150000. + /* Old Frequency (backward compat - moved lower ) */
  150001. +// range->old_num_channels;
  150002. +// range->old_num_frequency;
  150003. +// range->old_freq[6]; /* Filler to keep "version" at the same offset */
  150004. +
  150005. + /* signal level threshold range */
  150006. +
  150007. + //percent values between 0 and 100.
  150008. + range->max_qual.qual = 100;
  150009. + range->max_qual.level = 100;
  150010. + range->max_qual.noise = 100;
  150011. + range->max_qual.updated = 7; /* Updated all three */
  150012. +
  150013. +
  150014. + range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
  150015. + /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
  150016. + range->avg_qual.level = 20 + -98;
  150017. + range->avg_qual.noise = 0;
  150018. + range->avg_qual.updated = 7; /* Updated all three */
  150019. +
  150020. + range->num_bitrates = RATE_COUNT;
  150021. +
  150022. + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
  150023. + range->bitrate[i] = rtw_rates[i];
  150024. + }
  150025. +
  150026. + range->min_frag = MIN_FRAG_THRESHOLD;
  150027. + range->max_frag = MAX_FRAG_THRESHOLD;
  150028. +
  150029. + range->pm_capa = 0;
  150030. +
  150031. + range->we_version_compiled = WIRELESS_EXT;
  150032. + range->we_version_source = 16;
  150033. +
  150034. +// range->retry_capa; /* What retry options are supported */
  150035. +// range->retry_flags; /* How to decode max/min retry limit */
  150036. +// range->r_time_flags; /* How to decode max/min retry life */
  150037. +// range->min_retry; /* Minimal number of retries */
  150038. +// range->max_retry; /* Maximal number of retries */
  150039. +// range->min_r_time; /* Minimal retry lifetime */
  150040. +// range->max_r_time; /* Maximal retry lifetime */
  150041. +
  150042. + for (i = 0, val = 0; i < MAX_CHANNEL_NUM; i++) {
  150043. +
  150044. + // Include only legal frequencies for some countries
  150045. + if(pmlmeext->channel_set[i].ChannelNum != 0)
  150046. + {
  150047. + range->freq[val].i = pmlmeext->channel_set[i].ChannelNum;
  150048. + range->freq[val].m = rtw_ch2freq(pmlmeext->channel_set[i].ChannelNum) * 100000;
  150049. + range->freq[val].e = 1;
  150050. + val++;
  150051. + }
  150052. +
  150053. + if (val == IW_MAX_FREQUENCIES)
  150054. + break;
  150055. + }
  150056. +
  150057. + range->num_channels = val;
  150058. + range->num_frequency = val;
  150059. +
  150060. +// Commented by Albert 2009/10/13
  150061. +// The following code will proivde the security capability to network manager.
  150062. +// If the driver doesn't provide this capability to network manager,
  150063. +// the WPA/WPA2 routers can't be choosen in the network manager.
  150064. +
  150065. +/*
  150066. +#define IW_SCAN_CAPA_NONE 0x00
  150067. +#define IW_SCAN_CAPA_ESSID 0x01
  150068. +#define IW_SCAN_CAPA_BSSID 0x02
  150069. +#define IW_SCAN_CAPA_CHANNEL 0x04
  150070. +#define IW_SCAN_CAPA_MODE 0x08
  150071. +#define IW_SCAN_CAPA_RATE 0x10
  150072. +#define IW_SCAN_CAPA_TYPE 0x20
  150073. +#define IW_SCAN_CAPA_TIME 0x40
  150074. +*/
  150075. +
  150076. +#if WIRELESS_EXT > 17
  150077. + range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|
  150078. + IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;
  150079. +#endif
  150080. +
  150081. +#ifdef IW_SCAN_CAPA_ESSID //WIRELESS_EXT > 21
  150082. + range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE |IW_SCAN_CAPA_BSSID|
  150083. + IW_SCAN_CAPA_CHANNEL|IW_SCAN_CAPA_MODE|IW_SCAN_CAPA_RATE;
  150084. +#endif
  150085. +
  150086. +
  150087. + _func_exit_;
  150088. +
  150089. + return 0;
  150090. +
  150091. +}
  150092. +
  150093. +//set bssid flow
  150094. +//s1. rtw_set_802_11_infrastructure_mode()
  150095. +//s2. rtw_set_802_11_authentication_mode()
  150096. +//s3. set_802_11_encryption_mode()
  150097. +//s4. rtw_set_802_11_bssid()
  150098. +static int rtw_wx_set_wap(struct net_device *dev,
  150099. + struct iw_request_info *info,
  150100. + union iwreq_data *awrq,
  150101. + char *extra)
  150102. +{
  150103. + _irqL irqL;
  150104. + uint ret = 0;
  150105. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150106. + struct sockaddr *temp = (struct sockaddr *)awrq;
  150107. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  150108. + _list *phead;
  150109. + u8 *dst_bssid, *src_bssid;
  150110. + _queue *queue = &(pmlmepriv->scanned_queue);
  150111. + struct wlan_network *pnetwork = NULL;
  150112. + NDIS_802_11_AUTHENTICATION_MODE authmode;
  150113. +
  150114. + _func_enter_;
  150115. +/*
  150116. +#ifdef CONFIG_CONCURRENT_MODE
  150117. + if(padapter->iface_type > PRIMARY_IFACE)
  150118. + {
  150119. + ret = -EINVAL;
  150120. + goto exit;
  150121. + }
  150122. +#endif
  150123. +*/
  150124. +
  150125. +#ifdef CONFIG_CONCURRENT_MODE
  150126. + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  150127. + {
  150128. + printk("set bssid, but buddy_intf is under scanning or linking\n");
  150129. +
  150130. + ret = -EINVAL;
  150131. +
  150132. + goto exit;
  150133. + }
  150134. +#endif
  150135. +
  150136. +#ifdef CONFIG_DUALMAC_CONCURRENT
  150137. + if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
  150138. + {
  150139. + printk("set bssid, but buddy_intf is under scanning or linking\n");
  150140. + ret = -EINVAL;
  150141. + goto exit;
  150142. + }
  150143. +#endif
  150144. +
  150145. + if(_FAIL == rtw_pwr_wakeup(padapter))
  150146. + {
  150147. + ret= -1;
  150148. + goto exit;
  150149. + }
  150150. +
  150151. + if(!padapter->bup){
  150152. + ret = -1;
  150153. + goto exit;
  150154. + }
  150155. +
  150156. +
  150157. + if (temp->sa_family != ARPHRD_ETHER){
  150158. + ret = -EINVAL;
  150159. + goto exit;
  150160. + }
  150161. +
  150162. + authmode = padapter->securitypriv.ndisauthtype;
  150163. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  150164. + _enter_critical_bh(&queue->lock, &irqL);
  150165. + phead = get_list_head(queue);
  150166. + pmlmepriv->pscanned = get_next(phead);
  150167. +
  150168. + while (1)
  150169. + {
  150170. +
  150171. + if ((rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) == _TRUE)
  150172. + {
  150173. +#if 0
  150174. + ret = -EINVAL;
  150175. + goto exit;
  150176. +
  150177. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
  150178. + {
  150179. + rtw_set_802_11_bssid(padapter, temp->sa_data);
  150180. + goto exit;
  150181. + }
  150182. + else
  150183. + {
  150184. + ret = -EINVAL;
  150185. + goto exit;
  150186. + }
  150187. +#endif
  150188. +
  150189. + break;
  150190. + }
  150191. +
  150192. + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);
  150193. +
  150194. + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
  150195. +
  150196. + dst_bssid = pnetwork->network.MacAddress;
  150197. +
  150198. + src_bssid = temp->sa_data;
  150199. +
  150200. + if ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == _TRUE)
  150201. + {
  150202. + if(!rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode))
  150203. + {
  150204. + ret = -1;
  150205. + _exit_critical_bh(&queue->lock, &irqL);
  150206. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  150207. + goto exit;
  150208. + }
  150209. +
  150210. + break;
  150211. + }
  150212. +
  150213. + }
  150214. + _exit_critical_bh(&queue->lock, &irqL);
  150215. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  150216. + rtw_set_802_11_authentication_mode(padapter, authmode);
  150217. + //set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);
  150218. + if (rtw_set_802_11_bssid(padapter, temp->sa_data) == _FALSE) {
  150219. + ret = -1;
  150220. + goto exit;
  150221. + }
  150222. +
  150223. +exit:
  150224. +
  150225. + _func_exit_;
  150226. +
  150227. + return ret;
  150228. +}
  150229. +
  150230. +static int rtw_wx_get_wap(struct net_device *dev,
  150231. + struct iw_request_info *info,
  150232. + union iwreq_data *wrqu, char *extra)
  150233. +{
  150234. +
  150235. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150236. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  150237. + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;
  150238. +
  150239. + wrqu->ap_addr.sa_family = ARPHRD_ETHER;
  150240. +
  150241. + _rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
  150242. +
  150243. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_wap\n"));
  150244. +
  150245. + _func_enter_;
  150246. +
  150247. + if ( ((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) ||
  150248. + ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) ||
  150249. + ((check_fwstate(pmlmepriv, WIFI_AP_STATE)) == _TRUE) )
  150250. + {
  150251. +
  150252. + _rtw_memcpy(wrqu->ap_addr.sa_data, pcur_bss->MacAddress, ETH_ALEN);
  150253. + }
  150254. + else
  150255. + {
  150256. + _rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
  150257. + }
  150258. +
  150259. + _func_exit_;
  150260. +
  150261. + return 0;
  150262. +
  150263. +}
  150264. +
  150265. +static int rtw_wx_set_mlme(struct net_device *dev,
  150266. + struct iw_request_info *info,
  150267. + union iwreq_data *wrqu, char *extra)
  150268. +{
  150269. +#if 0
  150270. +/* SIOCSIWMLME data */
  150271. +struct iw_mlme
  150272. +{
  150273. + __u16 cmd; /* IW_MLME_* */
  150274. + __u16 reason_code;
  150275. + struct sockaddr addr;
  150276. +};
  150277. +#endif
  150278. +
  150279. + int ret=0;
  150280. + u16 reason;
  150281. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150282. + struct iw_mlme *mlme = (struct iw_mlme *) extra;
  150283. +
  150284. +
  150285. + if(mlme==NULL)
  150286. + return -1;
  150287. +
  150288. + printk("%s\n", __FUNCTION__);
  150289. +
  150290. + reason = cpu_to_le16(mlme->reason_code);
  150291. +
  150292. +
  150293. + printk("%s, cmd=%d, reason=%d\n", __FUNCTION__, mlme->cmd, reason);
  150294. +
  150295. + switch (mlme->cmd)
  150296. + {
  150297. + case IW_MLME_DEAUTH:
  150298. + if(!rtw_set_802_11_disassociate(padapter))
  150299. + ret = -1;
  150300. + break;
  150301. +
  150302. + case IW_MLME_DISASSOC:
  150303. + if(!rtw_set_802_11_disassociate(padapter))
  150304. + ret = -1;
  150305. +
  150306. + break;
  150307. +
  150308. + default:
  150309. + return -EOPNOTSUPP;
  150310. + }
  150311. +
  150312. + return ret;
  150313. +
  150314. +}
  150315. +
  150316. +static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
  150317. + union iwreq_data *wrqu, char *extra)
  150318. +{
  150319. + u8 _status = _FALSE;
  150320. + int ret = 0;
  150321. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150322. + struct mlme_priv *pmlmepriv= &padapter->mlmepriv;
  150323. + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
  150324. + _irqL irqL;
  150325. +#ifdef CONFIG_P2P
  150326. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  150327. +#endif //CONFIG_P2P
  150328. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_set_scan\n"));
  150329. +
  150330. +_func_enter_;
  150331. +
  150332. + #ifdef DBG_IOCTL
  150333. + DBG_871X("DBG_IOCTL %s:%d\n",__FUNCTION__, __LINE__);
  150334. + #endif
  150335. +/*
  150336. +#ifdef CONFIG_CONCURRENT_MODE
  150337. + if(padapter->iface_type > PRIMARY_IFACE)
  150338. + {
  150339. + ret = -1;
  150340. + goto exit;
  150341. + }
  150342. +#endif
  150343. +*/
  150344. +
  150345. +#ifdef CONFIG_MP_INCLUDED
  150346. + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  150347. + {
  150348. + ret = -1;
  150349. + goto exit;
  150350. + }
  150351. +#endif
  150352. +
  150353. + if(_FAIL == rtw_pwr_wakeup(padapter))
  150354. + {
  150355. + ret= -1;
  150356. + goto exit;
  150357. + }
  150358. +
  150359. + if(padapter->bDriverStopped){
  150360. + DBG_871X("bDriverStopped=%d\n", padapter->bDriverStopped);
  150361. + ret= -1;
  150362. + goto exit;
  150363. + }
  150364. +
  150365. + if(!padapter->bup){
  150366. + ret = -1;
  150367. + goto exit;
  150368. + }
  150369. +
  150370. + if (padapter->hw_init_completed==_FALSE){
  150371. + ret = -1;
  150372. + goto exit;
  150373. + }
  150374. +
  150375. + // When Busy Traffic, driver do not site survey. So driver return success.
  150376. + // wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout.
  150377. + // modify by thomas 2011-02-22.
  150378. + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
  150379. + {
  150380. + indicate_wx_scan_complete_event(padapter);
  150381. + goto exit;
  150382. + }
  150383. +
  150384. + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  150385. + {
  150386. + indicate_wx_scan_complete_event(padapter);
  150387. + goto exit;
  150388. + }
  150389. +
  150390. +#ifdef CONFIG_CONCURRENT_MODE
  150391. + if (check_buddy_fwstate(padapter,
  150392. + _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)
  150393. + {
  150394. + if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY))
  150395. + {
  150396. + printk("scanning_via_buddy_intf\n");
  150397. + pmlmepriv->scanning_via_buddy_intf = _TRUE;
  150398. + }
  150399. +
  150400. + indicate_wx_scan_complete_event(padapter);
  150401. +
  150402. + goto exit;
  150403. + }
  150404. +#endif
  150405. +
  150406. +#ifdef CONFIG_DUALMAC_CONCURRENT
  150407. + if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
  150408. + {
  150409. + indicate_wx_scan_complete_event(padapter);
  150410. + goto exit;
  150411. + }
  150412. +#endif
  150413. +
  150414. +// Mareded by Albert 20101103
  150415. +// For the DMP WiFi Display project, the driver won't to scan because
  150416. +// the pmlmepriv->scan_interval is always equal to 3.
  150417. +// So, the wpa_supplicant won't find out the WPS SoftAP.
  150418. +
  150419. +/*
  150420. + if(pmlmepriv->scan_interval>10)
  150421. + pmlmepriv->scan_interval = 0;
  150422. +
  150423. + if(pmlmepriv->scan_interval > 0)
  150424. + {
  150425. + DBG_871X("scan done\n");
  150426. + ret = 0;
  150427. + goto exit;
  150428. + }
  150429. +
  150430. +*/
  150431. +#ifdef CONFIG_P2P
  150432. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  150433. + {
  150434. + rtw_p2p_set_pre_state( pwdinfo, rtw_p2p_state( pwdinfo ) );
  150435. + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
  150436. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_FULL);
  150437. + rtw_free_network_queue(padapter, _TRUE);
  150438. + }
  150439. +#endif //CONFIG_P2P
  150440. +
  150441. + _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT);
  150442. +
  150443. +#if WIRELESS_EXT >= 17
  150444. + if (wrqu->data.length == sizeof(struct iw_scan_req))
  150445. + {
  150446. + struct iw_scan_req *req = (struct iw_scan_req *)extra;
  150447. +
  150448. + if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
  150449. + {
  150450. + int len = min((int)req->essid_len, IW_ESSID_MAX_SIZE);
  150451. +
  150452. + _rtw_memcpy(ssid[0].Ssid, req->essid, len);
  150453. + ssid[0].SsidLength = len;
  150454. +
  150455. + DBG_871X("IW_SCAN_THIS_ESSID, ssid=%s, len=%d\n", req->essid, req->essid_len);
  150456. +
  150457. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  150458. +
  150459. + _status = rtw_sitesurvey_cmd(padapter, ssid, 1, NULL, 0);
  150460. +
  150461. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  150462. +
  150463. + }
  150464. + else if (req->scan_type == IW_SCAN_TYPE_PASSIVE)
  150465. + {
  150466. + DBG_871X("rtw_wx_set_scan, req->scan_type == IW_SCAN_TYPE_PASSIVE\n");
  150467. + }
  150468. +
  150469. + }
  150470. + else
  150471. +#endif
  150472. +
  150473. + if( wrqu->data.length >= WEXT_CSCAN_HEADER_SIZE
  150474. + && _rtw_memcmp(extra, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE) == _TRUE
  150475. + )
  150476. + {
  150477. + int len = wrqu->data.length -WEXT_CSCAN_HEADER_SIZE;
  150478. + char *pos = extra+WEXT_CSCAN_HEADER_SIZE;
  150479. + char section;
  150480. + char sec_len;
  150481. + int ssid_index = 0;
  150482. +
  150483. + //DBG_871X("%s COMBO_SCAN header is recognized\n", __FUNCTION__);
  150484. +
  150485. + while(len >= 1) {
  150486. + section = *(pos++); len-=1;
  150487. +
  150488. + switch(section) {
  150489. + case WEXT_CSCAN_SSID_SECTION:
  150490. + //DBG_871X("WEXT_CSCAN_SSID_SECTION\n");
  150491. + if(len < 1) {
  150492. + len = 0;
  150493. + break;
  150494. + }
  150495. +
  150496. + sec_len = *(pos++); len-=1;
  150497. +
  150498. + if(sec_len>0 && sec_len<=len) {
  150499. + ssid[ssid_index].SsidLength = sec_len;
  150500. + _rtw_memcpy(ssid[ssid_index].Ssid, pos, ssid[ssid_index].SsidLength);
  150501. + //DBG_871X("%s COMBO_SCAN with specific ssid:%s, %d\n", __FUNCTION__
  150502. + // , ssid[ssid_index].Ssid, ssid[ssid_index].SsidLength);
  150503. + ssid_index++;
  150504. + }
  150505. +
  150506. + pos+=sec_len; len-=sec_len;
  150507. + break;
  150508. +
  150509. +
  150510. + case WEXT_CSCAN_CHANNEL_SECTION:
  150511. + //DBG_871X("WEXT_CSCAN_CHANNEL_SECTION\n");
  150512. + pos+=1; len-=1;
  150513. + break;
  150514. + case WEXT_CSCAN_ACTV_DWELL_SECTION:
  150515. + //DBG_871X("WEXT_CSCAN_ACTV_DWELL_SECTION\n");
  150516. + pos+=2; len-=2;
  150517. + break;
  150518. + case WEXT_CSCAN_PASV_DWELL_SECTION:
  150519. + //DBG_871X("WEXT_CSCAN_PASV_DWELL_SECTION\n");
  150520. + pos+=2; len-=2;
  150521. + break;
  150522. + case WEXT_CSCAN_HOME_DWELL_SECTION:
  150523. + //DBG_871X("WEXT_CSCAN_HOME_DWELL_SECTION\n");
  150524. + pos+=2; len-=2;
  150525. + break;
  150526. + case WEXT_CSCAN_TYPE_SECTION:
  150527. + //DBG_871X("WEXT_CSCAN_TYPE_SECTION\n");
  150528. + pos+=1; len-=1;
  150529. + break;
  150530. + #if 0
  150531. + case WEXT_CSCAN_NPROBE_SECTION:
  150532. + DBG_871X("WEXT_CSCAN_NPROBE_SECTION\n");
  150533. + break;
  150534. + #endif
  150535. +
  150536. + default:
  150537. + //DBG_871X("Unknown CSCAN section %c\n", section);
  150538. + len = 0; // stop parsing
  150539. + }
  150540. + //DBG_871X("len:%d\n", len);
  150541. +
  150542. + }
  150543. +
  150544. + //jeff: it has still some scan paramater to parse, we only do this now...
  150545. + _status = rtw_set_802_11_bssid_list_scan(padapter, ssid, RTW_SSID_SCAN_AMOUNT);
  150546. +
  150547. + } else
  150548. +
  150549. + {
  150550. + _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0);
  150551. + }
  150552. +
  150553. + if(_status == _FALSE)
  150554. + ret = -1;
  150555. +
  150556. +exit:
  150557. + #ifdef DBG_IOCTL
  150558. + DBG_871X("DBG_IOCTL %s:%d return %d\n",__FUNCTION__, __LINE__, ret);
  150559. + #endif
  150560. +
  150561. +_func_exit_;
  150562. +
  150563. + return ret;
  150564. +}
  150565. +
  150566. +static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
  150567. + union iwreq_data *wrqu, char *extra)
  150568. +{
  150569. + _irqL irqL;
  150570. + _list *plist, *phead;
  150571. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150572. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  150573. + _queue *queue = &(pmlmepriv->scanned_queue);
  150574. + struct wlan_network *pnetwork = NULL;
  150575. + char *ev = extra;
  150576. + char *stop = ev + wrqu->data.length;
  150577. + u32 ret = 0;
  150578. + u32 cnt=0;
  150579. + u32 wait_for_surveydone;
  150580. + sint wait_status;
  150581. +#ifdef CONFIG_CONCURRENT_MODE
  150582. + //PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;
  150583. + //struct mlme_priv *pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);
  150584. +#endif
  150585. +#ifdef CONFIG_P2P
  150586. + struct wifidirect_info* pwdinfo = &padapter->wdinfo;
  150587. +#endif //CONFIG_P2P
  150588. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan\n"));
  150589. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_, (" Start of Query SIOCGIWSCAN .\n"));
  150590. +
  150591. + _func_enter_;
  150592. +
  150593. + #ifdef DBG_IOCTL
  150594. + DBG_871X("DBG_IOCTL %s:%d\n",__FUNCTION__, __LINE__);
  150595. + #endif
  150596. +
  150597. +/*
  150598. +#ifdef CONFIG_CONCURRENT_MODE
  150599. + if(padapter->iface_type > PRIMARY_IFACE)
  150600. + {
  150601. + ret = -EINVAL;
  150602. + goto exit;
  150603. + }
  150604. +#endif
  150605. +*/
  150606. + if(padapter->pwrctrlpriv.brfoffbyhw && padapter->bDriverStopped)
  150607. + {
  150608. + ret = -EINVAL;
  150609. + goto exit;
  150610. + }
  150611. +
  150612. +#ifdef CONFIG_P2P
  150613. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  150614. + {
  150615. + // P2P is enabled
  150616. + if ( padapter->chip_type == RTL8192D )
  150617. + wait_for_surveydone = 300; // Because the 8192du supports more channels.
  150618. + else
  150619. + wait_for_surveydone = 200;
  150620. + }
  150621. + else
  150622. + {
  150623. + // P2P is disabled
  150624. + wait_for_surveydone = 100;
  150625. + }
  150626. +#else
  150627. + {
  150628. + wait_for_surveydone = 100;
  150629. + }
  150630. +#endif //CONFIG_P2P
  150631. +
  150632. +/*
  150633. +#ifdef CONFIG_CONCURRENT_MODE
  150634. + if(pmlmepriv->scanning_via_buddy_intf == _TRUE)
  150635. + {
  150636. + pmlmepriv->scanning_via_buddy_intf = _FALSE;//reset
  150637. +
  150638. + // change pointers to buddy interface
  150639. + padapter = pbuddy_adapter;
  150640. + pmlmepriv = pbuddy_mlmepriv;
  150641. + queue = &(pbuddy_mlmepriv->scanned_queue);
  150642. +
  150643. + }
  150644. +#endif // CONFIG_CONCURRENT_MODE
  150645. +*/
  150646. +
  150647. + wait_status = _FW_UNDER_SURVEY
  150648. + #ifndef CONFIG_ANDROID
  150649. + |_FW_UNDER_LINKING
  150650. + #endif
  150651. + ;
  150652. +
  150653. +#ifdef CONFIG_DUALMAC_CONCURRENT
  150654. + while(dc_check_fwstate(padapter, wait_status)== _TRUE)
  150655. + {
  150656. + rtw_msleep_os(30);
  150657. + cnt++;
  150658. + if(cnt > wait_for_surveydone )
  150659. + break;
  150660. + }
  150661. +#endif // CONFIG_DUALMAC_CONCURRENT
  150662. +
  150663. + while(check_fwstate(pmlmepriv, wait_status) == _TRUE)
  150664. + {
  150665. + rtw_msleep_os(30);
  150666. + cnt++;
  150667. + if(cnt > wait_for_surveydone )
  150668. + break;
  150669. + }
  150670. +
  150671. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  150672. +
  150673. + phead = get_list_head(queue);
  150674. + plist = get_next(phead);
  150675. +
  150676. + while(1)
  150677. + {
  150678. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  150679. + break;
  150680. +
  150681. + if((stop - ev) < SCAN_ITEM_SIZE) {
  150682. + ret = -E2BIG;
  150683. + break;
  150684. + }
  150685. +
  150686. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  150687. +
  150688. + //report network only if the current channel set contains the channel to which this network belongs
  150689. + if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0
  150690. + && rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE
  150691. + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))
  150692. + )
  150693. + {
  150694. + ev=translate_scan(padapter, a, pnetwork, ev, stop);
  150695. + }
  150696. +
  150697. + plist = get_next(plist);
  150698. +
  150699. + }
  150700. +
  150701. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  150702. +
  150703. + wrqu->data.length = ev-extra;
  150704. + wrqu->data.flags = 0;
  150705. +
  150706. +exit:
  150707. +
  150708. + _func_exit_;
  150709. +
  150710. + #ifdef DBG_IOCTL
  150711. + DBG_871X("DBG_IOCTL %s:%d return %d\n",__FUNCTION__, __LINE__, ret);
  150712. + #endif
  150713. +
  150714. + return ret ;
  150715. +
  150716. +}
  150717. +
  150718. +//set ssid flow
  150719. +//s1. rtw_set_802_11_infrastructure_mode()
  150720. +//s2. set_802_11_authenticaion_mode()
  150721. +//s3. set_802_11_encryption_mode()
  150722. +//s4. rtw_set_802_11_ssid()
  150723. +static int rtw_wx_set_essid(struct net_device *dev,
  150724. + struct iw_request_info *a,
  150725. + union iwreq_data *wrqu, char *extra)
  150726. +{
  150727. + _irqL irqL;
  150728. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150729. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  150730. + _queue *queue = &pmlmepriv->scanned_queue;
  150731. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  150732. + _list *phead;
  150733. + s8 status = _TRUE;
  150734. + struct wlan_network *pnetwork = NULL;
  150735. + NDIS_802_11_AUTHENTICATION_MODE authmode;
  150736. + NDIS_802_11_SSID ndis_ssid;
  150737. + u8 *dst_ssid, *src_ssid;
  150738. +
  150739. + uint ret = 0, len;
  150740. +
  150741. + _func_enter_;
  150742. +
  150743. + #ifdef DBG_IOCTL
  150744. + DBG_871X("DBG_IOCTL %s:%d\n",__FUNCTION__, __LINE__);
  150745. + #endif
  150746. +
  150747. +/*
  150748. +#ifdef CONFIG_CONCURRENT_MODE
  150749. + if(padapter->iface_type > PRIMARY_IFACE)
  150750. + {
  150751. + ret = -EINVAL;
  150752. + goto exit;
  150753. + }
  150754. +#endif
  150755. +*/
  150756. +
  150757. +#ifdef CONFIG_CONCURRENT_MODE
  150758. + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
  150759. + {
  150760. + printk("set ssid, but buddy_intf is under scanning or linking\n");
  150761. +
  150762. + ret = -EINVAL;
  150763. +
  150764. + goto exit;
  150765. + }
  150766. +#endif
  150767. +
  150768. +#ifdef CONFIG_DUALMAC_CONCURRENT
  150769. + if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
  150770. + {
  150771. + printk("set bssid, but buddy_intf is under scanning or linking\n");
  150772. + ret = -EINVAL;
  150773. + goto exit;
  150774. + }
  150775. +#endif
  150776. +
  150777. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  150778. + ("+rtw_wx_set_essid: fw_state=0x%08x\n", get_fwstate(pmlmepriv)));
  150779. + if(_FAIL == rtw_pwr_wakeup(padapter))
  150780. + {
  150781. + ret = -1;
  150782. + goto exit;
  150783. + }
  150784. +
  150785. + if(!padapter->bup){
  150786. + ret = -1;
  150787. + goto exit;
  150788. + }
  150789. +
  150790. +#if WIRELESS_EXT <= 20
  150791. + if ((wrqu->essid.length-1) > IW_ESSID_MAX_SIZE){
  150792. +#else
  150793. + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
  150794. +#endif
  150795. + ret= -E2BIG;
  150796. + goto exit;
  150797. + }
  150798. +
  150799. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  150800. + ret = -1;
  150801. + goto exit;
  150802. + }
  150803. +
  150804. + authmode = padapter->securitypriv.ndisauthtype;
  150805. + DBG_871X("=>%s\n",__FUNCTION__);
  150806. + if (wrqu->essid.flags && wrqu->essid.length)
  150807. + {
  150808. + // Commented by Albert 20100519
  150809. + // We got the codes in "set_info" function of iwconfig source code.
  150810. + // =========================================
  150811. + // wrq.u.essid.length = strlen(essid) + 1;
  150812. + // if(we_kernel_version > 20)
  150813. + // wrq.u.essid.length--;
  150814. + // =========================================
  150815. + // That means, if the WIRELESS_EXT less than or equal to 20, the correct ssid len should subtract 1.
  150816. +#if WIRELESS_EXT <= 20
  150817. + len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE;
  150818. +#else
  150819. + len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : IW_ESSID_MAX_SIZE;
  150820. +#endif
  150821. +
  150822. + if( wrqu->essid.length != 33 )
  150823. + DBG_871X("ssid=%s, len=%d\n", extra, wrqu->essid.length);
  150824. +
  150825. + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));
  150826. + ndis_ssid.SsidLength = len;
  150827. + _rtw_memcpy(ndis_ssid.Ssid, extra, len);
  150828. + src_ssid = ndis_ssid.Ssid;
  150829. +
  150830. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, ("rtw_wx_set_essid: ssid=[%s]\n", src_ssid));
  150831. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  150832. + _enter_critical_bh(&queue->lock, &irqL);
  150833. + phead = get_list_head(queue);
  150834. + pmlmepriv->pscanned = get_next(phead);
  150835. +
  150836. + while (1)
  150837. + {
  150838. + if (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == _TRUE)
  150839. + {
  150840. +#if 0
  150841. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
  150842. + {
  150843. + rtw_set_802_11_ssid(padapter, &ndis_ssid);
  150844. +
  150845. + goto exit;
  150846. + }
  150847. + else
  150848. + {
  150849. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("rtw_wx_set_ssid(): scanned_queue is empty\n"));
  150850. + ret = -EINVAL;
  150851. + goto exit;
  150852. + }
  150853. +#endif
  150854. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_warning_,
  150855. + ("rtw_wx_set_essid: scan_q is empty, set ssid to check if scanning again!\n"));
  150856. +
  150857. + break;
  150858. + }
  150859. +
  150860. + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);
  150861. +
  150862. + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
  150863. +
  150864. + dst_ssid = pnetwork->network.Ssid.Ssid;
  150865. +
  150866. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  150867. + ("rtw_wx_set_essid: dst_ssid=%s\n",
  150868. + pnetwork->network.Ssid.Ssid));
  150869. +
  150870. + if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) &&
  150871. + (pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength))
  150872. + {
  150873. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  150874. + ("rtw_wx_set_essid: find match, set infra mode\n"));
  150875. +
  150876. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
  150877. + {
  150878. + if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode)
  150879. + continue;
  150880. + }
  150881. +
  150882. + if (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == _FALSE)
  150883. + {
  150884. + ret = -1;
  150885. + _exit_critical_bh(&queue->lock, &irqL);
  150886. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  150887. + goto exit;
  150888. + }
  150889. +
  150890. + break;
  150891. + }
  150892. + }
  150893. + _exit_critical_bh(&queue->lock, &irqL);
  150894. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  150895. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  150896. + ("set ssid: set_802_11_auth. mode=%d\n", authmode));
  150897. + rtw_set_802_11_authentication_mode(padapter, authmode);
  150898. + //set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);
  150899. + if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) {
  150900. + ret = -1;
  150901. + goto exit;
  150902. + }
  150903. + }
  150904. +
  150905. +exit:
  150906. +
  150907. + DBG_871X("<=%s, ret %d\n",__FUNCTION__, ret);
  150908. +
  150909. + #ifdef DBG_IOCTL
  150910. + DBG_871X("DBG_IOCTL %s:%d return %d\n",__FUNCTION__, __LINE__, ret);
  150911. + #endif
  150912. +
  150913. + _func_exit_;
  150914. +
  150915. + return ret;
  150916. +}
  150917. +
  150918. +static int rtw_wx_get_essid(struct net_device *dev,
  150919. + struct iw_request_info *a,
  150920. + union iwreq_data *wrqu, char *extra)
  150921. +{
  150922. + u32 len,ret = 0;
  150923. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150924. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  150925. + WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;
  150926. +
  150927. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_essid\n"));
  150928. +
  150929. + _func_enter_;
  150930. +
  150931. + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
  150932. + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
  150933. + {
  150934. + len = pcur_bss->Ssid.SsidLength;
  150935. +
  150936. + wrqu->essid.length = len;
  150937. +
  150938. + _rtw_memcpy(extra, pcur_bss->Ssid.Ssid, len);
  150939. +
  150940. + wrqu->essid.flags = 1;
  150941. + }
  150942. + else
  150943. + {
  150944. + ret = -1;
  150945. + goto exit;
  150946. + }
  150947. +
  150948. +exit:
  150949. +
  150950. + _func_exit_;
  150951. +
  150952. + return ret;
  150953. +
  150954. +}
  150955. +
  150956. +static int rtw_wx_set_rate(struct net_device *dev,
  150957. + struct iw_request_info *a,
  150958. + union iwreq_data *wrqu, char *extra)
  150959. +{
  150960. + int i, ret = 0;
  150961. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  150962. + u8 datarates[NumRates];
  150963. + u32 target_rate = wrqu->bitrate.value;
  150964. + u32 fixed = wrqu->bitrate.fixed;
  150965. + u32 ratevalue = 0;
  150966. + u8 mpdatarate[NumRates]={11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff};
  150967. +
  150968. +_func_enter_;
  150969. +
  150970. + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(" rtw_wx_set_rate \n"));
  150971. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("target_rate = %d, fixed = %d\n",target_rate,fixed));
  150972. +
  150973. + if(target_rate == -1){
  150974. + ratevalue = 11;
  150975. + goto set_rate;
  150976. + }
  150977. + target_rate = target_rate/100000;
  150978. +
  150979. + switch(target_rate){
  150980. + case 10:
  150981. + ratevalue = 0;
  150982. + break;
  150983. + case 20:
  150984. + ratevalue = 1;
  150985. + break;
  150986. + case 55:
  150987. + ratevalue = 2;
  150988. + break;
  150989. + case 60:
  150990. + ratevalue = 3;
  150991. + break;
  150992. + case 90:
  150993. + ratevalue = 4;
  150994. + break;
  150995. + case 110:
  150996. + ratevalue = 5;
  150997. + break;
  150998. + case 120:
  150999. + ratevalue = 6;
  151000. + break;
  151001. + case 180:
  151002. + ratevalue = 7;
  151003. + break;
  151004. + case 240:
  151005. + ratevalue = 8;
  151006. + break;
  151007. + case 360:
  151008. + ratevalue = 9;
  151009. + break;
  151010. + case 480:
  151011. + ratevalue = 10;
  151012. + break;
  151013. + case 540:
  151014. + ratevalue = 11;
  151015. + break;
  151016. + default:
  151017. + ratevalue = 11;
  151018. + break;
  151019. + }
  151020. +
  151021. +set_rate:
  151022. +
  151023. + for(i=0; i<NumRates; i++)
  151024. + {
  151025. + if(ratevalue==mpdatarate[i])
  151026. + {
  151027. + datarates[i] = mpdatarate[i];
  151028. + if(fixed == 0)
  151029. + break;
  151030. + }
  151031. + else{
  151032. + datarates[i] = 0xff;
  151033. + }
  151034. +
  151035. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("datarate_inx=%d\n",datarates[i]));
  151036. + }
  151037. +
  151038. + if( rtw_setdatarate_cmd(padapter, datarates) !=_SUCCESS){
  151039. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("rtw_wx_set_rate Fail!!!\n"));
  151040. + ret = -1;
  151041. + }
  151042. +
  151043. +_func_exit_;
  151044. +
  151045. + return ret;
  151046. +}
  151047. +
  151048. +static int rtw_wx_get_rate(struct net_device *dev,
  151049. + struct iw_request_info *info,
  151050. + union iwreq_data *wrqu, char *extra)
  151051. +{
  151052. + u16 max_rate = 0;
  151053. +
  151054. + max_rate = rtw_get_cur_max_rate((_adapter *)rtw_netdev_priv(dev));
  151055. +
  151056. + if(max_rate == 0)
  151057. + return -EPERM;
  151058. +
  151059. + wrqu->bitrate.fixed = 0; /* no auto select */
  151060. + wrqu->bitrate.value = max_rate * 100000;
  151061. +
  151062. + return 0;
  151063. +}
  151064. +
  151065. +static int rtw_wx_set_rts(struct net_device *dev,
  151066. + struct iw_request_info *info,
  151067. + union iwreq_data *wrqu, char *extra)
  151068. +{
  151069. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151070. +
  151071. + _func_enter_;
  151072. +
  151073. + if (wrqu->rts.disabled)
  151074. + padapter->registrypriv.rts_thresh = 2347;
  151075. + else {
  151076. + if (wrqu->rts.value < 0 ||
  151077. + wrqu->rts.value > 2347)
  151078. + return -EINVAL;
  151079. +
  151080. + padapter->registrypriv.rts_thresh = wrqu->rts.value;
  151081. + }
  151082. +
  151083. + DBG_871X("%s, rts_thresh=%d\n", __func__, padapter->registrypriv.rts_thresh);
  151084. +
  151085. + _func_exit_;
  151086. +
  151087. + return 0;
  151088. +
  151089. +}
  151090. +
  151091. +static int rtw_wx_get_rts(struct net_device *dev,
  151092. + struct iw_request_info *info,
  151093. + union iwreq_data *wrqu, char *extra)
  151094. +{
  151095. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151096. +
  151097. + _func_enter_;
  151098. +
  151099. + DBG_871X("%s, rts_thresh=%d\n", __func__, padapter->registrypriv.rts_thresh);
  151100. +
  151101. + wrqu->rts.value = padapter->registrypriv.rts_thresh;
  151102. + wrqu->rts.fixed = 0; /* no auto select */
  151103. + //wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
  151104. +
  151105. + _func_exit_;
  151106. +
  151107. + return 0;
  151108. +}
  151109. +
  151110. +static int rtw_wx_set_frag(struct net_device *dev,
  151111. + struct iw_request_info *info,
  151112. + union iwreq_data *wrqu, char *extra)
  151113. +{
  151114. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151115. +
  151116. + _func_enter_;
  151117. +
  151118. + if (wrqu->frag.disabled)
  151119. + padapter->xmitpriv.frag_len = MAX_FRAG_THRESHOLD;
  151120. + else {
  151121. + if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
  151122. + wrqu->frag.value > MAX_FRAG_THRESHOLD)
  151123. + return -EINVAL;
  151124. +
  151125. + padapter->xmitpriv.frag_len = wrqu->frag.value & ~0x1;
  151126. + }
  151127. +
  151128. + DBG_871X("%s, frag_len=%d\n", __func__, padapter->xmitpriv.frag_len);
  151129. +
  151130. + _func_exit_;
  151131. +
  151132. + return 0;
  151133. +
  151134. +}
  151135. +
  151136. +static int rtw_wx_get_frag(struct net_device *dev,
  151137. + struct iw_request_info *info,
  151138. + union iwreq_data *wrqu, char *extra)
  151139. +{
  151140. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151141. +
  151142. + _func_enter_;
  151143. +
  151144. + DBG_871X("%s, frag_len=%d\n", __func__, padapter->xmitpriv.frag_len);
  151145. +
  151146. + wrqu->frag.value = padapter->xmitpriv.frag_len;
  151147. + wrqu->frag.fixed = 0; /* no auto select */
  151148. + //wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);
  151149. +
  151150. + _func_exit_;
  151151. +
  151152. + return 0;
  151153. +}
  151154. +
  151155. +static int rtw_wx_get_retry(struct net_device *dev,
  151156. + struct iw_request_info *info,
  151157. + union iwreq_data *wrqu, char *extra)
  151158. +{
  151159. + //_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151160. +
  151161. +
  151162. + wrqu->retry.value = 7;
  151163. + wrqu->retry.fixed = 0; /* no auto select */
  151164. + wrqu->retry.disabled = 1;
  151165. +
  151166. + return 0;
  151167. +
  151168. +}
  151169. +
  151170. +#if 0
  151171. +#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */
  151172. +#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */
  151173. +#define IW_ENCODE_MODE 0xF000 /* Modes defined below */
  151174. +#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */
  151175. +#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */
  151176. +#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */
  151177. +#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */
  151178. +#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */
  151179. +#define IW_ENCODE_TEMP 0x0400 /* Temporary key */
  151180. +/*
  151181. +iwconfig wlan0 key on -> flags = 0x6001 -> maybe it means auto
  151182. +iwconfig wlan0 key off -> flags = 0x8800
  151183. +iwconfig wlan0 key open -> flags = 0x2800
  151184. +iwconfig wlan0 key open 1234567890 -> flags = 0x2000
  151185. +iwconfig wlan0 key restricted -> flags = 0x4800
  151186. +iwconfig wlan0 key open [3] 1234567890 -> flags = 0x2003
  151187. +iwconfig wlan0 key restricted [2] 1234567890 -> flags = 0x4002
  151188. +iwconfig wlan0 key open [3] -> flags = 0x2803
  151189. +iwconfig wlan0 key restricted [2] -> flags = 0x4802
  151190. +*/
  151191. +#endif
  151192. +
  151193. +static int rtw_wx_set_enc(struct net_device *dev,
  151194. + struct iw_request_info *info,
  151195. + union iwreq_data *wrqu, char *keybuf)
  151196. +{
  151197. + u32 key, ret = 0;
  151198. + u32 keyindex_provided;
  151199. + NDIS_802_11_WEP wep;
  151200. + NDIS_802_11_AUTHENTICATION_MODE authmode;
  151201. +
  151202. + struct iw_point *erq = &(wrqu->encoding);
  151203. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151204. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  151205. + DBG_871X("+rtw_wx_set_enc, flags=0x%x\n", erq->flags);
  151206. +
  151207. + _rtw_memset(&wep, 0, sizeof(NDIS_802_11_WEP));
  151208. +
  151209. + key = erq->flags & IW_ENCODE_INDEX;
  151210. +
  151211. + _func_enter_;
  151212. +
  151213. + if (erq->flags & IW_ENCODE_DISABLED)
  151214. + {
  151215. + DBG_871X("EncryptionDisabled\n");
  151216. + padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;
  151217. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  151218. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  151219. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system
  151220. + authmode = Ndis802_11AuthModeOpen;
  151221. + padapter->securitypriv.ndisauthtype=authmode;
  151222. +
  151223. + goto exit;
  151224. + }
  151225. +
  151226. + if (key) {
  151227. + if (key > WEP_KEYS)
  151228. + return -EINVAL;
  151229. + key--;
  151230. + keyindex_provided = 1;
  151231. + }
  151232. + else
  151233. + {
  151234. + keyindex_provided = 0;
  151235. + key = padapter->securitypriv.dot11PrivacyKeyIndex;
  151236. + DBG_871X("rtw_wx_set_enc, key=%d\n", key);
  151237. + }
  151238. +
  151239. + //set authentication mode
  151240. + if(erq->flags & IW_ENCODE_OPEN)
  151241. + {
  151242. + DBG_871X("rtw_wx_set_enc():IW_ENCODE_OPEN\n");
  151243. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;//Ndis802_11EncryptionDisabled;
  151244. +
  151245. +#ifdef CONFIG_PLATFORM_MT53XX
  151246. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  151247. +#else
  151248. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open;
  151249. +#endif
  151250. +
  151251. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  151252. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  151253. + authmode = Ndis802_11AuthModeOpen;
  151254. + padapter->securitypriv.ndisauthtype=authmode;
  151255. + }
  151256. + else if(erq->flags & IW_ENCODE_RESTRICTED)
  151257. + {
  151258. + DBG_871X("rtw_wx_set_enc():IW_ENCODE_RESTRICTED\n");
  151259. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
  151260. +
  151261. +#ifdef CONFIG_PLATFORM_MT53XX
  151262. + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
  151263. +#else
  151264. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Shared;
  151265. +#endif
  151266. +
  151267. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  151268. + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;
  151269. + authmode = Ndis802_11AuthModeShared;
  151270. + padapter->securitypriv.ndisauthtype=authmode;
  151271. + }
  151272. + else
  151273. + {
  151274. + DBG_871X("rtw_wx_set_enc():erq->flags=0x%x\n", erq->flags);
  151275. +
  151276. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;//Ndis802_11EncryptionDisabled;
  151277. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system
  151278. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  151279. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  151280. + authmode = Ndis802_11AuthModeOpen;
  151281. + padapter->securitypriv.ndisauthtype=authmode;
  151282. + }
  151283. +
  151284. + wep.KeyIndex = key;
  151285. + if (erq->length > 0)
  151286. + {
  151287. + wep.KeyLength = erq->length <= 5 ? 5 : 13;
  151288. +
  151289. + wep.Length = wep.KeyLength + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);
  151290. + }
  151291. + else
  151292. + {
  151293. + wep.KeyLength = 0 ;
  151294. +
  151295. + if(keyindex_provided == 1)// set key_id only, no given KeyMaterial(erq->length==0).
  151296. + {
  151297. + padapter->securitypriv.dot11PrivacyKeyIndex = key;
  151298. +
  151299. + DBG_871X("(keyindex_provided == 1), keyid=%d, key_len=%d\n", key, padapter->securitypriv.dot11DefKeylen[key]);
  151300. +
  151301. + switch(padapter->securitypriv.dot11DefKeylen[key])
  151302. + {
  151303. + case 5:
  151304. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
  151305. + break;
  151306. + case 13:
  151307. + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
  151308. + break;
  151309. + default:
  151310. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  151311. + break;
  151312. + }
  151313. +
  151314. + goto exit;
  151315. +
  151316. + }
  151317. +
  151318. + }
  151319. +
  151320. + wep.KeyIndex |= 0x80000000;
  151321. +
  151322. + _rtw_memcpy(wep.KeyMaterial, keybuf, wep.KeyLength);
  151323. +
  151324. + if (rtw_set_802_11_add_wep(padapter, &wep) == _FALSE) {
  151325. + if(rf_on == pwrpriv->rf_pwrstate )
  151326. + ret = -EOPNOTSUPP;
  151327. + goto exit;
  151328. + }
  151329. +
  151330. +exit:
  151331. +
  151332. + _func_exit_;
  151333. +
  151334. + return ret;
  151335. +
  151336. +}
  151337. +
  151338. +static int rtw_wx_get_enc(struct net_device *dev,
  151339. + struct iw_request_info *info,
  151340. + union iwreq_data *wrqu, char *keybuf)
  151341. +{
  151342. + uint key, ret =0;
  151343. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151344. + struct iw_point *erq = &(wrqu->encoding);
  151345. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  151346. +
  151347. + _func_enter_;
  151348. +
  151349. + if(check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE)
  151350. + {
  151351. + if(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE)
  151352. + {
  151353. + erq->length = 0;
  151354. + erq->flags |= IW_ENCODE_DISABLED;
  151355. + return 0;
  151356. + }
  151357. + }
  151358. +
  151359. +
  151360. + key = erq->flags & IW_ENCODE_INDEX;
  151361. +
  151362. + if (key) {
  151363. + if (key > WEP_KEYS)
  151364. + return -EINVAL;
  151365. + key--;
  151366. + } else
  151367. + {
  151368. + key = padapter->securitypriv.dot11PrivacyKeyIndex;
  151369. + }
  151370. +
  151371. + erq->flags = key + 1;
  151372. +
  151373. + //if(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeOpen)
  151374. + //{
  151375. + // erq->flags |= IW_ENCODE_OPEN;
  151376. + //}
  151377. +
  151378. + switch(padapter->securitypriv.ndisencryptstatus)
  151379. + {
  151380. + case Ndis802_11EncryptionNotSupported:
  151381. + case Ndis802_11EncryptionDisabled:
  151382. +
  151383. + erq->length = 0;
  151384. + erq->flags |= IW_ENCODE_DISABLED;
  151385. +
  151386. + break;
  151387. +
  151388. + case Ndis802_11Encryption1Enabled:
  151389. +
  151390. + erq->length = padapter->securitypriv.dot11DefKeylen[key];
  151391. +
  151392. + if(erq->length)
  151393. + {
  151394. + _rtw_memcpy(keybuf, padapter->securitypriv.dot11DefKey[key].skey, padapter->securitypriv.dot11DefKeylen[key]);
  151395. +
  151396. + erq->flags |= IW_ENCODE_ENABLED;
  151397. +
  151398. + if(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeOpen)
  151399. + {
  151400. + erq->flags |= IW_ENCODE_OPEN;
  151401. + }
  151402. + else if(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeShared)
  151403. + {
  151404. + erq->flags |= IW_ENCODE_RESTRICTED;
  151405. + }
  151406. + }
  151407. + else
  151408. + {
  151409. + erq->length = 0;
  151410. + erq->flags |= IW_ENCODE_DISABLED;
  151411. + }
  151412. +
  151413. + break;
  151414. +
  151415. + case Ndis802_11Encryption2Enabled:
  151416. + case Ndis802_11Encryption3Enabled:
  151417. +
  151418. + erq->length = 16;
  151419. + erq->flags |= (IW_ENCODE_ENABLED | IW_ENCODE_OPEN | IW_ENCODE_NOKEY);
  151420. +
  151421. + break;
  151422. +
  151423. + default:
  151424. + erq->length = 0;
  151425. + erq->flags |= IW_ENCODE_DISABLED;
  151426. +
  151427. + break;
  151428. +
  151429. + }
  151430. +
  151431. + _func_exit_;
  151432. +
  151433. + return ret;
  151434. +
  151435. +}
  151436. +
  151437. +static int rtw_wx_get_power(struct net_device *dev,
  151438. + struct iw_request_info *info,
  151439. + union iwreq_data *wrqu, char *extra)
  151440. +{
  151441. + //_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151442. +
  151443. + wrqu->power.value = 0;
  151444. + wrqu->power.fixed = 0; /* no auto select */
  151445. + wrqu->power.disabled = 1;
  151446. +
  151447. + return 0;
  151448. +
  151449. +}
  151450. +
  151451. +static int rtw_wx_set_gen_ie(struct net_device *dev,
  151452. + struct iw_request_info *info,
  151453. + union iwreq_data *wrqu, char *extra)
  151454. +{
  151455. + int ret;
  151456. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151457. +
  151458. + ret = rtw_set_wpa_ie(padapter, extra, wrqu->data.length);
  151459. +
  151460. + return ret;
  151461. +}
  151462. +
  151463. +static int rtw_wx_set_auth(struct net_device *dev,
  151464. + struct iw_request_info *info,
  151465. + union iwreq_data *wrqu, char *extra)
  151466. +{
  151467. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151468. + struct iw_param *param = (struct iw_param*)&(wrqu->param);
  151469. + int ret = 0;
  151470. +
  151471. + switch (param->flags & IW_AUTH_INDEX) {
  151472. + case IW_AUTH_WPA_VERSION:
  151473. + break;
  151474. + case IW_AUTH_CIPHER_PAIRWISE:
  151475. +
  151476. + break;
  151477. + case IW_AUTH_CIPHER_GROUP:
  151478. +
  151479. + break;
  151480. + case IW_AUTH_KEY_MGMT:
  151481. + /*
  151482. + * ??? does not use these parameters
  151483. + */
  151484. + break;
  151485. +
  151486. + case IW_AUTH_TKIP_COUNTERMEASURES:
  151487. + {
  151488. + if ( param->value )
  151489. + { // wpa_supplicant is enabling the tkip countermeasure.
  151490. + padapter->securitypriv.btkip_countermeasure = _TRUE;
  151491. + }
  151492. + else
  151493. + { // wpa_supplicant is disabling the tkip countermeasure.
  151494. + padapter->securitypriv.btkip_countermeasure = _FALSE;
  151495. + }
  151496. + break;
  151497. + }
  151498. + case IW_AUTH_DROP_UNENCRYPTED:
  151499. + {
  151500. + /* HACK:
  151501. + *
  151502. + * wpa_supplicant calls set_wpa_enabled when the driver
  151503. + * is loaded and unloaded, regardless of if WPA is being
  151504. + * used. No other calls are made which can be used to
  151505. + * determine if encryption will be used or not prior to
  151506. + * association being expected. If encryption is not being
  151507. + * used, drop_unencrypted is set to false, else true -- we
  151508. + * can use this to determine if the CAP_PRIVACY_ON bit should
  151509. + * be set.
  151510. + */
  151511. +
  151512. + if(padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption1Enabled)
  151513. + {
  151514. + break;//it means init value, or using wep, ndisencryptstatus = Ndis802_11Encryption1Enabled,
  151515. + // then it needn't reset it;
  151516. + }
  151517. +
  151518. + if(param->value){
  151519. + padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;
  151520. + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;
  151521. + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;
  151522. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system
  151523. + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeOpen;
  151524. + }
  151525. +
  151526. + break;
  151527. + }
  151528. +
  151529. + case IW_AUTH_80211_AUTH_ALG:
  151530. +
  151531. + #if defined(CONFIG_ANDROID) || 1
  151532. + /*
  151533. + * It's the starting point of a link layer connection using wpa_supplicant
  151534. + */
  151535. + if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
  151536. + LeaveAllPowerSaveMode(padapter);
  151537. + rtw_disassoc_cmd(padapter, 500, _FALSE);
  151538. + DBG_871X("%s...call rtw_indicate_disconnect\n ",__FUNCTION__);
  151539. + rtw_indicate_disconnect(padapter);
  151540. + rtw_free_assoc_resources(padapter, 1);
  151541. + }
  151542. + #endif
  151543. +
  151544. +
  151545. + ret = wpa_set_auth_algs(dev, (u32)param->value);
  151546. +
  151547. + break;
  151548. +
  151549. + case IW_AUTH_WPA_ENABLED:
  151550. +
  151551. + //if(param->value)
  151552. + // padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; //802.1x
  151553. + //else
  151554. + // padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open;//open system
  151555. +
  151556. + //_disassociate(priv);
  151557. +
  151558. + break;
  151559. +
  151560. + case IW_AUTH_RX_UNENCRYPTED_EAPOL:
  151561. + //ieee->ieee802_1x = param->value;
  151562. + break;
  151563. +
  151564. + case IW_AUTH_PRIVACY_INVOKED:
  151565. + //ieee->privacy_invoked = param->value;
  151566. + break;
  151567. +
  151568. + default:
  151569. + return -EOPNOTSUPP;
  151570. +
  151571. + }
  151572. +
  151573. + return ret;
  151574. +
  151575. +}
  151576. +
  151577. +static int rtw_wx_set_enc_ext(struct net_device *dev,
  151578. + struct iw_request_info *info,
  151579. + union iwreq_data *wrqu, char *extra)
  151580. +{
  151581. + char *alg_name;
  151582. + u32 param_len;
  151583. + struct ieee_param *param = NULL;
  151584. + struct iw_point *pencoding = &wrqu->encoding;
  151585. + struct iw_encode_ext *pext = (struct iw_encode_ext *)extra;
  151586. + int ret=0;
  151587. +
  151588. + param_len = sizeof(struct ieee_param) + pext->key_len;
  151589. + param = (struct ieee_param *)rtw_malloc(param_len);
  151590. + if (param == NULL)
  151591. + return -1;
  151592. +
  151593. + _rtw_memset(param, 0, param_len);
  151594. +
  151595. + param->cmd = IEEE_CMD_SET_ENCRYPTION;
  151596. + _rtw_memset(param->sta_addr, 0xff, ETH_ALEN);
  151597. +
  151598. +
  151599. + switch (pext->alg) {
  151600. + case IW_ENCODE_ALG_NONE:
  151601. + //todo: remove key
  151602. + //remove = 1;
  151603. + alg_name = "none";
  151604. + break;
  151605. + case IW_ENCODE_ALG_WEP:
  151606. + alg_name = "WEP";
  151607. + break;
  151608. + case IW_ENCODE_ALG_TKIP:
  151609. + alg_name = "TKIP";
  151610. + break;
  151611. + case IW_ENCODE_ALG_CCMP:
  151612. + alg_name = "CCMP";
  151613. + break;
  151614. +#ifdef CONFIG_IEEE80211W
  151615. + case IW_ENCODE_ALG_AES_CMAC:
  151616. + alg_name = "BIP";
  151617. + break;
  151618. +#endif //CONFIG_IEEE80211W
  151619. + default:
  151620. + return -1;
  151621. + }
  151622. +
  151623. + strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);
  151624. +
  151625. +
  151626. + if((pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)//?
  151627. +#ifdef CONFIG_IEEE80211W
  151628. + || (pext->ext_flags & IW_ENCODE_ALG_AES_CMAC)
  151629. +#endif //CONFIG_IEEE80211W
  151630. + )
  151631. + {
  151632. + param->u.crypt.set_tx = 0;
  151633. + }
  151634. +
  151635. + if (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)//?
  151636. + {
  151637. + param->u.crypt.set_tx = 1;
  151638. + }
  151639. +
  151640. + param->u.crypt.idx = (pencoding->flags&0x00FF) -1 ;
  151641. +
  151642. + if (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)
  151643. + {
  151644. + _rtw_memcpy(param->u.crypt.seq, pext->rx_seq, 8);
  151645. + }
  151646. +
  151647. + if(pext->key_len)
  151648. + {
  151649. + param->u.crypt.key_len = pext->key_len;
  151650. + //_rtw_memcpy(param + 1, pext + 1, pext->key_len);
  151651. + _rtw_memcpy(param->u.crypt.key, pext + 1, pext->key_len);
  151652. + }
  151653. +
  151654. +
  151655. + if (pencoding->flags & IW_ENCODE_DISABLED)
  151656. + {
  151657. + //todo: remove key
  151658. + //remove = 1;
  151659. + }
  151660. +
  151661. + ret = wpa_set_encryption(dev, param, param_len);
  151662. +
  151663. +
  151664. + if(param)
  151665. + {
  151666. + rtw_mfree((u8*)param, param_len);
  151667. + }
  151668. +
  151669. +
  151670. + return ret;
  151671. +
  151672. +}
  151673. +
  151674. +
  151675. +static int rtw_wx_get_nick(struct net_device *dev,
  151676. + struct iw_request_info *info,
  151677. + union iwreq_data *wrqu, char *extra)
  151678. +{
  151679. + //_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151680. + //struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  151681. + //struct security_priv *psecuritypriv = &padapter->securitypriv;
  151682. +
  151683. + if(extra)
  151684. + {
  151685. + wrqu->data.length = 14;
  151686. + wrqu->data.flags = 1;
  151687. + _rtw_memcpy(extra, "<WIFI@REALTEK>", 14);
  151688. + }
  151689. +
  151690. + //rtw_signal_process(pid, SIGUSR1); //for test
  151691. +
  151692. + //dump debug info here
  151693. +/*
  151694. + u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, and 8021x
  151695. + u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm.
  151696. + u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key
  151697. + u32 ndisauthtype;
  151698. + u32 ndisencryptstatus;
  151699. +*/
  151700. +
  151701. + //DBG_871X("auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
  151702. + // psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
  151703. + // psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
  151704. +
  151705. + //DBG_871X("enc_alg=0x%x\n", psecuritypriv->dot11PrivacyAlgrthm);
  151706. + //DBG_871X("auth_type=0x%x\n", psecuritypriv->ndisauthtype);
  151707. + //DBG_871X("enc_type=0x%x\n", psecuritypriv->ndisencryptstatus);
  151708. +
  151709. +#if 0
  151710. + DBG_871X("dbg(0x210)=0x%x\n", rtw_read32(padapter, 0x210));
  151711. + DBG_871X("dbg(0x608)=0x%x\n", rtw_read32(padapter, 0x608));
  151712. + DBG_871X("dbg(0x280)=0x%x\n", rtw_read32(padapter, 0x280));
  151713. + DBG_871X("dbg(0x284)=0x%x\n", rtw_read32(padapter, 0x284));
  151714. + DBG_871X("dbg(0x288)=0x%x\n", rtw_read32(padapter, 0x288));
  151715. +
  151716. + DBG_871X("dbg(0x664)=0x%x\n", rtw_read32(padapter, 0x664));
  151717. +
  151718. +
  151719. + DBG_871X("\n");
  151720. +
  151721. + DBG_871X("dbg(0x430)=0x%x\n", rtw_read32(padapter, 0x430));
  151722. + DBG_871X("dbg(0x438)=0x%x\n", rtw_read32(padapter, 0x438));
  151723. +
  151724. + DBG_871X("dbg(0x440)=0x%x\n", rtw_read32(padapter, 0x440));
  151725. +
  151726. + DBG_871X("dbg(0x458)=0x%x\n", rtw_read32(padapter, 0x458));
  151727. +
  151728. + DBG_871X("dbg(0x484)=0x%x\n", rtw_read32(padapter, 0x484));
  151729. + DBG_871X("dbg(0x488)=0x%x\n", rtw_read32(padapter, 0x488));
  151730. +
  151731. + DBG_871X("dbg(0x444)=0x%x\n", rtw_read32(padapter, 0x444));
  151732. + DBG_871X("dbg(0x448)=0x%x\n", rtw_read32(padapter, 0x448));
  151733. + DBG_871X("dbg(0x44c)=0x%x\n", rtw_read32(padapter, 0x44c));
  151734. + DBG_871X("dbg(0x450)=0x%x\n", rtw_read32(padapter, 0x450));
  151735. +#endif
  151736. +
  151737. + return 0;
  151738. +
  151739. +}
  151740. +
  151741. +static int rtw_wx_read32(struct net_device *dev,
  151742. + struct iw_request_info *info,
  151743. + union iwreq_data *wrqu, char *extra)
  151744. +{
  151745. + PADAPTER padapter;
  151746. + struct iw_point *p;
  151747. + u16 len;
  151748. + u32 addr;
  151749. + u32 data32;
  151750. + u32 bytes;
  151751. + u8 *ptmp;
  151752. +
  151753. +
  151754. + padapter = (PADAPTER)rtw_netdev_priv(dev);
  151755. + p = &wrqu->data;
  151756. + len = p->length;
  151757. + ptmp = (u8*)rtw_malloc(len);
  151758. + if (NULL == ptmp)
  151759. + return -ENOMEM;
  151760. +
  151761. + if (copy_from_user(ptmp, p->pointer, len)) {
  151762. + rtw_mfree(ptmp, len);
  151763. + return -EFAULT;
  151764. + }
  151765. +
  151766. + bytes = 0;
  151767. + addr = 0;
  151768. + sscanf(ptmp, "%d,%x", &bytes, &addr);
  151769. +
  151770. + switch (bytes) {
  151771. + case 1:
  151772. + data32 = rtw_read8(padapter, addr);
  151773. + sprintf(extra, "0x%02X", data32);
  151774. + break;
  151775. + case 2:
  151776. + data32 = rtw_read16(padapter, addr);
  151777. + sprintf(extra, "0x%04X", data32);
  151778. + break;
  151779. + case 4:
  151780. + data32 = rtw_read32(padapter, addr);
  151781. + sprintf(extra, "0x%08X", data32);
  151782. + break;
  151783. + default:
  151784. + printk(KERN_INFO "%s: usage> read [bytes],[address(hex)]\n", __func__);
  151785. + return -EINVAL;
  151786. + }
  151787. + printk(KERN_INFO "%s: addr=0x%08X data=%s\n", __func__, addr, extra);
  151788. +
  151789. + rtw_mfree(ptmp, len);
  151790. +
  151791. + return 0;
  151792. +}
  151793. +
  151794. +static int rtw_wx_write32(struct net_device *dev,
  151795. + struct iw_request_info *info,
  151796. + union iwreq_data *wrqu, char *extra)
  151797. +{
  151798. + PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);
  151799. +
  151800. + u32 addr;
  151801. + u32 data32;
  151802. + u32 bytes;
  151803. +
  151804. +
  151805. + bytes = 0;
  151806. + addr = 0;
  151807. + data32 = 0;
  151808. + sscanf(extra, "%d,%x,%x", &bytes, &addr, &data32);
  151809. +
  151810. + switch (bytes) {
  151811. + case 1:
  151812. + rtw_write8(padapter, addr, (u8)data32);
  151813. + printk(KERN_INFO "%s: addr=0x%08X data=0x%02X\n", __func__, addr, (u8)data32);
  151814. + break;
  151815. + case 2:
  151816. + rtw_write16(padapter, addr, (u16)data32);
  151817. + printk(KERN_INFO "%s: addr=0x%08X data=0x%04X\n", __func__, addr, (u16)data32);
  151818. + break;
  151819. + case 4:
  151820. + rtw_write32(padapter, addr, data32);
  151821. + printk(KERN_INFO "%s: addr=0x%08X data=0x%08X\n", __func__, addr, data32);
  151822. + break;
  151823. + default:
  151824. + printk(KERN_INFO "%s: usage> write [bytes],[address(hex)],[data(hex)]\n", __func__);
  151825. + return -EINVAL;
  151826. + }
  151827. +
  151828. + return 0;
  151829. +}
  151830. +
  151831. +static int rtw_wx_read_rf(struct net_device *dev,
  151832. + struct iw_request_info *info,
  151833. + union iwreq_data *wrqu, char *extra)
  151834. +{
  151835. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151836. + u32 path, addr, data32;
  151837. +
  151838. +
  151839. + path = *(u32*)extra;
  151840. + addr = *((u32*)extra + 1);
  151841. + data32 = rtw_hal_read_rfreg(padapter, path, addr, 0xFFFFF);
  151842. +// DBG_871X("%s: path=%d addr=0x%02x data=0x%05x\n", __func__, path, addr, data32);
  151843. + /*
  151844. + * IMPORTANT!!
  151845. + * Only when wireless private ioctl is at odd order,
  151846. + * "extra" would be copied to user space.
  151847. + */
  151848. + sprintf(extra, "0x%05x", data32);
  151849. +
  151850. + return 0;
  151851. +}
  151852. +
  151853. +static int rtw_wx_write_rf(struct net_device *dev,
  151854. + struct iw_request_info *info,
  151855. + union iwreq_data *wrqu, char *extra)
  151856. +{
  151857. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151858. + u32 path, addr, data32;
  151859. +
  151860. +
  151861. + path = *(u32*)extra;
  151862. + addr = *((u32*)extra + 1);
  151863. + data32 = *((u32*)extra + 2);
  151864. +// DBG_871X("%s: path=%d addr=0x%02x data=0x%05x\n", __func__, path, addr, data32);
  151865. + rtw_hal_write_rfreg(padapter, path, addr, 0xFFFFF, data32);
  151866. +
  151867. + return 0;
  151868. +}
  151869. +
  151870. +static int rtw_wx_priv_null(struct net_device *dev, struct iw_request_info *a,
  151871. + union iwreq_data *wrqu, char *b)
  151872. +{
  151873. + return -1;
  151874. +}
  151875. +
  151876. +static int dummy(struct net_device *dev, struct iw_request_info *a,
  151877. + union iwreq_data *wrqu, char *b)
  151878. +{
  151879. + //_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151880. + //struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  151881. +
  151882. + //DBG_871X("cmd_code=%x, fwstate=0x%x\n", a->cmd, get_fwstate(pmlmepriv));
  151883. +
  151884. + return -1;
  151885. +
  151886. +}
  151887. +
  151888. +static int rtw_wx_set_channel_plan(struct net_device *dev,
  151889. + struct iw_request_info *info,
  151890. + union iwreq_data *wrqu, char *extra)
  151891. +{
  151892. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151893. + struct registry_priv *pregistrypriv = &padapter->registrypriv;
  151894. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  151895. + extern int rtw_channel_plan;
  151896. + u8 channel_plan_req = (u8) (*((int *)wrqu));
  151897. +
  151898. + #if 0
  151899. + rtw_channel_plan = (int)wrqu->data.pointer;
  151900. + pregistrypriv->channel_plan = rtw_channel_plan;
  151901. + pmlmepriv->ChannelPlan = pregistrypriv->channel_plan;
  151902. + #endif
  151903. +
  151904. + if( _SUCCESS == rtw_set_chplan_cmd(padapter, channel_plan_req, 1) ) {
  151905. + DBG_871X("%s set channel_plan = 0x%02X\n", __func__, pmlmepriv->ChannelPlan);
  151906. + } else
  151907. + return -EPERM;
  151908. +
  151909. + return 0;
  151910. +}
  151911. +
  151912. +static int rtw_wx_set_mtk_wps_probe_ie(struct net_device *dev,
  151913. + struct iw_request_info *a,
  151914. + union iwreq_data *wrqu, char *b)
  151915. +{
  151916. +#ifdef CONFIG_PLATFORM_MT53XX
  151917. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151918. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  151919. +
  151920. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_,
  151921. + ("WLAN IOCTL: cmd_code=%x, fwstate=0x%x\n",
  151922. + a->cmd, get_fwstate(pmlmepriv)));
  151923. +#endif
  151924. + return 0;
  151925. +}
  151926. +
  151927. +static int rtw_wx_get_sensitivity(struct net_device *dev,
  151928. + struct iw_request_info *info,
  151929. + union iwreq_data *wrqu, char *buf)
  151930. +{
  151931. +#ifdef CONFIG_PLATFORM_MT53XX
  151932. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151933. +
  151934. + // Modified by Albert 20110914
  151935. + // This is in dbm format for MTK platform.
  151936. + wrqu->qual.level = padapter->recvpriv.rssi;
  151937. + DBG_871X(" level = %u\n", wrqu->qual.level );
  151938. +#endif
  151939. + return 0;
  151940. +}
  151941. +
  151942. +static int rtw_wx_set_mtk_wps_ie(struct net_device *dev,
  151943. + struct iw_request_info *info,
  151944. + union iwreq_data *wrqu, char *extra)
  151945. +{
  151946. +#ifdef CONFIG_PLATFORM_MT53XX
  151947. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151948. +
  151949. + return rtw_set_wpa_ie(padapter, wrqu->data.pointer, wrqu->data.length);
  151950. +#else
  151951. + return 0;
  151952. +#endif
  151953. +}
  151954. +
  151955. +/*
  151956. +typedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info,
  151957. + union iwreq_data *wrqu, char *extra);
  151958. +*/
  151959. +/*
  151960. + * For all data larger than 16 octets, we need to use a
  151961. + * pointer to memory allocated in user space.
  151962. + */
  151963. +static int rtw_drvext_hdl(struct net_device *dev, struct iw_request_info *info,
  151964. + union iwreq_data *wrqu, char *extra)
  151965. +{
  151966. +
  151967. + #if 0
  151968. +struct iw_point
  151969. +{
  151970. + void __user *pointer; /* Pointer to the data (in user space) */
  151971. + __u16 length; /* number of fields or size in bytes */
  151972. + __u16 flags; /* Optional params */
  151973. +};
  151974. + #endif
  151975. +
  151976. +#ifdef CONFIG_DRVEXT_MODULE
  151977. + u8 res;
  151978. + struct drvext_handler *phandler;
  151979. + struct drvext_oidparam *poidparam;
  151980. + int ret;
  151981. + u16 len;
  151982. + u8 *pparmbuf, bset;
  151983. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  151984. + struct iw_point *p = &wrqu->data;
  151985. +
  151986. + if( (!p->length) || (!p->pointer)){
  151987. + ret = -EINVAL;
  151988. + goto _rtw_drvext_hdl_exit;
  151989. + }
  151990. +
  151991. +
  151992. + bset = (u8)(p->flags&0xFFFF);
  151993. + len = p->length;
  151994. + pparmbuf = (u8*)rtw_malloc(len);
  151995. + if (pparmbuf == NULL){
  151996. + ret = -ENOMEM;
  151997. + goto _rtw_drvext_hdl_exit;
  151998. + }
  151999. +
  152000. + if(bset)//set info
  152001. + {
  152002. + if (copy_from_user(pparmbuf, p->pointer,len)) {
  152003. + rtw_mfree(pparmbuf, len);
  152004. + ret = -EFAULT;
  152005. + goto _rtw_drvext_hdl_exit;
  152006. + }
  152007. + }
  152008. + else//query info
  152009. + {
  152010. +
  152011. + }
  152012. +
  152013. +
  152014. + //
  152015. + poidparam = (struct drvext_oidparam *)pparmbuf;
  152016. +
  152017. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("drvext set oid subcode [%d], len[%d], InformationBufferLength[%d]\r\n",
  152018. + poidparam->subcode, poidparam->len, len));
  152019. +
  152020. +
  152021. + //check subcode
  152022. + if ( poidparam->subcode >= MAX_DRVEXT_HANDLERS)
  152023. + {
  152024. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("no matching drvext handlers\r\n"));
  152025. + ret = -EINVAL;
  152026. + goto _rtw_drvext_hdl_exit;
  152027. + }
  152028. +
  152029. +
  152030. + if ( poidparam->subcode >= MAX_DRVEXT_OID_SUBCODES)
  152031. + {
  152032. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("no matching drvext subcodes\r\n"));
  152033. + ret = -EINVAL;
  152034. + goto _rtw_drvext_hdl_exit;
  152035. + }
  152036. +
  152037. +
  152038. + phandler = drvextoidhandlers + poidparam->subcode;
  152039. +
  152040. + if (poidparam->len != phandler->parmsize)
  152041. + {
  152042. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("no matching drvext param size %d vs %d\r\n",
  152043. + poidparam->len , phandler->parmsize));
  152044. + ret = -EINVAL;
  152045. + goto _rtw_drvext_hdl_exit;
  152046. + }
  152047. +
  152048. +
  152049. + res = phandler->handler(&padapter->drvextpriv, bset, poidparam->data);
  152050. +
  152051. + if(res==0)
  152052. + {
  152053. + ret = 0;
  152054. +
  152055. + if (bset == 0x00) {//query info
  152056. + //_rtw_memcpy(p->pointer, pparmbuf, len);
  152057. + if (copy_to_user(p->pointer, pparmbuf, len))
  152058. + ret = -EFAULT;
  152059. + }
  152060. + }
  152061. + else
  152062. + ret = -EFAULT;
  152063. +
  152064. +
  152065. +_rtw_drvext_hdl_exit:
  152066. +
  152067. + return ret;
  152068. +
  152069. +#endif
  152070. +
  152071. + return 0;
  152072. +
  152073. +}
  152074. +
  152075. +static void rtw_dbg_mode_hdl(_adapter *padapter, u32 id, u8 *pdata, u32 len)
  152076. +{
  152077. + pRW_Reg RegRWStruct;
  152078. + struct rf_reg_param *prfreg;
  152079. + u8 path;
  152080. + u8 offset;
  152081. + u32 value;
  152082. +
  152083. + DBG_871X("%s\n", __FUNCTION__);
  152084. +
  152085. + switch(id)
  152086. + {
  152087. + case GEN_MP_IOCTL_SUBCODE(MP_START):
  152088. + DBG_871X("871x_driver is only for normal mode, can't enter mp mode\n");
  152089. + break;
  152090. + case GEN_MP_IOCTL_SUBCODE(READ_REG):
  152091. + RegRWStruct = (pRW_Reg)pdata;
  152092. + switch (RegRWStruct->width)
  152093. + {
  152094. + case 1:
  152095. + RegRWStruct->value = rtw_read8(padapter, RegRWStruct->offset);
  152096. + break;
  152097. + case 2:
  152098. + RegRWStruct->value = rtw_read16(padapter, RegRWStruct->offset);
  152099. + break;
  152100. + case 4:
  152101. + RegRWStruct->value = rtw_read32(padapter, RegRWStruct->offset);
  152102. + break;
  152103. + default:
  152104. + break;
  152105. + }
  152106. +
  152107. + break;
  152108. + case GEN_MP_IOCTL_SUBCODE(WRITE_REG):
  152109. + RegRWStruct = (pRW_Reg)pdata;
  152110. + switch (RegRWStruct->width)
  152111. + {
  152112. + case 1:
  152113. + rtw_write8(padapter, RegRWStruct->offset, (u8)RegRWStruct->value);
  152114. + break;
  152115. + case 2:
  152116. + rtw_write16(padapter, RegRWStruct->offset, (u16)RegRWStruct->value);
  152117. + break;
  152118. + case 4:
  152119. + rtw_write32(padapter, RegRWStruct->offset, (u32)RegRWStruct->value);
  152120. + break;
  152121. + default:
  152122. + break;
  152123. + }
  152124. +
  152125. + break;
  152126. + case GEN_MP_IOCTL_SUBCODE(READ_RF_REG):
  152127. +
  152128. + prfreg = (struct rf_reg_param *)pdata;
  152129. +
  152130. + path = (u8)prfreg->path;
  152131. + offset = (u8)prfreg->offset;
  152132. +
  152133. + value = rtw_hal_read_rfreg(padapter, path, offset, 0xffffffff);
  152134. +
  152135. + prfreg->value = value;
  152136. +
  152137. + break;
  152138. + case GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG):
  152139. +
  152140. + prfreg = (struct rf_reg_param *)pdata;
  152141. +
  152142. + path = (u8)prfreg->path;
  152143. + offset = (u8)prfreg->offset;
  152144. + value = prfreg->value;
  152145. +
  152146. + rtw_hal_write_rfreg(padapter, path, offset, 0xffffffff, value);
  152147. +
  152148. + break;
  152149. + case GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO):
  152150. + DBG_871X("==> trigger gpio 0\n");
  152151. + rtw_hal_set_hwreg(padapter, HW_VAR_TRIGGER_GPIO_0, 0);
  152152. + break;
  152153. +#ifdef CONFIG_BT_COEXIST
  152154. + case GEN_MP_IOCTL_SUBCODE(SET_DM_BT):
  152155. + DBG_871X("==> set dm_bt_coexist:%x\n",*(u8 *)pdata);
  152156. + rtw_hal_set_hwreg(padapter, HW_VAR_BT_SET_COEXIST, pdata);
  152157. + break;
  152158. + case GEN_MP_IOCTL_SUBCODE(DEL_BA):
  152159. + DBG_871X("==> delete ba:%x\n",*(u8 *)pdata);
  152160. + rtw_hal_set_hwreg(padapter, HW_VAR_BT_ISSUE_DELBA, pdata);
  152161. + break;
  152162. +#endif
  152163. +#ifdef DBG_CONFIG_ERROR_DETECT
  152164. + case GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS):
  152165. + *pdata = rtw_hal_sreset_get_wifi_status(padapter);
  152166. + break;
  152167. +#endif
  152168. +
  152169. + default:
  152170. + break;
  152171. + }
  152172. +
  152173. +}
  152174. +
  152175. +static int rtw_mp_ioctl_hdl(struct net_device *dev, struct iw_request_info *info,
  152176. + union iwreq_data *wrqu, char *extra)
  152177. +{
  152178. + int ret = 0;
  152179. + u32 BytesRead, BytesWritten, BytesNeeded;
  152180. + struct oid_par_priv oid_par;
  152181. + struct mp_ioctl_handler *phandler;
  152182. + struct mp_ioctl_param *poidparam;
  152183. + uint status=0;
  152184. + u16 len;
  152185. + u8 *pparmbuf = NULL, bset;
  152186. + PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);
  152187. + struct iw_point *p = &wrqu->data;
  152188. +
  152189. + //DBG_871X("+rtw_mp_ioctl_hdl\n");
  152190. +
  152191. + //mutex_lock(&ioctl_mutex);
  152192. +
  152193. + if ((!p->length) || (!p->pointer)) {
  152194. + ret = -EINVAL;
  152195. + goto _rtw_mp_ioctl_hdl_exit;
  152196. + }
  152197. +
  152198. + pparmbuf = NULL;
  152199. + bset = (u8)(p->flags & 0xFFFF);
  152200. + len = p->length;
  152201. + pparmbuf = (u8*)rtw_malloc(len);
  152202. + if (pparmbuf == NULL){
  152203. + ret = -ENOMEM;
  152204. + goto _rtw_mp_ioctl_hdl_exit;
  152205. + }
  152206. +
  152207. + if (copy_from_user(pparmbuf, p->pointer, len)) {
  152208. + ret = -EFAULT;
  152209. + goto _rtw_mp_ioctl_hdl_exit;
  152210. + }
  152211. +
  152212. + poidparam = (struct mp_ioctl_param *)pparmbuf;
  152213. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
  152214. + ("rtw_mp_ioctl_hdl: subcode [%d], len[%d], buffer_len[%d]\r\n",
  152215. + poidparam->subcode, poidparam->len, len));
  152216. +
  152217. + if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) {
  152218. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_, ("no matching drvext subcodes\r\n"));
  152219. + ret = -EINVAL;
  152220. + goto _rtw_mp_ioctl_hdl_exit;
  152221. + }
  152222. +
  152223. + //DBG_871X("%s: %d\n", __func__, poidparam->subcode);
  152224. +
  152225. +#ifdef CONFIG_MP_INCLUDED
  152226. + phandler = mp_ioctl_hdl + poidparam->subcode;
  152227. +
  152228. + if ((phandler->paramsize != 0) && (poidparam->len < phandler->paramsize))
  152229. + {
  152230. + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,
  152231. + ("no matching drvext param size %d vs %d\r\n",
  152232. + poidparam->len, phandler->paramsize));
  152233. + ret = -EINVAL;
  152234. + goto _rtw_mp_ioctl_hdl_exit;
  152235. + }
  152236. +
  152237. + if (phandler->handler)
  152238. + {
  152239. + oid_par.adapter_context = padapter;
  152240. + oid_par.oid = phandler->oid;
  152241. + oid_par.information_buf = poidparam->data;
  152242. + oid_par.information_buf_len = poidparam->len;
  152243. + oid_par.dbg = 0;
  152244. +
  152245. + BytesWritten = 0;
  152246. + BytesNeeded = 0;
  152247. +
  152248. + if (bset) {
  152249. + oid_par.bytes_rw = &BytesRead;
  152250. + oid_par.bytes_needed = &BytesNeeded;
  152251. + oid_par.type_of_oid = SET_OID;
  152252. + } else {
  152253. + oid_par.bytes_rw = &BytesWritten;
  152254. + oid_par.bytes_needed = &BytesNeeded;
  152255. + oid_par.type_of_oid = QUERY_OID;
  152256. + }
  152257. +
  152258. + status = phandler->handler(&oid_par);
  152259. +
  152260. + //todo:check status, BytesNeeded, etc.
  152261. + }
  152262. + else {
  152263. + DBG_871X("rtw_mp_ioctl_hdl(): err!, subcode=%d, oid=%d, handler=%p\n",
  152264. + poidparam->subcode, phandler->oid, phandler->handler);
  152265. + ret = -EFAULT;
  152266. + goto _rtw_mp_ioctl_hdl_exit;
  152267. + }
  152268. +#else
  152269. +
  152270. + rtw_dbg_mode_hdl(padapter, poidparam->subcode, poidparam->data, poidparam->len);
  152271. +
  152272. +#endif
  152273. +
  152274. + if (bset == 0x00) {//query info
  152275. + if (copy_to_user(p->pointer, pparmbuf, len))
  152276. + ret = -EFAULT;
  152277. + }
  152278. +
  152279. + if (status) {
  152280. + ret = -EFAULT;
  152281. + goto _rtw_mp_ioctl_hdl_exit;
  152282. + }
  152283. +
  152284. +_rtw_mp_ioctl_hdl_exit:
  152285. +
  152286. + if (pparmbuf)
  152287. + rtw_mfree(pparmbuf, len);
  152288. +
  152289. + //mutex_unlock(&ioctl_mutex);
  152290. +
  152291. + return ret;
  152292. +}
  152293. +
  152294. +static int rtw_get_ap_info(struct net_device *dev,
  152295. + struct iw_request_info *info,
  152296. + union iwreq_data *wrqu, char *extra)
  152297. +{
  152298. + int bssid_match, ret = 0;
  152299. + u32 cnt=0, wpa_ielen;
  152300. + _irqL irqL;
  152301. + _list *plist, *phead;
  152302. + unsigned char *pbuf;
  152303. + u8 bssid[ETH_ALEN];
  152304. + char data[32];
  152305. + struct wlan_network *pnetwork = NULL;
  152306. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152307. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  152308. + _queue *queue = &(pmlmepriv->scanned_queue);
  152309. + struct iw_point *pdata = &wrqu->data;
  152310. +
  152311. + DBG_871X("+rtw_get_aplist_info\n");
  152312. +
  152313. + if((padapter->bDriverStopped) || (pdata==NULL))
  152314. + {
  152315. + ret= -EINVAL;
  152316. + goto exit;
  152317. + }
  152318. +
  152319. + while((check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))) == _TRUE)
  152320. + {
  152321. + rtw_msleep_os(30);
  152322. + cnt++;
  152323. + if(cnt > 100)
  152324. + break;
  152325. + }
  152326. +
  152327. +
  152328. + //pdata->length = 0;//?
  152329. + pdata->flags = 0;
  152330. + if(pdata->length>=32)
  152331. + {
  152332. + if(copy_from_user(data, pdata->pointer, 32))
  152333. + {
  152334. + ret= -EINVAL;
  152335. + goto exit;
  152336. + }
  152337. + }
  152338. + else
  152339. + {
  152340. + ret= -EINVAL;
  152341. + goto exit;
  152342. + }
  152343. +
  152344. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  152345. +
  152346. + phead = get_list_head(queue);
  152347. + plist = get_next(phead);
  152348. +
  152349. + while(1)
  152350. + {
  152351. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  152352. + break;
  152353. +
  152354. +
  152355. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  152356. +
  152357. + //if(hwaddr_aton_i(pdata->pointer, bssid))
  152358. + if(hwaddr_aton_i(data, bssid))
  152359. + {
  152360. + DBG_871X("Invalid BSSID '%s'.\n", (u8*)data);
  152361. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  152362. + return -EINVAL;
  152363. + }
  152364. +
  152365. +
  152366. + if(_rtw_memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE)//BSSID match, then check if supporting wpa/wpa2
  152367. + {
  152368. + DBG_871X("BSSID:" MAC_FMT "\n", MAC_ARG(bssid));
  152369. +
  152370. + pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);
  152371. + if(pbuf && (wpa_ielen>0))
  152372. + {
  152373. + pdata->flags = 1;
  152374. + break;
  152375. + }
  152376. +
  152377. + pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);
  152378. + if(pbuf && (wpa_ielen>0))
  152379. + {
  152380. + pdata->flags = 2;
  152381. + break;
  152382. + }
  152383. +
  152384. + }
  152385. +
  152386. + plist = get_next(plist);
  152387. +
  152388. + }
  152389. +
  152390. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  152391. +
  152392. + if(pdata->length>=34)
  152393. + {
  152394. + if(copy_to_user((u8*)pdata->pointer+32, (u8*)&pdata->flags, 1))
  152395. + {
  152396. + ret= -EINVAL;
  152397. + goto exit;
  152398. + }
  152399. + }
  152400. +
  152401. +exit:
  152402. +
  152403. + return ret;
  152404. +
  152405. +}
  152406. +
  152407. +static int rtw_set_pid(struct net_device *dev,
  152408. + struct iw_request_info *info,
  152409. + union iwreq_data *wrqu, char *extra)
  152410. +{
  152411. +
  152412. + int ret = 0;
  152413. + _adapter *padapter = rtw_netdev_priv(dev);
  152414. + int *pdata = (int *)wrqu;
  152415. + int selector;
  152416. +
  152417. + if((padapter->bDriverStopped) || (pdata==NULL))
  152418. + {
  152419. + ret= -EINVAL;
  152420. + goto exit;
  152421. + }
  152422. +
  152423. + selector = *pdata;
  152424. + if(selector < 3 && selector >=0) {
  152425. + padapter->pid[selector] = *(pdata+1);
  152426. + #ifdef CONFIG_GLOBAL_UI_PID
  152427. + ui_pid[selector] = *(pdata+1);
  152428. + #endif
  152429. + DBG_871X("%s set pid[%d]=%d\n", __FUNCTION__, selector ,padapter->pid[selector]);
  152430. + }
  152431. + else
  152432. + DBG_871X("%s selector %d error\n", __FUNCTION__, selector);
  152433. +
  152434. +exit:
  152435. +
  152436. + return ret;
  152437. +
  152438. +}
  152439. +
  152440. +static int rtw_wps_start(struct net_device *dev,
  152441. + struct iw_request_info *info,
  152442. + union iwreq_data *wrqu, char *extra)
  152443. +{
  152444. +
  152445. + int ret = 0;
  152446. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152447. + struct iw_point *pdata = &wrqu->data;
  152448. + u32 u32wps_start = 0;
  152449. + unsigned int uintRet = 0;
  152450. +
  152451. + uintRet = copy_from_user( ( void* ) &u32wps_start, pdata->pointer, 4 );
  152452. +
  152453. + if((padapter->bDriverStopped) || (pdata==NULL))
  152454. + {
  152455. + ret= -EINVAL;
  152456. + goto exit;
  152457. + }
  152458. +
  152459. + if ( u32wps_start == 0 )
  152460. + {
  152461. + u32wps_start = *extra;
  152462. + }
  152463. +
  152464. + DBG_871X( "[%s] wps_start = %d\n", __FUNCTION__, u32wps_start );
  152465. +
  152466. + if ( u32wps_start == 1 ) // WPS Start
  152467. + {
  152468. + rtw_led_control(padapter, LED_CTL_START_WPS);
  152469. + }
  152470. + else if ( u32wps_start == 2 ) // WPS Stop because of wps success
  152471. + {
  152472. + rtw_led_control(padapter, LED_CTL_STOP_WPS);
  152473. + }
  152474. + else if ( u32wps_start == 3 ) // WPS Stop because of wps fail
  152475. + {
  152476. + rtw_led_control(padapter, LED_CTL_STOP_WPS_FAIL);
  152477. + }
  152478. +
  152479. +#ifdef CONFIG_INTEL_WIDI
  152480. + process_intel_widi_wps_status(padapter, u32wps_start);
  152481. +#endif //CONFIG_INTEL_WIDI
  152482. +
  152483. +exit:
  152484. +
  152485. + return ret;
  152486. +
  152487. +}
  152488. +
  152489. +#ifdef CONFIG_P2P
  152490. +static int rtw_wext_p2p_enable(struct net_device *dev,
  152491. + struct iw_request_info *info,
  152492. + union iwreq_data *wrqu, char *extra)
  152493. +{
  152494. +
  152495. + int ret = 0;
  152496. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152497. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  152498. + struct iw_point *pdata = &wrqu->data;
  152499. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152500. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  152501. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  152502. + enum P2P_ROLE init_role = P2P_ROLE_DISABLE;
  152503. +
  152504. + if(*extra == '0' )
  152505. + init_role = P2P_ROLE_DISABLE;
  152506. + else if(*extra == '1')
  152507. + init_role = P2P_ROLE_DEVICE;
  152508. + else if(*extra == '2')
  152509. + init_role = P2P_ROLE_CLIENT;
  152510. + else if(*extra == '3')
  152511. + init_role = P2P_ROLE_GO;
  152512. +
  152513. + if(_FAIL == rtw_p2p_enable(padapter, init_role))
  152514. + {
  152515. + ret = -EFAULT;
  152516. + goto exit;
  152517. + }
  152518. +
  152519. + //set channel/bandwidth
  152520. + if(init_role != P2P_ROLE_DISABLE)
  152521. + {
  152522. + u8 channel, ch_offset;
  152523. + u16 bwmode;
  152524. +
  152525. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN))
  152526. + {
  152527. + // Stay at the listen state and wait for discovery.
  152528. + channel = pwdinfo->listen_channel;
  152529. + pwdinfo->operating_channel = pwdinfo->listen_channel;
  152530. + ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  152531. + bwmode = HT_CHANNEL_WIDTH_20;
  152532. + }
  152533. +#ifdef CONFIG_CONCURRENT_MODE
  152534. + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
  152535. + {
  152536. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  152537. + //struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
  152538. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  152539. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  152540. +
  152541. + _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval );
  152542. + if ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )
  152543. + {
  152544. + pwdinfo->operating_channel = pbuddy_mlmeext->cur_channel;
  152545. + // How about the ch_offset and bwmode ??
  152546. + }
  152547. + else
  152548. + {
  152549. + pwdinfo->operating_channel = pwdinfo->listen_channel;
  152550. + }
  152551. +
  152552. + channel = pbuddy_mlmeext->cur_channel;
  152553. + ch_offset = pbuddy_mlmeext->cur_ch_offset;
  152554. + bwmode = pbuddy_mlmeext->cur_bwmode;
  152555. + }
  152556. +#endif
  152557. + else
  152558. + {
  152559. + pwdinfo->operating_channel = pmlmeext->cur_channel;
  152560. +
  152561. + channel = pwdinfo->operating_channel;
  152562. + ch_offset = pmlmeext->cur_ch_offset;
  152563. + bwmode = pmlmeext->cur_bwmode;
  152564. + }
  152565. +
  152566. + set_channel_bwmode(padapter, channel, ch_offset, bwmode);
  152567. + }
  152568. +
  152569. +exit:
  152570. + return ret;
  152571. +
  152572. +}
  152573. +
  152574. +static int rtw_p2p_set_go_nego_ssid(struct net_device *dev,
  152575. + struct iw_request_info *info,
  152576. + union iwreq_data *wrqu, char *extra)
  152577. +{
  152578. +
  152579. + int ret = 0;
  152580. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152581. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  152582. + struct iw_point *pdata = &wrqu->data;
  152583. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152584. +
  152585. + DBG_871X( "[%s] ssid = %s, len = %d\n", __FUNCTION__, extra, (u32)strlen( extra ) );
  152586. + _rtw_memcpy( pwdinfo->nego_ssid, extra, strlen( extra ) );
  152587. + pwdinfo->nego_ssidlen = strlen( extra );
  152588. +
  152589. + return ret;
  152590. +
  152591. +}
  152592. +
  152593. +
  152594. +static int rtw_p2p_set_intent(struct net_device *dev,
  152595. + struct iw_request_info *info,
  152596. + union iwreq_data *wrqu, char *extra)
  152597. +{
  152598. + int ret = 0;
  152599. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152600. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152601. + u8 intent = pwdinfo->intent;
  152602. +
  152603. + extra[ wrqu->data.length ] = 0x00;
  152604. +
  152605. + intent = rtw_atoi( extra );
  152606. +
  152607. + if ( intent <= 15 )
  152608. + {
  152609. + pwdinfo->intent= intent;
  152610. + }
  152611. + else
  152612. + {
  152613. + ret = -1;
  152614. + }
  152615. +
  152616. + DBG_871X( "[%s] intent = %d\n", __FUNCTION__, intent);
  152617. +
  152618. + return ret;
  152619. +
  152620. +}
  152621. +
  152622. +static int rtw_p2p_set_listen_ch(struct net_device *dev,
  152623. + struct iw_request_info *info,
  152624. + union iwreq_data *wrqu, char *extra)
  152625. +{
  152626. +
  152627. + int ret = 0;
  152628. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152629. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152630. + u8 listen_ch = pwdinfo->listen_channel; // Listen channel number
  152631. +
  152632. + extra[ wrqu->data.length ] = 0x00;
  152633. + listen_ch = rtw_atoi( extra );
  152634. +
  152635. + if ( ( listen_ch == 1 ) || ( listen_ch == 6 ) || ( listen_ch == 11 ) )
  152636. + {
  152637. + pwdinfo->listen_channel = listen_ch;
  152638. + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  152639. + }
  152640. + else
  152641. + {
  152642. + ret = -1;
  152643. + }
  152644. +
  152645. + DBG_871X( "[%s] listen_ch = %d\n", __FUNCTION__, pwdinfo->listen_channel );
  152646. +
  152647. + return ret;
  152648. +
  152649. +}
  152650. +
  152651. +static int rtw_p2p_set_op_ch(struct net_device *dev,
  152652. + struct iw_request_info *info,
  152653. + union iwreq_data *wrqu, char *extra)
  152654. +{
  152655. +// Commented by Albert 20110524
  152656. +// This function is used to set the operating channel if the driver will become the group owner
  152657. +
  152658. + int ret = 0;
  152659. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152660. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152661. + u8 op_ch = pwdinfo->operating_channel; // Operating channel number
  152662. +
  152663. + extra[ wrqu->data.length ] = 0x00;
  152664. +
  152665. + op_ch = ( u8 ) rtw_atoi( extra );
  152666. + if ( op_ch > 0 )
  152667. + {
  152668. + pwdinfo->operating_channel = op_ch;
  152669. + }
  152670. + else
  152671. + {
  152672. + ret = -1;
  152673. + }
  152674. +
  152675. + DBG_871X( "[%s] op_ch = %d\n", __FUNCTION__, pwdinfo->operating_channel );
  152676. +
  152677. + return ret;
  152678. +
  152679. +}
  152680. +
  152681. +
  152682. +static int rtw_p2p_profilefound(struct net_device *dev,
  152683. + struct iw_request_info *info,
  152684. + union iwreq_data *wrqu, char *extra)
  152685. +{
  152686. +
  152687. + int ret = 0;
  152688. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152689. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152690. +
  152691. + // Comment by Albert 2010/10/13
  152692. + // Input data format:
  152693. + // Ex: 0
  152694. + // Ex: 1XX:XX:XX:XX:XX:XXYYSSID
  152695. + // 0 => Reflush the profile record list.
  152696. + // 1 => Add the profile list
  152697. + // XX:XX:XX:XX:XX:XX => peer's MAC Address ( ex: 00:E0:4C:00:00:01 )
  152698. + // YY => SSID Length
  152699. + // SSID => SSID for persistence group
  152700. +
  152701. + DBG_871X( "[%s] In value = %s, len = %d \n", __FUNCTION__, extra, wrqu->data.length -1);
  152702. +
  152703. +
  152704. + // The upper application should pass the SSID to driver by using this rtw_p2p_profilefound function.
  152705. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  152706. + {
  152707. + if ( extra[ 0 ] == '0' )
  152708. + {
  152709. + // Remove all the profile information of wifidirect_info structure.
  152710. + _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
  152711. + pwdinfo->profileindex = 0;
  152712. + }
  152713. + else
  152714. + {
  152715. + if ( pwdinfo->profileindex >= P2P_MAX_PERSISTENT_GROUP_NUM )
  152716. + {
  152717. + ret = -1;
  152718. + }
  152719. + else
  152720. + {
  152721. + int jj, kk;
  152722. +
  152723. + // Add this profile information into pwdinfo->profileinfo
  152724. + // Ex: 1XX:XX:XX:XX:XX:XXYYSSID
  152725. + for( jj = 0, kk = 1; jj < ETH_ALEN; jj++, kk += 3 )
  152726. + {
  152727. + pwdinfo->profileinfo[ pwdinfo->profileindex ].peermac[ jj ] = key_2char2num(extra[ kk ], extra[ kk+ 1 ]);
  152728. + }
  152729. +
  152730. + //pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen = ( extra[18] - '0' ) * 10 + ( extra[ 19 ] - '0' );
  152731. + //_rtw_memcpy( pwdinfo->profileinfo[ pwdinfo->profileindex ].ssid, &extra[ 20 ], pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen );
  152732. + pwdinfo->profileindex++;
  152733. + }
  152734. + }
  152735. + }
  152736. +
  152737. + return ret;
  152738. +
  152739. +}
  152740. +
  152741. +static int rtw_p2p_setDN(struct net_device *dev,
  152742. + struct iw_request_info *info,
  152743. + union iwreq_data *wrqu, char *extra)
  152744. +{
  152745. +
  152746. + int ret = 0;
  152747. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152748. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  152749. +
  152750. +
  152751. + DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  152752. +
  152753. + _rtw_memset( pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN );
  152754. + _rtw_memcpy( pwdinfo->device_name, extra, wrqu->data.length - 1 );
  152755. + pwdinfo->device_name_len = wrqu->data.length - 1;
  152756. + return ret;
  152757. +
  152758. +}
  152759. +
  152760. +
  152761. +static int rtw_p2p_get_status(struct net_device *dev,
  152762. + struct iw_request_info *info,
  152763. + union iwreq_data *wrqu, char *extra)
  152764. +{
  152765. +
  152766. + int ret = 0;
  152767. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152768. + struct iw_point *pdata = &wrqu->data;
  152769. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152770. +
  152771. +
  152772. + if ( padapter->bShowGetP2PState )
  152773. + {
  152774. + DBG_871X( "[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
  152775. + pwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],
  152776. + pwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);
  152777. + }
  152778. +
  152779. + // Commented by Albert 2010/10/12
  152780. + // Because of the output size limitation, I had removed the "Role" information.
  152781. + // About the "Role" information, we will use the new private IOCTL to get the "Role" information.
  152782. + sprintf( extra, "\n\nStatus=%.2d\n", rtw_p2p_state(pwdinfo) );
  152783. + wrqu->data.length = strlen( extra );
  152784. +
  152785. + return ret;
  152786. +
  152787. +}
  152788. +
  152789. +// Commented by Albert 20110520
  152790. +// This function will return the config method description
  152791. +// This config method description will show us which config method the remote P2P device is intented to use
  152792. +// by sending the provisioning discovery request frame.
  152793. +
  152794. +static int rtw_p2p_get_req_cm(struct net_device *dev,
  152795. + struct iw_request_info *info,
  152796. + union iwreq_data *wrqu, char *extra)
  152797. +{
  152798. +
  152799. + int ret = 0;
  152800. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152801. + struct iw_point *pdata = &wrqu->data;
  152802. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152803. +
  152804. + sprintf( extra, "\n\nCM=%s\n", pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req );
  152805. + wrqu->data.length = strlen( extra );
  152806. + return ret;
  152807. +
  152808. +}
  152809. +
  152810. +
  152811. +static int rtw_p2p_get_role(struct net_device *dev,
  152812. + struct iw_request_info *info,
  152813. + union iwreq_data *wrqu, char *extra)
  152814. +{
  152815. +
  152816. + int ret = 0;
  152817. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152818. + struct iw_point *pdata = &wrqu->data;
  152819. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152820. +
  152821. +
  152822. + DBG_871X( "[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
  152823. + pwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],
  152824. + pwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);
  152825. +
  152826. + sprintf( extra, "\n\nRole=%.2d\n", rtw_p2p_role(pwdinfo) );
  152827. + wrqu->data.length = strlen( extra );
  152828. + return ret;
  152829. +
  152830. +}
  152831. +
  152832. +
  152833. +static int rtw_p2p_get_peer_ifaddr(struct net_device *dev,
  152834. + struct iw_request_info *info,
  152835. + union iwreq_data *wrqu, char *extra)
  152836. +{
  152837. +
  152838. + int ret = 0;
  152839. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152840. + struct iw_point *pdata = &wrqu->data;
  152841. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152842. +
  152843. +
  152844. + DBG_871X( "[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
  152845. + pwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],
  152846. + pwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);
  152847. +
  152848. + sprintf( extra, "\nMAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
  152849. + pwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],
  152850. + pwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);
  152851. + wrqu->data.length = strlen( extra );
  152852. + return ret;
  152853. +
  152854. +}
  152855. +
  152856. +static int rtw_p2p_get_peer_devaddr(struct net_device *dev,
  152857. + struct iw_request_info *info,
  152858. + union iwreq_data *wrqu, char *extra)
  152859. +
  152860. +{
  152861. +
  152862. + int ret = 0;
  152863. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152864. + struct iw_point *pdata = &wrqu->data;
  152865. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152866. +
  152867. + DBG_871X( "[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
  152868. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 0 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 1 ],
  152869. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 2 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 3 ],
  152870. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 4 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 5 ]);
  152871. + sprintf( extra, "\n%.2X%.2X%.2X%.2X%.2X%.2X",
  152872. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 0 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 1 ],
  152873. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 2 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 3 ],
  152874. + pwdinfo->rx_prov_disc_info.peerDevAddr[ 4 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 5 ]);
  152875. + wrqu->data.length = strlen( extra );
  152876. + return ret;
  152877. +
  152878. +}
  152879. +
  152880. +static int rtw_p2p_get_peer_devaddr_by_invitation(struct net_device *dev,
  152881. + struct iw_request_info *info,
  152882. + union iwreq_data *wrqu, char *extra)
  152883. +
  152884. +{
  152885. +
  152886. + int ret = 0;
  152887. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152888. + struct iw_point *pdata = &wrqu->data;
  152889. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152890. +
  152891. + DBG_871X( "[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
  152892. + pwdinfo->p2p_peer_device_addr[ 0 ], pwdinfo->p2p_peer_device_addr[ 1 ],
  152893. + pwdinfo->p2p_peer_device_addr[ 2 ], pwdinfo->p2p_peer_device_addr[ 3 ],
  152894. + pwdinfo->p2p_peer_device_addr[ 4 ], pwdinfo->p2p_peer_device_addr[ 5 ]);
  152895. + sprintf( extra, "\nMAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
  152896. + pwdinfo->p2p_peer_device_addr[ 0 ], pwdinfo->p2p_peer_device_addr[ 1 ],
  152897. + pwdinfo->p2p_peer_device_addr[ 2 ], pwdinfo->p2p_peer_device_addr[ 3 ],
  152898. + pwdinfo->p2p_peer_device_addr[ 4 ], pwdinfo->p2p_peer_device_addr[ 5 ]);
  152899. + wrqu->data.length = strlen( extra );
  152900. + return ret;
  152901. +
  152902. +}
  152903. +
  152904. +static int rtw_p2p_get_groupid(struct net_device *dev,
  152905. + struct iw_request_info *info,
  152906. + union iwreq_data *wrqu, char *extra)
  152907. +
  152908. +{
  152909. +
  152910. + int ret = 0;
  152911. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152912. + struct iw_point *pdata = &wrqu->data;
  152913. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152914. +
  152915. + sprintf( extra, "\n%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s",
  152916. + pwdinfo->groupid_info.go_device_addr[ 0 ], pwdinfo->groupid_info.go_device_addr[ 1 ],
  152917. + pwdinfo->groupid_info.go_device_addr[ 2 ], pwdinfo->groupid_info.go_device_addr[ 3 ],
  152918. + pwdinfo->groupid_info.go_device_addr[ 4 ], pwdinfo->groupid_info.go_device_addr[ 5 ],
  152919. + pwdinfo->groupid_info.ssid);
  152920. + wrqu->data.length = strlen( extra );
  152921. + return ret;
  152922. +
  152923. +}
  152924. +
  152925. +static int rtw_p2p_get_op_ch(struct net_device *dev,
  152926. + struct iw_request_info *info,
  152927. + union iwreq_data *wrqu, char *extra)
  152928. +
  152929. +{
  152930. +
  152931. + int ret = 0;
  152932. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152933. + struct iw_point *pdata = &wrqu->data;
  152934. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  152935. +
  152936. +
  152937. + DBG_871X( "[%s] Op_ch = %02x\n", __FUNCTION__, pwdinfo->operating_channel);
  152938. +
  152939. + sprintf( extra, "\n\nOp_ch=%.2d\n", pwdinfo->operating_channel );
  152940. + wrqu->data.length = strlen( extra );
  152941. + return ret;
  152942. +
  152943. +}
  152944. +
  152945. +inline static void macstr2num(u8 *dst, u8 *src)
  152946. +{
  152947. + int jj, kk;
  152948. + for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)
  152949. + {
  152950. + dst[jj] = key_2char2num(src[kk], src[kk + 1]);
  152951. + }
  152952. +}
  152953. +
  152954. +static int rtw_p2p_get_wps_configmethod(struct net_device *dev,
  152955. + struct iw_request_info *info,
  152956. + union iwreq_data *wrqu, char *extra, char *subcmd)
  152957. +{
  152958. +
  152959. + int ret = 0;
  152960. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  152961. + u8 peerMAC[ETH_ALEN] = { 0x00 };
  152962. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  152963. + _irqL irqL;
  152964. + _list * plist,*phead;
  152965. + _queue *queue = &(pmlmepriv->scanned_queue);
  152966. + struct wlan_network *pnetwork = NULL;
  152967. + u8 blnMatch = 0;
  152968. + u16 attr_content = 0;
  152969. + uint attr_contentlen = 0;
  152970. + u8 attr_content_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };
  152971. +
  152972. + // Commented by Albert 20110727
  152973. + // The input data is the MAC address which the application wants to know its WPS config method.
  152974. + // After knowing its WPS config method, the application can decide the config method for provisioning discovery.
  152975. + // Format: iwpriv wlanx p2p_get_wpsCM 00:E0:4C:00:00:05
  152976. +
  152977. + DBG_871X("[%s] data = %s\n", __FUNCTION__, subcmd);
  152978. +
  152979. + macstr2num(peerMAC, subcmd);
  152980. +
  152981. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  152982. +
  152983. + phead = get_list_head(queue);
  152984. + plist = get_next(phead);
  152985. +
  152986. + while (1)
  152987. + {
  152988. + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break;
  152989. +
  152990. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  152991. + if (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))
  152992. + {
  152993. + u8 *wpsie;
  152994. + uint wpsie_len = 0;
  152995. +
  152996. + // The mac address is matched.
  152997. +
  152998. + if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len)))
  152999. + {
  153000. + rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_CONF_METHOD, (u8 *)&attr_content, &attr_contentlen);
  153001. + if (attr_contentlen)
  153002. + {
  153003. + attr_content = be16_to_cpu(attr_content);
  153004. + sprintf(attr_content_str, "\n\nM=%.4d", attr_content);
  153005. + blnMatch = 1;
  153006. + }
  153007. + }
  153008. +
  153009. + break;
  153010. + }
  153011. +
  153012. + plist = get_next(plist);
  153013. +
  153014. + }
  153015. +
  153016. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153017. +
  153018. + if (!blnMatch)
  153019. + {
  153020. + sprintf(attr_content_str, "\n\nM=0000");
  153021. + }
  153022. +
  153023. + wrqu->data.length = strlen(attr_content_str);
  153024. + _rtw_memcpy(extra, attr_content_str, wrqu->data.length);
  153025. +
  153026. + return ret;
  153027. +
  153028. +}
  153029. +
  153030. +#ifdef CONFIG_WFD
  153031. +static int rtw_p2p_get_peer_wfd_port(struct net_device *dev,
  153032. + struct iw_request_info *info,
  153033. + union iwreq_data *wrqu, char *extra)
  153034. +{
  153035. +
  153036. + int ret = 0;
  153037. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153038. + struct iw_point *pdata = &wrqu->data;
  153039. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153040. +
  153041. + DBG_871X( "[%s] p2p_state = %d\n", __FUNCTION__, rtw_p2p_state(pwdinfo) );
  153042. +
  153043. + sprintf( extra, "\n\nPort=%d\n", pwdinfo->wfd_info->peer_rtsp_ctrlport );
  153044. + DBG_871X( "[%s] remote port = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );
  153045. +
  153046. + wrqu->data.length = strlen( extra );
  153047. + return ret;
  153048. +
  153049. +}
  153050. +
  153051. +static int rtw_p2p_get_peer_wfd_preferred_connection(struct net_device *dev,
  153052. + struct iw_request_info *info,
  153053. + union iwreq_data *wrqu, char *extra)
  153054. +{
  153055. +
  153056. + int ret = 0;
  153057. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153058. + struct iw_point *pdata = &wrqu->data;
  153059. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153060. +
  153061. + sprintf( extra, "\n\nwfd_pc=%d\n", pwdinfo->wfd_info->wfd_pc );
  153062. + DBG_871X( "[%s] wfd_pc = %d\n", __FUNCTION__, pwdinfo->wfd_info->wfd_pc );
  153063. +
  153064. + wrqu->data.length = strlen( extra );
  153065. + pwdinfo->wfd_info->wfd_pc = _FALSE; // Reset the WFD preferred connection to P2P
  153066. + return ret;
  153067. +
  153068. +}
  153069. +
  153070. +static int rtw_p2p_get_peer_wfd_session_available(struct net_device *dev,
  153071. + struct iw_request_info *info,
  153072. + union iwreq_data *wrqu, char *extra)
  153073. +{
  153074. +
  153075. + int ret = 0;
  153076. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153077. + struct iw_point *pdata = &wrqu->data;
  153078. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153079. +
  153080. + sprintf( extra, "\n\nwfd_sa=%d\n", pwdinfo->wfd_info->peer_session_avail );
  153081. + DBG_871X( "[%s] wfd_sa = %d\n", __FUNCTION__, pwdinfo->wfd_info->peer_session_avail );
  153082. +
  153083. + wrqu->data.length = strlen( extra );
  153084. + pwdinfo->wfd_info->peer_session_avail = _TRUE; // Reset the WFD session available
  153085. + return ret;
  153086. +
  153087. +}
  153088. +
  153089. +#endif // CONFIG_WFD
  153090. +
  153091. +static int rtw_p2p_get_go_device_address(struct net_device *dev,
  153092. + struct iw_request_info *info,
  153093. + union iwreq_data *wrqu, char *extra, char *subcmd)
  153094. +{
  153095. +
  153096. + int ret = 0;
  153097. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153098. + u8 peerMAC[ETH_ALEN] = { 0x00 };
  153099. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153100. + _irqL irqL;
  153101. + _list *plist, *phead;
  153102. + _queue *queue = &(pmlmepriv->scanned_queue);
  153103. + struct wlan_network *pnetwork = NULL;
  153104. + u8 blnMatch = 0;
  153105. + u8 *p2pie;
  153106. + uint p2pielen = 0, attr_contentlen = 0;
  153107. + u8 attr_content[100] = { 0x00 };
  153108. + u8 go_devadd_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };
  153109. +
  153110. + // Commented by Albert 20121209
  153111. + // The input data is the GO's interface address which the application wants to know its device address.
  153112. + // Format: iwpriv wlanx p2p_get2 go_devadd=00:E0:4C:00:00:05
  153113. +
  153114. + DBG_871X("[%s] data = %s\n", __FUNCTION__, subcmd);
  153115. +
  153116. + macstr2num(peerMAC, subcmd);
  153117. +
  153118. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153119. +
  153120. + phead = get_list_head(queue);
  153121. + plist = get_next(phead);
  153122. +
  153123. + while (1)
  153124. + {
  153125. + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break;
  153126. +
  153127. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153128. + if (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))
  153129. + {
  153130. + // Commented by Albert 2011/05/18
  153131. + // Match the device address located in the P2P IE
  153132. + // This is for the case that the P2P device address is not the same as the P2P interface address.
  153133. +
  153134. + if ((p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)))
  153135. + {
  153136. + while (p2pie)
  153137. + {
  153138. + // The P2P Device ID attribute is included in the Beacon frame.
  153139. + // The P2P Device Info attribute is included in the probe response frame.
  153140. +
  153141. + _rtw_memset(attr_content, 0x00, 100);
  153142. + if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen))
  153143. + {
  153144. + // Handle the P2P Device ID attribute of Beacon first
  153145. + blnMatch = 1;
  153146. + break;
  153147. +
  153148. + } else if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen))
  153149. + {
  153150. + // Handle the P2P Device Info attribute of probe response
  153151. + blnMatch = 1;
  153152. + break;
  153153. + }
  153154. +
  153155. + //Get the next P2P IE
  153156. + p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);
  153157. + }
  153158. + }
  153159. + }
  153160. +
  153161. + plist = get_next(plist);
  153162. +
  153163. + }
  153164. +
  153165. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153166. +
  153167. + if (!blnMatch)
  153168. + {
  153169. + sprintf(go_devadd_str, "\n\ndev_add=NULL");
  153170. + } else
  153171. + {
  153172. + sprintf(go_devadd_str, "\n\ndev_add=%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
  153173. + attr_content[0], attr_content[1], attr_content[2], attr_content[3], attr_content[4], attr_content[5]);
  153174. + }
  153175. +
  153176. + wrqu->data.length = strlen(go_devadd_str);
  153177. + _rtw_memcpy(extra, go_devadd_str, wrqu->data.length);
  153178. +
  153179. + return ret;
  153180. +
  153181. +}
  153182. +
  153183. +static int rtw_p2p_get_device_type(struct net_device *dev,
  153184. + struct iw_request_info *info,
  153185. + union iwreq_data *wrqu, char *extra, char *subcmd)
  153186. +{
  153187. +
  153188. + int ret = 0;
  153189. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153190. + u8 peerMAC[ETH_ALEN] = { 0x00 };
  153191. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153192. + _irqL irqL;
  153193. + _list *plist, *phead;
  153194. + _queue *queue = &(pmlmepriv->scanned_queue);
  153195. + struct wlan_network *pnetwork = NULL;
  153196. + u8 blnMatch = 0;
  153197. + u8 dev_type[8] = { 0x00 };
  153198. + uint dev_type_len = 0;
  153199. + u8 dev_type_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 }; // +9 is for the str "dev_type=", we have to clear it at wrqu->data.pointer
  153200. +
  153201. + // Commented by Albert 20121209
  153202. + // The input data is the MAC address which the application wants to know its device type.
  153203. + // Such user interface could know the device type.
  153204. + // Format: iwpriv wlanx p2p_get2 dev_type=00:E0:4C:00:00:05
  153205. +
  153206. + DBG_871X("[%s] data = %s\n", __FUNCTION__, subcmd);
  153207. +
  153208. + macstr2num(peerMAC, subcmd);
  153209. +
  153210. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153211. +
  153212. + phead = get_list_head(queue);
  153213. + plist = get_next(phead);
  153214. +
  153215. + while (1)
  153216. + {
  153217. + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break;
  153218. +
  153219. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153220. + if (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))
  153221. + {
  153222. + u8 *wpsie;
  153223. + uint wpsie_len = 0;
  153224. +
  153225. + // The mac address is matched.
  153226. +
  153227. + if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len)))
  153228. + {
  153229. + rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_PRIMARY_DEV_TYPE, dev_type, &dev_type_len);
  153230. + if (dev_type_len)
  153231. + {
  153232. + u16 type = 0;
  153233. +
  153234. + _rtw_memcpy(&type, dev_type, 2);
  153235. + type = be16_to_cpu(type);
  153236. + sprintf(dev_type_str, "\n\nN=%.2d", type);
  153237. + blnMatch = 1;
  153238. + }
  153239. + }
  153240. + break;
  153241. + }
  153242. +
  153243. + plist = get_next(plist);
  153244. +
  153245. + }
  153246. +
  153247. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153248. +
  153249. + if (!blnMatch)
  153250. + {
  153251. + sprintf(dev_type_str, "\n\nN=00");
  153252. + }
  153253. +
  153254. + wrqu->data.length = strlen(dev_type_str);
  153255. + _rtw_memcpy(extra, dev_type_str, wrqu->data.length);
  153256. +
  153257. + return ret;
  153258. +
  153259. +}
  153260. +
  153261. +static int rtw_p2p_get_device_name(struct net_device *dev,
  153262. + struct iw_request_info *info,
  153263. + union iwreq_data *wrqu, char *extra, char *subcmd)
  153264. +{
  153265. +
  153266. + int ret = 0;
  153267. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153268. + u8 peerMAC[ETH_ALEN] = { 0x00 };
  153269. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153270. + _irqL irqL;
  153271. + _list *plist, *phead;
  153272. + _queue *queue = &(pmlmepriv->scanned_queue);
  153273. + struct wlan_network *pnetwork = NULL;
  153274. + u8 blnMatch = 0;
  153275. + u8 dev_name[WPS_MAX_DEVICE_NAME_LEN] = { 0x00 };
  153276. + uint dev_len = 0;
  153277. + u8 dev_name_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };
  153278. +
  153279. + // Commented by Albert 20121225
  153280. + // The input data is the MAC address which the application wants to know its device name.
  153281. + // Such user interface could show peer device's device name instead of ssid.
  153282. + // Format: iwpriv wlanx p2p_get2 devN=00:E0:4C:00:00:05
  153283. +
  153284. + DBG_871X("[%s] data = %s\n", __FUNCTION__, subcmd);
  153285. +
  153286. + macstr2num(peerMAC, subcmd);
  153287. +
  153288. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153289. +
  153290. + phead = get_list_head(queue);
  153291. + plist = get_next(phead);
  153292. +
  153293. + while (1)
  153294. + {
  153295. + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break;
  153296. +
  153297. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153298. + if (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))
  153299. + {
  153300. + u8 *wpsie;
  153301. + uint wpsie_len = 0;
  153302. +
  153303. + // The mac address is matched.
  153304. +
  153305. + if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len)))
  153306. + {
  153307. + rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_DEVICE_NAME, dev_name, &dev_len);
  153308. + if (dev_len)
  153309. + {
  153310. + sprintf(dev_name_str, "\n\nN=%s", dev_name);
  153311. + blnMatch = 1;
  153312. + }
  153313. + }
  153314. + break;
  153315. + }
  153316. +
  153317. + plist = get_next(plist);
  153318. +
  153319. + }
  153320. +
  153321. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153322. +
  153323. + if (!blnMatch)
  153324. + {
  153325. + sprintf(dev_name_str, "\n\nN=0000");
  153326. + }
  153327. +
  153328. + wrqu->data.length = strlen(dev_name_str);
  153329. + _rtw_memcpy(extra, dev_name_str, wrqu->data.length);
  153330. +
  153331. + return ret;
  153332. +
  153333. +}
  153334. +
  153335. +static int rtw_p2p_get_invitation_procedure(struct net_device *dev,
  153336. + struct iw_request_info *info,
  153337. + union iwreq_data *wrqu, char *extra, char *subcmd)
  153338. +{
  153339. +
  153340. + int ret = 0;
  153341. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153342. + u8 peerMAC[ETH_ALEN] = { 0x00 };
  153343. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153344. + _irqL irqL;
  153345. + _list *plist, *phead;
  153346. + _queue *queue = &(pmlmepriv->scanned_queue);
  153347. + struct wlan_network *pnetwork = NULL;
  153348. + u8 blnMatch = 0;
  153349. + u8 *p2pie;
  153350. + uint p2pielen = 0, attr_contentlen = 0;
  153351. + u8 attr_content[2] = { 0x00 };
  153352. + u8 inv_proc_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };
  153353. +
  153354. + // Commented by Ouden 20121226
  153355. + // The application wants to know P2P initation procedure is support or not.
  153356. + // Format: iwpriv wlanx p2p_get2 InvProc=00:E0:4C:00:00:05
  153357. +
  153358. + DBG_871X("[%s] data = %s\n", __FUNCTION__, subcmd);
  153359. +
  153360. + macstr2num(peerMAC, subcmd);
  153361. +
  153362. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153363. +
  153364. + phead = get_list_head(queue);
  153365. + plist = get_next(phead);
  153366. +
  153367. + while (1)
  153368. + {
  153369. + if (rtw_end_of_queue_search(phead, plist) == _TRUE) break;
  153370. +
  153371. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153372. + if (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))
  153373. + {
  153374. + // Commented by Albert 20121226
  153375. + // Match the device address located in the P2P IE
  153376. + // This is for the case that the P2P device address is not the same as the P2P interface address.
  153377. +
  153378. + if ((p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)))
  153379. + {
  153380. + while (p2pie)
  153381. + {
  153382. + //_rtw_memset( attr_content, 0x00, 2);
  153383. + if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_CAPABILITY, attr_content, &attr_contentlen))
  153384. + {
  153385. + // Handle the P2P capability attribute
  153386. + blnMatch = 1;
  153387. + break;
  153388. +
  153389. + }
  153390. +
  153391. + //Get the next P2P IE
  153392. + p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);
  153393. + }
  153394. + }
  153395. + }
  153396. +
  153397. + plist = get_next(plist);
  153398. +
  153399. + }
  153400. +
  153401. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153402. +
  153403. + if (!blnMatch)
  153404. + {
  153405. + sprintf(inv_proc_str, "\nIP=-1");
  153406. + } else
  153407. + {
  153408. + if (attr_content[0] && 0x20)
  153409. + {
  153410. + sprintf(inv_proc_str, "\nIP=1");
  153411. + } else
  153412. + {
  153413. + sprintf(inv_proc_str, "\nIP=0");
  153414. + }
  153415. + }
  153416. +
  153417. + wrqu->data.length = strlen(inv_proc_str);
  153418. + _rtw_memcpy(extra, inv_proc_str, wrqu->data.length);
  153419. +
  153420. + return ret;
  153421. +
  153422. +}
  153423. +
  153424. +static int rtw_p2p_connect(struct net_device *dev,
  153425. + struct iw_request_info *info,
  153426. + union iwreq_data *wrqu, char *extra)
  153427. +{
  153428. +
  153429. + int ret = 0;
  153430. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153431. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153432. + u8 peerMAC[ ETH_ALEN ] = { 0x00 };
  153433. + int jj,kk;
  153434. + u8 peerMACStr[ ETH_ALEN * 2 ] = { 0x00 };
  153435. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153436. + _irqL irqL;
  153437. + _list *plist, *phead;
  153438. + _queue *queue = &(pmlmepriv->scanned_queue);
  153439. + struct wlan_network *pnetwork = NULL;
  153440. + uint uintPeerChannel = 0;
  153441. +#ifdef CONFIG_CONCURRENT_MODE
  153442. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  153443. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  153444. +#endif // CONFIG_CONCURRENT_MODE
  153445. +
  153446. +
  153447. + // Commented by Albert 20110304
  153448. + // The input data contains two informations.
  153449. + // 1. First information is the MAC address which wants to formate with
  153450. + // 2. Second information is the WPS PINCode or "pbc" string for push button method
  153451. + // Format: 00:E0:4C:00:00:05
  153452. + // Format: 00:E0:4C:00:00:05
  153453. +
  153454. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  153455. +
  153456. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  153457. + {
  153458. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  153459. + return ret;
  153460. + }
  153461. +
  153462. + if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )
  153463. + {
  153464. + return -1;
  153465. + }
  153466. +
  153467. + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
  153468. + {
  153469. + peerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );
  153470. + }
  153471. +
  153472. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153473. +
  153474. + phead = get_list_head(queue);
  153475. + plist = get_next(phead);
  153476. +
  153477. + while(1)
  153478. + {
  153479. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  153480. + break;
  153481. +
  153482. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153483. + if ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) )
  153484. + {
  153485. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  153486. + break;
  153487. + }
  153488. +
  153489. + plist = get_next(plist);
  153490. +
  153491. + }
  153492. +
  153493. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153494. +
  153495. + if ( uintPeerChannel )
  153496. + {
  153497. +#ifdef CONFIG_CONCURRENT_MODE
  153498. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  153499. + {
  153500. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );
  153501. + }
  153502. +#endif // CONFIG_CONCURRENT_MODE
  153503. +
  153504. + _rtw_memset( &pwdinfo->nego_req_info, 0x00, sizeof( struct tx_nego_req_info ) );
  153505. + _rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );
  153506. +
  153507. + pwdinfo->nego_req_info.peer_channel_num[ 0 ] = uintPeerChannel;
  153508. + _rtw_memcpy( pwdinfo->nego_req_info.peerDevAddr, pnetwork->network.MacAddress, ETH_ALEN );
  153509. + pwdinfo->nego_req_info.benable = _TRUE;
  153510. +
  153511. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  153512. + if ( rtw_p2p_state(pwdinfo) != P2P_STATE_GONEGO_OK )
  153513. + {
  153514. + // Restore to the listen state if the current p2p state is not nego OK
  153515. + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN );
  153516. + }
  153517. +
  153518. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  153519. + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);
  153520. +
  153521. +#ifdef CONFIG_CONCURRENT_MODE
  153522. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  153523. + {
  153524. + // Have to enter the power saving with the AP
  153525. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  153526. +
  153527. + issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);
  153528. + }
  153529. +#endif // CONFIG_CONCURRENT_MODE
  153530. +
  153531. + DBG_871X( "[%s] Start PreTx Procedure!\n", __FUNCTION__ );
  153532. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  153533. +
  153534. +#ifdef CONFIG_CONCURRENT_MODE
  153535. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  153536. + {
  153537. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_GO_NEGO_TIMEOUT );
  153538. + }
  153539. + else
  153540. + {
  153541. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_GO_NEGO_TIMEOUT );
  153542. + }
  153543. +#else
  153544. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_GO_NEGO_TIMEOUT );
  153545. +#endif // CONFIG_CONCURRENT_MODE
  153546. +
  153547. + }
  153548. + else
  153549. + {
  153550. + DBG_871X( "[%s] Not Found in Scanning Queue~\n", __FUNCTION__ );
  153551. + ret = -1;
  153552. + }
  153553. +exit:
  153554. + return ret;
  153555. +}
  153556. +
  153557. +static int rtw_p2p_invite_req(struct net_device *dev,
  153558. + struct iw_request_info *info,
  153559. + union iwreq_data *wrqu, char *extra)
  153560. +{
  153561. +
  153562. + int ret = 0;
  153563. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153564. + struct iw_point *pdata = &wrqu->data;
  153565. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153566. + int jj,kk;
  153567. + u8 peerMACStr[ ETH_ALEN * 2 ] = { 0x00 };
  153568. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153569. + _list *plist, *phead;
  153570. + _queue *queue = &(pmlmepriv->scanned_queue);
  153571. + struct wlan_network *pnetwork = NULL;
  153572. + uint uintPeerChannel = 0;
  153573. + u8 attr_content[50] = { 0x00 }, _status = 0;
  153574. + u8 *p2pie;
  153575. + uint p2pielen = 0, attr_contentlen = 0;
  153576. + _irqL irqL;
  153577. + struct tx_invite_req_info* pinvite_req_info = &pwdinfo->invitereq_info;
  153578. +#ifdef CONFIG_CONCURRENT_MODE
  153579. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  153580. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  153581. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  153582. +#endif // CONFIG_CONCURRENT_MODE
  153583. +
  153584. +#ifdef CONFIG_WFD
  153585. + struct wifi_display_info* pwfd_info = pwdinfo->wfd_info;
  153586. +#endif // CONFIG_WFD
  153587. +
  153588. + // Commented by Albert 20120321
  153589. + // The input data contains two informations.
  153590. + // 1. First information is the P2P device address which you want to send to.
  153591. + // 2. Second information is the group id which combines with GO's mac address, space and GO's ssid.
  153592. + // Command line sample: iwpriv wlan0 p2p_set invite="00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy"
  153593. + // Format: 00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy
  153594. +
  153595. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  153596. +
  153597. + if ( wrqu->data.length <= 37 )
  153598. + {
  153599. + DBG_871X( "[%s] Wrong format!\n", __FUNCTION__ );
  153600. + return ret;
  153601. + }
  153602. +
  153603. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  153604. + {
  153605. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  153606. + return ret;
  153607. + }
  153608. + else
  153609. + {
  153610. + // Reset the content of struct tx_invite_req_info
  153611. + pinvite_req_info->benable = _FALSE;
  153612. + _rtw_memset( pinvite_req_info->go_bssid, 0x00, ETH_ALEN );
  153613. + _rtw_memset( pinvite_req_info->go_ssid, 0x00, WLAN_SSID_MAXLEN );
  153614. + pinvite_req_info->ssidlen = 0x00;
  153615. + pinvite_req_info->operating_ch = pwdinfo->operating_channel;
  153616. + _rtw_memset( pinvite_req_info->peer_macaddr, 0x00, ETH_ALEN );
  153617. + pinvite_req_info->token = 3;
  153618. + }
  153619. +
  153620. + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
  153621. + {
  153622. + pinvite_req_info->peer_macaddr[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );
  153623. + }
  153624. +
  153625. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153626. +
  153627. + phead = get_list_head(queue);
  153628. + plist = get_next(phead);
  153629. +
  153630. + while(1)
  153631. + {
  153632. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  153633. + break;
  153634. +
  153635. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153636. +
  153637. + // Commented by Albert 2011/05/18
  153638. + // Match the device address located in the P2P IE
  153639. + // This is for the case that the P2P device address is not the same as the P2P interface address.
  153640. +
  153641. + if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) )
  153642. + {
  153643. + // The P2P Device ID attribute is included in the Beacon frame.
  153644. + // The P2P Device Info attribute is included in the probe response frame.
  153645. +
  153646. + if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )
  153647. + {
  153648. + // Handle the P2P Device ID attribute of Beacon first
  153649. + if ( _rtw_memcmp( attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN ) )
  153650. + {
  153651. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  153652. + break;
  153653. + }
  153654. + }
  153655. + else if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )
  153656. + {
  153657. + // Handle the P2P Device Info attribute of probe response
  153658. + if ( _rtw_memcmp( attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN ) )
  153659. + {
  153660. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  153661. + break;
  153662. + }
  153663. + }
  153664. +
  153665. + }
  153666. +
  153667. + plist = get_next(plist);
  153668. +
  153669. + }
  153670. +
  153671. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153672. +
  153673. +#ifdef CONFIG_WFD
  153674. + if ( uintPeerChannel )
  153675. + {
  153676. + u8 wfd_ie[ 128 ] = { 0x00 };
  153677. + uint wfd_ielen = 0;
  153678. +
  153679. + if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) )
  153680. + {
  153681. + u8 wfd_devinfo[ 6 ] = { 0x00 };
  153682. + uint wfd_devlen = 6;
  153683. +
  153684. + DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
  153685. + if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
  153686. + {
  153687. + u16 wfd_devinfo_field = 0;
  153688. +
  153689. + // Commented by Albert 20120319
  153690. + // The first two bytes are the WFD device information field of WFD device information subelement.
  153691. + // In big endian format.
  153692. + wfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);
  153693. + if ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL )
  153694. + {
  153695. + pwfd_info->peer_session_avail = _TRUE;
  153696. + }
  153697. + else
  153698. + {
  153699. + pwfd_info->peer_session_avail = _FALSE;
  153700. + }
  153701. + }
  153702. + }
  153703. +
  153704. + if ( _FALSE == pwfd_info->peer_session_avail )
  153705. + {
  153706. + DBG_871X( "[%s] WFD Session not avaiable!\n", __FUNCTION__ );
  153707. + goto exit;
  153708. + }
  153709. + }
  153710. +#endif // CONFIG_WFD
  153711. +
  153712. + if ( uintPeerChannel )
  153713. + {
  153714. +#ifdef CONFIG_CONCURRENT_MODE
  153715. + if ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )
  153716. + {
  153717. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );
  153718. + }
  153719. +#endif // CONFIG_CONCURRENT_MODE
  153720. +
  153721. + // Store the GO's bssid
  153722. + for( jj = 0, kk = 18; jj < ETH_ALEN; jj++, kk += 3 )
  153723. + {
  153724. + pinvite_req_info->go_bssid[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );
  153725. + }
  153726. +
  153727. + // Store the GO's ssid
  153728. + pinvite_req_info->ssidlen = wrqu->data.length - 36;
  153729. + _rtw_memcpy( pinvite_req_info->go_ssid, &extra[ 36 ], (u32) pinvite_req_info->ssidlen );
  153730. + pinvite_req_info->benable = _TRUE;
  153731. + pinvite_req_info->peer_ch = uintPeerChannel;
  153732. +
  153733. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  153734. + rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INVITE_REQ);
  153735. +
  153736. +#ifdef CONFIG_CONCURRENT_MODE
  153737. + if ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )
  153738. + {
  153739. + // Have to enter the power saving with the AP
  153740. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  153741. +
  153742. + issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);
  153743. + }
  153744. + else
  153745. + {
  153746. + set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  153747. + }
  153748. +#else
  153749. + set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  153750. +#endif
  153751. +
  153752. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  153753. +
  153754. +#ifdef CONFIG_CONCURRENT_MODE
  153755. + if ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )
  153756. + {
  153757. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_INVITE_TIMEOUT );
  153758. + }
  153759. + else
  153760. + {
  153761. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_INVITE_TIMEOUT );
  153762. + }
  153763. +#else
  153764. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_INVITE_TIMEOUT );
  153765. +#endif // CONFIG_CONCURRENT_MODE
  153766. +
  153767. +
  153768. + }
  153769. + else
  153770. + {
  153771. + DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
  153772. + }
  153773. +exit:
  153774. +
  153775. + return ret;
  153776. +
  153777. +}
  153778. +
  153779. +static int rtw_p2p_set_persistent(struct net_device *dev,
  153780. + struct iw_request_info *info,
  153781. + union iwreq_data *wrqu, char *extra)
  153782. +{
  153783. +
  153784. + int ret = 0;
  153785. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153786. + struct iw_point *pdata = &wrqu->data;
  153787. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153788. + int jj,kk;
  153789. + u8 peerMACStr[ ETH_ALEN * 2 ] = { 0x00 };
  153790. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153791. + _list *plist, *phead;
  153792. + _queue *queue = &(pmlmepriv->scanned_queue);
  153793. + struct wlan_network *pnetwork = NULL;
  153794. + uint uintPeerChannel = 0;
  153795. + u8 attr_content[50] = { 0x00 }, _status = 0;
  153796. + u8 *p2pie;
  153797. + uint p2pielen = 0, attr_contentlen = 0;
  153798. + _irqL irqL;
  153799. + struct tx_invite_req_info* pinvite_req_info = &pwdinfo->invitereq_info;
  153800. +#ifdef CONFIG_CONCURRENT_MODE
  153801. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  153802. + struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
  153803. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  153804. +#endif // CONFIG_CONCURRENT_MODE
  153805. +
  153806. +#ifdef CONFIG_WFD
  153807. + struct wifi_display_info* pwfd_info = pwdinfo->wfd_info;
  153808. +#endif // CONFIG_WFD
  153809. +
  153810. + // Commented by Albert 20120328
  153811. + // The input data is 0 or 1
  153812. + // 0: disable persistent group functionality
  153813. + // 1: enable persistent group founctionality
  153814. +
  153815. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  153816. +
  153817. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  153818. + {
  153819. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  153820. + return ret;
  153821. + }
  153822. + else
  153823. + {
  153824. + if ( extra[ 0 ] == '0' ) // Disable the persistent group function.
  153825. + {
  153826. + pwdinfo->persistent_supported = _FALSE;
  153827. + }
  153828. + else if ( extra[ 0 ] == '1' ) // Enable the persistent group function.
  153829. + {
  153830. + pwdinfo->persistent_supported = _TRUE;
  153831. + }
  153832. + else
  153833. + {
  153834. + pwdinfo->persistent_supported = _FALSE;
  153835. + }
  153836. + }
  153837. + printk( "[%s] persistent_supported = %d\n", __FUNCTION__, pwdinfo->persistent_supported );
  153838. +
  153839. +exit:
  153840. +
  153841. + return ret;
  153842. +
  153843. +}
  153844. +
  153845. +static int hexstr2bin(const char *hex, u8 *buf, size_t len)
  153846. +{
  153847. + size_t i;
  153848. + int a;
  153849. + const char *ipos = hex;
  153850. + u8 *opos = buf;
  153851. +
  153852. + for (i = 0; i < len; i++) {
  153853. + a = hex2byte_i(ipos);
  153854. + if (a < 0)
  153855. + return -1;
  153856. + *opos++ = a;
  153857. + ipos += 2;
  153858. + }
  153859. + return 0;
  153860. +}
  153861. +
  153862. +static int uuid_str2bin(const char *str, u8 *bin)
  153863. +{
  153864. + const char *pos;
  153865. + u8 *opos;
  153866. +
  153867. + pos = str;
  153868. + opos = bin;
  153869. +
  153870. + if (hexstr2bin(pos, opos, 4))
  153871. + return -1;
  153872. + pos += 8;
  153873. + opos += 4;
  153874. +
  153875. + if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
  153876. + return -1;
  153877. + pos += 4;
  153878. + opos += 2;
  153879. +
  153880. + if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
  153881. + return -1;
  153882. + pos += 4;
  153883. + opos += 2;
  153884. +
  153885. + if (*pos++ != '-' || hexstr2bin(pos, opos, 2))
  153886. + return -1;
  153887. + pos += 4;
  153888. + opos += 2;
  153889. +
  153890. + if (*pos++ != '-' || hexstr2bin(pos, opos, 6))
  153891. + return -1;
  153892. +
  153893. + return 0;
  153894. +}
  153895. +
  153896. +static int rtw_p2p_set_wps_uuid(struct net_device *dev,
  153897. + struct iw_request_info *info,
  153898. + union iwreq_data *wrqu, char *extra)
  153899. +{
  153900. +
  153901. + int ret = 0;
  153902. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153903. + struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  153904. +
  153905. + DBG_871X("[%s] data = %s\n", __FUNCTION__, extra);
  153906. +
  153907. + if ((36 == strlen(extra)) && (uuid_str2bin(extra, pwdinfo->uuid) == 0))
  153908. + {
  153909. + pwdinfo->external_uuid = 1;
  153910. + } else {
  153911. + pwdinfo->external_uuid = 0;
  153912. + ret = -EINVAL;
  153913. + }
  153914. +
  153915. + return ret;
  153916. +
  153917. +}
  153918. +#ifdef CONFIG_WFD
  153919. +static int rtw_p2p_set_pc(struct net_device *dev,
  153920. + struct iw_request_info *info,
  153921. + union iwreq_data *wrqu, char *extra)
  153922. +{
  153923. +
  153924. + int ret = 0;
  153925. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  153926. + struct iw_point *pdata = &wrqu->data;
  153927. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  153928. + u8 peerMAC[ ETH_ALEN ] = { 0x00 };
  153929. + int jj,kk;
  153930. + u8 peerMACStr[ ETH_ALEN * 2 ] = { 0x00 };
  153931. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  153932. + _list *plist, *phead;
  153933. + _queue *queue = &(pmlmepriv->scanned_queue);
  153934. + struct wlan_network *pnetwork = NULL;
  153935. + u8 attr_content[50] = { 0x00 }, _status = 0;
  153936. + u8 *p2pie;
  153937. + uint p2pielen = 0, attr_contentlen = 0;
  153938. + _irqL irqL;
  153939. + uint uintPeerChannel = 0;
  153940. +#ifdef CONFIG_CONCURRENT_MODE
  153941. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  153942. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  153943. +#endif // CONFIG_CONCURRENT_MODE
  153944. + struct wifi_display_info* pwfd_info = pwdinfo->wfd_info;
  153945. +
  153946. + // Commented by Albert 20120512
  153947. + // 1. Input information is the MAC address which wants to know the Preferred Connection bit (PC bit)
  153948. + // Format: 00:E0:4C:00:00:05
  153949. +
  153950. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  153951. +
  153952. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  153953. + {
  153954. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  153955. + return ret;
  153956. + }
  153957. +
  153958. + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
  153959. + {
  153960. + peerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );
  153961. + }
  153962. +
  153963. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  153964. +
  153965. + phead = get_list_head(queue);
  153966. + plist = get_next(phead);
  153967. +
  153968. + while(1)
  153969. + {
  153970. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  153971. + break;
  153972. +
  153973. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  153974. +
  153975. + // Commented by Albert 2011/05/18
  153976. + // Match the device address located in the P2P IE
  153977. + // This is for the case that the P2P device address is not the same as the P2P interface address.
  153978. +
  153979. + if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) )
  153980. + {
  153981. + // The P2P Device ID attribute is included in the Beacon frame.
  153982. + // The P2P Device Info attribute is included in the probe response frame.
  153983. + printk( "[%s] Got P2P IE\n", __FUNCTION__ );
  153984. + if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )
  153985. + {
  153986. + // Handle the P2P Device ID attribute of Beacon first
  153987. + printk( "[%s] P2P_ATTR_DEVICE_ID \n", __FUNCTION__ );
  153988. + if ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )
  153989. + {
  153990. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  153991. + break;
  153992. + }
  153993. + }
  153994. + else if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )
  153995. + {
  153996. + // Handle the P2P Device Info attribute of probe response
  153997. + printk( "[%s] P2P_ATTR_DEVICE_INFO \n", __FUNCTION__ );
  153998. + if ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )
  153999. + {
  154000. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  154001. + break;
  154002. + }
  154003. + }
  154004. +
  154005. + }
  154006. +
  154007. + plist = get_next(plist);
  154008. +
  154009. + }
  154010. +
  154011. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  154012. + printk( "[%s] channel = %d\n", __FUNCTION__, uintPeerChannel );
  154013. +
  154014. + if ( uintPeerChannel )
  154015. + {
  154016. + u8 wfd_ie[ 128 ] = { 0x00 };
  154017. + uint wfd_ielen = 0;
  154018. +
  154019. + if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) )
  154020. + {
  154021. + u8 wfd_devinfo[ 6 ] = { 0x00 };
  154022. + uint wfd_devlen = 6;
  154023. +
  154024. + DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
  154025. + if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
  154026. + {
  154027. + u16 wfd_devinfo_field = 0;
  154028. +
  154029. + // Commented by Albert 20120319
  154030. + // The first two bytes are the WFD device information field of WFD device information subelement.
  154031. + // In big endian format.
  154032. + wfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);
  154033. + if ( wfd_devinfo_field & WFD_DEVINFO_PC_TDLS )
  154034. + {
  154035. + pwfd_info->wfd_pc = _TRUE;
  154036. + }
  154037. + else
  154038. + {
  154039. + pwfd_info->wfd_pc = _FALSE;
  154040. + }
  154041. + }
  154042. + }
  154043. + }
  154044. + else
  154045. + {
  154046. + DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
  154047. + }
  154048. +
  154049. +exit:
  154050. +
  154051. + return ret;
  154052. +
  154053. +}
  154054. +
  154055. +static int rtw_p2p_set_wfd_device_type(struct net_device *dev,
  154056. + struct iw_request_info *info,
  154057. + union iwreq_data *wrqu, char *extra)
  154058. +{
  154059. +
  154060. + int ret = 0;
  154061. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154062. + struct iw_point *pdata = &wrqu->data;
  154063. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  154064. + struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
  154065. +
  154066. + // Commented by Albert 20120328
  154067. + // The input data is 0 or 1
  154068. + // 0: specify to Miracast source device
  154069. + // 1 or others: specify to Miracast sink device (display device)
  154070. +
  154071. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  154072. +
  154073. + if ( extra[ 0 ] == '0' ) // Set to Miracast source device.
  154074. + {
  154075. + pwfd_info->wfd_device_type = WFD_DEVINFO_SOURCE;
  154076. + }
  154077. + else // Set to Miracast sink device.
  154078. + {
  154079. + pwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;
  154080. + }
  154081. +
  154082. +exit:
  154083. +
  154084. + return ret;
  154085. +
  154086. +}
  154087. +
  154088. +static int rtw_p2p_set_scan_result_type(struct net_device *dev,
  154089. + struct iw_request_info *info,
  154090. + union iwreq_data *wrqu, char *extra)
  154091. +{
  154092. +
  154093. + int ret = 0;
  154094. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154095. + struct iw_point *pdata = &wrqu->data;
  154096. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  154097. + struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
  154098. +
  154099. + // Commented by Albert 20120328
  154100. + // The input data is 0 , 1 , 2
  154101. + // 0: when the P2P is enabled, the scan result will return all the found P2P device.
  154102. + // 1: when the P2P is enabled, the scan result will return all the found P2P device and AP.
  154103. + // 2: when the P2P is enabled, the scan result will show up the found Miracast devices base on...
  154104. + // It will show up all the Miracast source device if this device is sink.
  154105. + // It will show up all the Miracast sink device if this device is source.
  154106. +
  154107. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  154108. +
  154109. + if ( extra[ 0 ] == '0' )
  154110. + {
  154111. + pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;
  154112. + }
  154113. + else if ( extra[ 0 ] == '1' )
  154114. + {
  154115. + pwfd_info->scan_result_type = SCAN_RESULT_ALL;
  154116. + }
  154117. + else if ( extra[ 0 ] == '2' )
  154118. + {
  154119. + pwfd_info->scan_result_type = SCAN_RESULT_WFD_TYPE;
  154120. + }
  154121. + else
  154122. + {
  154123. + pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;
  154124. + }
  154125. +
  154126. +exit:
  154127. +
  154128. + return ret;
  154129. +
  154130. +}
  154131. +
  154132. +static int rtw_p2p_set_wfd_enable(struct net_device *dev,
  154133. + struct iw_request_info *info,
  154134. + union iwreq_data *wrqu, char *extra)
  154135. +{
  154136. +// Commented by Kurt 20121206
  154137. +// This function is used to set wfd enabled
  154138. +
  154139. + int ret = 0;
  154140. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154141. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  154142. +
  154143. + if(*extra == '0' )
  154144. + pwdinfo->wfd_info->wfd_enable = _FALSE;
  154145. + else if(*extra == '1')
  154146. + pwdinfo->wfd_info->wfd_enable = _TRUE;
  154147. +
  154148. + DBG_871X( "[%s] wfd_enable = %d\n", __FUNCTION__, pwdinfo->wfd_info->wfd_enable );
  154149. +
  154150. + return ret;
  154151. +
  154152. +}
  154153. +
  154154. +static int rtw_p2p_set_driver_iface(struct net_device *dev,
  154155. + struct iw_request_info *info,
  154156. + union iwreq_data *wrqu, char *extra)
  154157. +{
  154158. +// Commented by Kurt 20121206
  154159. +// This function is used to set driver iface is WEXT or CFG80211
  154160. + int ret = 0;
  154161. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154162. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  154163. +
  154164. + if(*extra == '1' )
  154165. + {
  154166. + pwdinfo->driver_interface = DRIVER_WEXT;
  154167. + DBG_871X( "[%s] driver_interface = WEXT\n", __FUNCTION__);
  154168. + }
  154169. + else if(*extra == '2')
  154170. + {
  154171. + pwdinfo->driver_interface = DRIVER_CFG80211;
  154172. + DBG_871X( "[%s] driver_interface = CFG80211\n", __FUNCTION__);
  154173. + }
  154174. +
  154175. + return ret;
  154176. +
  154177. +}
  154178. +
  154179. +// To set the WFD session available to enable or disable
  154180. +static int rtw_p2p_set_sa(struct net_device *dev,
  154181. + struct iw_request_info *info,
  154182. + union iwreq_data *wrqu, char *extra)
  154183. +{
  154184. +
  154185. + int ret = 0;
  154186. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154187. + struct iw_point *pdata = &wrqu->data;
  154188. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  154189. + struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
  154190. +
  154191. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  154192. +
  154193. + if( 0 )
  154194. + {
  154195. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  154196. + return ret;
  154197. + }
  154198. + else
  154199. + {
  154200. + if ( extra[ 0 ] == '0' ) // Disable the session available.
  154201. + {
  154202. + pwdinfo->session_available = _FALSE;
  154203. + }
  154204. + else if ( extra[ 0 ] == '1' ) // Enable the session available.
  154205. + {
  154206. + pwdinfo->session_available = _TRUE;
  154207. + }
  154208. + else
  154209. + {
  154210. + pwdinfo->session_available = _FALSE;
  154211. + }
  154212. + }
  154213. + printk( "[%s] session available = %d\n", __FUNCTION__, pwdinfo->session_available );
  154214. +
  154215. +exit:
  154216. +
  154217. + return ret;
  154218. +
  154219. +}
  154220. +#endif //CONFIG_WFD
  154221. +
  154222. +static int rtw_p2p_prov_disc(struct net_device *dev,
  154223. + struct iw_request_info *info,
  154224. + union iwreq_data *wrqu, char *extra)
  154225. +{
  154226. + int ret = 0;
  154227. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154228. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  154229. + u8 peerMAC[ ETH_ALEN ] = { 0x00 };
  154230. + int jj,kk;
  154231. + u8 peerMACStr[ ETH_ALEN * 2 ] = { 0x00 };
  154232. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  154233. + _list *plist, *phead;
  154234. + _queue *queue = &(pmlmepriv->scanned_queue);
  154235. + struct wlan_network *pnetwork = NULL;
  154236. + uint uintPeerChannel = 0;
  154237. + u8 attr_content[100] = { 0x00 }, _status = 0;
  154238. + u8 *p2pie;
  154239. + uint p2pielen = 0, attr_contentlen = 0;
  154240. + _irqL irqL;
  154241. + u8 ie_offset;
  154242. +#ifdef CONFIG_CONCURRENT_MODE
  154243. + _adapter *pbuddy_adapter = padapter->pbuddy_adapter;
  154244. + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
  154245. +#endif // CONFIG_CONCURRENT_MODE
  154246. +
  154247. +#ifdef CONFIG_WFD
  154248. + struct wifi_display_info* pwfd_info = pwdinfo->wfd_info;
  154249. +#endif // CONFIG_WFD
  154250. +
  154251. + // Commented by Albert 20110301
  154252. + // The input data contains two informations.
  154253. + // 1. First information is the MAC address which wants to issue the provisioning discovery request frame.
  154254. + // 2. Second information is the WPS configuration method which wants to discovery
  154255. + // Format: 00:E0:4C:00:00:05_display
  154256. + // Format: 00:E0:4C:00:00:05_keypad
  154257. + // Format: 00:E0:4C:00:00:05_pbc
  154258. + // Format: 00:E0:4C:00:00:05_label
  154259. +
  154260. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  154261. +
  154262. + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  154263. + {
  154264. + DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
  154265. + return ret;
  154266. + }
  154267. + else
  154268. + {
  154269. +#ifdef CONFIG_INTEL_WIDI
  154270. + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE){
  154271. + DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
  154272. + return ret;
  154273. + }
  154274. +#endif //CONFIG_INTEL_WIDI
  154275. +
  154276. + // Reset the content of struct tx_provdisc_req_info excluded the wps_config_method_request.
  154277. + _rtw_memset( pwdinfo->tx_prov_disc_info.peerDevAddr, 0x00, ETH_ALEN );
  154278. + _rtw_memset( pwdinfo->tx_prov_disc_info.peerIFAddr, 0x00, ETH_ALEN );
  154279. + _rtw_memset( &pwdinfo->tx_prov_disc_info.ssid, 0x00, sizeof( NDIS_802_11_SSID ) );
  154280. + pwdinfo->tx_prov_disc_info.peer_channel_num[ 0 ] = 0;
  154281. + pwdinfo->tx_prov_disc_info.peer_channel_num[ 1 ] = 0;
  154282. + pwdinfo->tx_prov_disc_info.benable = _FALSE;
  154283. + }
  154284. +
  154285. + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
  154286. + {
  154287. + peerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );
  154288. + }
  154289. +
  154290. + if ( _rtw_memcmp( &extra[ 18 ], "display", 7 ) )
  154291. + {
  154292. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA;
  154293. + }
  154294. + else if ( _rtw_memcmp( &extra[ 18 ], "keypad", 7 ) )
  154295. + {
  154296. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD;
  154297. + }
  154298. + else if ( _rtw_memcmp( &extra[ 18 ], "pbc", 3 ) )
  154299. + {
  154300. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;
  154301. + }
  154302. + else if ( _rtw_memcmp( &extra[ 18 ], "label", 5 ) )
  154303. + {
  154304. + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL;
  154305. + }
  154306. + else
  154307. + {
  154308. + DBG_871X( "[%s] Unknown WPS config methodn", __FUNCTION__ );
  154309. + return( ret );
  154310. + }
  154311. +
  154312. +
  154313. + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  154314. +
  154315. + phead = get_list_head(queue);
  154316. + plist = get_next(phead);
  154317. +
  154318. + while(1)
  154319. + {
  154320. + if (rtw_end_of_queue_search(phead,plist)== _TRUE)
  154321. + break;
  154322. +
  154323. + if( uintPeerChannel != 0 )
  154324. + break;
  154325. +
  154326. + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  154327. +
  154328. + // Commented by Albert 2011/05/18
  154329. + // Match the device address located in the P2P IE
  154330. + // This is for the case that the P2P device address is not the same as the P2P interface address.
  154331. +
  154332. + if (pnetwork->network.Reserved[0] == 2) { // Probe Request
  154333. + ie_offset = 0;
  154334. + } else { // Beacon or Probe Respones
  154335. + ie_offset = 12;
  154336. + }
  154337. + if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset, NULL, &p2pielen)) )
  154338. + {
  154339. + while ( p2pie )
  154340. + {
  154341. + // The P2P Device ID attribute is included in the Beacon frame.
  154342. + // The P2P Device Info attribute is included in the probe response frame.
  154343. +
  154344. + if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )
  154345. + {
  154346. + // Handle the P2P Device ID attribute of Beacon first
  154347. + if ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )
  154348. + {
  154349. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  154350. + break;
  154351. + }
  154352. + }
  154353. + else if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )
  154354. + {
  154355. + // Handle the P2P Device Info attribute of probe response
  154356. + if ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )
  154357. + {
  154358. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  154359. + break;
  154360. + }
  154361. + }
  154362. +
  154363. + //Get the next P2P IE
  154364. + p2pie = rtw_get_p2p_ie(p2pie+p2pielen, pnetwork->network.IELength - ie_offset -(p2pie -&pnetwork->network.IEs[ie_offset] + p2pielen), NULL, &p2pielen);
  154365. + }
  154366. + }
  154367. +
  154368. +#ifdef CONFIG_INTEL_WIDI
  154369. + // Some Intel WiDi source may not provide P2P IE,
  154370. + // so we could only compare mac addr by 802.11 Source Address
  154371. + if( pmlmepriv->widi_state == INTEL_WIDI_STATE_WFD_CONNECTION
  154372. + && uintPeerChannel == 0 )
  154373. + {
  154374. + if ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) )
  154375. + {
  154376. + uintPeerChannel = pnetwork->network.Configuration.DSConfig;
  154377. + break;
  154378. + }
  154379. + }
  154380. +#endif //CONFIG_INTEL_WIDI
  154381. +
  154382. + plist = get_next(plist);
  154383. +
  154384. + }
  154385. +
  154386. + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  154387. +
  154388. + if ( uintPeerChannel )
  154389. + {
  154390. +#ifdef CONFIG_WFD
  154391. + {
  154392. + u8 wfd_ie[ 128 ] = { 0x00 };
  154393. + uint wfd_ielen = 0;
  154394. +
  154395. + if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) )
  154396. + {
  154397. + u8 wfd_devinfo[ 6 ] = { 0x00 };
  154398. + uint wfd_devlen = 6;
  154399. +
  154400. + DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
  154401. + if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
  154402. + {
  154403. + u16 wfd_devinfo_field = 0;
  154404. +
  154405. + // Commented by Albert 20120319
  154406. + // The first two bytes are the WFD device information field of WFD device information subelement.
  154407. + // In big endian format.
  154408. + wfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);
  154409. + if ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL )
  154410. + {
  154411. + pwfd_info->peer_session_avail = _TRUE;
  154412. + }
  154413. + else
  154414. + {
  154415. + pwfd_info->peer_session_avail = _FALSE;
  154416. + }
  154417. + }
  154418. + }
  154419. +
  154420. + if ( _FALSE == pwfd_info->peer_session_avail )
  154421. + {
  154422. + DBG_871X( "[%s] WFD Session not avaiable!\n", __FUNCTION__ );
  154423. + goto exit;
  154424. + }
  154425. + }
  154426. +#endif // CONFIG_WFD
  154427. +
  154428. + DBG_871X( "[%s] peer channel: %d!\n", __FUNCTION__, uintPeerChannel );
  154429. +#ifdef CONFIG_CONCURRENT_MODE
  154430. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  154431. + {
  154432. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );
  154433. + }
  154434. +#endif // CONFIG_CONCURRENT_MODE
  154435. + _rtw_memcpy( pwdinfo->tx_prov_disc_info.peerIFAddr, pnetwork->network.MacAddress, ETH_ALEN );
  154436. + _rtw_memcpy( pwdinfo->tx_prov_disc_info.peerDevAddr, peerMAC, ETH_ALEN );
  154437. + pwdinfo->tx_prov_disc_info.peer_channel_num[0] = ( u16 ) uintPeerChannel;
  154438. + pwdinfo->tx_prov_disc_info.benable = _TRUE;
  154439. + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
  154440. + rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ);
  154441. +
  154442. + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))
  154443. + {
  154444. + _rtw_memcpy( &pwdinfo->tx_prov_disc_info.ssid, &pnetwork->network.Ssid, sizeof( NDIS_802_11_SSID ) );
  154445. + }
  154446. + else if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
  154447. + {
  154448. + _rtw_memcpy( pwdinfo->tx_prov_disc_info.ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN );
  154449. + pwdinfo->tx_prov_disc_info.ssid.SsidLength= P2P_WILDCARD_SSID_LEN;
  154450. + }
  154451. +
  154452. +#ifdef CONFIG_CONCURRENT_MODE
  154453. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  154454. + {
  154455. + // Have to enter the power saving with the AP
  154456. + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
  154457. +
  154458. + issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);
  154459. + }
  154460. + else
  154461. + {
  154462. + set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  154463. + }
  154464. +#else
  154465. + set_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
  154466. +#endif
  154467. +
  154468. + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );
  154469. +
  154470. +#ifdef CONFIG_CONCURRENT_MODE
  154471. + if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
  154472. + {
  154473. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_PROVISION_TIMEOUT );
  154474. + }
  154475. + else
  154476. + {
  154477. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
  154478. + }
  154479. +#else
  154480. + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
  154481. +#endif // CONFIG_CONCURRENT_MODE
  154482. +
  154483. +
  154484. + }
  154485. + else
  154486. + {
  154487. + DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
  154488. +#ifdef CONFIG_INTEL_WIDI
  154489. + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
  154490. + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
  154491. + rtw_free_network_queue(padapter, _TRUE);
  154492. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  154493. + rtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);
  154494. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  154495. +#endif //CONFIG_INTEL_WIDI
  154496. + }
  154497. +exit:
  154498. +
  154499. + return ret;
  154500. +
  154501. +}
  154502. +
  154503. +// Added by Albert 20110328
  154504. +// This function is used to inform the driver the user had specified the pin code value or pbc
  154505. +// to application.
  154506. +
  154507. +static int rtw_p2p_got_wpsinfo(struct net_device *dev,
  154508. + struct iw_request_info *info,
  154509. + union iwreq_data *wrqu, char *extra)
  154510. +{
  154511. +
  154512. + int ret = 0;
  154513. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154514. + struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
  154515. +
  154516. +
  154517. + DBG_871X( "[%s] data = %s\n", __FUNCTION__, extra );
  154518. + // Added by Albert 20110328
  154519. + // if the input data is P2P_NO_WPSINFO -> reset the wpsinfo
  154520. + // if the input data is P2P_GOT_WPSINFO_PEER_DISPLAY_PIN -> the utility just input the PIN code got from the peer P2P device.
  154521. + // if the input data is P2P_GOT_WPSINFO_SELF_DISPLAY_PIN -> the utility just got the PIN code from itself.
  154522. + // if the input data is P2P_GOT_WPSINFO_PBC -> the utility just determine to use the PBC
  154523. +
  154524. + if ( *extra == '0' )
  154525. + {
  154526. + pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;
  154527. + }
  154528. + else if ( *extra == '1' )
  154529. + {
  154530. + pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PEER_DISPLAY_PIN;
  154531. + }
  154532. + else if ( *extra == '2' )
  154533. + {
  154534. + pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_SELF_DISPLAY_PIN;
  154535. + }
  154536. + else if ( *extra == '3' )
  154537. + {
  154538. + pwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PBC;
  154539. + }
  154540. + else
  154541. + {
  154542. + pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;
  154543. + }
  154544. +
  154545. + return ret;
  154546. +
  154547. +}
  154548. +
  154549. +#endif //CONFIG_P2P
  154550. +
  154551. +static int rtw_p2p_set(struct net_device *dev,
  154552. + struct iw_request_info *info,
  154553. + union iwreq_data *wrqu, char *extra)
  154554. +{
  154555. +
  154556. + int ret = 0;
  154557. +#ifdef CONFIG_P2P
  154558. +
  154559. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154560. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  154561. + struct iw_point *pdata = &wrqu->data;
  154562. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  154563. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  154564. +
  154565. + DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra );
  154566. +
  154567. + if ( _rtw_memcmp( extra, "enable=", 7 ) )
  154568. + {
  154569. + rtw_wext_p2p_enable( dev, info, wrqu, &extra[7] );
  154570. + }
  154571. + else if ( _rtw_memcmp( extra, "setDN=", 6 ) )
  154572. + {
  154573. + wrqu->data.length -= 6;
  154574. + rtw_p2p_setDN( dev, info, wrqu, &extra[6] );
  154575. + }
  154576. + else if ( _rtw_memcmp( extra, "profilefound=", 13 ) )
  154577. + {
  154578. + wrqu->data.length -= 13;
  154579. + rtw_p2p_profilefound( dev, info, wrqu, &extra[13] );
  154580. + }
  154581. + else if ( _rtw_memcmp( extra, "prov_disc=", 10 ) )
  154582. + {
  154583. + wrqu->data.length -= 10;
  154584. + rtw_p2p_prov_disc( dev, info, wrqu, &extra[10] );
  154585. + }
  154586. + else if ( _rtw_memcmp( extra, "nego=", 5 ) )
  154587. + {
  154588. + wrqu->data.length -= 5;
  154589. + rtw_p2p_connect( dev, info, wrqu, &extra[5] );
  154590. + }
  154591. + else if ( _rtw_memcmp( extra, "intent=", 7 ) )
  154592. + {
  154593. + // Commented by Albert 2011/03/23
  154594. + // The wrqu->data.length will include the null character
  154595. + // So, we will decrease 7 + 1
  154596. + wrqu->data.length -= 8;
  154597. + rtw_p2p_set_intent( dev, info, wrqu, &extra[7] );
  154598. + }
  154599. + else if ( _rtw_memcmp( extra, "ssid=", 5 ) )
  154600. + {
  154601. + wrqu->data.length -= 5;
  154602. + rtw_p2p_set_go_nego_ssid( dev, info, wrqu, &extra[5] );
  154603. + }
  154604. + else if ( _rtw_memcmp( extra, "got_wpsinfo=", 12 ) )
  154605. + {
  154606. + wrqu->data.length -= 12;
  154607. + rtw_p2p_got_wpsinfo( dev, info, wrqu, &extra[12] );
  154608. + }
  154609. + else if ( _rtw_memcmp( extra, "listen_ch=", 10 ) )
  154610. + {
  154611. + // Commented by Albert 2011/05/24
  154612. + // The wrqu->data.length will include the null character
  154613. + // So, we will decrease (10 + 1)
  154614. + wrqu->data.length -= 11;
  154615. + rtw_p2p_set_listen_ch( dev, info, wrqu, &extra[10] );
  154616. + }
  154617. + else if ( _rtw_memcmp( extra, "op_ch=", 6 ) )
  154618. + {
  154619. + // Commented by Albert 2011/05/24
  154620. + // The wrqu->data.length will include the null character
  154621. + // So, we will decrease (6 + 1)
  154622. + wrqu->data.length -= 7;
  154623. + rtw_p2p_set_op_ch( dev, info, wrqu, &extra[6] );
  154624. + }
  154625. + else if ( _rtw_memcmp( extra, "invite=", 7 ) )
  154626. + {
  154627. + wrqu->data.length -= 8;
  154628. + rtw_p2p_invite_req( dev, info, wrqu, &extra[7] );
  154629. + }
  154630. + else if ( _rtw_memcmp( extra, "persistent=", 11 ) )
  154631. + {
  154632. + wrqu->data.length -= 11;
  154633. + rtw_p2p_set_persistent( dev, info, wrqu, &extra[11] );
  154634. + }
  154635. + else if ( _rtw_memcmp ( extra, "uuid=", 5) )
  154636. + {
  154637. + wrqu->data.length -= 5;
  154638. + ret = rtw_p2p_set_wps_uuid( dev, info, wrqu, &extra[5] );
  154639. + }
  154640. +#ifdef CONFIG_WFD
  154641. + else if ( _rtw_memcmp( extra, "sa=", 3 ) )
  154642. + {
  154643. + // sa: WFD Session Available information
  154644. + wrqu->data.length -= 3;
  154645. + rtw_p2p_set_sa( dev, info, wrqu, &extra[3] );
  154646. + }
  154647. + else if ( _rtw_memcmp( extra, "pc=", 3 ) )
  154648. + {
  154649. + // pc: WFD Preferred Connection
  154650. + wrqu->data.length -= 3;
  154651. + rtw_p2p_set_pc( dev, info, wrqu, &extra[3] );
  154652. + }
  154653. + else if ( _rtw_memcmp( extra, "wfd_type=", 9 ) )
  154654. + {
  154655. + // Specify this device is Mircast source or sink
  154656. + wrqu->data.length -= 9;
  154657. + rtw_p2p_set_wfd_device_type( dev, info, wrqu, &extra[9] );
  154658. + }
  154659. + else if ( _rtw_memcmp( extra, "scan_type=", 10 ) )
  154660. + {
  154661. + wrqu->data.length -= 10;
  154662. + rtw_p2p_set_scan_result_type( dev, info, wrqu, &extra[10] );
  154663. + }
  154664. + else if ( _rtw_memcmp( extra, "wfd_enable=", 11 ) )
  154665. + {
  154666. + wrqu->data.length -= 11;
  154667. + rtw_p2p_set_wfd_enable( dev, info, wrqu, &extra[11] );
  154668. + }
  154669. + else if ( _rtw_memcmp( extra, "driver_iface=", 13 ) )
  154670. + {
  154671. + wrqu->data.length -= 13;
  154672. + rtw_p2p_set_driver_iface( dev, info, wrqu, &extra[13] );
  154673. + }
  154674. +#endif //CONFIG_WFD
  154675. +#endif //CONFIG_P2P
  154676. +
  154677. + return ret;
  154678. +
  154679. +}
  154680. +
  154681. +static int rtw_p2p_get(struct net_device *dev,
  154682. + struct iw_request_info *info,
  154683. + union iwreq_data *wrqu, char *extra)
  154684. +{
  154685. +
  154686. + int ret = 0;
  154687. +
  154688. +#ifdef CONFIG_P2P
  154689. +
  154690. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  154691. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  154692. + struct iw_point *pdata = &wrqu->data;
  154693. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  154694. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  154695. +
  154696. + if ( padapter->bShowGetP2PState )
  154697. + {
  154698. + DBG_871X( "[%s] extra = %s\n", __FUNCTION__, (char*) wrqu->data.pointer );
  154699. + }
  154700. +
  154701. + if ( _rtw_memcmp( wrqu->data.pointer, "status", 6 ) )
  154702. + {
  154703. + rtw_p2p_get_status( dev, info, wrqu, extra );
  154704. + }
  154705. + else if ( _rtw_memcmp( wrqu->data.pointer, "role", 4 ) )
  154706. + {
  154707. + rtw_p2p_get_role( dev, info, wrqu, extra);
  154708. + }
  154709. + else if ( _rtw_memcmp( wrqu->data.pointer, "peer_ifa", 8 ) )
  154710. + {
  154711. + rtw_p2p_get_peer_ifaddr( dev, info, wrqu, extra);
  154712. + }
  154713. + else if ( _rtw_memcmp( wrqu->data.pointer, "req_cm", 6 ) )
  154714. + {
  154715. + rtw_p2p_get_req_cm( dev, info, wrqu, extra);
  154716. + }
  154717. + else if ( _rtw_memcmp( wrqu->data.pointer, "peer_deva", 9 ) )
  154718. + {
  154719. + // Get the P2P device address when receiving the provision discovery request frame.
  154720. + rtw_p2p_get_peer_devaddr( dev, info, wrqu, extra);
  154721. + }
  154722. + else if ( _rtw_memcmp( wrqu->data.pointer, "group_id", 8 ) )
  154723. + {
  154724. + rtw_p2p_get_groupid( dev, info, wrqu, extra);
  154725. + }
  154726. + else if ( _rtw_memcmp( wrqu->data.pointer, "inv_peer_deva", 13 ) )
  154727. + {
  154728. + // Get the P2P device address when receiving the P2P Invitation request frame.
  154729. + rtw_p2p_get_peer_devaddr_by_invitation( dev, info, wrqu, extra);
  154730. + }
  154731. + else if ( _rtw_memcmp( wrqu->data.pointer, "op_ch", 5 ) )
  154732. + {
  154733. + rtw_p2p_get_op_ch( dev, info, wrqu, extra);
  154734. + }
  154735. +#ifdef CONFIG_WFD
  154736. + else if ( _rtw_memcmp( wrqu->data.pointer, "peer_port", 9 ) )
  154737. + {
  154738. + rtw_p2p_get_peer_wfd_port( dev, info, wrqu, extra );
  154739. + }
  154740. + else if ( _rtw_memcmp( wrqu->data.pointer, "wfd_sa", 6 ) )
  154741. + {
  154742. + rtw_p2p_get_peer_wfd_session_available( dev, info, wrqu, extra );
  154743. + }
  154744. + else if ( _rtw_memcmp( wrqu->data.pointer, "wfd_pc", 6 ) )
  154745. + {
  154746. + rtw_p2p_get_peer_wfd_preferred_connection( dev, info, wrqu, extra );
  154747. + }
  154748. +#endif // CONFIG_WFD
  154749. +
  154750. +#endif //CONFIG_P2P
  154751. +
  154752. + return ret;
  154753. +
  154754. +}
  154755. +
  154756. +static int rtw_p2p_get2(struct net_device *dev,
  154757. + struct iw_request_info *info,
  154758. + union iwreq_data *wrqu, char *extra)
  154759. +{
  154760. +
  154761. + int ret = 0;
  154762. +
  154763. +#ifdef CONFIG_P2P
  154764. +
  154765. + int length = wrqu->data.length;
  154766. + char *buffer = (u8 *)rtw_malloc(length);
  154767. +
  154768. + if (buffer == NULL)
  154769. + {
  154770. + ret = -ENOMEM;
  154771. + goto bad;
  154772. + }
  154773. +
  154774. + if (copy_from_user(buffer, wrqu->data.pointer, wrqu->data.length))
  154775. + {
  154776. + ret - EFAULT;
  154777. + goto bad;
  154778. + }
  154779. +
  154780. + DBG_871X("[%s] buffer = %s\n", __FUNCTION__, buffer);
  154781. +
  154782. + if (_rtw_memcmp(buffer, "wpsCM=", 6))
  154783. + {
  154784. + ret = rtw_p2p_get_wps_configmethod(dev, info, wrqu, extra, &buffer[6]);
  154785. + } else if (_rtw_memcmp(buffer, "devN=", 5))
  154786. + {
  154787. + ret = rtw_p2p_get_device_name(dev, info, wrqu, extra, &buffer[5]);
  154788. + } else if (_rtw_memcmp(buffer, "dev_type=", 9))
  154789. + {
  154790. + ret = rtw_p2p_get_device_type(dev, info, wrqu, extra, &buffer[9]);
  154791. + } else if (_rtw_memcmp(buffer, "go_devadd=", 10))
  154792. + {
  154793. + ret = rtw_p2p_get_go_device_address(dev, info, wrqu, extra, &buffer[10]);
  154794. + } else if (_rtw_memcmp(buffer, "InvProc=", 8))
  154795. + {
  154796. + ret = rtw_p2p_get_invitation_procedure(dev, info, wrqu, extra, &buffer[8]);
  154797. + } else
  154798. + {
  154799. + snprintf(extra, sizeof("Command not found."), "Command not found.");
  154800. + wrqu->data.length = strlen(extra);
  154801. + }
  154802. +
  154803. +bad:
  154804. + if (buffer)
  154805. + {
  154806. + rtw_mfree(buffer, length);
  154807. + }
  154808. +
  154809. +#endif //CONFIG_P2P
  154810. +
  154811. + return ret;
  154812. +
  154813. +}
  154814. +
  154815. +extern int rtw_change_ifname(_adapter *padapter, const char *ifname);
  154816. +static int rtw_rereg_nd_name(struct net_device *dev,
  154817. + struct iw_request_info *info,
  154818. + union iwreq_data *wrqu, char *extra)
  154819. +{
  154820. + int ret = 0;
  154821. + _adapter *padapter = rtw_netdev_priv(dev);
  154822. + struct rereg_nd_name_data *rereg_priv = &padapter->rereg_nd_name_priv;
  154823. + char new_ifname[IFNAMSIZ];
  154824. +
  154825. + if(rereg_priv->old_ifname[0] == 0) {
  154826. + char *reg_ifname;
  154827. +#ifdef CONFIG_CONCURRENT_MODE
  154828. + if (padapter->isprimary)
  154829. + reg_ifname = padapter->registrypriv.ifname;
  154830. + else
  154831. +#endif
  154832. + reg_ifname = padapter->registrypriv.if2name;
  154833. +
  154834. + strncpy(rereg_priv->old_ifname, reg_ifname, IFNAMSIZ);
  154835. + rereg_priv->old_ifname[IFNAMSIZ-1] = 0;
  154836. + }
  154837. +
  154838. + //DBG_871X("%s wrqu->data.length:%d\n", __FUNCTION__, wrqu->data.length);
  154839. + if(wrqu->data.length > IFNAMSIZ)
  154840. + return -EFAULT;
  154841. +
  154842. + if ( copy_from_user(new_ifname, wrqu->data.pointer, IFNAMSIZ) ) {
  154843. + return -EFAULT;
  154844. + }
  154845. +
  154846. + if( 0 == strcmp(rereg_priv->old_ifname, new_ifname) ) {
  154847. + return ret;
  154848. + }
  154849. +
  154850. + DBG_871X("%s new_ifname:%s\n", __FUNCTION__, new_ifname);
  154851. + if( 0 != (ret = rtw_change_ifname(padapter, new_ifname)) ) {
  154852. + goto exit;
  154853. + }
  154854. +
  154855. + if(_rtw_memcmp(rereg_priv->old_ifname, "disable%d", 9) == _TRUE) {
  154856. + padapter->ledpriv.bRegUseLed= rereg_priv->old_bRegUseLed;
  154857. + rtw_hal_sw_led_init(padapter);
  154858. + rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode);
  154859. + }
  154860. +
  154861. + strncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ);
  154862. + rereg_priv->old_ifname[IFNAMSIZ-1] = 0;
  154863. +
  154864. + if(_rtw_memcmp(new_ifname, "disable%d", 9) == _TRUE) {
  154865. +
  154866. + DBG_871X("%s disable\n", __FUNCTION__);
  154867. + // free network queue for Android's timming issue
  154868. + rtw_free_network_queue(padapter, _TRUE);
  154869. +
  154870. + // close led
  154871. + rtw_led_control(padapter, LED_CTL_POWER_OFF);
  154872. + rereg_priv->old_bRegUseLed = padapter->ledpriv.bRegUseLed;
  154873. + padapter->ledpriv.bRegUseLed= _FALSE;
  154874. + rtw_hal_sw_led_deinit(padapter);
  154875. +
  154876. + // the interface is being "disabled", we can do deeper IPS
  154877. + rereg_priv->old_ips_mode = rtw_get_ips_mode_req(&padapter->pwrctrlpriv);
  154878. + rtw_ips_mode_req(&padapter->pwrctrlpriv, IPS_NORMAL);
  154879. + }
  154880. +exit:
  154881. + return ret;
  154882. +
  154883. +}
  154884. +
  154885. +#if 0
  154886. +void mac_reg_dump(_adapter *padapter)
  154887. +{
  154888. + int i,j=1;
  154889. + DBG_871X("\n======= MAC REG =======\n");
  154890. + for(i=0x0;i<0x300;i+=4)
  154891. + {
  154892. + if(j%4==1) DBG_871X("0x%02x",i);
  154893. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154894. + if((j++)%4 == 0) DBG_871X("\n");
  154895. + }
  154896. + for(i=0x400;i<0x800;i+=4)
  154897. + {
  154898. + if(j%4==1) DBG_871X("0x%02x",i);
  154899. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154900. + if((j++)%4 == 0) DBG_871X("\n");
  154901. + }
  154902. +}
  154903. +void bb_reg_dump(_adapter *padapter)
  154904. +{
  154905. + int i,j=1;
  154906. + DBG_871X("\n======= BB REG =======\n");
  154907. + for(i=0x800;i<0x1000;i+=4)
  154908. + {
  154909. + if(j%4==1) DBG_871X("0x%02x",i);
  154910. +
  154911. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154912. + if((j++)%4 == 0) DBG_871X("\n");
  154913. + }
  154914. +}
  154915. +void rf_reg_dump(_adapter *padapter)
  154916. +{
  154917. + int i,j=1,path;
  154918. + u32 value;
  154919. + DBG_871X("\n======= RF REG =======\n");
  154920. + for(path=0;path<2;path++)
  154921. + {
  154922. + DBG_871X("\nRF_Path(%x)\n",path);
  154923. + for(i=0;i<0x100;i++)
  154924. + {
  154925. + value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  154926. + if(j%4==1) DBG_871X("0x%02x ",i);
  154927. + DBG_871X(" 0x%08x ",value);
  154928. + if((j++)%4==0) DBG_871X("\n");
  154929. + }
  154930. + }
  154931. +}
  154932. +
  154933. +#endif
  154934. +
  154935. +void mac_reg_dump(_adapter *padapter)
  154936. +{
  154937. + int i,j=1;
  154938. + DBG_871X("\n======= MAC REG =======\n");
  154939. + for(i=0x0;i<0x300;i+=4)
  154940. + {
  154941. + if(j%4==1) DBG_871X("0x%02x",i);
  154942. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154943. + if((j++)%4 == 0) DBG_871X("\n");
  154944. + }
  154945. + for(i=0x400;i<0x800;i+=4)
  154946. + {
  154947. + if(j%4==1) DBG_871X("0x%02x",i);
  154948. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154949. + if((j++)%4 == 0) DBG_871X("\n");
  154950. + }
  154951. +}
  154952. +void bb_reg_dump(_adapter *padapter)
  154953. +{
  154954. + int i,j=1;
  154955. + DBG_871X("\n======= BB REG =======\n");
  154956. + for(i=0x800;i<0x1000;i+=4)
  154957. + {
  154958. + if(j%4==1) DBG_871X("0x%02x",i);
  154959. +
  154960. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  154961. + if((j++)%4 == 0) DBG_871X("\n");
  154962. + }
  154963. +}
  154964. +void rf_reg_dump(_adapter *padapter)
  154965. +{
  154966. + int i,j=1,path;
  154967. + u32 value;
  154968. + u8 rf_type,path_nums = 0;
  154969. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  154970. +
  154971. + DBG_871X("\n======= RF REG =======\n");
  154972. + if((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type ))
  154973. + path_nums = 1;
  154974. + else
  154975. + path_nums = 2;
  154976. +
  154977. + for(path=0;path<path_nums;path++)
  154978. + {
  154979. + DBG_871X("\nRF_Path(%x)\n",path);
  154980. + for(i=0;i<0x100;i++)
  154981. + {
  154982. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  154983. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  154984. + if(j%4==1) DBG_871X("0x%02x ",i);
  154985. + DBG_871X(" 0x%08x ",value);
  154986. + if((j++)%4==0) DBG_871X("\n");
  154987. + }
  154988. + }
  154989. +}
  154990. +
  154991. +#ifdef CONFIG_IOL
  154992. +#include <rtw_iol.h>
  154993. +#endif
  154994. +#ifdef DBG_CONFIG_ERROR_DETECT
  154995. +#include <rtw_sreset.h>
  154996. +#endif
  154997. +static int rtw_dbg_port(struct net_device *dev,
  154998. + struct iw_request_info *info,
  154999. + union iwreq_data *wrqu, char *extra)
  155000. +{
  155001. + _irqL irqL;
  155002. + int ret = 0;
  155003. + u8 major_cmd, minor_cmd;
  155004. + u16 arg;
  155005. + u32 extra_arg, *pdata, val32;
  155006. + struct sta_info *psta;
  155007. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  155008. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  155009. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  155010. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  155011. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  155012. + struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  155013. + struct sta_priv *pstapriv = &padapter->stapriv;
  155014. +
  155015. +
  155016. + pdata = (u32*)&wrqu->data;
  155017. +
  155018. + val32 = *pdata;
  155019. + arg = (u16)(val32&0x0000ffff);
  155020. + major_cmd = (u8)(val32>>24);
  155021. + minor_cmd = (u8)((val32>>16)&0x00ff);
  155022. +
  155023. + extra_arg = *(pdata+1);
  155024. +
  155025. + switch(major_cmd)
  155026. + {
  155027. + case 0x70://read_reg
  155028. + switch(minor_cmd)
  155029. + {
  155030. + case 1:
  155031. + DBG_871X("rtw_read8(0x%x)=0x%02x\n", arg, rtw_read8(padapter, arg));
  155032. + break;
  155033. + case 2:
  155034. + DBG_871X("rtw_read16(0x%x)=0x%04x\n", arg, rtw_read16(padapter, arg));
  155035. + break;
  155036. + case 4:
  155037. + DBG_871X("rtw_read32(0x%x)=0x%08x\n", arg, rtw_read32(padapter, arg));
  155038. + break;
  155039. + }
  155040. + break;
  155041. + case 0x71://write_reg
  155042. + switch(minor_cmd)
  155043. + {
  155044. + case 1:
  155045. + rtw_write8(padapter, arg, extra_arg);
  155046. + DBG_871X("rtw_write8(0x%x)=0x%02x\n", arg, rtw_read8(padapter, arg));
  155047. + break;
  155048. + case 2:
  155049. + rtw_write16(padapter, arg, extra_arg);
  155050. + DBG_871X("rtw_write16(0x%x)=0x%04x\n", arg, rtw_read16(padapter, arg));
  155051. + break;
  155052. + case 4:
  155053. + rtw_write32(padapter, arg, extra_arg);
  155054. + DBG_871X("rtw_write32(0x%x)=0x%08x\n", arg, rtw_read32(padapter, arg));
  155055. + break;
  155056. + }
  155057. + break;
  155058. + case 0x72://read_bb
  155059. + DBG_871X("read_bbreg(0x%x)=0x%x\n", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff));
  155060. + break;
  155061. + case 0x73://write_bb
  155062. + rtw_hal_write_bbreg(padapter, arg, 0xffffffff, extra_arg);
  155063. + DBG_871X("write_bbreg(0x%x)=0x%x\n", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff));
  155064. + break;
  155065. + case 0x74://read_rf
  155066. + DBG_871X("read RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\n",minor_cmd,arg,rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff));
  155067. + break;
  155068. + case 0x75://write_rf
  155069. + rtw_hal_write_rfreg(padapter, minor_cmd, arg, 0xffffffff, extra_arg);
  155070. + DBG_871X("write RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\n",minor_cmd,arg, rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff));
  155071. + break;
  155072. +
  155073. + case 0x76:
  155074. + switch(minor_cmd)
  155075. + {
  155076. + case 0x00: //normal mode,
  155077. + padapter->recvpriv.is_signal_dbg = 0;
  155078. + break;
  155079. + case 0x01: //dbg mode
  155080. + padapter->recvpriv.is_signal_dbg = 1;
  155081. + extra_arg = extra_arg>100?100:extra_arg;
  155082. + extra_arg = extra_arg<0?0:extra_arg;
  155083. + padapter->recvpriv.signal_strength_dbg=extra_arg;
  155084. + break;
  155085. + }
  155086. + break;
  155087. + case 0x78: //IOL test
  155088. + switch(minor_cmd)
  155089. + {
  155090. + #ifdef CONFIG_IOL
  155091. + case 0x04: //LLT table initialization test
  155092. + {
  155093. + u8 page_boundary = 0xf9;
  155094. + {
  155095. + struct xmit_frame *xmit_frame;
  155096. +
  155097. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {
  155098. + ret = -ENOMEM;
  155099. + break;
  155100. + }
  155101. +
  155102. + rtw_IOL_append_LLT_cmd(xmit_frame, page_boundary);
  155103. +
  155104. +
  155105. + if(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 500) )
  155106. + ret = -EPERM;
  155107. + }
  155108. + }
  155109. + break;
  155110. + case 0x05: //blink LED test
  155111. + {
  155112. + u16 reg = 0x4c;
  155113. + u32 blink_num = 50;
  155114. + u32 blink_delay_ms = 200;
  155115. + int i;
  155116. +
  155117. + {
  155118. + struct xmit_frame *xmit_frame;
  155119. +
  155120. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {
  155121. + ret = -ENOMEM;
  155122. + break;
  155123. + }
  155124. +
  155125. + for(i=0;i<blink_num;i++){
  155126. + rtw_IOL_append_WB_cmd(xmit_frame, reg, 0x00);
  155127. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);
  155128. + rtw_IOL_append_WB_cmd(xmit_frame, reg, 0x08);
  155129. + rtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);
  155130. + }
  155131. + if(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, (blink_delay_ms*blink_num*2)+200) )
  155132. + ret = -EPERM;
  155133. + }
  155134. + }
  155135. + break;
  155136. +
  155137. + case 0x06: //continuous wirte byte test
  155138. + {
  155139. + u16 reg = arg;
  155140. + u16 start_value = 0;
  155141. + u32 write_num = extra_arg;
  155142. + int i;
  155143. + u8 final;
  155144. +
  155145. + {
  155146. + struct xmit_frame *xmit_frame;
  155147. +
  155148. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {
  155149. + ret = -ENOMEM;
  155150. + break;
  155151. + }
  155152. +
  155153. + for(i=0;i<write_num;i++){
  155154. + rtw_IOL_append_WB_cmd(xmit_frame, reg, i+start_value);
  155155. + }
  155156. + if(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000))
  155157. + ret = -EPERM;
  155158. + }
  155159. +
  155160. + if(start_value+write_num-1 == (final=rtw_read8(padapter, reg)) ) {
  155161. + DBG_871X("continuous IOL_CMD_WB_REG to 0x%x %u times Success, start:%u, final:%u\n", reg, write_num, start_value, final);
  155162. + } else {
  155163. + DBG_871X("continuous IOL_CMD_WB_REG to 0x%x %u times Fail, start:%u, final:%u\n", reg, write_num, start_value, final);
  155164. + }
  155165. + }
  155166. + break;
  155167. +
  155168. + case 0x07: //continuous wirte word test
  155169. + {
  155170. + u16 reg = arg;
  155171. + u16 start_value = 200;
  155172. + u32 write_num = extra_arg;
  155173. +
  155174. + int i;
  155175. + u16 final;
  155176. +
  155177. + {
  155178. + struct xmit_frame *xmit_frame;
  155179. +
  155180. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {
  155181. + ret = -ENOMEM;
  155182. + break;
  155183. + }
  155184. +
  155185. + for(i=0;i<write_num;i++){
  155186. + rtw_IOL_append_WW_cmd(xmit_frame, reg, i+start_value);
  155187. + }
  155188. + if(_SUCCESS !=rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000))
  155189. + ret = -EPERM;
  155190. + }
  155191. +
  155192. + if(start_value+write_num-1 == (final=rtw_read16(padapter, reg)) ) {
  155193. + DBG_871X("continuous IOL_CMD_WW_REG to 0x%x %u times Success, start:%u, final:%u\n", reg, write_num, start_value, final);
  155194. + } else {
  155195. + DBG_871X("continuous IOL_CMD_WW_REG to 0x%x %u times Fail, start:%u, final:%u\n", reg, write_num, start_value, final);
  155196. + }
  155197. + }
  155198. + break;
  155199. +
  155200. + case 0x08: //continuous wirte dword test
  155201. + {
  155202. + u16 reg = arg;
  155203. + u32 start_value = 0x110000c7;
  155204. + u32 write_num = extra_arg;
  155205. +
  155206. + int i;
  155207. + u32 final;
  155208. +
  155209. + {
  155210. + struct xmit_frame *xmit_frame;
  155211. +
  155212. + if((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {
  155213. + ret = -ENOMEM;
  155214. + break;
  155215. + }
  155216. +
  155217. + for(i=0;i<write_num;i++){
  155218. + rtw_IOL_append_WD_cmd(xmit_frame, reg, i+start_value);
  155219. + }
  155220. + if(_SUCCESS !=rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000))
  155221. + ret = -EPERM;
  155222. +
  155223. + }
  155224. +
  155225. + if(start_value+write_num-1 == (final=rtw_read32(padapter, reg)) ) {
  155226. + DBG_871X("continuous IOL_CMD_WD_REG to 0x%x %u times Success, start:%u, final:%u\n", reg, write_num, start_value, final);
  155227. + } else {
  155228. + DBG_871X("continuous IOL_CMD_WD_REG to 0x%x %u times Fail, start:%u, final:%u\n", reg, write_num, start_value, final);
  155229. + }
  155230. + }
  155231. + break;
  155232. + #endif //CONFIG_IOL
  155233. + }
  155234. + break;
  155235. + case 0x7a:
  155236. + receive_disconnect(padapter, pmlmeinfo->network.MacAddress
  155237. + , WLAN_REASON_EXPIRATION_CHK);
  155238. + break;
  155239. +
  155240. + case 0x7F:
  155241. + switch(minor_cmd)
  155242. + {
  155243. + case 0x0:
  155244. + DBG_871X("fwstate=0x%x\n", get_fwstate(pmlmepriv));
  155245. + break;
  155246. + case 0x01:
  155247. + DBG_871X("auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
  155248. + psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
  155249. + psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
  155250. + break;
  155251. + case 0x02:
  155252. + DBG_871X("pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
  155253. + break;
  155254. + case 0x03:
  155255. + DBG_871X("qos_option=%d\n", pmlmepriv->qospriv.qos_option);
  155256. + DBG_871X("ht_option=%d\n", pmlmepriv->htpriv.ht_option);
  155257. + break;
  155258. + case 0x04:
  155259. + DBG_871X("cur_ch=%d\n", pmlmeext->cur_channel);
  155260. + DBG_871X("cur_bw=%d\n", pmlmeext->cur_bwmode);
  155261. + DBG_871X("cur_ch_off=%d\n", pmlmeext->cur_ch_offset);
  155262. + break;
  155263. + case 0x05:
  155264. + psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
  155265. + if(psta)
  155266. + {
  155267. + int i;
  155268. + struct recv_reorder_ctrl *preorder_ctrl;
  155269. +
  155270. + DBG_871X("SSID=%s\n", cur_network->network.Ssid.Ssid);
  155271. + DBG_871X("sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  155272. + DBG_871X("cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  155273. + DBG_871X("rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
  155274. + DBG_871X("qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  155275. + DBG_871X("state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  155276. + DBG_871X("bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
  155277. + DBG_871X("ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  155278. + DBG_871X("agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  155279. +
  155280. + for(i=0;i<16;i++)
  155281. + {
  155282. + preorder_ctrl = &psta->recvreorder_ctrl[i];
  155283. + if(preorder_ctrl->enable)
  155284. + {
  155285. + DBG_871X("tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
  155286. + }
  155287. + }
  155288. +
  155289. + }
  155290. + else
  155291. + {
  155292. + DBG_871X("can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
  155293. + }
  155294. + break;
  155295. + case 0x06:
  155296. + {
  155297. + u8 DMFlag;
  155298. + rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&DMFlag));
  155299. + DBG_871X("(B)DMFlag=0x%x, arg=0x%x\n", DMFlag, arg);
  155300. + DMFlag = (u8)(0x0f&arg);
  155301. + DBG_871X("(A)DMFlag=0x%x\n", DMFlag);
  155302. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&DMFlag));
  155303. + }
  155304. + break;
  155305. + case 0x07:
  155306. + DBG_871X("bSurpriseRemoved=%d, bDriverStopped=%d\n",
  155307. + padapter->bSurpriseRemoved, padapter->bDriverStopped);
  155308. + break;
  155309. + case 0x08:
  155310. + {
  155311. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  155312. + struct recv_priv *precvpriv = &padapter->recvpriv;
  155313. +
  155314. + DBG_871X("free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d"
  155315. + ", free_xmit_extbuf_cnt=%d, free_xframe_ext_cnt=%d"
  155316. + ", free_recvframe_cnt=%d\n",
  155317. + pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt,
  155318. + pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt,
  155319. + precvpriv->free_recvframe_cnt);
  155320. + #ifdef CONFIG_USB_HCI
  155321. + DBG_871X("rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt);
  155322. + #endif
  155323. + }
  155324. + break;
  155325. + case 0x09:
  155326. + {
  155327. + int i, j;
  155328. + _list *plist, *phead;
  155329. + struct recv_reorder_ctrl *preorder_ctrl;
  155330. +
  155331. +#ifdef CONFIG_AP_MODE
  155332. + DBG_871X("sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
  155333. +#endif
  155334. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  155335. +
  155336. + for(i=0; i< NUM_STA; i++)
  155337. + {
  155338. + phead = &(pstapriv->sta_hash[i]);
  155339. + plist = get_next(phead);
  155340. +
  155341. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  155342. + {
  155343. + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  155344. +
  155345. + plist = get_next(plist);
  155346. +
  155347. + if(extra_arg == psta->aid)
  155348. + {
  155349. + DBG_871X("sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  155350. + DBG_871X("rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
  155351. + DBG_871X("qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  155352. + DBG_871X("state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  155353. + DBG_871X("bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);
  155354. + DBG_871X("ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  155355. + DBG_871X("agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  155356. +#ifdef CONFIG_AP_MODE
  155357. + DBG_871X("capability=0x%x\n", psta->capability);
  155358. + DBG_871X("flags=0x%x\n", psta->flags);
  155359. + DBG_871X("wpa_psk=0x%x\n", psta->wpa_psk);
  155360. + DBG_871X("wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
  155361. + DBG_871X("wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
  155362. + DBG_871X("qos_info=0x%x\n", psta->qos_info);
  155363. +#endif
  155364. + DBG_871X("dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
  155365. +
  155366. +
  155367. +
  155368. + for(j=0;j<16;j++)
  155369. + {
  155370. + preorder_ctrl = &psta->recvreorder_ctrl[j];
  155371. + if(preorder_ctrl->enable)
  155372. + {
  155373. + DBG_871X("tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
  155374. + }
  155375. + }
  155376. +
  155377. + }
  155378. +
  155379. + }
  155380. + }
  155381. +
  155382. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  155383. +
  155384. + }
  155385. + break;
  155386. +
  155387. + case 0x0c://dump rx packet
  155388. + {
  155389. + DBG_871X("dump rx packet (%d)\n",extra_arg);
  155390. + //pHalData->bDumpRxPkt =extra_arg;
  155391. + rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DUMP_RXPKT, &(extra_arg));
  155392. + }
  155393. + break;
  155394. +#if 0
  155395. + case 0x0d://dump cam
  155396. + {
  155397. + //u8 entry = (u8) extra_arg;
  155398. + u8 entry=0;
  155399. + //dump cam
  155400. + for(entry=0;entry<32;entry++)
  155401. + read_cam(padapter,entry);
  155402. + }
  155403. + break;
  155404. +#endif
  155405. + #ifdef DBG_CONFIG_ERROR_DETECT
  155406. + case 0x0f:
  155407. + {
  155408. + if(extra_arg == 0){
  155409. + DBG_871X("###### silent reset test.......#####\n");
  155410. + rtw_hal_sreset_reset(padapter);
  155411. + } else {
  155412. + sreset_set_trigger_point(padapter, extra_arg);
  155413. + }
  155414. +
  155415. + }
  155416. + break;
  155417. + case 0x15:
  155418. + {
  155419. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  155420. + DBG_871X("==>silent resete cnts:%d\n",pwrpriv->ips_enter_cnts);
  155421. + }
  155422. + break;
  155423. +
  155424. + #endif
  155425. +
  155426. + case 0x10:// driver version display
  155427. + DBG_871X("rtw driver version=%s\n", DRIVERVERSION);
  155428. + break;
  155429. + case 0x11:
  155430. + {
  155431. + DBG_871X("turn %s Rx RSSI display function\n",(extra_arg==1)?"on":"off");
  155432. + padapter->bRxRSSIDisplay = extra_arg ;
  155433. + }
  155434. + break;
  155435. + case 0x12: //set rx_stbc
  155436. + {
  155437. + struct registry_priv *pregpriv = &padapter->registrypriv;
  155438. + // 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, 0x3: enable both 2.4g and 5g
  155439. + //default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
  155440. + if( pregpriv && (extra_arg == 0 || extra_arg == 1|| extra_arg == 2 || extra_arg == 3))
  155441. + {
  155442. + pregpriv->rx_stbc= extra_arg;
  155443. + DBG_871X("set rx_stbc=%d\n",pregpriv->rx_stbc);
  155444. + }
  155445. + else
  155446. + DBG_871X("get rx_stbc=%d\n",pregpriv->rx_stbc);
  155447. +
  155448. + }
  155449. + break;
  155450. + case 0x13: //set ampdu_enable
  155451. + {
  155452. + struct registry_priv *pregpriv = &padapter->registrypriv;
  155453. + // 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)
  155454. + if( pregpriv && extra_arg >= 0 && extra_arg < 3 )
  155455. + {
  155456. + pregpriv->ampdu_enable= extra_arg;
  155457. + DBG_871X("set ampdu_enable=%d\n",pregpriv->ampdu_enable);
  155458. + }
  155459. + else
  155460. + DBG_871X("get ampdu_enable=%d\n",pregpriv->ampdu_enable);
  155461. +
  155462. + }
  155463. + break;
  155464. + case 0x14: //get wifi_spec
  155465. + {
  155466. + struct registry_priv *pregpriv = &padapter->registrypriv;
  155467. + DBG_871X("get wifi_spec=%d\n",pregpriv->wifi_spec);
  155468. +
  155469. + }
  155470. + break;
  155471. + case 0x22:
  155472. + {
  155473. + DBG_871X("turn %s the ForceWriteInitGain Variable\n",(extra_arg==1)?"on":"off");
  155474. + padapter->bForceWriteInitGain = extra_arg;
  155475. + break;
  155476. + }
  155477. + case 0x23:
  155478. + {
  155479. + DBG_871X("turn %s the bNotifyChannelChange Variable\n",(extra_arg==1)?"on":"off");
  155480. + padapter->bNotifyChannelChange = extra_arg;
  155481. + break;
  155482. + }
  155483. + case 0x24:
  155484. + {
  155485. +#ifdef CONFIG_P2P
  155486. + DBG_871X("turn %s the bShowGetP2PState Variable\n",(extra_arg==1)?"on":"off");
  155487. + padapter->bShowGetP2PState = extra_arg;
  155488. +#endif // CONFIG_P2P
  155489. + break;
  155490. + }
  155491. +#if 1
  155492. + case 0xdd://registers dump , 0 for mac reg,1 for bb reg, 2 for rf reg
  155493. + {
  155494. + if(extra_arg==0){
  155495. + mac_reg_dump(padapter);
  155496. + }
  155497. + else if(extra_arg==1){
  155498. + bb_reg_dump(padapter);
  155499. + }
  155500. + else if(extra_arg==2){
  155501. + rf_reg_dump(padapter);
  155502. + }
  155503. +
  155504. + }
  155505. + break;
  155506. +#endif
  155507. + case 0xee://turn on/off dynamic funcs
  155508. + {
  155509. + u8 dm_flag;
  155510. +
  155511. + if(0xf==extra_arg){
  155512. + rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&dm_flag);
  155513. + DBG_871X(" === DMFlag(0x%02x) === \n",dm_flag);
  155514. + DBG_871X("extra_arg = 0 - disable all dynamic func \n");
  155515. + DBG_871X("extra_arg = 1 - disable DIG- BIT(0)\n");
  155516. + DBG_871X("extra_arg = 2 - disable High power - BIT(1)\n");
  155517. + DBG_871X("extra_arg = 3 - disable tx power tracking - BIT(2)\n");
  155518. + DBG_871X("extra_arg = 4 - disable BT coexistence - BIT(3)\n");
  155519. + DBG_871X("extra_arg = 5 - disable antenna diversity - BIT(4)\n");
  155520. + DBG_871X("extra_arg = 6 - enable all dynamic func \n");
  155521. + }
  155522. + else{
  155523. + /* extra_arg = 0 - disable all dynamic func
  155524. + extra_arg = 1 - disable DIG
  155525. + extra_arg = 2 - disable tx power tracking
  155526. + extra_arg = 3 - turn on all dynamic func
  155527. + */
  155528. + rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &(extra_arg));
  155529. + rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&dm_flag);
  155530. + DBG_871X(" === DMFlag(0x%02x) === \n",dm_flag);
  155531. + }
  155532. + }
  155533. + break;
  155534. +
  155535. + case 0xfd:
  155536. + rtw_write8(padapter, 0xc50, arg);
  155537. + DBG_871X("wr(0xc50)=0x%x\n", rtw_read8(padapter, 0xc50));
  155538. + rtw_write8(padapter, 0xc58, arg);
  155539. + DBG_871X("wr(0xc58)=0x%x\n", rtw_read8(padapter, 0xc58));
  155540. + break;
  155541. + case 0xfe:
  155542. + DBG_871X("rd(0xc50)=0x%x\n", rtw_read8(padapter, 0xc50));
  155543. + DBG_871X("rd(0xc58)=0x%x\n", rtw_read8(padapter, 0xc58));
  155544. + break;
  155545. + case 0xff:
  155546. + {
  155547. + DBG_871X("dbg(0x210)=0x%x\n", rtw_read32(padapter, 0x210));
  155548. + DBG_871X("dbg(0x608)=0x%x\n", rtw_read32(padapter, 0x608));
  155549. + DBG_871X("dbg(0x280)=0x%x\n", rtw_read32(padapter, 0x280));
  155550. + DBG_871X("dbg(0x284)=0x%x\n", rtw_read32(padapter, 0x284));
  155551. + DBG_871X("dbg(0x288)=0x%x\n", rtw_read32(padapter, 0x288));
  155552. +
  155553. + DBG_871X("dbg(0x664)=0x%x\n", rtw_read32(padapter, 0x664));
  155554. +
  155555. +
  155556. + DBG_871X("\n");
  155557. +
  155558. + DBG_871X("dbg(0x430)=0x%x\n", rtw_read32(padapter, 0x430));
  155559. + DBG_871X("dbg(0x438)=0x%x\n", rtw_read32(padapter, 0x438));
  155560. +
  155561. + DBG_871X("dbg(0x440)=0x%x\n", rtw_read32(padapter, 0x440));
  155562. +
  155563. + DBG_871X("dbg(0x458)=0x%x\n", rtw_read32(padapter, 0x458));
  155564. +
  155565. + DBG_871X("dbg(0x484)=0x%x\n", rtw_read32(padapter, 0x484));
  155566. + DBG_871X("dbg(0x488)=0x%x\n", rtw_read32(padapter, 0x488));
  155567. +
  155568. + DBG_871X("dbg(0x444)=0x%x\n", rtw_read32(padapter, 0x444));
  155569. + DBG_871X("dbg(0x448)=0x%x\n", rtw_read32(padapter, 0x448));
  155570. + DBG_871X("dbg(0x44c)=0x%x\n", rtw_read32(padapter, 0x44c));
  155571. + DBG_871X("dbg(0x450)=0x%x\n", rtw_read32(padapter, 0x450));
  155572. + }
  155573. + break;
  155574. + }
  155575. + break;
  155576. + default:
  155577. + DBG_871X("error dbg cmd!\n");
  155578. + break;
  155579. + }
  155580. +
  155581. +
  155582. + return ret;
  155583. +
  155584. +}
  155585. +
  155586. +static int wpa_set_param(struct net_device *dev, u8 name, u32 value)
  155587. +{
  155588. + uint ret=0;
  155589. + u32 flags;
  155590. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  155591. +
  155592. + switch (name){
  155593. + case IEEE_PARAM_WPA_ENABLED:
  155594. +
  155595. + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; //802.1x
  155596. +
  155597. + //ret = ieee80211_wpa_enable(ieee, value);
  155598. +
  155599. + switch((value)&0xff)
  155600. + {
  155601. + case 1 : //WPA
  155602. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPAPSK; //WPA_PSK
  155603. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
  155604. + break;
  155605. + case 2: //WPA2
  155606. + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPA2PSK; //WPA2_PSK
  155607. + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
  155608. + break;
  155609. + }
  155610. +
  155611. + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("wpa_set_param:padapter->securitypriv.ndisauthtype=%d\n", padapter->securitypriv.ndisauthtype));
  155612. +
  155613. + break;
  155614. +
  155615. + case IEEE_PARAM_TKIP_COUNTERMEASURES:
  155616. + //ieee->tkip_countermeasures=value;
  155617. + break;
  155618. +
  155619. + case IEEE_PARAM_DROP_UNENCRYPTED:
  155620. + {
  155621. + /* HACK:
  155622. + *
  155623. + * wpa_supplicant calls set_wpa_enabled when the driver
  155624. + * is loaded and unloaded, regardless of if WPA is being
  155625. + * used. No other calls are made which can be used to
  155626. + * determine if encryption will be used or not prior to
  155627. + * association being expected. If encryption is not being
  155628. + * used, drop_unencrypted is set to false, else true -- we
  155629. + * can use this to determine if the CAP_PRIVACY_ON bit should
  155630. + * be set.
  155631. + */
  155632. +
  155633. +#if 0
  155634. + struct ieee80211_security sec = {
  155635. + .flags = SEC_ENABLED,
  155636. + .enabled = value,
  155637. + };
  155638. + ieee->drop_unencrypted = value;
  155639. + /* We only change SEC_LEVEL for open mode. Others
  155640. + * are set by ipw_wpa_set_encryption.
  155641. + */
  155642. + if (!value) {
  155643. + sec.flags |= SEC_LEVEL;
  155644. + sec.level = SEC_LEVEL_0;
  155645. + }
  155646. + else {
  155647. + sec.flags |= SEC_LEVEL;
  155648. + sec.level = SEC_LEVEL_1;
  155649. + }
  155650. + if (ieee->set_security)
  155651. + ieee->set_security(ieee->dev, &sec);
  155652. +#endif
  155653. + break;
  155654. +
  155655. + }
  155656. + case IEEE_PARAM_PRIVACY_INVOKED:
  155657. +
  155658. + //ieee->privacy_invoked=value;
  155659. +
  155660. + break;
  155661. +
  155662. + case IEEE_PARAM_AUTH_ALGS:
  155663. +
  155664. + ret = wpa_set_auth_algs(dev, value);
  155665. +
  155666. + break;
  155667. +
  155668. + case IEEE_PARAM_IEEE_802_1X:
  155669. +
  155670. + //ieee->ieee802_1x=value;
  155671. +
  155672. + break;
  155673. +
  155674. + case IEEE_PARAM_WPAX_SELECT:
  155675. +
  155676. + // added for WPA2 mixed mode
  155677. + //DBG_871X(KERN_WARNING "------------------------>wpax value = %x\n", value);
  155678. + /*
  155679. + spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);
  155680. + ieee->wpax_type_set = 1;
  155681. + ieee->wpax_type_notify = value;
  155682. + spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);
  155683. + */
  155684. +
  155685. + break;
  155686. +
  155687. + default:
  155688. +
  155689. +
  155690. +
  155691. + ret = -EOPNOTSUPP;
  155692. +
  155693. +
  155694. + break;
  155695. +
  155696. + }
  155697. +
  155698. + return ret;
  155699. +
  155700. +}
  155701. +
  155702. +static int wpa_mlme(struct net_device *dev, u32 command, u32 reason)
  155703. +{
  155704. + int ret = 0;
  155705. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  155706. +
  155707. + switch (command)
  155708. + {
  155709. + case IEEE_MLME_STA_DEAUTH:
  155710. +
  155711. + if(!rtw_set_802_11_disassociate(padapter))
  155712. + ret = -1;
  155713. +
  155714. + break;
  155715. +
  155716. + case IEEE_MLME_STA_DISASSOC:
  155717. +
  155718. + if(!rtw_set_802_11_disassociate(padapter))
  155719. + ret = -1;
  155720. +
  155721. + break;
  155722. +
  155723. + default:
  155724. + ret = -EOPNOTSUPP;
  155725. + break;
  155726. + }
  155727. +
  155728. + return ret;
  155729. +
  155730. +}
  155731. +
  155732. +static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p)
  155733. +{
  155734. + struct ieee_param *param;
  155735. + uint ret=0;
  155736. +
  155737. + //down(&ieee->wx_sem);
  155738. +
  155739. + if (p->length < sizeof(struct ieee_param) || !p->pointer){
  155740. + ret = -EINVAL;
  155741. + goto out;
  155742. + }
  155743. +
  155744. + param = (struct ieee_param *)rtw_malloc(p->length);
  155745. + if (param == NULL)
  155746. + {
  155747. + ret = -ENOMEM;
  155748. + goto out;
  155749. + }
  155750. +
  155751. + if (copy_from_user(param, p->pointer, p->length))
  155752. + {
  155753. + rtw_mfree((u8*)param, p->length);
  155754. + ret = -EFAULT;
  155755. + goto out;
  155756. + }
  155757. +
  155758. + switch (param->cmd) {
  155759. +
  155760. + case IEEE_CMD_SET_WPA_PARAM:
  155761. + ret = wpa_set_param(dev, param->u.wpa_param.name, param->u.wpa_param.value);
  155762. + break;
  155763. +
  155764. + case IEEE_CMD_SET_WPA_IE:
  155765. + //ret = wpa_set_wpa_ie(dev, param, p->length);
  155766. + ret = rtw_set_wpa_ie((_adapter *)rtw_netdev_priv(dev), (char*)param->u.wpa_ie.data, (u16)param->u.wpa_ie.len);
  155767. + break;
  155768. +
  155769. + case IEEE_CMD_SET_ENCRYPTION:
  155770. + ret = wpa_set_encryption(dev, param, p->length);
  155771. + break;
  155772. +
  155773. + case IEEE_CMD_MLME:
  155774. + ret = wpa_mlme(dev, param->u.mlme.command, param->u.mlme.reason_code);
  155775. + break;
  155776. +
  155777. + default:
  155778. + DBG_871X("Unknown WPA supplicant request: %d\n", param->cmd);
  155779. + ret = -EOPNOTSUPP;
  155780. + break;
  155781. +
  155782. + }
  155783. +
  155784. + if (ret == 0 && copy_to_user(p->pointer, param, p->length))
  155785. + ret = -EFAULT;
  155786. +
  155787. + rtw_mfree((u8 *)param, p->length);
  155788. +
  155789. +out:
  155790. +
  155791. + //up(&ieee->wx_sem);
  155792. +
  155793. + return ret;
  155794. +
  155795. +}
  155796. +
  155797. +#ifdef CONFIG_AP_MODE
  155798. +static u8 set_pairwise_key(_adapter *padapter, struct sta_info *psta)
  155799. +{
  155800. + struct cmd_obj* ph2c;
  155801. + struct set_stakey_parm *psetstakey_para;
  155802. + struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
  155803. + u8 res=_SUCCESS;
  155804. +
  155805. + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  155806. + if ( ph2c == NULL){
  155807. + res= _FAIL;
  155808. + goto exit;
  155809. + }
  155810. +
  155811. + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
  155812. + if(psetstakey_para==NULL){
  155813. + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
  155814. + res=_FAIL;
  155815. + goto exit;
  155816. + }
  155817. +
  155818. + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
  155819. +
  155820. +
  155821. + psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy;
  155822. +
  155823. + _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN);
  155824. +
  155825. + _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16);
  155826. +
  155827. +
  155828. + res = rtw_enqueue_cmd(pcmdpriv, ph2c);
  155829. +
  155830. +exit:
  155831. +
  155832. + return res;
  155833. +
  155834. +}
  155835. +
  155836. +static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid)
  155837. +{
  155838. + u8 keylen;
  155839. + struct cmd_obj* pcmd;
  155840. + struct setkey_parm *psetkeyparm;
  155841. + struct cmd_priv *pcmdpriv=&(padapter->cmdpriv);
  155842. + int res=_SUCCESS;
  155843. +
  155844. + DBG_871X("%s\n", __FUNCTION__);
  155845. +
  155846. + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
  155847. + if(pcmd==NULL){
  155848. + res= _FAIL;
  155849. + goto exit;
  155850. + }
  155851. + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));
  155852. + if(psetkeyparm==NULL){
  155853. + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
  155854. + res= _FAIL;
  155855. + goto exit;
  155856. + }
  155857. +
  155858. + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));
  155859. +
  155860. + psetkeyparm->keyid=(u8)keyid;
  155861. + if (is_wep_enc(alg))
  155862. + padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid);
  155863. +
  155864. + psetkeyparm->algorithm = alg;
  155865. +
  155866. + psetkeyparm->set_tx = 1;
  155867. +
  155868. + switch(alg)
  155869. + {
  155870. + case _WEP40_:
  155871. + keylen = 5;
  155872. + break;
  155873. + case _WEP104_:
  155874. + keylen = 13;
  155875. + break;
  155876. + case _TKIP_:
  155877. + case _TKIP_WTMIC_:
  155878. + case _AES_:
  155879. + keylen = 16;
  155880. + default:
  155881. + keylen = 16;
  155882. + }
  155883. +
  155884. + _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen);
  155885. +
  155886. + pcmd->cmdcode = _SetKey_CMD_;
  155887. + pcmd->parmbuf = (u8 *)psetkeyparm;
  155888. + pcmd->cmdsz = (sizeof(struct setkey_parm));
  155889. + pcmd->rsp = NULL;
  155890. + pcmd->rspsz = 0;
  155891. +
  155892. +
  155893. + _rtw_init_listhead(&pcmd->list);
  155894. +
  155895. + res = rtw_enqueue_cmd(pcmdpriv, pcmd);
  155896. +
  155897. +exit:
  155898. +
  155899. + return res;
  155900. +
  155901. +
  155902. +}
  155903. +
  155904. +static int set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid)
  155905. +{
  155906. + u8 alg;
  155907. +
  155908. + switch(keylen)
  155909. + {
  155910. + case 5:
  155911. + alg =_WEP40_;
  155912. + break;
  155913. + case 13:
  155914. + alg =_WEP104_;
  155915. + break;
  155916. + default:
  155917. + alg =_NO_PRIVACY_;
  155918. + }
  155919. +
  155920. + return set_group_key(padapter, key, alg, keyid);
  155921. +
  155922. +}
  155923. +
  155924. +
  155925. +static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)
  155926. +{
  155927. + int ret = 0;
  155928. + u32 wep_key_idx, wep_key_len,wep_total_len;
  155929. + NDIS_802_11_WEP *pwep = NULL;
  155930. + struct sta_info *psta = NULL, *pbcmc_sta = NULL;
  155931. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  155932. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  155933. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  155934. + struct sta_priv *pstapriv = &padapter->stapriv;
  155935. +
  155936. + DBG_871X("%s\n", __FUNCTION__);
  155937. +
  155938. + param->u.crypt.err = 0;
  155939. + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
  155940. +
  155941. + //sizeof(struct ieee_param) = 64 bytes;
  155942. + //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)
  155943. + if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len)
  155944. + {
  155945. + ret = -EINVAL;
  155946. + goto exit;
  155947. + }
  155948. +
  155949. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  155950. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  155951. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  155952. + {
  155953. + if (param->u.crypt.idx >= WEP_KEYS)
  155954. + {
  155955. + ret = -EINVAL;
  155956. + goto exit;
  155957. + }
  155958. + }
  155959. + else
  155960. + {
  155961. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  155962. + if(!psta)
  155963. + {
  155964. + //ret = -EINVAL;
  155965. + DBG_871X("rtw_set_encryption(), sta has already been removed or never been added\n");
  155966. + goto exit;
  155967. + }
  155968. + }
  155969. +
  155970. + if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL))
  155971. + {
  155972. + //todo:clear default encryption keys
  155973. +
  155974. + DBG_871X("clear default encryption keys, keyid=%d\n", param->u.crypt.idx);
  155975. +
  155976. + goto exit;
  155977. + }
  155978. +
  155979. +
  155980. + if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL))
  155981. + {
  155982. + DBG_871X("r871x_set_encryption, crypt.alg = WEP\n");
  155983. +
  155984. + wep_key_idx = param->u.crypt.idx;
  155985. + wep_key_len = param->u.crypt.key_len;
  155986. +
  155987. + DBG_871X("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len);
  155988. +
  155989. + if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0))
  155990. + {
  155991. + ret = -EINVAL;
  155992. + goto exit;
  155993. + }
  155994. +
  155995. +
  155996. + if (wep_key_len > 0)
  155997. + {
  155998. + wep_key_len = wep_key_len <= 5 ? 5 : 13;
  155999. + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);
  156000. + pwep =(NDIS_802_11_WEP *)rtw_malloc(wep_total_len);
  156001. + if(pwep == NULL){
  156002. + DBG_871X(" r871x_set_encryption: pwep allocate fail !!!\n");
  156003. + goto exit;
  156004. + }
  156005. +
  156006. + _rtw_memset(pwep, 0, wep_total_len);
  156007. +
  156008. + pwep->KeyLength = wep_key_len;
  156009. + pwep->Length = wep_total_len;
  156010. +
  156011. + }
  156012. +
  156013. + pwep->KeyIndex = wep_key_idx;
  156014. +
  156015. + _rtw_memcpy(pwep->KeyMaterial, param->u.crypt.key, pwep->KeyLength);
  156016. +
  156017. + if(param->u.crypt.set_tx)
  156018. + {
  156019. + DBG_871X("wep, set_tx=1\n");
  156020. +
  156021. + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
  156022. + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_;
  156023. + psecuritypriv->dot118021XGrpPrivacy=_WEP40_;
  156024. +
  156025. + if(pwep->KeyLength==13)
  156026. + {
  156027. + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_;
  156028. + psecuritypriv->dot118021XGrpPrivacy=_WEP104_;
  156029. + }
  156030. +
  156031. +
  156032. + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
  156033. +
  156034. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);
  156035. +
  156036. + psecuritypriv->dot11DefKeylen[wep_key_idx]=pwep->KeyLength;
  156037. +
  156038. + set_wep_key(padapter, pwep->KeyMaterial, pwep->KeyLength, wep_key_idx);
  156039. +
  156040. +
  156041. + }
  156042. + else
  156043. + {
  156044. + DBG_871X("wep, set_tx=0\n");
  156045. +
  156046. + //don't update "psecuritypriv->dot11PrivacyAlgrthm" and
  156047. + //"psecuritypriv->dot11PrivacyKeyIndex=keyid", but can rtw_set_key to cam
  156048. +
  156049. + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);
  156050. +
  156051. + psecuritypriv->dot11DefKeylen[wep_key_idx] = pwep->KeyLength;
  156052. +
  156053. + set_wep_key(padapter, pwep->KeyMaterial, pwep->KeyLength, wep_key_idx);
  156054. +
  156055. + }
  156056. +
  156057. + goto exit;
  156058. +
  156059. + }
  156060. +
  156061. +
  156062. + if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key
  156063. + {
  156064. + if(param->u.crypt.set_tx ==1)
  156065. + {
  156066. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  156067. + {
  156068. + DBG_871X("%s, set group_key, WEP\n", __FUNCTION__);
  156069. +
  156070. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156071. +
  156072. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  156073. + if(param->u.crypt.key_len==13)
  156074. + {
  156075. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  156076. + }
  156077. +
  156078. + }
  156079. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  156080. + {
  156081. + DBG_871X("%s, set group_key, TKIP\n", __FUNCTION__);
  156082. +
  156083. + psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
  156084. +
  156085. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156086. +
  156087. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  156088. + //set mic key
  156089. + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
  156090. + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
  156091. +
  156092. + psecuritypriv->busetkipkey = _TRUE;
  156093. +
  156094. + }
  156095. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  156096. + {
  156097. + DBG_871X("%s, set group_key, CCMP\n", __FUNCTION__);
  156098. +
  156099. + psecuritypriv->dot118021XGrpPrivacy = _AES_;
  156100. +
  156101. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156102. + }
  156103. + else
  156104. + {
  156105. + DBG_871X("%s, set group_key, none\n", __FUNCTION__);
  156106. +
  156107. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  156108. + }
  156109. +
  156110. + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
  156111. +
  156112. + psecuritypriv->binstallGrpkey = _TRUE;
  156113. +
  156114. + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!
  156115. +
  156116. + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);
  156117. +
  156118. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  156119. + if(pbcmc_sta)
  156120. + {
  156121. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  156122. + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy
  156123. + }
  156124. +
  156125. + }
  156126. +
  156127. + goto exit;
  156128. +
  156129. + }
  156130. +
  156131. + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x
  156132. + {
  156133. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE))
  156134. + {
  156135. + if(param->u.crypt.set_tx ==1)
  156136. + {
  156137. + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156138. +
  156139. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  156140. + {
  156141. + DBG_871X("%s, set pairwise key, WEP\n", __FUNCTION__);
  156142. +
  156143. + psta->dot118021XPrivacy = _WEP40_;
  156144. + if(param->u.crypt.key_len==13)
  156145. + {
  156146. + psta->dot118021XPrivacy = _WEP104_;
  156147. + }
  156148. + }
  156149. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  156150. + {
  156151. + DBG_871X("%s, set pairwise key, TKIP\n", __FUNCTION__);
  156152. +
  156153. + psta->dot118021XPrivacy = _TKIP_;
  156154. +
  156155. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  156156. + //set mic key
  156157. + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);
  156158. + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);
  156159. +
  156160. + psecuritypriv->busetkipkey = _TRUE;
  156161. +
  156162. + }
  156163. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  156164. + {
  156165. +
  156166. + DBG_871X("%s, set pairwise key, CCMP\n", __FUNCTION__);
  156167. +
  156168. + psta->dot118021XPrivacy = _AES_;
  156169. + }
  156170. + else
  156171. + {
  156172. + DBG_871X("%s, set pairwise key, none\n", __FUNCTION__);
  156173. +
  156174. + psta->dot118021XPrivacy = _NO_PRIVACY_;
  156175. + }
  156176. +
  156177. + set_pairwise_key(padapter, psta);
  156178. +
  156179. + psta->ieee8021x_blocked = _FALSE;
  156180. +
  156181. + }
  156182. + else//group key???
  156183. + {
  156184. + if(strcmp(param->u.crypt.alg, "WEP") == 0)
  156185. + {
  156186. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156187. +
  156188. + psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
  156189. + if(param->u.crypt.key_len==13)
  156190. + {
  156191. + psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
  156192. + }
  156193. + }
  156194. + else if(strcmp(param->u.crypt.alg, "TKIP") == 0)
  156195. + {
  156196. + psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
  156197. +
  156198. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156199. +
  156200. + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len);
  156201. + //set mic key
  156202. + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
  156203. + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
  156204. +
  156205. + psecuritypriv->busetkipkey = _TRUE;
  156206. +
  156207. + }
  156208. + else if(strcmp(param->u.crypt.alg, "CCMP") == 0)
  156209. + {
  156210. + psecuritypriv->dot118021XGrpPrivacy = _AES_;
  156211. +
  156212. + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
  156213. + }
  156214. + else
  156215. + {
  156216. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  156217. + }
  156218. +
  156219. + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
  156220. +
  156221. + psecuritypriv->binstallGrpkey = _TRUE;
  156222. +
  156223. + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!
  156224. +
  156225. + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);
  156226. +
  156227. + pbcmc_sta=rtw_get_bcmc_stainfo(padapter);
  156228. + if(pbcmc_sta)
  156229. + {
  156230. + pbcmc_sta->ieee8021x_blocked = _FALSE;
  156231. + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy
  156232. + }
  156233. +
  156234. + }
  156235. +
  156236. + }
  156237. +
  156238. + }
  156239. +
  156240. +exit:
  156241. +
  156242. + if(pwep)
  156243. + {
  156244. + rtw_mfree((u8 *)pwep,wep_total_len);
  156245. + }
  156246. +
  156247. + return ret;
  156248. +
  156249. +}
  156250. +
  156251. +static int rtw_set_beacon(struct net_device *dev, struct ieee_param *param, int len)
  156252. +{
  156253. + int ret=0;
  156254. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156255. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156256. + struct sta_priv *pstapriv = &padapter->stapriv;
  156257. + unsigned char *pbuf = param->u.bcn_ie.buf;
  156258. +
  156259. +
  156260. + DBG_871X("%s, len=%d\n", __FUNCTION__, len);
  156261. +
  156262. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156263. + return -EINVAL;
  156264. +
  156265. + _rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2);
  156266. +
  156267. + if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0))
  156268. + pstapriv->max_num_sta = NUM_STA;
  156269. +
  156270. +
  156271. + if(rtw_check_beacon_data(padapter, pbuf, (len-12-2)) == _SUCCESS)// 12 = param header, 2:no packed
  156272. + ret = 0;
  156273. + else
  156274. + ret = -EINVAL;
  156275. +
  156276. +
  156277. + return ret;
  156278. +
  156279. +}
  156280. +
  156281. +static int rtw_hostapd_sta_flush(struct net_device *dev)
  156282. +{
  156283. + //_irqL irqL;
  156284. + //_list *phead, *plist;
  156285. + int ret=0;
  156286. + //struct sta_info *psta = NULL;
  156287. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156288. + //struct sta_priv *pstapriv = &padapter->stapriv;
  156289. +
  156290. + DBG_871X("%s\n", __FUNCTION__);
  156291. +
  156292. + flush_all_cam_entry(padapter); //clear CAM
  156293. +
  156294. + ret = rtw_sta_flush(padapter);
  156295. +
  156296. + return ret;
  156297. +
  156298. +}
  156299. +
  156300. +static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
  156301. +{
  156302. + _irqL irqL;
  156303. + int ret=0;
  156304. + struct sta_info *psta = NULL;
  156305. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156306. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156307. + struct sta_priv *pstapriv = &padapter->stapriv;
  156308. +
  156309. + DBG_871X("rtw_add_sta(aid=%d)=" MAC_FMT "\n", param->u.add_sta.aid, MAC_ARG(param->sta_addr));
  156310. +
  156311. + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)
  156312. + {
  156313. + return -EINVAL;
  156314. + }
  156315. +
  156316. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  156317. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  156318. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  156319. + {
  156320. + return -EINVAL;
  156321. + }
  156322. +
  156323. +/*
  156324. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  156325. + if(psta)
  156326. + {
  156327. + DBG_871X("rtw_add_sta(), free has been added psta=%p\n", psta);
  156328. + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  156329. + rtw_free_stainfo(padapter, psta);
  156330. + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  156331. +
  156332. + psta = NULL;
  156333. + }
  156334. +*/
  156335. + //psta = rtw_alloc_stainfo(pstapriv, param->sta_addr);
  156336. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  156337. + if(psta)
  156338. + {
  156339. + int flags = param->u.add_sta.flags;
  156340. +
  156341. + //DBG_871X("rtw_add_sta(), init sta's variables, psta=%p\n", psta);
  156342. +
  156343. + psta->aid = param->u.add_sta.aid;//aid=1~2007
  156344. +
  156345. + _rtw_memcpy(psta->bssrateset, param->u.add_sta.tx_supp_rates, 16);
  156346. +
  156347. +
  156348. + //check wmm cap.
  156349. + if(WLAN_STA_WME&flags)
  156350. + psta->qos_option = 1;
  156351. + else
  156352. + psta->qos_option = 0;
  156353. +
  156354. + if(pmlmepriv->qospriv.qos_option == 0)
  156355. + psta->qos_option = 0;
  156356. +
  156357. +
  156358. +#ifdef CONFIG_80211N_HT
  156359. + //chec 802.11n ht cap.
  156360. + if(WLAN_STA_HT&flags)
  156361. + {
  156362. + psta->htpriv.ht_option = _TRUE;
  156363. + psta->qos_option = 1;
  156364. + _rtw_memcpy((void*)&psta->htpriv.ht_cap, (void*)&param->u.add_sta.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));
  156365. + }
  156366. + else
  156367. + {
  156368. + psta->htpriv.ht_option = _FALSE;
  156369. + }
  156370. +
  156371. + if(pmlmepriv->htpriv.ht_option == _FALSE)
  156372. + psta->htpriv.ht_option = _FALSE;
  156373. +#endif
  156374. +
  156375. +
  156376. + update_sta_info_apmode(padapter, psta);
  156377. +
  156378. +
  156379. + }
  156380. + else
  156381. + {
  156382. + ret = -ENOMEM;
  156383. + }
  156384. +
  156385. + return ret;
  156386. +
  156387. +}
  156388. +
  156389. +static int rtw_del_sta(struct net_device *dev, struct ieee_param *param)
  156390. +{
  156391. + _irqL irqL;
  156392. + int ret=0;
  156393. + struct sta_info *psta = NULL;
  156394. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156395. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156396. + struct sta_priv *pstapriv = &padapter->stapriv;
  156397. +
  156398. + DBG_871X("rtw_del_sta=" MAC_FMT "\n", MAC_ARG(param->sta_addr));
  156399. +
  156400. + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)
  156401. + {
  156402. + return -EINVAL;
  156403. + }
  156404. +
  156405. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  156406. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  156407. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  156408. + {
  156409. + return -EINVAL;
  156410. + }
  156411. +
  156412. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  156413. + if(psta)
  156414. + {
  156415. + u8 updated=_FALSE;
  156416. +
  156417. + //DBG_871X("free psta=%p, aid=%d\n", psta, psta->aid);
  156418. +
  156419. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  156420. + if(rtw_is_list_empty(&psta->asoc_list)==_FALSE)
  156421. + {
  156422. + rtw_list_delete(&psta->asoc_list);
  156423. + pstapriv->asoc_list_cnt--;
  156424. + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);
  156425. +
  156426. + }
  156427. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  156428. +
  156429. + associated_clients_update(padapter, updated);
  156430. +
  156431. + psta = NULL;
  156432. +
  156433. + }
  156434. + else
  156435. + {
  156436. + DBG_871X("rtw_del_sta(), sta has already been removed or never been added\n");
  156437. +
  156438. + //ret = -1;
  156439. + }
  156440. +
  156441. +
  156442. + return ret;
  156443. +
  156444. +}
  156445. +
  156446. +static int rtw_ioctl_get_sta_data(struct net_device *dev, struct ieee_param *param, int len)
  156447. +{
  156448. + int ret=0;
  156449. + struct sta_info *psta = NULL;
  156450. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156451. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156452. + struct sta_priv *pstapriv = &padapter->stapriv;
  156453. + struct ieee_param_ex *param_ex = (struct ieee_param_ex *)param;
  156454. + struct sta_data *psta_data = (struct sta_data *)param_ex->data;
  156455. +
  156456. + DBG_871X("rtw_ioctl_get_sta_info, sta_addr: " MAC_FMT "\n", MAC_ARG(param_ex->sta_addr));
  156457. +
  156458. + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)
  156459. + {
  156460. + return -EINVAL;
  156461. + }
  156462. +
  156463. + if (param_ex->sta_addr[0] == 0xff && param_ex->sta_addr[1] == 0xff &&
  156464. + param_ex->sta_addr[2] == 0xff && param_ex->sta_addr[3] == 0xff &&
  156465. + param_ex->sta_addr[4] == 0xff && param_ex->sta_addr[5] == 0xff)
  156466. + {
  156467. + return -EINVAL;
  156468. + }
  156469. +
  156470. + psta = rtw_get_stainfo(pstapriv, param_ex->sta_addr);
  156471. + if(psta)
  156472. + {
  156473. +#if 0
  156474. + struct {
  156475. + u16 aid;
  156476. + u16 capability;
  156477. + int flags;
  156478. + u32 sta_set;
  156479. + u8 tx_supp_rates[16];
  156480. + u32 tx_supp_rates_len;
  156481. + struct rtw_ieee80211_ht_cap ht_cap;
  156482. + u64 rx_pkts;
  156483. + u64 rx_bytes;
  156484. + u64 rx_drops;
  156485. + u64 tx_pkts;
  156486. + u64 tx_bytes;
  156487. + u64 tx_drops;
  156488. + } get_sta;
  156489. +#endif
  156490. + psta_data->aid = (u16)psta->aid;
  156491. + psta_data->capability = psta->capability;
  156492. + psta_data->flags = psta->flags;
  156493. +
  156494. +/*
  156495. + nonerp_set : BIT(0)
  156496. + no_short_slot_time_set : BIT(1)
  156497. + no_short_preamble_set : BIT(2)
  156498. + no_ht_gf_set : BIT(3)
  156499. + no_ht_set : BIT(4)
  156500. + ht_20mhz_set : BIT(5)
  156501. +*/
  156502. +
  156503. + psta_data->sta_set =((psta->nonerp_set) |
  156504. + (psta->no_short_slot_time_set <<1) |
  156505. + (psta->no_short_preamble_set <<2) |
  156506. + (psta->no_ht_gf_set <<3) |
  156507. + (psta->no_ht_set <<4) |
  156508. + (psta->ht_20mhz_set <<5));
  156509. +
  156510. + psta_data->tx_supp_rates_len = psta->bssratelen;
  156511. + _rtw_memcpy(psta_data->tx_supp_rates, psta->bssrateset, psta->bssratelen);
  156512. +
  156513. + _rtw_memcpy(&psta_data->ht_cap, &psta->htpriv.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));
  156514. +
  156515. + psta_data->rx_pkts = psta->sta_stats.rx_data_pkts;
  156516. + psta_data->rx_bytes = psta->sta_stats.rx_bytes;
  156517. + psta_data->rx_drops = psta->sta_stats.rx_drops;
  156518. +
  156519. + psta_data->tx_pkts = psta->sta_stats.tx_pkts;
  156520. + psta_data->tx_bytes = psta->sta_stats.tx_bytes;
  156521. + psta_data->tx_drops = psta->sta_stats.tx_drops;
  156522. +
  156523. +
  156524. + }
  156525. + else
  156526. + {
  156527. + ret = -1;
  156528. + }
  156529. +
  156530. + return ret;
  156531. +
  156532. +}
  156533. +
  156534. +static int rtw_get_sta_wpaie(struct net_device *dev, struct ieee_param *param)
  156535. +{
  156536. + int ret=0;
  156537. + struct sta_info *psta = NULL;
  156538. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156539. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156540. + struct sta_priv *pstapriv = &padapter->stapriv;
  156541. +
  156542. + DBG_871X("rtw_get_sta_wpaie, sta_addr: " MAC_FMT "\n", MAC_ARG(param->sta_addr));
  156543. +
  156544. + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)
  156545. + {
  156546. + return -EINVAL;
  156547. + }
  156548. +
  156549. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  156550. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  156551. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  156552. + {
  156553. + return -EINVAL;
  156554. + }
  156555. +
  156556. + psta = rtw_get_stainfo(pstapriv, param->sta_addr);
  156557. + if(psta)
  156558. + {
  156559. + if((psta->wpa_ie[0] == WLAN_EID_RSN) || (psta->wpa_ie[0] == WLAN_EID_GENERIC))
  156560. + {
  156561. + int wpa_ie_len;
  156562. + int copy_len;
  156563. +
  156564. + wpa_ie_len = psta->wpa_ie[1];
  156565. +
  156566. + copy_len = ((wpa_ie_len+2) > sizeof(psta->wpa_ie)) ? (sizeof(psta->wpa_ie)):(wpa_ie_len+2);
  156567. +
  156568. + param->u.wpa_ie.len = copy_len;
  156569. +
  156570. + _rtw_memcpy(param->u.wpa_ie.reserved, psta->wpa_ie, copy_len);
  156571. + }
  156572. + else
  156573. + {
  156574. + //ret = -1;
  156575. + DBG_871X("sta's wpa_ie is NONE\n");
  156576. + }
  156577. + }
  156578. + else
  156579. + {
  156580. + ret = -1;
  156581. + }
  156582. +
  156583. + return ret;
  156584. +
  156585. +}
  156586. +
  156587. +static int rtw_set_wps_beacon(struct net_device *dev, struct ieee_param *param, int len)
  156588. +{
  156589. + int ret=0;
  156590. + unsigned char wps_oui[4]={0x0,0x50,0xf2,0x04};
  156591. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156592. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156593. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  156594. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  156595. + int ie_len;
  156596. +
  156597. + DBG_871X("%s, len=%d\n", __FUNCTION__, len);
  156598. +
  156599. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156600. + return -EINVAL;
  156601. +
  156602. + ie_len = len-12-2;// 12 = param header, 2:no packed
  156603. +
  156604. +
  156605. + if(pmlmepriv->wps_beacon_ie)
  156606. + {
  156607. + rtw_mfree(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);
  156608. + pmlmepriv->wps_beacon_ie = NULL;
  156609. + }
  156610. +
  156611. + if(ie_len>0)
  156612. + {
  156613. + pmlmepriv->wps_beacon_ie = rtw_malloc(ie_len);
  156614. + pmlmepriv->wps_beacon_ie_len = ie_len;
  156615. + if ( pmlmepriv->wps_beacon_ie == NULL) {
  156616. + DBG_871X("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  156617. + return -EINVAL;
  156618. + }
  156619. +
  156620. + _rtw_memcpy(pmlmepriv->wps_beacon_ie, param->u.bcn_ie.buf, ie_len);
  156621. +
  156622. + update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE);
  156623. +
  156624. + pmlmeext->bstart_bss = _TRUE;
  156625. +
  156626. + }
  156627. +
  156628. +
  156629. + return ret;
  156630. +
  156631. +}
  156632. +
  156633. +static int rtw_set_wps_probe_resp(struct net_device *dev, struct ieee_param *param, int len)
  156634. +{
  156635. + int ret=0;
  156636. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156637. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156638. + int ie_len;
  156639. +
  156640. + DBG_871X("%s, len=%d\n", __FUNCTION__, len);
  156641. +
  156642. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156643. + return -EINVAL;
  156644. +
  156645. + ie_len = len-12-2;// 12 = param header, 2:no packed
  156646. +
  156647. +
  156648. + if(pmlmepriv->wps_probe_resp_ie)
  156649. + {
  156650. + rtw_mfree(pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);
  156651. + pmlmepriv->wps_probe_resp_ie = NULL;
  156652. + }
  156653. +
  156654. + if(ie_len>0)
  156655. + {
  156656. + pmlmepriv->wps_probe_resp_ie = rtw_malloc(ie_len);
  156657. + pmlmepriv->wps_probe_resp_ie_len = ie_len;
  156658. + if ( pmlmepriv->wps_probe_resp_ie == NULL) {
  156659. + DBG_871X("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  156660. + return -EINVAL;
  156661. + }
  156662. + _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, param->u.bcn_ie.buf, ie_len);
  156663. + }
  156664. +
  156665. +
  156666. + return ret;
  156667. +
  156668. +}
  156669. +
  156670. +static int rtw_set_wps_assoc_resp(struct net_device *dev, struct ieee_param *param, int len)
  156671. +{
  156672. + int ret=0;
  156673. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156674. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156675. + int ie_len;
  156676. +
  156677. + DBG_871X("%s, len=%d\n", __FUNCTION__, len);
  156678. +
  156679. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156680. + return -EINVAL;
  156681. +
  156682. + ie_len = len-12-2;// 12 = param header, 2:no packed
  156683. +
  156684. +
  156685. + if(pmlmepriv->wps_assoc_resp_ie)
  156686. + {
  156687. + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len);
  156688. + pmlmepriv->wps_assoc_resp_ie = NULL;
  156689. + }
  156690. +
  156691. + if(ie_len>0)
  156692. + {
  156693. + pmlmepriv->wps_assoc_resp_ie = rtw_malloc(ie_len);
  156694. + pmlmepriv->wps_assoc_resp_ie_len = ie_len;
  156695. + if ( pmlmepriv->wps_assoc_resp_ie == NULL) {
  156696. + DBG_871X("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  156697. + return -EINVAL;
  156698. + }
  156699. +
  156700. + _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, param->u.bcn_ie.buf, ie_len);
  156701. + }
  156702. +
  156703. +
  156704. + return ret;
  156705. +
  156706. +}
  156707. +
  156708. +static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param, int len)
  156709. +{
  156710. + int ret=0;
  156711. + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  156712. + struct mlme_priv *mlmepriv = &(adapter->mlmepriv);
  156713. + struct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);
  156714. + struct mlme_ext_info *mlmeinfo = &(mlmeext->mlmext_info);
  156715. + int ie_len;
  156716. + u8 *ssid_ie;
  156717. + char ssid[NDIS_802_11_LENGTH_SSID + 1];
  156718. + sint ssid_len;
  156719. + u8 ignore_broadcast_ssid;
  156720. +
  156721. + if(check_fwstate(mlmepriv, WIFI_AP_STATE) != _TRUE)
  156722. + return -EPERM;
  156723. +
  156724. + if (param->u.bcn_ie.reserved[0] != 0xea)
  156725. + return -EINVAL;
  156726. +
  156727. + mlmeinfo->hidden_ssid_mode = ignore_broadcast_ssid = param->u.bcn_ie.reserved[1];
  156728. +
  156729. + ie_len = len-12-2;// 12 = param header, 2:no packed
  156730. + ssid_ie = rtw_get_ie(param->u.bcn_ie.buf, WLAN_EID_SSID, &ssid_len, ie_len);
  156731. +
  156732. + if (ssid_ie && ssid_len) {
  156733. + WLAN_BSSID_EX *pbss_network = &mlmepriv->cur_network.network;
  156734. + WLAN_BSSID_EX *pbss_network_ext = &mlmeinfo->network;
  156735. +
  156736. + _rtw_memcpy(ssid, ssid_ie+2, ssid_len);
  156737. + ssid[ssid_len>NDIS_802_11_LENGTH_SSID?NDIS_802_11_LENGTH_SSID:ssid_len] = 0x0;
  156738. +
  156739. + if(0)
  156740. + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
  156741. + ssid, ssid_len,
  156742. + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
  156743. + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
  156744. +
  156745. + _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)ssid, ssid_len);
  156746. + pbss_network->Ssid.SsidLength = ssid_len;
  156747. + _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)ssid, ssid_len);
  156748. + pbss_network_ext->Ssid.SsidLength = ssid_len;
  156749. +
  156750. + if(0)
  156751. + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
  156752. + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
  156753. + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
  156754. + }
  156755. +
  156756. + DBG_871X(FUNC_ADPT_FMT" ignore_broadcast_ssid:%d, %s,%d\n", FUNC_ADPT_ARG(adapter),
  156757. + ignore_broadcast_ssid, ssid, ssid_len);
  156758. +
  156759. + return ret;
  156760. +}
  156761. +
  156762. +static int rtw_ioctl_acl_remove_sta(struct net_device *dev, struct ieee_param *param, int len)
  156763. +{
  156764. + int ret=0;
  156765. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156766. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156767. +
  156768. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156769. + return -EINVAL;
  156770. +
  156771. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  156772. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  156773. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  156774. + {
  156775. + return -EINVAL;
  156776. + }
  156777. +
  156778. + ret = rtw_acl_remove_sta(padapter, param->sta_addr);
  156779. +
  156780. + return ret;
  156781. +
  156782. +}
  156783. +
  156784. +static int rtw_ioctl_acl_add_sta(struct net_device *dev, struct ieee_param *param, int len)
  156785. +{
  156786. + int ret=0;
  156787. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156788. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156789. +
  156790. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156791. + return -EINVAL;
  156792. +
  156793. + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
  156794. + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
  156795. + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff)
  156796. + {
  156797. + return -EINVAL;
  156798. + }
  156799. +
  156800. + ret = rtw_acl_add_sta(padapter, param->sta_addr);
  156801. +
  156802. + return ret;
  156803. +
  156804. +}
  156805. +
  156806. +static int rtw_ioctl_set_macaddr_acl(struct net_device *dev, struct ieee_param *param, int len)
  156807. +{
  156808. + int ret=0;
  156809. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156810. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  156811. +
  156812. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
  156813. + return -EINVAL;
  156814. +
  156815. + rtw_set_macaddr_acl(padapter, param->u.mlme.command);
  156816. +
  156817. + return ret;
  156818. +}
  156819. +
  156820. +static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p)
  156821. +{
  156822. + struct ieee_param *param;
  156823. + int ret=0;
  156824. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156825. +
  156826. + //DBG_871X("%s\n", __FUNCTION__);
  156827. +
  156828. + /*
  156829. + * this function is expect to call in master mode, which allows no power saving
  156830. + * so, we just check hw_init_completed instead of call rfpwrstate_check()
  156831. + */
  156832. +
  156833. + if (padapter->hw_init_completed==_FALSE){
  156834. + ret = -EPERM;
  156835. + goto out;
  156836. + }
  156837. +
  156838. +
  156839. + //if (p->length < sizeof(struct ieee_param) || !p->pointer){
  156840. + if(!p->pointer){
  156841. + ret = -EINVAL;
  156842. + goto out;
  156843. + }
  156844. +
  156845. + param = (struct ieee_param *)rtw_malloc(p->length);
  156846. + if (param == NULL)
  156847. + {
  156848. + ret = -ENOMEM;
  156849. + goto out;
  156850. + }
  156851. +
  156852. + if (copy_from_user(param, p->pointer, p->length))
  156853. + {
  156854. + rtw_mfree((u8*)param, p->length);
  156855. + ret = -EFAULT;
  156856. + goto out;
  156857. + }
  156858. +
  156859. + //DBG_871X("%s, cmd=%d\n", __FUNCTION__, param->cmd);
  156860. +
  156861. + switch (param->cmd)
  156862. + {
  156863. + case RTL871X_HOSTAPD_FLUSH:
  156864. +
  156865. + ret = rtw_hostapd_sta_flush(dev);
  156866. +
  156867. + break;
  156868. +
  156869. + case RTL871X_HOSTAPD_ADD_STA:
  156870. +
  156871. + ret = rtw_add_sta(dev, param);
  156872. +
  156873. + break;
  156874. +
  156875. + case RTL871X_HOSTAPD_REMOVE_STA:
  156876. +
  156877. + ret = rtw_del_sta(dev, param);
  156878. +
  156879. + break;
  156880. +
  156881. + case RTL871X_HOSTAPD_SET_BEACON:
  156882. +
  156883. + ret = rtw_set_beacon(dev, param, p->length);
  156884. +
  156885. + break;
  156886. +
  156887. + case RTL871X_SET_ENCRYPTION:
  156888. +
  156889. + ret = rtw_set_encryption(dev, param, p->length);
  156890. +
  156891. + break;
  156892. +
  156893. + case RTL871X_HOSTAPD_GET_WPAIE_STA:
  156894. +
  156895. + ret = rtw_get_sta_wpaie(dev, param);
  156896. +
  156897. + break;
  156898. +
  156899. + case RTL871X_HOSTAPD_SET_WPS_BEACON:
  156900. +
  156901. + ret = rtw_set_wps_beacon(dev, param, p->length);
  156902. +
  156903. + break;
  156904. +
  156905. + case RTL871X_HOSTAPD_SET_WPS_PROBE_RESP:
  156906. +
  156907. + ret = rtw_set_wps_probe_resp(dev, param, p->length);
  156908. +
  156909. + break;
  156910. +
  156911. + case RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP:
  156912. +
  156913. + ret = rtw_set_wps_assoc_resp(dev, param, p->length);
  156914. +
  156915. + break;
  156916. +
  156917. + case RTL871X_HOSTAPD_SET_HIDDEN_SSID:
  156918. +
  156919. + ret = rtw_set_hidden_ssid(dev, param, p->length);
  156920. +
  156921. + break;
  156922. +
  156923. + case RTL871X_HOSTAPD_GET_INFO_STA:
  156924. +
  156925. + ret = rtw_ioctl_get_sta_data(dev, param, p->length);
  156926. +
  156927. + break;
  156928. +
  156929. + case RTL871X_HOSTAPD_SET_MACADDR_ACL:
  156930. +
  156931. + ret = rtw_ioctl_set_macaddr_acl(dev, param, p->length);
  156932. +
  156933. + break;
  156934. +
  156935. + case RTL871X_HOSTAPD_ACL_ADD_STA:
  156936. +
  156937. + ret = rtw_ioctl_acl_add_sta(dev, param, p->length);
  156938. +
  156939. + break;
  156940. +
  156941. + case RTL871X_HOSTAPD_ACL_REMOVE_STA:
  156942. +
  156943. + ret = rtw_ioctl_acl_remove_sta(dev, param, p->length);
  156944. +
  156945. + break;
  156946. +
  156947. + default:
  156948. + DBG_871X("Unknown hostapd request: %d\n", param->cmd);
  156949. + ret = -EOPNOTSUPP;
  156950. + break;
  156951. +
  156952. + }
  156953. +
  156954. + if (ret == 0 && copy_to_user(p->pointer, param, p->length))
  156955. + ret = -EFAULT;
  156956. +
  156957. +
  156958. + rtw_mfree((u8 *)param, p->length);
  156959. +
  156960. +out:
  156961. +
  156962. + return ret;
  156963. +
  156964. +}
  156965. +#endif
  156966. +
  156967. +#include <rtw_android.h>
  156968. +static int rtw_wx_set_priv(struct net_device *dev,
  156969. + struct iw_request_info *info,
  156970. + union iwreq_data *awrq,
  156971. + char *extra)
  156972. +{
  156973. +
  156974. +#ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV
  156975. + char *ext_dbg;
  156976. +#endif
  156977. +
  156978. + int ret = 0;
  156979. + int len = 0;
  156980. + char *ext;
  156981. + int i;
  156982. +
  156983. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  156984. + struct iw_point *dwrq = (struct iw_point*)awrq;
  156985. +
  156986. + //RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_, ("+rtw_wx_set_priv\n"));
  156987. + if(dwrq->length == 0)
  156988. + return -EFAULT;
  156989. + len = dwrq->length;
  156990. + if (!(ext = rtw_vmalloc(len)))
  156991. + return -ENOMEM;
  156992. +
  156993. + if (copy_from_user(ext, dwrq->pointer, len)) {
  156994. + rtw_vmfree(ext, len);
  156995. + return -EFAULT;
  156996. + }
  156997. +
  156998. +
  156999. + //RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_,
  157000. + // ("rtw_wx_set_priv: %s req=%s\n",
  157001. + // dev->name, ext));
  157002. +
  157003. + #ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV
  157004. + if (!(ext_dbg = rtw_vmalloc(len)))
  157005. + {
  157006. + rtw_vmfree(ext, len);
  157007. + return -ENOMEM;
  157008. + }
  157009. +
  157010. + _rtw_memcpy(ext_dbg, ext, len);
  157011. + #endif
  157012. +
  157013. + //added for wps2.0 @20110524
  157014. + if(dwrq->flags == 0x8766 && len > 8)
  157015. + {
  157016. + u32 cp_sz;
  157017. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  157018. + u8 *probereq_wpsie = ext;
  157019. + int probereq_wpsie_len = len;
  157020. + u8 wps_oui[4]={0x0,0x50,0xf2,0x04};
  157021. +
  157022. + if((_VENDOR_SPECIFIC_IE_ == probereq_wpsie[0]) &&
  157023. + (_rtw_memcmp(&probereq_wpsie[2], wps_oui, 4) ==_TRUE))
  157024. + {
  157025. + cp_sz = probereq_wpsie_len>MAX_WPS_IE_LEN ? MAX_WPS_IE_LEN:probereq_wpsie_len;
  157026. +
  157027. + //_rtw_memcpy(pmlmepriv->probereq_wpsie, probereq_wpsie, cp_sz);
  157028. + //pmlmepriv->probereq_wpsie_len = cp_sz;
  157029. +
  157030. + printk("probe_req_wps_ielen=%d\n", cp_sz);
  157031. +
  157032. + if(pmlmepriv->wps_probe_req_ie)
  157033. + {
  157034. + u32 free_len = pmlmepriv->wps_probe_req_ie_len;
  157035. + pmlmepriv->wps_probe_req_ie_len = 0;
  157036. + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);
  157037. + pmlmepriv->wps_probe_req_ie = NULL;
  157038. + }
  157039. +
  157040. + pmlmepriv->wps_probe_req_ie = rtw_malloc(cp_sz);
  157041. + if ( pmlmepriv->wps_probe_req_ie == NULL) {
  157042. + printk("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__);
  157043. + ret = -EINVAL;
  157044. + goto FREE_EXT;
  157045. +
  157046. + }
  157047. +
  157048. + _rtw_memcpy(pmlmepriv->wps_probe_req_ie, probereq_wpsie, cp_sz);
  157049. + pmlmepriv->wps_probe_req_ie_len = cp_sz;
  157050. +
  157051. + }
  157052. +
  157053. + goto FREE_EXT;
  157054. +
  157055. + }
  157056. +
  157057. + if( len >= WEXT_CSCAN_HEADER_SIZE
  157058. + && _rtw_memcmp(ext, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE) == _TRUE
  157059. + ){
  157060. + ret = rtw_wx_set_scan(dev, info, awrq, ext);
  157061. + goto FREE_EXT;
  157062. + }
  157063. +
  157064. +#ifdef CONFIG_ANDROID
  157065. + //DBG_871X("rtw_wx_set_priv: %s req=%s\n", dev->name, ext);
  157066. +
  157067. + i = rtw_android_cmdstr_to_num(ext);
  157068. +
  157069. + switch(i) {
  157070. + case ANDROID_WIFI_CMD_START :
  157071. + indicate_wx_custom_event(padapter, "START");
  157072. + break;
  157073. + case ANDROID_WIFI_CMD_STOP :
  157074. + indicate_wx_custom_event(padapter, "STOP");
  157075. + break;
  157076. + case ANDROID_WIFI_CMD_RSSI :
  157077. + {
  157078. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  157079. + struct wlan_network *pcur_network = &pmlmepriv->cur_network;
  157080. +
  157081. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  157082. + sprintf(ext, "%s rssi %d", pcur_network->network.Ssid.Ssid, padapter->recvpriv.rssi);
  157083. + } else {
  157084. + sprintf(ext, "OK");
  157085. + }
  157086. + }
  157087. + break;
  157088. + case ANDROID_WIFI_CMD_LINKSPEED :
  157089. + {
  157090. + u16 mbps = rtw_get_cur_max_rate(padapter)/10;
  157091. + sprintf(ext, "LINKSPEED %d", mbps);
  157092. + }
  157093. + break;
  157094. + case ANDROID_WIFI_CMD_MACADDR :
  157095. + sprintf(ext, "MACADDR = " MAC_FMT, MAC_ARG(dev->dev_addr));
  157096. + break;
  157097. + case ANDROID_WIFI_CMD_SCAN_ACTIVE :
  157098. + {
  157099. + //rtw_set_scan_mode(padapter, SCAN_ACTIVE);
  157100. + sprintf(ext, "OK");
  157101. + }
  157102. + break;
  157103. + case ANDROID_WIFI_CMD_SCAN_PASSIVE :
  157104. + {
  157105. + //rtw_set_scan_mode(padapter, SCAN_PASSIVE);
  157106. + sprintf(ext, "OK");
  157107. + }
  157108. + break;
  157109. +
  157110. + case ANDROID_WIFI_CMD_COUNTRY :
  157111. + {
  157112. + char country_code[10];
  157113. + sscanf(ext, "%*s %s", country_code);
  157114. + rtw_set_country(padapter, country_code);
  157115. + sprintf(ext, "OK");
  157116. + }
  157117. + break;
  157118. + default :
  157119. + #ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV
  157120. + DBG_871X("%s: %s unknowned req=%s\n", __FUNCTION__,
  157121. + dev->name, ext_dbg);
  157122. + #endif
  157123. +
  157124. + sprintf(ext, "OK");
  157125. +
  157126. + }
  157127. +
  157128. + if (copy_to_user(dwrq->pointer, ext, min(dwrq->length, (u16)(strlen(ext)+1)) ) )
  157129. + ret = -EFAULT;
  157130. +
  157131. + #ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV
  157132. + DBG_871X("%s: %s req=%s rep=%s dwrq->length=%d, strlen(ext)+1=%d\n", __FUNCTION__,
  157133. + dev->name, ext_dbg ,ext, dwrq->length, (u16)(strlen(ext)+1));
  157134. + #endif
  157135. +#endif //end of CONFIG_ANDROID
  157136. +
  157137. +
  157138. +FREE_EXT:
  157139. +
  157140. + rtw_vmfree(ext, len);
  157141. + #ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV
  157142. + rtw_vmfree(ext_dbg, len);
  157143. + #endif
  157144. +
  157145. + //DBG_871X("rtw_wx_set_priv: (SIOCSIWPRIV) %s ret=%d\n",
  157146. + // dev->name, ret);
  157147. +
  157148. + return ret;
  157149. +
  157150. +}
  157151. +
  157152. +static int rtw_mp_efuse_get(struct net_device *dev,
  157153. + struct iw_request_info *info,
  157154. + union iwreq_data *wdata, char *extra)
  157155. +{
  157156. + struct iw_point *wrqu = (struct iw_point *)wdata;
  157157. + PADAPTER padapter = rtw_netdev_priv(dev);
  157158. + struct mp_priv *pmp_priv;
  157159. +
  157160. + int i,j =0;
  157161. + u8 data[EFUSE_MAP_SIZE];
  157162. + u8 rawdata[EFUSE_MAX_SIZE];
  157163. + u16 mapLen=0;
  157164. + char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};
  157165. + u16 addr = 0, cnts = 0, max_available_size = 0,raw_cursize = 0 ,raw_maxsize = 0;
  157166. +
  157167. + _rtw_memset(data, '\0', sizeof(data));
  157168. + _rtw_memset(rawdata, '\0', sizeof(rawdata));
  157169. +
  157170. + if (copy_from_user(extra, wrqu->pointer, wrqu->length))
  157171. + return -EFAULT;
  157172. +
  157173. + pch = extra;
  157174. + DBG_871X("%s: in=%s\n", __func__, extra);
  157175. +
  157176. + i=0;
  157177. + //mac 16 "00e04c871200" rmap,00,2
  157178. + while ( (token = strsep (&pch,",") )!=NULL )
  157179. + {
  157180. + if(i>2) break;
  157181. + tmp[i] = token;
  157182. + i++;
  157183. + }
  157184. +
  157185. + if ( strcmp(tmp[0],"realmap") == 0 ) {
  157186. +
  157187. + DBG_871X("strcmp OK = %s \n" ,tmp[0]);
  157188. +
  157189. + mapLen = EFUSE_MAP_SIZE;
  157190. +
  157191. + if (rtw_efuse_map_read(padapter, 0, mapLen, data) == _SUCCESS){
  157192. + DBG_871X("\t rtw_efuse_map_read \n");
  157193. + }else {
  157194. + DBG_871X("\t rtw_efuse_map_read : Fail \n");
  157195. + return -EFAULT;
  157196. + }
  157197. + _rtw_memset(extra, '\0', sizeof(extra));
  157198. + DBG_871X("\tOFFSET\tVALUE(hex)\n");
  157199. + sprintf(extra, "%s \n", extra);
  157200. + for ( i = 0; i < EFUSE_MAP_SIZE; i += 16 )
  157201. + {
  157202. + DBG_871X("\t0x%02x\t", i);
  157203. + sprintf(extra, "%s \t0x%02x\t", extra,i);
  157204. + for (j = 0; j < 8; j++)
  157205. + {
  157206. + DBG_871X("%02X ", data[i+j]);
  157207. + sprintf(extra, "%s %02X", extra, data[i+j]);
  157208. + }
  157209. + DBG_871X("\t");
  157210. + sprintf(extra,"%s\t",extra);
  157211. + for (; j < 16; j++){
  157212. + DBG_871X("%02X ", data[i+j]);
  157213. + sprintf(extra, "%s %02X", extra, data[i+j]);
  157214. + }
  157215. + DBG_871X("\n");
  157216. + sprintf(extra,"%s\n",extra);
  157217. + }
  157218. + DBG_871X("\n");
  157219. + wrqu->length = strlen(extra);
  157220. +
  157221. + return 0;
  157222. + }
  157223. + else if ( strcmp(tmp[0],"rmap") == 0 ) {
  157224. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157225. + // rmap addr cnts
  157226. + addr = simple_strtoul(tmp[1], &ptmp, 16);
  157227. +
  157228. + DBG_871X("addr = %x \n" ,addr);
  157229. +
  157230. + cnts=simple_strtoul(tmp[2], &ptmp,10);
  157231. + if(cnts==0) return -EINVAL;
  157232. +
  157233. + DBG_871X("cnts = %d \n" ,cnts);
  157234. + //_rtw_memset(extra, '\0', wrqu->data.length);
  157235. +
  157236. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157237. + if ((addr + cnts) > max_available_size) {
  157238. + DBG_871X("(addr + cnts parameter error \n");
  157239. + return -EFAULT;
  157240. + }
  157241. +
  157242. + if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
  157243. + {
  157244. + DBG_871X("rtw_efuse_access error \n");
  157245. + }
  157246. + else{
  157247. + DBG_871X("rtw_efuse_access ok \n");
  157248. + }
  157249. +
  157250. + _rtw_memset(extra, '\0', sizeof(extra));
  157251. + for ( i = 0; i < cnts; i ++) {
  157252. + DBG_871X("0x%02x", data[i]);
  157253. + sprintf(extra, "%s 0x%02X", extra, data[i]);
  157254. + DBG_871X(" ");
  157255. + sprintf(extra,"%s ",extra);
  157256. + }
  157257. +
  157258. + wrqu->length = strlen(extra)+1;
  157259. +
  157260. + DBG_871X("extra = %s ", extra);
  157261. +
  157262. + return 0;
  157263. + }
  157264. + else if ( strcmp(tmp[0],"realraw") == 0 ) {
  157265. + addr=0;
  157266. + mapLen = EFUSE_MAX_SIZE;
  157267. +
  157268. + if (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL)
  157269. + {
  157270. + DBG_871X("\t rtw_efuse_map_read : Fail \n");
  157271. + return -EFAULT;
  157272. + } else
  157273. + {
  157274. + DBG_871X("\t rtw_efuse_access raw ok \n");
  157275. + }
  157276. +
  157277. + _rtw_memset(extra, '\0', sizeof(extra));
  157278. + for ( i=0; i<mapLen; i++ ) {
  157279. + DBG_871X(" %02x", rawdata[i]);
  157280. + sprintf(extra, "%s %02x", extra, rawdata[i] );
  157281. +
  157282. + if ((i & 0xF) == 0xF){
  157283. + DBG_871X("\n\t");
  157284. + sprintf(extra, "%s\n\t", extra);
  157285. + }
  157286. + else if ((i & 0x7) == 0x7){
  157287. + DBG_871X("\t");
  157288. + sprintf(extra, "%s\t", extra);
  157289. + }
  157290. + }
  157291. + wrqu->length = strlen(extra);
  157292. + return 0;
  157293. + }
  157294. + else if ( strcmp(tmp[0],"mac") == 0 ) {
  157295. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157296. + #ifdef CONFIG_RTL8192C
  157297. + addr = 0x16;
  157298. + cnts = 6;
  157299. + #endif
  157300. + #ifdef CONFIG_RTL8192D
  157301. + addr = 0x19;
  157302. + cnts = 6;
  157303. + #endif
  157304. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157305. + if ((addr + mapLen) > max_available_size) {
  157306. + DBG_871X("(addr + cnts parameter error \n");
  157307. + return -EFAULT;
  157308. + }
  157309. + if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
  157310. + {
  157311. + DBG_871X("rtw_efuse_access error \n");
  157312. + }
  157313. + else{
  157314. + DBG_871X("rtw_efuse_access ok \n");
  157315. + }
  157316. + _rtw_memset(extra, '\0', sizeof(extra));
  157317. + for ( i = 0; i < cnts; i ++) {
  157318. + DBG_871X("0x%02x", data[i]);
  157319. + sprintf(extra, "%s 0x%02X", extra, data[i+j]);
  157320. + DBG_871X(" ");
  157321. + sprintf(extra,"%s ",extra);
  157322. + }
  157323. + wrqu->length = strlen(extra);
  157324. + return 0;
  157325. + }
  157326. + else if ( strcmp(tmp[0],"vidpid") == 0 ) {
  157327. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157328. + #ifdef CONFIG_RTL8192C
  157329. + addr=0x0a;
  157330. + #endif
  157331. + #ifdef CONFIG_RTL8192D
  157332. + addr = 0x0c;
  157333. + #endif
  157334. + cnts = 4;
  157335. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157336. + if ((addr + mapLen) > max_available_size) {
  157337. + DBG_871X("(addr + cnts parameter error \n");
  157338. + return -EFAULT;
  157339. + }
  157340. + if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
  157341. + {
  157342. + DBG_871X("rtw_efuse_access error \n");
  157343. + }
  157344. + else{
  157345. + DBG_871X("rtw_efuse_access ok \n");
  157346. + }
  157347. + _rtw_memset(extra, '\0', sizeof(extra));
  157348. + for ( i = 0; i < cnts; i ++) {
  157349. + DBG_871X("0x%02x", data[i]);
  157350. + sprintf(extra, "%s 0x%02X", extra, data[i+j]);
  157351. + DBG_871X(" ");
  157352. + sprintf(extra,"%s ",extra);
  157353. + }
  157354. + wrqu->length = strlen(extra);
  157355. + return 0;
  157356. + }
  157357. + else if ( strcmp(tmp[0],"ableraw") == 0 ) {
  157358. + efuse_GetCurrentSize(padapter,&raw_cursize);
  157359. + raw_maxsize = efuse_GetMaxSize(padapter);
  157360. + sprintf(extra, "%s : [ available raw size] = %d",extra,raw_maxsize-raw_cursize);
  157361. + wrqu->length = strlen(extra);
  157362. +
  157363. + return 0;
  157364. + }else
  157365. + {
  157366. + sprintf(extra, "%s : Command not found\n",extra);
  157367. + wrqu->length = strlen(extra);
  157368. + return 0;
  157369. + }
  157370. +
  157371. + return 0;
  157372. +}
  157373. +
  157374. +static int rtw_mp_efuse_set(struct net_device *dev,
  157375. + struct iw_request_info *info,
  157376. + union iwreq_data *wdata, char *extra)
  157377. +{
  157378. + struct iw_point *wrqu = (struct iw_point *)wdata;
  157379. + PADAPTER padapter = rtw_netdev_priv(dev);
  157380. +
  157381. + u8 buffer[40];
  157382. + u32 i,jj,kk;
  157383. + u8 setdata[EFUSE_MAP_SIZE];
  157384. + u8 setrawdata[EFUSE_MAX_SIZE];
  157385. + char *pch, *ptmp, *token, *edata,*tmp[3]={0x00,0x00,0x00};
  157386. +
  157387. + u16 addr = 0, max_available_size = 0;
  157388. + u32 cnts = 0;
  157389. +
  157390. + pch = extra;
  157391. + DBG_871X("%s: in=%s\n", __func__, extra);
  157392. +
  157393. + i=0;
  157394. + while ( (token = strsep (&pch,",") )!=NULL )
  157395. + {
  157396. + if(i>2) break;
  157397. + tmp[i] = token;
  157398. + i++;
  157399. + }
  157400. +
  157401. + // tmp[0],[1],[2]
  157402. + // wmap,addr,00e04c871200
  157403. + if ( strcmp(tmp[0],"wmap") == 0 ) {
  157404. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157405. + if ( ! strlen( tmp[2] )/2 > 1 ) return -EFAULT;
  157406. +
  157407. + addr = simple_strtoul( tmp[1], &ptmp, 16 );
  157408. + addr = addr & 0xFF;
  157409. + DBG_871X("addr = %x \n" ,addr);
  157410. +
  157411. + cnts = strlen( tmp[2] )/2;
  157412. + if ( cnts == 0) return -EFAULT;
  157413. +
  157414. + DBG_871X("cnts = %d \n" ,cnts);
  157415. + DBG_871X("target data = %s \n" ,tmp[2]);
  157416. +
  157417. + for( jj = 0, kk = 0; jj < cnts; jj++, kk += 2 )
  157418. + {
  157419. + setdata[jj] = key_2char2num( tmp[2][kk], tmp[2][kk+ 1] );
  157420. + }
  157421. +
  157422. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157423. +
  157424. + if ((addr + cnts) > max_available_size) {
  157425. + DBG_871X("parameter error \n");
  157426. + return -EFAULT;
  157427. + }
  157428. + if (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL) {
  157429. + DBG_871X("rtw_efuse_map_write error \n");
  157430. + return -EFAULT;
  157431. + } else
  157432. + DBG_871X("rtw_efuse_map_write ok \n");
  157433. +
  157434. + return 0;
  157435. + }
  157436. + else if ( strcmp(tmp[0],"wraw") == 0 ) {
  157437. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157438. + if ( ! strlen( tmp[2] )/2 > 1 ) return -EFAULT;
  157439. + addr = simple_strtoul( tmp[1], &ptmp, 16 );
  157440. + addr = addr & 0xFF;
  157441. + DBG_871X("addr = %x \n" ,addr);
  157442. +
  157443. + cnts=strlen( tmp[2] )/2;
  157444. + if ( cnts == 0) return -EFAULT;
  157445. +
  157446. + DBG_871X(" cnts = %d \n" ,cnts );
  157447. + DBG_871X("target data = %s \n" ,tmp[2] );
  157448. +
  157449. + for( jj = 0, kk = 0; jj < cnts; jj++, kk += 2 )
  157450. + {
  157451. + setrawdata[jj] = key_2char2num( tmp[2][kk], tmp[2][kk+ 1] );
  157452. + }
  157453. +
  157454. + if ( rtw_efuse_access( padapter, _TRUE, addr, cnts, setrawdata ) == _FAIL ){
  157455. + DBG_871X("\t rtw_efuse_map_read : Fail \n");
  157456. + return -EFAULT;
  157457. + } else
  157458. + DBG_871X("\t rtw_efuse_access raw ok \n");
  157459. +
  157460. + return 0;
  157461. + }
  157462. + else if ( strcmp(tmp[0],"mac") == 0 ) {
  157463. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157464. + //mac,00e04c871200
  157465. + #ifdef CONFIG_RTL8192C
  157466. + addr = 0x16;
  157467. + #endif
  157468. + #ifdef CONFIG_RTL8192D
  157469. + addr = 0x19;
  157470. + #endif
  157471. + cnts = strlen( tmp[1] )/2;
  157472. + if ( cnts == 0) return -EFAULT;
  157473. + if ( cnts > 6 ){
  157474. + DBG_871X("error data for mac addr = %s \n" ,tmp[1]);
  157475. + return -EFAULT;
  157476. + }
  157477. +
  157478. + DBG_871X("target data = %s \n" ,tmp[1]);
  157479. +
  157480. + for( jj = 0, kk = 0; jj < cnts; jj++, kk += 2 )
  157481. + {
  157482. + setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+ 1]);
  157483. + }
  157484. +
  157485. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157486. +
  157487. + if ((addr + cnts) > max_available_size) {
  157488. + DBG_871X("parameter error \n");
  157489. + return -EFAULT;
  157490. + }
  157491. + if ( rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL ) {
  157492. + DBG_871X("rtw_efuse_map_write error \n");
  157493. + return -EFAULT;
  157494. + } else
  157495. + DBG_871X("rtw_efuse_map_write ok \n");
  157496. +
  157497. + return 0;
  157498. + }
  157499. + else if ( strcmp(tmp[0],"vidpid") == 0 ) {
  157500. + if ( tmp[1]==NULL || tmp[2]==NULL ) return -EINVAL;
  157501. + // pidvid,da0b7881
  157502. + #ifdef CONFIG_RTL8192C
  157503. + addr=0x0a;
  157504. + #endif
  157505. + #ifdef CONFIG_RTL8192D
  157506. + addr = 0x0c;
  157507. + #endif
  157508. +
  157509. + cnts=strlen( tmp[1] )/2;
  157510. + if ( cnts == 0) return -EFAULT;
  157511. + DBG_871X("target data = %s \n" ,tmp[1]);
  157512. +
  157513. + for( jj = 0, kk = 0; jj < cnts; jj++, kk += 2 )
  157514. + {
  157515. + setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+ 1]);
  157516. + }
  157517. +
  157518. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  157519. +
  157520. + if ((addr + cnts) > max_available_size) {
  157521. + DBG_871X("parameter error \n");
  157522. + return -EFAULT;
  157523. + }
  157524. +
  157525. + if ( rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL ) {
  157526. + DBG_871X("rtw_efuse_map_write error \n");
  157527. + return -EFAULT;
  157528. + } else
  157529. + DBG_871X("rtw_efuse_map_write ok \n");
  157530. +
  157531. + return 0;
  157532. + }
  157533. + else{
  157534. + DBG_871X("Command not found\n");
  157535. + return 0;
  157536. + }
  157537. +
  157538. + return 0;
  157539. +}
  157540. +
  157541. +
  157542. +
  157543. +#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
  157544. +
  157545. +/*
  157546. + * Input Format: %s,%d,%d
  157547. + * %s is width, could be
  157548. + * "b" for 1 byte
  157549. + * "w" for WORD (2 bytes)
  157550. + * "dw" for DWORD (4 bytes)
  157551. + * 1st %d is address(offset)
  157552. + * 2st %d is data to write
  157553. + */
  157554. +static int rtw_mp_write_reg(struct net_device *dev,
  157555. + struct iw_request_info *info,
  157556. + struct iw_point *wrqu, char *extra)
  157557. +{
  157558. + char *pch, *pnext, *ptmp;
  157559. + char *width_str;
  157560. + char width;
  157561. + u32 addr, data;
  157562. + int ret;
  157563. + PADAPTER padapter = rtw_netdev_priv(dev);
  157564. +
  157565. +
  157566. + pch = extra;
  157567. + pnext = strpbrk(pch, " ,.-");
  157568. + if (pnext == NULL) return -EINVAL;
  157569. + *pnext = 0;
  157570. + width_str = pch;
  157571. +
  157572. + pch = pnext + 1;
  157573. + pnext = strpbrk(pch, " ,.-");
  157574. + if (pnext == NULL) return -EINVAL;
  157575. + *pnext = 0;
  157576. + addr = simple_strtoul(pch, &ptmp, 16);
  157577. + if (addr > 0x3FFF) return -EINVAL;
  157578. +
  157579. + pch = pnext + 1;
  157580. + if ((pch - extra) >= wrqu->length) return -EINVAL;
  157581. + data = simple_strtoul(pch, &ptmp, 16);
  157582. +
  157583. + ret = 0;
  157584. + width = width_str[0];
  157585. + switch (width) {
  157586. + case 'b':
  157587. + // 1 byte
  157588. + if (data > 0xFF) {
  157589. + ret = -EINVAL;
  157590. + break;
  157591. + }
  157592. + rtw_write8(padapter, addr, data);
  157593. + break;
  157594. + case 'w':
  157595. + // 2 bytes
  157596. + if (data > 0xFFFF) {
  157597. + ret = -EINVAL;
  157598. + break;
  157599. + }
  157600. + rtw_write16(padapter, addr, data);
  157601. + break;
  157602. + case 'd':
  157603. + // 4 bytes
  157604. + rtw_write32(padapter, addr, data);
  157605. + break;
  157606. + default:
  157607. + ret = -EINVAL;
  157608. + break;
  157609. + }
  157610. +
  157611. + return ret;
  157612. +}
  157613. +
  157614. +/*
  157615. + * Input Format: %s,%d
  157616. + * %s is width, could be
  157617. + * "b" for 1 byte
  157618. + * "w" for WORD (2 bytes)
  157619. + * "dw" for DWORD (4 bytes)
  157620. + * %d is address(offset)
  157621. + *
  157622. + * Return:
  157623. + * %d for data readed
  157624. + */
  157625. +static int rtw_mp_read_reg(struct net_device *dev,
  157626. + struct iw_request_info *info,
  157627. + struct iw_point *wrqu, char *extra)
  157628. +{
  157629. + char input[wrqu->length];
  157630. + char *pch, *pnext, *ptmp;
  157631. + char *width_str;
  157632. + char width;
  157633. + char data[20],tmp[20];
  157634. + u32 addr;
  157635. + //u32 *data = (u32*)extra;
  157636. + u32 ret, i=0, j=0, strtout=0;
  157637. + PADAPTER padapter = rtw_netdev_priv(dev);
  157638. +
  157639. + if (wrqu->length > 128) return -EFAULT;
  157640. +
  157641. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  157642. + return -EFAULT;
  157643. +
  157644. + _rtw_memset(data, 0, 20);
  157645. + _rtw_memset(tmp, 0, 20);
  157646. + _rtw_memset(extra, 0, wrqu->length);
  157647. +
  157648. + pch = input;
  157649. + pnext = strpbrk(pch, " ,.-");
  157650. + if (pnext == NULL) return -EINVAL;
  157651. + *pnext = 0;
  157652. + width_str = pch;
  157653. +
  157654. + pch = pnext + 1;
  157655. + if ((pch - input) >= wrqu->length) return -EINVAL;
  157656. +
  157657. + addr = simple_strtoul(pch, &ptmp, 16);
  157658. + if (addr > 0x3FFF) return -EINVAL;
  157659. +
  157660. + ret = 0;
  157661. + width = width_str[0];
  157662. + switch (width) {
  157663. + case 'b':
  157664. + // 1 byte
  157665. + // *(u8*)data = rtw_read8(padapter, addr);
  157666. + sprintf(extra, "%d\n", rtw_read8(padapter, addr));
  157667. + wrqu->length = strlen(extra);
  157668. + break;
  157669. + case 'w':
  157670. + // 2 bytes
  157671. + //*(u16*)data = rtw_read16(padapter, addr);
  157672. + sprintf(data, "%04d\n", rtw_read16(padapter, addr));
  157673. + for( i=0 ; i <= strlen(data) ; i++)
  157674. + {
  157675. + if( i%2==0 )
  157676. + {
  157677. + tmp[j]=' ';
  157678. + j++;
  157679. + }
  157680. + if ( data[i] != '\0' )
  157681. + tmp[j] = data[i];
  157682. +
  157683. + j++;
  157684. + }
  157685. + pch = tmp;
  157686. + DBG_871X("pch=%s",pch);
  157687. +
  157688. + while( *pch != '\0' )
  157689. + {
  157690. + pnext = strpbrk(pch, " ");
  157691. + pnext++;
  157692. + if ( *pnext != '\0' )
  157693. + {
  157694. + strtout = simple_strtoul (pnext , &ptmp, 16);
  157695. + sprintf( extra, "%s %d" ,extra ,strtout );
  157696. + }
  157697. + else{
  157698. + break;
  157699. + }
  157700. + pch = pnext;
  157701. + }
  157702. + wrqu->length = 6;
  157703. + break;
  157704. + case 'd':
  157705. + // 4 bytes
  157706. + //*data = rtw_read32(padapter, addr);
  157707. + sprintf(data, "%08x", rtw_read32(padapter, addr));
  157708. + //add read data format blank
  157709. + for( i=0 ; i <= strlen(data) ; i++)
  157710. + {
  157711. + if( i%2==0 )
  157712. + {
  157713. + tmp[j]=' ';
  157714. + j++;
  157715. + }
  157716. + tmp[j] = data[i];
  157717. + j++;
  157718. + }
  157719. + pch = tmp;
  157720. + DBG_871X("pch=%s",pch);
  157721. +
  157722. + while( *pch != '\0' )
  157723. + {
  157724. + pnext = strpbrk(pch, " ");
  157725. + pnext++;
  157726. + if ( *pnext != '\0' )
  157727. + {
  157728. + strtout = simple_strtoul (pnext , &ptmp, 16);
  157729. + sprintf( extra, "%s %d" ,extra ,strtout );
  157730. + }
  157731. + else{
  157732. + break;
  157733. + }
  157734. + pch = pnext;
  157735. + }
  157736. + wrqu->length = strlen(extra);
  157737. + break;
  157738. +
  157739. + default:
  157740. + wrqu->length = 0;
  157741. + ret = -EINVAL;
  157742. + break;
  157743. +
  157744. + }
  157745. +
  157746. + return ret;
  157747. +}
  157748. +
  157749. +/*
  157750. + * Input Format: %d,%x,%x
  157751. + * %d is RF path, should be smaller than MAX_RF_PATH_NUMS
  157752. + * 1st %x is address(offset)
  157753. + * 2st %x is data to write
  157754. + */
  157755. + static int rtw_mp_write_rf(struct net_device *dev,
  157756. + struct iw_request_info *info,
  157757. + struct iw_point *wrqu, char *extra)
  157758. +{
  157759. +/*static int rtw_mp_write_rf(struct net_device *dev,
  157760. + struct iw_request_info *info,
  157761. + union iwreq_data *wrqu, char *extra)
  157762. +*/
  157763. + u32 path, addr, data;
  157764. + int ret;
  157765. + PADAPTER padapter = rtw_netdev_priv(dev);
  157766. +
  157767. +
  157768. + ret = sscanf(extra, "%d,%x,%x", &path, &addr, &data);
  157769. + if (ret < 3) return -EINVAL;
  157770. +
  157771. + if (path >= MAX_RF_PATH_NUMS) return -EINVAL;
  157772. + if (addr > 0xFF) return -EINVAL;
  157773. + if (data > 0xFFFFF) return -EINVAL;
  157774. + _rtw_memset(extra, 0, wrqu->length);
  157775. +
  157776. + write_rfreg(padapter, path, addr, data);
  157777. +
  157778. + sprintf(extra, "write_rf completed \n");
  157779. +
  157780. + return 0;
  157781. +}
  157782. +
  157783. +/*
  157784. + * Input Format: %d,%x
  157785. + * %d is RF path, should be smaller than MAX_RF_PATH_NUMS
  157786. + * %x is address(offset)
  157787. + *
  157788. + * Return:
  157789. + * %d for data readed
  157790. + */
  157791. +static int rtw_mp_read_rf(struct net_device *dev,
  157792. + struct iw_request_info *info,
  157793. + struct iw_point *wrqu, char *extra)
  157794. +{
  157795. + char input[wrqu->length];
  157796. + char *pch, *pnext, *ptmp;
  157797. + char data[20],tmp[20];
  157798. + //u32 *data = (u32*)extra;
  157799. + u32 path, addr;
  157800. + u32 ret,i=0 ,j=0,strtou=0;
  157801. + PADAPTER padapter = rtw_netdev_priv(dev);
  157802. +
  157803. +
  157804. + if (wrqu->length > 128) return -EFAULT;
  157805. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  157806. + return -EFAULT;
  157807. +
  157808. + ret = sscanf(input, "%d,%x", &path, &addr);
  157809. + if (ret < 2) return -EINVAL;
  157810. +
  157811. + if (path >= MAX_RF_PATH_NUMS) return -EINVAL;
  157812. + if (addr > 0xFF) return -EINVAL;
  157813. +
  157814. + _rtw_memset(extra, 0, wrqu->length);
  157815. +
  157816. + //*data = read_rfreg(padapter, path, addr);
  157817. + sprintf(data, "%08x", read_rfreg(padapter, path, addr));
  157818. + //add read data format blank
  157819. + for( i=0 ; i <= strlen(data) ; i++)
  157820. + {
  157821. + if( i%2==0 )
  157822. + {
  157823. + tmp[j]=' ';
  157824. + j++;
  157825. + }
  157826. + tmp[j] = data[i];
  157827. + j++;
  157828. + }
  157829. + pch = tmp;
  157830. + DBG_871X("pch=%s",pch);
  157831. +
  157832. + while( *pch != '\0' )
  157833. + {
  157834. + pnext = strpbrk(pch, " ");
  157835. + pnext++;
  157836. + if ( *pnext != '\0' )
  157837. + {
  157838. + strtou = simple_strtoul (pnext , &ptmp, 16);
  157839. + sprintf( extra, "%s %d" ,extra ,strtou );
  157840. + }
  157841. + else{
  157842. + break;
  157843. + }
  157844. + pch = pnext;
  157845. + }
  157846. + wrqu->length = strlen(extra);
  157847. +
  157848. + return 0;
  157849. +}
  157850. +
  157851. +static int rtw_mp_start(struct net_device *dev,
  157852. + struct iw_request_info *info,
  157853. + struct iw_point *wrqu, char *extra)
  157854. +{
  157855. + u8 val8;
  157856. + PADAPTER padapter = rtw_netdev_priv(dev);
  157857. +
  157858. +
  157859. + if (padapter->registrypriv.mp_mode == 0)
  157860. + return -EPERM;
  157861. +
  157862. + if (padapter->mppriv.mode == MP_OFF) {
  157863. + if (mp_start_test(padapter) == _FAIL)
  157864. + return -EPERM;
  157865. + padapter->mppriv.mode = MP_ON;
  157866. + }
  157867. +
  157868. + return 0;
  157869. +}
  157870. +
  157871. +static int rtw_mp_stop(struct net_device *dev,
  157872. + struct iw_request_info *info,
  157873. + struct iw_point *wrqu, char *extra)
  157874. +{
  157875. + PADAPTER padapter = rtw_netdev_priv(dev);
  157876. +
  157877. +
  157878. + if (padapter->mppriv.mode != MP_OFF) {
  157879. + mp_stop_test(padapter);
  157880. + padapter->mppriv.mode = MP_OFF;
  157881. + }
  157882. +
  157883. + return 0;
  157884. +}
  157885. +
  157886. +extern int wifirate2_ratetbl_inx(unsigned char rate);
  157887. +
  157888. +static int rtw_mp_rate(struct net_device *dev,
  157889. + struct iw_request_info *info,
  157890. + struct iw_point *wrqu, char *extra)
  157891. +{
  157892. + u32 rate = MPT_RATE_1M;
  157893. + u8 input[wrqu->length];
  157894. + PADAPTER padapter = rtw_netdev_priv(dev);
  157895. +
  157896. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  157897. + return -EFAULT;
  157898. +
  157899. + rate = rtw_atoi(input);
  157900. + sprintf( extra, "Set data rate to %d" , rate );
  157901. +
  157902. + if(rate <= 0x7f)
  157903. + rate = wifirate2_ratetbl_inx( (u8)rate);
  157904. + else
  157905. + rate =(rate-0x80+MPT_RATE_MCS0);
  157906. +
  157907. + //DBG_871X("%s: rate=%d\n", __func__, rate);
  157908. +
  157909. + if (rate >= MPT_RATE_LAST )
  157910. + return -EINVAL;
  157911. +
  157912. + padapter->mppriv.rateidx = rate;
  157913. + Hal_SetDataRate(padapter);
  157914. +
  157915. + wrqu->length = strlen(extra) + 1;
  157916. + return 0;
  157917. +}
  157918. +
  157919. +static int rtw_mp_channel(struct net_device *dev,
  157920. + struct iw_request_info *info,
  157921. + struct iw_point *wrqu, char *extra)
  157922. +{
  157923. +
  157924. + PADAPTER padapter = rtw_netdev_priv(dev);
  157925. + u8 input[wrqu->length];
  157926. + u32 channel = 1;
  157927. +
  157928. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  157929. + return -EFAULT;
  157930. +
  157931. + channel = rtw_atoi(input);
  157932. + //DBG_871X("%s: channel=%d\n", __func__, channel);
  157933. + sprintf( extra, "Change channel %d to channel %d", padapter->mppriv.channel , channel );
  157934. +
  157935. + padapter->mppriv.channel = channel;
  157936. + Hal_SetChannel(padapter);
  157937. +
  157938. + wrqu->length = strlen(extra) + 1;
  157939. + return 0;
  157940. +}
  157941. +
  157942. +static int rtw_mp_bandwidth(struct net_device *dev,
  157943. + struct iw_request_info *info,
  157944. + struct iw_point *wrqu, char *extra)
  157945. +{
  157946. + u32 bandwidth=0, sg=0;
  157947. + //u8 buffer[40];
  157948. + PADAPTER padapter = rtw_netdev_priv(dev);
  157949. + //if (copy_from_user(buffer, (void*)wrqu->data.pointer, wrqu->data.length))
  157950. + // return -EFAULT;
  157951. +
  157952. + //DBG_871X("%s:iwpriv in=%s\n", __func__, extra);
  157953. +
  157954. + sscanf(extra, "40M=%d,shortGI=%d", &bandwidth, &sg);
  157955. +
  157956. + if (bandwidth != HT_CHANNEL_WIDTH_40)
  157957. + bandwidth = HT_CHANNEL_WIDTH_20;
  157958. +
  157959. + //DBG_871X("%s: bw=%d sg=%d \n", __func__, bandwidth , sg);
  157960. +
  157961. + padapter->mppriv.bandwidth = (u8)bandwidth;
  157962. + padapter->mppriv.preamble = sg;
  157963. +
  157964. + SetBandwidth(padapter);
  157965. +
  157966. + return 0;
  157967. +}
  157968. +
  157969. +static int rtw_mp_txpower(struct net_device *dev,
  157970. + struct iw_request_info *info,
  157971. + struct iw_point *wrqu, char *extra)
  157972. +{
  157973. + u32 idx_a=0,idx_b=0;
  157974. + u8 input[wrqu->length];
  157975. +
  157976. + PADAPTER padapter = rtw_netdev_priv(dev);
  157977. +
  157978. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  157979. + return -EFAULT;
  157980. +
  157981. + sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b);
  157982. + //DBG_871X("%s: tx_pwr_idx_a=%x b=%x\n", __func__, idx_a, idx_b);
  157983. +
  157984. + sprintf( extra, "Set power level path_A:%d path_B:%d", idx_a , idx_b );
  157985. + padapter->mppriv.txpoweridx = (u8)idx_a;
  157986. + padapter->mppriv.txpoweridx_b = (u8)idx_b;
  157987. +
  157988. + Hal_SetAntennaPathPower(padapter);
  157989. +
  157990. + wrqu->length = strlen(extra) + 1;
  157991. + return 0;
  157992. +}
  157993. +
  157994. +static int rtw_mp_ant_tx(struct net_device *dev,
  157995. + struct iw_request_info *info,
  157996. + struct iw_point *wrqu, char *extra)
  157997. +{
  157998. + u8 i;
  157999. + u8 input[wrqu->length];
  158000. + u16 antenna = 0;
  158001. + PADAPTER padapter = rtw_netdev_priv(dev);
  158002. +
  158003. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158004. + return -EFAULT;
  158005. +
  158006. + //DBG_871X("%s: input=%s\n", __func__, input);
  158007. +
  158008. + sprintf( extra, "switch Tx antenna to %s", input );
  158009. +
  158010. + for (i=0; i < strlen(input); i++)
  158011. + {
  158012. + switch(input[i])
  158013. + {
  158014. + case 'a' :
  158015. + antenna|=ANTENNA_A;
  158016. + break;
  158017. + case 'b':
  158018. + antenna|=ANTENNA_B;
  158019. + break;
  158020. + }
  158021. + }
  158022. + //antenna |= BIT(extra[i]-'a');
  158023. + //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);
  158024. + padapter->mppriv.antenna_tx = antenna;
  158025. + //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_tx);
  158026. +
  158027. + Hal_SetAntenna(padapter);
  158028. +
  158029. + wrqu->length = strlen(extra) + 1;
  158030. + return 0;
  158031. +}
  158032. +
  158033. +static int rtw_mp_ant_rx(struct net_device *dev,
  158034. + struct iw_request_info *info,
  158035. + struct iw_point *wrqu, char *extra)
  158036. +{
  158037. + u8 i;
  158038. + u16 antenna = 0;
  158039. + u8 input[wrqu->length];
  158040. + PADAPTER padapter = rtw_netdev_priv(dev);
  158041. +
  158042. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158043. + return -EFAULT;
  158044. + //DBG_871X("%s: input=%s\n", __func__, input);
  158045. + _rtw_memset(extra, 0, wrqu->length);
  158046. +
  158047. + sprintf( extra, "switch Rx antenna to %s", input );
  158048. +
  158049. + for (i=0; i < strlen(input); i++) {
  158050. +
  158051. + switch( input[i] )
  158052. + {
  158053. + case 'a' :
  158054. + antenna|=ANTENNA_A;
  158055. + break;
  158056. + case 'b':
  158057. + antenna|=ANTENNA_B;
  158058. + break;
  158059. + }
  158060. + }
  158061. +
  158062. + //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);
  158063. + padapter->mppriv.antenna_rx = antenna;
  158064. + //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_rx);
  158065. + Hal_SetAntenna(padapter);
  158066. + wrqu->length = strlen(extra);
  158067. +
  158068. + return 0;
  158069. +}
  158070. +
  158071. +static int rtw_mp_ctx(struct net_device *dev,
  158072. + struct iw_request_info *info,
  158073. + struct iw_point *wrqu, char *extra)
  158074. +{
  158075. + u32 pkTx = 1, countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1;
  158076. + u32 bStartTest = 1;
  158077. + u32 count = 0;
  158078. + struct mp_priv *pmp_priv;
  158079. + struct pkt_attrib *pattrib;
  158080. +
  158081. + PADAPTER padapter = rtw_netdev_priv(dev);
  158082. +
  158083. +
  158084. + pmp_priv = &padapter->mppriv;
  158085. +
  158086. + if (copy_from_user(extra, wrqu->pointer, wrqu->length))
  158087. + return -EFAULT;
  158088. +
  158089. + DBG_871X("%s: in=%s\n", __func__, extra);
  158090. +
  158091. + countPkTx = strncmp(extra, "count=", 5); // strncmp TRUE is 0
  158092. + cotuTx = strncmp(extra, "background", 20);
  158093. + CarrSprTx = strncmp(extra, "background,cs", 20);
  158094. + scTx = strncmp(extra, "background,sc", 20);
  158095. + sgleTx = strncmp(extra, "background,stone", 20);
  158096. + pkTx = strncmp(extra, "background,pkt", 20);
  158097. + stop = strncmp(extra, "stop", 5);
  158098. + sscanf(extra, "count=%d,pkt", &count);
  158099. +
  158100. + //DBG_871X("%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\n", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop);
  158101. + _rtw_memset(extra, '\0', sizeof(extra));
  158102. +
  158103. + if (stop == 0) {
  158104. + bStartTest = 0; // To set Stop
  158105. + pmp_priv->tx.stop = 1;
  158106. + sprintf( extra, "Stop continuous Tx");
  158107. + } else {
  158108. + bStartTest = 1;
  158109. + if (pmp_priv->mode != MP_ON) {
  158110. + if (pmp_priv->tx.stop != 1) {
  158111. + DBG_871X("%s: MP_MODE != ON %d\n", __func__, pmp_priv->mode);
  158112. + return -EFAULT;
  158113. + }
  158114. + }
  158115. + }
  158116. +
  158117. + if (pkTx == 0 || countPkTx == 0)
  158118. + pmp_priv->mode = MP_PACKET_TX;
  158119. + if (sgleTx == 0)
  158120. + pmp_priv->mode = MP_SINGLE_TONE_TX;
  158121. + if (cotuTx == 0)
  158122. + pmp_priv->mode = MP_CONTINUOUS_TX;
  158123. + if (CarrSprTx == 0)
  158124. + pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
  158125. + if (scTx == 0)
  158126. + pmp_priv->mode = MP_SINGLE_CARRIER_TX;
  158127. +
  158128. + switch (pmp_priv->mode)
  158129. + {
  158130. + case MP_PACKET_TX:
  158131. +
  158132. + //DBG_871X("%s:pkTx %d\n", __func__,bStartTest);
  158133. + if (bStartTest == 0)
  158134. + {
  158135. + pmp_priv->tx.stop = 1;
  158136. + pmp_priv->mode = MP_ON;
  158137. + sprintf( extra, "Stop continuous Tx");
  158138. + }
  158139. + else if (pmp_priv->tx.stop == 1)
  158140. + {
  158141. + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 count=%u,\n",count);
  158142. + //DBG_871X("%s:countPkTx %d\n", __func__,count);
  158143. + pmp_priv->tx.stop = 0;
  158144. + pmp_priv->tx.count = count;
  158145. + pmp_priv->tx.payload = 2;
  158146. + pattrib = &pmp_priv->tx.attrib;
  158147. + pattrib->pktlen = 1460;
  158148. + _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
  158149. + SetPacketTx(padapter);
  158150. + }
  158151. + else {
  158152. + //DBG_871X("%s: pkTx not stop\n", __func__);
  158153. + return -EFAULT;
  158154. + }
  158155. + wrqu->length = strlen(extra);
  158156. + return 0;
  158157. +
  158158. + case MP_SINGLE_TONE_TX:
  158159. + //DBG_871X("%s: sgleTx %d \n", __func__, bStartTest);
  158160. + if (bStartTest != 0){
  158161. + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
  158162. +
  158163. + }
  158164. + Hal_SetSingleToneTx(padapter, (u8)bStartTest);
  158165. + break;
  158166. +
  158167. + case MP_CONTINUOUS_TX:
  158168. + DBG_871X("%s: cotuTx %d\n", __func__, bStartTest);
  158169. + if (bStartTest != 0){
  158170. + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
  158171. + }
  158172. + Hal_SetContinuousTx(padapter, (u8)bStartTest);
  158173. + break;
  158174. +
  158175. + case MP_CARRIER_SUPPRISSION_TX:
  158176. + //DBG_871X("%s: CarrSprTx %d\n", __func__, bStartTest);
  158177. + if (bStartTest != 0){
  158178. + if( pmp_priv->rateidx <= MPT_RATE_11M )
  158179. + {
  158180. + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
  158181. + }else
  158182. + sprintf( extra, "Specify carrier suppression but not CCK rate");
  158183. + }
  158184. + Hal_SetCarrierSuppressionTx(padapter, (u8)bStartTest);
  158185. + break;
  158186. +
  158187. + case MP_SINGLE_CARRIER_TX:
  158188. + //DBG_871X("%s: scTx %d\n", __func__, bStartTest);
  158189. + if (bStartTest != 0){
  158190. + sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
  158191. + }
  158192. + Hal_SetSingleCarrierTx(padapter, (u8)bStartTest);
  158193. + break;
  158194. +
  158195. + default:
  158196. + //DBG_871X("%s:No Match MP_MODE\n", __func__);
  158197. + sprintf( extra, "Error! Continuous-Tx is not on-going.");
  158198. + return -EFAULT;
  158199. + }
  158200. +
  158201. + if (bStartTest) {
  158202. + struct mp_priv *pmp_priv = &padapter->mppriv;
  158203. + if (pmp_priv->tx.stop == 0) {
  158204. + pmp_priv->tx.stop = 1;
  158205. + //DBG_871X("%s: pkt tx is running...\n", __func__);
  158206. + rtw_msleep_os(5);
  158207. + }
  158208. + pmp_priv->tx.stop = 0;
  158209. + pmp_priv->tx.count = 1;
  158210. + SetPacketTx(padapter);
  158211. + } else {
  158212. + pmp_priv->mode = MP_ON;
  158213. + }
  158214. +
  158215. + wrqu->length = strlen(extra);
  158216. + return 0;
  158217. +}
  158218. +
  158219. +static int rtw_mp_arx(struct net_device *dev,
  158220. + struct iw_request_info *info,
  158221. + struct iw_point *wrqu, char *extra)
  158222. +{
  158223. + u8 bStartRx=0,bStopRx=0;
  158224. + PADAPTER padapter = rtw_netdev_priv(dev);
  158225. + u8 input[wrqu->length];
  158226. +
  158227. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158228. + return -EFAULT;
  158229. +
  158230. + DBG_871X("%s: %s\n", __func__, input);
  158231. +
  158232. + bStartRx = (strncmp(input, "start", 5)==0)?1:0; // strncmp TRUE is 0
  158233. + bStopRx = (strncmp(input, "stop", 5)==0)?1:0; // strncmp TRUE is 0
  158234. + SetPacketRx(padapter, bStartRx);
  158235. +
  158236. + if(bStartRx)
  158237. + {
  158238. + sprintf( extra, "start");
  158239. + wrqu->length = strlen(extra) + 1;
  158240. + }
  158241. + else if(bStopRx)
  158242. + {
  158243. + sprintf( extra, "Received packet OK:%d CRC error:%d",padapter->mppriv.rx_pktcount,
  158244. + padapter->mppriv.rx_crcerrpktcount);
  158245. + wrqu->length = strlen(extra) + 1;
  158246. + }
  158247. +
  158248. +
  158249. + return 0;
  158250. +}
  158251. +
  158252. +static int rtw_mp_trx_query(struct net_device *dev,
  158253. + struct iw_request_info *info,
  158254. + struct iw_point *wrqu, char *extra)
  158255. +{
  158256. + u32 txok,txfail,rxok,rxfail;
  158257. + PADAPTER padapter = rtw_netdev_priv(dev);
  158258. + //if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
  158259. + // return -EFAULT;
  158260. +
  158261. + txok=padapter->mppriv.tx.sended;
  158262. + txfail=0;
  158263. + rxok = padapter->mppriv.rx_pktcount;
  158264. + rxfail = padapter->mppriv.rx_crcerrpktcount;
  158265. +
  158266. + _rtw_memset(extra, '\0', 128);
  158267. +
  158268. + sprintf(extra, "Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ", txok, txfail,rxok,rxfail);
  158269. +
  158270. + wrqu->length=strlen(extra)+1;
  158271. +
  158272. + return 0;
  158273. +}
  158274. +
  158275. +static int rtw_mp_pwrtrk(struct net_device *dev,
  158276. + struct iw_request_info *info,
  158277. + struct iw_point *wrqu, char *extra)
  158278. +{
  158279. + u8 enable;
  158280. + u32 thermal;
  158281. + s32 ret;
  158282. + PADAPTER padapter = rtw_netdev_priv(dev);
  158283. + u8 input[wrqu->length];
  158284. +
  158285. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158286. + return -EFAULT;
  158287. +
  158288. + _rtw_memset(extra, 0, wrqu->length);
  158289. +
  158290. + enable = 1;
  158291. + if (wrqu->length > 1) { // not empty string
  158292. + if (strncmp(input, "stop", 4) == 0)
  158293. + {
  158294. + enable = 0;
  158295. + sprintf(extra, "mp tx power tracking stop");
  158296. + }
  158297. + else if (sscanf(input, "ther=%d", &thermal)) {
  158298. + ret = Hal_SetThermalMeter(padapter, (u8)thermal);
  158299. + if (ret == _FAIL) return -EPERM;
  158300. + sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal);
  158301. + }else {
  158302. + return -EINVAL;
  158303. + }
  158304. + }
  158305. +
  158306. + ret = Hal_SetPowerTracking(padapter, enable);
  158307. + if (ret == _FAIL) return -EPERM;
  158308. +
  158309. + wrqu->length = strlen(extra);
  158310. +
  158311. + return 0;
  158312. +}
  158313. +
  158314. +static int rtw_mp_psd(struct net_device *dev,
  158315. + struct iw_request_info *info,
  158316. + struct iw_point *wrqu, char *extra)
  158317. +{
  158318. + PADAPTER padapter = rtw_netdev_priv(dev);
  158319. + u8 input[wrqu->length];
  158320. +
  158321. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158322. + return -EFAULT;
  158323. +
  158324. + strcpy(extra,input);
  158325. +
  158326. + wrqu->length = mp_query_psd(padapter, extra);
  158327. +
  158328. + return 0;
  158329. +}
  158330. +
  158331. +static int rtw_mp_thermal(struct net_device *dev,
  158332. + struct iw_request_info *info,
  158333. + struct iw_point *wrqu, char *extra)
  158334. +{
  158335. + u8 val;
  158336. + u16 bwrite=1;
  158337. + #ifdef CONFIG_RTL8192C
  158338. + u16 addr=0x78;
  158339. + #endif
  158340. + #ifdef CONFIG_RTL8192D
  158341. + u16 addr=0xc3;
  158342. + #endif
  158343. + u16 cnt=1;
  158344. + u16 max_available_size=0;
  158345. + PADAPTER padapter = rtw_netdev_priv(dev);
  158346. +
  158347. + if (copy_from_user(extra, wrqu->pointer, wrqu->length))
  158348. + return -EFAULT;
  158349. +
  158350. + //DBG_871X("print extra %s \n",extra);
  158351. +
  158352. + bwrite = strncmp(extra, "write", 6); // strncmp TRUE is 0
  158353. +
  158354. + Hal_GetThermalMeter(padapter, &val);
  158355. +
  158356. + if( bwrite == 0 )
  158357. + {
  158358. + //DBG_871X("to write val:%d",val);
  158359. + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
  158360. + if( 2 > max_available_size )
  158361. + {
  158362. + DBG_871X("no available efuse!\n");
  158363. + return -EFAULT;
  158364. + }
  158365. + if ( rtw_efuse_map_write(padapter, addr, cnt, &val) == _FAIL )
  158366. + {
  158367. + DBG_871X("rtw_efuse_map_write error \n");
  158368. + return -EFAULT;
  158369. + }
  158370. + else
  158371. + {
  158372. + sprintf(extra, " efuse write ok :%d", val);
  158373. + }
  158374. + }
  158375. + else
  158376. + {
  158377. + sprintf(extra, "%d", val);
  158378. + }
  158379. + wrqu->length = strlen(extra);
  158380. +
  158381. + return 0;
  158382. +}
  158383. +
  158384. +static int rtw_mp_reset_stats(struct net_device *dev,
  158385. + struct iw_request_info *info,
  158386. + struct iw_point *wrqu, char *extra)
  158387. +{
  158388. + struct mp_priv *pmp_priv;
  158389. + struct pkt_attrib *pattrib;
  158390. + PADAPTER padapter = rtw_netdev_priv(dev);
  158391. +
  158392. + pmp_priv = &padapter->mppriv;
  158393. +
  158394. + pmp_priv->tx.sended = 0;
  158395. + padapter->mppriv.rx_pktcount = 0;
  158396. + padapter->mppriv.rx_crcerrpktcount = 0;
  158397. +
  158398. + return 0;
  158399. +}
  158400. +
  158401. +static int rtw_mp_dump(struct net_device *dev,
  158402. + struct iw_request_info *info,
  158403. + struct iw_point *wrqu, char *extra)
  158404. +{
  158405. + struct mp_priv *pmp_priv;
  158406. + struct pkt_attrib *pattrib;
  158407. + u32 value;
  158408. + u8 rf_type,path_nums = 0;
  158409. + u32 i,j=1,path;
  158410. + PADAPTER padapter = rtw_netdev_priv(dev);
  158411. +
  158412. + pmp_priv = &padapter->mppriv;
  158413. +
  158414. +
  158415. + //if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
  158416. + // return -EFAULT;
  158417. +
  158418. + if ( strncmp(extra, "all", 4)==0 )
  158419. + {
  158420. + DBG_871X("\n======= MAC REG =======\n");
  158421. + for ( i=0x0;i<0x300;i+=4 )
  158422. + {
  158423. + if(j%4==1) DBG_871X("0x%02x",i);
  158424. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  158425. + if((j++)%4 == 0) DBG_871X("\n");
  158426. + }
  158427. + for( i=0x400;i<0x800;i+=4 )
  158428. + {
  158429. + if(j%4==1) DBG_871X("0x%02x",i);
  158430. + DBG_871X(" 0x%08x ",rtw_read32(padapter,i));
  158431. + if((j++)%4 == 0) DBG_871X("\n");
  158432. + }
  158433. +
  158434. + i,j=1;
  158435. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  158436. +
  158437. + DBG_871X("\n======= RF REG =======\n");
  158438. + if(( RF_1T2R == rf_type ) ||( RF_1T1R ==rf_type ))
  158439. + path_nums = 1;
  158440. + else
  158441. + path_nums = 2;
  158442. +
  158443. + for(path=0;path<path_nums;path++)
  158444. + {
  158445. +#ifdef CONFIG_RTL8192D
  158446. + for (i = 0; i < 0x50; i++)
  158447. +#else
  158448. + for (i = 0; i < 0x34; i++)
  158449. +#endif
  158450. + {
  158451. + //value = PHY_QueryRFReg(padapter, (RF90_RADIO_PATH_E)path,i, bMaskDWord);
  158452. + value =rtw_hal_read_rfreg(padapter, path, i, 0xffffffff);
  158453. + if(j%4==1) DBG_871X("0x%02x ",i);
  158454. + DBG_871X(" 0x%08x ",value);
  158455. + if((j++)%4==0) DBG_871X("\n");
  158456. + }
  158457. + }
  158458. + }
  158459. + return 0;
  158460. +}
  158461. +
  158462. +static int rtw_mp_phypara(struct net_device *dev,
  158463. + struct iw_request_info *info,
  158464. + struct iw_point *wrqu, char *extra)
  158465. +{
  158466. +
  158467. + PADAPTER padapter = rtw_netdev_priv(dev);
  158468. + char input[wrqu->length];
  158469. + u32 valxcap;
  158470. +
  158471. + if (copy_from_user(input, wrqu->pointer, wrqu->length))
  158472. + return -EFAULT;
  158473. +
  158474. + DBG_871X("%s:iwpriv in=%s\n", __func__, input);
  158475. +
  158476. + sscanf(input, "xcap=%d", &valxcap);
  158477. +
  158478. + if (!IS_HARDWARE_TYPE_8192D(padapter))
  158479. + return 0;
  158480. +#ifdef CONFIG_RTL8192D
  158481. + Hal_ProSetCrystalCap( padapter , valxcap );
  158482. +#endif
  158483. +
  158484. + sprintf( extra, "Set xcap=%d",valxcap );
  158485. + wrqu->length = strlen(extra) + 1;
  158486. +
  158487. +return 0;
  158488. +
  158489. +}
  158490. +
  158491. +
  158492. +/* update Tx AGC offset */
  158493. +static int rtw_mp_antBdiff(struct net_device *dev,
  158494. + struct iw_request_info *info,
  158495. + struct iw_point *wrqu, char *extra)
  158496. +{
  158497. +
  158498. +
  158499. + // MPT_ProSetTxAGCOffset
  158500. + return 0;
  158501. +}
  158502. +
  158503. +
  158504. +static int rtw_mp_set(struct net_device *dev,
  158505. + struct iw_request_info *info,
  158506. + union iwreq_data *wdata, char *extra)
  158507. +{
  158508. + struct iw_point *wrqu = (struct iw_point *)wdata;
  158509. + u32 subcmd = wrqu->flags;
  158510. + PADAPTER padapter = rtw_netdev_priv(dev);
  158511. +
  158512. + if (padapter == NULL)
  158513. + {
  158514. + return -ENETDOWN;
  158515. + }
  158516. +
  158517. + //_rtw_memset(extra, 0x00, IW_PRIV_SIZE_MASK);
  158518. +
  158519. + if (extra == NULL)
  158520. + {
  158521. + wrqu->length = 0;
  158522. + return -EIO;
  158523. + }
  158524. +
  158525. + switch(subcmd)
  158526. + {
  158527. + case WRITE_REG :
  158528. + rtw_mp_write_reg (dev,info,wrqu,extra);
  158529. + break;
  158530. +
  158531. + case WRITE_RF:
  158532. + rtw_mp_write_rf (dev,info,wrqu,extra);
  158533. + break;
  158534. +
  158535. + case MP_START:
  158536. + DBG_871X("set case mp_start \n");
  158537. + rtw_mp_start (dev,info,wrqu,extra);
  158538. + break;
  158539. +
  158540. + case MP_STOP:
  158541. + DBG_871X("set case mp_stop \n");
  158542. + rtw_mp_stop (dev,info,wrqu,extra);
  158543. + break;
  158544. +
  158545. + case MP_BANDWIDTH:
  158546. + DBG_871X("set case mp_bandwidth \n");
  158547. + rtw_mp_bandwidth (dev,info,wrqu,extra);
  158548. + break;
  158549. +
  158550. + case MP_RESET_STATS:
  158551. + DBG_871X("set case MP_RESET_STATS \n");
  158552. + rtw_mp_reset_stats (dev,info,wrqu,extra);
  158553. + break;
  158554. +
  158555. + case EFUSE_SET:
  158556. + DBG_871X("efuse set \n");
  158557. + rtw_mp_efuse_set (dev,info,wdata,extra);
  158558. + break;
  158559. +
  158560. + }
  158561. +
  158562. +
  158563. + return 0;
  158564. +}
  158565. +
  158566. +
  158567. +static int rtw_mp_get(struct net_device *dev,
  158568. + struct iw_request_info *info,
  158569. + union iwreq_data *wdata, char *extra)
  158570. +{
  158571. + struct iw_point *wrqu = (struct iw_point *)wdata;
  158572. + u32 subcmd = wrqu->flags;
  158573. + PADAPTER padapter = rtw_netdev_priv(dev);
  158574. +
  158575. + //DBG_871X("in mp_get extra= %s \n",extra);
  158576. +
  158577. + if (padapter == NULL)
  158578. + {
  158579. + return -ENETDOWN;
  158580. + }
  158581. + if (extra == NULL)
  158582. + {
  158583. + wrqu->length = 0;
  158584. + return -EIO;
  158585. + }
  158586. +
  158587. + switch(subcmd)
  158588. + {
  158589. + case MP_PHYPARA:
  158590. + DBG_871X("mp_get MP_PHYPARA \n");
  158591. + rtw_mp_phypara(dev,info,wrqu,extra);
  158592. + break;
  158593. +
  158594. + case MP_CHANNEL:
  158595. + DBG_871X("set case mp_channel \n");
  158596. + rtw_mp_channel (dev,info,wrqu,extra);
  158597. + break;
  158598. +
  158599. + case READ_REG:
  158600. + DBG_871X("mp_get READ_REG \n");
  158601. + rtw_mp_read_reg (dev,info,wrqu,extra);
  158602. + break;
  158603. + case READ_RF:
  158604. + DBG_871X("mp_get READ_RF \n");
  158605. + rtw_mp_read_rf (dev,info,wrqu,extra);
  158606. + break;
  158607. +
  158608. + case MP_RATE:
  158609. + DBG_871X("set case mp_rate \n");
  158610. + rtw_mp_rate (dev,info,wrqu,extra);
  158611. + break;
  158612. +
  158613. + case MP_TXPOWER:
  158614. + DBG_871X("set case MP_TXPOWER \n");
  158615. + rtw_mp_txpower (dev,info,wrqu,extra);
  158616. + break;
  158617. +
  158618. + case MP_ANT_TX:
  158619. + DBG_871X("set case MP_ANT_TX \n");
  158620. + rtw_mp_ant_tx (dev,info,wrqu,extra);
  158621. + break;
  158622. +
  158623. + case MP_ANT_RX:
  158624. + DBG_871X("set case MP_ANT_RX \n");
  158625. + rtw_mp_ant_rx (dev,info,wrqu,extra);
  158626. + break;
  158627. +
  158628. + case MP_QUERY:
  158629. + DBG_871X("mp_get mp_query MP_QUERY \n");
  158630. + rtw_mp_trx_query(dev,info,wrqu,extra);
  158631. + break;
  158632. +
  158633. + case MP_CTX:
  158634. + DBG_871X("set case MP_CTX \n");
  158635. + rtw_mp_ctx (dev,info,wrqu,extra);
  158636. + break;
  158637. +
  158638. + case MP_ARX:
  158639. + DBG_871X("set case MP_ARX \n");
  158640. + rtw_mp_arx (dev,info,wrqu,extra);
  158641. + break;
  158642. +
  158643. + case EFUSE_GET:
  158644. + DBG_871X("efuse get EFUSE_GET \n");
  158645. + rtw_mp_efuse_get(dev,info,wdata,extra);
  158646. + break;
  158647. +
  158648. + case MP_DUMP:
  158649. + DBG_871X("set case MP_DUMP \n");
  158650. + rtw_mp_dump (dev,info,wrqu,extra);
  158651. + break;
  158652. + case MP_PSD:
  158653. + DBG_871X("set case MP_PSD \n");
  158654. + rtw_mp_psd (dev,info,wrqu,extra);
  158655. + break;
  158656. +
  158657. + case MP_THER:
  158658. + DBG_871X("set case MP_THER \n");
  158659. + rtw_mp_thermal (dev,info,wrqu,extra);
  158660. + break;
  158661. +
  158662. + case MP_PWRTRK:
  158663. + DBG_871X("set case MP_PWRTRK \n");
  158664. + rtw_mp_pwrtrk (dev,info,wrqu,extra);
  158665. + break;
  158666. + }
  158667. +
  158668. +return 0;
  158669. +}
  158670. +
  158671. +#endif //#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
  158672. +
  158673. +static int rtw_wfd_tdls_enable(struct net_device *dev,
  158674. + struct iw_request_info *info,
  158675. + union iwreq_data *wrqu, char *extra)
  158676. +{
  158677. + int ret = 0;
  158678. +
  158679. +#ifdef CONFIG_TDLS
  158680. +#ifdef CONFIG_WFD
  158681. +
  158682. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158683. +
  158684. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158685. +
  158686. + if ( extra[ 0 ] == '0' )
  158687. + {
  158688. + padapter->wdinfo.wfd_tdls_enable = 0;
  158689. + }
  158690. + else
  158691. + {
  158692. + padapter->wdinfo.wfd_tdls_enable = 1;
  158693. + }
  158694. +
  158695. +#endif //CONFIG_WFD
  158696. +#endif //CONFIG_TDLS
  158697. +
  158698. + return ret;
  158699. +}
  158700. +
  158701. +static int rtw_tdls_weaksec(struct net_device *dev,
  158702. + struct iw_request_info *info,
  158703. + union iwreq_data *wrqu, char *extra)
  158704. +{
  158705. + int ret = 0;
  158706. +
  158707. +#ifdef CONFIG_TDLS
  158708. +
  158709. + u8 i, j;
  158710. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158711. +
  158712. + DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158713. +
  158714. + if ( extra[ 0 ] == '0' )
  158715. + {
  158716. + padapter->wdinfo.wfd_tdls_weaksec = 0;
  158717. + }
  158718. + else
  158719. + {
  158720. + padapter->wdinfo.wfd_tdls_weaksec = 1;
  158721. + }
  158722. +#endif
  158723. +
  158724. + return ret;
  158725. +}
  158726. +
  158727. +
  158728. +static int rtw_tdls_enable(struct net_device *dev,
  158729. + struct iw_request_info *info,
  158730. + union iwreq_data *wrqu, char *extra)
  158731. +{
  158732. + int ret = 0;
  158733. +
  158734. +#ifdef CONFIG_TDLS
  158735. +
  158736. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158737. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  158738. + _irqL irqL;
  158739. + _list *plist, *phead;
  158740. + s32 index;
  158741. + struct sta_info *psta = NULL;
  158742. + struct sta_priv *pstapriv = &padapter->stapriv;
  158743. + u8 tdls_sta[NUM_STA][ETH_ALEN];
  158744. + u8 empty_hwaddr[ETH_ALEN] = { 0x00 };
  158745. +
  158746. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158747. +
  158748. + _rtw_memset(tdls_sta, 0x00, sizeof(tdls_sta));
  158749. +
  158750. + if ( extra[ 0 ] == '0' )
  158751. + {
  158752. + ptdlsinfo->enable = 0;
  158753. +
  158754. + if(pstapriv->asoc_sta_count==1)
  158755. + return ret;
  158756. +
  158757. + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  158758. + for(index=0; index< NUM_STA; index++)
  158759. + {
  158760. + phead = &(pstapriv->sta_hash[index]);
  158761. + plist = get_next(phead);
  158762. +
  158763. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
  158764. + {
  158765. + psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);
  158766. +
  158767. + plist = get_next(plist);
  158768. +
  158769. + if(psta->tdls_sta_state != TDLS_STATE_NONE)
  158770. + {
  158771. + _rtw_memcpy(tdls_sta[index], psta->hwaddr, ETH_ALEN);
  158772. + }
  158773. + }
  158774. + }
  158775. + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  158776. +
  158777. + for(index=0; index< NUM_STA; index++)
  158778. + {
  158779. + if( !_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN) )
  158780. + {
  158781. + printk("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index]));
  158782. + issue_tdls_teardown(padapter, tdls_sta[index]);
  158783. + }
  158784. + }
  158785. + rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);
  158786. + rtw_reset_tdls_info(padapter);
  158787. + }
  158788. + else if ( extra[ 0 ] == '1' )
  158789. + {
  158790. + ptdlsinfo->enable = 1;
  158791. + }
  158792. +#endif //CONFIG_TDLS
  158793. +
  158794. + return ret;
  158795. +}
  158796. +
  158797. +static int rtw_tdls_setup(struct net_device *dev,
  158798. + struct iw_request_info *info,
  158799. + union iwreq_data *wrqu, char *extra)
  158800. +{
  158801. + int ret = 0;
  158802. +
  158803. +#ifdef CONFIG_TDLS
  158804. +
  158805. + u8 i, j;
  158806. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158807. + u8 mac_addr[ETH_ALEN];
  158808. +
  158809. +#ifdef CONFIG_WFD
  158810. + struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
  158811. +#endif // CONFIG_WFD
  158812. +
  158813. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158814. +
  158815. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  158816. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  158817. + }
  158818. +
  158819. +#ifdef CONFIG_WFD
  158820. + if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm )
  158821. + {
  158822. + // Weak Security situation with AP.
  158823. + if ( 0 == pwdinfo->wfd_tdls_weaksec )
  158824. + {
  158825. + // Can't send the tdls setup request out!!
  158826. + DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ );
  158827. + }
  158828. + else
  158829. + {
  158830. + issue_tdls_setup_req(padapter, mac_addr);
  158831. + }
  158832. + }
  158833. + else
  158834. +#endif // CONFIG_WFD
  158835. + {
  158836. + issue_tdls_setup_req(padapter, mac_addr);
  158837. + }
  158838. +#endif
  158839. +
  158840. + return ret;
  158841. +}
  158842. +
  158843. +static int rtw_tdls_teardown(struct net_device *dev,
  158844. + struct iw_request_info *info,
  158845. + union iwreq_data *wrqu, char *extra)
  158846. +{
  158847. + int ret = 0;
  158848. +
  158849. +#ifdef CONFIG_TDLS
  158850. +
  158851. + u8 i,j;
  158852. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158853. + struct sta_info *ptdls_sta = NULL;
  158854. + u8 mac_addr[ETH_ALEN];
  158855. +
  158856. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158857. +
  158858. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  158859. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  158860. + }
  158861. +
  158862. + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), mac_addr);
  158863. +
  158864. + if(ptdls_sta != NULL)
  158865. + {
  158866. + ptdls_sta->stat_code = _RSON_TDLS_TEAR_UN_RSN_;
  158867. + issue_tdls_teardown(padapter, mac_addr);
  158868. + }
  158869. +
  158870. +#endif //CONFIG_TDLS
  158871. +
  158872. + return ret;
  158873. +}
  158874. +
  158875. +static int rtw_tdls_discovery(struct net_device *dev,
  158876. + struct iw_request_info *info,
  158877. + union iwreq_data *wrqu, char *extra)
  158878. +{
  158879. + int ret = 0;
  158880. +
  158881. +#ifdef CONFIG_TDLS
  158882. +
  158883. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158884. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  158885. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  158886. +
  158887. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158888. +
  158889. + issue_tdls_dis_req(padapter, NULL);
  158890. +
  158891. +#endif //CONFIG_TDLS
  158892. +
  158893. + return ret;
  158894. +}
  158895. +
  158896. +static int rtw_tdls_ch_switch(struct net_device *dev,
  158897. + struct iw_request_info *info,
  158898. + union iwreq_data *wrqu, char *extra)
  158899. +{
  158900. + int ret = 0;
  158901. +
  158902. +#ifdef CONFIG_TDLS
  158903. +
  158904. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158905. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  158906. + u8 i, j, mac_addr[ETH_ALEN];
  158907. + struct sta_info *ptdls_sta = NULL;
  158908. +
  158909. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158910. +
  158911. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  158912. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  158913. + }
  158914. +
  158915. + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
  158916. + if( ptdls_sta == NULL )
  158917. + return ret;
  158918. + ptdlsinfo->ch_sensing=1;
  158919. +
  158920. + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_INIT_CH_SEN);
  158921. +
  158922. +#endif //CONFIG_TDLS
  158923. +
  158924. + return ret;
  158925. +}
  158926. +
  158927. +static int rtw_tdls_pson(struct net_device *dev,
  158928. + struct iw_request_info *info,
  158929. + union iwreq_data *wrqu, char *extra)
  158930. +{
  158931. + int ret = 0;
  158932. +
  158933. +#ifdef CONFIG_TDLS
  158934. +
  158935. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158936. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  158937. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  158938. + u8 i, j, mac_addr[ETH_ALEN];
  158939. + struct sta_info *ptdls_sta = NULL;
  158940. +
  158941. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158942. +
  158943. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  158944. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  158945. + }
  158946. +
  158947. + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
  158948. +
  158949. + issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 1);
  158950. +
  158951. +#endif //CONFIG_TDLS
  158952. +
  158953. + return ret;
  158954. +}
  158955. +
  158956. +static int rtw_tdls_psoff(struct net_device *dev,
  158957. + struct iw_request_info *info,
  158958. + union iwreq_data *wrqu, char *extra)
  158959. +{
  158960. + int ret = 0;
  158961. +
  158962. +#ifdef CONFIG_TDLS
  158963. +
  158964. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158965. + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  158966. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  158967. + u8 i, j, mac_addr[ETH_ALEN];
  158968. + struct sta_info *ptdls_sta = NULL;
  158969. +
  158970. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  158971. +
  158972. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  158973. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  158974. + }
  158975. +
  158976. + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
  158977. +
  158978. + issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0);
  158979. +
  158980. +#endif //CONFIG_TDLS
  158981. +
  158982. + return ret;
  158983. +}
  158984. +
  158985. +static int rtw_tdls_setip(struct net_device *dev,
  158986. + struct iw_request_info *info,
  158987. + union iwreq_data *wrqu, char *extra)
  158988. +{
  158989. + int ret = 0;
  158990. +
  158991. +#ifdef CONFIG_TDLS
  158992. +#ifdef CONFIG_WFD
  158993. +
  158994. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  158995. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  158996. + struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
  158997. + u8 i=0, j=0, k=0, tag=0, ip[3] = { 0xff }, *ptr = extra;
  158998. +
  158999. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length - 1 );
  159000. +
  159001. +
  159002. + while( i < 4 )
  159003. + {
  159004. + for( j=0; j < 4; j++)
  159005. + {
  159006. + if( *( extra + j + tag ) == '.' || *( extra + j + tag ) == '\0' )
  159007. + {
  159008. + if( j == 1 )
  159009. + pwfd_info->ip_address[i]=convert_ip_addr( '0', '0', *(extra+(j-1)+tag));
  159010. + if( j == 2 )
  159011. + pwfd_info->ip_address[i]=convert_ip_addr( '0', *(extra+(j-2)+tag), *(extra+(j-1)+tag));
  159012. + if( j == 3 )
  159013. + pwfd_info->ip_address[i]=convert_ip_addr( *(extra+(j-3)+tag), *(extra+(j-2)+tag), *(extra+(j-1)+tag));
  159014. +
  159015. + tag += j + 1;
  159016. + break;
  159017. + }
  159018. + }
  159019. + i++;
  159020. + }
  159021. +
  159022. + printk( "[%s] Set IP = %u.%u.%u.%u \n", __FUNCTION__,
  159023. + ptdlsinfo->wfd_info->ip_address[0], ptdlsinfo->wfd_info->ip_address[1],
  159024. + ptdlsinfo->wfd_info->ip_address[2], ptdlsinfo->wfd_info->ip_address[3]
  159025. + );
  159026. +
  159027. +#endif //CONFIG_WFD
  159028. +#endif //CONFIG_TDLS
  159029. +
  159030. + return ret;
  159031. +}
  159032. +
  159033. +static int rtw_tdls_getip(struct net_device *dev,
  159034. + struct iw_request_info *info,
  159035. + union iwreq_data *wrqu, char *extra)
  159036. +{
  159037. + int ret = 0;
  159038. +
  159039. +#ifdef CONFIG_TDLS
  159040. +#ifdef CONFIG_WFD
  159041. +
  159042. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159043. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  159044. + struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
  159045. +
  159046. + printk( "[%s]\n", __FUNCTION__);
  159047. +
  159048. + sprintf( extra, "\n\n%u.%u.%u.%u\n",
  159049. + pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1],
  159050. + pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]
  159051. + );
  159052. +
  159053. + printk( "[%s] IP=%u.%u.%u.%u\n", __FUNCTION__,
  159054. + pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1],
  159055. + pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]
  159056. + );
  159057. +
  159058. + wrqu->data.length = strlen( extra );
  159059. +
  159060. +#endif //CONFIG_WFD
  159061. +#endif //CONFIG_TDLS
  159062. +
  159063. + return ret;
  159064. +}
  159065. +
  159066. +static int rtw_tdls_getport(struct net_device *dev,
  159067. + struct iw_request_info *info,
  159068. + union iwreq_data *wrqu, char *extra)
  159069. +{
  159070. +
  159071. + int ret = 0;
  159072. +
  159073. +#ifdef CONFIG_TDLS
  159074. +#ifdef CONFIG_WFD
  159075. +
  159076. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159077. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  159078. + struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
  159079. +
  159080. + printk( "[%s]\n", __FUNCTION__);
  159081. +
  159082. + sprintf( extra, "\n\n%d\n", pwfd_info->peer_rtsp_ctrlport );
  159083. + printk( "[%s] remote port = %d\n", __FUNCTION__, pwfd_info->peer_rtsp_ctrlport );
  159084. +
  159085. + wrqu->data.length = strlen( extra );
  159086. +
  159087. +#endif //CONFIG_WFD
  159088. +#endif //CONFIG_TDLS
  159089. +
  159090. + return ret;
  159091. +
  159092. +}
  159093. +
  159094. +//WFDTDLS, for sigma test
  159095. +static int rtw_tdls_dis_result(struct net_device *dev,
  159096. + struct iw_request_info *info,
  159097. + union iwreq_data *wrqu, char *extra)
  159098. +{
  159099. +
  159100. + int ret = 0;
  159101. +
  159102. +#ifdef CONFIG_TDLS
  159103. +#ifdef CONFIG_WFD
  159104. +
  159105. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159106. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  159107. + struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
  159108. +
  159109. + printk( "[%s]\n", __FUNCTION__);
  159110. +
  159111. + if(ptdlsinfo->dev_discovered == 1 )
  159112. + {
  159113. + sprintf( extra, "\n\nDis=1\n" );
  159114. + ptdlsinfo->dev_discovered = 0;
  159115. + }
  159116. +
  159117. + wrqu->data.length = strlen( extra );
  159118. +
  159119. +#endif //CONFIG_WFD
  159120. +#endif //CONFIG_TDLS
  159121. +
  159122. + return ret;
  159123. +
  159124. +}
  159125. +
  159126. +//WFDTDLS, for sigma test
  159127. +static int rtw_wfd_tdls_status(struct net_device *dev,
  159128. + struct iw_request_info *info,
  159129. + union iwreq_data *wrqu, char *extra)
  159130. +{
  159131. +
  159132. + int ret = 0;
  159133. +
  159134. +#ifdef CONFIG_TDLS
  159135. +#ifdef CONFIG_WFD
  159136. +
  159137. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159138. + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  159139. + struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
  159140. +
  159141. + printk( "[%s]\n", __FUNCTION__);
  159142. +
  159143. + if(ptdlsinfo->setup_state == TDLS_LINKED_STATE )
  159144. + {
  159145. + sprintf( extra, "\n\nStatus=1\n" );
  159146. + }
  159147. + else
  159148. + {
  159149. + sprintf( extra, "\n\nStatus=0\n" );
  159150. + }
  159151. +
  159152. + wrqu->data.length = strlen( extra );
  159153. +
  159154. +#endif //CONFIG_WFD
  159155. +#endif //CONFIG_TDLS
  159156. +
  159157. + return ret;
  159158. +
  159159. +}
  159160. +
  159161. +static int rtw_tdls_ch_switch_off(struct net_device *dev,
  159162. + struct iw_request_info *info,
  159163. + union iwreq_data *wrqu, char *extra)
  159164. +{
  159165. + int ret = 0;
  159166. +
  159167. +#ifdef CONFIG_TDLS
  159168. +
  159169. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159170. + u8 i, j, mac_addr[ETH_ALEN];
  159171. + struct sta_info *ptdls_sta = NULL;
  159172. +
  159173. + printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 );
  159174. +
  159175. + for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
  159176. + mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
  159177. + }
  159178. +
  159179. + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
  159180. +
  159181. + ptdls_sta->tdls_sta_state |= TDLS_SW_OFF_STATE;
  159182. +/*
  159183. + if((ptdls_sta->tdls_sta_state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE)){
  159184. + pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel;
  159185. + issue_tdls_ch_switch_req(padapter, mac_addr);
  159186. + DBG_871X("issue tdls ch switch req back to base channel\n");
  159187. + }
  159188. +*/
  159189. +
  159190. +#endif //CONFIG_TDLS
  159191. +
  159192. + return ret;
  159193. +}
  159194. +
  159195. +static int rtw_tdls(struct net_device *dev,
  159196. + struct iw_request_info *info,
  159197. + union iwreq_data *wrqu, char *extra)
  159198. +{
  159199. + int ret = 0;
  159200. +
  159201. +#ifdef CONFIG_TDLS
  159202. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159203. +
  159204. + printk( "[%s] extra = %s\n", __FUNCTION__, extra );
  159205. + // WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now!
  159206. + if ( _rtw_memcmp( extra, "wfdenable=", 10 ) )
  159207. + {
  159208. + wrqu->data.length -=10;
  159209. + rtw_wfd_tdls_enable( dev, info, wrqu, &extra[10] );
  159210. + return ret;
  159211. + }
  159212. + else if ( _rtw_memcmp( extra, "weaksec=", 8 ) )
  159213. + {
  159214. + wrqu->data.length -=8;
  159215. + rtw_tdls_weaksec( dev, info, wrqu, &extra[8] );
  159216. + return ret;
  159217. + }
  159218. + else if ( _rtw_memcmp( extra, "tdlsenable=", 11 ) )
  159219. + {
  159220. + wrqu->data.length -=11;
  159221. + rtw_tdls_enable( dev, info, wrqu, &extra[11] );
  159222. + return ret;
  159223. + }
  159224. +
  159225. + if( padapter->tdlsinfo.enable == 0 )
  159226. + {
  159227. + printk("tdls haven't enabled\n");
  159228. + return 0;
  159229. + }
  159230. +
  159231. + if ( _rtw_memcmp( extra, "setup=", 6 ) )
  159232. + {
  159233. + wrqu->data.length -=6;
  159234. + rtw_tdls_setup( dev, info, wrqu, &extra[6] );
  159235. + }
  159236. + else if (_rtw_memcmp( extra, "tear=", 5 ) )
  159237. + {
  159238. + wrqu->data.length -= 5;
  159239. + rtw_tdls_teardown( dev, info, wrqu, &extra[5] );
  159240. + }
  159241. + else if (_rtw_memcmp( extra, "dis=", 4 ) )
  159242. + {
  159243. + wrqu->data.length -= 4;
  159244. + rtw_tdls_discovery( dev, info, wrqu, &extra[4] );
  159245. + }
  159246. + else if (_rtw_memcmp( extra, "sw=", 3 ) )
  159247. + {
  159248. + wrqu->data.length -= 3;
  159249. + rtw_tdls_ch_switch( dev, info, wrqu, &extra[3] );
  159250. + }
  159251. + else if (_rtw_memcmp( extra, "swoff=", 6 ) )
  159252. + {
  159253. + wrqu->data.length -= 6;
  159254. + rtw_tdls_ch_switch_off( dev, info, wrqu, &extra[6] );
  159255. + }
  159256. + else if (_rtw_memcmp( extra, "pson=", 5 ) )
  159257. + {
  159258. + wrqu->data.length -= 5;
  159259. + rtw_tdls_pson( dev, info, wrqu, &extra[5] );
  159260. + }
  159261. + else if (_rtw_memcmp( extra, "psoff=", 6 ) )
  159262. + {
  159263. + wrqu->data.length -= 6;
  159264. + rtw_tdls_psoff( dev, info, wrqu, &extra[6] );
  159265. + }
  159266. +#ifdef CONFIG_WFD
  159267. + else if (_rtw_memcmp( extra, "setip=", 6 ) )
  159268. + {
  159269. + wrqu->data.length -= 6;
  159270. + rtw_tdls_setip( dev, info, wrqu, &extra[6] );
  159271. + }
  159272. + else if (_rtw_memcmp( extra, "tprobe=", 6 ) )
  159273. + {
  159274. + issue_tunneled_probe_req((_adapter *)rtw_netdev_priv(dev));
  159275. + }
  159276. +#endif //CONFIG_WFD
  159277. +
  159278. +#endif //CONFIG_TDLS
  159279. +
  159280. + return ret;
  159281. +}
  159282. +
  159283. +
  159284. +static int rtw_tdls_get(struct net_device *dev,
  159285. + struct iw_request_info *info,
  159286. + union iwreq_data *wrqu, char *extra)
  159287. +{
  159288. + int ret = 0;
  159289. +
  159290. +#ifdef CONFIG_WFD
  159291. +
  159292. + DBG_871X( "[%s] extra = %s\n", __FUNCTION__, (char*) wrqu->data.pointer );
  159293. +
  159294. + if ( _rtw_memcmp( wrqu->data.pointer, "ip", 2 ) )
  159295. + {
  159296. + rtw_tdls_getip( dev, info, wrqu, extra );
  159297. + }
  159298. + if ( _rtw_memcmp( wrqu->data.pointer, "port", 4 ) )
  159299. + {
  159300. + rtw_tdls_getport( dev, info, wrqu, extra );
  159301. + }
  159302. +
  159303. + //WFDTDLS, for sigma test
  159304. + if ( _rtw_memcmp( wrqu->data.pointer, "dis", 3 ) )
  159305. + {
  159306. + rtw_tdls_dis_result( dev, info, wrqu, extra );
  159307. + }
  159308. + if ( _rtw_memcmp( wrqu->data.pointer, "status", 6 ) )
  159309. + {
  159310. + rtw_wfd_tdls_status( dev, info, wrqu, extra );
  159311. + }
  159312. +
  159313. +#endif //CONFIG_WFD
  159314. +
  159315. + return ret;
  159316. +}
  159317. +
  159318. +static int rtw_pm_set(struct net_device *dev,
  159319. + struct iw_request_info *info,
  159320. + union iwreq_data *wrqu, char *extra)
  159321. +{
  159322. + int ret = 0;
  159323. + unsigned mode = 0;
  159324. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159325. +
  159326. + DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra );
  159327. +
  159328. + if ( _rtw_memcmp( extra, "lps=", 4 ) )
  159329. + {
  159330. + sscanf(extra+4, "%u", &mode);
  159331. + ret = rtw_pm_set_lps(padapter,mode);
  159332. + }
  159333. + else if ( _rtw_memcmp( extra, "ips=", 4 ) )
  159334. + {
  159335. + sscanf(extra+4, "%u", &mode);
  159336. + ret = rtw_pm_set_ips(padapter,mode);
  159337. + }
  159338. + else{
  159339. + ret = -EINVAL;
  159340. + }
  159341. +
  159342. + return ret;
  159343. +}
  159344. +
  159345. +#ifdef CONFIG_WOWLAN
  159346. +static int rtw_wowlan_ctrl(struct net_device *dev,
  159347. + struct iw_request_info *info,
  159348. + union iwreq_data *wrqu, char *extra)
  159349. +{
  159350. + int ret = 0;
  159351. + struct oid_par_priv oid_par;
  159352. + struct wowlan_ioctl_param *poidparam;
  159353. + uint status=0;
  159354. + u16 len;
  159355. + u8 *pparmbuf = NULL, bset;
  159356. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159357. +
  159358. + struct iw_point *p = &wrqu->data;
  159359. +
  159360. + //DBG_871X("+rtw_wowlan_ctrl\n");
  159361. +
  159362. + //mutex_lock(&ioctl_mutex);
  159363. +
  159364. + if ((!p->length) || (!p->pointer)) {
  159365. + ret = -EINVAL;
  159366. + goto _rtw_wowlan_ctrl_exit;
  159367. + }
  159368. +
  159369. + pparmbuf = NULL;
  159370. + bset = (u8)(p->flags & 0xFFFF);
  159371. + len = p->length;
  159372. + pparmbuf = (u8*)rtw_malloc(len);
  159373. + if (pparmbuf == NULL){
  159374. + ret = -ENOMEM;
  159375. + goto _rtw_wowlan_ctrl_exit;
  159376. + }
  159377. +
  159378. + if (copy_from_user(pparmbuf, p->pointer, len)) {
  159379. + ret = -EFAULT;
  159380. + goto _rtw_wowlan_ctrl_exit_free;
  159381. + }
  159382. + poidparam = (struct wowlan_ioctl_param *)pparmbuf;
  159383. +
  159384. + if(padapter->pwrctrlpriv.bSupportRemoteWakeup==_FALSE){
  159385. + ret = -EPERM;
  159386. + DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n");
  159387. + goto _rtw_wowlan_ctrl_exit_free;
  159388. + }
  159389. + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)poidparam);
  159390. +
  159391. + DBG_871X("rtw_wowlan_ctrl: subcode [%d], len[%d], buffer_len[%d]\r\n",
  159392. + poidparam->subcode, poidparam->len, len);
  159393. +
  159394. + if (copy_to_user(p->pointer, pparmbuf, len)) {
  159395. + ret = -EFAULT;
  159396. + }
  159397. +
  159398. +
  159399. +_rtw_wowlan_ctrl_exit_free:
  159400. + //DBG_871X("-rtw_wowlan_ctrl( subcode = %d)\n", poidparam->subcode);
  159401. + rtw_mfree(pparmbuf, len);
  159402. +_rtw_wowlan_ctrl_exit:
  159403. +
  159404. +
  159405. + return ret;
  159406. +}
  159407. +#endif //CONFIG_WOWLAN
  159408. +
  159409. +#ifdef CONFIG_INTEL_WIDI
  159410. +static int rtw_widi_set(struct net_device *dev,
  159411. + struct iw_request_info *info,
  159412. + union iwreq_data *wrqu, char *extra)
  159413. +{
  159414. + int ret = 0;
  159415. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159416. +
  159417. + process_intel_widi_cmd(padapter, extra);
  159418. +
  159419. + return ret;
  159420. +}
  159421. +
  159422. +static int rtw_widi_set_probe_request(struct net_device *dev,
  159423. + struct iw_request_info *info,
  159424. + union iwreq_data *wrqu, char *extra)
  159425. +{
  159426. + int ret = 0;
  159427. + u8 *pbuf = NULL;
  159428. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  159429. +
  159430. + pbuf = rtw_malloc(sizeof(l2_msg_t));
  159431. + if(pbuf)
  159432. + {
  159433. + copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length);
  159434. + //_rtw_memcpy(pbuf, wrqu->data.pointer, wrqu->data.length);
  159435. +
  159436. + if( wrqu->data.flags == 0 )
  159437. + intel_widi_wk_cmd(padapter, INTEL_WIDI_ISSUE_PROB_WK, pbuf);
  159438. + else if( wrqu->data.flags == 1 )
  159439. + rtw_set_wfd_rds_sink_info( padapter, (l2_msg_t *)pbuf );
  159440. + }
  159441. + return ret;
  159442. +}
  159443. +
  159444. +#endif // CONFIG_INTEL_WIDI
  159445. +
  159446. +#ifdef RTL8723A_SDIO_LOOPBACK
  159447. +#include <rtl8723a_hal.h>
  159448. +
  159449. +static s32 initLoopback(PADAPTER padapter)
  159450. +{
  159451. + PLOOPBACKDATA ploopback;
  159452. +
  159453. +
  159454. + if (padapter->ploopback == NULL) {
  159455. + ploopback = (PLOOPBACKDATA)rtw_zmalloc(sizeof(LOOPBACKDATA));
  159456. + if (ploopback == NULL) return -ENOMEM;
  159457. +
  159458. + _rtw_init_sema(&ploopback->sema, 0);
  159459. +
  159460. + ploopback->bstop = _TRUE;
  159461. + ploopback->cnt = 0;
  159462. + ploopback->size = 300;
  159463. + _rtw_memset(ploopback->msg, 0, sizeof(ploopback->msg));
  159464. +
  159465. + padapter->ploopback = ploopback;
  159466. + }
  159467. +
  159468. + return 0;
  159469. +}
  159470. +
  159471. +static void freeLoopback(PADAPTER padapter)
  159472. +{
  159473. + PLOOPBACKDATA ploopback;
  159474. +
  159475. +
  159476. + ploopback = padapter->ploopback;
  159477. + if (ploopback) {
  159478. + rtw_mfree((u8*)ploopback, sizeof(LOOPBACKDATA));
  159479. + padapter->ploopback = NULL;
  159480. + }
  159481. +}
  159482. +
  159483. +static s32 initpseudoadhoc(PADAPTER padapter)
  159484. +{
  159485. + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType;
  159486. + s32 err;
  159487. + _irqL irqL;
  159488. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  159489. + _queue *queue = &pmlmepriv->scanned_queue;
  159490. +
  159491. + networkType = Ndis802_11IBSS;
  159492. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  159493. + _enter_critical_bh(&queue->lock, &irqL);
  159494. + err = rtw_set_802_11_infrastructure_mode(padapter, networkType);
  159495. + _exit_critical_bh(&queue->lock, &irqL);
  159496. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  159497. + if (err == _FALSE) return _FAIL;
  159498. +
  159499. + err = rtw_setopmode_cmd(padapter, networkType);
  159500. + if (err == _FAIL) return _FAIL;
  159501. +
  159502. + return _SUCCESS;
  159503. +}
  159504. +
  159505. +static s32 createpseudoadhoc(PADAPTER padapter)
  159506. +{
  159507. + NDIS_802_11_AUTHENTICATION_MODE authmode;
  159508. + struct mlme_priv *pmlmepriv;
  159509. + NDIS_802_11_SSID *passoc_ssid;
  159510. + WLAN_BSSID_EX *pdev_network;
  159511. + u8 *pibss;
  159512. + u8 ssid[] = "pseduo_ad-hoc";
  159513. + s32 err;
  159514. + _irqL irqL;
  159515. +
  159516. +
  159517. + pmlmepriv = &padapter->mlmepriv;
  159518. +
  159519. + authmode = Ndis802_11AuthModeOpen;
  159520. + err = rtw_set_802_11_authentication_mode(padapter, authmode);
  159521. + if (err == _FALSE) return _FAIL;
  159522. +
  159523. + passoc_ssid = &pmlmepriv->assoc_ssid;
  159524. + _rtw_memset(passoc_ssid, 0, sizeof(NDIS_802_11_SSID));
  159525. + passoc_ssid->SsidLength = sizeof(ssid) - 1;
  159526. + _rtw_memcpy(passoc_ssid->Ssid, ssid, passoc_ssid->SsidLength);
  159527. +
  159528. + pdev_network = &padapter->registrypriv.dev_network;
  159529. + pibss = padapter->registrypriv.dev_network.MacAddress;
  159530. + _rtw_memcpy(&pdev_network->Ssid, passoc_ssid, sizeof(NDIS_802_11_SSID));
  159531. +
  159532. + rtw_update_registrypriv_dev_network(padapter);
  159533. + rtw_generate_random_ibss(pibss);
  159534. +
  159535. + _enter_critical_bh(&pmlmepriv->lock, &irqL);
  159536. + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
  159537. + _exit_critical_bh(&pmlmepriv->lock, &irqL);
  159538. +
  159539. +#if 0
  159540. + err = rtw_createbss_cmd(padapter);
  159541. + if (err == _FAIL) return _FAIL;
  159542. +#else
  159543. +{
  159544. + struct wlan_network *pcur_network;
  159545. + struct sta_info *psta;
  159546. +
  159547. + //3 create a new psta
  159548. + pcur_network = &pmlmepriv->cur_network;
  159549. +
  159550. + //clear psta in the cur_network, if any
  159551. + psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress);
  159552. + if (psta) rtw_free_stainfo(padapter, psta);
  159553. +
  159554. + psta = rtw_alloc_stainfo(&padapter->stapriv, pibss);
  159555. + if (psta == NULL) return _FAIL;
  159556. +
  159557. + //3 join psudo AdHoc
  159558. + pcur_network->join_res = 1;
  159559. + pcur_network->aid = psta->aid = 1;
  159560. + _rtw_memcpy(&pcur_network->network, pdev_network, get_WLAN_BSSID_EX_sz(pdev_network));
  159561. +
  159562. + // set msr to WIFI_FW_ADHOC_STATE
  159563. +#if 0
  159564. + Set_NETYPE0_MSR(padapter, WIFI_FW_ADHOC_STATE);
  159565. +#else
  159566. + {
  159567. + u8 val8;
  159568. +
  159569. + val8 = rtw_read8(padapter, MSR);
  159570. + val8 &= 0xFC; // clear NETYPE0
  159571. + val8 |= WIFI_FW_ADHOC_STATE & 0x3;
  159572. + rtw_write8(padapter, MSR, val8);
  159573. + }
  159574. +#endif
  159575. +}
  159576. +#endif
  159577. +
  159578. + return _SUCCESS;
  159579. +}
  159580. +
  159581. +extern void rtl8723a_cal_txdesc_chksum(struct tx_desc *ptxdesc);
  159582. +extern void rtl8723a_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);
  159583. +
  159584. +static struct xmit_frame* createloopbackpkt(PADAPTER padapter, u32 size)
  159585. +{
  159586. + struct xmit_priv *pxmitpriv;
  159587. + struct xmit_frame *pframe;
  159588. + struct xmit_buf *pxmitbuf;
  159589. + struct pkt_attrib *pattrib;
  159590. + struct tx_desc *desc;
  159591. + u8 *pkt_start, *pkt_end, *ptr;
  159592. + struct rtw_ieee80211_hdr *hdr;
  159593. + s32 bmcast;
  159594. + _irqL irqL;
  159595. +
  159596. +
  159597. + if ((TXDESC_SIZE + WLANHDR_OFFSET + size) > MAX_XMITBUF_SZ) return NULL;
  159598. +
  159599. + pxmitpriv = &padapter->xmitpriv;
  159600. + pframe = NULL;
  159601. +
  159602. + //2 1. allocate xmit frame
  159603. + pframe = rtw_alloc_xmitframe(pxmitpriv);
  159604. + if (pframe == NULL) return NULL;
  159605. + pframe->padapter = padapter;
  159606. +
  159607. + //2 2. allocate xmit buffer
  159608. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  159609. + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
  159610. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  159611. + if (pxmitbuf == NULL) {
  159612. + rtw_free_xmitframe(pxmitpriv, pframe);
  159613. + return NULL;
  159614. + }
  159615. +
  159616. + pframe->pxmitbuf = pxmitbuf;
  159617. + pframe->buf_addr = pxmitbuf->pbuf;
  159618. + pxmitbuf->priv_data = pframe;
  159619. +
  159620. + //2 3. update_attrib()
  159621. + pattrib = &pframe->attrib;
  159622. +
  159623. + // init xmitframe attribute
  159624. + _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));
  159625. +
  159626. + pattrib->ether_type = 0x8723;
  159627. + _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN);
  159628. + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  159629. + _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
  159630. + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  159631. +// pattrib->pctrl = 0;
  159632. +// pattrib->dhcp_pkt = 0;
  159633. +// pattrib->pktlen = 0;
  159634. + pattrib->ack_policy = 0;
  159635. +// pattrib->pkt_hdrlen = ETH_HLEN;
  159636. + pattrib->hdrlen = WLAN_HDR_A3_LEN;
  159637. + pattrib->subtype = WIFI_DATA;
  159638. + pattrib->priority = 0;
  159639. + pattrib->qsel = pattrib->priority;
  159640. +// do_queue_select(padapter, pattrib);
  159641. + pattrib->nr_frags = 1;
  159642. + pattrib->encrypt = 0;
  159643. + pattrib->bswenc = _FALSE;
  159644. + pattrib->qos_en = _FALSE;
  159645. +
  159646. + bmcast = IS_MCAST(pattrib->ra);
  159647. + if (bmcast) {
  159648. + pattrib->mac_id = 1;
  159649. + pattrib->psta = rtw_get_bcmc_stainfo(padapter);
  159650. + } else {
  159651. + pattrib->mac_id = 0;
  159652. + pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
  159653. + }
  159654. +
  159655. + pattrib->pktlen = size;
  159656. + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;
  159657. +
  159658. + //2 4. fill TX descriptor
  159659. + desc = (struct tx_desc*)pframe->buf_addr;
  159660. + _rtw_memset(desc, 0, TXDESC_SIZE);
  159661. +
  159662. + rtl8723a_fill_default_txdesc(pframe, (u8*)desc);
  159663. +
  159664. + // Hw set sequence number
  159665. + ((PTXDESC)desc)->hwseq_en = 0; // HWSEQ_EN, 0:disable, 1:enable
  159666. +// ((PTXDESC)desc)->hwseq_sel = 0; // HWSEQ_SEL
  159667. +
  159668. + ((PTXDESC)desc)->disdatafb = 1;
  159669. +
  159670. + // convert to little endian
  159671. + desc->txdw0 = cpu_to_le32(desc->txdw0);
  159672. + desc->txdw1 = cpu_to_le32(desc->txdw1);
  159673. + desc->txdw2 = cpu_to_le32(desc->txdw2);
  159674. + desc->txdw3 = cpu_to_le32(desc->txdw3);
  159675. + desc->txdw4 = cpu_to_le32(desc->txdw4);
  159676. + desc->txdw5 = cpu_to_le32(desc->txdw5);
  159677. + desc->txdw6 = cpu_to_le32(desc->txdw6);
  159678. + desc->txdw7 = cpu_to_le32(desc->txdw7);
  159679. +#ifdef CONFIG_PCI_HCI
  159680. + desc->txdw8 = cpu_to_le32(desc->txdw8);
  159681. + desc->txdw9 = cpu_to_le32(desc->txdw9);
  159682. + desc->txdw10 = cpu_to_le32(desc->txdw10);
  159683. + desc->txdw11 = cpu_to_le32(desc->txdw11);
  159684. + desc->txdw12 = cpu_to_le32(desc->txdw12);
  159685. + desc->txdw13 = cpu_to_le32(desc->txdw13);
  159686. + desc->txdw14 = cpu_to_le32(desc->txdw14);
  159687. + desc->txdw15 = cpu_to_le32(desc->txdw15);
  159688. +#endif
  159689. +
  159690. + rtl8723a_cal_txdesc_chksum(desc);
  159691. +
  159692. + //2 5. coalesce
  159693. + pkt_start = pframe->buf_addr + TXDESC_SIZE;
  159694. + pkt_end = pkt_start + pattrib->last_txcmdsz;
  159695. +
  159696. + //3 5.1. make wlan header, make_wlanhdr()
  159697. + hdr = (struct rtw_ieee80211_hdr *)pkt_start;
  159698. + SetFrameSubType(&hdr->frame_ctl, pattrib->subtype);
  159699. + _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA
  159700. + _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA
  159701. + _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID
  159702. +
  159703. + //3 5.2. make payload
  159704. + ptr = pkt_start + pattrib->hdrlen;
  159705. + get_random_bytes(ptr, pkt_end - ptr);
  159706. +
  159707. + pxmitbuf->len = TXDESC_SIZE + pattrib->last_txcmdsz;
  159708. + pxmitbuf->ptail += pxmitbuf->len;
  159709. +
  159710. + return pframe;
  159711. +}
  159712. +
  159713. +static void freeloopbackpkt(PADAPTER padapter, struct xmit_frame *pframe)
  159714. +{
  159715. + struct xmit_priv *pxmitpriv;
  159716. + struct xmit_buf *pxmitbuf;
  159717. +
  159718. +
  159719. + pxmitpriv = &padapter->xmitpriv;
  159720. + pxmitbuf = pframe->pxmitbuf;
  159721. +
  159722. + rtw_free_xmitframe(pxmitpriv, pframe);
  159723. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  159724. +}
  159725. +
  159726. +extern u32 get_txfifo_hwaddr(struct xmit_frame *pxmitframe);
  159727. +
  159728. +thread_return lbk_thread(thread_context context)
  159729. +{
  159730. + s32 err;
  159731. + PADAPTER padapter;
  159732. + PLOOPBACKDATA ploopback;
  159733. + struct xmit_frame *pxmitframe;
  159734. + u32 cnt, ok, fail, i, headerlen;
  159735. + u32 pktsize;
  159736. + u32 ff_hwaddr;
  159737. +
  159738. +
  159739. + padapter = (PADAPTER)context;
  159740. + ploopback = padapter->ploopback;
  159741. + if (ploopback == NULL) return -1;
  159742. + cnt = 0;
  159743. + ok = 0;
  159744. + fail = 0;
  159745. +
  159746. + daemonize("%s", "RTW_LBK_THREAD");
  159747. + allow_signal(SIGTERM);
  159748. +
  159749. + do {
  159750. + if (ploopback->size == 0) {
  159751. + get_random_bytes(&pktsize, 4);
  159752. + pktsize = (pktsize % 1535) + 1; // 1~1535
  159753. + } else
  159754. + pktsize = ploopback->size;
  159755. +
  159756. + pxmitframe = createloopbackpkt(padapter, pktsize);
  159757. + if (pxmitframe == NULL) {
  159758. + sprintf(ploopback->msg, "loopback FAIL! 3. create Packet FAIL!");
  159759. + break;
  159760. + }
  159761. +
  159762. + ploopback->txsize = TXDESC_SIZE + pxmitframe->attrib.last_txcmdsz;
  159763. + _rtw_memcpy(ploopback->txbuf, pxmitframe->buf_addr, ploopback->txsize);
  159764. +
  159765. + ff_hwaddr = get_txfifo_hwaddr(pxmitframe);
  159766. + rtw_write_port(padapter, ff_hwaddr, ploopback->txsize, ploopback->txbuf);
  159767. + cnt++;
  159768. +
  159769. + _rtw_down_sema(&ploopback->sema);
  159770. +
  159771. +{
  159772. + PHAL_DATA_TYPE phal;
  159773. + struct recv_stat *prxstat;
  159774. + struct recv_stat report;
  159775. + PRXREPORT prxreport;
  159776. + u32 drvinfosize;
  159777. + u32 rxpktsize;
  159778. + u8 fcssize;
  159779. +
  159780. + prxstat = (struct recv_stat*)ploopback->rxbuf;
  159781. + report.rxdw0 = le32_to_cpu(prxstat->rxdw0);
  159782. + report.rxdw1 = le32_to_cpu(prxstat->rxdw1);
  159783. + report.rxdw2 = le32_to_cpu(prxstat->rxdw2);
  159784. + report.rxdw3 = le32_to_cpu(prxstat->rxdw3);
  159785. + report.rxdw4 = le32_to_cpu(prxstat->rxdw4);
  159786. + report.rxdw5 = le32_to_cpu(prxstat->rxdw5);
  159787. +
  159788. + prxreport = (PRXREPORT)&report;
  159789. + drvinfosize = prxreport->drvinfosize << 3;
  159790. + rxpktsize = prxreport->pktlen;
  159791. +
  159792. + phal = GET_HAL_DATA(padapter);
  159793. + if (phal->ReceiveConfig & RCR_APPFCS) fcssize = IEEE80211_FCS_LEN;
  159794. + else fcssize = 0;
  159795. +
  159796. + if ((ploopback->txsize - TXDESC_SIZE) != (rxpktsize - fcssize)) {
  159797. + printk("%s: cnt=%d, size not match! tx=%d rx=%d\n",
  159798. + __func__, i, ploopback->txsize - TXDESC_SIZE,
  159799. + rxpktsize - fcssize);
  159800. + err = _FALSE;
  159801. + } else {
  159802. + err = _rtw_memcmp(ploopback->txbuf + TXDESC_SIZE,\
  159803. + ploopback->rxbuf + RXDESC_SIZE + drvinfosize,\
  159804. + ploopback->txsize - TXDESC_SIZE);
  159805. + }
  159806. +}
  159807. +
  159808. + if (err == _TRUE)
  159809. + ok++;
  159810. + else
  159811. + fail++;
  159812. +
  159813. + ploopback->txsize = 0;
  159814. + _rtw_memset(ploopback->txbuf, 0, 0x8000);
  159815. + ploopback->rxsize = 0;
  159816. + _rtw_memset(ploopback->rxbuf, 0, 0x8000);
  159817. +
  159818. + freeloopbackpkt(padapter, pxmitframe);
  159819. + pxmitframe = NULL;
  159820. +
  159821. + if (signal_pending(current)) {
  159822. + flush_signals(current);
  159823. + }
  159824. +
  159825. + if ((ploopback->bstop == _TRUE) ||
  159826. + ((ploopback->cnt != 0) && (ploopback->cnt == cnt)))
  159827. + {
  159828. + u32 ok_rate, fail_rate;
  159829. + ok_rate = (ok*100)/cnt;
  159830. + fail_rate = (fail*100)/cnt;
  159831. + sprintf(ploopback->msg, "loopback result: ok=%d%%(%d/%d),error=%d%%(%d/%d)", ok_rate, ok, cnt, fail_rate, fail, cnt);
  159832. + break;
  159833. + }
  159834. + } while (1);
  159835. +
  159836. + ploopback->bstop = _TRUE;
  159837. +
  159838. + thread_exit();
  159839. +}
  159840. +
  159841. +static void loopbackTest(PADAPTER padapter, u32 cnt, u32 size, u8* pmsg)
  159842. +{
  159843. + PLOOPBACKDATA ploopback;
  159844. + u32 len;
  159845. + s32 err;
  159846. +
  159847. +
  159848. + ploopback = padapter->ploopback;
  159849. +
  159850. + if (ploopback)
  159851. + {
  159852. + ploopback->bstop = _TRUE;
  159853. + len = 0;
  159854. + do {
  159855. + len = strlen(ploopback->msg);
  159856. + if (len) break;
  159857. + rtw_msleep_os(1);
  159858. + } while (1);
  159859. + _rtw_memcpy(pmsg, ploopback->msg, len+1);
  159860. + freeLoopback(padapter);
  159861. + return;
  159862. + }
  159863. +
  159864. + // create pseudo ad-hoc connection
  159865. + err = initpseudoadhoc(padapter);
  159866. + if (err == _FAIL) {
  159867. + sprintf(pmsg, "loopback FAIL! 1.1 init ad-hoc FAIL!");
  159868. + return;
  159869. + }
  159870. +
  159871. + err = createpseudoadhoc(padapter);
  159872. + if (err == _FAIL) {
  159873. + sprintf(pmsg, "loopback FAIL! 1.2 create ad-hoc master FAIL!");
  159874. + return;
  159875. + }
  159876. +
  159877. + err = initLoopback(padapter);
  159878. + if (err) {
  159879. + sprintf(pmsg, "loopback FAIL! 2. init FAIL! error code=%d", err);
  159880. + return;
  159881. + }
  159882. +
  159883. + ploopback = padapter->ploopback;
  159884. +
  159885. + ploopback->bstop = _FALSE;
  159886. + ploopback->cnt = cnt;
  159887. + ploopback->size = size;
  159888. + ploopback->lbkthread = kthread_run(lbk_thread, padapter, "RTW_LBK_THREAD");
  159889. + if (IS_ERR(padapter->lbkthread))
  159890. + {
  159891. + freeLoopback(padapter);
  159892. + sprintf(pmsg, "loopback start FAIL! cnt=%d", cnt);
  159893. + return;
  159894. + }
  159895. +
  159896. + sprintf(pmsg, "loopback start! cnt=%d", cnt);
  159897. +}
  159898. +
  159899. +extern u8 _InitPowerOn(PADAPTER padapter);
  159900. +extern s32 rtl8723a_FirmwareDownload(PADAPTER padapter);
  159901. +
  159902. +static int rtw_test(
  159903. + struct net_device *dev,
  159904. + struct iw_request_info *info,
  159905. + union iwreq_data *wrqu, char *extra)
  159906. +{
  159907. + u32 len;
  159908. + u8 *pbuf, *pch;
  159909. + char *ptmp;
  159910. + u8 *delim = ",";
  159911. + PADAPTER padapter = rtw_netdev_priv(dev);
  159912. +
  159913. +
  159914. + printk("+%s\n", __func__);
  159915. + len = wrqu->data.length;
  159916. +
  159917. + pbuf = (u8*)rtw_zmalloc(len);
  159918. + if (pbuf == NULL) {
  159919. + printk("%s: no memory!\n", __func__);
  159920. + return -ENOMEM;
  159921. + }
  159922. +
  159923. + if (copy_from_user(pbuf, wrqu->data.pointer, len)) {
  159924. + rtw_mfree(pbuf, len);
  159925. + printk("%s: copy from user fail!\n", __func__);
  159926. + return -EFAULT;
  159927. + }
  159928. + printk("%s: string=\"%s\"\n", __func__, pbuf);
  159929. +
  159930. + ptmp = (char*)pbuf;
  159931. + pch = strsep(&ptmp, delim);
  159932. + if ((pch == NULL) || (strlen(pch) == 0)) {
  159933. + rtw_mfree(pbuf, len);
  159934. + printk("%s: parameter error(level 1)!\n", __func__);
  159935. + return -EFAULT;
  159936. + }
  159937. +
  159938. +#ifdef RTL8723A_SDIO_LOOPBACK
  159939. + if (strcmp(pch, "loopback") == 0)
  159940. + {
  159941. + s32 cnt = 0;
  159942. + u32 size = 64;
  159943. +
  159944. + pch = strsep(&ptmp, delim);
  159945. + if ((pch == NULL) || (strlen(pch) == 0)) {
  159946. + rtw_mfree(pbuf, len);
  159947. + printk("%s: parameter error(level 2)!\n", __func__);
  159948. + return -EFAULT;
  159949. + }
  159950. +
  159951. + sscanf(pch, "%d", &cnt);
  159952. + printk("%s: loopback cnt=%d\n", __func__, cnt);
  159953. +
  159954. + pch = strsep(&ptmp, delim);
  159955. + if ((pch == NULL) || (strlen(pch) == 0)) {
  159956. + rtw_mfree(pbuf, len);
  159957. + printk("%s: parameter error(level 2)!\n", __func__);
  159958. + return -EFAULT;
  159959. + }
  159960. +
  159961. + sscanf(pch, "%d", &size);
  159962. + printk("%s: loopback size=%d\n", __func__, size);
  159963. +
  159964. + loopbackTest(padapter, cnt, size, extra);
  159965. + wrqu->data.length = strlen(extra) + 1;
  159966. +
  159967. + rtw_mfree(pbuf, len);
  159968. + return 0;
  159969. + }
  159970. +#endif
  159971. +
  159972. + if (strcmp(pch, "poweron") == 0)
  159973. + {
  159974. + s32 ret;
  159975. +
  159976. + ret = _InitPowerOn(padapter);
  159977. + if (_FAIL == ret)
  159978. + printk("%s: power on FAIL!\n", __func__);
  159979. + else
  159980. + printk("%s: power on OK.\n", __func__);
  159981. +
  159982. + rtw_mfree(pbuf, len);
  159983. + return 0;
  159984. + }
  159985. +
  159986. + if (strcmp(pch, "dlfw") == 0)
  159987. + {
  159988. + s32 ret;
  159989. +
  159990. + ret = rtl8723a_FirmwareDownload(padapter);
  159991. + if (_FAIL == ret)
  159992. + printk("%s: download FW FAIL!\n", __func__);
  159993. + else
  159994. + printk("%s: download FW OK.\n", __func__);
  159995. +
  159996. + rtw_mfree(pbuf, len);
  159997. + return 0;
  159998. + }
  159999. +
  160000. + rtw_mfree(pbuf, len);
  160001. + return 0;
  160002. +}
  160003. +#else
  160004. +static int rtw_test(
  160005. + struct net_device *dev,
  160006. + struct iw_request_info *info,
  160007. + union iwreq_data *wrqu, char *extra)
  160008. +{
  160009. + printk("%s\n", __func__);
  160010. + return 0;
  160011. +}
  160012. +#endif //RTL8723A_SDIO_LOOPBACK
  160013. +
  160014. +#include <rtw_android.h>
  160015. +int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  160016. +{
  160017. + struct iwreq *wrq = (struct iwreq *)rq;
  160018. + int ret=0;
  160019. +
  160020. + switch (cmd)
  160021. + {
  160022. + case RTL_IOCTL_WPA_SUPPLICANT:
  160023. + ret = wpa_supplicant_ioctl(dev, &wrq->u.data);
  160024. + break;
  160025. +#ifdef CONFIG_AP_MODE
  160026. + case RTL_IOCTL_HOSTAPD:
  160027. + ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
  160028. + break;
  160029. +#ifdef CONFIG_NO_WIRELESS_HANDLERS
  160030. + case SIOCSIWMODE:
  160031. + ret = rtw_wx_set_mode(dev, NULL, &wrq->u, NULL);
  160032. + break;
  160033. +#endif
  160034. +#endif
  160035. + case (SIOCDEVPRIVATE+1):
  160036. + ret = rtw_android_priv_cmd(dev, rq, cmd);
  160037. + break;
  160038. + default:
  160039. + ret = -EOPNOTSUPP;
  160040. + break;
  160041. + }
  160042. +
  160043. + return ret;
  160044. +}
  160045. +
  160046. +static iw_handler rtw_handlers[] =
  160047. +{
  160048. + NULL, /* SIOCSIWCOMMIT */
  160049. + rtw_wx_get_name, /* SIOCGIWNAME */
  160050. + dummy, /* SIOCSIWNWID */
  160051. + dummy, /* SIOCGIWNWID */
  160052. + rtw_wx_set_freq, /* SIOCSIWFREQ */
  160053. + rtw_wx_get_freq, /* SIOCGIWFREQ */
  160054. + rtw_wx_set_mode, /* SIOCSIWMODE */
  160055. + rtw_wx_get_mode, /* SIOCGIWMODE */
  160056. + dummy, /* SIOCSIWSENS */
  160057. + rtw_wx_get_sens, /* SIOCGIWSENS */
  160058. + NULL, /* SIOCSIWRANGE */
  160059. + rtw_wx_get_range, /* SIOCGIWRANGE */
  160060. + rtw_wx_set_priv, /* SIOCSIWPRIV */
  160061. + NULL, /* SIOCGIWPRIV */
  160062. + NULL, /* SIOCSIWSTATS */
  160063. + NULL, /* SIOCGIWSTATS */
  160064. + dummy, /* SIOCSIWSPY */
  160065. + dummy, /* SIOCGIWSPY */
  160066. + NULL, /* SIOCGIWTHRSPY */
  160067. + NULL, /* SIOCWIWTHRSPY */
  160068. + rtw_wx_set_wap, /* SIOCSIWAP */
  160069. + rtw_wx_get_wap, /* SIOCGIWAP */
  160070. + rtw_wx_set_mlme, /* request MLME operation; uses struct iw_mlme */
  160071. + dummy, /* SIOCGIWAPLIST -- depricated */
  160072. + rtw_wx_set_scan, /* SIOCSIWSCAN */
  160073. + rtw_wx_get_scan, /* SIOCGIWSCAN */
  160074. + rtw_wx_set_essid, /* SIOCSIWESSID */
  160075. + rtw_wx_get_essid, /* SIOCGIWESSID */
  160076. + dummy, /* SIOCSIWNICKN */
  160077. + rtw_wx_get_nick, /* SIOCGIWNICKN */
  160078. + NULL, /* -- hole -- */
  160079. + NULL, /* -- hole -- */
  160080. + rtw_wx_set_rate, /* SIOCSIWRATE */
  160081. + rtw_wx_get_rate, /* SIOCGIWRATE */
  160082. + rtw_wx_set_rts, /* SIOCSIWRTS */
  160083. + rtw_wx_get_rts, /* SIOCGIWRTS */
  160084. + rtw_wx_set_frag, /* SIOCSIWFRAG */
  160085. + rtw_wx_get_frag, /* SIOCGIWFRAG */
  160086. + dummy, /* SIOCSIWTXPOW */
  160087. + dummy, /* SIOCGIWTXPOW */
  160088. + dummy, /* SIOCSIWRETRY */
  160089. + rtw_wx_get_retry, /* SIOCGIWRETRY */
  160090. + rtw_wx_set_enc, /* SIOCSIWENCODE */
  160091. + rtw_wx_get_enc, /* SIOCGIWENCODE */
  160092. + dummy, /* SIOCSIWPOWER */
  160093. + rtw_wx_get_power, /* SIOCGIWPOWER */
  160094. + NULL, /*---hole---*/
  160095. + NULL, /*---hole---*/
  160096. + rtw_wx_set_gen_ie, /* SIOCSIWGENIE */
  160097. + NULL, /* SIOCGWGENIE */
  160098. + rtw_wx_set_auth, /* SIOCSIWAUTH */
  160099. + NULL, /* SIOCGIWAUTH */
  160100. + rtw_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
  160101. + NULL, /* SIOCGIWENCODEEXT */
  160102. + rtw_wx_set_pmkid, /* SIOCSIWPMKSA */
  160103. + NULL, /*---hole---*/
  160104. +};
  160105. +
  160106. +#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
  160107. +
  160108. +static const struct iw_priv_args rtw_private_args[] =
  160109. +{
  160110. + { SIOCIWFIRSTPRIV + 0x00, IW_PRIV_TYPE_CHAR | 1024, 0 , ""}, //set
  160111. + { SIOCIWFIRSTPRIV + 0x01, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , ""},//get
  160112. +/* --- sub-ioctls definitions --- */
  160113. + { MP_START , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_start" }, //set
  160114. + { MP_PHYPARA, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_phypara" },//get
  160115. + { MP_STOP , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_stop" }, //set
  160116. + { MP_CHANNEL , IW_PRIV_TYPE_CHAR | 1024 , IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_channel" },//get
  160117. + { MP_BANDWIDTH , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_bandwidth"}, //set
  160118. + { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" },//get
  160119. + { MP_RESET_STATS , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_reset_stats"},
  160120. + { MP_QUERY , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "mp_query"}, //get
  160121. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160122. + { READ_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_reg" },
  160123. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160124. + { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" },
  160125. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160126. + { READ_RF , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_rf" },
  160127. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160128. + { MP_PSD , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_psd"},
  160129. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160130. + { MP_DUMP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_dump" },
  160131. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160132. + { MP_TXPOWER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_txpower"},
  160133. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160134. + { MP_ANT_TX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_tx"},
  160135. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160136. + { MP_ANT_RX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_rx"},
  160137. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160138. + { WRITE_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "write_reg" },
  160139. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160140. + { WRITE_RF , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "write_rf" },
  160141. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160142. + { MP_CTX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ctx"},
  160143. + { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
  160144. + { MP_ARX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_arx"},
  160145. + { MP_ANT_RX , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_ant_rx"},
  160146. + { MP_THER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ther"},
  160147. + { EFUSE_SET, IW_PRIV_TYPE_CHAR | 1024, 0, "efuse_set" },
  160148. + { EFUSE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get" },
  160149. + { MP_NULL , IW_PRIV_TYPE_CHAR | 1024, 0, "NULL"},
  160150. + { MP_PWRTRK, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_pwrtrk" },
  160151. + { MP_IOCTL, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_ioctl"}, // mp_ioctl
  160152. +
  160153. +
  160154. + { SIOCIWFIRSTPRIV + 0x02, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "test"},//set
  160155. +};
  160156. +
  160157. +
  160158. +static iw_handler rtw_private_handler[] =
  160159. +{
  160160. + rtw_mp_set,
  160161. + rtw_mp_get,
  160162. +};
  160163. +
  160164. +#else // not inlucde MP
  160165. +
  160166. +static const struct iw_priv_args rtw_private_args[] = {
  160167. + {
  160168. + SIOCIWFIRSTPRIV + 0x0,
  160169. + IW_PRIV_TYPE_CHAR | 0x7FF, 0, "write"
  160170. + },
  160171. + {
  160172. + SIOCIWFIRSTPRIV + 0x1,
  160173. + IW_PRIV_TYPE_CHAR | 0x7FF,
  160174. + IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "read"
  160175. + },
  160176. + {
  160177. + SIOCIWFIRSTPRIV + 0x2, 0, 0, "driver_ext"
  160178. + },
  160179. + {
  160180. + SIOCIWFIRSTPRIV + 0x3, 0, 0, "mp_ioctl"
  160181. + },
  160182. + {
  160183. + SIOCIWFIRSTPRIV + 0x4,
  160184. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "apinfo"
  160185. + },
  160186. + {
  160187. + SIOCIWFIRSTPRIV + 0x5,
  160188. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setpid"
  160189. + },
  160190. + {
  160191. + SIOCIWFIRSTPRIV + 0x6,
  160192. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_start"
  160193. + },
  160194. +//for PLATFORM_MT53XX
  160195. + {
  160196. + SIOCIWFIRSTPRIV + 0x7,
  160197. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "get_sensitivity"
  160198. + },
  160199. + {
  160200. + SIOCIWFIRSTPRIV + 0x8,
  160201. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_prob_req_ie"
  160202. + },
  160203. + {
  160204. + SIOCIWFIRSTPRIV + 0x9,
  160205. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "wps_assoc_req_ie"
  160206. + },
  160207. +
  160208. +//for RTK_DMP_PLATFORM
  160209. + {
  160210. + SIOCIWFIRSTPRIV + 0xA,
  160211. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "channel_plan"
  160212. + },
  160213. +
  160214. + {
  160215. + SIOCIWFIRSTPRIV + 0xB,
  160216. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "dbg"
  160217. + },
  160218. + {
  160219. + SIOCIWFIRSTPRIV + 0xC,
  160220. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "rfw"
  160221. + },
  160222. + {
  160223. + SIOCIWFIRSTPRIV + 0xD,
  160224. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "rfr"
  160225. + },
  160226. +#ifdef CONFIG_WOWLAN
  160227. + {
  160228. + SIOCIWFIRSTPRIV + 0xE,0,0, "wowlan_ctrl"
  160229. + },
  160230. +#endif // CONFIG_WOWLAN
  160231. + {
  160232. + SIOCIWFIRSTPRIV + 0x10,
  160233. + IW_PRIV_TYPE_CHAR | 1024, 0, "p2p_set"
  160234. + },
  160235. + {
  160236. + SIOCIWFIRSTPRIV + 0x11,
  160237. + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "p2p_get"
  160238. + },
  160239. + {
  160240. + SIOCIWFIRSTPRIV + 0x12, 0, 0, "NULL"
  160241. + },
  160242. + {
  160243. + SIOCIWFIRSTPRIV + 0x13,
  160244. + IW_PRIV_TYPE_CHAR | 64, IW_PRIV_TYPE_CHAR | 64 , "p2p_get2"
  160245. + },
  160246. + {
  160247. + SIOCIWFIRSTPRIV + 0x14,
  160248. + IW_PRIV_TYPE_CHAR | 64, 0, "tdls"
  160249. + },
  160250. + {
  160251. + SIOCIWFIRSTPRIV + 0x15,
  160252. + IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P2P_PRIVATE_IOCTL_SET_LEN , "tdls_get"
  160253. + },
  160254. + {
  160255. + SIOCIWFIRSTPRIV + 0x16,
  160256. + IW_PRIV_TYPE_CHAR | 64, 0, "pm_set"
  160257. + },
  160258. +
  160259. + {SIOCIWFIRSTPRIV + 0x18, IW_PRIV_TYPE_CHAR | IFNAMSIZ , 0 , "rereg_nd_name"},
  160260. +
  160261. + {SIOCIWFIRSTPRIV + 0x1A, IW_PRIV_TYPE_CHAR | 128, 0, "efuse_set"},
  160262. + {SIOCIWFIRSTPRIV + 0x1B, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR |IW_PRIV_SIZE_FIXED |0x700 ,"efuse_get"},
  160263. + {
  160264. + SIOCIWFIRSTPRIV + 0x1D,
  160265. + IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 0x7FF, "test"
  160266. + },
  160267. +#ifdef CONFIG_INTEL_WIDI
  160268. + {
  160269. + SIOCIWFIRSTPRIV + 0x1E,
  160270. + IW_PRIV_TYPE_CHAR | 1024, 0, "widi_set"
  160271. + },
  160272. + {
  160273. + SIOCIWFIRSTPRIV + 0x1F,
  160274. + IW_PRIV_TYPE_CHAR | 128, 0, "widi_prob_req"
  160275. + },
  160276. +#endif // CONFIG_INTEL_WIDI
  160277. +};
  160278. +
  160279. +static iw_handler rtw_private_handler[] =
  160280. +{
  160281. + rtw_wx_write32, //0x00
  160282. + rtw_wx_read32, //0x01
  160283. + rtw_drvext_hdl, //0x02
  160284. + rtw_mp_ioctl_hdl, //0x03
  160285. +
  160286. +// for MM DTV platform
  160287. + rtw_get_ap_info, //0x04
  160288. +
  160289. + rtw_set_pid, //0x05
  160290. + rtw_wps_start, //0x06
  160291. +
  160292. +// for PLATFORM_MT53XX
  160293. + rtw_wx_get_sensitivity, //0x07
  160294. + rtw_wx_set_mtk_wps_probe_ie, //0x08
  160295. + rtw_wx_set_mtk_wps_ie, //0x09
  160296. +
  160297. +// for RTK_DMP_PLATFORM
  160298. +// Set Channel depend on the country code
  160299. + rtw_wx_set_channel_plan, //0x0A
  160300. +
  160301. + rtw_dbg_port, //0x0B
  160302. + rtw_wx_write_rf, //0x0C
  160303. + rtw_wx_read_rf, //0x0D
  160304. +
  160305. +#ifdef CONFIG_WOWLAN
  160306. + rtw_wowlan_ctrl, //0x0E
  160307. +#else
  160308. + rtw_wx_priv_null, //0x0E
  160309. +#endif //CONFIG_WOWLAN
  160310. + rtw_wx_priv_null, //0x0F
  160311. +
  160312. + rtw_p2p_set, //0x10
  160313. + rtw_p2p_get, //0x11
  160314. + NULL, //0x12
  160315. + rtw_p2p_get2, //0x13
  160316. +
  160317. + rtw_tdls, //0x14
  160318. + rtw_tdls_get, //0x15
  160319. +
  160320. + rtw_pm_set, //0x16
  160321. + rtw_wx_priv_null, //0x17
  160322. + rtw_rereg_nd_name, //0x18
  160323. + rtw_wx_priv_null, //0x19
  160324. +
  160325. + rtw_mp_efuse_set, //0x1A
  160326. + rtw_mp_efuse_get, //0x1B
  160327. + NULL, // 0x1C is reserved for hostapd
  160328. + rtw_test , // 0x1D
  160329. +#ifdef CONFIG_INTEL_WIDI
  160330. + rtw_widi_set, //0x1E
  160331. + rtw_widi_set_probe_request, //0x1F
  160332. +#endif // CONFIG_INTEL_WIDI
  160333. +};
  160334. +
  160335. +#endif // #if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
  160336. +
  160337. +#if WIRELESS_EXT >= 17
  160338. +static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
  160339. +{
  160340. + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  160341. + struct iw_statistics *piwstats=&padapter->iwstats;
  160342. + int tmp_level = 0;
  160343. + int tmp_qual = 0;
  160344. + int tmp_noise = 0;
  160345. +
  160346. + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) != _TRUE)
  160347. + {
  160348. + piwstats->qual.qual = 0;
  160349. + piwstats->qual.level = 0;
  160350. + piwstats->qual.noise = 0;
  160351. + //DBG_871X("No link level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
  160352. + }
  160353. + else{
  160354. + #ifdef CONFIG_SIGNAL_DISPLAY_DBM
  160355. + tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);
  160356. + #else
  160357. + tmp_level = padapter->recvpriv.signal_strength;
  160358. + #endif
  160359. +
  160360. + tmp_qual = padapter->recvpriv.signal_qual;
  160361. + tmp_noise =padapter->recvpriv.noise;
  160362. + //DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
  160363. +
  160364. + piwstats->qual.level = tmp_level;
  160365. + piwstats->qual.qual = tmp_qual;
  160366. + piwstats->qual.noise = tmp_noise;
  160367. + }
  160368. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14))
  160369. + piwstats->qual.updated = IW_QUAL_ALL_UPDATED ;//|IW_QUAL_DBM;
  160370. +#else
  160371. +#ifdef RTK_DMP_PLATFORM
  160372. + //IW_QUAL_DBM= 0x8, if driver use this flag, wireless extension will show value of dbm.
  160373. + //remove this flag for show percentage 0~100
  160374. + piwstats->qual.updated = 0x07;
  160375. +#else
  160376. + piwstats->qual.updated = 0x0f;
  160377. +#endif
  160378. +#endif
  160379. +
  160380. + #ifdef CONFIG_SIGNAL_DISPLAY_DBM
  160381. + piwstats->qual.updated = piwstats->qual.updated | IW_QUAL_DBM;
  160382. + #endif
  160383. +
  160384. + return &padapter->iwstats;
  160385. +}
  160386. +#endif
  160387. +
  160388. +#ifdef CONFIG_WIRELESS_EXT
  160389. +struct iw_handler_def rtw_handlers_def =
  160390. +{
  160391. + .standard = rtw_handlers,
  160392. + .num_standard = sizeof(rtw_handlers) / sizeof(iw_handler),
  160393. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) || defined(CONFIG_WEXT_PRIV)
  160394. + .private = rtw_private_handler,
  160395. + .private_args = (struct iw_priv_args *)rtw_private_args,
  160396. + .num_private = sizeof(rtw_private_handler) / sizeof(iw_handler),
  160397. + .num_private_args = sizeof(rtw_private_args) / sizeof(struct iw_priv_args),
  160398. +#endif
  160399. +#if WIRELESS_EXT >= 17
  160400. + .get_wireless_stats = rtw_get_wireless_stats,
  160401. +#endif
  160402. +};
  160403. +#endif
  160404. --- /dev/null
  160405. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c
  160406. @@ -0,0 +1,585 @@
  160407. +/******************************************************************************
  160408. + *
  160409. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  160410. + *
  160411. + * This program is free software; you can redistribute it and/or modify it
  160412. + * under the terms of version 2 of the GNU General Public License as
  160413. + * published by the Free Software Foundation.
  160414. + *
  160415. + * This program is distributed in the hope that it will be useful, but WITHOUT
  160416. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  160417. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  160418. + * more details.
  160419. + *
  160420. + * You should have received a copy of the GNU General Public License along with
  160421. + * this program; if not, write to the Free Software Foundation, Inc.,
  160422. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  160423. + *
  160424. + *
  160425. + ******************************************************************************/
  160426. +
  160427. +
  160428. +#define _MLME_OSDEP_C_
  160429. +
  160430. +#include <drv_conf.h>
  160431. +#include <osdep_service.h>
  160432. +#include <drv_types.h>
  160433. +#include <mlme_osdep.h>
  160434. +
  160435. +
  160436. +#ifdef RTK_DMP_PLATFORM
  160437. +void Linkup_workitem_callback(struct work_struct *work)
  160438. +{
  160439. + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkup_workitem);
  160440. + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv);
  160441. +
  160442. +_func_enter_;
  160443. +
  160444. + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkup_workitem_callback\n"));
  160445. +
  160446. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))
  160447. + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKUP);
  160448. +#else
  160449. + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKUP);
  160450. +#endif
  160451. +
  160452. +_func_exit_;
  160453. +}
  160454. +
  160455. +void Linkdown_workitem_callback(struct work_struct *work)
  160456. +{
  160457. + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkdown_workitem);
  160458. + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv);
  160459. +
  160460. +_func_enter_;
  160461. +
  160462. + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkdown_workitem_callback\n"));
  160463. +
  160464. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))
  160465. + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKDOWN);
  160466. +#else
  160467. + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKDOWN);
  160468. +#endif
  160469. +
  160470. +_func_exit_;
  160471. +}
  160472. +#endif
  160473. +
  160474. +
  160475. +/*
  160476. +void sitesurvey_ctrl_handler(void *FunctionContext)
  160477. +{
  160478. + _adapter *adapter = (_adapter *)FunctionContext;
  160479. +
  160480. + _sitesurvey_ctrl_handler(adapter);
  160481. +
  160482. + _set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer, 3000);
  160483. +}
  160484. +*/
  160485. +
  160486. +void rtw_join_timeout_handler (void *FunctionContext)
  160487. +{
  160488. + _adapter *adapter = (_adapter *)FunctionContext;
  160489. + _rtw_join_timeout_handler(adapter);
  160490. +}
  160491. +
  160492. +
  160493. +void _rtw_scan_timeout_handler (void *FunctionContext)
  160494. +{
  160495. + _adapter *adapter = (_adapter *)FunctionContext;
  160496. + rtw_scan_timeout_handler(adapter);
  160497. +}
  160498. +
  160499. +
  160500. +void _dynamic_check_timer_handlder (void *FunctionContext)
  160501. +{
  160502. + _adapter *adapter = (_adapter *)FunctionContext;
  160503. +
  160504. + rtw_dynamic_check_timer_handlder(adapter);
  160505. +
  160506. + _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000);
  160507. +}
  160508. +
  160509. +#ifdef CONFIG_SET_SCAN_DENY_TIMER
  160510. +void _rtw_set_scan_deny_timer_hdl(void *FunctionContext)
  160511. +{
  160512. + _adapter *adapter = (_adapter *)FunctionContext;
  160513. + rtw_set_scan_deny_timer_hdl(adapter);
  160514. +}
  160515. +#endif
  160516. +
  160517. +
  160518. +void rtw_init_mlme_timer(_adapter *padapter)
  160519. +{
  160520. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  160521. +
  160522. + _init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter);
  160523. + //_init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer), padapter->pnetdev, sitesurvey_ctrl_handler, padapter);
  160524. + _init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter);
  160525. +
  160526. + _init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter);
  160527. +
  160528. + #ifdef CONFIG_SET_SCAN_DENY_TIMER
  160529. + _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter);
  160530. + #endif
  160531. +
  160532. +#ifdef RTK_DMP_PLATFORM
  160533. + _init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter);
  160534. + _init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter);
  160535. +#endif
  160536. +
  160537. +}
  160538. +
  160539. +extern void rtw_indicate_wx_assoc_event(_adapter *padapter);
  160540. +extern void rtw_indicate_wx_disassoc_event(_adapter *padapter);
  160541. +
  160542. +void rtw_os_indicate_connect(_adapter *adapter)
  160543. +{
  160544. +
  160545. +_func_enter_;
  160546. +
  160547. +#ifdef CONFIG_IOCTL_CFG80211
  160548. + rtw_cfg80211_indicate_connect(adapter);
  160549. +#endif //CONFIG_IOCTL_CFG80211
  160550. +
  160551. + rtw_indicate_wx_assoc_event(adapter);
  160552. + netif_carrier_on(adapter->pnetdev);
  160553. +
  160554. + if(adapter->pid[2] !=0)
  160555. + rtw_signal_process(adapter->pid[2], SIGALRM);
  160556. +
  160557. +#ifdef RTK_DMP_PLATFORM
  160558. + _set_workitem(&adapter->mlmepriv.Linkup_workitem);
  160559. +#endif
  160560. +
  160561. +_func_exit_;
  160562. +
  160563. +}
  160564. +
  160565. +extern void indicate_wx_scan_complete_event(_adapter *padapter);
  160566. +void rtw_os_indicate_scan_done( _adapter *padapter, bool aborted)
  160567. +{
  160568. +#ifdef CONFIG_IOCTL_CFG80211
  160569. + rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), aborted);
  160570. +#endif
  160571. + indicate_wx_scan_complete_event(padapter);
  160572. +}
  160573. +
  160574. +static RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ];
  160575. +void rtw_reset_securitypriv( _adapter *adapter )
  160576. +{
  160577. + u8 backupPMKIDIndex = 0;
  160578. + u8 backupTKIPCountermeasure = 0x00;
  160579. + u32 backupTKIPcountermeasure_time = 0;
  160580. + // add for CONFIG_IEEE80211W, none 11w also can use
  160581. + _irqL irqL;
  160582. + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  160583. +
  160584. + _enter_critical_bh(&adapter->security_key_mutex, &irqL);
  160585. +
  160586. + if(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x
  160587. + {
  160588. + // Added by Albert 2009/02/18
  160589. + // We have to backup the PMK information for WiFi PMK Caching test item.
  160590. + //
  160591. + // Backup the btkip_countermeasure information.
  160592. + // When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds.
  160593. +
  160594. + _rtw_memset( &backupPMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );
  160595. +
  160596. + _rtw_memcpy( &backupPMKIDList[ 0 ], &adapter->securitypriv.PMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );
  160597. + backupPMKIDIndex = adapter->securitypriv.PMKIDIndex;
  160598. + backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure;
  160599. + backupTKIPcountermeasure_time = adapter->securitypriv.btkip_countermeasure_time;
  160600. +#ifdef CONFIG_IEEE80211W
  160601. + //reset RX BIP packet number
  160602. + pmlmeext->mgnt_80211w_IPN_rx = 0;
  160603. +#endif //CONFIG_IEEE80211W
  160604. + _rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv));
  160605. + //_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter);
  160606. +
  160607. + // Added by Albert 2009/02/18
  160608. + // Restore the PMK information to securitypriv structure for the following connection.
  160609. + _rtw_memcpy( &adapter->securitypriv.PMKIDList[ 0 ], &backupPMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );
  160610. + adapter->securitypriv.PMKIDIndex = backupPMKIDIndex;
  160611. + adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure;
  160612. + adapter->securitypriv.btkip_countermeasure_time = backupTKIPcountermeasure_time;
  160613. +
  160614. + adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;
  160615. + adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled;
  160616. +
  160617. + }
  160618. + else //reset values in securitypriv
  160619. + {
  160620. + //if(adapter->mlmepriv.fw_state & WIFI_STATION_STATE)
  160621. + //{
  160622. + struct security_priv *psec_priv=&adapter->securitypriv;
  160623. +
  160624. + psec_priv->dot11AuthAlgrthm =dot11AuthAlgrthm_Open; //open system
  160625. + psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
  160626. + psec_priv->dot11PrivacyKeyIndex = 0;
  160627. +
  160628. + psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  160629. + psec_priv->dot118021XGrpKeyid = 1;
  160630. +
  160631. + psec_priv->ndisauthtype = Ndis802_11AuthModeOpen;
  160632. + psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled;
  160633. + //}
  160634. + }
  160635. + // add for CONFIG_IEEE80211W, none 11w also can use
  160636. + _exit_critical_bh(&adapter->security_key_mutex, &irqL);
  160637. +}
  160638. +
  160639. +void rtw_os_indicate_disconnect( _adapter *adapter )
  160640. +{
  160641. + //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ];
  160642. +
  160643. +_func_enter_;
  160644. +
  160645. + netif_carrier_off(adapter->pnetdev); // Do it first for tx broadcast pkt after disconnection issue!
  160646. +
  160647. +#ifdef CONFIG_IOCTL_CFG80211
  160648. + rtw_cfg80211_indicate_disconnect(adapter);
  160649. +#endif //CONFIG_IOCTL_CFG80211
  160650. +
  160651. + rtw_indicate_wx_disassoc_event(adapter);
  160652. +
  160653. +#ifdef RTK_DMP_PLATFORM
  160654. + _set_workitem(&adapter->mlmepriv.Linkdown_workitem);
  160655. +#endif
  160656. + //modify for CONFIG_IEEE80211W, none 11w also can use the same command
  160657. + rtw_reset_securitypriv_cmd(adapter);
  160658. +
  160659. +_func_exit_;
  160660. +
  160661. +}
  160662. +
  160663. +void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie)
  160664. +{
  160665. + uint len;
  160666. + u8 *buff,*p,i;
  160667. + union iwreq_data wrqu;
  160668. +
  160669. +_func_enter_;
  160670. +
  160671. + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+rtw_report_sec_ie, authmode=%d\n", authmode));
  160672. +
  160673. + buff = NULL;
  160674. + if(authmode==_WPA_IE_ID_)
  160675. + {
  160676. + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode));
  160677. +
  160678. + buff = rtw_malloc(IW_CUSTOM_MAX);
  160679. +
  160680. + _rtw_memset(buff,0,IW_CUSTOM_MAX);
  160681. +
  160682. + p=buff;
  160683. +
  160684. + p+=sprintf(p,"ASSOCINFO(ReqIEs=");
  160685. +
  160686. + len = sec_ie[1]+2;
  160687. + len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
  160688. +
  160689. + for(i=0;i<len;i++){
  160690. + p+=sprintf(p,"%02x",sec_ie[i]);
  160691. + }
  160692. +
  160693. + p+=sprintf(p,")");
  160694. +
  160695. + _rtw_memset(&wrqu,0,sizeof(wrqu));
  160696. +
  160697. + wrqu.data.length=p-buff;
  160698. +
  160699. + wrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;
  160700. +
  160701. + wireless_send_event(adapter->pnetdev,IWEVCUSTOM,&wrqu,buff);
  160702. +
  160703. + if(buff)
  160704. + rtw_mfree(buff, IW_CUSTOM_MAX);
  160705. +
  160706. + }
  160707. +
  160708. +_func_exit_;
  160709. +
  160710. +}
  160711. +
  160712. +void _survey_timer_hdl (void *FunctionContext)
  160713. +{
  160714. + _adapter *padapter = (_adapter *)FunctionContext;
  160715. +
  160716. + survey_timer_hdl(padapter);
  160717. +}
  160718. +
  160719. +void _link_timer_hdl (void *FunctionContext)
  160720. +{
  160721. + _adapter *padapter = (_adapter *)FunctionContext;
  160722. + link_timer_hdl(padapter);
  160723. +}
  160724. +
  160725. +void _addba_timer_hdl(void *FunctionContext)
  160726. +{
  160727. + struct sta_info *psta = (struct sta_info *)FunctionContext;
  160728. + addba_timer_hdl(psta);
  160729. +}
  160730. +
  160731. +#ifdef CONFIG_IEEE80211W
  160732. +void _sa_query_timer_hdl (void *FunctionContext)
  160733. +{
  160734. + _adapter *padapter = (_adapter *)FunctionContext;
  160735. + sa_query_timer_hdl(padapter);
  160736. +}
  160737. +#endif //CONFIG_IEEE80211W
  160738. +
  160739. +void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta)
  160740. +{
  160741. +
  160742. + _init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta);
  160743. +}
  160744. +
  160745. +/*
  160746. +void _reauth_timer_hdl(void *FunctionContext)
  160747. +{
  160748. + _adapter *padapter = (_adapter *)FunctionContext;
  160749. + reauth_timer_hdl(padapter);
  160750. +}
  160751. +
  160752. +void _reassoc_timer_hdl(void *FunctionContext)
  160753. +{
  160754. + _adapter *padapter = (_adapter *)FunctionContext;
  160755. + reassoc_timer_hdl(padapter);
  160756. +}
  160757. +*/
  160758. +
  160759. +void init_mlme_ext_timer(_adapter *padapter)
  160760. +{
  160761. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  160762. +
  160763. + _init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter);
  160764. + _init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter);
  160765. +#ifdef CONFIG_IEEE80211W
  160766. + _init_timer(&pmlmeext->sa_query_timer, padapter->pnetdev, _sa_query_timer_hdl, padapter);
  160767. +#endif //CONFIG_IEEE80211W
  160768. + //_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter);
  160769. +
  160770. + //_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter);
  160771. + //_init_timer(&pmlmeext->reassoc_timer, padapter->pnetdev, _reassoc_timer_hdl, padapter);
  160772. +}
  160773. +
  160774. +#ifdef CONFIG_AP_MODE
  160775. +
  160776. +void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta)
  160777. +{
  160778. + union iwreq_data wrqu;
  160779. + struct sta_priv *pstapriv = &padapter->stapriv;
  160780. +
  160781. + if(psta==NULL)
  160782. + return;
  160783. +
  160784. + if(psta->aid > NUM_STA)
  160785. + return;
  160786. +
  160787. + if(pstapriv->sta_aid[psta->aid - 1] != psta)
  160788. + return;
  160789. +
  160790. +
  160791. + wrqu.addr.sa_family = ARPHRD_ETHER;
  160792. +
  160793. + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);
  160794. +
  160795. + DBG_871X("+rtw_indicate_sta_assoc_event\n");
  160796. +
  160797. + wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL);
  160798. +
  160799. +}
  160800. +
  160801. +void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta)
  160802. +{
  160803. + union iwreq_data wrqu;
  160804. + struct sta_priv *pstapriv = &padapter->stapriv;
  160805. +
  160806. + if(psta==NULL)
  160807. + return;
  160808. +
  160809. + if(psta->aid > NUM_STA)
  160810. + return;
  160811. +
  160812. + if(pstapriv->sta_aid[psta->aid - 1] != psta)
  160813. + return;
  160814. +
  160815. +
  160816. + wrqu.addr.sa_family = ARPHRD_ETHER;
  160817. +
  160818. + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);
  160819. +
  160820. + DBG_871X("+rtw_indicate_sta_disassoc_event\n");
  160821. +
  160822. + wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL);
  160823. +
  160824. +}
  160825. +
  160826. +
  160827. +#ifdef CONFIG_HOSTAPD_MLME
  160828. +
  160829. +static int mgnt_xmit_entry(struct sk_buff *skb, struct net_device *pnetdev)
  160830. +{
  160831. + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);
  160832. + _adapter *padapter = (_adapter *)phostapdpriv->padapter;
  160833. +
  160834. + //DBG_871X("%s\n", __FUNCTION__);
  160835. +
  160836. + return rtw_hal_hostap_mgnt_xmit_entry(padapter, skb);
  160837. +}
  160838. +
  160839. +static int mgnt_netdev_open(struct net_device *pnetdev)
  160840. +{
  160841. + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);
  160842. +
  160843. + DBG_871X("mgnt_netdev_open: MAC Address:" MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr));
  160844. +
  160845. +
  160846. + init_usb_anchor(&phostapdpriv->anchored);
  160847. +
  160848. + if(!rtw_netif_queue_stopped(pnetdev))
  160849. + rtw_netif_start_queue(pnetdev);
  160850. + else
  160851. + rtw_netif_wake_queue(pnetdev);
  160852. +
  160853. +
  160854. + netif_carrier_on(pnetdev);
  160855. +
  160856. + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x0100);//only excluding beacon
  160857. +
  160858. + return 0;
  160859. +}
  160860. +static int mgnt_netdev_close(struct net_device *pnetdev)
  160861. +{
  160862. + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);
  160863. +
  160864. + DBG_871X("%s\n", __FUNCTION__);
  160865. +
  160866. + usb_kill_anchored_urbs(&phostapdpriv->anchored);
  160867. +
  160868. + netif_carrier_off(pnetdev);
  160869. +
  160870. + if (!rtw_netif_queue_stopped(pnetdev))
  160871. + rtw_netif_stop_queue(pnetdev);
  160872. +
  160873. + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f);
  160874. +
  160875. + return 0;
  160876. +}
  160877. +
  160878. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  160879. +static const struct net_device_ops rtl871x_mgnt_netdev_ops = {
  160880. + .ndo_open = mgnt_netdev_open,
  160881. + .ndo_stop = mgnt_netdev_close,
  160882. + .ndo_start_xmit = mgnt_xmit_entry,
  160883. + //.ndo_set_mac_address = r871x_net_set_mac_address,
  160884. + //.ndo_get_stats = r871x_net_get_stats,
  160885. + //.ndo_do_ioctl = r871x_mp_ioctl,
  160886. +};
  160887. +#endif
  160888. +
  160889. +int hostapd_mode_init(_adapter *padapter)
  160890. +{
  160891. + unsigned char mac[ETH_ALEN];
  160892. + struct hostapd_priv *phostapdpriv;
  160893. + struct net_device *pnetdev;
  160894. +
  160895. + pnetdev = rtw_alloc_etherdev(sizeof(struct hostapd_priv));
  160896. + if (!pnetdev)
  160897. + return -ENOMEM;
  160898. +
  160899. + //SET_MODULE_OWNER(pnetdev);
  160900. + ether_setup(pnetdev);
  160901. +
  160902. + //pnetdev->type = ARPHRD_IEEE80211;
  160903. +
  160904. + phostapdpriv = rtw_netdev_priv(pnetdev);
  160905. + phostapdpriv->pmgnt_netdev = pnetdev;
  160906. + phostapdpriv->padapter= padapter;
  160907. + padapter->phostapdpriv = phostapdpriv;
  160908. +
  160909. + //pnetdev->init = NULL;
  160910. +
  160911. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  160912. +
  160913. + DBG_871X("register rtl871x_mgnt_netdev_ops to netdev_ops\n");
  160914. +
  160915. + pnetdev->netdev_ops = &rtl871x_mgnt_netdev_ops;
  160916. +
  160917. +#else
  160918. +
  160919. + pnetdev->open = mgnt_netdev_open;
  160920. +
  160921. + pnetdev->stop = mgnt_netdev_close;
  160922. +
  160923. + pnetdev->hard_start_xmit = mgnt_xmit_entry;
  160924. +
  160925. + //pnetdev->set_mac_address = r871x_net_set_mac_address;
  160926. +
  160927. + //pnetdev->get_stats = r871x_net_get_stats;
  160928. +
  160929. + //pnetdev->do_ioctl = r871x_mp_ioctl;
  160930. +
  160931. +#endif
  160932. +
  160933. + pnetdev->watchdog_timeo = HZ; /* 1 second timeout */
  160934. +
  160935. + //pnetdev->wireless_handlers = NULL;
  160936. +
  160937. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  160938. + pnetdev->features |= NETIF_F_IP_CSUM;
  160939. +#endif
  160940. +
  160941. +
  160942. +
  160943. + if(dev_alloc_name(pnetdev,"mgnt.wlan%d") < 0)
  160944. + {
  160945. + DBG_871X("hostapd_mode_init(): dev_alloc_name, fail! \n");
  160946. + }
  160947. +
  160948. +
  160949. + //SET_NETDEV_DEV(pnetdev, pintfpriv->udev);
  160950. +
  160951. +
  160952. + mac[0]=0x00;
  160953. + mac[1]=0xe0;
  160954. + mac[2]=0x4c;
  160955. + mac[3]=0x87;
  160956. + mac[4]=0x11;
  160957. + mac[5]=0x12;
  160958. +
  160959. + _rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN);
  160960. +
  160961. +
  160962. + netif_carrier_off(pnetdev);
  160963. +
  160964. +
  160965. + /* Tell the network stack we exist */
  160966. + if (register_netdev(pnetdev) != 0)
  160967. + {
  160968. + DBG_871X("hostapd_mode_init(): register_netdev fail!\n");
  160969. +
  160970. + if(pnetdev)
  160971. + {
  160972. + rtw_free_netdev(pnetdev);
  160973. + }
  160974. + }
  160975. +
  160976. + return 0;
  160977. +
  160978. +}
  160979. +
  160980. +void hostapd_mode_unload(_adapter *padapter)
  160981. +{
  160982. + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv;
  160983. + struct net_device *pnetdev = phostapdpriv->pmgnt_netdev;
  160984. +
  160985. + unregister_netdev(pnetdev);
  160986. + rtw_free_netdev(pnetdev);
  160987. +
  160988. +}
  160989. +
  160990. +#endif
  160991. +#endif
  160992. --- /dev/null
  160993. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c
  160994. @@ -0,0 +1,2748 @@
  160995. +/******************************************************************************
  160996. + *
  160997. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  160998. + *
  160999. + * This program is free software; you can redistribute it and/or modify it
  161000. + * under the terms of version 2 of the GNU General Public License as
  161001. + * published by the Free Software Foundation.
  161002. + *
  161003. + * This program is distributed in the hope that it will be useful, but WITHOUT
  161004. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  161005. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  161006. + * more details.
  161007. + *
  161008. + * You should have received a copy of the GNU General Public License along with
  161009. + * this program; if not, write to the Free Software Foundation, Inc.,
  161010. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  161011. + *
  161012. + *
  161013. + ******************************************************************************/
  161014. +#define _OS_INTFS_C_
  161015. +
  161016. +#include <drv_conf.h>
  161017. +
  161018. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  161019. +
  161020. +#error "Shall be Linux or Windows, but not both!\n"
  161021. +
  161022. +#endif
  161023. +
  161024. +#include <osdep_service.h>
  161025. +#include <drv_types.h>
  161026. +#include <xmit_osdep.h>
  161027. +#include <recv_osdep.h>
  161028. +#include <hal_intf.h>
  161029. +#include <rtw_ioctl.h>
  161030. +#include <rtw_version.h>
  161031. +
  161032. +#ifdef CONFIG_USB_HCI
  161033. +#include <usb_osintf.h>
  161034. +#endif
  161035. +
  161036. +#ifdef CONFIG_PCI_HCI
  161037. +#include <pci_osintf.h>
  161038. +#endif
  161039. +
  161040. +#ifdef CONFIG_BR_EXT
  161041. +#include <rtw_br_ext.h>
  161042. +#endif //CONFIG_BR_EXT
  161043. +
  161044. +MODULE_LICENSE("GPL");
  161045. +MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
  161046. +MODULE_AUTHOR("Realtek Semiconductor Corp.");
  161047. +MODULE_VERSION(DRIVERVERSION);
  161048. +
  161049. +/* module param defaults */
  161050. +int rtw_chip_version = 0x00;
  161051. +int rtw_rfintfs = HWPI;
  161052. +int rtw_lbkmode = 0;//RTL8712_AIR_TRX;
  161053. +
  161054. +
  161055. +int rtw_network_mode = Ndis802_11IBSS;//Ndis802_11Infrastructure;//infra, ad-hoc, auto
  161056. +//NDIS_802_11_SSID ssid;
  161057. +int rtw_channel = 1;//ad-hoc support requirement
  161058. +int rtw_wireless_mode = WIRELESS_11BG_24N;
  161059. +int rtw_vrtl_carrier_sense = AUTO_VCS;
  161060. +int rtw_vcs_type = RTS_CTS;//*
  161061. +int rtw_rts_thresh = 2347;//*
  161062. +int rtw_frag_thresh = 2346;//*
  161063. +int rtw_preamble = PREAMBLE_LONG;//long, short, auto
  161064. +int rtw_scan_mode = 1;//active, passive
  161065. +int rtw_adhoc_tx_pwr = 1;
  161066. +int rtw_soft_ap = 0;
  161067. +//int smart_ps = 1;
  161068. +#ifdef CONFIG_POWER_SAVING
  161069. +int rtw_power_mgnt = 1;
  161070. +#ifdef CONFIG_IPS_LEVEL_2
  161071. +int rtw_ips_mode = IPS_LEVEL_2;
  161072. +#else
  161073. +int rtw_ips_mode = IPS_NORMAL;
  161074. +#endif
  161075. +#else
  161076. +int rtw_power_mgnt = PS_MODE_ACTIVE;
  161077. +int rtw_ips_mode = IPS_NONE;
  161078. +#endif
  161079. +module_param(rtw_ips_mode, int, 0644);
  161080. +MODULE_PARM_DESC(rtw_ips_mode,"The default IPS mode");
  161081. +
  161082. +int rtw_radio_enable = 1;
  161083. +int rtw_long_retry_lmt = 7;
  161084. +int rtw_short_retry_lmt = 7;
  161085. +int rtw_busy_thresh = 40;
  161086. +//int qos_enable = 0; //*
  161087. +int rtw_ack_policy = NORMAL_ACK;
  161088. +#ifdef CONFIG_MP_INCLUDED
  161089. +int rtw_mp_mode = 1;
  161090. +#else
  161091. +int rtw_mp_mode = 0;
  161092. +#endif
  161093. +int rtw_software_encrypt = 0;
  161094. +int rtw_software_decrypt = 0;
  161095. +
  161096. +int rtw_acm_method = 0;// 0:By SW 1:By HW.
  161097. +
  161098. +int rtw_wmm_enable = 1;// default is set to enable the wmm.
  161099. +int rtw_uapsd_enable = 0;
  161100. +int rtw_uapsd_max_sp = NO_LIMIT;
  161101. +int rtw_uapsd_acbk_en = 0;
  161102. +int rtw_uapsd_acbe_en = 0;
  161103. +int rtw_uapsd_acvi_en = 0;
  161104. +int rtw_uapsd_acvo_en = 0;
  161105. +
  161106. +#ifdef CONFIG_80211N_HT
  161107. +int rtw_ht_enable = 1;
  161108. +int rtw_cbw40_enable = 3; // 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g
  161109. +int rtw_ampdu_enable = 1;//for enable tx_ampdu
  161110. +int rtw_rx_stbc = 1;// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
  161111. +int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto
  161112. +#endif
  161113. +
  161114. +int rtw_lowrate_two_xmit = 1;//Use 2 path Tx to transmit MCS0~7 and legacy mode
  161115. +
  161116. +//int rf_config = RF_1T2R; // 1T2R
  161117. +int rtw_rf_config = RF_819X_MAX_TYPE; //auto
  161118. +int rtw_low_power = 0;
  161119. +#ifdef CONFIG_WIFI_TEST
  161120. +int rtw_wifi_spec = 1;//for wifi test
  161121. +#else
  161122. +int rtw_wifi_spec = 0;
  161123. +#endif
  161124. +
  161125. +int rtw_special_rf_path = 0; //0: 2T2R ,1: only turn on path A 1T1R, 2: only turn on path B 1T1R
  161126. +
  161127. +int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX;
  161128. +
  161129. +#ifdef CONFIG_BT_COEXIST
  161130. +int rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse
  161131. +int rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy
  161132. +int rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU.
  161133. +#endif
  161134. +int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.
  161135. +
  161136. +int rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config
  161137. +
  161138. +#ifdef CONFIG_USB_AUTOSUSPEND
  161139. +int rtw_enusbss = 1;//0:disable,1:enable
  161140. +#else
  161141. +int rtw_enusbss = 0;//0:disable,1:enable
  161142. +#endif
  161143. +
  161144. +int rtw_hwpdn_mode=2;//0:disable,1:enable,2: by EFUSE config
  161145. +
  161146. +#ifdef CONFIG_HW_PWRP_DETECTION
  161147. +int rtw_hwpwrp_detect = 1;
  161148. +#else
  161149. +int rtw_hwpwrp_detect = 0; //HW power ping detect 0:disable , 1:enable
  161150. +#endif
  161151. +
  161152. +#ifdef CONFIG_USB_HCI
  161153. +int rtw_hw_wps_pbc = 1;
  161154. +#else
  161155. +int rtw_hw_wps_pbc = 0;
  161156. +#endif
  161157. +
  161158. +#ifdef CONFIG_TX_MCAST2UNI
  161159. +int rtw_mc2u_disable = 0;
  161160. +#endif // CONFIG_TX_MCAST2UNI
  161161. +
  161162. +int rtw_mac_phy_mode = 0; //0:by efuse, 1:smsp, 2:dmdp, 3:dmsp.
  161163. +
  161164. +#ifdef CONFIG_80211D
  161165. +int rtw_80211d = 0;
  161166. +#endif
  161167. +
  161168. +char* ifname = "wlan%d";
  161169. +module_param(ifname, charp, 0644);
  161170. +MODULE_PARM_DESC(ifname, "The default name to allocate for first interface");
  161171. +
  161172. +char* if2name = "wlan%d";
  161173. +module_param(if2name, charp, 0644);
  161174. +MODULE_PARM_DESC(if2name, "The default name to allocate for second interface");
  161175. +
  161176. +char* rtw_initmac = 0; // temp mac address if users want to use instead of the mac address in Efuse
  161177. +
  161178. +#ifdef CONFIG_MULTI_VIR_IFACES
  161179. +int rtw_ext_iface_num = 1;//primary/secondary iface is excluded
  161180. +module_param(rtw_ext_iface_num, int, 0644);
  161181. +#endif //CONFIG_MULTI_VIR_IFACES
  161182. +
  161183. +module_param(rtw_initmac, charp, 0644);
  161184. +module_param(rtw_channel_plan, int, 0644);
  161185. +module_param(rtw_chip_version, int, 0644);
  161186. +module_param(rtw_rfintfs, int, 0644);
  161187. +module_param(rtw_lbkmode, int, 0644);
  161188. +module_param(rtw_network_mode, int, 0644);
  161189. +module_param(rtw_channel, int, 0644);
  161190. +module_param(rtw_mp_mode, int, 0644);
  161191. +module_param(rtw_wmm_enable, int, 0644);
  161192. +module_param(rtw_vrtl_carrier_sense, int, 0644);
  161193. +module_param(rtw_vcs_type, int, 0644);
  161194. +module_param(rtw_busy_thresh, int, 0644);
  161195. +#ifdef CONFIG_80211N_HT
  161196. +module_param(rtw_ht_enable, int, 0644);
  161197. +module_param(rtw_cbw40_enable, int, 0644);
  161198. +module_param(rtw_ampdu_enable, int, 0644);
  161199. +module_param(rtw_rx_stbc, int, 0644);
  161200. +module_param(rtw_ampdu_amsdu, int, 0644);
  161201. +#endif
  161202. +
  161203. +module_param(rtw_lowrate_two_xmit, int, 0644);
  161204. +
  161205. +module_param(rtw_rf_config, int, 0644);
  161206. +module_param(rtw_power_mgnt, int, 0644);
  161207. +module_param(rtw_low_power, int, 0644);
  161208. +module_param(rtw_wifi_spec, int, 0644);
  161209. +
  161210. +module_param(rtw_special_rf_path, int, 0644);
  161211. +
  161212. +module_param(rtw_antdiv_cfg, int, 0644);
  161213. +
  161214. +
  161215. +module_param(rtw_enusbss, int, 0644);
  161216. +module_param(rtw_hwpdn_mode, int, 0644);
  161217. +module_param(rtw_hwpwrp_detect, int, 0644);
  161218. +
  161219. +module_param(rtw_hw_wps_pbc, int, 0644);
  161220. +
  161221. +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  161222. +char *rtw_adaptor_info_caching_file_path= "/data/misc/wifi/rtw_cache";
  161223. +module_param(rtw_adaptor_info_caching_file_path, charp, 0644);
  161224. +MODULE_PARM_DESC(rtw_adaptor_info_caching_file_path, "The path of adapter info cache file");
  161225. +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
  161226. +
  161227. +#ifdef CONFIG_LAYER2_ROAMING
  161228. +uint rtw_max_roaming_times=2;
  161229. +module_param(rtw_max_roaming_times, uint, 0644);
  161230. +MODULE_PARM_DESC(rtw_max_roaming_times,"The max roaming times to try");
  161231. +#endif //CONFIG_LAYER2_ROAMING
  161232. +
  161233. +#ifdef CONFIG_IOL
  161234. +bool rtw_force_iol=_FALSE;
  161235. +module_param(rtw_force_iol, bool, 0644);
  161236. +MODULE_PARM_DESC(rtw_force_iol,"Force to enable IOL");
  161237. +#endif //CONFIG_IOL
  161238. +
  161239. +#ifdef CONFIG_FILE_FWIMG
  161240. +char *rtw_fw_file_path= "";
  161241. +module_param(rtw_fw_file_path, charp, 0644);
  161242. +MODULE_PARM_DESC(rtw_fw_file_path, "The path of fw image");
  161243. +#endif //CONFIG_FILE_FWIMG
  161244. +
  161245. +#ifdef CONFIG_TX_MCAST2UNI
  161246. +module_param(rtw_mc2u_disable, int, 0644);
  161247. +#endif // CONFIG_TX_MCAST2UNI
  161248. +
  161249. +module_param(rtw_mac_phy_mode, int, 0644);
  161250. +
  161251. +#ifdef CONFIG_80211D
  161252. +module_param(rtw_80211d, int, 0644);
  161253. +#endif
  161254. +
  161255. +uint rtw_notch_filter = RTW_NOTCH_FILTER;
  161256. +module_param(rtw_notch_filter, uint, 0644);
  161257. +MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
  161258. +
  161259. +static uint loadparam( _adapter *padapter, _nic_hdl pnetdev);
  161260. +int _netdev_open(struct net_device *pnetdev);
  161261. +int netdev_open (struct net_device *pnetdev);
  161262. +static int netdev_close (struct net_device *pnetdev);
  161263. +
  161264. +//#ifdef RTK_DMP_PLATFORM
  161265. +#ifdef CONFIG_PROC_DEBUG
  161266. +#define RTL8192C_PROC_NAME "rtl819xC"
  161267. +#define RTL8192D_PROC_NAME "rtl819xD"
  161268. +static char rtw_proc_name[IFNAMSIZ];
  161269. +static struct proc_dir_entry *rtw_proc = NULL;
  161270. +static int rtw_proc_cnt = 0;
  161271. +
  161272. +#define RTW_PROC_NAME DRV_NAME
  161273. +
  161274. +void rtw_proc_init_one(struct net_device *dev)
  161275. +{
  161276. + struct proc_dir_entry *dir_dev = NULL;
  161277. + struct proc_dir_entry *entry=NULL;
  161278. + _adapter *padapter = rtw_netdev_priv(dev);
  161279. + u8 rf_type;
  161280. +
  161281. + if(rtw_proc == NULL)
  161282. + {
  161283. + if(padapter->chip_type == RTL8188C_8192C)
  161284. + {
  161285. + _rtw_memcpy(rtw_proc_name, RTL8192C_PROC_NAME, sizeof(RTL8192C_PROC_NAME));
  161286. + }
  161287. + else if(padapter->chip_type == RTL8192D)
  161288. + {
  161289. + _rtw_memcpy(rtw_proc_name, RTL8192D_PROC_NAME, sizeof(RTL8192D_PROC_NAME));
  161290. + }
  161291. + else if(padapter->chip_type == RTL8723A)
  161292. + {
  161293. + _rtw_memcpy(rtw_proc_name, RTW_PROC_NAME, sizeof(RTW_PROC_NAME));
  161294. + }
  161295. + else if(padapter->chip_type == RTL8188E)
  161296. + {
  161297. + _rtw_memcpy(rtw_proc_name, RTW_PROC_NAME, sizeof(RTW_PROC_NAME));
  161298. + }
  161299. + else
  161300. + {
  161301. + _rtw_memcpy(rtw_proc_name, RTW_PROC_NAME, sizeof(RTW_PROC_NAME));
  161302. + }
  161303. +
  161304. +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  161305. + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, proc_net);
  161306. +#else
  161307. + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net);
  161308. +#endif
  161309. + if (rtw_proc == NULL) {
  161310. + DBG_871X(KERN_ERR "Unable to create rtw_proc directory\n");
  161311. + return;
  161312. + }
  161313. +
  161314. + entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev);
  161315. + if (!entry) {
  161316. + DBG_871X("Unable to create_proc_read_entry!\n");
  161317. + return;
  161318. + }
  161319. +
  161320. + entry = create_proc_read_entry("log_level", S_IFREG | S_IRUGO,
  161321. + rtw_proc, proc_get_log_level, dev);
  161322. + if (!entry) {
  161323. + DBG_871X("Unable to create_proc_read_entry!\n");
  161324. + return;
  161325. + }
  161326. + entry->write_proc = proc_set_log_level;
  161327. +
  161328. +#ifdef DBG_MEM_ALLOC
  161329. + entry = create_proc_read_entry("mstat", S_IFREG | S_IRUGO,
  161330. + rtw_proc, proc_get_mstat, dev);
  161331. + if (!entry) {
  161332. + DBG_871X("Unable to create_proc_read_entry!\n");
  161333. + return;
  161334. + }
  161335. +#endif /* DBG_MEM_ALLOC */
  161336. + }
  161337. +
  161338. +
  161339. +
  161340. + if(padapter->dir_dev == NULL)
  161341. + {
  161342. + padapter->dir_dev = create_proc_entry(dev->name,
  161343. + S_IFDIR | S_IRUGO | S_IXUGO,
  161344. + rtw_proc);
  161345. +
  161346. + dir_dev = padapter->dir_dev;
  161347. +
  161348. + if(dir_dev==NULL)
  161349. + {
  161350. + if(rtw_proc_cnt == 0)
  161351. + {
  161352. + if(rtw_proc){
  161353. +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  161354. + remove_proc_entry(rtw_proc_name, proc_net);
  161355. +#else
  161356. + remove_proc_entry(rtw_proc_name, init_net.proc_net);
  161357. +#endif
  161358. + rtw_proc = NULL;
  161359. + }
  161360. + }
  161361. +
  161362. + DBG_871X("Unable to create dir_dev directory\n");
  161363. + return;
  161364. + }
  161365. + }
  161366. + else
  161367. + {
  161368. + return;
  161369. + }
  161370. +
  161371. + rtw_proc_cnt++;
  161372. +
  161373. + entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO,
  161374. + dir_dev, proc_get_write_reg, dev);
  161375. + if (!entry) {
  161376. + DBG_871X("Unable to create_proc_read_entry!\n");
  161377. + return;
  161378. + }
  161379. + entry->write_proc = proc_set_write_reg;
  161380. +
  161381. + entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO,
  161382. + dir_dev, proc_get_read_reg, dev);
  161383. + if (!entry) {
  161384. + DBG_871X("Unable to create_proc_read_entry!\n");
  161385. + return;
  161386. + }
  161387. + entry->write_proc = proc_set_read_reg;
  161388. +
  161389. +
  161390. + entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO,
  161391. + dir_dev, proc_get_fwstate, dev);
  161392. + if (!entry) {
  161393. + DBG_871X("Unable to create_proc_read_entry!\n");
  161394. + return;
  161395. + }
  161396. +
  161397. +
  161398. + entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO,
  161399. + dir_dev, proc_get_sec_info, dev);
  161400. + if (!entry) {
  161401. + DBG_871X("Unable to create_proc_read_entry!\n");
  161402. + return;
  161403. + }
  161404. +
  161405. +
  161406. + entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO,
  161407. + dir_dev, proc_get_mlmext_state, dev);
  161408. + if (!entry) {
  161409. + DBG_871X("Unable to create_proc_read_entry!\n");
  161410. + return;
  161411. + }
  161412. +
  161413. +
  161414. + entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO,
  161415. + dir_dev, proc_get_qos_option, dev);
  161416. + if (!entry) {
  161417. + DBG_871X("Unable to create_proc_read_entry!\n");
  161418. + return;
  161419. + }
  161420. +
  161421. + entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO,
  161422. + dir_dev, proc_get_ht_option, dev);
  161423. + if (!entry) {
  161424. + DBG_871X("Unable to create_proc_read_entry!\n");
  161425. + return;
  161426. + }
  161427. +
  161428. + entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO,
  161429. + dir_dev, proc_get_rf_info, dev);
  161430. + if (!entry) {
  161431. + DBG_871X("Unable to create_proc_read_entry!\n");
  161432. + return;
  161433. + }
  161434. +
  161435. + entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO,
  161436. + dir_dev, proc_get_ap_info, dev);
  161437. + if (!entry) {
  161438. + DBG_871X("Unable to create_proc_read_entry!\n");
  161439. + return;
  161440. + }
  161441. +
  161442. + entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO,
  161443. + dir_dev, proc_get_adapter_state, dev);
  161444. + if (!entry) {
  161445. + DBG_871X("Unable to create_proc_read_entry!\n");
  161446. + return;
  161447. + }
  161448. +
  161449. + entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO,
  161450. + dir_dev, proc_get_trx_info, dev);
  161451. + if (!entry) {
  161452. + DBG_871X("Unable to create_proc_read_entry!\n");
  161453. + return;
  161454. + }
  161455. +
  161456. + entry = create_proc_read_entry("mac_reg_dump1", S_IFREG | S_IRUGO,
  161457. + dir_dev, proc_get_mac_reg_dump1, dev);
  161458. + if (!entry) {
  161459. + DBG_871X("Unable to create_proc_read_entry!\n");
  161460. + return;
  161461. + }
  161462. +
  161463. + entry = create_proc_read_entry("mac_reg_dump2", S_IFREG | S_IRUGO,
  161464. + dir_dev, proc_get_mac_reg_dump2, dev);
  161465. + if (!entry) {
  161466. + DBG_871X("Unable to create_proc_read_entry!\n");
  161467. + return;
  161468. + }
  161469. +
  161470. + entry = create_proc_read_entry("mac_reg_dump3", S_IFREG | S_IRUGO,
  161471. + dir_dev, proc_get_mac_reg_dump3, dev);
  161472. + if (!entry) {
  161473. + DBG_871X("Unable to create_proc_read_entry!\n");
  161474. + return;
  161475. + }
  161476. +
  161477. + entry = create_proc_read_entry("bb_reg_dump1", S_IFREG | S_IRUGO,
  161478. + dir_dev, proc_get_bb_reg_dump1, dev);
  161479. + if (!entry) {
  161480. + DBG_871X("Unable to create_proc_read_entry!\n");
  161481. + return;
  161482. + }
  161483. +
  161484. + entry = create_proc_read_entry("bb_reg_dump2", S_IFREG | S_IRUGO,
  161485. + dir_dev, proc_get_bb_reg_dump2, dev);
  161486. + if (!entry) {
  161487. + DBG_871X("Unable to create_proc_read_entry!\n");
  161488. + return;
  161489. + }
  161490. +
  161491. + entry = create_proc_read_entry("bb_reg_dump3", S_IFREG | S_IRUGO,
  161492. + dir_dev, proc_get_bb_reg_dump3, dev);
  161493. + if (!entry) {
  161494. + DBG_871X("Unable to create_proc_read_entry!\n");
  161495. + return;
  161496. + }
  161497. +
  161498. + entry = create_proc_read_entry("rf_reg_dump1", S_IFREG | S_IRUGO,
  161499. + dir_dev, proc_get_rf_reg_dump1, dev);
  161500. + if (!entry) {
  161501. + DBG_871X("Unable to create_proc_read_entry!\n");
  161502. + return;
  161503. + }
  161504. +
  161505. + entry = create_proc_read_entry("rf_reg_dump2", S_IFREG | S_IRUGO,
  161506. + dir_dev, proc_get_rf_reg_dump2, dev);
  161507. + if (!entry) {
  161508. + DBG_871X("Unable to create_proc_read_entry!\n");
  161509. + return;
  161510. + }
  161511. +
  161512. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  161513. + if((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type )) {
  161514. + entry = create_proc_read_entry("rf_reg_dump3", S_IFREG | S_IRUGO,
  161515. + dir_dev, proc_get_rf_reg_dump3, dev);
  161516. + if (!entry) {
  161517. + DBG_871X("Unable to create_proc_read_entry!\n");
  161518. + return;
  161519. + }
  161520. +
  161521. + entry = create_proc_read_entry("rf_reg_dump4", S_IFREG | S_IRUGO,
  161522. + dir_dev, proc_get_rf_reg_dump4, dev);
  161523. + if (!entry) {
  161524. + DBG_871X("Unable to create_proc_read_entry!\n");
  161525. + return;
  161526. + }
  161527. + }
  161528. +
  161529. +#ifdef CONFIG_AP_MODE
  161530. +
  161531. + entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO,
  161532. + dir_dev, proc_get_all_sta_info, dev);
  161533. + if (!entry) {
  161534. + DBG_871X("Unable to create_proc_read_entry!\n");
  161535. + return;
  161536. + }
  161537. +#endif
  161538. +
  161539. +#ifdef DBG_MEMORY_LEAK
  161540. + entry = create_proc_read_entry("_malloc_cnt", S_IFREG | S_IRUGO,
  161541. + dir_dev, proc_get_malloc_cnt, dev);
  161542. + if (!entry) {
  161543. + DBG_871X("Unable to create_proc_read_entry!\n");
  161544. + return;
  161545. + }
  161546. +#endif
  161547. +
  161548. +#ifdef CONFIG_FIND_BEST_CHANNEL
  161549. + entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO,
  161550. + dir_dev, proc_get_best_channel, dev);
  161551. + if (!entry) {
  161552. + DBG_871X("Unable to create_proc_read_entry!\n");
  161553. + return;
  161554. + }
  161555. + entry->write_proc = proc_set_best_channel;
  161556. +#endif
  161557. +
  161558. + entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO,
  161559. + dir_dev, proc_get_rx_signal, dev);
  161560. + if (!entry) {
  161561. + DBG_871X("Unable to create_proc_read_entry!\n");
  161562. + return;
  161563. + }
  161564. + entry->write_proc = proc_set_rx_signal;
  161565. +
  161566. + entry = create_proc_read_entry("ht_enable", S_IFREG | S_IRUGO,
  161567. + dir_dev, proc_get_ht_enable, dev);
  161568. + if (!entry) {
  161569. + DBG_871X("Unable to create_proc_read_entry!\n");
  161570. + return;
  161571. + }
  161572. + entry->write_proc = proc_set_ht_enable;
  161573. +
  161574. + entry = create_proc_read_entry("cbw40_enable", S_IFREG | S_IRUGO,
  161575. + dir_dev, proc_get_cbw40_enable, dev);
  161576. + if (!entry) {
  161577. + DBG_871X("Unable to create_proc_read_entry!\n");
  161578. + return;
  161579. + }
  161580. + entry->write_proc = proc_set_cbw40_enable;
  161581. +
  161582. + entry = create_proc_read_entry("ampdu_enable", S_IFREG | S_IRUGO,
  161583. + dir_dev, proc_get_ampdu_enable, dev);
  161584. + if (!entry) {
  161585. + DBG_871X("Unable to create_proc_read_entry!\n");
  161586. + return;
  161587. + }
  161588. + entry->write_proc = proc_set_ampdu_enable;
  161589. +
  161590. + entry = create_proc_read_entry("rx_stbc", S_IFREG | S_IRUGO,
  161591. + dir_dev, proc_get_rx_stbc, dev);
  161592. + if (!entry) {
  161593. + DBG_871X("Unable to create_proc_read_entry!\n");
  161594. + return;
  161595. + }
  161596. + entry->write_proc = proc_set_rx_stbc;
  161597. +
  161598. +
  161599. + entry = create_proc_read_entry("path_rssi", S_IFREG | S_IRUGO,
  161600. + dir_dev, proc_get_two_path_rssi, dev);
  161601. +
  161602. + entry = create_proc_read_entry("vid", S_IFREG | S_IRUGO,
  161603. + dir_dev, proc_get_vid, dev);
  161604. + if (!entry) {
  161605. + DBG_871X("Unable to create_proc_read_entry!\n");
  161606. + return;
  161607. + }
  161608. +
  161609. + entry = create_proc_read_entry("pid", S_IFREG | S_IRUGO,
  161610. + dir_dev, proc_get_pid, dev);
  161611. + if (!entry) {
  161612. + DBG_871X("Unable to create_proc_read_entry!\n");
  161613. + return;
  161614. + }
  161615. +
  161616. + entry = create_proc_read_entry("rssi_disp", S_IFREG | S_IRUGO,
  161617. + dir_dev, proc_get_rssi_disp, dev);
  161618. + if (!entry) {
  161619. + DBG_871X("Unable to create_proc_read_entry!\n");
  161620. + return;
  161621. + }
  161622. + entry->write_proc = proc_set_rssi_disp;
  161623. +
  161624. +#if defined(DBG_CONFIG_ERROR_DETECT)
  161625. + entry = create_proc_read_entry("sreset", S_IFREG | S_IRUGO,
  161626. + dir_dev, proc_get_sreset, dev);
  161627. + if (!entry) {
  161628. + DBG_871X("Unable to create_proc_read_entry!\n");
  161629. + return;
  161630. + }
  161631. + entry->write_proc = proc_set_sreset;
  161632. +#endif /* DBG_CONFIG_ERROR_DETECT */
  161633. +
  161634. +#ifdef CONFIG_DM_ADAPTIVITY
  161635. + entry = create_proc_read_entry("dm_adaptivity", S_IFREG | S_IRUGO,
  161636. + dir_dev, proc_get_dm_adaptivity, dev);
  161637. + if (!entry) {
  161638. + DBG_871X("Unable to create_proc_read_entry!\n");
  161639. + return;
  161640. + }
  161641. + entry->write_proc = proc_set_dm_adaptivity;
  161642. +#endif /* CONFIG_DM_ADAPTIVITY */
  161643. +
  161644. +}
  161645. +
  161646. +void rtw_proc_remove_one(struct net_device *dev)
  161647. +{
  161648. + struct proc_dir_entry *dir_dev = NULL;
  161649. + _adapter *padapter = rtw_netdev_priv(dev);
  161650. + u8 rf_type;
  161651. +
  161652. + dir_dev = padapter->dir_dev;
  161653. + padapter->dir_dev = NULL;
  161654. +
  161655. + if (dir_dev) {
  161656. +
  161657. + remove_proc_entry("write_reg", dir_dev);
  161658. + remove_proc_entry("read_reg", dir_dev);
  161659. + remove_proc_entry("fwstate", dir_dev);
  161660. + remove_proc_entry("sec_info", dir_dev);
  161661. + remove_proc_entry("mlmext_state", dir_dev);
  161662. + remove_proc_entry("qos_option", dir_dev);
  161663. + remove_proc_entry("ht_option", dir_dev);
  161664. + remove_proc_entry("rf_info", dir_dev);
  161665. + remove_proc_entry("ap_info", dir_dev);
  161666. + remove_proc_entry("adapter_state", dir_dev);
  161667. + remove_proc_entry("trx_info", dir_dev);
  161668. +
  161669. + remove_proc_entry("mac_reg_dump1", dir_dev);
  161670. + remove_proc_entry("mac_reg_dump2", dir_dev);
  161671. + remove_proc_entry("mac_reg_dump3", dir_dev);
  161672. + remove_proc_entry("bb_reg_dump1", dir_dev);
  161673. + remove_proc_entry("bb_reg_dump2", dir_dev);
  161674. + remove_proc_entry("bb_reg_dump3", dir_dev);
  161675. + remove_proc_entry("rf_reg_dump1", dir_dev);
  161676. + remove_proc_entry("rf_reg_dump2", dir_dev);
  161677. + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  161678. + if((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type )) {
  161679. + remove_proc_entry("rf_reg_dump3", dir_dev);
  161680. + remove_proc_entry("rf_reg_dump4", dir_dev);
  161681. + }
  161682. +#ifdef CONFIG_AP_MODE
  161683. + remove_proc_entry("all_sta_info", dir_dev);
  161684. +#endif
  161685. +
  161686. +#ifdef DBG_MEMORY_LEAK
  161687. + remove_proc_entry("_malloc_cnt", dir_dev);
  161688. +#endif
  161689. +
  161690. +#ifdef CONFIG_FIND_BEST_CHANNEL
  161691. + remove_proc_entry("best_channel", dir_dev);
  161692. +#endif
  161693. + remove_proc_entry("rx_signal", dir_dev);
  161694. +
  161695. + remove_proc_entry("cbw40_enable", dir_dev);
  161696. +
  161697. + remove_proc_entry("ht_enable", dir_dev);
  161698. +
  161699. + remove_proc_entry("ampdu_enable", dir_dev);
  161700. +
  161701. + remove_proc_entry("rx_stbc", dir_dev);
  161702. +
  161703. + remove_proc_entry("path_rssi", dir_dev);
  161704. +
  161705. + remove_proc_entry("vid", dir_dev);
  161706. +
  161707. + remove_proc_entry("pid", dir_dev);
  161708. +
  161709. + remove_proc_entry("rssi_disp", dir_dev);
  161710. +
  161711. +#if defined(DBG_CONFIG_ERROR_DETECT)
  161712. + remove_proc_entry("sreset", dir_dev);
  161713. +#endif /* DBG_CONFIG_ERROR_DETECT */
  161714. +
  161715. +#ifdef CONFIG_DM_ADAPTIVITY
  161716. + remove_proc_entry("dm_adaptivity", dir_dev);
  161717. +#endif
  161718. +
  161719. + remove_proc_entry(dev->name, rtw_proc);
  161720. + dir_dev = NULL;
  161721. +
  161722. + }
  161723. + else
  161724. + {
  161725. + return;
  161726. + }
  161727. +
  161728. + rtw_proc_cnt--;
  161729. +
  161730. + if(rtw_proc_cnt == 0)
  161731. + {
  161732. + if(rtw_proc){
  161733. + remove_proc_entry("ver_info", rtw_proc);
  161734. +
  161735. + remove_proc_entry("log_level", rtw_proc);
  161736. + #ifdef DBG_MEM_ALLOC
  161737. + remove_proc_entry("mstat", rtw_proc);
  161738. + #endif /* DBG_MEM_ALLOC */
  161739. +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  161740. + remove_proc_entry(rtw_proc_name, proc_net);
  161741. +#else
  161742. + remove_proc_entry(rtw_proc_name, init_net.proc_net);
  161743. +#endif
  161744. + rtw_proc = NULL;
  161745. + }
  161746. + }
  161747. +}
  161748. +#endif
  161749. +
  161750. +uint loadparam( _adapter *padapter, _nic_hdl pnetdev);
  161751. +uint loadparam( _adapter *padapter, _nic_hdl pnetdev)
  161752. +{
  161753. +
  161754. + uint status = _SUCCESS;
  161755. + struct registry_priv *registry_par = &padapter->registrypriv;
  161756. +
  161757. +_func_enter_;
  161758. +
  161759. + registry_par->chip_version = (u8)rtw_chip_version;
  161760. + registry_par->rfintfs = (u8)rtw_rfintfs;
  161761. + registry_par->lbkmode = (u8)rtw_lbkmode;
  161762. + //registry_par->hci = (u8)hci;
  161763. + registry_par->network_mode = (u8)rtw_network_mode;
  161764. +
  161765. + _rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3);
  161766. + registry_par->ssid.SsidLength = 3;
  161767. +
  161768. + registry_par->channel = (u8)rtw_channel;
  161769. + registry_par->wireless_mode = (u8)rtw_wireless_mode;
  161770. + registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;
  161771. + registry_par->vcs_type = (u8)rtw_vcs_type;
  161772. + registry_par->rts_thresh=(u16)rtw_rts_thresh;
  161773. + registry_par->frag_thresh=(u16)rtw_frag_thresh;
  161774. + registry_par->preamble = (u8)rtw_preamble;
  161775. + registry_par->scan_mode = (u8)rtw_scan_mode;
  161776. + registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr;
  161777. + registry_par->soft_ap= (u8)rtw_soft_ap;
  161778. + //registry_par->smart_ps = (u8)rtw_smart_ps;
  161779. + registry_par->power_mgnt = (u8)rtw_power_mgnt;
  161780. + registry_par->ips_mode = (u8)rtw_ips_mode;
  161781. + registry_par->radio_enable = (u8)rtw_radio_enable;
  161782. + registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;
  161783. + registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;
  161784. + registry_par->busy_thresh = (u16)rtw_busy_thresh;
  161785. + //registry_par->qos_enable = (u8)rtw_qos_enable;
  161786. + registry_par->ack_policy = (u8)rtw_ack_policy;
  161787. + registry_par->mp_mode = (u8)rtw_mp_mode;
  161788. + registry_par->software_encrypt = (u8)rtw_software_encrypt;
  161789. + registry_par->software_decrypt = (u8)rtw_software_decrypt;
  161790. +
  161791. + registry_par->acm_method = (u8)rtw_acm_method;
  161792. +
  161793. + //UAPSD
  161794. + registry_par->wmm_enable = (u8)rtw_wmm_enable;
  161795. + registry_par->uapsd_enable = (u8)rtw_uapsd_enable;
  161796. + registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp;
  161797. + registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en;
  161798. + registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en;
  161799. + registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en;
  161800. + registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en;
  161801. +
  161802. +#ifdef CONFIG_80211N_HT
  161803. + registry_par->ht_enable = (u8)rtw_ht_enable;
  161804. + registry_par->cbw40_enable = (u8)rtw_cbw40_enable;
  161805. + registry_par->ampdu_enable = (u8)rtw_ampdu_enable;
  161806. + registry_par->rx_stbc = (u8)rtw_rx_stbc;
  161807. + registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;
  161808. +#endif
  161809. +
  161810. + registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;
  161811. + registry_par->rf_config = (u8)rtw_rf_config;
  161812. + registry_par->low_power = (u8)rtw_low_power;
  161813. +
  161814. +
  161815. + registry_par->wifi_spec = (u8)rtw_wifi_spec;
  161816. + registry_par->special_rf_path = (u8)rtw_special_rf_path;
  161817. + registry_par->channel_plan = (u8)rtw_channel_plan;
  161818. +
  161819. +#ifdef CONFIG_BT_COEXIST
  161820. + registry_par->bt_iso = (u8)rtw_bt_iso;
  161821. + registry_par->bt_sco = (u8)rtw_bt_sco;
  161822. + registry_par->bt_ampdu = (u8)rtw_bt_ampdu;
  161823. +#endif
  161824. + registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;
  161825. +
  161826. + registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;
  161827. +
  161828. +#ifdef CONFIG_AUTOSUSPEND
  161829. + registry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable
  161830. +#endif
  161831. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  161832. + registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;//0:disable,1:enable,2:by EFUSE config
  161833. + registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable
  161834. +#endif
  161835. +
  161836. + registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;
  161837. +
  161838. +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
  161839. + snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s", rtw_adaptor_info_caching_file_path);
  161840. + registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX-1]=0;
  161841. +#endif
  161842. +
  161843. +#ifdef CONFIG_LAYER2_ROAMING
  161844. + registry_par->max_roaming_times = (u8)rtw_max_roaming_times;
  161845. +#ifdef CONFIG_INTEL_WIDI
  161846. + registry_par->max_roaming_times = (u8)rtw_max_roaming_times + 2;
  161847. +#endif // CONFIG_INTEL_WIDI
  161848. +#endif
  161849. +
  161850. +#ifdef CONFIG_IOL
  161851. + registry_par->force_iol = rtw_force_iol;
  161852. +#endif
  161853. +
  161854. + registry_par->mac_phy_mode = rtw_mac_phy_mode;
  161855. +
  161856. +#ifdef CONFIG_80211D
  161857. + registry_par->enable80211d = (u8)rtw_80211d;
  161858. +#endif
  161859. +
  161860. + snprintf(registry_par->ifname, 16, "%s", ifname);
  161861. + snprintf(registry_par->if2name, 16, "%s", if2name);
  161862. +
  161863. + registry_par->notch_filter = (u8)rtw_notch_filter;
  161864. +
  161865. +#ifdef CONFIG_MULTI_VIR_IFACES
  161866. + registry_par->ext_iface_num = (u8)rtw_ext_iface_num;
  161867. +#endif //CONFIG_MULTI_VIR_IFACES
  161868. +
  161869. +_func_exit_;
  161870. +
  161871. + return status;
  161872. +}
  161873. +
  161874. +static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p)
  161875. +{
  161876. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  161877. + struct sockaddr *addr = p;
  161878. +
  161879. + if(padapter->bup == _FALSE)
  161880. + {
  161881. + //DBG_871X("r8711_net_set_mac_address(), MAC=%x:%x:%x:%x:%x:%x\n", addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3],
  161882. + //addr->sa_data[4], addr->sa_data[5]);
  161883. + _rtw_memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN);
  161884. + //_rtw_memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN);
  161885. + //padapter->bset_hwaddr = _TRUE;
  161886. + }
  161887. +
  161888. + return 0;
  161889. +}
  161890. +
  161891. +static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)
  161892. +{
  161893. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  161894. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  161895. + struct recv_priv *precvpriv = &(padapter->recvpriv);
  161896. +
  161897. + padapter->stats.tx_packets = pxmitpriv->tx_pkts;//pxmitpriv->tx_pkts++;
  161898. + padapter->stats.rx_packets = precvpriv->rx_pkts;//precvpriv->rx_pkts++;
  161899. + padapter->stats.tx_dropped = pxmitpriv->tx_drop;
  161900. + padapter->stats.rx_dropped = precvpriv->rx_drop;
  161901. + padapter->stats.tx_bytes = pxmitpriv->tx_bytes;
  161902. + padapter->stats.rx_bytes = precvpriv->rx_bytes;
  161903. +
  161904. + return &padapter->stats;
  161905. +}
  161906. +
  161907. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  161908. +/*
  161909. + * AC to queue mapping
  161910. + *
  161911. + * AC_VO -> queue 0
  161912. + * AC_VI -> queue 1
  161913. + * AC_BE -> queue 2
  161914. + * AC_BK -> queue 3
  161915. + */
  161916. +static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };
  161917. +
  161918. +/* Given a data frame determine the 802.1p/1d tag to use. */
  161919. +unsigned int rtw_classify8021d(struct sk_buff *skb)
  161920. +{
  161921. + unsigned int dscp;
  161922. +
  161923. + /* skb->priority values from 256->263 are magic values to
  161924. + * directly indicate a specific 802.1d priority. This is used
  161925. + * to allow 802.1d priority to be passed directly in from VLAN
  161926. + * tags, etc.
  161927. + */
  161928. + if (skb->priority >= 256 && skb->priority <= 263)
  161929. + return skb->priority - 256;
  161930. +
  161931. + switch (skb->protocol) {
  161932. + case htons(ETH_P_IP):
  161933. + dscp = ip_hdr(skb)->tos & 0xfc;
  161934. + break;
  161935. + default:
  161936. + return 0;
  161937. + }
  161938. +
  161939. + return dscp >> 5;
  161940. +}
  161941. +
  161942. +static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb)
  161943. +{
  161944. + _adapter *padapter = rtw_netdev_priv(dev);
  161945. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  161946. +
  161947. + skb->priority = rtw_classify8021d(skb);
  161948. +
  161949. + if(pmlmepriv->acm_mask != 0)
  161950. + {
  161951. + skb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);
  161952. + }
  161953. +
  161954. + return rtw_1d_to_queue[skb->priority];
  161955. +}
  161956. +
  161957. +u16 rtw_recv_select_queue(struct sk_buff *skb)
  161958. +{
  161959. + struct iphdr *piphdr;
  161960. + unsigned int dscp;
  161961. + u16 eth_type;
  161962. + u32 priority;
  161963. + u8 *pdata = skb->data;
  161964. +
  161965. + _rtw_memcpy(&eth_type, pdata+(ETH_ALEN<<1), 2);
  161966. +
  161967. + switch (eth_type) {
  161968. + case htons(ETH_P_IP):
  161969. +
  161970. + piphdr = (struct iphdr *)(pdata+ETH_HLEN);
  161971. +
  161972. + dscp = piphdr->tos & 0xfc;
  161973. +
  161974. + priority = dscp >> 5;
  161975. +
  161976. + break;
  161977. + default:
  161978. + priority = 0;
  161979. + }
  161980. +
  161981. + return rtw_1d_to_queue[priority];
  161982. +
  161983. +}
  161984. +
  161985. +#endif
  161986. +
  161987. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  161988. +static const struct net_device_ops rtw_netdev_ops = {
  161989. + .ndo_open = netdev_open,
  161990. + .ndo_stop = netdev_close,
  161991. + .ndo_start_xmit = rtw_xmit_entry,
  161992. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  161993. + .ndo_select_queue = rtw_select_queue,
  161994. +#endif
  161995. + .ndo_set_mac_address = rtw_net_set_mac_address,
  161996. + .ndo_get_stats = rtw_net_get_stats,
  161997. + .ndo_do_ioctl = rtw_ioctl,
  161998. +};
  161999. +#endif
  162000. +
  162001. +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
  162002. +{
  162003. + _adapter *padapter = rtw_netdev_priv(pnetdev);
  162004. +
  162005. +#ifdef CONFIG_EASY_REPLACEMENT
  162006. + struct net_device *TargetNetdev = NULL;
  162007. + _adapter *TargetAdapter = NULL;
  162008. + struct net *devnet = NULL;
  162009. +
  162010. + if(padapter->bDongle == 1)
  162011. + {
  162012. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  162013. + TargetNetdev = dev_get_by_name("wlan0");
  162014. +#else
  162015. + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  162016. + devnet = pnetdev->nd_net;
  162017. + #else
  162018. + devnet = dev_net(pnetdev);
  162019. + #endif
  162020. + TargetNetdev = dev_get_by_name(devnet, "wlan0");
  162021. +#endif
  162022. + if(TargetNetdev) {
  162023. + DBG_871X("Force onboard module driver disappear !!!\n");
  162024. + TargetAdapter = rtw_netdev_priv(TargetNetdev);
  162025. + TargetAdapter->DriverState = DRIVER_DISAPPEAR;
  162026. +
  162027. + padapter->pid[0] = TargetAdapter->pid[0];
  162028. + padapter->pid[1] = TargetAdapter->pid[1];
  162029. + padapter->pid[2] = TargetAdapter->pid[2];
  162030. +
  162031. + dev_put(TargetNetdev);
  162032. + unregister_netdev(TargetNetdev);
  162033. +
  162034. + if(TargetAdapter->chip_type == padapter->chip_type)
  162035. + rtw_proc_remove_one(TargetNetdev);
  162036. +
  162037. + padapter->DriverState = DRIVER_REPLACE_DONGLE;
  162038. + }
  162039. + }
  162040. +#endif //CONFIG_EASY_REPLACEMENT
  162041. +
  162042. + if(dev_alloc_name(pnetdev, ifname) < 0)
  162043. + {
  162044. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("dev_alloc_name, fail! \n"));
  162045. + }
  162046. +
  162047. + netif_carrier_off(pnetdev);
  162048. + //rtw_netif_stop_queue(pnetdev);
  162049. +
  162050. + return 0;
  162051. +}
  162052. +
  162053. +struct net_device *rtw_init_netdev(_adapter *old_padapter)
  162054. +{
  162055. + _adapter *padapter;
  162056. + struct net_device *pnetdev;
  162057. +
  162058. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+init_net_dev\n"));
  162059. +
  162060. + if(old_padapter != NULL)
  162061. + pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter);
  162062. + else
  162063. + pnetdev = rtw_alloc_etherdev(sizeof(_adapter));
  162064. +
  162065. + if (!pnetdev)
  162066. + return NULL;
  162067. +
  162068. + padapter = rtw_netdev_priv(pnetdev);
  162069. + padapter->pnetdev = pnetdev;
  162070. +
  162071. +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
  162072. + SET_MODULE_OWNER(pnetdev);
  162073. +#endif
  162074. +
  162075. + //pnetdev->init = NULL;
  162076. +
  162077. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  162078. + DBG_871X("register rtw_netdev_ops to netdev_ops\n");
  162079. + pnetdev->netdev_ops = &rtw_netdev_ops;
  162080. +#else
  162081. + pnetdev->open = netdev_open;
  162082. + pnetdev->stop = netdev_close;
  162083. + pnetdev->hard_start_xmit = rtw_xmit_entry;
  162084. + pnetdev->set_mac_address = rtw_net_set_mac_address;
  162085. + pnetdev->get_stats = rtw_net_get_stats;
  162086. + pnetdev->do_ioctl = rtw_ioctl;
  162087. +#endif
  162088. +
  162089. +
  162090. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  162091. + pnetdev->features |= NETIF_F_IP_CSUM;
  162092. +#endif
  162093. + //pnetdev->tx_timeout = NULL;
  162094. + pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */
  162095. +#ifdef CONFIG_WIRELESS_EXT
  162096. + pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;
  162097. +#endif
  162098. +
  162099. +#ifdef WIRELESS_SPY
  162100. + //priv->wireless_data.spy_data = &priv->spy_data;
  162101. + //pnetdev->wireless_data = &priv->wireless_data;
  162102. +#endif
  162103. +
  162104. + //step 2.
  162105. + loadparam(padapter, pnetdev);
  162106. +
  162107. + return pnetdev;
  162108. +
  162109. +}
  162110. +
  162111. +void rtw_unregister_netdevs(struct dvobj_priv *dvobj)
  162112. +{
  162113. + int i;
  162114. + _adapter *padapter = NULL;
  162115. +
  162116. + for (i=0;i<dvobj->iface_nums;i++) {
  162117. + struct net_device *pnetdev = NULL;
  162118. +
  162119. + padapter = dvobj->padapters[i];
  162120. +
  162121. + if (padapter == NULL)
  162122. + continue;
  162123. +
  162124. + pnetdev = padapter->pnetdev;
  162125. +
  162126. + if((padapter->DriverState != DRIVER_DISAPPEAR) && pnetdev) {
  162127. + unregister_netdev(pnetdev); //will call netdev_close()
  162128. + rtw_proc_remove_one(pnetdev);
  162129. + }
  162130. +
  162131. + #ifdef CONFIG_IOCTL_CFG80211
  162132. + rtw_wdev_unregister(padapter->rtw_wdev);
  162133. + #endif
  162134. + }
  162135. +
  162136. +}
  162137. +
  162138. +u32 rtw_start_drv_threads(_adapter *padapter)
  162139. +{
  162140. +
  162141. + u32 _status = _SUCCESS;
  162142. +
  162143. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n"));
  162144. +#ifdef CONFIG_XMIT_THREAD_MODE
  162145. + padapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, "RTW_XMIT_THREAD");
  162146. + if(IS_ERR(padapter->xmitThread))
  162147. + _status = _FAIL;
  162148. +#endif
  162149. +
  162150. +#ifdef CONFIG_RECV_THREAD_MODE
  162151. + padapter->recvThread = kthread_run(rtw_recv_thread, padapter, "RTW_RECV_THREAD");
  162152. + if(IS_ERR(padapter->recvThread))
  162153. + _status = _FAIL;
  162154. +#endif
  162155. +
  162156. +#ifdef CONFIG_CONCURRENT_MODE
  162157. + if(padapter->isprimary == _TRUE)
  162158. +#endif //CONFIG_CONCURRENT_MODE
  162159. + {
  162160. + padapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, "RTW_CMD_THREAD");
  162161. + if(IS_ERR(padapter->cmdThread))
  162162. + _status = _FAIL;
  162163. + else
  162164. + _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); //wait for cmd_thread to run
  162165. + }
  162166. +
  162167. +
  162168. +#ifdef CONFIG_EVENT_THREAD_MODE
  162169. + padapter->evtThread = kthread_run(event_thread, padapter, "RTW_EVENT_THREAD");
  162170. + if(IS_ERR(padapter->evtThread))
  162171. + _status = _FAIL;
  162172. +#endif
  162173. +
  162174. + return _status;
  162175. +
  162176. +}
  162177. +
  162178. +void rtw_stop_drv_threads (_adapter *padapter)
  162179. +{
  162180. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n"));
  162181. +
  162182. +#ifdef CONFIG_CONCURRENT_MODE
  162183. + if(padapter->isprimary == _TRUE)
  162184. +#endif //CONFIG_CONCURRENT_MODE
  162185. + {
  162186. + rtw_stop_cmd_thread(padapter);
  162187. + }
  162188. +
  162189. +#ifdef CONFIG_EVENT_THREAD_MODE
  162190. + _rtw_up_sema(&padapter->evtpriv.evt_notify);
  162191. + if(padapter->evtThread){
  162192. + _rtw_down_sema(&padapter->evtpriv.terminate_evtthread_sema);
  162193. + }
  162194. +#endif
  162195. +
  162196. +#ifdef CONFIG_XMIT_THREAD_MODE
  162197. + // Below is to termindate tx_thread...
  162198. + _rtw_up_sema(&padapter->xmitpriv.xmit_sema);
  162199. + _rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
  162200. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt: rtw_xmit_thread can be terminated ! \n"));
  162201. +#endif
  162202. +
  162203. +#ifdef CONFIG_RECV_THREAD_MODE
  162204. + // Below is to termindate rx_thread...
  162205. + _rtw_up_sema(&padapter->recvpriv.recv_sema);
  162206. + _rtw_down_sema(&padapter->recvpriv.terminate_recvthread_sema);
  162207. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt:recv_thread can be terminated! \n"));
  162208. +#endif
  162209. +
  162210. +
  162211. +}
  162212. +
  162213. +u8 rtw_init_default_value(_adapter *padapter);
  162214. +u8 rtw_init_default_value(_adapter *padapter)
  162215. +{
  162216. + u8 ret = _SUCCESS;
  162217. + struct registry_priv* pregistrypriv = &padapter->registrypriv;
  162218. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  162219. + struct mlme_priv *pmlmepriv= &padapter->mlmepriv;
  162220. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  162221. +
  162222. + //xmit_priv
  162223. + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;
  162224. + pxmitpriv->vcs = pregistrypriv->vcs_type;
  162225. + pxmitpriv->vcs_type = pregistrypriv->vcs_type;
  162226. + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh;
  162227. + pxmitpriv->frag_len = pregistrypriv->frag_thresh;
  162228. +
  162229. +
  162230. +
  162231. + //recv_priv
  162232. +
  162233. +
  162234. + //mlme_priv
  162235. + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec
  162236. + pmlmepriv->scan_mode = SCAN_ACTIVE;
  162237. +
  162238. + //qos_priv
  162239. + //pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable;
  162240. +
  162241. + //ht_priv
  162242. +#ifdef CONFIG_80211N_HT
  162243. + pmlmepriv->htpriv.ampdu_enable = _FALSE;//set to disabled
  162244. +#endif
  162245. +
  162246. + //security_priv
  162247. + //rtw_get_encrypt_decrypt_from_registrypriv(padapter);
  162248. + psecuritypriv->binstallGrpkey = _FAIL;
  162249. + psecuritypriv->sw_encrypt=pregistrypriv->software_encrypt;
  162250. + psecuritypriv->sw_decrypt=pregistrypriv->software_decrypt;
  162251. +
  162252. + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system
  162253. + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
  162254. +
  162255. + psecuritypriv->dot11PrivacyKeyIndex = 0;
  162256. +
  162257. + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
  162258. + psecuritypriv->dot118021XGrpKeyid = 1;
  162259. +
  162260. + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
  162261. + psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;
  162262. +
  162263. +
  162264. + //pwrctrl_priv
  162265. +
  162266. +
  162267. + //registry_priv
  162268. + rtw_init_registrypriv_dev_network(padapter);
  162269. + rtw_update_registrypriv_dev_network(padapter);
  162270. +
  162271. +
  162272. + //hal_priv
  162273. + rtw_hal_def_value_init(padapter);
  162274. +
  162275. + //misc.
  162276. + padapter->bReadPortCancel = _FALSE;
  162277. + padapter->bWritePortCancel = _FALSE;
  162278. + padapter->bRxRSSIDisplay = 0;
  162279. + padapter->bForceWriteInitGain = 1;
  162280. + padapter->bNotifyChannelChange = 0;
  162281. +#ifdef CONFIG_P2P
  162282. + padapter->bShowGetP2PState = 1;
  162283. +#endif
  162284. + return ret;
  162285. +}
  162286. +
  162287. +struct dvobj_priv *devobj_init(void)
  162288. +{
  162289. + struct dvobj_priv *pdvobj = NULL;
  162290. +
  162291. + if ((pdvobj = (struct dvobj_priv*)rtw_zmalloc(sizeof(*pdvobj))) == NULL)
  162292. + return NULL;
  162293. +
  162294. + _rtw_mutex_init(&pdvobj->hw_init_mutex);
  162295. + _rtw_mutex_init(&pdvobj->h2c_fwcmd_mutex);
  162296. + _rtw_mutex_init(&pdvobj->setch_mutex);
  162297. + _rtw_mutex_init(&pdvobj->setbw_mutex);
  162298. +
  162299. + pdvobj->processing_dev_remove = _FALSE;
  162300. +
  162301. + return pdvobj;
  162302. +}
  162303. +
  162304. +void devobj_deinit(struct dvobj_priv *pdvobj)
  162305. +{
  162306. + if(!pdvobj)
  162307. + return;
  162308. +
  162309. + _rtw_mutex_free(&pdvobj->hw_init_mutex);
  162310. + _rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex);
  162311. + _rtw_mutex_free(&pdvobj->setch_mutex);
  162312. + _rtw_mutex_free(&pdvobj->setbw_mutex);
  162313. +
  162314. + rtw_mfree((u8*)pdvobj, sizeof(*pdvobj));
  162315. +}
  162316. +
  162317. +u8 rtw_reset_drv_sw(_adapter *padapter)
  162318. +{
  162319. + u8 ret8=_SUCCESS;
  162320. + struct mlme_priv *pmlmepriv= &padapter->mlmepriv;
  162321. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  162322. +
  162323. + //hal_priv
  162324. + rtw_hal_def_value_init(padapter);
  162325. + padapter->bReadPortCancel = _FALSE;
  162326. + padapter->bWritePortCancel = _FALSE;
  162327. + padapter->bRxRSSIDisplay = 0;
  162328. + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec
  162329. +
  162330. + pwrctrlpriv->bips_processing = _FALSE;
  162331. + pwrctrlpriv->rf_pwrstate = rf_on;
  162332. +
  162333. + padapter->xmitpriv.tx_pkts = 0;
  162334. + padapter->recvpriv.rx_pkts = 0;
  162335. +
  162336. + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
  162337. +
  162338. + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY |_FW_UNDER_LINKING);
  162339. +
  162340. +#ifdef CONFIG_AUTOSUSPEND
  162341. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))
  162342. + adapter_to_dvobj(padapter)->pusbdev->autosuspend_disabled = 1;//autosuspend disabled by the user
  162343. + #endif
  162344. +#endif
  162345. +
  162346. +#ifdef DBG_CONFIG_ERROR_DETECT
  162347. + rtw_hal_sreset_reset_value(padapter);
  162348. +#endif
  162349. + pwrctrlpriv->pwr_state_check_cnts = 0;
  162350. +
  162351. + //mlmeextpriv
  162352. + padapter->mlmeextpriv.sitesurvey_res.state= SCAN_DISABLE;
  162353. +
  162354. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  162355. + rtw_set_signal_stat_timer(&padapter->recvpriv);
  162356. +#endif
  162357. +
  162358. + return ret8;
  162359. +}
  162360. +
  162361. +
  162362. +u8 rtw_init_drv_sw(_adapter *padapter)
  162363. +{
  162364. +
  162365. + u8 ret8=_SUCCESS;
  162366. +
  162367. +_func_enter_;
  162368. +
  162369. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_init_drv_sw\n"));
  162370. +
  162371. + if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL)
  162372. + {
  162373. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init cmd_priv\n"));
  162374. + ret8=_FAIL;
  162375. + goto exit;
  162376. + }
  162377. +
  162378. + padapter->cmdpriv.padapter=padapter;
  162379. +
  162380. + if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL)
  162381. + {
  162382. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init evt_priv\n"));
  162383. + ret8=_FAIL;
  162384. + goto exit;
  162385. + }
  162386. +
  162387. +
  162388. + if (rtw_init_mlme_priv(padapter) == _FAIL)
  162389. + {
  162390. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_priv\n"));
  162391. + ret8=_FAIL;
  162392. + goto exit;
  162393. + }
  162394. +
  162395. +#ifdef CONFIG_P2P
  162396. + rtw_init_wifidirect_timers(padapter);
  162397. + init_wifidirect_info(padapter, P2P_ROLE_DISABLE);
  162398. + reset_global_wifidirect_info(padapter);
  162399. + #ifdef CONFIG_IOCTL_CFG80211
  162400. + rtw_init_cfg80211_wifidirect_info(padapter);
  162401. + #endif
  162402. +#ifdef CONFIG_WFD
  162403. + if(rtw_init_wifi_display_info(padapter) == _FAIL)
  162404. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init init_wifi_display_info\n"));
  162405. +#endif
  162406. +#endif /* CONFIG_P2P */
  162407. +
  162408. + if(init_mlme_ext_priv(padapter) == _FAIL)
  162409. + {
  162410. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_ext_priv\n"));
  162411. + ret8=_FAIL;
  162412. + goto exit;
  162413. + }
  162414. +
  162415. +#ifdef CONFIG_TDLS
  162416. + if(rtw_init_tdls_info(padapter) == _FAIL)
  162417. + {
  162418. + DBG_871X("Can't rtw_init_tdls_info\n");
  162419. + ret8=_FAIL;
  162420. + goto exit;
  162421. + }
  162422. +#endif //CONFIG_TDLS
  162423. +
  162424. + if(_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL)
  162425. + {
  162426. + DBG_871X("Can't _rtw_init_xmit_priv\n");
  162427. + ret8=_FAIL;
  162428. + goto exit;
  162429. + }
  162430. +
  162431. + if(_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL)
  162432. + {
  162433. + DBG_871X("Can't _rtw_init_recv_priv\n");
  162434. + ret8=_FAIL;
  162435. + goto exit;
  162436. + }
  162437. + // add for CONFIG_IEEE80211W, none 11w also can use
  162438. + _rtw_spinlock_init(&padapter->security_key_mutex);
  162439. +
  162440. + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
  162441. + //_rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv));
  162442. +
  162443. + //_init_timer(&(padapter->securitypriv.tkip_timer), padapter->pifp, rtw_use_tkipkey_handler, padapter);
  162444. +
  162445. + if(_rtw_init_sta_priv(&padapter->stapriv) == _FAIL)
  162446. + {
  162447. + DBG_871X("Can't _rtw_init_sta_priv\n");
  162448. + ret8=_FAIL;
  162449. + goto exit;
  162450. + }
  162451. +
  162452. + padapter->stapriv.padapter = padapter;
  162453. + padapter->setband = GHZ24_50;
  162454. + rtw_init_bcmc_stainfo(padapter);
  162455. +
  162456. + rtw_init_pwrctrl_priv(padapter);
  162457. +
  162458. + //_rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv));//move to mlme_priv
  162459. +
  162460. +#ifdef CONFIG_MP_INCLUDED
  162461. + if (init_mp_priv(padapter) == _FAIL) {
  162462. + DBG_871X("%s: initialize MP private data Fail!\n", __func__);
  162463. + }
  162464. +#endif
  162465. +
  162466. + ret8 = rtw_init_default_value(padapter);
  162467. +
  162468. + rtw_hal_dm_init(padapter);
  162469. + rtw_hal_sw_led_init(padapter);
  162470. +
  162471. +#ifdef DBG_CONFIG_ERROR_DETECT
  162472. + rtw_hal_sreset_init(padapter);
  162473. +#endif
  162474. +
  162475. +#ifdef CONFIG_INTEL_WIDI
  162476. + if(rtw_init_intel_widi(padapter) == _FAIL)
  162477. + {
  162478. + DBG_871X("Can't rtw_init_intel_widi\n");
  162479. + ret8=_FAIL;
  162480. + goto exit;
  162481. + }
  162482. +#endif //CONFIG_INTEL_WIDI
  162483. +
  162484. +#ifdef CONFIG_BR_EXT
  162485. + _rtw_spinlock_init(&padapter->br_ext_lock);
  162486. +#endif // CONFIG_BR_EXT
  162487. +
  162488. +exit:
  162489. +
  162490. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_init_drv_sw\n"));
  162491. +
  162492. + _func_exit_;
  162493. +
  162494. + return ret8;
  162495. +
  162496. +}
  162497. +
  162498. +void rtw_cancel_all_timer(_adapter *padapter)
  162499. +{
  162500. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_cancel_all_timer\n"));
  162501. +
  162502. + _cancel_timer_ex(&padapter->mlmepriv.assoc_timer);
  162503. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel association timer complete! \n"));
  162504. +
  162505. + //_cancel_timer_ex(&padapter->securitypriv.tkip_timer);
  162506. + //RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel tkip_timer! \n"));
  162507. +
  162508. + _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);
  162509. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel scan_to_timer! \n"));
  162510. +
  162511. + _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer);
  162512. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel dynamic_chk_timer! \n"));
  162513. +
  162514. + // cancel sw led timer
  162515. + rtw_hal_sw_led_deinit(padapter);
  162516. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel DeInitSwLeds! \n"));
  162517. +
  162518. + _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer);
  162519. +
  162520. +#ifdef CONFIG_IOCTL_CFG80211
  162521. +#ifdef CONFIG_P2P
  162522. + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
  162523. +#endif //CONFIG_P2P
  162524. +#endif //CONFIG_IOCTL_CFG80211
  162525. +
  162526. +#ifdef CONFIG_SET_SCAN_DENY_TIMER
  162527. + _cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer);
  162528. + rtw_clear_scan_deny(padapter);
  162529. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel set_scan_deny_timer! \n"));
  162530. +#endif
  162531. +
  162532. +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  162533. + _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);
  162534. +#endif
  162535. +
  162536. + // cancel dm timer
  162537. + rtw_hal_dm_deinit(padapter);
  162538. +
  162539. +#ifdef CONFIG_PLATFORM_FS_MX61
  162540. + msleep(50);
  162541. +#endif
  162542. +}
  162543. +
  162544. +u8 rtw_free_drv_sw(_adapter *padapter)
  162545. +{
  162546. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("==>rtw_free_drv_sw"));
  162547. +
  162548. +
  162549. + //we can call rtw_p2p_enable here, but:
  162550. + // 1. rtw_p2p_enable may have IO operation
  162551. + // 2. rtw_p2p_enable is bundled with wext interface
  162552. + #ifdef CONFIG_P2P
  162553. + {
  162554. + struct wifidirect_info *pwdinfo = &padapter->wdinfo;
  162555. + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
  162556. + {
  162557. + _cancel_timer_ex( &pwdinfo->find_phase_timer );
  162558. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
  162559. + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
  162560. +#ifdef CONFIG_CONCURRENT_MODE
  162561. + _cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );
  162562. +#endif // CONFIG_CONCURRENT_MODE
  162563. + rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
  162564. + }
  162565. + }
  162566. + #endif
  162567. + // add for CONFIG_IEEE80211W, none 11w also can use
  162568. + _rtw_spinlock_free(&padapter->security_key_mutex);
  162569. +
  162570. +#ifdef CONFIG_BR_EXT
  162571. + _rtw_spinlock_free(&padapter->br_ext_lock);
  162572. +#endif // CONFIG_BR_EXT
  162573. +
  162574. +#ifdef CONFIG_INTEL_WIDI
  162575. + rtw_free_intel_widi(padapter);
  162576. +#endif //CONFIG_INTEL_WIDI
  162577. +
  162578. + free_mlme_ext_priv(&padapter->mlmeextpriv);
  162579. +
  162580. +#ifdef CONFIG_TDLS
  162581. + //rtw_free_tdls_info(&padapter->tdlsinfo);
  162582. +#endif //CONFIG_TDLS
  162583. +
  162584. + rtw_free_cmd_priv(&padapter->cmdpriv);
  162585. +
  162586. + rtw_free_evt_priv(&padapter->evtpriv);
  162587. +
  162588. + rtw_free_mlme_priv(&padapter->mlmepriv);
  162589. +
  162590. + //free_io_queue(padapter);
  162591. +
  162592. + _rtw_free_xmit_priv(&padapter->xmitpriv);
  162593. +
  162594. + _rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here
  162595. +
  162596. + _rtw_free_recv_priv(&padapter->recvpriv);
  162597. +
  162598. + rtw_free_pwrctrl_priv(padapter);
  162599. +
  162600. + //rtw_mfree((void *)padapter, sizeof (padapter));
  162601. +
  162602. +#ifdef CONFIG_DRVEXT_MODULE
  162603. + free_drvext(&padapter->drvextpriv);
  162604. +#endif
  162605. +
  162606. + rtw_hal_free_data(padapter);
  162607. +
  162608. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("<==rtw_free_drv_sw\n"));
  162609. +
  162610. + //free the old_pnetdev
  162611. + if(padapter->rereg_nd_name_priv.old_pnetdev) {
  162612. + free_netdev(padapter->rereg_nd_name_priv.old_pnetdev);
  162613. + padapter->rereg_nd_name_priv.old_pnetdev = NULL;
  162614. + }
  162615. +
  162616. + // clear pbuddy_adapter to avoid access wrong pointer.
  162617. + if(padapter->pbuddy_adapter != NULL)
  162618. + {
  162619. + padapter->pbuddy_adapter->pbuddy_adapter = NULL;
  162620. + }
  162621. +
  162622. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_free_drv_sw\n"));
  162623. +
  162624. + return _SUCCESS;
  162625. +
  162626. +}
  162627. +
  162628. +#ifdef CONFIG_CONCURRENT_MODE
  162629. +
  162630. +#ifdef CONFIG_USB_HCI
  162631. + #include <usb_hal.h>
  162632. +#endif
  162633. +
  162634. +#ifdef CONFIG_MULTI_VIR_IFACES
  162635. +int _netdev_vir_if_open(struct net_device *pnetdev)
  162636. +{
  162637. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  162638. + _adapter *primary_padapter = GET_PRIMARY_ADAPTER(padapter);
  162639. +
  162640. + DBG_871X(FUNC_NDEV_FMT" enter\n", FUNC_NDEV_ARG(pnetdev));
  162641. +
  162642. + if(!primary_padapter)
  162643. + goto _netdev_virtual_iface_open_error;
  162644. +
  162645. + if(primary_padapter->bup == _FALSE || primary_padapter->hw_init_completed == _FALSE)
  162646. + {
  162647. + _netdev_open(primary_padapter->pnetdev);
  162648. + }
  162649. +
  162650. + if(padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&
  162651. + primary_padapter->hw_init_completed == _TRUE)
  162652. + {
  162653. + int i;
  162654. +
  162655. + padapter->bDriverStopped = _FALSE;
  162656. + padapter->bSurpriseRemoved = _FALSE;
  162657. + padapter->bCardDisableWOHSM = _FALSE;
  162658. +
  162659. + _rtw_memcpy(padapter->HalData, primary_padapter->HalData, padapter->hal_data_sz);
  162660. +
  162661. + padapter->bFWReady = primary_padapter->bFWReady;
  162662. +
  162663. + if(rtw_start_drv_threads(padapter) == _FAIL)
  162664. + {
  162665. + goto _netdev_virtual_iface_open_error;
  162666. + }
  162667. +
  162668. + padapter->dir_dev = NULL;
  162669. + rtw_proc_init_one(pnetdev);
  162670. +
  162671. +#ifdef CONFIG_IOCTL_CFG80211
  162672. + rtw_cfg80211_init_wiphy(padapter);
  162673. +#endif
  162674. +
  162675. + padapter->bup = _TRUE;
  162676. + padapter->hw_init_completed = _TRUE;
  162677. +
  162678. + rtw_start_mbssid_cam(padapter);//start mbssid_cam after bup = _TRUE & hw_init_completed = _TRUE
  162679. +
  162680. + }
  162681. +
  162682. + padapter->net_closed = _FALSE;
  162683. +
  162684. + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
  162685. +
  162686. + if(!rtw_netif_queue_stopped(pnetdev))
  162687. + rtw_netif_start_queue(pnetdev);
  162688. + else
  162689. + rtw_netif_wake_queue(pnetdev);
  162690. +
  162691. +
  162692. + DBG_871X(FUNC_NDEV_FMT" exit\n", FUNC_NDEV_ARG(pnetdev));
  162693. + return 0;
  162694. +
  162695. +_netdev_virtual_iface_open_error:
  162696. +
  162697. + padapter->bup = _FALSE;
  162698. +
  162699. + netif_carrier_off(pnetdev);
  162700. + rtw_netif_stop_queue(pnetdev);
  162701. +
  162702. + return (-1);
  162703. +
  162704. +}
  162705. +
  162706. +int netdev_vir_if_open(struct net_device *pnetdev)
  162707. +{
  162708. + int ret;
  162709. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  162710. +
  162711. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  162712. + ret = _netdev_vir_if_open(pnetdev);
  162713. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  162714. + return ret;
  162715. +}
  162716. +
  162717. +static int netdev_vir_if_close(struct net_device *pnetdev)
  162718. +{
  162719. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  162720. +
  162721. + padapter->net_closed = _TRUE;
  162722. +
  162723. + if(pnetdev)
  162724. + {
  162725. + if (!rtw_netif_queue_stopped(pnetdev))
  162726. + rtw_netif_stop_queue(pnetdev);
  162727. + }
  162728. +
  162729. +#ifdef CONFIG_IOCTL_CFG80211
  162730. + rtw_scan_abort(padapter);
  162731. + wdev_to_priv(padapter->rtw_wdev)->bandroid_scan = _FALSE;
  162732. +#endif
  162733. +
  162734. + return 0;
  162735. +}
  162736. +
  162737. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  162738. +static const struct net_device_ops rtw_netdev_vir_if_ops = {
  162739. + .ndo_open = netdev_vir_if_open,
  162740. + .ndo_stop = netdev_vir_if_close,
  162741. + .ndo_start_xmit = rtw_xmit_entry,
  162742. + .ndo_set_mac_address = rtw_net_set_mac_address,
  162743. + .ndo_get_stats = rtw_net_get_stats,
  162744. + .ndo_do_ioctl = rtw_ioctl,
  162745. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  162746. + .ndo_select_queue = rtw_select_queue,
  162747. +#endif
  162748. +};
  162749. +#endif
  162750. +
  162751. +_adapter *rtw_drv_add_vir_if(_adapter *primary_padapter, void (*set_intf_ops)(struct _io_ops *pops))
  162752. +{
  162753. +
  162754. + int res = _FAIL;
  162755. + struct net_device *pnetdev=NULL;
  162756. + _adapter *padapter = NULL;
  162757. + struct dvobj_priv *pdvobjpriv;
  162758. + u8 mac[ETH_ALEN];
  162759. +
  162760. +/*
  162761. + if((primary_padapter->bup == _FALSE) ||
  162762. + (rtw_buddy_adapter_up(primary_padapter) == _FALSE))
  162763. + {
  162764. + goto error_rtw_drv_add_iface;
  162765. + }
  162766. +
  162767. +*/
  162768. + /****** init netdev ******/
  162769. + pnetdev = rtw_init_netdev(NULL);
  162770. + if (!pnetdev)
  162771. + goto error_rtw_drv_add_iface;
  162772. +
  162773. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  162774. + DBG_871X("register rtw_netdev_virtual_iface_ops to netdev_ops\n");
  162775. + pnetdev->netdev_ops = &rtw_netdev_vir_if_ops;
  162776. +#else
  162777. + pnetdev->open = netdev_vir_if_open;
  162778. + pnetdev->stop = netdev_vir_if_close;
  162779. +#endif
  162780. +
  162781. +#ifdef CONFIG_NO_WIRELESS_HANDLERS
  162782. + pnetdev->wireless_handlers = NULL;
  162783. +#endif
  162784. +
  162785. + /****** init adapter ******/
  162786. + padapter = rtw_netdev_priv(pnetdev);
  162787. + _rtw_memcpy(padapter, primary_padapter, sizeof(_adapter));
  162788. +
  162789. + //
  162790. + padapter->bup = _FALSE;
  162791. + padapter->net_closed = _TRUE;
  162792. + padapter->hw_init_completed = _FALSE;
  162793. +
  162794. +
  162795. + //set adapter_type/iface type
  162796. + padapter->isprimary = _FALSE;
  162797. + padapter->adapter_type = MAX_ADAPTER;
  162798. + padapter->pbuddy_adapter = primary_padapter;
  162799. +#if 0
  162800. +#ifndef CONFIG_HWPORT_SWAP //Port0 -> Pri , Port1 -> Sec
  162801. + padapter->iface_type = IFACE_PORT1;
  162802. +#else
  162803. + padapter->iface_type = IFACE_PORT0;
  162804. +#endif //CONFIG_HWPORT_SWAP
  162805. +#else
  162806. + //extended virtual interfaces always are set to port0
  162807. + padapter->iface_type = IFACE_PORT0;
  162808. +#endif
  162809. + //
  162810. + padapter->pnetdev = pnetdev;
  162811. +
  162812. + /****** setup dvobj ******/
  162813. + pdvobjpriv = adapter_to_dvobj(padapter);
  162814. + padapter->iface_id = pdvobjpriv->iface_nums;
  162815. + pdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;
  162816. +
  162817. + SET_NETDEV_DEV(pnetdev, dvobj_to_dev(pdvobjpriv));
  162818. +#ifdef CONFIG_IOCTL_CFG80211
  162819. + rtw_wdev_alloc(padapter, dvobj_to_dev(pdvobjpriv));
  162820. +#endif //CONFIG_IOCTL_CFG80211
  162821. +
  162822. + //set interface_type/chip_type/HardwareType
  162823. + padapter->interface_type = primary_padapter->interface_type;
  162824. + padapter->chip_type = primary_padapter->chip_type;
  162825. + padapter->HardwareType = primary_padapter->HardwareType;
  162826. +
  162827. + //set hal data & hal ops
  162828. +#if defined(CONFIG_RTL8192C)
  162829. + #if defined(CONFIG_PCI_HCI)
  162830. + rtl8192ce_set_hal_ops(padapter);
  162831. + #elif defined(CONFIG_USB_HCI)
  162832. + rtl8192cu_set_hal_ops(padapter);
  162833. + #endif
  162834. +#elif defined(CONFIG_RTL8192D)
  162835. + #if defined(CONFIG_PCI_HCI)
  162836. + rtl8192de_set_hal_ops(padapter);
  162837. + #elif defined(CONFIG_USB_HCI)
  162838. + rtl8192du_set_hal_ops(padapter);
  162839. + #endif
  162840. +#endif
  162841. +
  162842. + padapter->HalFunc.inirp_init = NULL;
  162843. + padapter->HalFunc.inirp_deinit = NULL;
  162844. + padapter->intf_start = NULL;
  162845. + padapter->intf_stop = NULL;
  162846. +
  162847. + //step init_io_priv
  162848. + if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {
  162849. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n"));
  162850. + }
  162851. +
  162852. + //step read_chip_version
  162853. + rtw_hal_read_chip_version(padapter);
  162854. +
  162855. + //step usb endpoint mapping
  162856. + rtw_hal_chip_configure(padapter);
  162857. +
  162858. +
  162859. + //init drv data
  162860. + if(rtw_init_drv_sw(padapter)!= _SUCCESS)
  162861. + goto error_rtw_drv_add_iface;
  162862. +
  162863. +
  162864. + //get mac address from primary_padapter
  162865. + _rtw_memcpy(mac, primary_padapter->eeprompriv.mac_addr, ETH_ALEN);
  162866. +
  162867. + if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
  162868. + (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) ||
  162869. + ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) &&
  162870. + (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0)))
  162871. + {
  162872. + mac[0] = 0x00;
  162873. + mac[1] = 0xe0;
  162874. + mac[2] = 0x4c;
  162875. + mac[3] = 0x87;
  162876. + mac[4] = 0x11;
  162877. + mac[5] = 0x22;
  162878. + }
  162879. + else
  162880. + {
  162881. + //If the BIT1 is 0, the address is universally administered.
  162882. + //If it is 1, the address is locally administered
  162883. +#if 1 //needs enable MBSSID CAM
  162884. + mac[0] |= BIT(1); // locally administered
  162885. + mac[0] |= (padapter->iface_id-1)<<4;
  162886. +#endif
  162887. + }
  162888. +
  162889. + _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN);
  162890. +
  162891. + padapter->dir_dev = NULL;
  162892. +
  162893. + res = _SUCCESS;
  162894. +
  162895. + return padapter;
  162896. +
  162897. +
  162898. +error_rtw_drv_add_iface:
  162899. +
  162900. + if(padapter)
  162901. + rtw_free_drv_sw(padapter);
  162902. +
  162903. + if (pnetdev)
  162904. + rtw_free_netdev(pnetdev);
  162905. +
  162906. + return NULL;
  162907. +
  162908. +}
  162909. +
  162910. +void rtw_drv_stop_vir_if(_adapter *padapter)
  162911. +{
  162912. + struct net_device *pnetdev=NULL;
  162913. +
  162914. + if (padapter == NULL)
  162915. + return;
  162916. +
  162917. + pnetdev = padapter->pnetdev;
  162918. +
  162919. + rtw_cancel_all_timer(padapter);
  162920. +
  162921. + if(padapter->bup == _TRUE)
  162922. + {
  162923. + padapter->bDriverStopped = _TRUE;
  162924. +
  162925. + #ifdef CONFIG_XMIT_ACK
  162926. + if (padapter->xmitpriv.ack_tx)
  162927. + rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
  162928. + #endif
  162929. +
  162930. + if(padapter->intf_stop)
  162931. + {
  162932. + padapter->intf_stop(padapter);
  162933. + }
  162934. +
  162935. + rtw_stop_drv_threads(padapter);
  162936. +
  162937. + padapter->bup = _FALSE;
  162938. + }
  162939. +}
  162940. +
  162941. +void rtw_drv_free_vir_if(_adapter *padapter)
  162942. +{
  162943. + struct net_device *pnetdev=NULL;
  162944. +
  162945. + if (padapter == NULL)
  162946. + return;
  162947. +
  162948. + padapter->pbuddy_adapter = NULL;
  162949. +
  162950. + pnetdev = padapter->pnetdev;
  162951. +
  162952. +#ifdef CONFIG_IOCTL_CFG80211
  162953. + rtw_wdev_free(padapter->rtw_wdev);
  162954. +#endif //CONFIG_IOCTL_CFG80211
  162955. +
  162956. + rtw_free_drv_sw(padapter);
  162957. +
  162958. + rtw_free_netdev(pnetdev);
  162959. +}
  162960. +
  162961. +void rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj)
  162962. +{
  162963. + int i;
  162964. + //struct dvobj_priv *dvobj = primary_padapter->dvobj;
  162965. +
  162966. + for(i=2;i<dvobj->iface_nums;i++)
  162967. + {
  162968. + rtw_drv_stop_vir_if(dvobj->padapters[i]);
  162969. + }
  162970. +}
  162971. +
  162972. +void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj)
  162973. +{
  162974. + int i;
  162975. + //struct dvobj_priv *dvobj = primary_padapter->dvobj;
  162976. +
  162977. + for(i=2;i<dvobj->iface_nums;i++)
  162978. + {
  162979. + rtw_drv_free_vir_if(dvobj->padapters[i]);
  162980. + }
  162981. +}
  162982. +
  162983. +void rtw_drv_del_vir_if(_adapter *padapter)
  162984. +{
  162985. + rtw_drv_stop_vir_if(padapter);
  162986. + rtw_drv_free_vir_if(padapter);
  162987. +}
  162988. +
  162989. +void rtw_drv_del_vir_ifaces(_adapter *primary_padapter)
  162990. +{
  162991. + int i;
  162992. + struct dvobj_priv *dvobj = primary_padapter->dvobj;
  162993. +
  162994. + for(i=2;i<dvobj->iface_nums;i++)
  162995. + {
  162996. + rtw_drv_del_vir_if(dvobj->padapters[i]);
  162997. + }
  162998. +}
  162999. +#endif //CONFIG_MULTI_VIR_IFACES
  163000. +
  163001. +int _netdev_if2_open(struct net_device *pnetdev)
  163002. +{
  163003. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163004. + _adapter *primary_padapter = padapter->pbuddy_adapter;
  163005. +
  163006. + DBG_871X("+871x_drv - if2_open, bup=%d\n", padapter->bup);
  163007. +
  163008. + if(primary_padapter->bup == _FALSE || primary_padapter->hw_init_completed == _FALSE)
  163009. + {
  163010. + _netdev_open(primary_padapter->pnetdev);
  163011. + }
  163012. +
  163013. + if(padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&
  163014. + primary_padapter->hw_init_completed == _TRUE)
  163015. + {
  163016. + int i;
  163017. +
  163018. + padapter->bDriverStopped = _FALSE;
  163019. + padapter->bSurpriseRemoved = _FALSE;
  163020. + padapter->bCardDisableWOHSM = _FALSE;
  163021. +
  163022. + _rtw_memcpy(padapter->HalData, primary_padapter->HalData, padapter->hal_data_sz);
  163023. +
  163024. + padapter->bFWReady = primary_padapter->bFWReady;
  163025. +
  163026. + rtw_hal_set_hwreg(padapter, HW_VAR_DM_INIT_PWDB, NULL);
  163027. +
  163028. + //if (init_mlme_ext_priv(padapter) == _FAIL)
  163029. + // goto netdev_if2_open_error;
  163030. +
  163031. +
  163032. + if(rtw_start_drv_threads(padapter) == _FAIL)
  163033. + {
  163034. + goto netdev_if2_open_error;
  163035. + }
  163036. +
  163037. +
  163038. + if(padapter->intf_start)
  163039. + {
  163040. + padapter->intf_start(padapter);
  163041. + }
  163042. +
  163043. +
  163044. + padapter->hw_init_completed = _TRUE;
  163045. +
  163046. + padapter->dir_dev = NULL;
  163047. + rtw_proc_init_one(pnetdev);
  163048. +
  163049. +
  163050. +#ifdef CONFIG_IOCTL_CFG80211
  163051. + rtw_cfg80211_init_wiphy(padapter);
  163052. +#endif
  163053. +
  163054. + padapter->bup = _TRUE;
  163055. +
  163056. + }
  163057. +
  163058. + padapter->net_closed = _FALSE;
  163059. +
  163060. + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
  163061. +
  163062. + if(!rtw_netif_queue_stopped(pnetdev))
  163063. + rtw_netif_start_queue(pnetdev);
  163064. + else
  163065. + rtw_netif_wake_queue(pnetdev);
  163066. +
  163067. + DBG_871X("-871x_drv - if2_open, bup=%d\n", padapter->bup);
  163068. + return 0;
  163069. +
  163070. +netdev_if2_open_error:
  163071. +
  163072. + padapter->bup = _FALSE;
  163073. +
  163074. + netif_carrier_off(pnetdev);
  163075. + rtw_netif_stop_queue(pnetdev);
  163076. +
  163077. + return (-1);
  163078. +
  163079. +}
  163080. +
  163081. +int netdev_if2_open(struct net_device *pnetdev)
  163082. +{
  163083. + int ret;
  163084. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163085. +
  163086. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  163087. + ret = _netdev_if2_open(pnetdev);
  163088. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  163089. + return ret;
  163090. +}
  163091. +
  163092. +static int netdev_if2_close(struct net_device *pnetdev)
  163093. +{
  163094. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163095. +
  163096. + padapter->net_closed = _TRUE;
  163097. +
  163098. + if(pnetdev)
  163099. + {
  163100. + if (!rtw_netif_queue_stopped(pnetdev))
  163101. + rtw_netif_stop_queue(pnetdev);
  163102. + }
  163103. +
  163104. +#ifdef CONFIG_IOCTL_CFG80211
  163105. + rtw_scan_abort(padapter);
  163106. + wdev_to_priv(padapter->rtw_wdev)->bandroid_scan = _FALSE;
  163107. +#endif
  163108. +
  163109. + return 0;
  163110. +}
  163111. +
  163112. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  163113. +static const struct net_device_ops rtw_netdev_if2_ops = {
  163114. + .ndo_open = netdev_if2_open,
  163115. + .ndo_stop = netdev_if2_close,
  163116. + .ndo_start_xmit = rtw_xmit_entry,
  163117. + .ndo_set_mac_address = rtw_net_set_mac_address,
  163118. + .ndo_get_stats = rtw_net_get_stats,
  163119. + .ndo_do_ioctl = rtw_ioctl,
  163120. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  163121. + .ndo_select_queue = rtw_select_queue,
  163122. +#endif
  163123. +};
  163124. +#endif
  163125. +
  163126. +_adapter *rtw_drv_if2_init(_adapter *primary_padapter, void (*set_intf_ops)(struct _io_ops *pops))
  163127. +{
  163128. + int res = _FAIL;
  163129. + struct net_device *pnetdev = NULL;
  163130. + _adapter *padapter = NULL;
  163131. + struct dvobj_priv *pdvobjpriv;
  163132. + u8 mac[ETH_ALEN];
  163133. +
  163134. + /****** init netdev ******/
  163135. + pnetdev = rtw_init_netdev(NULL);
  163136. + if (!pnetdev)
  163137. + goto error_rtw_drv_if2_init;
  163138. +
  163139. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
  163140. + DBG_871X("register rtw_netdev_if2_ops to netdev_ops\n");
  163141. + pnetdev->netdev_ops = &rtw_netdev_if2_ops;
  163142. +#else
  163143. + pnetdev->open = netdev_if2_open;
  163144. + pnetdev->stop = netdev_if2_close;
  163145. +#endif
  163146. +
  163147. +#ifdef CONFIG_NO_WIRELESS_HANDLERS
  163148. + pnetdev->wireless_handlers = NULL;
  163149. +#endif
  163150. +
  163151. + /****** init adapter ******/
  163152. + padapter = rtw_netdev_priv(pnetdev);
  163153. + _rtw_memcpy(padapter, primary_padapter, sizeof(_adapter));
  163154. +
  163155. + //
  163156. + padapter->bup = _FALSE;
  163157. + padapter->net_closed = _TRUE;
  163158. + padapter->hw_init_completed = _FALSE;
  163159. +
  163160. + //set adapter_type/iface type
  163161. + padapter->isprimary = _FALSE;
  163162. + padapter->adapter_type = SECONDARY_ADAPTER;
  163163. + padapter->pbuddy_adapter = primary_padapter;
  163164. + padapter->iface_id = IFACE_ID1;
  163165. +#ifndef CONFIG_HWPORT_SWAP //Port0 -> Pri , Port1 -> Sec
  163166. + padapter->iface_type = IFACE_PORT1;
  163167. +#else
  163168. + padapter->iface_type = IFACE_PORT0;
  163169. +#endif //CONFIG_HWPORT_SWAP
  163170. + //
  163171. + padapter->pnetdev = pnetdev;
  163172. +
  163173. + /****** setup dvobj ******/
  163174. + pdvobjpriv = adapter_to_dvobj(padapter);
  163175. + pdvobjpriv->if2 = padapter;
  163176. + pdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;
  163177. +
  163178. + SET_NETDEV_DEV(pnetdev, dvobj_to_dev(pdvobjpriv));
  163179. + #ifdef CONFIG_IOCTL_CFG80211
  163180. + rtw_wdev_alloc(padapter, dvobj_to_dev(pdvobjpriv));
  163181. + #endif //CONFIG_IOCTL_CFG80211
  163182. +
  163183. + //set interface_type/chip_type/HardwareType
  163184. + padapter->interface_type = primary_padapter->interface_type;
  163185. + padapter->chip_type = primary_padapter->chip_type;
  163186. + padapter->HardwareType = primary_padapter->HardwareType;
  163187. +
  163188. + //set hal data & hal ops
  163189. +#if defined(CONFIG_RTL8192C)
  163190. + #if defined(CONFIG_PCI_HCI)
  163191. + rtl8192ce_set_hal_ops(padapter);
  163192. + #elif defined(CONFIG_USB_HCI)
  163193. + rtl8192cu_set_hal_ops(padapter);
  163194. + #endif
  163195. +#elif defined(CONFIG_RTL8192D)
  163196. + #if defined(CONFIG_PCI_HCI)
  163197. + rtl8192de_set_hal_ops(padapter);
  163198. + #elif defined(CONFIG_USB_HCI)
  163199. + rtl8192du_set_hal_ops(padapter);
  163200. + #endif
  163201. +#endif
  163202. +
  163203. + padapter->HalFunc.inirp_init = NULL;
  163204. + padapter->HalFunc.inirp_deinit = NULL;
  163205. +
  163206. + //
  163207. + padapter->intf_start = primary_padapter->intf_start;
  163208. + padapter->intf_stop = primary_padapter->intf_stop;
  163209. +
  163210. + //step init_io_priv
  163211. + if ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {
  163212. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n"));
  163213. + }
  163214. +
  163215. + //step read_chip_version
  163216. + rtw_hal_read_chip_version(padapter);
  163217. +
  163218. + //step usb endpoint mapping
  163219. + rtw_hal_chip_configure(padapter);
  163220. +
  163221. +
  163222. + //init drv data
  163223. + if(rtw_init_drv_sw(padapter)!= _SUCCESS)
  163224. + goto error_rtw_drv_if2_init;
  163225. +
  163226. + //get mac address from primary_padapter
  163227. + _rtw_memcpy(mac, primary_padapter->eeprompriv.mac_addr, ETH_ALEN);
  163228. +
  163229. + if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
  163230. + (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) ||
  163231. + ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) &&
  163232. + (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0)))
  163233. + {
  163234. + mac[0] = 0x00;
  163235. + mac[1] = 0xe0;
  163236. + mac[2] = 0x4c;
  163237. + mac[3] = 0x87;
  163238. + mac[4] = 0x11;
  163239. + mac[5] = 0x22;
  163240. + }
  163241. + else
  163242. + {
  163243. + //If the BIT1 is 0, the address is universally administered.
  163244. + //If it is 1, the address is locally administered
  163245. + mac[0] |= BIT(1); // locally administered
  163246. +
  163247. + }
  163248. +
  163249. + _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN);
  163250. + rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr);
  163251. +
  163252. + primary_padapter->pbuddy_adapter = padapter;
  163253. +
  163254. + padapter->dir_dev = NULL;
  163255. +
  163256. + res = _SUCCESS;
  163257. +
  163258. + return padapter;
  163259. +
  163260. +
  163261. +error_rtw_drv_if2_init:
  163262. +
  163263. + if(padapter)
  163264. + rtw_free_drv_sw(padapter);
  163265. +
  163266. + if (pnetdev)
  163267. + rtw_free_netdev(pnetdev);
  163268. +
  163269. + return NULL;
  163270. +
  163271. +}
  163272. +
  163273. +void rtw_drv_if2_free(_adapter *if2)
  163274. +{
  163275. + _adapter *padapter = if2;
  163276. + struct net_device *pnetdev = NULL;
  163277. +
  163278. + if (padapter == NULL)
  163279. + return;
  163280. +
  163281. + pnetdev = padapter->pnetdev;
  163282. +
  163283. +#ifdef CONFIG_IOCTL_CFG80211
  163284. + rtw_wdev_free(padapter->rtw_wdev);
  163285. +#endif /* CONFIG_IOCTL_CFG80211 */
  163286. +
  163287. +
  163288. + rtw_free_drv_sw(padapter);
  163289. +
  163290. + rtw_free_netdev(pnetdev);
  163291. +
  163292. +}
  163293. +
  163294. +void rtw_drv_if2_stop(_adapter *if2)
  163295. +{
  163296. + _adapter *padapter = if2;
  163297. +
  163298. + if (padapter == NULL)
  163299. + return;
  163300. +
  163301. + rtw_cancel_all_timer(padapter);
  163302. +
  163303. + if (padapter->bup == _TRUE) {
  163304. + padapter->bDriverStopped = _TRUE;
  163305. + #ifdef CONFIG_XMIT_ACK
  163306. + if (padapter->xmitpriv.ack_tx)
  163307. + rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
  163308. + #endif
  163309. +
  163310. + if(padapter->intf_stop)
  163311. + {
  163312. + padapter->intf_stop(padapter);
  163313. + }
  163314. +
  163315. + rtw_stop_drv_threads(padapter);
  163316. +
  163317. + padapter->bup = _FALSE;
  163318. + }
  163319. +}
  163320. +#endif //end of CONFIG_CONCURRENT_MODE
  163321. +
  163322. +#ifdef CONFIG_BR_EXT
  163323. +void netdev_br_init(struct net_device *netdev)
  163324. +{
  163325. + _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
  163326. +
  163327. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  163328. + rcu_read_lock();
  163329. +#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  163330. +
  163331. + //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
  163332. + {
  163333. + //struct net_bridge *br = netdev->br_port->br;//->dev->dev_addr;
  163334. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  163335. + if (netdev->br_port)
  163336. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  163337. + if (rcu_dereference(adapter->pnetdev->rx_handler_data))
  163338. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  163339. + {
  163340. + struct net_device *br_netdev;
  163341. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  163342. + br_netdev = dev_get_by_name(CONFIG_BR_EXT_BRNAME);
  163343. +#else // (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  163344. + struct net *devnet = NULL;
  163345. +
  163346. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  163347. + devnet = netdev->nd_net;
  163348. +#else // (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  163349. + devnet = dev_net(netdev);
  163350. +#endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
  163351. +
  163352. + br_netdev = dev_get_by_name(devnet, CONFIG_BR_EXT_BRNAME);
  163353. +#endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  163354. +
  163355. + if (br_netdev) {
  163356. + memcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);
  163357. + dev_put(br_netdev);
  163358. + } else
  163359. + printk("%s()-%d: dev_get_by_name(%s) failed!", __FUNCTION__, __LINE__, CONFIG_BR_EXT_BRNAME);
  163360. + }
  163361. +
  163362. + adapter->ethBrExtInfo.addPPPoETag = 1;
  163363. + }
  163364. +
  163365. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  163366. + rcu_read_unlock();
  163367. +#endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))
  163368. +}
  163369. +#endif //CONFIG_BR_EXT
  163370. +
  163371. +static int _rtw_drv_register_netdev(_adapter *padapter, char *name)
  163372. +{
  163373. + int ret = _SUCCESS;
  163374. + struct net_device *pnetdev = padapter->pnetdev;
  163375. +
  163376. + /* alloc netdev name */
  163377. + rtw_init_netdev_name(pnetdev, name);
  163378. +
  163379. + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
  163380. +
  163381. + /* Tell the network stack we exist */
  163382. + if (register_netdev(pnetdev) != 0) {
  163383. + DBG_871X(FUNC_NDEV_FMT "Failed!\n", FUNC_NDEV_ARG(pnetdev));
  163384. + ret = _FAIL;
  163385. + goto error_register_netdev;
  163386. + }
  163387. +
  163388. + DBG_871X("%s, MAC Address (if%d) = " MAC_FMT "\n", __FUNCTION__, (padapter->iface_id+1), MAC_ARG(pnetdev->dev_addr));
  163389. +
  163390. + return ret;
  163391. +
  163392. +error_register_netdev:
  163393. +
  163394. + if(padapter->iface_id > IFACE_ID0)
  163395. + {
  163396. + rtw_free_drv_sw(padapter);
  163397. +
  163398. + rtw_free_netdev(pnetdev);
  163399. + }
  163400. +
  163401. + return ret;
  163402. +}
  163403. +
  163404. +int rtw_drv_register_netdev(_adapter *if1)
  163405. +{
  163406. + int i, status = _SUCCESS;
  163407. + struct dvobj_priv *dvobj = if1->dvobj;
  163408. +
  163409. + if(dvobj->iface_nums < IFACE_ID_MAX)
  163410. + {
  163411. + for(i=0; i<dvobj->iface_nums; i++)
  163412. + {
  163413. + _adapter *padapter = dvobj->padapters[i];
  163414. +
  163415. + if(padapter)
  163416. + {
  163417. + char *name;
  163418. +
  163419. + if(padapter->iface_id == IFACE_ID0)
  163420. + name = if1->registrypriv.ifname;
  163421. + else if(padapter->iface_id == IFACE_ID1)
  163422. + name = if1->registrypriv.if2name;
  163423. + else
  163424. + name = "wlan%d";
  163425. +
  163426. + if((status = _rtw_drv_register_netdev(padapter, name)) != _SUCCESS) {
  163427. + break;
  163428. + }
  163429. + }
  163430. + }
  163431. + }
  163432. +
  163433. + return status;
  163434. +}
  163435. +
  163436. +int _netdev_open(struct net_device *pnetdev)
  163437. +{
  163438. + uint status;
  163439. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163440. + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
  163441. +
  163442. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n"));
  163443. + DBG_871X("+871x_drv - drv_open, bup=%d\n", padapter->bup);
  163444. +
  163445. + if(pwrctrlpriv->ps_flag == _TRUE){
  163446. + padapter->net_closed = _FALSE;
  163447. + goto netdev_open_normal_process;
  163448. + }
  163449. +
  163450. + if(padapter->bup == _FALSE)
  163451. + {
  163452. + padapter->bDriverStopped = _FALSE;
  163453. + padapter->bSurpriseRemoved = _FALSE;
  163454. + padapter->bCardDisableWOHSM = _FALSE;
  163455. +
  163456. + status = rtw_hal_init(padapter);
  163457. + if (status ==_FAIL)
  163458. + {
  163459. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("rtl871x_hal_init(): Can't init h/w!\n"));
  163460. + goto netdev_open_error;
  163461. + }
  163462. +
  163463. + DBG_871X("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));
  163464. +
  163465. +
  163466. + status=rtw_start_drv_threads(padapter);
  163467. + if(status ==_FAIL)
  163468. + {
  163469. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n"));
  163470. + goto netdev_open_error;
  163471. + }
  163472. +
  163473. +#ifdef CONFIG_DRVEXT_MODULE
  163474. + init_drvext(padapter);
  163475. +#endif
  163476. +
  163477. + if(padapter->intf_start)
  163478. + {
  163479. + padapter->intf_start(padapter);
  163480. + }
  163481. +
  163482. +#ifndef RTK_DMP_PLATFORM
  163483. + rtw_proc_init_one(pnetdev);
  163484. +#endif
  163485. +
  163486. +#ifdef CONFIG_IOCTL_CFG80211
  163487. + rtw_cfg80211_init_wiphy(padapter);
  163488. +#endif
  163489. +
  163490. + rtw_led_control(padapter, LED_CTL_NO_LINK);
  163491. +
  163492. + padapter->bup = _TRUE;
  163493. + }
  163494. + padapter->net_closed = _FALSE;
  163495. +
  163496. + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
  163497. +
  163498. + padapter->pwrctrlpriv.bips_processing = _FALSE;
  163499. + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
  163500. +
  163501. + //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success
  163502. + if(!rtw_netif_queue_stopped(pnetdev))
  163503. + rtw_netif_start_queue(pnetdev);
  163504. + else
  163505. + rtw_netif_wake_queue(pnetdev);
  163506. +
  163507. +#ifdef CONFIG_BR_EXT
  163508. + netdev_br_init(pnetdev);
  163509. +#endif // CONFIG_BR_EXT
  163510. +
  163511. +netdev_open_normal_process:
  163512. +
  163513. + #ifdef CONFIG_CONCURRENT_MODE
  163514. + {
  163515. + _adapter *sec_adapter = padapter->pbuddy_adapter;
  163516. + if(sec_adapter && (sec_adapter->bup == _FALSE || sec_adapter->hw_init_completed == _FALSE))
  163517. + _netdev_if2_open(sec_adapter->pnetdev);
  163518. + }
  163519. + #endif
  163520. +
  163521. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - dev_open\n"));
  163522. + DBG_871X("-871x_drv - drv_open, bup=%d\n", padapter->bup);
  163523. +
  163524. + return 0;
  163525. +
  163526. +netdev_open_error:
  163527. +
  163528. + padapter->bup = _FALSE;
  163529. +
  163530. + netif_carrier_off(pnetdev);
  163531. + rtw_netif_stop_queue(pnetdev);
  163532. +
  163533. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("-871x_drv - dev_open, fail!\n"));
  163534. + DBG_871X("-871x_drv - drv_open fail, bup=%d\n", padapter->bup);
  163535. +
  163536. + return (-1);
  163537. +
  163538. +}
  163539. +
  163540. +int netdev_open(struct net_device *pnetdev)
  163541. +{
  163542. + int ret;
  163543. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163544. +
  163545. + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  163546. + ret = _netdev_open(pnetdev);
  163547. + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
  163548. +
  163549. + return ret;
  163550. +}
  163551. +
  163552. +#ifdef CONFIG_IPS
  163553. +int ips_netdrv_open(_adapter *padapter)
  163554. +{
  163555. + int status = _SUCCESS;
  163556. + padapter->net_closed = _FALSE;
  163557. + DBG_871X("===> %s.........\n",__FUNCTION__);
  163558. +
  163559. +
  163560. + padapter->bDriverStopped = _FALSE;
  163561. + padapter->bCardDisableWOHSM = _FALSE;
  163562. + //padapter->bup = _TRUE;
  163563. +
  163564. + status = rtw_hal_init(padapter);
  163565. + if (status ==_FAIL)
  163566. + {
  163567. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("ips_netdrv_open(): Can't init h/w!\n"));
  163568. + goto netdev_open_error;
  163569. + }
  163570. +
  163571. + if(padapter->intf_start)
  163572. + {
  163573. + padapter->intf_start(padapter);
  163574. + }
  163575. +
  163576. + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv);
  163577. + _set_timer(&padapter->mlmepriv.dynamic_chk_timer,5000);
  163578. +
  163579. + return _SUCCESS;
  163580. +
  163581. +netdev_open_error:
  163582. + //padapter->bup = _FALSE;
  163583. + DBG_871X("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup);
  163584. +
  163585. + return _FAIL;
  163586. +}
  163587. +
  163588. +
  163589. +int rtw_ips_pwr_up(_adapter *padapter)
  163590. +{
  163591. + int result;
  163592. + u32 start_time = rtw_get_current_time();
  163593. + DBG_871X("===> rtw_ips_pwr_up..............\n");
  163594. + rtw_reset_drv_sw(padapter);
  163595. +
  163596. + result = ips_netdrv_open(padapter);
  163597. +
  163598. + rtw_led_control(padapter, LED_CTL_NO_LINK);
  163599. +
  163600. + DBG_871X("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time));
  163601. + return result;
  163602. +
  163603. +}
  163604. +
  163605. +void rtw_ips_pwr_down(_adapter *padapter)
  163606. +{
  163607. + u32 start_time = rtw_get_current_time();
  163608. + DBG_871X("===> rtw_ips_pwr_down...................\n");
  163609. +
  163610. + padapter->bCardDisableWOHSM = _TRUE;
  163611. + padapter->net_closed = _TRUE;
  163612. +
  163613. + rtw_led_control(padapter, LED_CTL_POWER_OFF);
  163614. +
  163615. + rtw_ips_dev_unload(padapter);
  163616. + padapter->bCardDisableWOHSM = _FALSE;
  163617. + DBG_871X("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time));
  163618. +}
  163619. +#endif
  163620. +void rtw_ips_dev_unload(_adapter *padapter)
  163621. +{
  163622. + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;
  163623. + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  163624. + DBG_871X("====> %s...\n",__FUNCTION__);
  163625. +
  163626. + rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);
  163627. +
  163628. + if(padapter->intf_stop)
  163629. + {
  163630. + padapter->intf_stop(padapter);
  163631. + }
  163632. +
  163633. + //s5.
  163634. + if(padapter->bSurpriseRemoved == _FALSE)
  163635. + {
  163636. + rtw_hal_deinit(padapter);
  163637. + }
  163638. +
  163639. +}
  163640. +
  163641. +int pm_netdev_open(struct net_device *pnetdev,u8 bnormal)
  163642. +{
  163643. + int status;
  163644. + if(bnormal)
  163645. + status = netdev_open(pnetdev);
  163646. +#ifdef CONFIG_IPS
  163647. + else
  163648. + status = (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1);
  163649. +#endif
  163650. +
  163651. + return status;
  163652. +}
  163653. +
  163654. +static int netdev_close(struct net_device *pnetdev)
  163655. +{
  163656. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  163657. +
  163658. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n"));
  163659. +
  163660. + if(padapter->pwrctrlpriv.bInternalAutoSuspend == _TRUE)
  163661. + {
  163662. + //rtw_pwr_wakeup(padapter);
  163663. + if(padapter->pwrctrlpriv.rf_pwrstate == rf_off)
  163664. + padapter->pwrctrlpriv.ps_flag = _TRUE;
  163665. + }
  163666. + padapter->net_closed = _TRUE;
  163667. +
  163668. +/* if(!padapter->hw_init_completed)
  163669. + {
  163670. + DBG_871X("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed);
  163671. +
  163672. + padapter->bDriverStopped = _TRUE;
  163673. +
  163674. + rtw_dev_unload(padapter);
  163675. + }
  163676. + else*/
  163677. + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on){
  163678. + DBG_871X("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed);
  163679. +
  163680. + //s1.
  163681. + if(pnetdev)
  163682. + {
  163683. + if (!rtw_netif_queue_stopped(pnetdev))
  163684. + rtw_netif_stop_queue(pnetdev);
  163685. + }
  163686. +
  163687. +#ifndef CONFIG_ANDROID
  163688. + //s2.
  163689. + LeaveAllPowerSaveMode(padapter);
  163690. + rtw_disassoc_cmd(padapter, 500, _FALSE);
  163691. + //s2-2. indicate disconnect to os
  163692. + rtw_indicate_disconnect(padapter);
  163693. + //s2-3.
  163694. + rtw_free_assoc_resources(padapter, 1);
  163695. + //s2-4.
  163696. + rtw_free_network_queue(padapter,_TRUE);
  163697. +#endif
  163698. + // Close LED
  163699. + rtw_led_control(padapter, LED_CTL_POWER_OFF);
  163700. + }
  163701. +
  163702. +#ifdef CONFIG_BR_EXT
  163703. + //if (OPMODE & (WIFI_STATION_STATE | WIFI_ADHOC_STATE))
  163704. + {
  163705. + //void nat25_db_cleanup(_adapter *priv);
  163706. + nat25_db_cleanup(padapter);
  163707. + }
  163708. +#endif // CONFIG_BR_EXT
  163709. +
  163710. +#ifdef CONFIG_P2P
  163711. +#ifdef CONFIG_IOCTL_CFG80211
  163712. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  163713. + {
  163714. + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _TRUE)
  163715. + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _FALSE;
  163716. + }
  163717. +#endif //CONFIG_IOCTL_CFG80211
  163718. + rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
  163719. +#endif //CONFIG_P2P
  163720. +
  163721. +#ifdef CONFIG_IOCTL_CFG80211
  163722. + rtw_scan_abort(padapter);
  163723. + wdev_to_priv(padapter->rtw_wdev)->bandroid_scan = _FALSE;
  163724. + padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; //set this at the end
  163725. +#endif //CONFIG_IOCTL_CFG80211
  163726. +
  163727. + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - drv_close\n"));
  163728. + DBG_871X("-871x_drv - drv_close, bup=%d\n", padapter->bup);
  163729. +
  163730. + return 0;
  163731. +}
  163732. +
  163733. +void rtw_ndev_destructor(struct net_device *ndev)
  163734. +{
  163735. + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
  163736. +
  163737. +#ifdef CONFIG_IOCTL_CFG80211
  163738. + if (ndev->ieee80211_ptr)
  163739. + rtw_mfree((u8 *)ndev->ieee80211_ptr, sizeof(struct wireless_dev));
  163740. +#endif
  163741. + free_netdev(ndev);
  163742. +}
  163743. --- /dev/null
  163744. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c
  163745. @@ -0,0 +1,1996 @@
  163746. +/******************************************************************************
  163747. + *
  163748. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  163749. + *
  163750. + * This program is free software; you can redistribute it and/or modify it
  163751. + * under the terms of version 2 of the GNU General Public License as
  163752. + * published by the Free Software Foundation.
  163753. + *
  163754. + * This program is distributed in the hope that it will be useful, but WITHOUT
  163755. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  163756. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  163757. + * more details.
  163758. + *
  163759. + * You should have received a copy of the GNU General Public License along with
  163760. + * this program; if not, write to the Free Software Foundation, Inc.,
  163761. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  163762. + *
  163763. + *
  163764. + ******************************************************************************/
  163765. +#define _HCI_INTF_C_
  163766. +
  163767. +#include <drv_conf.h>
  163768. +#include <osdep_service.h>
  163769. +#include <drv_types.h>
  163770. +#include <recv_osdep.h>
  163771. +#include <xmit_osdep.h>
  163772. +#include <hal_intf.h>
  163773. +#include <rtw_version.h>
  163774. +
  163775. +#ifndef CONFIG_PCI_HCI
  163776. +
  163777. +#error "CONFIG_PCI_HCI shall be on!\n"
  163778. +
  163779. +#endif
  163780. +
  163781. +#include <pci_ops.h>
  163782. +#include <pci_osintf.h>
  163783. +#include <pci_hal.h>
  163784. +
  163785. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  163786. +
  163787. +#error "Shall be Linux or Windows, but not both!\n"
  163788. +
  163789. +#endif
  163790. +
  163791. +#ifdef CONFIG_80211N_HT
  163792. +extern int rtw_ht_enable;
  163793. +extern int rtw_cbw40_enable;
  163794. +extern int rtw_ampdu_enable;//for enable tx_ampdu
  163795. +#endif
  163796. +
  163797. +#ifdef CONFIG_PM
  163798. +extern int pm_netdev_open(struct net_device *pnetdev);
  163799. +static int rtw_suspend(struct pci_dev *pdev, pm_message_t state);
  163800. +static int rtw_resume(struct pci_dev *pdev);
  163801. +#endif
  163802. +
  163803. +
  163804. +static int rtw_drv_init(struct pci_dev *pdev, const struct pci_device_id *pdid);
  163805. +static void rtw_dev_remove(struct pci_dev *pdev);
  163806. +
  163807. +static struct specific_device_id specific_device_id_tbl[] = {
  163808. + {.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT},
  163809. + {.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT},
  163810. + {}
  163811. +};
  163812. +
  163813. +struct pci_device_id rtw_pci_id_tbl[] = {
  163814. +#ifdef CONFIG_RTL8192C
  163815. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x8191)},
  163816. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x8178)},
  163817. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x8177)},
  163818. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x8176)},
  163819. +#endif
  163820. +#ifdef CONFIG_RTL8192D
  163821. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x8193)},
  163822. + {PCI_DEVICE(PCI_VENDER_ID_REALTEK, 0x002B)},
  163823. +#endif
  163824. + {},
  163825. +};
  163826. +
  163827. +struct pci_drv_priv {
  163828. + struct pci_driver rtw_pci_drv;
  163829. + int drv_registered;
  163830. +};
  163831. +
  163832. +
  163833. +static struct pci_drv_priv pci_drvpriv = {
  163834. + .rtw_pci_drv.name = (char*)DRV_NAME,
  163835. + .rtw_pci_drv.probe = rtw_drv_init,
  163836. + .rtw_pci_drv.remove = rtw_dev_remove,
  163837. + .rtw_pci_drv.id_table = rtw_pci_id_tbl,
  163838. +#ifdef CONFIG_PM
  163839. + .rtw_pci_drv.suspend = rtw_suspend,
  163840. + .rtw_pci_drv.resume = rtw_resume,
  163841. +#else
  163842. + .rtw_pci_drv.suspend = NULL,
  163843. + .rtw_pci_drv.resume = NULL,
  163844. +#endif
  163845. +};
  163846. +
  163847. +
  163848. +MODULE_DEVICE_TABLE(pci, rtw_pci_id_tbl);
  163849. +
  163850. +
  163851. +static u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
  163852. + INTEL_VENDOR_ID,
  163853. + ATI_VENDOR_ID,
  163854. + AMD_VENDOR_ID,
  163855. + SIS_VENDOR_ID
  163856. +};
  163857. +
  163858. +static u8 rtw_pci_platform_switch_device_pci_aspm(_adapter *padapter, u8 value)
  163859. +{
  163860. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  163861. + u8 bresult = _SUCCESS;
  163862. + int error;
  163863. +
  163864. + value |= 0x40;
  163865. +
  163866. + error = pci_write_config_byte(pdvobjpriv->ppcidev, 0x80, value);
  163867. +
  163868. + if(error != 0)
  163869. + {
  163870. + bresult = _FALSE;
  163871. + DBG_871X("rtw_pci_platform_switch_device_pci_aspm error (%d)\n",error);
  163872. + }
  163873. +
  163874. + return bresult;
  163875. +}
  163876. +
  163877. +//
  163878. +// When we set 0x01 to enable clk request. Set 0x0 to disable clk req.
  163879. +//
  163880. +static u8 rtw_pci_switch_clk_req(_adapter *padapter, u8 value)
  163881. +{
  163882. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  163883. + u8 buffer, bresult = _SUCCESS;
  163884. + int error;
  163885. +
  163886. + buffer = value;
  163887. +
  163888. + if(!padapter->hw_init_completed)
  163889. + return bresult;
  163890. +
  163891. + error = pci_write_config_byte(pdvobjpriv->ppcidev, 0x81, value);
  163892. +
  163893. + if(error != 0)
  163894. + {
  163895. + bresult = _FALSE;
  163896. + DBG_871X("rtw_pci_switch_clk_req error (%d)\n",error);
  163897. + }
  163898. +
  163899. + return bresult;
  163900. +}
  163901. +
  163902. +#if 0
  163903. +//Description:
  163904. +//Disable RTL8192SE ASPM & Disable Pci Bridge ASPM
  163905. +void rtw_pci_disable_aspm(_adapter *padapter)
  163906. +{
  163907. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  163908. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  163909. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  163910. + u32 pcicfg_addrport = 0;
  163911. + u8 num4bytes;
  163912. + u8 linkctrl_reg;
  163913. + u16 pcibridge_linkctrlreg, aspmlevel = 0;
  163914. +
  163915. + // When there exists anyone's busnum, devnum, and funcnum that are set to 0xff,
  163916. + // we do not execute any action and return.
  163917. + // if it is not intel bus then don't enable ASPM.
  163918. + if ((pcipriv->busnumber == 0xff
  163919. + && pcipriv->devnumber == 0xff
  163920. + && pcipriv->funcnumber == 0xff)
  163921. + || (pcipriv->pcibridge_busnum == 0xff
  163922. + && pcipriv->pcibridge_devnum == 0xff
  163923. + && pcipriv->pcibridge_funcnum == 0xff))
  163924. + {
  163925. + DBG_871X("PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
  163926. + return;
  163927. + }
  163928. +
  163929. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_UNKNOWN) {
  163930. + DBG_871X("%s(): Disable ASPM. Recognize the Bus of PCI(Bridge) as UNKNOWN.\n", __func__);
  163931. + }
  163932. +
  163933. + if (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) {
  163934. + RT_CLEAR_PS_LEVEL(pwrpriv, RT_RF_OFF_LEVL_CLK_REQ);
  163935. + rtw_pci_switch_clk_req(padapter, 0x0);
  163936. + }
  163937. +
  163938. + {
  163939. + // Suggested by SD1 for promising device will in L0 state after an I/O.
  163940. + u8 tmp_u1b;
  163941. +
  163942. + pci_read_config_byte(pdvobjpriv->ppcidev, 0x80, &tmp_u1b);
  163943. + }
  163944. +
  163945. + // Retrieve original configuration settings.
  163946. + linkctrl_reg = pcipriv->linkctrl_reg;
  163947. + pcibridge_linkctrlreg = pcipriv->pcibridge_linkctrlreg;
  163948. +
  163949. + // Set corresponding value.
  163950. + aspmlevel |= BIT(0) | BIT(1);
  163951. + linkctrl_reg &= ~aspmlevel;
  163952. + pcibridge_linkctrlreg &= ~(BIT(0) | BIT(1));
  163953. +
  163954. + rtw_pci_platform_switch_device_pci_aspm(padapter, linkctrl_reg);
  163955. + rtw_udelay_os(50);
  163956. +
  163957. + //When there exists anyone's busnum, devnum, and funcnum that are set to 0xff,
  163958. + // we do not execute any action and return.
  163959. + if ((pcipriv->busnumber == 0xff &&
  163960. + pcipriv->devnumber == 0xff &&
  163961. + pcipriv->funcnumber == 0xff) ||
  163962. + (pcipriv->pcibridge_busnum == 0xff &&
  163963. + pcipriv->pcibridge_devnum == 0xff
  163964. + && pcipriv->pcibridge_funcnum == 0xff))
  163965. + {
  163966. + //Do Nothing!!
  163967. + }
  163968. + else
  163969. + {
  163970. + //4 //Disable Pci Bridge ASPM
  163971. + pcicfg_addrport = (pcipriv->pcibridge_busnum << 16) |
  163972. + (pcipriv->pcibridge_devnum << 11) |
  163973. + (pcipriv->pcibridge_funcnum << 8) | (1 << 31);
  163974. + num4bytes = (pcipriv->pcibridge_pciehdr_offset + 0x10) / 4;
  163975. +
  163976. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  163977. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  163978. +
  163979. + // now grab data port with device|vendor 4 byte dword
  163980. + NdisRawWritePortUchar(PCI_CONF_DATA, pcibridge_linkctrlreg);
  163981. +
  163982. + DBG_871X("rtw_pci_disable_aspm():PciBridge busnumber[%x], DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
  163983. + pcipriv->pcibridge_busnum, pcipriv->pcibridge_devnum,
  163984. + pcipriv->pcibridge_funcnum,
  163985. + (pcipriv->pcibridge_pciehdr_offset+0x10), pcibridge_linkctrlreg);
  163986. +
  163987. + rtw_udelay_os(50);
  163988. + }
  163989. +}
  163990. +
  163991. +//[ASPM]
  163992. +//Description:
  163993. +// Enable RTL8192SE ASPM & Enable Pci Bridge ASPM for power saving
  163994. +// We should follow the sequence to enable RTL8192SE first then enable Pci Bridge ASPM
  163995. +// or the system will show bluescreen.
  163996. +void rtw_pci_enable_aspm(_adapter *padapter)
  163997. +{
  163998. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  163999. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  164000. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164001. + u16 aspmlevel = 0;
  164002. + u32 pcicfg_addrport = 0;
  164003. + u8 num4bytes;
  164004. + u8 u_pcibridge_aspmsetting = 0;
  164005. + u8 u_device_aspmsetting = 0;
  164006. +
  164007. + // When there exists anyone's busnum, devnum, and funcnum that are set to 0xff,
  164008. + // we do not execute any action and return.
  164009. + // if it is not intel bus then don't enable ASPM.
  164010. +
  164011. + if ((pcipriv->busnumber == 0xff
  164012. + && pcipriv->devnumber == 0xff
  164013. + && pcipriv->funcnumber == 0xff)
  164014. + || (pcipriv->pcibridge_busnum == 0xff
  164015. + && pcipriv->pcibridge_devnum == 0xff
  164016. + && pcipriv->pcibridge_funcnum == 0xff))
  164017. + {
  164018. + DBG_871X("PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
  164019. + return;
  164020. + }
  164021. +
  164022. + //4 Enable Pci Bridge ASPM
  164023. + pcicfg_addrport = (pcipriv->pcibridge_busnum << 16)
  164024. + | (pcipriv->pcibridge_devnum << 11)
  164025. + | (pcipriv->pcibridge_funcnum << 8) | (1 << 31);
  164026. + num4bytes = (pcipriv->pcibridge_pciehdr_offset + 0x10) / 4;
  164027. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164028. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  164029. + // now grab data port with device|vendor 4 byte dword
  164030. +
  164031. + u_pcibridge_aspmsetting = pcipriv->pcibridge_linkctrlreg | pdvobjpriv->const_hostpci_aspm_setting;
  164032. +
  164033. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL ||
  164034. + pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_SIS)
  164035. + u_pcibridge_aspmsetting &= ~BIT(0);
  164036. +
  164037. + NdisRawWritePortUchar(PCI_CONF_DATA, u_pcibridge_aspmsetting);
  164038. +
  164039. + DBG_871X("PlatformEnableASPM():PciBridge busnumber[%x], DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
  164040. + pcipriv->pcibridge_busnum,
  164041. + pcipriv->pcibridge_devnum,
  164042. + pcipriv->pcibridge_funcnum,
  164043. + (pcipriv->pcibridge_pciehdr_offset+0x10),
  164044. + u_pcibridge_aspmsetting);
  164045. +
  164046. + rtw_udelay_os(50);
  164047. +
  164048. + // Get ASPM level (with/without Clock Req)
  164049. + aspmlevel |= pdvobjpriv->const_devicepci_aspm_setting;
  164050. + u_device_aspmsetting = pcipriv->linkctrl_reg;
  164051. + u_device_aspmsetting |= aspmlevel;
  164052. +
  164053. + rtw_pci_platform_switch_device_pci_aspm(padapter, u_device_aspmsetting); //(priv->linkctrl_reg | ASPMLevel));
  164054. +
  164055. + if (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) {
  164056. + rtw_pci_switch_clk_req(padapter, (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0);
  164057. + RT_SET_PS_LEVEL(pwrpriv, RT_RF_OFF_LEVL_CLK_REQ);
  164058. + }
  164059. +
  164060. + rtw_udelay_os(50);
  164061. +}
  164062. +
  164063. +//
  164064. +//Description:
  164065. +//To get link control field by searching from PCIe capability lists.
  164066. +//
  164067. +static u8
  164068. +rtw_get_link_control_field(_adapter *padapter, u8 busnum, u8 devnum,
  164069. + u8 funcnum)
  164070. +{
  164071. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164072. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164073. + struct rt_pci_capabilities_header capability_hdr;
  164074. + u8 capability_offset, num4bytes;
  164075. + u32 pcicfg_addrport = 0;
  164076. + u8 linkctrl_reg;
  164077. + u8 status = _FALSE;
  164078. +
  164079. + //If busnum, devnum, funcnum are set to 0xff.
  164080. + if (busnum == 0xff && devnum == 0xff && funcnum == 0xff) {
  164081. + DBG_871X("GetLinkControlField(): Fail to find PCIe Capability\n");
  164082. + return _FALSE;
  164083. + }
  164084. +
  164085. + pcicfg_addrport = (busnum << 16) | (devnum << 11) | (funcnum << 8) | (1 << 31);
  164086. +
  164087. + //2PCIeCap
  164088. +
  164089. + // The device supports capability lists. Find the capabilities.
  164090. + num4bytes = 0x34 / 4;
  164091. + //get capability_offset
  164092. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164093. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  164094. + // now grab data port with device|vendor 4 byte dword
  164095. + NdisRawReadPortUchar(PCI_CONF_DATA, &capability_offset);
  164096. +
  164097. + // Loop through the capabilities in search of the power management capability.
  164098. + // The list is NULL-terminated, so the last offset will always be zero.
  164099. +
  164100. + while (capability_offset != 0) {
  164101. + // First find the number of 4 Byte.
  164102. + num4bytes = capability_offset / 4;
  164103. +
  164104. + // Read the header of the capability at this offset. If the retrieved capability is not
  164105. + // the power management capability that we are looking for, follow the link to the
  164106. + // next capability and continue looping.
  164107. +
  164108. + //4 get capability_hdr
  164109. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164110. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  164111. + // now grab data port with device|vendor 4 byte dword
  164112. + NdisRawReadPortUshort(PCI_CONF_DATA, (u16 *) & capability_hdr);
  164113. +
  164114. + // Found the PCI express capability
  164115. + if (capability_hdr.capability_id == PCI_CAPABILITY_ID_PCI_EXPRESS)
  164116. + {
  164117. + break;
  164118. + }
  164119. + else
  164120. + {
  164121. + // This is some other capability. Keep looking for the PCI express capability.
  164122. + capability_offset = capability_hdr.next;
  164123. + }
  164124. + }
  164125. +
  164126. + if (capability_hdr.capability_id == PCI_CAPABILITY_ID_PCI_EXPRESS) //
  164127. + {
  164128. + num4bytes = (capability_offset + 0x10) / 4;
  164129. +
  164130. + //4 Read Link Control Register
  164131. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164132. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  164133. + // now grab data port with device|vendor 4 byte dword
  164134. + NdisRawReadPortUchar(PCI_CONF_DATA, &linkctrl_reg);
  164135. +
  164136. + pcipriv->pcibridge_pciehdr_offset = capability_offset;
  164137. + pcipriv->pcibridge_linkctrlreg = linkctrl_reg;
  164138. +
  164139. + status = _TRUE;
  164140. + }
  164141. + else
  164142. + {
  164143. + // We didn't find a PCIe capability.
  164144. + DBG_871X("GetLinkControlField(): Cannot Find PCIe Capability\n");
  164145. + }
  164146. +
  164147. + return status;
  164148. +}
  164149. +
  164150. +//
  164151. +//Description:
  164152. +//To get PCI bus infomation and return busnum, devnum, and funcnum about
  164153. +//the bus(bridge) which the device binds.
  164154. +//
  164155. +static u8
  164156. +rtw_get_pci_bus_info(_adapter *padapter,
  164157. + u16 vendorid,
  164158. + u16 deviceid,
  164159. + u8 irql, u8 basecode, u8 subclass, u8 filed19val,
  164160. + u8 * busnum, u8 * devnum, u8 * funcnum)
  164161. +{
  164162. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164163. + struct pci_dev *pdev = pdvobjpriv->ppcidev;
  164164. + u8 busnum_idx, devicenum_idx, functionnum_idx;
  164165. + u32 pcicfg_addrport = 0;
  164166. + u32 dev_venid = 0, classcode, field19, headertype;
  164167. + u16 venId, devId;
  164168. + u8 basec, subc, irqline;
  164169. + u16 regoffset;
  164170. + u8 b_singlefunc = _FALSE;
  164171. + u8 b_bridgechk = _FALSE;
  164172. +
  164173. + *busnum = 0xFF;
  164174. + *devnum = 0xFF;
  164175. + *funcnum = 0xFF;
  164176. +
  164177. + //DBG_871X("==============>vendorid:%x,deviceid:%x,irql:%x\n", vendorid,deviceid,irql);
  164178. + if ((basecode == PCI_CLASS_BRIDGE_DEV) &&
  164179. + (subclass == PCI_SUBCLASS_BR_PCI_TO_PCI)
  164180. + && (filed19val == U1DONTCARE))
  164181. + b_bridgechk = _TRUE;
  164182. +
  164183. + // perform a complete pci bus scan operation
  164184. + for (busnum_idx = 0; busnum_idx < PCI_MAX_BRIDGE_NUMBER; busnum_idx++) //255
  164185. + {
  164186. + for (devicenum_idx = 0; devicenum_idx < PCI_MAX_DEVICES; devicenum_idx++) //32
  164187. + {
  164188. + b_singlefunc = _FALSE;
  164189. + for (functionnum_idx = 0; functionnum_idx < PCI_MAX_FUNCTION; functionnum_idx++) //8
  164190. + {
  164191. + //
  164192. + // <Roger_Notes> We have to skip redundant Bus scan to prevent unexpected system hang
  164193. + // if single function is present in this device.
  164194. + // 2009.02.26.
  164195. + //
  164196. + if (functionnum_idx == 0) {
  164197. + //4 get header type (DWORD #3)
  164198. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164199. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (3 << 2));
  164200. + NdisRawReadPortUlong(PCI_CONF_DATA, &headertype);
  164201. + headertype = ((headertype >> 16) & 0x0080) >> 7; // address 0x0e[7].
  164202. + if (headertype == 0) //Single function
  164203. + b_singlefunc = _TRUE;
  164204. + }
  164205. + else
  164206. + {//By pass the following scan process.
  164207. + if (b_singlefunc == _TRUE)
  164208. + break;
  164209. + }
  164210. +
  164211. + // Set access enable control.
  164212. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164213. +
  164214. + //4 // Get vendorid/ deviceid
  164215. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164216. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport);
  164217. + // now grab data port with device|vendor 4 byte dword
  164218. + NdisRawReadPortUlong(PCI_CONF_DATA, &dev_venid);
  164219. +
  164220. + // if data port is full of 1s, no device is present
  164221. + // some broken boards return 0 if a slot is empty:
  164222. + if (dev_venid == 0xFFFFFFFF || dev_venid == 0)
  164223. + continue; //PCI_INVALID_VENDORID
  164224. +
  164225. + // 4 // Get irql
  164226. + regoffset = 0x3C;
  164227. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31) | (regoffset & 0xFFFFFFFC);
  164228. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport);
  164229. + NdisRawReadPortUchar((PCI_CONF_DATA +(regoffset & 0x3)), &irqline);
  164230. +
  164231. + venId = (u16) (dev_venid >> 0) & 0xFFFF;
  164232. + devId = (u16) (dev_venid >> 16) & 0xFFFF;
  164233. +
  164234. + // Check Vendor ID
  164235. + if (!b_bridgechk && (venId != vendorid) && (vendorid != U2DONTCARE))
  164236. + continue;
  164237. +
  164238. + // Check Device ID
  164239. + if (!b_bridgechk && (devId != deviceid) && (deviceid != U2DONTCARE))
  164240. + continue;
  164241. +
  164242. + // Check irql
  164243. + if (!b_bridgechk && (irqline != irql) && (irql != U1DONTCARE))
  164244. + continue;
  164245. +
  164246. + //4 get Class Code
  164247. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164248. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (2 << 2));
  164249. + NdisRawReadPortUlong(PCI_CONF_DATA, &classcode);
  164250. + classcode = classcode >> 8;
  164251. +
  164252. + basec = (u8) (classcode >> 16) & 0xFF;
  164253. + subc = (u8) (classcode >> 8) & 0xFF;
  164254. + if (b_bridgechk && (venId != vendorid) && (basec == basecode) && (subc == subclass))
  164255. + return _TRUE;
  164256. +
  164257. + // Check Vendor ID
  164258. + if (b_bridgechk && (venId != vendorid) && (vendorid != U2DONTCARE))
  164259. + continue;
  164260. +
  164261. + // Check Device ID
  164262. + if (b_bridgechk && (devId != deviceid) && (deviceid != U2DONTCARE))
  164263. + continue;
  164264. +
  164265. + // Check irql
  164266. + if (b_bridgechk && (irqline != irql) && (irql != U1DONTCARE))
  164267. + continue;
  164268. +
  164269. + //4 get field 0x19 value (DWORD #6)
  164270. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (6 << 2));
  164271. + NdisRawReadPortUlong(PCI_CONF_DATA, &field19);
  164272. + field19 = (field19 >> 8) & 0xFF;
  164273. +
  164274. + //4 Matching Class Code and filed19.
  164275. + if ((basec == basecode) && (subc == subclass) && ((field19 == filed19val) || (filed19val == U1DONTCARE))) {
  164276. + *busnum = busnum_idx;
  164277. + *devnum = devicenum_idx;
  164278. + *funcnum = functionnum_idx;
  164279. +
  164280. + DBG_871X("GetPciBusInfo(): Find Device(%X:%X) bus=%d dev=%d, func=%d\n",
  164281. + vendorid, deviceid, busnum_idx, devicenum_idx, functionnum_idx);
  164282. + return _TRUE;
  164283. + }
  164284. + }
  164285. + }
  164286. + }
  164287. +
  164288. + DBG_871X("GetPciBusInfo(): Cannot Find Device(%X:%X:%X)\n", vendorid, deviceid, dev_venid);
  164289. +
  164290. + return _FALSE;
  164291. +}
  164292. +
  164293. +static u8
  164294. +rtw_get_pci_brideg_info(_adapter *padapter,
  164295. + u8 basecode,
  164296. + u8 subclass,
  164297. + u8 filed19val, u8 * busnum, u8 * devnum,
  164298. + u8 * funcnum, u16 * vendorid, u16 * deviceid)
  164299. +{
  164300. + u8 busnum_idx, devicenum_idx, functionnum_idx;
  164301. + u32 pcicfg_addrport = 0;
  164302. + u32 dev_venid, classcode, field19, headertype;
  164303. + u16 venId, devId;
  164304. + u8 basec, subc, irqline;
  164305. + u16 regoffset;
  164306. + u8 b_singlefunc = _FALSE;
  164307. +
  164308. + *busnum = 0xFF;
  164309. + *devnum = 0xFF;
  164310. + *funcnum = 0xFF;
  164311. +
  164312. + // perform a complete pci bus scan operation
  164313. + for (busnum_idx = 0; busnum_idx < PCI_MAX_BRIDGE_NUMBER; busnum_idx++) //255
  164314. + {
  164315. + for (devicenum_idx = 0; devicenum_idx < PCI_MAX_DEVICES; devicenum_idx++) //32
  164316. + {
  164317. + b_singlefunc = _FALSE;
  164318. + for (functionnum_idx = 0; functionnum_idx < PCI_MAX_FUNCTION; functionnum_idx++) //8
  164319. + {
  164320. + //
  164321. + // <Roger_Notes> We have to skip redundant Bus scan to prevent unexpected system hang
  164322. + // if single function is present in this device.
  164323. + // 2009.02.26.
  164324. + //
  164325. + if (functionnum_idx == 0)
  164326. + {
  164327. + //4 get header type (DWORD #3)
  164328. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164329. + //NdisRawWritePortUlong((ULONG_PTR)PCI_CONF_ADDRESS , pcicfg_addrport + (3 << 2));
  164330. + //NdisRawReadPortUlong((ULONG_PTR)PCI_CONF_DATA, &headertype);
  164331. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (3 << 2));
  164332. + NdisRawReadPortUlong(PCI_CONF_DATA, &headertype);
  164333. + headertype = ((headertype >> 16) & 0x0080) >> 7; // address 0x0e[7].
  164334. + if (headertype == 0) //Single function
  164335. + b_singlefunc = _TRUE;
  164336. + }
  164337. + else
  164338. + {//By pass the following scan process.
  164339. + if (b_singlefunc == _TRUE)
  164340. + break;
  164341. + }
  164342. +
  164343. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164344. +
  164345. + //4 // Get vendorid/ deviceid
  164346. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164347. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport);
  164348. + // now grab data port with device|vendor 4 byte dword
  164349. + NdisRawReadPortUlong(PCI_CONF_DATA, &dev_venid);
  164350. +
  164351. + //4 Get irql
  164352. + regoffset = 0x3C;
  164353. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31) | (regoffset & 0xFFFFFFFC);
  164354. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport);
  164355. + NdisRawReadPortUchar((PCI_CONF_DATA + (regoffset & 0x3)), &irqline);
  164356. +
  164357. + venId = (u16) (dev_venid >> 0) & 0xFFFF;
  164358. + devId = (u16) (dev_venid >> 16) & 0xFFFF;
  164359. +
  164360. + //4 get Class Code
  164361. + pcicfg_addrport = (busnum_idx << 16) | (devicenum_idx << 11) | (functionnum_idx << 8) | (1 << 31);
  164362. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (2 << 2));
  164363. + NdisRawReadPortUlong(PCI_CONF_DATA, &classcode);
  164364. + classcode = classcode >> 8;
  164365. +
  164366. + basec = (u8) (classcode >> 16) & 0xFF;
  164367. + subc = (u8) (classcode >> 8) & 0xFF;
  164368. +
  164369. + //4 get field 0x19 value (DWORD #6)
  164370. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (6 << 2));
  164371. + NdisRawReadPortUlong(PCI_CONF_DATA, &field19);
  164372. + field19 = (field19 >> 8) & 0xFF;
  164373. +
  164374. + //4 Matching Class Code and filed19.
  164375. + if ((basec == basecode) && (subc == subclass) && ((field19 == filed19val) || (filed19val == U1DONTCARE))) {
  164376. + *busnum = busnum_idx;
  164377. + *devnum = devicenum_idx;
  164378. + *funcnum = functionnum_idx;
  164379. + *vendorid = venId;
  164380. + *deviceid = devId;
  164381. +
  164382. + DBG_871X("GetPciBridegInfo : Find Device(%X:%X) bus=%d dev=%d, func=%d\n",
  164383. + venId, devId, busnum_idx, devicenum_idx, functionnum_idx);
  164384. +
  164385. + return _TRUE;
  164386. + }
  164387. + }
  164388. + }
  164389. + }
  164390. +
  164391. + DBG_871X("GetPciBridegInfo(): Cannot Find PciBridge for Device\n");
  164392. +
  164393. + return _FALSE;
  164394. +} // end of GetPciBridegInfo
  164395. +
  164396. +//
  164397. +//Description:
  164398. +//To find specific bridge information.
  164399. +//
  164400. +static void rtw_find_bridge_info(_adapter *padapter)
  164401. +{
  164402. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164403. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164404. + u8 pcibridge_busnum = 0xff;
  164405. + u8 pcibridge_devnum = 0xff;
  164406. + u8 pcibridge_funcnum = 0xff;
  164407. + u16 pcibridge_vendorid = 0xff;
  164408. + u16 pcibridge_deviceid = 0xff;
  164409. + u8 tmp = 0;
  164410. +
  164411. + rtw_get_pci_brideg_info(padapter,
  164412. + PCI_CLASS_BRIDGE_DEV,
  164413. + PCI_SUBCLASS_BR_PCI_TO_PCI,
  164414. + pcipriv->busnumber,
  164415. + &pcibridge_busnum,
  164416. + &pcibridge_devnum, &pcibridge_funcnum,
  164417. + &pcibridge_vendorid, &pcibridge_deviceid);
  164418. +
  164419. + // match the array of vendor id and regonize which chipset is used.
  164420. + pcipriv->pcibridge_vendor = PCI_BRIDGE_VENDOR_UNKNOWN;
  164421. +
  164422. + for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) {
  164423. + if (pcibridge_vendorid == pcibridge_vendors[tmp]) {
  164424. + pcipriv->pcibridge_vendor = tmp;
  164425. + DBG_871X("Pci Bridge Vendor is found index: %d\n", tmp);
  164426. + break;
  164427. + }
  164428. + }
  164429. + DBG_871X("Pci Bridge Vendor is %x\n", pcibridge_vendors[tmp]);
  164430. +
  164431. + // Update corresponding PCI bus info.
  164432. + pcipriv->pcibridge_busnum = pcibridge_busnum;
  164433. + pcipriv->pcibridge_devnum = pcibridge_devnum;
  164434. + pcipriv->pcibridge_funcnum = pcibridge_funcnum;
  164435. + pcipriv->pcibridge_vendorid = pcibridge_vendorid;
  164436. + pcipriv->pcibridge_deviceid = pcibridge_deviceid;
  164437. +
  164438. +}
  164439. +
  164440. +static u8
  164441. +rtw_get_amd_l1_patch(_adapter *padapter, u8 busnum, u8 devnum,
  164442. + u8 funcnum)
  164443. +{
  164444. + u8 status = _FALSE;
  164445. + u8 offset_e0;
  164446. + unsigned offset_e4;
  164447. + u32 pcicfg_addrport = 0;
  164448. +
  164449. + pcicfg_addrport = (busnum << 16) | (devnum << 11) | (funcnum << 8) | (1 << 31);
  164450. +
  164451. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + 0xE0);
  164452. + NdisRawWritePortUchar(PCI_CONF_DATA, 0xA0);
  164453. +
  164454. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + 0xE0);
  164455. + NdisRawReadPortUchar(PCI_CONF_DATA, &offset_e0);
  164456. +
  164457. + if (offset_e0 == 0xA0)
  164458. + {
  164459. + NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + 0xE4);
  164460. + NdisRawReadPortUlong(PCI_CONF_DATA, &offset_e4);
  164461. + //DbgPrint("Offset E4 %x\n", offset_e4);
  164462. + if (offset_e4 & BIT(23))
  164463. + status = _TRUE;
  164464. + }
  164465. +
  164466. + return status;
  164467. +}
  164468. +#else
  164469. +/*Disable RTL8192SE ASPM & Disable Pci Bridge ASPM*/
  164470. +void rtw_pci_disable_aspm(_adapter *padapter)
  164471. +{
  164472. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164473. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  164474. + struct pci_dev *pdev = pdvobjpriv->ppcidev;
  164475. + struct pci_dev *bridge_pdev = pdev->bus->self;
  164476. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164477. + u8 linkctrl_reg;
  164478. + u16 pcibridge_linkctrlreg;
  164479. + u16 aspmlevel = 0;
  164480. +
  164481. + // We do not diable/enable ASPM by driver, in the future, the BIOS will enable host and NIC ASPM.
  164482. + // Advertised by SD1 victorh. Added by tynli. 2009.11.23.
  164483. + if(pdvobjpriv->const_pci_aspm == 0)
  164484. + return;
  164485. +
  164486. + if(!padapter->hw_init_completed)
  164487. + return;
  164488. +
  164489. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_UNKNOWN) {
  164490. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s(): PCI(Bridge) UNKNOWN.\n", __FUNCTION__));
  164491. + return;
  164492. + }
  164493. +
  164494. + linkctrl_reg = pcipriv->linkctrl_reg;
  164495. + pcibridge_linkctrlreg = pcipriv->pcibridge_linkctrlreg;
  164496. +
  164497. + // Set corresponding value.
  164498. + aspmlevel |= BIT(0) | BIT(1);
  164499. + linkctrl_reg &=~aspmlevel;
  164500. + pcibridge_linkctrlreg &=~aspmlevel;
  164501. +
  164502. + if (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) {
  164503. + RT_CLEAR_PS_LEVEL(pwrpriv, RT_RF_OFF_LEVL_CLK_REQ);
  164504. + rtw_pci_switch_clk_req(padapter, 0x0);
  164505. + }
  164506. +
  164507. + {
  164508. + /*for promising device will in L0 state after an I/O.*/
  164509. + u8 tmp_u1b;
  164510. + pci_read_config_byte(pdev, 0x80, &tmp_u1b);
  164511. + }
  164512. +
  164513. + rtw_pci_platform_switch_device_pci_aspm(padapter, linkctrl_reg);
  164514. + rtw_udelay_os(50);
  164515. +
  164516. + //When there exists anyone's BusNum, DevNum, and FuncNum that are set to 0xff,
  164517. + // we do not execute any action and return. Added by tynli.
  164518. + if( (pcipriv->busnumber == 0xff && pcipriv->devnumber == 0xff && pcipriv->funcnumber == 0xff) ||
  164519. + (pcipriv->pcibridge_busnum == 0xff && pcipriv->pcibridge_devnum == 0xff && pcipriv->pcibridge_funcnum == 0xff) )
  164520. + {
  164521. + // Do Nothing!!
  164522. + }
  164523. + else
  164524. + {
  164525. + /*Disable Pci Bridge ASPM*/
  164526. + //NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + (num4bytes << 2));
  164527. + //NdisRawWritePortUchar(PCI_CONF_DATA, pcibridge_linkctrlreg);
  164528. + pci_write_config_byte(bridge_pdev, pcipriv->pcibridge_pciehdr_offset + 0x10, pcibridge_linkctrlreg);
  164529. +
  164530. + DBG_871X("rtw_pci_disable_aspm():PciBridge busnumber[%x], DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
  164531. + pcipriv->pcibridge_busnum, pcipriv->pcibridge_devnum,
  164532. + pcipriv->pcibridge_funcnum,
  164533. + (pcipriv->pcibridge_pciehdr_offset+0x10), pcibridge_linkctrlreg);
  164534. +
  164535. + rtw_udelay_os(50);
  164536. + }
  164537. +
  164538. +}
  164539. +
  164540. +/*Enable RTL8192SE ASPM & Enable Pci Bridge ASPM for
  164541. +power saving We should follow the sequence to enable
  164542. +RTL8192SE first then enable Pci Bridge ASPM
  164543. +or the system will show bluescreen.*/
  164544. +void rtw_pci_enable_aspm(_adapter *padapter)
  164545. +{
  164546. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164547. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  164548. + struct pci_dev *pdev = pdvobjpriv->ppcidev;
  164549. + struct pci_dev *bridge_pdev = pdev->bus->self;
  164550. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164551. + u16 aspmlevel = 0;
  164552. + u8 u_pcibridge_aspmsetting = 0;
  164553. + u8 u_device_aspmsetting = 0;
  164554. + u32 u_device_aspmsupportsetting = 0;
  164555. +
  164556. + // We do not diable/enable ASPM by driver, in the future, the BIOS will enable host and NIC ASPM.
  164557. + // Advertised by SD1 victorh. Added by tynli. 2009.11.23.
  164558. + if(pdvobjpriv->const_pci_aspm == 0)
  164559. + return;
  164560. +
  164561. + //When there exists anyone's BusNum, DevNum, and FuncNum that are set to 0xff,
  164562. + // we do not execute any action and return. Added by tynli.
  164563. + if( (pcipriv->busnumber == 0xff && pcipriv->devnumber == 0xff && pcipriv->funcnumber == 0xff) ||
  164564. + (pcipriv->pcibridge_busnum == 0xff && pcipriv->pcibridge_devnum == 0xff && pcipriv->pcibridge_funcnum == 0xff) )
  164565. + {
  164566. + DBG_871X("rtw_pci_enable_aspm(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
  164567. + return;
  164568. + }
  164569. +
  164570. +//Get Bridge ASPM Support
  164571. +//not to enable bridge aspm if bridge does not support
  164572. +//Added by sherry 20100803
  164573. + if (IS_HARDWARE_TYPE_8192DE(padapter))
  164574. + {
  164575. + //PciCfgAddrPort = (pcipriv->pcibridge_busnum << 16)|(pcipriv->pcibridge_devnum<< 11)|(pcipriv->pcibridge_funcnum << 8)|(1 << 31);
  164576. + //Num4Bytes = (pcipriv->pcibridge_pciehdr_offset+0x0C)/4;
  164577. + //NdisRawWritePortUlong((ULONG_PTR)PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
  164578. + //NdisRawReadPortUlong((ULONG_PTR)PCI_CONF_DATA,&uDeviceASPMSupportSetting);
  164579. + pci_read_config_dword(bridge_pdev, (pcipriv->pcibridge_pciehdr_offset+0x0C), &u_device_aspmsupportsetting);
  164580. + DBG_871X("rtw_pci_enable_aspm(): Bridge ASPM support %x \n",u_device_aspmsupportsetting);
  164581. + if(((u_device_aspmsupportsetting & BIT(11)) != BIT(11)) || ((u_device_aspmsupportsetting & BIT(10)) != BIT(10)))
  164582. + {
  164583. + if(pdvobjpriv->const_devicepci_aspm_setting == 3)
  164584. + {
  164585. + DBG_871X("rtw_pci_enable_aspm(): Bridge not support L0S or L1\n");
  164586. + return;
  164587. + }
  164588. + else if(pdvobjpriv->const_devicepci_aspm_setting == 2)
  164589. + {
  164590. + if((u_device_aspmsupportsetting & BIT(11)) != BIT(11))
  164591. + {
  164592. + DBG_871X("rtw_pci_enable_aspm(): Bridge not support L1 \n");
  164593. + return;
  164594. + }
  164595. + }
  164596. + else if(pdvobjpriv->const_devicepci_aspm_setting == 1)
  164597. + {
  164598. + if((u_device_aspmsupportsetting & BIT(10)) != BIT(10))
  164599. + {
  164600. + DBG_871X("rtw_pci_enable_aspm(): Bridge not support L0s \n");
  164601. + return;
  164602. + }
  164603. +
  164604. + }
  164605. + }
  164606. + else
  164607. + {
  164608. + DBG_871X("rtw_pci_enable_aspm(): Bridge support L0s and L1 \n");
  164609. + }
  164610. + }
  164611. +
  164612. +
  164613. + /*Enable Pci Bridge ASPM*/
  164614. + //PciCfgAddrPort = (pcipriv->pcibridge_busnum << 16)|(pcipriv->pcibridge_devnum<< 11) |(pcipriv->pcibridge_funcnum << 8)|(1 << 31);
  164615. + //Num4Bytes = (pcipriv->pcibridge_pciehdr_offset+0x10)/4;
  164616. + // set up address port at 0xCF8 offset field= 0 (dev|vend)
  164617. + //NdisRawWritePortUlong(PCI_CONF_ADDRESS, PciCfgAddrPort + (Num4Bytes << 2));
  164618. + // now grab data port with device|vendor 4 byte dword
  164619. +
  164620. + u_pcibridge_aspmsetting = pcipriv->pcibridge_linkctrlreg;
  164621. + u_pcibridge_aspmsetting |= pdvobjpriv->const_hostpci_aspm_setting;
  164622. +
  164623. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL ||
  164624. + pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_SIS )
  164625. + u_pcibridge_aspmsetting &= ~BIT(0); // for intel host 42 device 43
  164626. +
  164627. + //NdisRawWritePortUchar(PCI_CONF_DATA, u_pcibridge_aspmsetting);
  164628. + pci_write_config_byte(bridge_pdev, (pcipriv->pcibridge_pciehdr_offset+0x10), u_pcibridge_aspmsetting);
  164629. +
  164630. + DBG_871X("PlatformEnableASPM():PciBridge busnumber[%x], DevNumbe[%x], funcnumber[%x], Write reg[%x] = %x\n",
  164631. + pcipriv->pcibridge_busnum, pcipriv->pcibridge_devnum, pcipriv->pcibridge_funcnum,
  164632. + (pcipriv->pcibridge_pciehdr_offset+0x10),
  164633. + u_pcibridge_aspmsetting);
  164634. +
  164635. + rtw_udelay_os(50);
  164636. +
  164637. + /*Get ASPM level (with/without Clock Req)*/
  164638. + aspmlevel |= pdvobjpriv->const_devicepci_aspm_setting;
  164639. + u_device_aspmsetting = pcipriv->linkctrl_reg;
  164640. + u_device_aspmsetting |= aspmlevel; // device 43
  164641. +
  164642. + rtw_pci_platform_switch_device_pci_aspm(padapter, u_device_aspmsetting);
  164643. +
  164644. + if (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) {
  164645. + rtw_pci_switch_clk_req(padapter, (pwrpriv->reg_rfps_level & RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0);
  164646. + RT_SET_PS_LEVEL(pwrpriv, RT_RF_OFF_LEVL_CLK_REQ);
  164647. + }
  164648. +
  164649. + rtw_udelay_os(50);
  164650. +}
  164651. +
  164652. +static u8 rtw_pci_get_amd_l1_patch(struct dvobj_priv *dvobj)
  164653. +{
  164654. + struct pci_dev *pdev = dvobj->ppcidev;
  164655. + struct pci_dev *bridge_pdev = pdev->bus->self;
  164656. + u8 status = _FALSE;
  164657. + u8 offset_e0;
  164658. + u32 offset_e4;
  164659. +
  164660. + //NdisRawWritePortUlong(PCI_CONF_ADDRESS,pcicfg_addrport + 0xE0);
  164661. + //NdisRawWritePortUchar(PCI_CONF_DATA, 0xA0);
  164662. + pci_write_config_byte(bridge_pdev, 0xE0, 0xA0);
  164663. +
  164664. + //NdisRawWritePortUlong(PCI_CONF_ADDRESS,pcicfg_addrport + 0xE0);
  164665. + //NdisRawReadPortUchar(PCI_CONF_DATA, &offset_e0);
  164666. + pci_read_config_byte(bridge_pdev, 0xE0, &offset_e0);
  164667. +
  164668. + if (offset_e0 == 0xA0) {
  164669. + //NdisRawWritePortUlong(PCI_CONF_ADDRESS, pcicfg_addrport + 0xE4);
  164670. + //NdisRawReadPortUlong(PCI_CONF_DATA, &offset_e4);
  164671. + pci_read_config_dword(bridge_pdev, 0xE4, &offset_e4);
  164672. + if (offset_e4 & BIT(23))
  164673. + status = _TRUE;
  164674. + }
  164675. +
  164676. + return status;
  164677. +}
  164678. +
  164679. +static void rtw_pci_get_linkcontrol_field(struct dvobj_priv *dvobj)
  164680. +{
  164681. + struct pci_priv *pcipriv = &(dvobj->pcipriv);
  164682. + struct pci_dev *pdev = dvobj->ppcidev;
  164683. + struct pci_dev *bridge_pdev = pdev->bus->self;
  164684. + u8 capabilityoffset = pcipriv->pcibridge_pciehdr_offset;
  164685. + u8 linkctrl_reg;
  164686. +
  164687. + /*Read Link Control Register*/
  164688. + pci_read_config_byte(bridge_pdev, capabilityoffset + PCI_EXP_LNKCTL, &linkctrl_reg);
  164689. +
  164690. + pcipriv->pcibridge_linkctrlreg = linkctrl_reg;
  164691. +}
  164692. +#endif
  164693. +
  164694. +static void rtw_pci_parse_configuration(struct dvobj_priv *dvobj)
  164695. +{
  164696. + struct pci_dev *pdev = dvobj->ppcidev;
  164697. + struct pci_priv *pcipriv = &(dvobj->pcipriv);
  164698. + u8 tmp;
  164699. + int pos;
  164700. + u8 linkctrl_reg;
  164701. +
  164702. + //Link Control Register
  164703. + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
  164704. + pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &linkctrl_reg);
  164705. + pcipriv->linkctrl_reg = linkctrl_reg;
  164706. +
  164707. + //DBG_871X("Link Control Register = %x\n", pcipriv->linkctrl_reg);
  164708. +
  164709. + pci_read_config_byte(pdev, 0x98, &tmp);
  164710. + tmp |= BIT(4);
  164711. + pci_write_config_byte(pdev, 0x98, tmp);
  164712. +
  164713. + //tmp = 0x17;
  164714. + //pci_write_config_byte(pdev, 0x70f, tmp);
  164715. +}
  164716. +
  164717. +//
  164718. +// Update PCI dependent default settings.
  164719. +//
  164720. +static void rtw_pci_update_default_setting(_adapter *padapter)
  164721. +{
  164722. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  164723. + struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  164724. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  164725. +
  164726. + //reset pPSC->reg_rfps_level & priv->b_support_aspm
  164727. + pwrpriv->reg_rfps_level = 0;
  164728. + pwrpriv->b_support_aspm = 0;
  164729. +
  164730. + // Dynamic Mechanism,
  164731. + //rtw_hal_set_def_var(pAdapter, HAL_DEF_INIT_GAIN, &(pDevice->InitGainState));
  164732. +
  164733. + // Update PCI ASPM setting
  164734. + pwrpriv->const_amdpci_aspm = pdvobjpriv->const_amdpci_aspm;
  164735. + switch (pdvobjpriv->const_pci_aspm) {
  164736. + case 0: // No ASPM
  164737. + break;
  164738. +
  164739. + case 1: // ASPM dynamically enabled/disable.
  164740. + pwrpriv->reg_rfps_level |= RT_RF_LPS_LEVEL_ASPM;
  164741. + break;
  164742. +
  164743. + case 2: // ASPM with Clock Req dynamically enabled/disable.
  164744. + pwrpriv->reg_rfps_level |= (RT_RF_LPS_LEVEL_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
  164745. + break;
  164746. +
  164747. + case 3: // Always enable ASPM and Clock Req from initialization to halt.
  164748. + pwrpriv->reg_rfps_level &= ~(RT_RF_LPS_LEVEL_ASPM);
  164749. + pwrpriv->reg_rfps_level |= (RT_RF_PS_LEVEL_ALWAYS_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
  164750. + break;
  164751. +
  164752. + case 4: // Always enable ASPM without Clock Req from initialization to halt.
  164753. + pwrpriv->reg_rfps_level &= ~(RT_RF_LPS_LEVEL_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
  164754. + pwrpriv->reg_rfps_level |= RT_RF_PS_LEVEL_ALWAYS_ASPM;
  164755. + break;
  164756. + }
  164757. +
  164758. + pwrpriv->reg_rfps_level |= RT_RF_OFF_LEVL_HALT_NIC;
  164759. +
  164760. + // Update Radio OFF setting
  164761. + switch (pdvobjpriv->const_hwsw_rfoff_d3) {
  164762. + case 1:
  164763. + if (pwrpriv->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM)
  164764. + pwrpriv->reg_rfps_level |= RT_RF_OFF_LEVL_ASPM;
  164765. + break;
  164766. +
  164767. + case 2:
  164768. + if (pwrpriv->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM)
  164769. + pwrpriv->reg_rfps_level |= RT_RF_OFF_LEVL_ASPM;
  164770. + pwrpriv->reg_rfps_level |= RT_RF_OFF_LEVL_HALT_NIC;
  164771. + break;
  164772. +
  164773. + case 3:
  164774. + pwrpriv->reg_rfps_level |= RT_RF_OFF_LEVL_PCI_D3;
  164775. + break;
  164776. + }
  164777. +
  164778. + // Update Rx 2R setting
  164779. + //pPSC->reg_rfps_level |= ((pDevice->RegLPS2RDisable) ? RT_RF_LPS_DISALBE_2R : 0);
  164780. +
  164781. + //
  164782. + // Set HW definition to determine if it supports ASPM.
  164783. + //
  164784. + switch (pdvobjpriv->const_support_pciaspm) {
  164785. + case 0: // Not support ASPM.
  164786. + {
  164787. + u8 b_support_aspm = _FALSE;
  164788. + pwrpriv->b_support_aspm = b_support_aspm;
  164789. + }
  164790. + break;
  164791. +
  164792. + case 1: // Support ASPM.
  164793. + {
  164794. + u8 b_support_aspm = _TRUE;
  164795. + u8 b_support_backdoor = _TRUE;
  164796. +
  164797. + pwrpriv->b_support_aspm = b_support_aspm;
  164798. +
  164799. + /*if(pAdapter->MgntInfo.CustomerID == RT_CID_TOSHIBA &&
  164800. + pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_AMD &&
  164801. + !pcipriv->amd_l1_patch)
  164802. + b_support_backdoor = _FALSE;*/
  164803. +
  164804. + pwrpriv->b_support_backdoor = b_support_backdoor;
  164805. + }
  164806. + break;
  164807. +
  164808. + case 2: // Set by Chipset.
  164809. + // ASPM value set by chipset.
  164810. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_INTEL) {
  164811. + u8 b_support_aspm = _TRUE;
  164812. + pwrpriv->b_support_aspm = b_support_aspm;
  164813. + }
  164814. + break;
  164815. +
  164816. + default:
  164817. + // Do nothing. Set when finding the chipset.
  164818. + break;
  164819. + }
  164820. +}
  164821. +
  164822. +static void rtw_pci_initialize_adapter_common(_adapter *padapter)
  164823. +{
  164824. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  164825. +
  164826. + rtw_pci_update_default_setting(padapter);
  164827. +
  164828. + if (pwrpriv->reg_rfps_level & RT_RF_PS_LEVEL_ALWAYS_ASPM) {
  164829. + // Always enable ASPM & Clock Req.
  164830. + rtw_pci_enable_aspm(padapter);
  164831. + RT_SET_PS_LEVEL(pwrpriv, RT_RF_PS_LEVEL_ALWAYS_ASPM);
  164832. + }
  164833. +
  164834. +}
  164835. +
  164836. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  164837. +#define rtw_pci_interrupt(x,y,z) rtw_pci_interrupt(x,y)
  164838. +#endif
  164839. +
  164840. +static irqreturn_t rtw_pci_interrupt(int irq, void *priv, struct pt_regs *regs)
  164841. +{
  164842. + struct dvobj_priv *dvobj = (struct dvobj_priv *)priv;
  164843. + _adapter *adapter = dvobj->if1;
  164844. +
  164845. + if (dvobj->irq_enabled == 0) {
  164846. + return IRQ_HANDLED;
  164847. + }
  164848. +
  164849. + if(rtw_hal_interrupt_handler(adapter) == _FAIL)
  164850. + return IRQ_HANDLED;
  164851. + //return IRQ_NONE;
  164852. +
  164853. + return IRQ_HANDLED;
  164854. +}
  164855. +
  164856. +#ifdef RTK_DMP_PLATFORM
  164857. +#define pci_iounmap(x,y) iounmap(y)
  164858. +#endif
  164859. +
  164860. +int pci_alloc_irq(struct dvobj_priv *dvobj)
  164861. +{
  164862. + int err;
  164863. + struct pci_dev *pdev = dvobj->ppcidev;
  164864. +
  164865. +#if defined(IRQF_SHARED)
  164866. + err = request_irq(pdev->irq, &rtw_pci_interrupt, IRQF_SHARED, DRV_NAME, dvobj);
  164867. +#else
  164868. + err = request_irq(pdev->irq, &rtw_pci_interrupt, SA_SHIRQ, DRV_NAME, dvobj);
  164869. +#endif
  164870. + if (err) {
  164871. + DBG_871X("Error allocating IRQ %d",pdev->irq);
  164872. + } else {
  164873. + dvobj->irq_alloc = 1;
  164874. + DBG_871X("Request_irq OK, IRQ %d\n",pdev->irq);
  164875. + }
  164876. +
  164877. + return err?_FAIL:_SUCCESS;
  164878. +}
  164879. +
  164880. +static struct dvobj_priv *pci_dvobj_init(struct pci_dev *pdev)
  164881. +{
  164882. + int err;
  164883. + u32 status = _FAIL;
  164884. + struct dvobj_priv *dvobj = NULL;
  164885. + struct pci_priv *pcipriv = NULL;
  164886. + struct pci_dev *bridge_pdev = pdev->bus->self;
  164887. + unsigned long pmem_start, pmem_len, pmem_flags;
  164888. + u8 tmp;
  164889. +
  164890. +_func_enter_;
  164891. +
  164892. + if ((dvobj = devobj_init()) == NULL) {
  164893. + goto exit;
  164894. + }
  164895. + dvobj->ppcidev = pdev;
  164896. + pcipriv = &(dvobj->pcipriv);
  164897. + pci_set_drvdata(pdev, dvobj);
  164898. +
  164899. + if ( (err = pci_enable_device(pdev)) != 0) {
  164900. + DBG_871X(KERN_ERR "%s : Cannot enable new PCI device\n", pci_name(pdev));
  164901. + goto free_dvobj;
  164902. + }
  164903. +
  164904. +#ifdef CONFIG_64BIT_DMA
  164905. + if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
  164906. + DBG_871X("RTL819xCE: Using 64bit DMA\n");
  164907. + if ((err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) != 0) {
  164908. + DBG_871X(KERN_ERR "Unable to obtain 64bit DMA for consistent allocations\n");
  164909. + goto disable_picdev;
  164910. + }
  164911. + dvobj->bdma64 = _TRUE;
  164912. + } else
  164913. +#endif
  164914. + {
  164915. + if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
  164916. + if ((err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
  164917. + DBG_871X(KERN_ERR "Unable to obtain 32bit DMA for consistent allocations\n");
  164918. + goto disable_picdev;
  164919. + }
  164920. + }
  164921. + }
  164922. +
  164923. + pci_set_master(pdev);
  164924. +
  164925. + if ((err = pci_request_regions(pdev, DRV_NAME)) != 0) {
  164926. + DBG_871X(KERN_ERR "Can't obtain PCI resources\n");
  164927. + goto disable_picdev;
  164928. + }
  164929. + //MEM map
  164930. + pmem_start = pci_resource_start(pdev, 2);
  164931. + pmem_len = pci_resource_len(pdev, 2);
  164932. + pmem_flags = pci_resource_flags(pdev, 2);
  164933. +
  164934. +#ifdef RTK_DMP_PLATFORM
  164935. + dvobj->pci_mem_start = (unsigned long)ioremap_nocache(pmem_start, pmem_len);
  164936. +#else
  164937. + dvobj->pci_mem_start = (unsigned long)pci_iomap(pdev, 2, pmem_len); /* shared mem start */
  164938. +#endif
  164939. + if (dvobj->pci_mem_start == 0) {
  164940. + DBG_871X(KERN_ERR "Can't map PCI mem\n");
  164941. + goto release_regions;
  164942. + }
  164943. +
  164944. + DBG_871X("Memory mapped space start: 0x%08lx len:%08lx flags:%08lx, after map:0x%08lx\n",
  164945. + pmem_start, pmem_len, pmem_flags, dvobj->pci_mem_start);
  164946. +
  164947. + // Disable Clk Request */
  164948. + pci_write_config_byte(pdev, 0x81, 0);
  164949. + // leave D3 mode */
  164950. + pci_write_config_byte(pdev, 0x44, 0);
  164951. + pci_write_config_byte(pdev, 0x04, 0x06);
  164952. + pci_write_config_byte(pdev, 0x04, 0x07);
  164953. +
  164954. +
  164955. +#if 1
  164956. + /*find bus info*/
  164957. + pcipriv->busnumber = pdev->bus->number;
  164958. + pcipriv->devnumber = PCI_SLOT(pdev->devfn);
  164959. + pcipriv->funcnumber = PCI_FUNC(pdev->devfn);
  164960. +
  164961. + /*find bridge info*/
  164962. + pcipriv->pcibridge_vendor = PCI_BRIDGE_VENDOR_UNKNOWN;
  164963. + if(bridge_pdev){
  164964. + pcipriv->pcibridge_vendorid = bridge_pdev->vendor;
  164965. + for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) {
  164966. + if (bridge_pdev->vendor == pcibridge_vendors[tmp]) {
  164967. + pcipriv->pcibridge_vendor = tmp;
  164968. + DBG_871X("Pci Bridge Vendor is found index: %d, %x\n", tmp, pcibridge_vendors[tmp]);
  164969. + break;
  164970. + }
  164971. + }
  164972. + }
  164973. +
  164974. + //if (pcipriv->pcibridge_vendor != PCI_BRIDGE_VENDOR_UNKNOWN) {
  164975. + if(bridge_pdev){
  164976. + pcipriv->pcibridge_busnum = bridge_pdev->bus->number;
  164977. + pcipriv->pcibridge_devnum = PCI_SLOT(bridge_pdev->devfn);
  164978. + pcipriv->pcibridge_funcnum = PCI_FUNC(bridge_pdev->devfn);
  164979. +
  164980. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34))
  164981. + pcipriv->pcibridge_pciehdr_offset = pci_find_capability(bridge_pdev, PCI_CAP_ID_EXP);
  164982. +#else
  164983. + pcipriv->pcibridge_pciehdr_offset = bridge_pdev->pcie_cap;
  164984. +#endif
  164985. +
  164986. + rtw_pci_get_linkcontrol_field(dvobj);
  164987. +
  164988. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_AMD) {
  164989. + pcipriv->amd_l1_patch = rtw_pci_get_amd_l1_patch(dvobj);
  164990. + }
  164991. + }
  164992. +#else
  164993. + //
  164994. + // Find bridge related info.
  164995. + //
  164996. + rtw_get_pci_bus_info(padapter,
  164997. + pdev->vendor,
  164998. + pdev->device,
  164999. + (u8) pdvobjpriv->irqline,
  165000. + 0x02, 0x80, U1DONTCARE,
  165001. + &pcipriv->busnumber,
  165002. + &pcipriv->devnumber,
  165003. + &pcipriv->funcnumber);
  165004. +
  165005. + rtw_find_bridge_info(padapter);
  165006. +
  165007. + if (pcipriv->pcibridge_vendor != PCI_BRIDGE_VENDOR_UNKNOWN) {
  165008. + rtw_get_link_control_field(padapter,
  165009. + pcipriv->pcibridge_busnum,
  165010. + pcipriv->pcibridge_devnum,
  165011. + pcipriv->pcibridge_funcnum);
  165012. +
  165013. + if (pcipriv->pcibridge_vendor == PCI_BRIDGE_VENDOR_AMD) {
  165014. + pcipriv->amd_l1_patch =
  165015. + rtw_get_amd_l1_patch(padapter,
  165016. + pcipriv->pcibridge_busnum,
  165017. + pcipriv->pcibridge_devnum,
  165018. + pcipriv->pcibridge_funcnum);
  165019. + }
  165020. + }
  165021. +#endif
  165022. +
  165023. + //
  165024. + // Allow the hardware to look at PCI config information.
  165025. + //
  165026. + rtw_pci_parse_configuration(dvobj);
  165027. +
  165028. + DBG_871X("pcidev busnumber:devnumber:funcnumber:"
  165029. + "vendor:link_ctl %d:%d:%d:%x:%x\n",
  165030. + pcipriv->busnumber,
  165031. + pcipriv->devnumber,
  165032. + pcipriv->funcnumber,
  165033. + pdev->vendor,
  165034. + pcipriv->linkctrl_reg);
  165035. +
  165036. + DBG_871X("pci_bridge busnumber:devnumber:funcnumber:vendor:"
  165037. + "pcie_cap:link_ctl_reg: %d:%d:%d:%x:%x:%x:%x\n",
  165038. + pcipriv->pcibridge_busnum,
  165039. + pcipriv->pcibridge_devnum,
  165040. + pcipriv->pcibridge_funcnum,
  165041. + pcibridge_vendors[pcipriv->pcibridge_vendor],
  165042. + pcipriv->pcibridge_pciehdr_offset,
  165043. + pcipriv->pcibridge_linkctrlreg,
  165044. + pcipriv->amd_l1_patch);
  165045. +
  165046. + status = _SUCCESS;
  165047. +
  165048. +iounmap:
  165049. + if (status != _SUCCESS && dvobj->pci_mem_start != 0) {
  165050. + pci_iounmap(pdev, (void *)dvobj->pci_mem_start);
  165051. + dvobj->pci_mem_start = 0;
  165052. + }
  165053. +release_regions:
  165054. + if (status != _SUCCESS)
  165055. + pci_release_regions(pdev);
  165056. +disable_picdev:
  165057. + if (status != _SUCCESS)
  165058. + pci_disable_device(pdev);
  165059. +free_dvobj:
  165060. + if (status != _SUCCESS && dvobj) {
  165061. + pci_set_drvdata(pdev, NULL);
  165062. + devobj_deinit(dvobj);
  165063. + dvobj = NULL;
  165064. + }
  165065. +exit:
  165066. +_func_exit_;
  165067. + return dvobj;
  165068. +}
  165069. +
  165070. +static void pci_dvobj_deinit(struct pci_dev *pdev)
  165071. +{
  165072. + struct dvobj_priv *dvobj = pci_get_drvdata(pdev);
  165073. +_func_enter_;
  165074. +
  165075. + pci_set_drvdata(pdev, NULL);
  165076. + if (dvobj) {
  165077. + if (dvobj->irq_alloc) {
  165078. + free_irq(pdev->irq, dvobj);
  165079. + dvobj->irq_alloc = 0;
  165080. + }
  165081. +
  165082. + if (dvobj->pci_mem_start != 0) {
  165083. + pci_iounmap(pdev, (void *)dvobj->pci_mem_start);
  165084. + dvobj->pci_mem_start = 0;
  165085. + }
  165086. +
  165087. + devobj_deinit(dvobj);
  165088. + }
  165089. +
  165090. + pci_release_regions(pdev);
  165091. + pci_disable_device(pdev);
  165092. +
  165093. +_func_exit_;
  165094. +}
  165095. +
  165096. +static void decide_chip_type_by_pci_device_id(_adapter *padapter, struct pci_dev *pdev)
  165097. +{
  165098. + u16 venderid, deviceid, irqline;
  165099. + u8 revisionid;
  165100. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  165101. +
  165102. +
  165103. + venderid = pdev->vendor;
  165104. + deviceid = pdev->device;
  165105. +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23))
  165106. + pci_read_config_byte(pdev, PCI_REVISION_ID, &revisionid); // PCI_REVISION_ID 0x08
  165107. +#else
  165108. + revisionid = pdev->revision;
  165109. +#endif
  165110. + pci_read_config_word(pdev, PCI_INTERRUPT_LINE, &irqline); // PCI_INTERRUPT_LINE 0x3c
  165111. + pdvobjpriv->irqline = irqline;
  165112. +
  165113. +
  165114. + //
  165115. + // Decide hardware type here.
  165116. + //
  165117. + if( deviceid == HAL_HW_PCI_8185_DEVICE_ID ||
  165118. + deviceid == HAL_HW_PCI_8188_DEVICE_ID ||
  165119. + deviceid == HAL_HW_PCI_8198_DEVICE_ID)
  165120. + {
  165121. + DBG_871X("Adapter (8185/8185B) is found- VendorID/DeviceID=%x/%x\n", venderid, deviceid);
  165122. + padapter->HardwareType=HARDWARE_TYPE_RTL8185;
  165123. + }
  165124. + else if (deviceid == HAL_HW_PCI_8190_DEVICE_ID ||
  165125. + deviceid == HAL_HW_PCI_0045_DEVICE_ID ||
  165126. + deviceid == HAL_HW_PCI_0046_DEVICE_ID ||
  165127. + deviceid == HAL_HW_PCI_DLINK_DEVICE_ID)
  165128. + {
  165129. + DBG_871X("Adapter(8190 PCI) is found - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165130. + padapter->HardwareType = HARDWARE_TYPE_RTL8190P;
  165131. + }
  165132. + else if (deviceid == HAL_HW_PCI_8192_DEVICE_ID ||
  165133. + deviceid == HAL_HW_PCI_0044_DEVICE_ID ||
  165134. + deviceid == HAL_HW_PCI_0047_DEVICE_ID ||
  165135. + deviceid == HAL_HW_PCI_8192SE_DEVICE_ID ||
  165136. + deviceid == HAL_HW_PCI_8174_DEVICE_ID ||
  165137. + deviceid == HAL_HW_PCI_8173_DEVICE_ID ||
  165138. + deviceid == HAL_HW_PCI_8172_DEVICE_ID ||
  165139. + deviceid == HAL_HW_PCI_8171_DEVICE_ID)
  165140. + {
  165141. + // 8192e and and 8192se may have the same device ID 8192. However, their Revision
  165142. + // ID is different
  165143. + // Added for 92DE. We deferentiate it from SVID,SDID.
  165144. + if( pdev->subsystem_vendor == 0x10EC && pdev->subsystem_device == 0xE020){
  165145. + padapter->HardwareType = HARDWARE_TYPE_RTL8192DE;
  165146. + DBG_871X("Adapter(8192DE) is found - VendorID/DeviceID/RID=%X/%X/%X\n", venderid, deviceid, revisionid);
  165147. + }else{
  165148. + switch (revisionid) {
  165149. + case HAL_HW_PCI_REVISION_ID_8192PCIE:
  165150. + DBG_871X("Adapter(8192 PCI-E) is found - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165151. + padapter->HardwareType = HARDWARE_TYPE_RTL8192E;
  165152. + break;
  165153. + case HAL_HW_PCI_REVISION_ID_8192SE:
  165154. + DBG_871X("Adapter(8192SE) is found - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165155. + padapter->HardwareType = HARDWARE_TYPE_RTL8192SE;
  165156. + break;
  165157. + default:
  165158. + DBG_871X("Err: Unknown device - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165159. + padapter->HardwareType = HARDWARE_TYPE_RTL8192SE;
  165160. + break;
  165161. + }
  165162. + }
  165163. + }
  165164. + else if(deviceid==HAL_HW_PCI_8723E_DEVICE_ID )
  165165. + {//RTL8723E may have the same device ID with RTL8192CET
  165166. + padapter->HardwareType = HARDWARE_TYPE_RTL8723AE;
  165167. + DBG_871X("Adapter(8723 PCI-E) is found - VendorID/DeviceID=%x/%x\n", venderid, deviceid);
  165168. + }
  165169. + else if (deviceid == HAL_HW_PCI_8192CET_DEVICE_ID ||
  165170. + deviceid == HAL_HW_PCI_8192CE_DEVICE_ID ||
  165171. + deviceid == HAL_HW_PCI_8191CE_DEVICE_ID ||
  165172. + deviceid == HAL_HW_PCI_8188CE_DEVICE_ID)
  165173. + {
  165174. + DBG_871X("Adapter(8192C PCI-E) is found - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165175. + padapter->HardwareType = HARDWARE_TYPE_RTL8192CE;
  165176. + }
  165177. + else if (deviceid == HAL_HW_PCI_8192DE_DEVICE_ID ||
  165178. + deviceid == HAL_HW_PCI_002B_DEVICE_ID ){
  165179. + padapter->HardwareType = HARDWARE_TYPE_RTL8192DE;
  165180. + DBG_871X("Adapter(8192DE) is found - VendorID/DeviceID/RID=%X/%X/%X\n", venderid, deviceid, revisionid);
  165181. + }
  165182. + else
  165183. + {
  165184. + DBG_871X("Err: Unknown device - vendorid/deviceid=%x/%x\n", venderid, deviceid);
  165185. + //padapter->HardwareType = HAL_DEFAULT_HARDWARE_TYPE;
  165186. + }
  165187. +
  165188. +
  165189. + padapter->chip_type = NULL_CHIP_TYPE;
  165190. +
  165191. + //TODO:
  165192. +#ifdef CONFIG_RTL8192C
  165193. + padapter->chip_type = RTL8188C_8192C;
  165194. + padapter->HardwareType = HARDWARE_TYPE_RTL8192CE;
  165195. +#endif
  165196. +#ifdef CONFIG_RTL8192D
  165197. + pdvobjpriv->InterfaceNumber = revisionid;
  165198. +
  165199. + padapter->chip_type = RTL8192D;
  165200. + padapter->HardwareType = HARDWARE_TYPE_RTL8192DE;
  165201. +#endif
  165202. +
  165203. +}
  165204. +
  165205. +static void pci_intf_start(_adapter *padapter)
  165206. +{
  165207. +
  165208. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+pci_intf_start\n"));
  165209. + DBG_871X("+pci_intf_start\n");
  165210. +
  165211. +#ifdef CONFIG_PCILED_BLINK
  165212. + rtw_led_control(padapter, LED_CTL_NO_LINK);
  165213. +#endif
  165214. + //Enable hw interrupt
  165215. + rtw_hal_enable_interrupt(padapter);
  165216. +
  165217. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-pci_intf_start\n"));
  165218. + DBG_871X("-pci_intf_start\n");
  165219. +}
  165220. +
  165221. +static void pci_intf_stop(_adapter *padapter)
  165222. +{
  165223. +
  165224. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+pci_intf_stop\n"));
  165225. +
  165226. + //Disable hw interrupt
  165227. + if(padapter->bSurpriseRemoved == _FALSE)
  165228. + {
  165229. + //device still exists, so driver can do i/o operation
  165230. + rtw_hal_disable_interrupt(padapter);
  165231. + tasklet_disable(&(padapter->recvpriv.recv_tasklet));
  165232. + tasklet_disable(&(padapter->recvpriv.irq_prepare_beacon_tasklet));
  165233. + tasklet_disable(&(padapter->xmitpriv.xmit_tasklet));
  165234. +
  165235. +#ifdef CONFIG_CONCURRENT_MODE
  165236. + /* This function only be called at driver removing. disable buddy_adapter too
  165237. + don't disable interrupt of buddy_adapter because it is same as primary.
  165238. + */
  165239. + if (padapter->pbuddy_adapter){
  165240. + tasklet_disable(&(padapter->pbuddy_adapter->recvpriv.recv_tasklet));
  165241. + tasklet_disable(&(padapter->pbuddy_adapter->recvpriv.irq_prepare_beacon_tasklet));
  165242. + tasklet_disable(&(padapter->pbuddy_adapter->xmitpriv.xmit_tasklet));
  165243. + }
  165244. +#endif
  165245. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("pci_intf_stop: SurpriseRemoved==_FALSE\n"));
  165246. + }
  165247. + else
  165248. + {
  165249. + // Clear irq_enabled to prevent handle interrupt function.
  165250. + adapter_to_dvobj(padapter)->irq_enabled = 0;
  165251. + }
  165252. +
  165253. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-pci_intf_stop\n"));
  165254. +
  165255. +}
  165256. +
  165257. +
  165258. +static void rtw_dev_unload(_adapter *padapter)
  165259. +{
  165260. + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;
  165261. +
  165262. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_dev_unload\n"));
  165263. +
  165264. + if(padapter->bup == _TRUE)
  165265. + {
  165266. + DBG_871X("+rtw_dev_unload\n");
  165267. +
  165268. + padapter->bDriverStopped = _TRUE;
  165269. + #ifdef CONFIG_XMIT_ACK
  165270. + if (padapter->xmitpriv.ack_tx)
  165271. + rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
  165272. + #endif
  165273. +
  165274. + //s3.
  165275. + if(padapter->intf_stop)
  165276. + {
  165277. + padapter->intf_stop(padapter);
  165278. + }
  165279. +
  165280. + //s4.
  165281. + rtw_stop_drv_threads(padapter);
  165282. +
  165283. +
  165284. + //s5.
  165285. + if(padapter->bSurpriseRemoved == _FALSE)
  165286. + {
  165287. + DBG_871X("r871x_dev_unload()->rtl871x_hal_deinit()\n");
  165288. + rtw_hal_deinit(padapter);
  165289. +
  165290. + padapter->bSurpriseRemoved = _TRUE;
  165291. + }
  165292. +
  165293. + padapter->bup = _FALSE;
  165294. +
  165295. + }
  165296. + else
  165297. + {
  165298. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("r871x_dev_unload():padapter->bup == _FALSE\n" ));
  165299. + }
  165300. +
  165301. + DBG_871X("-rtw_dev_unload\n");
  165302. +
  165303. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-rtw_dev_unload\n"));
  165304. +
  165305. +}
  165306. +
  165307. +static void disable_ht_for_spec_devid(const struct pci_device_id *pdid)
  165308. +{
  165309. +#ifdef CONFIG_80211N_HT
  165310. + u16 vid, pid;
  165311. + u32 flags;
  165312. + int i;
  165313. + int num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id);
  165314. +
  165315. + for(i=0; i<num; i++)
  165316. + {
  165317. + vid = specific_device_id_tbl[i].idVendor;
  165318. + pid = specific_device_id_tbl[i].idProduct;
  165319. + flags = specific_device_id_tbl[i].flags;
  165320. +
  165321. + if((pdid->vendor==vid) && (pdid->device==pid) && (flags&SPEC_DEV_ID_DISABLE_HT))
  165322. + {
  165323. + rtw_ht_enable = 0;
  165324. + rtw_cbw40_enable = 0;
  165325. + rtw_ampdu_enable = 0;
  165326. + }
  165327. +
  165328. + }
  165329. +#endif
  165330. +}
  165331. +
  165332. +#ifdef CONFIG_PM
  165333. +static int rtw_suspend(struct pci_dev *pdev, pm_message_t state)
  165334. +{
  165335. + _func_enter_;
  165336. +
  165337. +
  165338. + _func_exit_;
  165339. + return 0;
  165340. +}
  165341. +
  165342. +static int rtw_resume(struct pci_dev *pdev)
  165343. +{
  165344. + _func_enter_;
  165345. +
  165346. +
  165347. + _func_exit_;
  165348. +
  165349. + return 0;
  165350. +}
  165351. +#endif
  165352. +
  165353. +_adapter *rtw_pci_if1_init(struct dvobj_priv * dvobj, struct pci_dev *pdev,
  165354. + const struct pci_device_id *pdid)
  165355. +{
  165356. + _adapter *padapter = NULL;
  165357. + struct net_device *pnetdev = NULL;
  165358. + int status = _FAIL;
  165359. +
  165360. + if ((padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter))) == NULL) {
  165361. + goto exit;
  165362. + }
  165363. + padapter->dvobj = dvobj;
  165364. + dvobj->if1 = padapter;
  165365. +
  165366. + padapter->bDriverStopped=_TRUE;
  165367. +
  165368. + dvobj->padapters[dvobj->iface_nums++] = padapter;
  165369. + padapter->iface_id = IFACE_ID0;
  165370. +
  165371. +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT)
  165372. + //set adapter_type/iface type for primary padapter
  165373. + padapter->isprimary = _TRUE;
  165374. + padapter->adapter_type = PRIMARY_ADAPTER;
  165375. + #ifndef CONFIG_HWPORT_SWAP
  165376. + padapter->iface_type = IFACE_PORT0;
  165377. + #else
  165378. + padapter->iface_type = IFACE_PORT1;
  165379. + #endif
  165380. +#endif
  165381. +
  165382. + //step 1-1., decide the chip_type via vid/pid
  165383. + padapter->interface_type = RTW_PCIE;
  165384. + decide_chip_type_by_pci_device_id(padapter, pdev);
  165385. +
  165386. + if((pnetdev = rtw_init_netdev(padapter)) == NULL) {
  165387. + goto free_adapter;
  165388. + }
  165389. + if (dvobj->bdma64)
  165390. + pnetdev->features |= NETIF_F_HIGHDMA;
  165391. + pnetdev->irq = pdev->irq;
  165392. + SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
  165393. + padapter = rtw_netdev_priv(pnetdev);
  165394. +
  165395. + //step 2. hook HalFunc, allocate HalData
  165396. + if (padapter->chip_type == RTL8188C_8192C) {
  165397. + #ifdef CONFIG_RTL8192C
  165398. + rtl8192ce_set_hal_ops(padapter);
  165399. + #endif
  165400. + } else if (padapter->chip_type == RTL8192D) {
  165401. + #ifdef CONFIG_RTL8192D
  165402. + rtl8192de_set_hal_ops(padapter);
  165403. + #endif
  165404. + } else {
  165405. + DBG_871X("Detect NULL_CHIP_TYPE\n");
  165406. + goto free_hal_data;
  165407. + }
  165408. +
  165409. + //step 3. initialize the dvobj_priv
  165410. + padapter->intf_start=&pci_intf_start;
  165411. + padapter->intf_stop=&pci_intf_stop;
  165412. +
  165413. +
  165414. + //.2
  165415. + if ((rtw_init_io_priv(padapter, pci_set_intf_ops)) == _FAIL) {
  165416. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n"));
  165417. + goto free_hal_data;
  165418. + }
  165419. +
  165420. + //.3
  165421. + rtw_hal_read_chip_version(padapter);
  165422. +
  165423. + //.4
  165424. + rtw_hal_chip_configure(padapter);
  165425. +
  165426. + //step 4. read efuse/eeprom data and get mac_addr
  165427. + rtw_hal_read_chip_info(padapter);
  165428. +
  165429. + if (rtw_handle_dualmac(padapter, 1) != _SUCCESS)
  165430. + goto free_hal_data;
  165431. +
  165432. +#ifdef CONFIG_IOCTL_CFG80211
  165433. + if(rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) {
  165434. + goto handle_dualmac;
  165435. + }
  165436. +#endif
  165437. +
  165438. + //step 5.
  165439. + if (rtw_init_drv_sw(padapter) == _FAIL) {
  165440. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n"));
  165441. + goto free_wdev;
  165442. + }
  165443. +
  165444. + status = rtw_hal_inirp_init(padapter);
  165445. + if(status ==_FAIL){
  165446. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize PCI desc ring Failed!\n"));
  165447. + goto free_drv_sw;
  165448. + }
  165449. +
  165450. + rtw_macaddr_cfg(padapter->eeprompriv.mac_addr);
  165451. + rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr);
  165452. +
  165453. +
  165454. + rtw_hal_disable_interrupt(padapter);
  165455. +
  165456. + //step 6. Init pci related configuration
  165457. + rtw_pci_initialize_adapter_common(padapter);
  165458. +
  165459. + DBG_871X("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n"
  165460. + ,padapter->bDriverStopped
  165461. + ,padapter->bSurpriseRemoved
  165462. + ,padapter->bup
  165463. + ,padapter->hw_init_completed
  165464. + );
  165465. +
  165466. + status = _SUCCESS;
  165467. +
  165468. +inirp_deinit:
  165469. + if (status != _SUCCESS)
  165470. + rtw_hal_inirp_deinit(padapter);
  165471. +free_drv_sw:
  165472. + if (status != _SUCCESS)
  165473. + rtw_free_drv_sw(padapter);
  165474. +free_wdev:
  165475. + if (status != _SUCCESS) {
  165476. + #ifdef CONFIG_IOCTL_CFG80211
  165477. + rtw_wdev_unregister(padapter->rtw_wdev);
  165478. + rtw_wdev_free(padapter->rtw_wdev);
  165479. + #endif
  165480. + }
  165481. +handle_dualmac:
  165482. + if (status != _SUCCESS)
  165483. + rtw_handle_dualmac(padapter, 0);
  165484. +free_hal_data:
  165485. + if (status != _SUCCESS && padapter->HalData)
  165486. + rtw_mfree(padapter->HalData, sizeof(*(padapter->HalData)));
  165487. +free_adapter:
  165488. + if (status != _SUCCESS) {
  165489. + if (pnetdev)
  165490. + rtw_free_netdev(pnetdev);
  165491. + else if (padapter)
  165492. + rtw_vmfree((u8*)padapter, sizeof(*padapter));
  165493. + padapter = NULL;
  165494. + }
  165495. +exit:
  165496. + return padapter;
  165497. +}
  165498. +
  165499. +static void rtw_pci_if1_deinit(_adapter *if1)
  165500. +{
  165501. + struct net_device *pnetdev = if1->pnetdev;
  165502. + struct mlme_priv *pmlmepriv= &if1->mlmepriv;
  165503. +
  165504. + // padapter->intf_stop(padapter);
  165505. +
  165506. + if(check_fwstate(pmlmepriv, _FW_LINKED))
  165507. + rtw_disassoc_cmd(if1, 0, _FALSE);
  165508. +
  165509. +#ifdef CONFIG_AP_MODE
  165510. + free_mlme_ap_info(if1);
  165511. + #ifdef CONFIG_HOSTAPD_MLME
  165512. + hostapd_mode_unload(if1);
  165513. + #endif
  165514. +#endif
  165515. +
  165516. + rtw_cancel_all_timer(if1);
  165517. +#ifdef CONFIG_WOWLAN
  165518. + if1->pwrctrlpriv.wowlan_mode=_FALSE;
  165519. +#endif //CONFIG_WOWLAN
  165520. + rtw_dev_unload(if1);
  165521. +
  165522. + DBG_871X("%s, hw_init_completed=%d\n", __func__, if1->hw_init_completed);
  165523. +
  165524. + //s6.
  165525. + rtw_handle_dualmac(if1, 0);
  165526. +
  165527. +#ifdef CONFIG_IOCTL_CFG80211
  165528. + if (if1->rtw_wdev)
  165529. + rtw_wdev_free(if1->rtw_wdev);
  165530. +#endif //CONFIG_IOCTL_CFG80211
  165531. +
  165532. + rtw_hal_inirp_deinit(if1);
  165533. + rtw_free_drv_sw(if1);
  165534. +
  165535. + if(pnetdev)
  165536. + rtw_free_netdev(pnetdev);
  165537. +
  165538. +#ifdef CONFIG_PLATFORM_RTD2880B
  165539. + DBG_871X("wlan link down\n");
  165540. + rtd2885_wlan_netlink_sendMsg("linkdown", "8712");
  165541. +#endif
  165542. +}
  165543. +
  165544. +/*
  165545. + * drv_init() - a device potentially for us
  165546. + *
  165547. + * notes: drv_init() is called when the bus driver has located a card for us to support.
  165548. + * We accept the new device by returning 0.
  165549. +*/
  165550. +static int rtw_drv_init(struct pci_dev *pdev, const struct pci_device_id *did)
  165551. +{
  165552. + int i, err = -ENODEV;
  165553. +
  165554. + int status;
  165555. + _adapter *if1 = NULL, *if2 = NULL;
  165556. + struct dvobj_priv *dvobj;
  165557. +
  165558. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n"));
  165559. +
  165560. + //step 0.
  165561. + disable_ht_for_spec_devid(did);
  165562. +
  165563. + /* Initialize dvobj_priv */
  165564. + if ((dvobj = pci_dvobj_init(pdev)) == NULL) {
  165565. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("initialize device object priv Failed!\n"));
  165566. + goto exit;
  165567. + }
  165568. +
  165569. + /* Initialize if1 */
  165570. + if ((if1 = rtw_pci_if1_init(dvobj, pdev, did)) == NULL) {
  165571. + DBG_871X("rtw_pci_if1_init Failed!\n");
  165572. + goto free_dvobj;
  165573. + }
  165574. +
  165575. + /* Initialize if2 */
  165576. +#ifdef CONFIG_CONCURRENT_MODE
  165577. + if((if2 = rtw_drv_if2_init(if1, pci_set_intf_ops)) == NULL) {
  165578. + goto free_if1;
  165579. + }
  165580. +#endif
  165581. +
  165582. +#ifdef CONFIG_GLOBAL_UI_PID
  165583. + if (ui_pid[1]!=0) {
  165584. + DBG_871X("ui_pid[1]:%d\n",ui_pid[1]);
  165585. + rtw_signal_process(ui_pid[1], SIGUSR2);
  165586. + }
  165587. +#endif
  165588. +
  165589. + //dev_alloc_name && register_netdev
  165590. + if((status = rtw_drv_register_netdev(if1)) != _SUCCESS) {
  165591. + goto free_if1;
  165592. + }
  165593. +
  165594. +#ifdef CONFIG_HOSTAPD_MLME
  165595. + hostapd_mode_init(if1);
  165596. +#endif
  165597. +
  165598. +#ifdef CONFIG_PLATFORM_RTD2880B
  165599. + DBG_871X("wlan link up\n");
  165600. + rtd2885_wlan_netlink_sendMsg("linkup", "8712");
  165601. +#endif
  165602. +
  165603. +#ifdef RTK_DMP_PLATFORM
  165604. + rtw_proc_init_one(if1->pnetdev);
  165605. +#endif
  165606. +
  165607. +
  165608. + /* alloc irq */
  165609. + if (pci_alloc_irq(dvobj) != _SUCCESS)
  165610. + goto free_if2;
  165611. +
  165612. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n"));
  165613. + //DBG_871X("-871x_drv - drv_init, success!\n");
  165614. +
  165615. + status = _SUCCESS;
  165616. +
  165617. +free_if2:
  165618. + if(status != _SUCCESS && if2) {
  165619. + #ifdef CONFIG_CONCURRENT_MODE
  165620. + rtw_drv_if2_stop(if2);
  165621. + rtw_drv_if2_free(if2);
  165622. + #endif
  165623. + }
  165624. +free_if1:
  165625. + if (status != _SUCCESS && if1) {
  165626. + rtw_pci_if1_deinit(if1);
  165627. + }
  165628. +free_dvobj:
  165629. + if (status != _SUCCESS)
  165630. + pci_dvobj_deinit(pdev);
  165631. +exit:
  165632. + return status == _SUCCESS?0:-ENODEV;
  165633. +}
  165634. +
  165635. +/*
  165636. + * dev_remove() - our device is being removed
  165637. +*/
  165638. +//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both
  165639. +static void rtw_dev_remove(struct pci_dev *pdev)
  165640. +{
  165641. + struct dvobj_priv *pdvobjpriv = pci_get_drvdata(pdev);
  165642. + _adapter *padapter = pdvobjpriv->if1;
  165643. + struct net_device *pnetdev = padapter->pnetdev;
  165644. +
  165645. +_func_exit_;
  165646. +
  165647. + DBG_871X("+rtw_dev_remove\n");
  165648. +
  165649. + pdvobjpriv->processing_dev_remove = _TRUE;
  165650. +
  165651. + if (unlikely(!padapter)) {
  165652. + return;
  165653. + }
  165654. +
  165655. + rtw_unregister_netdevs(pdvobjpriv);
  165656. +
  165657. + #if 0
  165658. +#ifdef RTK_DMP_PLATFORM
  165659. + padapter->bSurpriseRemoved = _FALSE; // always trate as device exists
  165660. + // this will let the driver to disable it's interrupt
  165661. +#else
  165662. + if(pci_drvpriv.drv_registered == _TRUE)
  165663. + {
  165664. + //DBG_871X("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n");
  165665. + padapter->bSurpriseRemoved = _TRUE;
  165666. + }
  165667. + /*else
  165668. + {
  165669. + //DBG_871X("r871xu_dev_remove():module removed\n");
  165670. + padapter->hw_init_completed = _FALSE;
  165671. + }*/
  165672. +#endif
  165673. + #endif
  165674. +
  165675. +#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
  165676. + rtw_unregister_early_suspend(&padapter->pwrctrlpriv);
  165677. +#endif
  165678. +
  165679. + rtw_pm_set_ips(padapter, IPS_NONE);
  165680. + rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
  165681. +
  165682. + LeaveAllPowerSaveMode(padapter);
  165683. +
  165684. + rtw_hal_disable_interrupt(padapter);
  165685. +
  165686. +#ifdef CONFIG_CONCURRENT_MODE
  165687. + rtw_drv_if2_stop(pdvobjpriv->if2);
  165688. +#endif //CONFIG_CONCURRENT_MODE
  165689. +
  165690. + rtw_pci_if1_deinit(padapter);
  165691. +
  165692. +#ifdef CONFIG_CONCURRENT_MODE
  165693. + rtw_drv_if2_free(pdvobjpriv->if2);
  165694. +#endif
  165695. +
  165696. + pci_dvobj_deinit(pdev);
  165697. +
  165698. + DBG_871X("-r871xu_dev_remove, done\n");
  165699. +
  165700. +_func_exit_;
  165701. + return;
  165702. +}
  165703. +
  165704. +
  165705. +static int __init rtw_drv_entry(void)
  165706. +{
  165707. + int ret = 0;
  165708. +
  165709. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n"));
  165710. + DBG_871X("rtw driver version=%s\n", DRIVERVERSION);
  165711. + DBG_871X("Build at: %s %s\n", __DATE__, __TIME__);
  165712. + pci_drvpriv.drv_registered = _TRUE;
  165713. +
  165714. + rtw_suspend_lock_init();
  165715. +
  165716. + ret = pci_register_driver(&pci_drvpriv.rtw_pci_drv);
  165717. + if (ret) {
  165718. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, (": No device found\n"));
  165719. + }
  165720. +
  165721. + return ret;
  165722. +}
  165723. +
  165724. +static void __exit rtw_drv_halt(void)
  165725. +{
  165726. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n"));
  165727. + DBG_871X("+rtw_drv_halt\n");
  165728. +
  165729. + pci_drvpriv.drv_registered = _FALSE;
  165730. +
  165731. + pci_unregister_driver(&pci_drvpriv.rtw_pci_drv);
  165732. +
  165733. + rtw_suspend_lock_uninit();
  165734. + DBG_871X("-rtw_drv_halt\n");
  165735. +
  165736. + rtw_mstat_dump();
  165737. +}
  165738. +
  165739. +
  165740. +module_init(rtw_drv_entry);
  165741. +module_exit(rtw_drv_halt);
  165742. --- /dev/null
  165743. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_ops_linux.c
  165744. @@ -0,0 +1,21 @@
  165745. +/******************************************************************************
  165746. + *
  165747. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  165748. + *
  165749. + * This program is free software; you can redistribute it and/or modify it
  165750. + * under the terms of version 2 of the GNU General Public License as
  165751. + * published by the Free Software Foundation.
  165752. + *
  165753. + * This program is distributed in the hope that it will be useful, but WITHOUT
  165754. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  165755. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  165756. + * more details.
  165757. + *
  165758. + * You should have received a copy of the GNU General Public License along with
  165759. + * this program; if not, write to the Free Software Foundation, Inc.,
  165760. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  165761. + *
  165762. + *******************************************************************************/
  165763. +#define _PCI_OPS_LINUX_C_
  165764. +
  165765. +#include <drv_types.h>
  165766. --- /dev/null
  165767. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c
  165768. @@ -0,0 +1,447 @@
  165769. +/******************************************************************************
  165770. + *
  165771. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  165772. + *
  165773. + * This program is free software; you can redistribute it and/or modify it
  165774. + * under the terms of version 2 of the GNU General Public License as
  165775. + * published by the Free Software Foundation.
  165776. + *
  165777. + * This program is distributed in the hope that it will be useful, but WITHOUT
  165778. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  165779. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  165780. + * more details.
  165781. + *
  165782. + * You should have received a copy of the GNU General Public License along with
  165783. + * this program; if not, write to the Free Software Foundation, Inc.,
  165784. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  165785. + *
  165786. + *
  165787. + ******************************************************************************/
  165788. +#define _RECV_OSDEP_C_
  165789. +
  165790. +#include <drv_conf.h>
  165791. +#include <osdep_service.h>
  165792. +#include <drv_types.h>
  165793. +
  165794. +#include <wifi.h>
  165795. +#include <recv_osdep.h>
  165796. +
  165797. +#include <osdep_intf.h>
  165798. +#include <ethernet.h>
  165799. +
  165800. +#ifdef CONFIG_USB_HCI
  165801. +#include <usb_ops.h>
  165802. +#endif
  165803. +
  165804. +//init os related resource in struct recv_priv
  165805. +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter)
  165806. +{
  165807. + int res=_SUCCESS;
  165808. +
  165809. + return res;
  165810. +}
  165811. +
  165812. +//alloc os related resource in union recv_frame
  165813. +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe)
  165814. +{
  165815. + int res=_SUCCESS;
  165816. +
  165817. + precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL;
  165818. +
  165819. + return res;
  165820. +
  165821. +}
  165822. +
  165823. +//free os related resource in union recv_frame
  165824. +void rtw_os_recv_resource_free(struct recv_priv *precvpriv)
  165825. +{
  165826. +
  165827. +}
  165828. +
  165829. +
  165830. +//alloc os related resource in struct recv_buf
  165831. +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf)
  165832. +{
  165833. + int res=_SUCCESS;
  165834. +
  165835. +#ifdef CONFIG_USB_HCI
  165836. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  165837. + struct usb_device *pusbd = pdvobjpriv->pusbdev;
  165838. +
  165839. + precvbuf->irp_pending = _FALSE;
  165840. + precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
  165841. + if(precvbuf->purb == NULL){
  165842. + res = _FAIL;
  165843. + }
  165844. +
  165845. + precvbuf->pskb = NULL;
  165846. +
  165847. + precvbuf->reuse = _FALSE;
  165848. +
  165849. + precvbuf->pallocated_buf = precvbuf->pbuf = NULL;
  165850. +
  165851. + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL;
  165852. +
  165853. + precvbuf->transfer_len = 0;
  165854. +
  165855. + precvbuf->len = 0;
  165856. +
  165857. + #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  165858. + precvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, &precvbuf->dma_transfer_addr);
  165859. + precvbuf->pbuf = precvbuf->pallocated_buf;
  165860. + if(precvbuf->pallocated_buf == NULL)
  165861. + return _FAIL;
  165862. + #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX
  165863. +
  165864. +#endif //CONFIG_USB_HCI
  165865. +
  165866. + return res;
  165867. +}
  165868. +
  165869. +//free os related resource in struct recv_buf
  165870. +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)
  165871. +{
  165872. + int ret = _SUCCESS;
  165873. +
  165874. +#ifdef CONFIG_USB_HCI
  165875. +
  165876. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  165877. +
  165878. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  165879. + struct usb_device *pusbd = pdvobjpriv->pusbdev;
  165880. +
  165881. + rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr);
  165882. + precvbuf->pallocated_buf = NULL;
  165883. + precvbuf->dma_transfer_addr = 0;
  165884. +
  165885. +#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX
  165886. +
  165887. + if(precvbuf->purb)
  165888. + {
  165889. + //usb_kill_urb(precvbuf->purb);
  165890. + usb_free_urb(precvbuf->purb);
  165891. + }
  165892. +
  165893. +#endif //CONFIG_USB_HCI
  165894. +
  165895. +
  165896. + if(precvbuf->pskb)
  165897. + rtw_skb_free(precvbuf->pskb);
  165898. +
  165899. +
  165900. + return ret;
  165901. +
  165902. +}
  165903. +
  165904. +void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup)
  165905. +{
  165906. +#ifdef CONFIG_IOCTL_CFG80211
  165907. + enum nl80211_key_type key_type;
  165908. +#endif
  165909. + union iwreq_data wrqu;
  165910. + struct iw_michaelmicfailure ev;
  165911. + struct mlme_priv* pmlmepriv = &padapter->mlmepriv;
  165912. + struct security_priv *psecuritypriv = &padapter->securitypriv;
  165913. + u32 cur_time = 0;
  165914. +
  165915. + if( psecuritypriv->last_mic_err_time == 0 )
  165916. + {
  165917. + psecuritypriv->last_mic_err_time = rtw_get_current_time();
  165918. + }
  165919. + else
  165920. + {
  165921. + cur_time = rtw_get_current_time();
  165922. +
  165923. + if( cur_time - psecuritypriv->last_mic_err_time < 60*HZ )
  165924. + {
  165925. + psecuritypriv->btkip_countermeasure = _TRUE;
  165926. + psecuritypriv->last_mic_err_time = 0;
  165927. + psecuritypriv->btkip_countermeasure_time = cur_time;
  165928. + }
  165929. + else
  165930. + {
  165931. + psecuritypriv->last_mic_err_time = rtw_get_current_time();
  165932. + }
  165933. + }
  165934. +
  165935. +#ifdef CONFIG_IOCTL_CFG80211
  165936. + if ( bgroup )
  165937. + {
  165938. + key_type |= NL80211_KEYTYPE_GROUP;
  165939. + }
  165940. + else
  165941. + {
  165942. + key_type |= NL80211_KEYTYPE_PAIRWISE;
  165943. + }
  165944. +
  165945. + cfg80211_michael_mic_failure(padapter->pnetdev, (u8 *)&pmlmepriv->assoc_bssid[ 0 ], key_type, -1,
  165946. + NULL, GFP_ATOMIC);
  165947. +#endif
  165948. +
  165949. + _rtw_memset( &ev, 0x00, sizeof( ev ) );
  165950. + if ( bgroup )
  165951. + {
  165952. + ev.flags |= IW_MICFAILURE_GROUP;
  165953. + }
  165954. + else
  165955. + {
  165956. + ev.flags |= IW_MICFAILURE_PAIRWISE;
  165957. + }
  165958. +
  165959. + ev.src_addr.sa_family = ARPHRD_ETHER;
  165960. + _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
  165961. +
  165962. + _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) );
  165963. + wrqu.data.length = sizeof( ev );
  165964. +
  165965. + wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev );
  165966. +}
  165967. +
  165968. +void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame)
  165969. +{
  165970. +#ifdef CONFIG_HOSTAPD_MLME
  165971. + _pkt *skb;
  165972. + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv;
  165973. + struct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev;
  165974. +
  165975. + RT_TRACE(_module_recv_osdep_c_, _drv_info_, ("+rtw_hostapd_mlme_rx\n"));
  165976. +
  165977. + skb = precv_frame->u.hdr.pkt;
  165978. +
  165979. + if (skb == NULL)
  165980. + return;
  165981. +
  165982. + skb->data = precv_frame->u.hdr.rx_data;
  165983. + skb->tail = precv_frame->u.hdr.rx_tail;
  165984. + skb->len = precv_frame->u.hdr.len;
  165985. +
  165986. + //pskb_copy = rtw_skb_copy(skb);
  165987. +// if(skb == NULL) goto _exit;
  165988. +
  165989. + skb->dev = pmgnt_netdev;
  165990. + skb->ip_summed = CHECKSUM_NONE;
  165991. + skb->pkt_type = PACKET_OTHERHOST;
  165992. + //skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/
  165993. + skb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/
  165994. +
  165995. + //DBG_871X("(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\n", skb->data, skb->head, skb->tail, skb->mac_header, skb->len);
  165996. +
  165997. + //skb->mac.raw = skb->data;
  165998. + skb_reset_mac_header(skb);
  165999. +
  166000. + //skb_pull(skb, 24);
  166001. + _rtw_memset(skb->cb, 0, sizeof(skb->cb));
  166002. +
  166003. + rtw_netif_rx(pmgnt_netdev, skb);
  166004. +
  166005. + precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call rtw_netif_rx()
  166006. +#endif
  166007. +}
  166008. +
  166009. +int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
  166010. +{
  166011. + struct recv_priv *precvpriv;
  166012. + _queue *pfree_recv_queue;
  166013. + _pkt *skb;
  166014. + struct mlme_priv*pmlmepriv = &padapter->mlmepriv;
  166015. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  166016. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  166017. +#endif
  166018. +
  166019. +#ifdef CONFIG_BR_EXT
  166020. + void *br_port = NULL;
  166021. +#endif
  166022. +
  166023. +_func_enter_;
  166024. +
  166025. + precvpriv = &(padapter->recvpriv);
  166026. + pfree_recv_queue = &(precvpriv->free_recv_queue);
  166027. +
  166028. +#ifdef CONFIG_DRVEXT_MODULE
  166029. + if (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS)
  166030. + {
  166031. + goto _recv_indicatepkt_drop;
  166032. + }
  166033. +#endif
  166034. +
  166035. + skb = precv_frame->u.hdr.pkt;
  166036. + if(skb == NULL)
  166037. + {
  166038. + RT_TRACE(_module_recv_osdep_c_,_drv_err_,("rtw_recv_indicatepkt():skb==NULL something wrong!!!!\n"));
  166039. + goto _recv_indicatepkt_drop;
  166040. + }
  166041. +
  166042. + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():skb != NULL !!!\n"));
  166043. + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p precv_frame->hdr.rx_data=%p\n", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data));
  166044. + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \n", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len));
  166045. +
  166046. + skb->data = precv_frame->u.hdr.rx_data;
  166047. +
  166048. + skb_set_tail_pointer(skb, precv_frame->u.hdr.len);
  166049. +
  166050. + skb->len = precv_frame->u.hdr.len;
  166051. +
  166052. + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\n", skb->head, skb->data, skb->tail, skb->end, skb->len));
  166053. +
  166054. + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
  166055. + {
  166056. + _pkt *pskb2=NULL;
  166057. + struct sta_info *psta = NULL;
  166058. + struct sta_priv *pstapriv = &padapter->stapriv;
  166059. + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  166060. + int bmcast = IS_MCAST(pattrib->dst);
  166061. +
  166062. + //DBG_871X("bmcast=%d\n", bmcast);
  166063. +
  166064. + if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE)
  166065. + {
  166066. + //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst);
  166067. +
  166068. + if(bmcast)
  166069. + {
  166070. + psta = rtw_get_bcmc_stainfo(padapter);
  166071. + pskb2 = rtw_skb_clone(skb);
  166072. + } else {
  166073. + psta = rtw_get_stainfo(pstapriv, pattrib->dst);
  166074. + }
  166075. +
  166076. + if(psta)
  166077. + {
  166078. + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;
  166079. +
  166080. + //DBG_871X("directly forwarding to the rtw_xmit_entry\n");
  166081. +
  166082. + //skb->ip_summed = CHECKSUM_NONE;
  166083. + skb->dev = pnetdev;
  166084. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  166085. + skb_set_queue_mapping(skb, rtw_recv_select_queue(skb));
  166086. +#endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)
  166087. +
  166088. + _rtw_xmit_entry(skb, pnetdev);
  166089. +
  166090. + if(bmcast)
  166091. + skb = pskb2;
  166092. + else
  166093. + goto _recv_indicatepkt_end;
  166094. + }
  166095. +
  166096. +
  166097. + }
  166098. + else// to APself
  166099. + {
  166100. + //DBG_871X("to APSelf\n");
  166101. + }
  166102. + }
  166103. +
  166104. +
  166105. +#ifdef CONFIG_BR_EXT
  166106. +
  166107. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  166108. + br_port = padapter->pnetdev->br_port;
  166109. +#else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  166110. + rcu_read_lock();
  166111. + br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  166112. + rcu_read_unlock();
  166113. +#endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  166114. +
  166115. + if( br_port && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )
  166116. + {
  166117. + int nat25_handle_frame(_adapter *priv, struct sk_buff *skb);
  166118. + if (nat25_handle_frame(padapter, skb) == -1) {
  166119. + //priv->ext_stats.rx_data_drops++;
  166120. + //DEBUG_ERR("RX DROP: nat25_handle_frame fail!\n");
  166121. + //return FAIL;
  166122. +#if 1
  166123. + // bypass this frame to upper layer!!
  166124. +#else
  166125. + goto _recv_indicatepkt_drop;
  166126. +#endif
  166127. + }
  166128. + }
  166129. +
  166130. +#endif // CONFIG_BR_EXT
  166131. +
  166132. +
  166133. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
  166134. + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) {
  166135. + skb->ip_summed = CHECKSUM_UNNECESSARY;
  166136. + //DBG_871X("CHECKSUM_UNNECESSARY \n");
  166137. + } else {
  166138. + skb->ip_summed = CHECKSUM_NONE;
  166139. + //DBG_871X("CHECKSUM_NONE(%d, %d) \n", pattrib->tcpchk_valid, pattrib->tcp_chkrpt);
  166140. + }
  166141. +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */
  166142. +
  166143. + skb->ip_summed = CHECKSUM_NONE;
  166144. +
  166145. +#endif
  166146. +
  166147. + skb->dev = padapter->pnetdev;
  166148. + skb->protocol = eth_type_trans(skb, padapter->pnetdev);
  166149. +
  166150. + rtw_netif_rx(padapter->pnetdev, skb);
  166151. +
  166152. +_recv_indicatepkt_end:
  166153. +
  166154. + precv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe()
  166155. +
  166156. + rtw_free_recvframe(precv_frame, pfree_recv_queue);
  166157. +
  166158. + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after rtw_netif_rx!!!!\n"));
  166159. +
  166160. +_func_exit_;
  166161. +
  166162. + return _SUCCESS;
  166163. +
  166164. +_recv_indicatepkt_drop:
  166165. +
  166166. + //enqueue back to free_recv_queue
  166167. + if(precv_frame)
  166168. + rtw_free_recvframe(precv_frame, pfree_recv_queue);
  166169. +
  166170. + return _FAIL;
  166171. +
  166172. +_func_exit_;
  166173. +
  166174. +}
  166175. +
  166176. +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf)
  166177. +{
  166178. + struct recv_priv *precvpriv = &padapter->recvpriv;
  166179. +
  166180. +#ifdef CONFIG_USB_HCI
  166181. +
  166182. + precvbuf->ref_cnt--;
  166183. +
  166184. + //free skb in recv_buf
  166185. + rtw_skb_free(precvbuf->pskb);
  166186. +
  166187. + precvbuf->pskb = NULL;
  166188. + precvbuf->reuse = _FALSE;
  166189. +
  166190. + if(precvbuf->irp_pending == _FALSE)
  166191. + {
  166192. + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
  166193. + }
  166194. +
  166195. +
  166196. +#endif
  166197. +#ifdef CONFIG_SDIO_HCI
  166198. + precvbuf->pskb = NULL;
  166199. +#endif
  166200. +
  166201. +}
  166202. +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext);
  166203. +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext)
  166204. +{
  166205. + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext;
  166206. + rtw_reordering_ctrl_timeout_handler(preorder_ctrl);
  166207. +}
  166208. +
  166209. +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
  166210. +{
  166211. + _adapter *padapter = preorder_ctrl->padapter;
  166212. +
  166213. + _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl);
  166214. +
  166215. +}
  166216. --- /dev/null
  166217. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c
  166218. @@ -0,0 +1,838 @@
  166219. +/******************************************************************************
  166220. + *
  166221. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  166222. + *
  166223. + * This program is free software; you can redistribute it and/or modify it
  166224. + * under the terms of version 2 of the GNU General Public License as
  166225. + * published by the Free Software Foundation.
  166226. + *
  166227. + * This program is distributed in the hope that it will be useful, but WITHOUT
  166228. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  166229. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  166230. + * more details.
  166231. + *
  166232. + * You should have received a copy of the GNU General Public License along with
  166233. + * this program; if not, write to the Free Software Foundation, Inc.,
  166234. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  166235. + *
  166236. + *
  166237. + ******************************************************************************/
  166238. +
  166239. +#include <linux/module.h>
  166240. +#include <linux/netdevice.h>
  166241. +
  166242. +#include <rtw_android.h>
  166243. +#include <osdep_service.h>
  166244. +#include <rtw_debug.h>
  166245. +#include <ioctl_cfg80211.h>
  166246. +#include <rtw_ioctl_set.h>
  166247. +
  166248. +#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
  166249. +#include <linux/platform_device.h>
  166250. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
  166251. +#include <linux/wlan_plat.h>
  166252. +#else
  166253. +#include <linux/wifi_tiwlan.h>
  166254. +#endif
  166255. +#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */
  166256. +
  166257. +const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
  166258. + "START",
  166259. + "STOP",
  166260. + "SCAN-ACTIVE",
  166261. + "SCAN-PASSIVE",
  166262. + "RSSI",
  166263. + "LINKSPEED",
  166264. + "RXFILTER-START",
  166265. + "RXFILTER-STOP",
  166266. + "RXFILTER-ADD",
  166267. + "RXFILTER-REMOVE",
  166268. + "BTCOEXSCAN-START",
  166269. + "BTCOEXSCAN-STOP",
  166270. + "BTCOEXMODE",
  166271. + "SETSUSPENDOPT",
  166272. + "P2P_DEV_ADDR",
  166273. + "SETFWPATH",
  166274. + "SETBAND",
  166275. + "GETBAND",
  166276. + "COUNTRY",
  166277. + "P2P_SET_NOA",
  166278. + "P2P_GET_NOA",
  166279. + "P2P_SET_PS",
  166280. + "SET_AP_WPS_P2P_IE",
  166281. +#ifdef PNO_SUPPORT
  166282. + "PNOSSIDCLR",
  166283. + "PNOSETUP ",
  166284. + "PNOFORCE",
  166285. + "PNODEBUG",
  166286. +#endif
  166287. +
  166288. + "MACADDR",
  166289. +
  166290. + "BLOCK",
  166291. + "WFD-ENABLE",
  166292. + "WFD-DISABLE",
  166293. + "WFD-SET-TCPPORT",
  166294. + "WFD-SET-MAXTPUT",
  166295. + "WFD-SET-DEVTYPE",
  166296. +};
  166297. +
  166298. +#ifdef PNO_SUPPORT
  166299. +#define PNO_TLV_PREFIX 'S'
  166300. +#define PNO_TLV_VERSION '1'
  166301. +#define PNO_TLV_SUBVERSION '2'
  166302. +#define PNO_TLV_RESERVED '0'
  166303. +#define PNO_TLV_TYPE_SSID_IE 'S'
  166304. +#define PNO_TLV_TYPE_TIME 'T'
  166305. +#define PNO_TLV_FREQ_REPEAT 'R'
  166306. +#define PNO_TLV_FREQ_EXPO_MAX 'M'
  166307. +
  166308. +typedef struct cmd_tlv {
  166309. + char prefix;
  166310. + char version;
  166311. + char subver;
  166312. + char reserved;
  166313. +} cmd_tlv_t;
  166314. +#endif /* PNO_SUPPORT */
  166315. +
  166316. +typedef struct android_wifi_priv_cmd {
  166317. +
  166318. +#ifdef CONFIG_COMPAT
  166319. + compat_uptr_t buf;
  166320. +#else
  166321. + char *buf;
  166322. +#endif
  166323. +
  166324. + int used_len;
  166325. + int total_len;
  166326. +} android_wifi_priv_cmd;
  166327. +
  166328. +/**
  166329. + * Local (static) functions and variables
  166330. + */
  166331. +
  166332. +/* Initialize g_wifi_on to 1 so dhd_bus_start will be called for the first
  166333. + * time (only) in dhd_open, subsequential wifi on will be handled by
  166334. + * wl_android_wifi_on
  166335. + */
  166336. +static int g_wifi_on = _TRUE;
  166337. +
  166338. +
  166339. +#ifdef PNO_SUPPORT
  166340. +static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len)
  166341. +{
  166342. + wlc_ssid_t ssids_local[MAX_PFN_LIST_COUNT];
  166343. + int res = -1;
  166344. + int nssid = 0;
  166345. + cmd_tlv_t *cmd_tlv_temp;
  166346. + char *str_ptr;
  166347. + int tlv_size_left;
  166348. + int pno_time = 0;
  166349. + int pno_repeat = 0;
  166350. + int pno_freq_expo_max = 0;
  166351. +
  166352. +#ifdef PNO_SET_DEBUG
  166353. + int i;
  166354. + char pno_in_example[] = {
  166355. + 'P', 'N', 'O', 'S', 'E', 'T', 'U', 'P', ' ',
  166356. + 'S', '1', '2', '0',
  166357. + 'S',
  166358. + 0x05,
  166359. + 'd', 'l', 'i', 'n', 'k',
  166360. + 'S',
  166361. + 0x04,
  166362. + 'G', 'O', 'O', 'G',
  166363. + 'T',
  166364. + '0', 'B',
  166365. + 'R',
  166366. + '2',
  166367. + 'M',
  166368. + '2',
  166369. + 0x00
  166370. + };
  166371. +#endif /* PNO_SET_DEBUG */
  166372. +
  166373. + DHD_INFO(("%s: command=%s, len=%d\n", __FUNCTION__, command, total_len));
  166374. +
  166375. + if (total_len < (strlen(CMD_PNOSETUP_SET) + sizeof(cmd_tlv_t))) {
  166376. + DBG_871X("%s argument=%d less min size\n", __FUNCTION__, total_len);
  166377. + goto exit_proc;
  166378. + }
  166379. +
  166380. +#ifdef PNO_SET_DEBUG
  166381. + memcpy(command, pno_in_example, sizeof(pno_in_example));
  166382. + for (i = 0; i < sizeof(pno_in_example); i++)
  166383. + printf("%02X ", command[i]);
  166384. + printf("\n");
  166385. + total_len = sizeof(pno_in_example);
  166386. +#endif
  166387. +
  166388. + str_ptr = command + strlen(CMD_PNOSETUP_SET);
  166389. + tlv_size_left = total_len - strlen(CMD_PNOSETUP_SET);
  166390. +
  166391. + cmd_tlv_temp = (cmd_tlv_t *)str_ptr;
  166392. + memset(ssids_local, 0, sizeof(ssids_local));
  166393. +
  166394. + if ((cmd_tlv_temp->prefix == PNO_TLV_PREFIX) &&
  166395. + (cmd_tlv_temp->version == PNO_TLV_VERSION) &&
  166396. + (cmd_tlv_temp->subver == PNO_TLV_SUBVERSION)) {
  166397. +
  166398. + str_ptr += sizeof(cmd_tlv_t);
  166399. + tlv_size_left -= sizeof(cmd_tlv_t);
  166400. +
  166401. + if ((nssid = wl_iw_parse_ssid_list_tlv(&str_ptr, ssids_local,
  166402. + MAX_PFN_LIST_COUNT, &tlv_size_left)) <= 0) {
  166403. + DBG_871X("SSID is not presented or corrupted ret=%d\n", nssid);
  166404. + goto exit_proc;
  166405. + } else {
  166406. + if ((str_ptr[0] != PNO_TLV_TYPE_TIME) || (tlv_size_left <= 1)) {
  166407. + DBG_871X("%s scan duration corrupted field size %d\n",
  166408. + __FUNCTION__, tlv_size_left);
  166409. + goto exit_proc;
  166410. + }
  166411. + str_ptr++;
  166412. + pno_time = simple_strtoul(str_ptr, &str_ptr, 16);
  166413. + DHD_INFO(("%s: pno_time=%d\n", __FUNCTION__, pno_time));
  166414. +
  166415. + if (str_ptr[0] != 0) {
  166416. + if ((str_ptr[0] != PNO_TLV_FREQ_REPEAT)) {
  166417. + DBG_871X("%s pno repeat : corrupted field\n",
  166418. + __FUNCTION__);
  166419. + goto exit_proc;
  166420. + }
  166421. + str_ptr++;
  166422. + pno_repeat = simple_strtoul(str_ptr, &str_ptr, 16);
  166423. + DHD_INFO(("%s :got pno_repeat=%d\n", __FUNCTION__, pno_repeat));
  166424. + if (str_ptr[0] != PNO_TLV_FREQ_EXPO_MAX) {
  166425. + DBG_871X("%s FREQ_EXPO_MAX corrupted field size\n",
  166426. + __FUNCTION__);
  166427. + goto exit_proc;
  166428. + }
  166429. + str_ptr++;
  166430. + pno_freq_expo_max = simple_strtoul(str_ptr, &str_ptr, 16);
  166431. + DHD_INFO(("%s: pno_freq_expo_max=%d\n",
  166432. + __FUNCTION__, pno_freq_expo_max));
  166433. + }
  166434. + }
  166435. + } else {
  166436. + DBG_871X("%s get wrong TLV command\n", __FUNCTION__);
  166437. + goto exit_proc;
  166438. + }
  166439. +
  166440. + res = dhd_dev_pno_set(dev, ssids_local, nssid, pno_time, pno_repeat, pno_freq_expo_max);
  166441. +
  166442. +exit_proc:
  166443. + return res;
  166444. +}
  166445. +#endif /* PNO_SUPPORT */
  166446. +
  166447. +int rtw_android_cmdstr_to_num(char *cmdstr)
  166448. +{
  166449. + int cmd_num;
  166450. + for(cmd_num=0 ; cmd_num<ANDROID_WIFI_CMD_MAX; cmd_num++)
  166451. + if(0 == strnicmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )
  166452. + break;
  166453. +
  166454. + return cmd_num;
  166455. +}
  166456. +
  166457. +int rtw_android_get_rssi(struct net_device *net, char *command, int total_len)
  166458. +{
  166459. + _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
  166460. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  166461. + struct wlan_network *pcur_network = &pmlmepriv->cur_network;
  166462. + int bytes_written = 0;
  166463. +
  166464. + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  166465. + bytes_written += snprintf(&command[bytes_written], total_len, "%s rssi %d",
  166466. + pcur_network->network.Ssid.Ssid, padapter->recvpriv.rssi);
  166467. + }
  166468. +
  166469. + return bytes_written;
  166470. +}
  166471. +
  166472. +int rtw_android_get_link_speed(struct net_device *net, char *command, int total_len)
  166473. +{
  166474. + _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
  166475. + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  166476. + struct wlan_network *pcur_network = &pmlmepriv->cur_network;
  166477. + int bytes_written = 0;
  166478. + u16 link_speed = 0;
  166479. +
  166480. + link_speed = rtw_get_cur_max_rate(padapter)/10;
  166481. + bytes_written = snprintf(command, total_len, "LinkSpeed %d", link_speed);
  166482. +
  166483. + return bytes_written;
  166484. +}
  166485. +
  166486. +int rtw_android_get_macaddr(struct net_device *net, char *command, int total_len)
  166487. +{
  166488. + _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
  166489. + int bytes_written = 0;
  166490. +
  166491. + bytes_written = snprintf(command, total_len, "Macaddr = "MAC_FMT, MAC_ARG(net->dev_addr));
  166492. + return bytes_written;
  166493. +}
  166494. +
  166495. +int rtw_android_set_country(struct net_device *net, char *command, int total_len)
  166496. +{
  166497. + _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
  166498. + char *country_code = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_COUNTRY]) + 1;
  166499. + int ret = _FAIL;
  166500. +
  166501. + ret = rtw_set_country(adapter, country_code);
  166502. +
  166503. + return (ret==_SUCCESS)?0:-1;
  166504. +}
  166505. +
  166506. +int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int total_len)
  166507. +{
  166508. + int bytes_written = 0;
  166509. +
  166510. + //We use the same address as our HW MAC address
  166511. + _rtw_memcpy(command, net->dev_addr, ETH_ALEN);
  166512. +
  166513. + bytes_written = ETH_ALEN;
  166514. + return bytes_written;
  166515. +}
  166516. +
  166517. +int rtw_android_set_block(struct net_device *net, char *command, int total_len)
  166518. +{
  166519. + _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
  166520. + char *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK]) + 1;
  166521. +
  166522. + #ifdef CONFIG_IOCTL_CFG80211
  166523. + wdev_to_priv(adapter->rtw_wdev)->block = (*block_value=='0')?_FALSE:_TRUE;
  166524. + #endif
  166525. +
  166526. + return 0;
  166527. +}
  166528. +
  166529. +int rtw_android_setband(struct net_device *net, char *command, int total_len)
  166530. +{
  166531. + _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
  166532. + char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_SETBAND]) + 1;
  166533. + u32 band = GHZ_MAX;
  166534. + int ret = _FAIL;
  166535. +
  166536. + sscanf(arg, "%u", &band);
  166537. + ret = rtw_set_band(adapter, band);
  166538. +
  166539. + return (ret==_SUCCESS)?0:-1;
  166540. +}
  166541. +
  166542. +int rtw_android_getband(struct net_device *net, char *command, int total_len)
  166543. +{
  166544. + _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
  166545. + int bytes_written = 0;
  166546. +
  166547. + bytes_written = snprintf(command, total_len, "%u", adapter->setband);
  166548. +
  166549. + return bytes_written;
  166550. +}
  166551. +
  166552. +int get_int_from_command( char* pcmd )
  166553. +{
  166554. + int i = 0;
  166555. +
  166556. + for( i = 0; i < strlen( pcmd ); i++ )
  166557. + {
  166558. + if ( pcmd[ i ] == '=' )
  166559. + {
  166560. + // Skip the '=' and space characters.
  166561. + i += 2;
  166562. + break;
  166563. + }
  166564. + }
  166565. + return ( rtw_atoi( pcmd + i ) );
  166566. +}
  166567. +
  166568. +int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
  166569. +{
  166570. + int ret = 0;
  166571. + char *command = NULL;
  166572. + int cmd_num;
  166573. + int bytes_written = 0;
  166574. + android_wifi_priv_cmd priv_cmd;
  166575. +
  166576. + rtw_lock_suspend();
  166577. +
  166578. + if (!ifr->ifr_data) {
  166579. + ret = -EINVAL;
  166580. + goto exit;
  166581. + }
  166582. + if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) {
  166583. + ret = -EFAULT;
  166584. + goto exit;
  166585. + }
  166586. +
  166587. + command = rtw_zmalloc(priv_cmd.total_len);
  166588. + if (!command)
  166589. + {
  166590. + DBG_871X("%s: failed to allocate memory\n", __FUNCTION__);
  166591. + ret = -ENOMEM;
  166592. + goto exit;
  166593. + }
  166594. +
  166595. + if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)){
  166596. + DBG_871X("%s: failed to access memory\n", __FUNCTION__);
  166597. + ret = -EFAULT;
  166598. + goto exit;
  166599. + }
  166600. + if (copy_from_user(command, (void *)priv_cmd.buf, priv_cmd.total_len)) {
  166601. + ret = -EFAULT;
  166602. + goto exit;
  166603. + }
  166604. +
  166605. + DBG_871X("%s: Android private cmd \"%s\" on %s\n"
  166606. + , __FUNCTION__, command, ifr->ifr_name);
  166607. +
  166608. + cmd_num = rtw_android_cmdstr_to_num(command);
  166609. +
  166610. + switch(cmd_num) {
  166611. + case ANDROID_WIFI_CMD_START:
  166612. + //bytes_written = wl_android_wifi_on(net);
  166613. + goto response;
  166614. + case ANDROID_WIFI_CMD_SETFWPATH:
  166615. + goto response;
  166616. + }
  166617. +
  166618. + if (!g_wifi_on) {
  166619. + DBG_871X("%s: Ignore private cmd \"%s\" - iface %s is down\n"
  166620. + ,__FUNCTION__, command, ifr->ifr_name);
  166621. + ret = 0;
  166622. + goto exit;
  166623. + }
  166624. +
  166625. + switch(cmd_num) {
  166626. +
  166627. + case ANDROID_WIFI_CMD_STOP:
  166628. + //bytes_written = wl_android_wifi_off(net);
  166629. + break;
  166630. +
  166631. + case ANDROID_WIFI_CMD_SCAN_ACTIVE:
  166632. + //rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_ACTIVE);
  166633. +#ifdef CONFIG_PLATFORM_MSTAR
  166634. +#ifdef CONFIG_IOCTL_CFG80211
  166635. + (wdev_to_priv(net->ieee80211_ptr))->bandroid_scan = _TRUE;
  166636. +#endif //CONFIG_IOCTL_CFG80211
  166637. +#endif //CONFIG_PLATFORM_MSTAR
  166638. + break;
  166639. + case ANDROID_WIFI_CMD_SCAN_PASSIVE:
  166640. + //rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_PASSIVE);
  166641. + break;
  166642. +
  166643. + case ANDROID_WIFI_CMD_RSSI:
  166644. + bytes_written = rtw_android_get_rssi(net, command, priv_cmd.total_len);
  166645. + break;
  166646. + case ANDROID_WIFI_CMD_LINKSPEED:
  166647. + bytes_written = rtw_android_get_link_speed(net, command, priv_cmd.total_len);
  166648. + break;
  166649. +
  166650. + case ANDROID_WIFI_CMD_MACADDR:
  166651. + bytes_written = rtw_android_get_macaddr(net, command, priv_cmd.total_len);
  166652. + break;
  166653. +
  166654. + case ANDROID_WIFI_CMD_BLOCK:
  166655. + bytes_written = rtw_android_set_block(net, command, priv_cmd.total_len);
  166656. + break;
  166657. +
  166658. + case ANDROID_WIFI_CMD_RXFILTER_START:
  166659. + //bytes_written = net_os_set_packet_filter(net, 1);
  166660. + break;
  166661. + case ANDROID_WIFI_CMD_RXFILTER_STOP:
  166662. + //bytes_written = net_os_set_packet_filter(net, 0);
  166663. + break;
  166664. + case ANDROID_WIFI_CMD_RXFILTER_ADD:
  166665. + //int filter_num = *(command + strlen(CMD_RXFILTER_ADD) + 1) - '0';
  166666. + //bytes_written = net_os_rxfilter_add_remove(net, TRUE, filter_num);
  166667. + break;
  166668. + case ANDROID_WIFI_CMD_RXFILTER_REMOVE:
  166669. + //int filter_num = *(command + strlen(CMD_RXFILTER_REMOVE) + 1) - '0';
  166670. + //bytes_written = net_os_rxfilter_add_remove(net, FALSE, filter_num);
  166671. + break;
  166672. +
  166673. + case ANDROID_WIFI_CMD_BTCOEXSCAN_START:
  166674. + /* TBD: BTCOEXSCAN-START */
  166675. + break;
  166676. + case ANDROID_WIFI_CMD_BTCOEXSCAN_STOP:
  166677. + /* TBD: BTCOEXSCAN-STOP */
  166678. + break;
  166679. + case ANDROID_WIFI_CMD_BTCOEXMODE:
  166680. + #if 0
  166681. + uint mode = *(command + strlen(CMD_BTCOEXMODE) + 1) - '0';
  166682. + if (mode == 1)
  166683. + net_os_set_packet_filter(net, 0); /* DHCP starts */
  166684. + else
  166685. + net_os_set_packet_filter(net, 1); /* DHCP ends */
  166686. +#ifdef WL_CFG80211
  166687. + bytes_written = wl_cfg80211_set_btcoex_dhcp(net, command);
  166688. +#endif
  166689. + #endif
  166690. + break;
  166691. +
  166692. + case ANDROID_WIFI_CMD_SETSUSPENDOPT:
  166693. + //bytes_written = wl_android_set_suspendopt(net, command, priv_cmd.total_len);
  166694. + break;
  166695. +
  166696. + case ANDROID_WIFI_CMD_SETBAND:
  166697. + bytes_written = rtw_android_setband(net, command, priv_cmd.total_len);
  166698. + break;
  166699. +
  166700. + case ANDROID_WIFI_CMD_GETBAND:
  166701. + bytes_written = rtw_android_getband(net, command, priv_cmd.total_len);
  166702. + break;
  166703. +
  166704. + case ANDROID_WIFI_CMD_COUNTRY:
  166705. + bytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);
  166706. + break;
  166707. +
  166708. +#ifdef PNO_SUPPORT
  166709. + case ANDROID_WIFI_CMD_PNOSSIDCLR_SET:
  166710. + //bytes_written = dhd_dev_pno_reset(net);
  166711. + break;
  166712. + case ANDROID_WIFI_CMD_PNOSETUP_SET:
  166713. + //bytes_written = wl_android_set_pno_setup(net, command, priv_cmd.total_len);
  166714. + break;
  166715. + case ANDROID_WIFI_CMD_PNOENABLE_SET:
  166716. + //uint pfn_enabled = *(command + strlen(CMD_PNOENABLE_SET) + 1) - '0';
  166717. + //bytes_written = dhd_dev_pno_enable(net, pfn_enabled);
  166718. + break;
  166719. +#endif
  166720. +
  166721. + case ANDROID_WIFI_CMD_P2P_DEV_ADDR:
  166722. + bytes_written = rtw_android_get_p2p_dev_addr(net, command, priv_cmd.total_len);
  166723. + break;
  166724. + case ANDROID_WIFI_CMD_P2P_SET_NOA:
  166725. + //int skip = strlen(CMD_P2P_SET_NOA) + 1;
  166726. + //bytes_written = wl_cfg80211_set_p2p_noa(net, command + skip, priv_cmd.total_len - skip);
  166727. + break;
  166728. + case ANDROID_WIFI_CMD_P2P_GET_NOA:
  166729. + //bytes_written = wl_cfg80211_get_p2p_noa(net, command, priv_cmd.total_len);
  166730. + break;
  166731. + case ANDROID_WIFI_CMD_P2P_SET_PS:
  166732. + //int skip = strlen(CMD_P2P_SET_PS) + 1;
  166733. + //bytes_written = wl_cfg80211_set_p2p_ps(net, command + skip, priv_cmd.total_len - skip);
  166734. + break;
  166735. +
  166736. +#ifdef CONFIG_IOCTL_CFG80211
  166737. + case ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE:
  166738. + {
  166739. + int skip = strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE]) + 3;
  166740. + bytes_written = rtw_cfg80211_set_mgnt_wpsp2pie(net, command + skip, priv_cmd.total_len - skip, *(command + skip - 2) - '0');
  166741. + break;
  166742. + }
  166743. +#endif //CONFIG_IOCTL_CFG80211
  166744. +
  166745. +#ifdef CONFIG_WFD
  166746. + case ANDROID_WIFI_CMD_WFD_ENABLE:
  166747. + {
  166748. + // Commented by Albert 2012/07/24
  166749. + // We can enable the WFD function by using the following command:
  166750. + // wpa_cli driver wfd-enable
  166751. +
  166752. + struct wifi_display_info *pwfd_info;
  166753. + _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
  166754. +
  166755. + pwfd_info = &padapter->wfd_info;
  166756. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  166757. + pwfd_info->wfd_enable = _TRUE;
  166758. + break;
  166759. + }
  166760. +
  166761. + case ANDROID_WIFI_CMD_WFD_DISABLE:
  166762. + {
  166763. + // Commented by Albert 2012/07/24
  166764. + // We can disable the WFD function by using the following command:
  166765. + // wpa_cli driver wfd-disable
  166766. +
  166767. + struct wifi_display_info *pwfd_info;
  166768. + _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
  166769. +
  166770. + pwfd_info = &padapter->wfd_info;
  166771. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  166772. + pwfd_info->wfd_enable = _FALSE;
  166773. + break;
  166774. + }
  166775. + case ANDROID_WIFI_CMD_WFD_SET_TCPPORT:
  166776. + {
  166777. + // Commented by Albert 2012/07/24
  166778. + // We can set the tcp port number by using the following command:
  166779. + // wpa_cli driver wfd-set-tcpport = 554
  166780. +
  166781. + struct wifi_display_info *pwfd_info;
  166782. + _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
  166783. +
  166784. + pwfd_info = &padapter->wfd_info;
  166785. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  166786. + pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );
  166787. + break;
  166788. + }
  166789. + case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:
  166790. + {
  166791. +
  166792. +
  166793. + break;
  166794. + }
  166795. + case ANDROID_WIFI_CMD_WFD_SET_DEVTYPE:
  166796. + {
  166797. + // Commented by Albert 2012/08/28
  166798. + // Specify the WFD device type ( WFD source/primary sink )
  166799. +
  166800. + struct wifi_display_info *pwfd_info;
  166801. + _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
  166802. +
  166803. + pwfd_info = &padapter->wfd_info;
  166804. + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
  166805. + {
  166806. + pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf );
  166807. +
  166808. + pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;
  166809. + }
  166810. + break;
  166811. + }
  166812. +#endif
  166813. + default:
  166814. + DBG_871X("Unknown PRIVATE command %s - ignored\n", command);
  166815. + snprintf(command, 3, "OK");
  166816. + bytes_written = strlen("OK");
  166817. + }
  166818. +
  166819. +response:
  166820. + if (bytes_written >= 0) {
  166821. + if ((bytes_written == 0) && (priv_cmd.total_len > 0))
  166822. + command[0] = '\0';
  166823. + if (bytes_written >= priv_cmd.total_len) {
  166824. + DBG_871X("%s: bytes_written = %d\n", __FUNCTION__, bytes_written);
  166825. + bytes_written = priv_cmd.total_len;
  166826. + } else {
  166827. + bytes_written++;
  166828. + }
  166829. + priv_cmd.used_len = bytes_written;
  166830. + if (copy_to_user((void *)priv_cmd.buf, command, bytes_written)) {
  166831. + DBG_871X("%s: failed to copy data to user buffer\n", __FUNCTION__);
  166832. + ret = -EFAULT;
  166833. + }
  166834. + }
  166835. + else {
  166836. + ret = bytes_written;
  166837. + }
  166838. +
  166839. +exit:
  166840. + rtw_unlock_suspend();
  166841. + if (command) {
  166842. + rtw_mfree(command, priv_cmd.total_len);
  166843. + }
  166844. +
  166845. + return ret;
  166846. +}
  166847. +
  166848. +
  166849. +/**
  166850. + * Functions for Android WiFi card detection
  166851. + */
  166852. +#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
  166853. +
  166854. +static int g_wifidev_registered = 0;
  166855. +static struct semaphore wifi_control_sem;
  166856. +static struct wifi_platform_data *wifi_control_data = NULL;
  166857. +static struct resource *wifi_irqres = NULL;
  166858. +
  166859. +static int wifi_add_dev(void);
  166860. +static void wifi_del_dev(void);
  166861. +
  166862. +int rtw_android_wifictrl_func_add(void)
  166863. +{
  166864. + int ret = 0;
  166865. + sema_init(&wifi_control_sem, 0);
  166866. +
  166867. + ret = wifi_add_dev();
  166868. + if (ret) {
  166869. + DBG_871X("%s: platform_driver_register failed\n", __FUNCTION__);
  166870. + return ret;
  166871. + }
  166872. + g_wifidev_registered = 1;
  166873. +
  166874. + /* Waiting callback after platform_driver_register is done or exit with error */
  166875. + if (down_timeout(&wifi_control_sem, msecs_to_jiffies(1000)) != 0) {
  166876. + ret = -EINVAL;
  166877. + DBG_871X("%s: platform_driver_register timeout\n", __FUNCTION__);
  166878. + }
  166879. +
  166880. + return ret;
  166881. +}
  166882. +
  166883. +void rtw_android_wifictrl_func_del(void)
  166884. +{
  166885. + if (g_wifidev_registered)
  166886. + {
  166887. + wifi_del_dev();
  166888. + g_wifidev_registered = 0;
  166889. + }
  166890. +}
  166891. +
  166892. +void *wl_android_prealloc(int section, unsigned long size)
  166893. +{
  166894. + void *alloc_ptr = NULL;
  166895. + if (wifi_control_data && wifi_control_data->mem_prealloc) {
  166896. + alloc_ptr = wifi_control_data->mem_prealloc(section, size);
  166897. + if (alloc_ptr) {
  166898. + DBG_871X("success alloc section %d\n", section);
  166899. + if (size != 0L)
  166900. + memset(alloc_ptr, 0, size);
  166901. + return alloc_ptr;
  166902. + }
  166903. + }
  166904. +
  166905. + DBG_871X("can't alloc section %d\n", section);
  166906. + return NULL;
  166907. +}
  166908. +
  166909. +int wifi_get_irq_number(unsigned long *irq_flags_ptr)
  166910. +{
  166911. + if (wifi_irqres) {
  166912. + *irq_flags_ptr = wifi_irqres->flags & IRQF_TRIGGER_MASK;
  166913. + return (int)wifi_irqres->start;
  166914. + }
  166915. +#ifdef CUSTOM_OOB_GPIO_NUM
  166916. + return CUSTOM_OOB_GPIO_NUM;
  166917. +#else
  166918. + return -1;
  166919. +#endif
  166920. +}
  166921. +
  166922. +int wifi_set_power(int on, unsigned long msec)
  166923. +{
  166924. + DBG_871X("%s = %d\n", __FUNCTION__, on);
  166925. + if (wifi_control_data && wifi_control_data->set_power) {
  166926. + wifi_control_data->set_power(on);
  166927. + }
  166928. + if (msec)
  166929. + msleep(msec);
  166930. + return 0;
  166931. +}
  166932. +
  166933. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
  166934. +int wifi_get_mac_addr(unsigned char *buf)
  166935. +{
  166936. + DBG_871X("%s\n", __FUNCTION__);
  166937. + if (!buf)
  166938. + return -EINVAL;
  166939. + if (wifi_control_data && wifi_control_data->get_mac_addr) {
  166940. + return wifi_control_data->get_mac_addr(buf);
  166941. + }
  166942. + return -EOPNOTSUPP;
  166943. +}
  166944. +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) */
  166945. +
  166946. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) || defined(COMPAT_KERNEL_RELEASE)
  166947. +void *wifi_get_country_code(char *ccode)
  166948. +{
  166949. + DBG_871X("%s\n", __FUNCTION__);
  166950. + if (!ccode)
  166951. + return NULL;
  166952. + if (wifi_control_data && wifi_control_data->get_country_code) {
  166953. + return wifi_control_data->get_country_code(ccode);
  166954. + }
  166955. + return NULL;
  166956. +}
  166957. +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) */
  166958. +
  166959. +static int wifi_set_carddetect(int on)
  166960. +{
  166961. + DBG_871X("%s = %d\n", __FUNCTION__, on);
  166962. + if (wifi_control_data && wifi_control_data->set_carddetect) {
  166963. + wifi_control_data->set_carddetect(on);
  166964. + }
  166965. + return 0;
  166966. +}
  166967. +
  166968. +static int wifi_probe(struct platform_device *pdev)
  166969. +{
  166970. + struct wifi_platform_data *wifi_ctrl =
  166971. + (struct wifi_platform_data *)(pdev->dev.platform_data);
  166972. +
  166973. + DBG_871X("## %s\n", __FUNCTION__);
  166974. + wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq");
  166975. + if (wifi_irqres == NULL)
  166976. + wifi_irqres = platform_get_resource_byname(pdev,
  166977. + IORESOURCE_IRQ, "bcm4329_wlan_irq");
  166978. + wifi_control_data = wifi_ctrl;
  166979. +
  166980. + wifi_set_power(1, 0); /* Power On */
  166981. + wifi_set_carddetect(1); /* CardDetect (0->1) */
  166982. +
  166983. + up(&wifi_control_sem);
  166984. + return 0;
  166985. +}
  166986. +
  166987. +static int wifi_remove(struct platform_device *pdev)
  166988. +{
  166989. + struct wifi_platform_data *wifi_ctrl =
  166990. + (struct wifi_platform_data *)(pdev->dev.platform_data);
  166991. +
  166992. + DBG_871X("## %s\n", __FUNCTION__);
  166993. + wifi_control_data = wifi_ctrl;
  166994. +
  166995. + wifi_set_power(0, 0); /* Power Off */
  166996. + wifi_set_carddetect(0); /* CardDetect (1->0) */
  166997. +
  166998. + up(&wifi_control_sem);
  166999. + return 0;
  167000. +}
  167001. +
  167002. +static int wifi_suspend(struct platform_device *pdev, pm_message_t state)
  167003. +{
  167004. + DBG_871X("##> %s\n", __FUNCTION__);
  167005. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY)
  167006. + bcmsdh_oob_intr_set(0);
  167007. +#endif
  167008. + return 0;
  167009. +}
  167010. +
  167011. +static int wifi_resume(struct platform_device *pdev)
  167012. +{
  167013. + DBG_871X("##> %s\n", __FUNCTION__);
  167014. +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY)
  167015. + if (dhd_os_check_if_up(bcmsdh_get_drvdata()))
  167016. + bcmsdh_oob_intr_set(1);
  167017. +#endif
  167018. + return 0;
  167019. +}
  167020. +
  167021. +/* temporarily use these two */
  167022. +static struct platform_driver wifi_device = {
  167023. + .probe = wifi_probe,
  167024. + .remove = wifi_remove,
  167025. + .suspend = wifi_suspend,
  167026. + .resume = wifi_resume,
  167027. + .driver = {
  167028. + .name = "bcmdhd_wlan",
  167029. + }
  167030. +};
  167031. +
  167032. +static struct platform_driver wifi_device_legacy = {
  167033. + .probe = wifi_probe,
  167034. + .remove = wifi_remove,
  167035. + .suspend = wifi_suspend,
  167036. + .resume = wifi_resume,
  167037. + .driver = {
  167038. + .name = "bcm4329_wlan",
  167039. + }
  167040. +};
  167041. +
  167042. +static int wifi_add_dev(void)
  167043. +{
  167044. + DBG_871X("## Calling platform_driver_register\n");
  167045. + platform_driver_register(&wifi_device);
  167046. + platform_driver_register(&wifi_device_legacy);
  167047. + return 0;
  167048. +}
  167049. +
  167050. +static void wifi_del_dev(void)
  167051. +{
  167052. + DBG_871X("## Unregister platform_driver_register\n");
  167053. + platform_driver_unregister(&wifi_device);
  167054. + platform_driver_unregister(&wifi_device_legacy);
  167055. +}
  167056. +#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */
  167057. --- /dev/null
  167058. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c
  167059. @@ -0,0 +1,1654 @@
  167060. +/******************************************************************************
  167061. + *
  167062. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  167063. + *
  167064. + * This program is free software; you can redistribute it and/or modify it
  167065. + * under the terms of version 2 of the GNU General Public License as
  167066. + * published by the Free Software Foundation.
  167067. + *
  167068. + * This program is distributed in the hope that it will be useful, but WITHOUT
  167069. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  167070. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  167071. + * more details.
  167072. + *
  167073. + * You should have received a copy of the GNU General Public License along with
  167074. + * this program; if not, write to the Free Software Foundation, Inc.,
  167075. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  167076. + *
  167077. + *
  167078. + ******************************************************************************/
  167079. +#define _HCI_INTF_C_
  167080. +
  167081. +#include <drv_conf.h>
  167082. +#include <osdep_service.h>
  167083. +#include <drv_types.h>
  167084. +#include <recv_osdep.h>
  167085. +#include <xmit_osdep.h>
  167086. +#include <hal_intf.h>
  167087. +#include <rtw_version.h>
  167088. +
  167089. +#ifndef CONFIG_USB_HCI
  167090. +
  167091. +#error "CONFIG_USB_HCI shall be on!\n"
  167092. +
  167093. +#endif
  167094. +
  167095. +#include <usb_vendor_req.h>
  167096. +#include <usb_ops.h>
  167097. +#include <usb_osintf.h>
  167098. +#include <usb_hal.h>
  167099. +#ifdef CONFIG_PLATFORM_RTK_DMP
  167100. +#include <asm/io.h>
  167101. +#endif
  167102. +
  167103. +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  167104. +
  167105. +#error "Shall be Linux or Windows, but not both!\n"
  167106. +
  167107. +#endif
  167108. +
  167109. +#ifdef CONFIG_80211N_HT
  167110. +extern int rtw_ht_enable;
  167111. +extern int rtw_cbw40_enable;
  167112. +extern int rtw_ampdu_enable;//for enable tx_ampdu
  167113. +#endif
  167114. +
  167115. +#ifdef CONFIG_GLOBAL_UI_PID
  167116. +int ui_pid[3] = {0, 0, 0};
  167117. +#endif
  167118. +
  167119. +
  167120. +extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal);
  167121. +static int rtw_suspend(struct usb_interface *intf, pm_message_t message);
  167122. +static int rtw_resume(struct usb_interface *intf);
  167123. +int rtw_resume_process(_adapter *padapter);
  167124. +
  167125. +
  167126. +static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid);
  167127. +static void rtw_dev_remove(struct usb_interface *pusb_intf);
  167128. +
  167129. +#define USB_VENDER_ID_REALTEK 0x0BDA
  167130. +
  167131. +/* DID_USB_v915_20121224 */
  167132. +#define RTL8192C_USB_IDS \
  167133. + /*=== Realtek demoboard ===*/ \
  167134. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8191)},/* Default ID */ \
  167135. + /****** 8188CUS ********/ \
  167136. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176)},/* 8188cu 1*1 dongole */ \
  167137. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170)},/* 8188CE-VAU USB minCard */ \
  167138. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E)},/* 8188CE-VAU USB minCard */ \
  167139. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A)},/* 8188cu Slim Solo */ \
  167140. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817B)},/* 8188cu Slim Combo */ \
  167141. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817D)},/* 8188RU High-power USB Dongle */ \
  167142. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754)},/* 8188 Combo for BC4 */ \
  167143. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817F)},/* 8188RU */ \
  167144. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818A)},/* RTL8188CUS-VL */ \
  167145. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x018A)},/* RTL8188CTV */ \
  167146. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x17C0)}, /* RTK demoboard - USB-N10E */ \
  167147. + /****** 8192CUS ********/ \
  167148. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177)},/* 8191cu 1*2 */ \
  167149. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178)},/* 8192cu 2*2 */ \
  167150. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817C)},/* 8192CE-VAU USB minCard */ \
  167151. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8191)},/* 8192CU 2*2 */ \
  167152. + {USB_DEVICE(0x1058, 0x0631)},/* Alpha, 8192CU */ \
  167153. + /*=== Customer ID ===*/ \
  167154. + /****** 8188CUS Dongle ********/ \
  167155. + {USB_DEVICE(0x2019, 0xED17)},/* PCI - Edimax */ \
  167156. + {USB_DEVICE(0x0DF6, 0x0052)},/* Sitecom - Edimax */ \
  167157. + {USB_DEVICE(0x7392, 0x7811)},/* Edimax - Edimax */ \
  167158. + {USB_DEVICE(0x07B8, 0x8189)},/* Abocom - Abocom */ \
  167159. + {USB_DEVICE(0x0EB0, 0x9071)},/* NO Brand - Etop */ \
  167160. + {USB_DEVICE(0x06F8, 0xE033)},/* Hercules - Edimax */ \
  167161. + {USB_DEVICE(0x103C, 0x1629)},/* HP - Lite-On ,8188CUS Slim Combo */ \
  167162. + {USB_DEVICE(0x2001, 0x3308)},/* D-Link - Alpha */ \
  167163. + {USB_DEVICE(0x050D, 0x1102)},/* Belkin - Edimax */ \
  167164. + {USB_DEVICE(0x2019, 0xAB2A)},/* Planex - Abocom */ \
  167165. + {USB_DEVICE(0x20F4, 0x648B)},/* TRENDnet - Cameo */ \
  167166. + {USB_DEVICE(0x4855, 0x0090)},/* - Feixun */ \
  167167. + {USB_DEVICE(0x13D3, 0x3357)},/* - AzureWave */ \
  167168. + {USB_DEVICE(0x0DF6, 0x005C)},/* Sitecom - Edimax */ \
  167169. + {USB_DEVICE(0x0BDA, 0x5088)},/* Thinkware - CC&C */ \
  167170. + {USB_DEVICE(0x4856, 0x0091)},/* NetweeN - Feixun */ \
  167171. + {USB_DEVICE(0x0846, 0x9041)}, /* Netgear - Cameo */ \
  167172. + {USB_DEVICE(0x2019, 0x4902)},/* Planex - Etop */ \
  167173. + {USB_DEVICE(0x2019, 0xAB2E)},/* SW-WF02-AD15 -Abocom */ \
  167174. + {USB_DEVICE(0x2001, 0x330B)}, /* D-LINK - T&W */ \
  167175. + {USB_DEVICE(0xCDAB, 0x8010)}, /* - - compare */ \
  167176. + {USB_DEVICE(0x0B05, 0x17BA)}, /* ASUS - Edimax */ \
  167177. + {USB_DEVICE(0x0BDA, 0x1E1E)}, /* Intel - - */ \
  167178. + {USB_DEVICE(0x04BB, 0x094c)}, /* I-O DATA - Edimax */ \
  167179. + /****** 8188CTV ********/ \
  167180. + {USB_DEVICE(0xCDAB, 0x8011)}, /* - - compare */ \
  167181. + {USB_DEVICE(0x0BDA, 0x0A8A)}, /* Sony - Foxconn */ \
  167182. + /****** 8188 RU ********/ \
  167183. + {USB_DEVICE(0x0BDA, 0x317F)},/* Netcore,Netcore */ \
  167184. + /****** 8188CE-VAU ********/ \
  167185. + {USB_DEVICE(0x13D3, 0x3359)},/* - Azwave */ \
  167186. + {USB_DEVICE(0x13D3, 0x3358)},/* - Azwave */ \
  167187. + /****** 8188CUS Slim Solo********/ \
  167188. + {USB_DEVICE(0x04F2, 0xAFF7)},/* XAVI - XAVI */ \
  167189. + {USB_DEVICE(0x04F2, 0xAFF9)},/* XAVI - XAVI */ \
  167190. + {USB_DEVICE(0x04F2, 0xAFFA)},/* XAVI - XAVI */ \
  167191. + /****** 8188CUS Slim Combo ********/ \
  167192. + {USB_DEVICE(0x04F2, 0xAFF8)},/* XAVI - XAVI */ \
  167193. + {USB_DEVICE(0x04F2, 0xAFFB)},/* XAVI - XAVI */ \
  167194. + {USB_DEVICE(0x04F2, 0xAFFC)},/* XAVI - XAVI */ \
  167195. + {USB_DEVICE(0x2019, 0x1201)},/* Planex - Vencer */ \
  167196. + /****** 8192CUS Dongle ********/ \
  167197. + {USB_DEVICE(0x2001, 0x3307)},/* D-Link - Cameo */ \
  167198. + {USB_DEVICE(0x2001, 0x330A)},/* D-Link - Alpha */ \
  167199. + {USB_DEVICE(0x2001, 0x3309)},/* D-Link - Alpha */ \
  167200. + {USB_DEVICE(0x0586, 0x341F)},/* Zyxel - Abocom */ \
  167201. + {USB_DEVICE(0x7392, 0x7822)},/* Edimax - Edimax */ \
  167202. + {USB_DEVICE(0x2019, 0xAB2B)},/* Planex - Abocom */ \
  167203. + {USB_DEVICE(0x07B8, 0x8178)},/* Abocom - Abocom */ \
  167204. + {USB_DEVICE(0x07AA, 0x0056)},/* ATKK - Gemtek */ \
  167205. + {USB_DEVICE(0x4855, 0x0091)},/* - Feixun */ \
  167206. + {USB_DEVICE(0x050D, 0x2102)},/* Belkin - Sercomm */ \
  167207. + {USB_DEVICE(0x050D, 0x2103)},/* Belkin - Edimax */ \
  167208. + {USB_DEVICE(0x20F4, 0x624D)},/* TRENDnet */ \
  167209. + {USB_DEVICE(0x0DF6, 0x0061)},/* Sitecom - Edimax */ \
  167210. + {USB_DEVICE(0x0B05, 0x17AB)},/* ASUS - Edimax */ \
  167211. + {USB_DEVICE(0x0846, 0x9021)},/* Netgear - Sercomm */ \
  167212. + {USB_DEVICE(0x0846, 0xF001)}, /* Netgear - Sercomm */ \
  167213. + {USB_DEVICE(0x0E66, 0x0019)},/* Hawking,Edimax */ \
  167214. + {USB_DEVICE(0x0E66, 0x0020)}, /* Hawking - Edimax */ \
  167215. + {USB_DEVICE(0x050D, 0x1004)}, /* Belkin - Edimax */ \
  167216. + {USB_DEVICE(0x0BDA, 0x2E2E)}, /* Intel - - */ \
  167217. + {USB_DEVICE(0x2357, 0x0100)}, /* TP-Link - TP-Link */ \
  167218. + {USB_DEVICE(0x06F8, 0xE035)}, /* Hercules - Edimax */ \
  167219. + {USB_DEVICE(0x04BB, 0x0950)}, /* IO-DATA - Edimax */ \
  167220. + {USB_DEVICE(0x0DF6, 0x0070)}, /* Sitecom - Edimax */ \
  167221. + {USB_DEVICE(0x0789, 0x016D)}, /* LOGITEC - Edimax */ \
  167222. + /****** 8192CE-VAU ********/ \
  167223. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8186)},/* Intel-Xavi( Azwave) */
  167224. +
  167225. +#define RTL8192D_USB_IDS \
  167226. + /*=== Realtek demoboard ===*/ \
  167227. + /****** 8192DU ********/ \
  167228. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8193)},/* 8192DU-VC */ \
  167229. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},/* 8192DU-VS */ \
  167230. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},/* Realtek 5G dongle for WiFi Display */ \
  167231. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0193)},/* 8192DE-VAU */ \
  167232. + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8171)},/* 8192DU-VC */ \
  167233. + /*=== Customer ID ===*/ \
  167234. + /****** 8192DU-VC ********/ \
  167235. + {USB_DEVICE(0x2019, 0xAB2C)},/* PCI - Abocm */ \
  167236. + {USB_DEVICE(0x2019, 0x4903)},/* PCI - ETOP */ \
  167237. + {USB_DEVICE(0x2019, 0x4904)},/* PCI - ETOP */ \
  167238. + {USB_DEVICE(0x07B8, 0x8193)},/* Abocom - Abocom */ \
  167239. + /****** 8192DU-VS ********/ \
  167240. + {USB_DEVICE(0x20F4, 0x664B)}, /* TRENDnet - Cameo */ \
  167241. + {USB_DEVICE(0x04DD, 0x954F)}, /* Sharp */ \
  167242. + {USB_DEVICE(0x04DD, 0x96A6)}, /* Sharp */ \
  167243. + {USB_DEVICE(0x050D, 0x110A)}, /* Belkin - Edimax */ \
  167244. + {USB_DEVICE(0x050D, 0x1105)}, /* Belkin - Edimax */ \
  167245. + {USB_DEVICE(0x050D, 0x120A)}, /* Belkin - Edimax */ \
  167246. + {USB_DEVICE(0x1668, 0x8102)}, /* - */ \
  167247. + {USB_DEVICE(0x0BDA, 0xE194)}, /* - Edimax */ \
  167248. + /****** 8192DU-WiFi Display Dongle ********/ \
  167249. + {USB_DEVICE(0x2019, 0xAB2D)},/* Planex - Abocom ,5G dongle for WiFi Display */
  167250. +
  167251. +#ifndef CONFIG_RTL8192C
  167252. + #undef RTL8192C_USB_IDS
  167253. + #define RTL8192C_USB_IDS
  167254. +#endif
  167255. +#ifndef CONFIG_RTL8192D
  167256. + #undef RTL8192D_USB_IDS
  167257. + #define RTL8192D_USB_IDS
  167258. +#endif
  167259. +
  167260. +
  167261. +static struct usb_device_id rtw_usb_id_tbl[] ={
  167262. + RTL8192C_USB_IDS
  167263. + RTL8192D_USB_IDS
  167264. + {} /* Terminating entry */
  167265. +};
  167266. +MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl);
  167267. +
  167268. +int const rtw_usb_id_len = sizeof(rtw_usb_id_tbl) / sizeof(struct usb_device_id);
  167269. +
  167270. +static struct specific_device_id specific_device_id_tbl[] = {
  167271. + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8177, .flags=SPEC_DEV_ID_DISABLE_HT},//8188cu 1*1 dongole, (b/g mode only)
  167272. + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x817E, .flags=SPEC_DEV_ID_DISABLE_HT},//8188CE-VAU USB minCard (b/g mode only)
  167273. + {.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT},
  167274. + {.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT},
  167275. + {.idVendor=0x13D3, .idProduct=0x3359, .flags=SPEC_DEV_ID_DISABLE_HT},//Russian customer -Azwave (8188CE-VAU g mode)
  167276. +#ifdef RTK_DMP_PLATFORM
  167277. + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8111, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // Realtek 5G dongle for WiFi Display
  167278. + {.idVendor=0x2019, .idProduct=0xAB2D, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // PCI-Abocom 5G dongle for WiFi Display
  167279. +#endif /* RTK_DMP_PLATFORM */
  167280. + {}
  167281. +};
  167282. +
  167283. +struct rtw_usb_drv {
  167284. + struct usb_driver usbdrv;
  167285. + int drv_registered;
  167286. +};
  167287. +
  167288. +static void rtw_dev_shutdown(struct device *dev)
  167289. +{
  167290. + struct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev);
  167291. + struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
  167292. + _adapter *adapter = dvobj->if1;
  167293. + int i;
  167294. +
  167295. + DBG_871X("%s\n", __func__);
  167296. +
  167297. + for (i = 0; i<dvobj->iface_nums; i++) {
  167298. + adapter = dvobj->padapters[i];
  167299. + adapter->bSurpriseRemoved = _TRUE;
  167300. + }
  167301. +
  167302. + ATOMIC_SET(&dvobj->continual_urb_error, MAX_CONTINUAL_URB_ERR+1);
  167303. +}
  167304. +
  167305. +#ifdef CONFIG_RTL8192C
  167306. +static struct usb_device_id rtl8192c_usb_id_tbl[] ={
  167307. + RTL8192C_USB_IDS
  167308. + {} /* Terminating entry */
  167309. +};
  167310. +
  167311. +struct rtw_usb_drv rtl8192c_usb_drv = {
  167312. + .usbdrv.name = (char*)"rtl8192cu",
  167313. + .usbdrv.probe = rtw_drv_init,
  167314. + .usbdrv.disconnect = rtw_dev_remove,
  167315. + .usbdrv.id_table = rtl8192c_usb_id_tbl,
  167316. + .usbdrv.suspend = rtw_suspend,
  167317. + .usbdrv.resume = rtw_resume,
  167318. + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
  167319. + .usbdrv.reset_resume = rtw_resume,
  167320. + #endif
  167321. + #ifdef CONFIG_AUTOSUSPEND
  167322. + .usbdrv.supports_autosuspend = 1,
  167323. + #endif
  167324. +
  167325. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
  167326. + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
  167327. + #else
  167328. + .usbdrv.driver.shutdown = rtw_dev_shutdown,
  167329. + #endif
  167330. +};
  167331. +
  167332. +static struct rtw_usb_drv *usb_drv = &rtl8192c_usb_drv;
  167333. +#endif /* CONFIG_RTL8192C */
  167334. +
  167335. +#ifdef CONFIG_RTL8192D
  167336. +static struct usb_device_id rtl8192d_usb_id_tbl[] ={
  167337. + RTL8192D_USB_IDS
  167338. + {} /* Terminating entry */
  167339. +};
  167340. +
  167341. +struct rtw_usb_drv rtl8192d_usb_drv = {
  167342. + .usbdrv.name = (char*)"rtl8192du",
  167343. + .usbdrv.probe = rtw_drv_init,
  167344. + .usbdrv.disconnect = rtw_dev_remove,
  167345. + .usbdrv.id_table = rtl8192d_usb_id_tbl,
  167346. + .usbdrv.suspend = rtw_suspend,
  167347. + .usbdrv.resume = rtw_resume,
  167348. + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
  167349. + .usbdrv.reset_resume = rtw_resume,
  167350. + #endif
  167351. + #ifdef CONFIG_AUTOSUSPEND
  167352. + .usbdrv.supports_autosuspend = 1,
  167353. + #endif
  167354. +
  167355. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
  167356. + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,
  167357. + #else
  167358. + .usbdrv.driver.shutdown = rtw_dev_shutdown,
  167359. + #endif
  167360. +};
  167361. +static struct rtw_usb_drv *usb_drv = &rtl8192d_usb_drv;
  167362. +#endif /* CONFIG_RTL8192D */
  167363. +
  167364. +static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
  167365. +{
  167366. + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
  167367. +}
  167368. +
  167369. +static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd)
  167370. +{
  167371. + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
  167372. +}
  167373. +
  167374. +static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd)
  167375. +{
  167376. + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT);
  167377. +}
  167378. +
  167379. +static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd)
  167380. +{
  167381. + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK);
  167382. +}
  167383. +
  167384. +static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd)
  167385. +{
  167386. + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd));
  167387. +}
  167388. +
  167389. +static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd)
  167390. +{
  167391. + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd));
  167392. +}
  167393. +
  167394. +static inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd)
  167395. +{
  167396. + return (RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd));
  167397. +}
  167398. +
  167399. +static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
  167400. +{
  167401. + return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
  167402. +}
  167403. +
  167404. +static u8 rtw_init_intf_priv(struct dvobj_priv *dvobj)
  167405. +{
  167406. + u8 rst = _SUCCESS;
  167407. +
  167408. + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
  167409. + _rtw_mutex_init(&dvobj->usb_vendor_req_mutex);
  167410. + #endif
  167411. +
  167412. +
  167413. + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
  167414. + dvobj->usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE);
  167415. + if (dvobj->usb_alloc_vendor_req_buf == NULL) {
  167416. + DBG_871X("alloc usb_vendor_req_buf failed... /n");
  167417. + rst = _FAIL;
  167418. + goto exit;
  167419. + }
  167420. + dvobj->usb_vendor_req_buf =
  167421. + (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(dvobj->usb_alloc_vendor_req_buf ), ALIGNMENT_UNIT);
  167422. +exit:
  167423. + #endif
  167424. +
  167425. + return rst;
  167426. +
  167427. +}
  167428. +
  167429. +static u8 rtw_deinit_intf_priv(struct dvobj_priv *dvobj)
  167430. +{
  167431. + u8 rst = _SUCCESS;
  167432. +
  167433. + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
  167434. + if(dvobj->usb_vendor_req_buf)
  167435. + rtw_mfree(dvobj->usb_alloc_vendor_req_buf, MAX_USB_IO_CTL_SIZE);
  167436. + #endif
  167437. +
  167438. + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
  167439. + _rtw_mutex_free(&dvobj->usb_vendor_req_mutex);
  167440. + #endif
  167441. +
  167442. + return rst;
  167443. +}
  167444. +
  167445. +static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf)
  167446. +{
  167447. + int i;
  167448. + u8 val8;
  167449. + int status = _FAIL;
  167450. + struct dvobj_priv *pdvobjpriv = NULL;
  167451. + struct usb_device *pusbd;
  167452. + struct usb_device_descriptor *pdev_desc;
  167453. + struct usb_host_config *phost_conf;
  167454. + struct usb_config_descriptor *pconf_desc;
  167455. + struct usb_host_interface *phost_iface;
  167456. + struct usb_interface_descriptor *piface_desc;
  167457. + struct usb_host_endpoint *phost_endp;
  167458. + struct usb_endpoint_descriptor *pendp_desc;
  167459. +
  167460. +_func_enter_;
  167461. +
  167462. + if((pdvobjpriv = devobj_init()) == NULL) {
  167463. + goto exit;
  167464. + }
  167465. +
  167466. + pdvobjpriv->pusbintf = usb_intf ;
  167467. + pusbd = pdvobjpriv->pusbdev = interface_to_usbdev(usb_intf);
  167468. + usb_set_intfdata(usb_intf, pdvobjpriv);
  167469. +
  167470. + pdvobjpriv->RtNumInPipes = 0;
  167471. + pdvobjpriv->RtNumOutPipes = 0;
  167472. +
  167473. +
  167474. + pdev_desc = &pusbd->descriptor;
  167475. +#if 0
  167476. + DBG_871X("\n8712_usb_device_descriptor:\n");
  167477. + DBG_871X("bLength=%x\n", pdev_desc->bLength);
  167478. + DBG_871X("bDescriptorType=%x\n", pdev_desc->bDescriptorType);
  167479. + DBG_871X("bcdUSB=%x\n", pdev_desc->bcdUSB);
  167480. + DBG_871X("bDeviceClass=%x\n", pdev_desc->bDeviceClass);
  167481. + DBG_871X("bDeviceSubClass=%x\n", pdev_desc->bDeviceSubClass);
  167482. + DBG_871X("bDeviceProtocol=%x\n", pdev_desc->bDeviceProtocol);
  167483. + DBG_871X("bMaxPacketSize0=%x\n", pdev_desc->bMaxPacketSize0);
  167484. + DBG_871X("idVendor=%x\n", pdev_desc->idVendor);
  167485. + DBG_871X("idProduct=%x\n", pdev_desc->idProduct);
  167486. + DBG_871X("bcdDevice=%x\n", pdev_desc->bcdDevice);
  167487. + DBG_871X("iManufacturer=%x\n", pdev_desc->iManufacturer);
  167488. + DBG_871X("iProduct=%x\n", pdev_desc->iProduct);
  167489. + DBG_871X("iSerialNumber=%x\n", pdev_desc->iSerialNumber);
  167490. + DBG_871X("bNumConfigurations=%x\n", pdev_desc->bNumConfigurations);
  167491. +#endif
  167492. +
  167493. + phost_conf = pusbd->actconfig;
  167494. + pconf_desc = &phost_conf->desc;
  167495. +
  167496. +#if 0
  167497. + DBG_871X("\n8712_usb_configuration_descriptor:\n");
  167498. + DBG_871X("bLength=%x\n", pconf_desc->bLength);
  167499. + DBG_871X("bDescriptorType=%x\n", pconf_desc->bDescriptorType);
  167500. + DBG_871X("wTotalLength=%x\n", pconf_desc->wTotalLength);
  167501. + DBG_871X("bNumInterfaces=%x\n", pconf_desc->bNumInterfaces);
  167502. + DBG_871X("bConfigurationValue=%x\n", pconf_desc->bConfigurationValue);
  167503. + DBG_871X("iConfiguration=%x\n", pconf_desc->iConfiguration);
  167504. + DBG_871X("bmAttributes=%x\n", pconf_desc->bmAttributes);
  167505. + DBG_871X("bMaxPower=%x\n", pconf_desc->bMaxPower);
  167506. +#endif
  167507. +
  167508. + //DBG_871X("\n/****** num of altsetting = (%d) ******/\n", usb_intf->num_altsetting);
  167509. +
  167510. + phost_iface = &usb_intf->altsetting[0];
  167511. + piface_desc = &phost_iface->desc;
  167512. +
  167513. +#if 0
  167514. + DBG_871X("\n8712_usb_interface_descriptor:\n");
  167515. + DBG_871X("bLength=%x\n", piface_desc->bLength);
  167516. + DBG_871X("bDescriptorType=%x\n", piface_desc->bDescriptorType);
  167517. + DBG_871X("bInterfaceNumber=%x\n", piface_desc->bInterfaceNumber);
  167518. + DBG_871X("bAlternateSetting=%x\n", piface_desc->bAlternateSetting);
  167519. + DBG_871X("bNumEndpoints=%x\n", piface_desc->bNumEndpoints);
  167520. + DBG_871X("bInterfaceClass=%x\n", piface_desc->bInterfaceClass);
  167521. + DBG_871X("bInterfaceSubClass=%x\n", piface_desc->bInterfaceSubClass);
  167522. + DBG_871X("bInterfaceProtocol=%x\n", piface_desc->bInterfaceProtocol);
  167523. + DBG_871X("iInterface=%x\n", piface_desc->iInterface);
  167524. +#endif
  167525. +
  167526. + pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces;
  167527. + pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber;
  167528. + pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints;
  167529. +
  167530. + //DBG_871X("\ndump usb_endpoint_descriptor:\n");
  167531. +
  167532. + for (i = 0; i < pdvobjpriv->nr_endpoint; i++)
  167533. + {
  167534. + phost_endp = phost_iface->endpoint + i;
  167535. + if (phost_endp)
  167536. + {
  167537. + pendp_desc = &phost_endp->desc;
  167538. +
  167539. + DBG_871X("\nusb_endpoint_descriptor(%d):\n", i);
  167540. + DBG_871X("bLength=%x\n",pendp_desc->bLength);
  167541. + DBG_871X("bDescriptorType=%x\n",pendp_desc->bDescriptorType);
  167542. + DBG_871X("bEndpointAddress=%x\n",pendp_desc->bEndpointAddress);
  167543. + //DBG_871X("bmAttributes=%x\n",pendp_desc->bmAttributes);
  167544. + //DBG_871X("wMaxPacketSize=%x\n",pendp_desc->wMaxPacketSize);
  167545. + DBG_871X("wMaxPacketSize=%x\n",le16_to_cpu(pendp_desc->wMaxPacketSize));
  167546. + DBG_871X("bInterval=%x\n",pendp_desc->bInterval);
  167547. + //DBG_871X("bRefresh=%x\n",pendp_desc->bRefresh);
  167548. + //DBG_871X("bSynchAddress=%x\n",pendp_desc->bSynchAddress);
  167549. +
  167550. + if (RT_usb_endpoint_is_bulk_in(pendp_desc))
  167551. + {
  167552. + DBG_871X("RT_usb_endpoint_is_bulk_in = %x\n", RT_usb_endpoint_num(pendp_desc));
  167553. + pdvobjpriv->RtNumInPipes++;
  167554. + }
  167555. + else if (RT_usb_endpoint_is_int_in(pendp_desc))
  167556. + {
  167557. + DBG_871X("RT_usb_endpoint_is_int_in = %x, Interval = %x\n", RT_usb_endpoint_num(pendp_desc),pendp_desc->bInterval);
  167558. + pdvobjpriv->RtNumInPipes++;
  167559. + }
  167560. + else if (RT_usb_endpoint_is_bulk_out(pendp_desc))
  167561. + {
  167562. + DBG_871X("RT_usb_endpoint_is_bulk_out = %x\n", RT_usb_endpoint_num(pendp_desc));
  167563. + pdvobjpriv->RtNumOutPipes++;
  167564. + }
  167565. + pdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc);
  167566. + }
  167567. + }
  167568. +
  167569. + DBG_871X("nr_endpoint=%d, in_num=%d, out_num=%d\n\n", pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes);
  167570. +
  167571. + if (pusbd->speed == USB_SPEED_HIGH) {
  167572. + pdvobjpriv->ishighspeed = _TRUE;
  167573. + DBG_871X("USB_SPEED_HIGH\n");
  167574. + } else {
  167575. + pdvobjpriv->ishighspeed = _FALSE;
  167576. + DBG_871X("NON USB_SPEED_HIGH\n");
  167577. + }
  167578. +
  167579. + if (rtw_init_intf_priv(pdvobjpriv) == _FAIL) {
  167580. + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't INIT rtw_init_intf_priv\n"));
  167581. + goto free_dvobj;
  167582. + }
  167583. +
  167584. + //.3 misc
  167585. + _rtw_init_sema(&(pdvobjpriv->usb_suspend_sema), 0);
  167586. +
  167587. + rtw_reset_continual_urb_error(pdvobjpriv);
  167588. +
  167589. + usb_get_dev(pusbd);
  167590. +
  167591. + //DBG_871X("%s %d\n", __func__, ATOMIC_READ(&usb_intf->dev.kobj.kref.refcount));
  167592. +
  167593. + status = _SUCCESS;
  167594. +
  167595. +free_dvobj:
  167596. + if (status != _SUCCESS && pdvobjpriv) {
  167597. + usb_set_intfdata(usb_intf, NULL);
  167598. + devobj_deinit(pdvobjpriv);
  167599. + pdvobjpriv = NULL;
  167600. + }
  167601. +exit:
  167602. +_func_exit_;
  167603. + return pdvobjpriv;
  167604. +}
  167605. +
  167606. +static void usb_dvobj_deinit(struct usb_interface *usb_intf)
  167607. +{
  167608. + struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
  167609. +
  167610. +_func_enter_;
  167611. +
  167612. + usb_set_intfdata(usb_intf, NULL);
  167613. + if (dvobj) {
  167614. + //Modify condition for 92DU DMDP 2010.11.18, by Thomas
  167615. + /*if ((dvobj->NumInterfaces == 1)
  167616. + || ((dvobj->InterfaceNumber == 1) && (dvobj->DualMacMode == _TRUE))) {
  167617. + if (interface_to_usbdev(usb_intf)->state != USB_STATE_NOTATTACHED) {
  167618. + //If we didn't unplug usb dongle and remove/insert modlue, driver fails on sitesurvey for the first time when device is up .
  167619. + //Reset usb port for sitesurvey fail issue. 2009.8.13, by Thomas
  167620. + DBG_871X("usb attached..., try to reset usb device\n");
  167621. + usb_reset_device(interface_to_usbdev(usb_intf));
  167622. + }
  167623. + }*/
  167624. + rtw_deinit_intf_priv(dvobj);
  167625. + devobj_deinit(dvobj);
  167626. + }
  167627. +
  167628. + //DBG_871X("%s %d\n", __func__, ATOMIC_READ(&usb_intf->dev.kobj.kref.refcount));
  167629. + usb_put_dev(interface_to_usbdev(usb_intf));
  167630. +
  167631. +_func_exit_;
  167632. +}
  167633. +
  167634. +static void decide_chip_type_by_usb_device_id(_adapter *padapter, const struct usb_device_id *pdid)
  167635. +{
  167636. + padapter->chip_type = NULL_CHIP_TYPE;
  167637. +#ifdef CONFIG_RTL8192C
  167638. + padapter->chip_type = RTL8188C_8192C;
  167639. + padapter->HardwareType = HARDWARE_TYPE_RTL8192CU;
  167640. + DBG_871X("CHIP TYPE: RTL8188C_8192C\n");
  167641. +#endif
  167642. +
  167643. +#ifdef CONFIG_RTL8192D
  167644. + padapter->chip_type = RTL8192D;
  167645. + padapter->HardwareType = HARDWARE_TYPE_RTL8192DU;
  167646. + DBG_871X("CHIP TYPE: RTL8192D\n");
  167647. +#endif
  167648. +}
  167649. +
  167650. +static void usb_intf_start(_adapter *padapter)
  167651. +{
  167652. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_start\n"));
  167653. + rtw_hal_inirp_init(padapter);
  167654. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_start\n"));
  167655. +}
  167656. +
  167657. +static void usb_intf_stop(_adapter *padapter)
  167658. +{
  167659. +
  167660. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_stop\n"));
  167661. +
  167662. + //disabel_hw_interrupt
  167663. + if(padapter->bSurpriseRemoved == _FALSE)
  167664. + {
  167665. + //device still exists, so driver can do i/o operation
  167666. + //TODO:
  167667. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("SurpriseRemoved==_FALSE\n"));
  167668. + }
  167669. +
  167670. + //cancel in irp
  167671. + rtw_hal_inirp_deinit(padapter);
  167672. +
  167673. + //cancel out irp
  167674. + rtw_write_port_cancel(padapter);
  167675. +
  167676. + //todo:cancel other irps
  167677. +
  167678. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_stop\n"));
  167679. +
  167680. +}
  167681. +
  167682. +static void rtw_dev_unload(_adapter *padapter)
  167683. +{
  167684. + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;
  167685. + u8 val8;
  167686. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_dev_unload\n"));
  167687. +
  167688. + if(padapter->bup == _TRUE)
  167689. + {
  167690. + DBG_871X("===> rtw_dev_unload\n");
  167691. +
  167692. + padapter->bDriverStopped = _TRUE;
  167693. + #ifdef CONFIG_XMIT_ACK
  167694. + if (padapter->xmitpriv.ack_tx)
  167695. + rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);
  167696. + #endif
  167697. +
  167698. + //s3.
  167699. + if(padapter->intf_stop)
  167700. + {
  167701. + padapter->intf_stop(padapter);
  167702. + }
  167703. +
  167704. + //s4.
  167705. + if(!padapter->pwrctrlpriv.bInternalAutoSuspend )
  167706. + rtw_stop_drv_threads(padapter);
  167707. +
  167708. +
  167709. + //s5.
  167710. + if(padapter->bSurpriseRemoved == _FALSE)
  167711. + {
  167712. + //DBG_871X("r871x_dev_unload()->rtl871x_hal_deinit()\n");
  167713. +#ifdef CONFIG_WOWLAN
  167714. + if((padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE)&&(padapter->pwrctrlpriv.wowlan_mode==_TRUE)){
  167715. + DBG_871X("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__);
  167716. + }
  167717. + else
  167718. +#endif //CONFIG_WOWLAN
  167719. + {
  167720. + rtw_hal_deinit(padapter);
  167721. + }
  167722. + padapter->bSurpriseRemoved = _TRUE;
  167723. + }
  167724. +
  167725. + padapter->bup = _FALSE;
  167726. +#ifdef CONFIG_WOWLAN
  167727. + padapter->hw_init_completed=_FALSE;
  167728. +#endif //CONFIG_WOWLAN
  167729. + }
  167730. + else
  167731. + {
  167732. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("r871x_dev_unload():padapter->bup == _FALSE\n" ));
  167733. + }
  167734. +
  167735. + DBG_871X("<=== rtw_dev_unload\n");
  167736. +
  167737. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-rtw_dev_unload\n"));
  167738. +
  167739. +}
  167740. +
  167741. +static void process_spec_devid(const struct usb_device_id *pdid)
  167742. +{
  167743. + u16 vid, pid;
  167744. + u32 flags;
  167745. + int i;
  167746. + int num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id);
  167747. +
  167748. + for(i=0; i<num; i++)
  167749. + {
  167750. + vid = specific_device_id_tbl[i].idVendor;
  167751. + pid = specific_device_id_tbl[i].idProduct;
  167752. + flags = specific_device_id_tbl[i].flags;
  167753. +
  167754. +#ifdef CONFIG_80211N_HT
  167755. + if((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_DISABLE_HT))
  167756. + {
  167757. + rtw_ht_enable = 0;
  167758. + rtw_cbw40_enable = 0;
  167759. + rtw_ampdu_enable = 0;
  167760. + }
  167761. +#endif
  167762. +
  167763. +#ifdef RTK_DMP_PLATFORM
  167764. + // Change the ifname to wlan10 when PC side WFD dongle plugin on DMP platform.
  167765. + // It is used to distinguish between normal and PC-side wifi dongle/module.
  167766. + if((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_ASSIGN_IFNAME))
  167767. + {
  167768. + extern char* ifname;
  167769. + strncpy(ifname, "wlan10", 6);
  167770. + //DBG_871X("%s()-%d: ifname=%s, vid=%04X, pid=%04X\n", __FUNCTION__, __LINE__, ifname, vid, pid);
  167771. + }
  167772. +#endif /* RTK_DMP_PLATFORM */
  167773. +
  167774. + }
  167775. +}
  167776. +
  167777. +#ifdef SUPPORT_HW_RFOFF_DETECTED
  167778. +int rtw_hw_suspend(_adapter *padapter )
  167779. +{
  167780. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  167781. + struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf;
  167782. + struct net_device *pnetdev = padapter->pnetdev;
  167783. +
  167784. + _func_enter_;
  167785. +
  167786. + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
  167787. + {
  167788. + DBG_871X("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
  167789. + padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
  167790. + goto error_exit;
  167791. + }
  167792. +
  167793. + if(padapter)//system suspend
  167794. + {
  167795. + LeaveAllPowerSaveMode(padapter);
  167796. +
  167797. + DBG_871X("==> rtw_hw_suspend\n");
  167798. + _enter_pwrlock(&pwrpriv->lock);
  167799. + pwrpriv->bips_processing = _TRUE;
  167800. + //padapter->net_closed = _TRUE;
  167801. + //s1.
  167802. + if(pnetdev)
  167803. + {
  167804. + netif_carrier_off(pnetdev);
  167805. + rtw_netif_stop_queue(pnetdev);
  167806. + }
  167807. +
  167808. + //s2.
  167809. + rtw_disassoc_cmd(padapter, 500, _FALSE);
  167810. +
  167811. + //s2-2. indicate disconnect to os
  167812. + //rtw_indicate_disconnect(padapter);
  167813. + {
  167814. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  167815. +
  167816. + if(check_fwstate(pmlmepriv, _FW_LINKED))
  167817. + {
  167818. + _clr_fwstate_(pmlmepriv, _FW_LINKED);
  167819. +
  167820. + rtw_led_control(padapter, LED_CTL_NO_LINK);
  167821. +
  167822. + rtw_os_indicate_disconnect(padapter);
  167823. +
  167824. + #ifdef CONFIG_LPS
  167825. + //donnot enqueue cmd
  167826. + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0);
  167827. + #endif
  167828. + }
  167829. +
  167830. + }
  167831. + //s2-3.
  167832. + rtw_free_assoc_resources(padapter, 1);
  167833. +
  167834. + //s2-4.
  167835. + rtw_free_network_queue(padapter,_TRUE);
  167836. + #ifdef CONFIG_IPS
  167837. + rtw_ips_dev_unload(padapter);
  167838. + #endif
  167839. + pwrpriv->rf_pwrstate = rf_off;
  167840. + pwrpriv->bips_processing = _FALSE;
  167841. +
  167842. + _exit_pwrlock(&pwrpriv->lock);
  167843. + }
  167844. + else
  167845. + goto error_exit;
  167846. +
  167847. + _func_exit_;
  167848. + return 0;
  167849. +
  167850. +error_exit:
  167851. + DBG_871X("%s, failed \n",__FUNCTION__);
  167852. + return (-1);
  167853. +
  167854. +}
  167855. +
  167856. +int rtw_hw_resume(_adapter *padapter)
  167857. +{
  167858. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  167859. + struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf;
  167860. + struct net_device *pnetdev = padapter->pnetdev;
  167861. +
  167862. + _func_enter_;
  167863. +
  167864. + if(padapter)//system resume
  167865. + {
  167866. + DBG_871X("==> rtw_hw_resume\n");
  167867. + _enter_pwrlock(&pwrpriv->lock);
  167868. + pwrpriv->bips_processing = _TRUE;
  167869. + rtw_reset_drv_sw(padapter);
  167870. +
  167871. + if(pm_netdev_open(pnetdev,_FALSE) != 0)
  167872. + {
  167873. + _exit_pwrlock(&pwrpriv->lock);
  167874. + goto error_exit;
  167875. + }
  167876. +
  167877. + netif_device_attach(pnetdev);
  167878. + netif_carrier_on(pnetdev);
  167879. +
  167880. + if(!rtw_netif_queue_stopped(pnetdev))
  167881. + rtw_netif_start_queue(pnetdev);
  167882. + else
  167883. + rtw_netif_wake_queue(pnetdev);
  167884. +
  167885. + pwrpriv->bkeepfwalive = _FALSE;
  167886. + pwrpriv->brfoffbyhw = _FALSE;
  167887. +
  167888. + pwrpriv->rf_pwrstate = rf_on;
  167889. + pwrpriv->bips_processing = _FALSE;
  167890. +
  167891. + _exit_pwrlock(&pwrpriv->lock);
  167892. + }
  167893. + else
  167894. + {
  167895. + goto error_exit;
  167896. + }
  167897. +
  167898. + _func_exit_;
  167899. +
  167900. + return 0;
  167901. +error_exit:
  167902. + DBG_871X("%s, Open net dev failed \n",__FUNCTION__);
  167903. + return (-1);
  167904. +}
  167905. +#endif
  167906. +
  167907. +static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
  167908. +{
  167909. + struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
  167910. + _adapter *padapter = dvobj->if1;
  167911. + struct net_device *pnetdev = padapter->pnetdev;
  167912. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  167913. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  167914. + struct usb_device *usb_dev = interface_to_usbdev(pusb_intf);
  167915. +#ifdef CONFIG_WOWLAN
  167916. + struct wowlan_ioctl_param poidparam;
  167917. +#endif // CONFIG_WOWLAN
  167918. + int ret = 0;
  167919. + u32 start_time = rtw_get_current_time();
  167920. + _func_enter_;
  167921. +
  167922. + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
  167923. +
  167924. + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
  167925. + {
  167926. + DBG_871X("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
  167927. + padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
  167928. + goto exit;
  167929. + }
  167930. +
  167931. + if(pwrpriv->bInternalAutoSuspend )
  167932. + {
  167933. + #ifdef CONFIG_AUTOSUSPEND
  167934. + #ifdef SUPPORT_HW_RFOFF_DETECTED
  167935. + // The FW command register update must after MAC and FW init ready.
  167936. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
  167937. + {
  167938. + u8 bOpen = _TRUE;
  167939. + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);
  167940. + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect
  167941. + }
  167942. + #endif
  167943. + #endif
  167944. + }
  167945. + pwrpriv->bInSuspend = _TRUE;
  167946. + rtw_cancel_all_timer(padapter);
  167947. + LeaveAllPowerSaveMode(padapter);
  167948. +
  167949. + rtw_stop_cmd_thread(padapter);
  167950. +
  167951. + _enter_pwrlock(&pwrpriv->lock);
  167952. + //padapter->net_closed = _TRUE;
  167953. + //s1.
  167954. + if(pnetdev)
  167955. + {
  167956. + netif_carrier_off(pnetdev);
  167957. + rtw_netif_stop_queue(pnetdev);
  167958. + }
  167959. +#ifdef CONFIG_WOWLAN
  167960. + if(padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE&&padapter->pwrctrlpriv.wowlan_mode==_TRUE){
  167961. + u8 ps_mode=PS_MODE_MIN;
  167962. + //set H2C command
  167963. + poidparam.subcode=WOWLAN_ENABLE;
  167964. + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
  167965. + //rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, &ps_mode);
  167966. + //rtw_set_rpwm(padapter, PS_STATE_S2);
  167967. + }
  167968. + else
  167969. +#endif //CONFIG_WOWLAN
  167970. + {
  167971. + //s2.
  167972. + rtw_disassoc_cmd(padapter, 0, _FALSE);
  167973. + }
  167974. +
  167975. +#ifdef CONFIG_LAYER2_ROAMING_RESUME
  167976. + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) )
  167977. + {
  167978. + //printk("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid);
  167979. + DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__,
  167980. + pmlmepriv->cur_network.network.Ssid.Ssid,
  167981. + MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
  167982. + pmlmepriv->cur_network.network.Ssid.SsidLength,
  167983. + pmlmepriv->assoc_ssid.SsidLength);
  167984. + rtw_set_roaming(padapter, 1);
  167985. + }
  167986. +#endif
  167987. + //s2-2. indicate disconnect to os
  167988. + rtw_indicate_disconnect(padapter);
  167989. + //s2-3.
  167990. + rtw_free_assoc_resources(padapter, 1);
  167991. +#ifdef CONFIG_AUTOSUSPEND
  167992. + if(!pwrpriv->bInternalAutoSuspend )
  167993. +#endif
  167994. + //s2-4.
  167995. + rtw_free_network_queue(padapter, _TRUE);
  167996. +
  167997. + rtw_dev_unload(padapter);
  167998. +#ifdef CONFIG_AUTOSUSPEND
  167999. + pwrpriv->rf_pwrstate = rf_off;
  168000. + pwrpriv->bips_processing = _FALSE;
  168001. +#endif
  168002. + _exit_pwrlock(&pwrpriv->lock);
  168003. +
  168004. + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
  168005. + rtw_indicate_scan_done(padapter, 1);
  168006. +
  168007. + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
  168008. + rtw_indicate_disconnect(padapter);
  168009. +
  168010. +exit:
  168011. + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__
  168012. + , ret, rtw_get_passing_time_ms(start_time));
  168013. +
  168014. + _func_exit_;
  168015. + return ret;
  168016. +}
  168017. +
  168018. +static int rtw_resume(struct usb_interface *pusb_intf)
  168019. +{
  168020. + struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
  168021. + _adapter *padapter = dvobj->if1;
  168022. + struct net_device *pnetdev = padapter->pnetdev;
  168023. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  168024. + int ret = 0;
  168025. +
  168026. + if(pwrpriv->bInternalAutoSuspend ){
  168027. + ret = rtw_resume_process(padapter);
  168028. + } else {
  168029. +#ifdef CONFIG_RESUME_IN_WORKQUEUE
  168030. + rtw_resume_in_workqueue(pwrpriv);
  168031. +#else
  168032. + if (rtw_is_earlysuspend_registered(pwrpriv)
  168033. + #ifdef CONFIG_WOWLAN
  168034. + && !padapter->pwrctrlpriv.wowlan_mode
  168035. + #endif /* CONFIG_WOWLAN */
  168036. + ) {
  168037. + /* jeff: bypass resume here, do in late_resume */
  168038. + rtw_set_do_late_resume(pwrpriv, _TRUE);
  168039. + } else {
  168040. + ret = rtw_resume_process(padapter);
  168041. + }
  168042. +#endif /* CONFIG_RESUME_IN_WORKQUEUE */
  168043. + }
  168044. +
  168045. + return ret;
  168046. +
  168047. +}
  168048. +
  168049. +int rtw_resume_process(_adapter *padapter)
  168050. +{
  168051. + struct net_device *pnetdev;
  168052. + struct pwrctrl_priv *pwrpriv;
  168053. + int ret = -1;
  168054. + u32 start_time = rtw_get_current_time();
  168055. + _func_enter_;
  168056. +
  168057. + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
  168058. +
  168059. + if(padapter) {
  168060. + pnetdev= padapter->pnetdev;
  168061. + pwrpriv = &padapter->pwrctrlpriv;
  168062. + } else {
  168063. + goto exit;
  168064. + }
  168065. +
  168066. + _enter_pwrlock(&pwrpriv->lock);
  168067. + rtw_reset_drv_sw(padapter);
  168068. + pwrpriv->bkeepfwalive = _FALSE;
  168069. +
  168070. + DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
  168071. + if(pm_netdev_open(pnetdev,_TRUE) != 0) {
  168072. + _exit_pwrlock(&pwrpriv->lock);
  168073. + goto exit;
  168074. + }
  168075. +
  168076. + netif_device_attach(pnetdev);
  168077. + netif_carrier_on(pnetdev);
  168078. +
  168079. +#ifdef CONFIG_AUTOSUSPEND
  168080. + if(pwrpriv->bInternalAutoSuspend )
  168081. + {
  168082. + #ifdef CONFIG_AUTOSUSPEND
  168083. + #ifdef SUPPORT_HW_RFOFF_DETECTED
  168084. + // The FW command register update must after MAC and FW init ready.
  168085. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))
  168086. + {
  168087. + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect
  168088. + u8 bOpen = _FALSE;
  168089. + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);
  168090. + }
  168091. + #endif
  168092. + #endif
  168093. +
  168094. + pwrpriv->bInternalAutoSuspend = _FALSE;
  168095. + pwrpriv->brfoffbyhw = _FALSE;
  168096. + }
  168097. +#endif
  168098. + _exit_pwrlock(&pwrpriv->lock);
  168099. +
  168100. + if( padapter->pid[1]!=0) {
  168101. + DBG_871X("pid[1]:%d\n",padapter->pid[1]);
  168102. + rtw_signal_process(padapter->pid[1], SIGUSR2);
  168103. + }
  168104. +
  168105. + #ifdef CONFIG_LAYER2_ROAMING_RESUME
  168106. + rtw_roaming(padapter, NULL);
  168107. + #endif
  168108. +
  168109. + ret = 0;
  168110. +exit:
  168111. + #ifdef CONFIG_RESUME_IN_WORKQUEUE
  168112. + rtw_unlock_suspend();
  168113. + #endif //CONFIG_RESUME_IN_WORKQUEUE
  168114. +
  168115. + pwrpriv->bInSuspend = _FALSE;
  168116. + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__
  168117. + , ret, rtw_get_passing_time_ms(start_time));
  168118. +
  168119. + _func_exit_;
  168120. +
  168121. + return ret;
  168122. +}
  168123. +
  168124. +#ifdef CONFIG_AUTOSUSPEND
  168125. +void autosuspend_enter(_adapter* padapter)
  168126. +{
  168127. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  168128. + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  168129. +
  168130. + pwrpriv->bInternalAutoSuspend = _TRUE;
  168131. + pwrpriv->bips_processing = _TRUE;
  168132. +
  168133. + DBG_871X("==>autosuspend_enter...........\n");
  168134. +
  168135. + if(rf_off == pwrpriv->change_rfpwrstate )
  168136. + {
  168137. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  168138. + usb_enable_autosuspend(dvobj->pusbdev);
  168139. + #else
  168140. + dvobj->pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user
  168141. + #endif
  168142. +
  168143. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))
  168144. + usb_autopm_put_interface(dvobj->pusbintf);
  168145. + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))
  168146. + usb_autopm_enable(dvobj->pusbintf);
  168147. + #else
  168148. + usb_autosuspend_device(dvobj->pusbdev, 1);
  168149. + #endif
  168150. + }
  168151. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))
  168152. + DBG_871X("...pm_usage_cnt(%d).....\n", atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));
  168153. + #else
  168154. + DBG_871X("...pm_usage_cnt(%d).....\n", dvobj->pusbintf->pm_usage_cnt);
  168155. + #endif
  168156. +
  168157. +}
  168158. +int autoresume_enter(_adapter* padapter)
  168159. +{
  168160. + int result = _SUCCESS;
  168161. + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
  168162. + struct security_priv* psecuritypriv=&(padapter->securitypriv);
  168163. + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  168164. + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  168165. + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  168166. +
  168167. +
  168168. + DBG_871X("====> autoresume_enter \n");
  168169. +
  168170. + if(rf_off == pwrpriv->rf_pwrstate )
  168171. + {
  168172. + pwrpriv->ps_flag = _FALSE;
  168173. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))
  168174. + if (usb_autopm_get_interface(dvobj->pusbintf) < 0)
  168175. + {
  168176. + DBG_871X( "can't get autopm: %d\n", result);
  168177. + result = _FAIL;
  168178. + goto error_exit;
  168179. + }
  168180. + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))
  168181. + usb_autopm_disable(dvobj->pusbintf);
  168182. + #else
  168183. + usb_autoresume_device(dvobj->pusbdev, 1);
  168184. + #endif
  168185. +
  168186. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))
  168187. + DBG_871X("...pm_usage_cnt(%d).....\n", atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));
  168188. + #else
  168189. + DBG_871X("...pm_usage_cnt(%d).....\n", dvobj->pusbintf->pm_usage_cnt);
  168190. + #endif
  168191. + }
  168192. + DBG_871X("<==== autoresume_enter \n");
  168193. +error_exit:
  168194. +
  168195. + return result;
  168196. +}
  168197. +#endif
  168198. +
  168199. +#ifdef CONFIG_PLATFORM_RTD2880B
  168200. +extern void rtd2885_wlan_netlink_sendMsg(char *action_string, char *name);
  168201. +#endif
  168202. +
  168203. +#ifdef CONFIG_PLATFORM_ARM_SUNxI
  168204. +#include <mach/sys_config.h>
  168205. +extern int sw_usb_disable_hcd(__u32 usbc_no);
  168206. +extern int sw_usb_enable_hcd(__u32 usbc_no);
  168207. +static int usb_wifi_host = 2;
  168208. +#endif
  168209. +
  168210. +#ifdef CONFIG_PLATFORM_ARM_SUN6I
  168211. +#include <mach/sys_config.h>
  168212. +extern int sw_usb_disable_hcd(__u32 usbc_no);
  168213. +extern int sw_usb_enable_hcd(__u32 usbc_no);
  168214. +extern void wifi_pm_power(int on);
  168215. +static script_item_u item;
  168216. +#endif
  168217. +
  168218. +_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
  168219. + struct usb_interface *pusb_intf, const struct usb_device_id *pdid)
  168220. +{
  168221. + _adapter *padapter = NULL;
  168222. + struct net_device *pnetdev = NULL;
  168223. + int status = _FAIL;
  168224. +
  168225. + if ((padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter))) == NULL) {
  168226. + goto exit;
  168227. + }
  168228. + padapter->dvobj = dvobj;
  168229. + dvobj->if1 = padapter;
  168230. +
  168231. + padapter->bDriverStopped=_TRUE;
  168232. +
  168233. + dvobj->padapters[dvobj->iface_nums++] = padapter;
  168234. + padapter->iface_id = IFACE_ID0;
  168235. +
  168236. +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT)
  168237. + //set adapter_type/iface type for primary padapter
  168238. + padapter->isprimary = _TRUE;
  168239. + padapter->adapter_type = PRIMARY_ADAPTER;
  168240. + #ifndef CONFIG_HWPORT_SWAP
  168241. + padapter->iface_type = IFACE_PORT0;
  168242. + #else
  168243. + padapter->iface_type = IFACE_PORT1;
  168244. + #endif
  168245. +#endif
  168246. +
  168247. + #ifndef RTW_DVOBJ_CHIP_HW_TYPE
  168248. + //step 1-1., decide the chip_type via vid/pid
  168249. + padapter->interface_type = RTW_USB;
  168250. + decide_chip_type_by_usb_device_id(padapter, pdid);
  168251. + #endif
  168252. +
  168253. + if((pnetdev = rtw_init_netdev(padapter)) == NULL) {
  168254. + goto free_adapter;
  168255. + }
  168256. + SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
  168257. + padapter = rtw_netdev_priv(pnetdev);
  168258. +
  168259. + //step 2. hook HalFunc, allocate HalData
  168260. + if(padapter->chip_type == RTL8188C_8192C) {
  168261. + #ifdef CONFIG_RTL8192C
  168262. + rtl8192cu_set_hal_ops(padapter);
  168263. + #endif
  168264. + } else if(padapter->chip_type == RTL8192D) {
  168265. + #ifdef CONFIG_RTL8192D
  168266. + rtl8192du_set_hal_ops(padapter);
  168267. + #endif
  168268. + } else {
  168269. + DBG_871X("Detect NULL_CHIP_TYPE\n");
  168270. + goto free_hal_data;
  168271. + }
  168272. +
  168273. + //step 3.
  168274. + padapter->intf_start=&usb_intf_start;
  168275. + padapter->intf_stop=&usb_intf_stop;
  168276. +
  168277. + //.2
  168278. + if ((rtw_init_io_priv(padapter, usb_set_intf_ops)) == _FAIL) {
  168279. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n"));
  168280. + goto free_hal_data;
  168281. + }
  168282. +
  168283. + rtw_hal_read_chip_version(padapter);
  168284. +
  168285. + //.4 usb endpoint mapping
  168286. + rtw_hal_chip_configure(padapter);
  168287. +
  168288. + //step 4. read efuse/eeprom data and get mac_addr
  168289. + rtw_hal_read_chip_info(padapter);
  168290. +
  168291. + if (rtw_handle_dualmac(padapter, 1) != _SUCCESS)
  168292. + goto free_hal_data;
  168293. +
  168294. +#ifdef CONFIG_IOCTL_CFG80211
  168295. + if(rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) {
  168296. + goto handle_dualmac;
  168297. + }
  168298. +#endif
  168299. +
  168300. + //step 5.
  168301. + if (rtw_init_drv_sw(padapter) == _FAIL) {
  168302. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n"));
  168303. + goto free_wdev;
  168304. + }
  168305. +
  168306. +#ifdef CONFIG_PM
  168307. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  168308. + if(padapter->pwrctrlpriv.bSupportRemoteWakeup)
  168309. + {
  168310. + dvobj->pusbdev->do_remote_wakeup=1;
  168311. + pusb_intf->needs_remote_wakeup = 1;
  168312. + device_init_wakeup(&pusb_intf->dev, 1);
  168313. + DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n");
  168314. + DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev));
  168315. + }
  168316. +#endif
  168317. +#endif
  168318. +
  168319. +#ifdef CONFIG_AUTOSUSPEND
  168320. + if( padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE )
  168321. + {
  168322. + if(padapter->registrypriv.usbss_enable ){ /* autosuspend (2s delay) */
  168323. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,38))
  168324. + dvobj->pusbdev->dev.power.autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time
  168325. + #else
  168326. + dvobj->pusbdev->autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time
  168327. + #endif
  168328. +
  168329. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  168330. + usb_enable_autosuspend(dvobj->pusbdev);
  168331. + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))
  168332. + padapter->bDisableAutosuspend = dvobj->pusbdev->autosuspend_disabled ;
  168333. + dvobj->pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user
  168334. + #endif
  168335. +
  168336. + usb_autopm_get_interface(dvobj->pusbintf );//init pm_usage_cnt ,let it start from 1
  168337. +
  168338. + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))
  168339. + DBG_871X("%s...pm_usage_cnt(%d).....\n",__FUNCTION__, atomic_read(&(dvobj->pusbintf ->pm_usage_cnt)));
  168340. + #else
  168341. + DBG_871X("%s...pm_usage_cnt(%d).....\n",__FUNCTION__, dvobj->pusbintf ->pm_usage_cnt);
  168342. + #endif
  168343. + }
  168344. + }
  168345. +#endif
  168346. +
  168347. + // set mac addr
  168348. + rtw_macaddr_cfg(padapter->eeprompriv.mac_addr);
  168349. + rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr);
  168350. +
  168351. + DBG_871X("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n"
  168352. + ,padapter->bDriverStopped
  168353. + ,padapter->bSurpriseRemoved
  168354. + ,padapter->bup
  168355. + ,padapter->hw_init_completed
  168356. + );
  168357. +
  168358. + status = _SUCCESS;
  168359. +
  168360. +free_wdev:
  168361. + if(status != _SUCCESS) {
  168362. + #ifdef CONFIG_IOCTL_CFG80211
  168363. + rtw_wdev_unregister(padapter->rtw_wdev);
  168364. + rtw_wdev_free(padapter->rtw_wdev);
  168365. + #endif
  168366. + }
  168367. +handle_dualmac:
  168368. + if (status != _SUCCESS)
  168369. + rtw_handle_dualmac(padapter, 0);
  168370. +free_hal_data:
  168371. + if(status != _SUCCESS && padapter->HalData)
  168372. + rtw_mfree(padapter->HalData, sizeof(*(padapter->HalData)));
  168373. +free_adapter:
  168374. + if (status != _SUCCESS) {
  168375. + if (pnetdev)
  168376. + rtw_free_netdev(pnetdev);
  168377. + else if (padapter)
  168378. + rtw_vmfree((u8*)padapter, sizeof(*padapter));
  168379. + padapter = NULL;
  168380. + }
  168381. +exit:
  168382. + return padapter;
  168383. +}
  168384. +
  168385. +static void rtw_usb_if1_deinit(_adapter *if1)
  168386. +{
  168387. + struct net_device *pnetdev = if1->pnetdev;
  168388. + struct mlme_priv *pmlmepriv= &if1->mlmepriv;
  168389. +
  168390. + if(check_fwstate(pmlmepriv, _FW_LINKED))
  168391. + rtw_disassoc_cmd(if1, 0, _FALSE);
  168392. +
  168393. +#ifdef CONFIG_AP_MODE
  168394. + free_mlme_ap_info(if1);
  168395. + #ifdef CONFIG_HOSTAPD_MLME
  168396. + hostapd_mode_unload(if1);
  168397. + #endif
  168398. +#endif
  168399. +
  168400. + rtw_cancel_all_timer(if1);
  168401. +#ifdef CONFIG_WOWLAN
  168402. + if1->pwrctrlpriv.wowlan_mode=_FALSE;
  168403. +#endif //CONFIG_WOWLAN
  168404. + rtw_dev_unload(if1);
  168405. +
  168406. + DBG_871X("%s, hw_init_completed=%d\n", __func__, if1->hw_init_completed);
  168407. +
  168408. + //s6.
  168409. + rtw_handle_dualmac(if1, 0);
  168410. +
  168411. +#ifdef CONFIG_IOCTL_CFG80211
  168412. + if (if1->rtw_wdev)
  168413. + rtw_wdev_free(if1->rtw_wdev);
  168414. +#endif //CONFIG_IOCTL_CFG80211
  168415. +
  168416. + rtw_free_drv_sw(if1);
  168417. +
  168418. + if(pnetdev)
  168419. + rtw_free_netdev(pnetdev);
  168420. +
  168421. +#ifdef CONFIG_PLATFORM_RTD2880B
  168422. + DBG_871X("wlan link down\n");
  168423. + rtd2885_wlan_netlink_sendMsg("linkdown", "8712");
  168424. +#endif
  168425. +
  168426. +}
  168427. +
  168428. +/*
  168429. + * drv_init() - a device potentially for us
  168430. + *
  168431. + * notes: drv_init() is called when the bus driver has located a card for us to support.
  168432. + * We accept the new device by returning 0.
  168433. +*/
  168434. +
  168435. +_adapter *rtw_sw_export = NULL;
  168436. +
  168437. +static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *did)
  168438. +{
  168439. + int i;
  168440. + uint status = _FAIL;
  168441. + _adapter *if1 = NULL, *if2 = NULL;
  168442. + struct dvobj_priv *dvobj = NULL;
  168443. +
  168444. +
  168445. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n"));
  168446. +
  168447. +
  168448. + //step 0.
  168449. + process_spec_devid(did);
  168450. +
  168451. + /* Initialize dvobj_priv */
  168452. + if ((dvobj = usb_dvobj_init(pusb_intf)) == NULL) {
  168453. + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("initialize device object priv Failed!\n"));
  168454. + goto exit;
  168455. + }
  168456. +
  168457. + /* Initialize if1 */
  168458. + if ((if1 = rtw_usb_if1_init(dvobj, pusb_intf, did)) == NULL) {
  168459. + DBG_871X("rtw_usb_if1_init Failed!\n");
  168460. + goto free_dvobj;
  168461. + }
  168462. +
  168463. + /* Initialize if2 */
  168464. +#ifdef CONFIG_CONCURRENT_MODE
  168465. + if((if2 = rtw_drv_if2_init(if1, usb_set_intf_ops)) == NULL) {
  168466. + goto free_if1;
  168467. + }
  168468. +#ifdef CONFIG_MULTI_VIR_IFACES
  168469. + for(i=0; i<if1->registrypriv.ext_iface_num;i++)
  168470. + {
  168471. + if(rtw_drv_add_vir_if(if1, usb_set_intf_ops) == NULL)
  168472. + {
  168473. + DBG_871X("rtw_drv_add_iface failed! (%d)\n", i);
  168474. + goto free_if1;
  168475. + }
  168476. + }
  168477. +#endif //CONFIG_MULTI_VIR_IFACES
  168478. +#endif
  168479. +
  168480. +#ifdef CONFIG_INTEL_PROXIM
  168481. + rtw_sw_export=if1;
  168482. +#endif
  168483. +
  168484. +#ifdef CONFIG_GLOBAL_UI_PID
  168485. + if (ui_pid[1]!=0) {
  168486. + DBG_871X("ui_pid[1]:%d\n",ui_pid[1]);
  168487. + rtw_signal_process(ui_pid[1], SIGUSR2);
  168488. + }
  168489. +#endif
  168490. +
  168491. + //dev_alloc_name && register_netdev
  168492. + if((status = rtw_drv_register_netdev(if1)) != _SUCCESS) {
  168493. + goto free_if1;
  168494. + }
  168495. +
  168496. +#ifdef CONFIG_HOSTAPD_MLME
  168497. + hostapd_mode_init(if1);
  168498. +#endif
  168499. +
  168500. +#ifdef CONFIG_PLATFORM_RTD2880B
  168501. + DBG_871X("wlan link up\n");
  168502. + rtd2885_wlan_netlink_sendMsg("linkup", "8712");
  168503. +#endif
  168504. +
  168505. +#ifdef RTK_DMP_PLATFORM
  168506. + rtw_proc_init_one(if1->pnetdev);
  168507. +#endif
  168508. +
  168509. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n"));
  168510. +
  168511. + status = _SUCCESS;
  168512. +
  168513. +free_if1:
  168514. + if (status != _SUCCESS && if1) {
  168515. + rtw_usb_if1_deinit(if1);
  168516. + }
  168517. +free_dvobj:
  168518. + if (status != _SUCCESS)
  168519. + usb_dvobj_deinit(pusb_intf);
  168520. +exit:
  168521. + return status == _SUCCESS?0:-ENODEV;
  168522. +}
  168523. +
  168524. +/*
  168525. + * dev_remove() - our device is being removed
  168526. +*/
  168527. +//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both
  168528. +static void rtw_dev_remove(struct usb_interface *pusb_intf)
  168529. +{
  168530. + struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
  168531. + _adapter *padapter = dvobj->if1;
  168532. +
  168533. +_func_exit_;
  168534. +
  168535. + DBG_871X("+rtw_dev_remove\n");
  168536. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n"));
  168537. +
  168538. + dvobj->processing_dev_remove = _TRUE;
  168539. +
  168540. + rtw_unregister_netdevs(dvobj);
  168541. +
  168542. + if(usb_drv->drv_registered == _TRUE)
  168543. + {
  168544. + //DBG_871X("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n");
  168545. + padapter->bSurpriseRemoved = _TRUE;
  168546. + }
  168547. + /*else
  168548. + {
  168549. + //DBG_871X("r871xu_dev_remove():module removed\n");
  168550. + padapter->hw_init_completed = _FALSE;
  168551. + }*/
  168552. +
  168553. +#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
  168554. + rtw_unregister_early_suspend(&padapter->pwrctrlpriv);
  168555. +#endif
  168556. +
  168557. + rtw_pm_set_ips(padapter, IPS_NONE);
  168558. + rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
  168559. +
  168560. + LeaveAllPowerSaveMode(padapter);
  168561. +
  168562. +#ifdef CONFIG_CONCURRENT_MODE
  168563. +#ifdef CONFIG_MULTI_VIR_IFACES
  168564. + rtw_drv_stop_vir_ifaces(dvobj);
  168565. +#endif //CONFIG_MULTI_VIR_IFACES
  168566. + rtw_drv_if2_stop(dvobj->if2);
  168567. +#endif //CONFIG_CONCURRENT_MODE
  168568. +
  168569. + rtw_usb_if1_deinit(padapter);
  168570. +
  168571. +#ifdef CONFIG_CONCURRENT_MODE
  168572. +#ifdef CONFIG_MULTI_VIR_IFACES
  168573. + rtw_drv_free_vir_ifaces(dvobj);
  168574. +#endif //CONFIG_MULTI_VIR_IFACES
  168575. + rtw_drv_if2_free(dvobj->if2);
  168576. +#endif //CONFIG_CONCURRENT_MODE
  168577. +
  168578. + usb_dvobj_deinit(pusb_intf);
  168579. +
  168580. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-dev_remove()\n"));
  168581. + DBG_871X("-r871xu_dev_remove, done\n");
  168582. +
  168583. +
  168584. +#ifdef CONFIG_INTEL_PROXIM
  168585. + rtw_sw_export=NULL;
  168586. +#endif
  168587. +
  168588. +_func_exit_;
  168589. +
  168590. + return;
  168591. +
  168592. +}
  168593. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
  168594. +extern int console_suspend_enabled;
  168595. +#endif
  168596. +
  168597. +static int __init rtw_drv_entry(void)
  168598. +{
  168599. +#ifdef CONFIG_PLATFORM_RTK_DMP
  168600. + u32 tmp;
  168601. + tmp=readl((volatile unsigned int*)0xb801a608);
  168602. + tmp &= 0xffffff00;
  168603. + tmp |= 0x55;
  168604. + writel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055
  168605. +#endif
  168606. +#ifdef CONFIG_PLATFORM_ARM_SUNxI
  168607. +#ifndef CONFIG_RTL8723A
  168608. + int ret = 0;
  168609. + /* ----------get usb_wifi_usbc_num------------- */
  168610. + ret = script_parser_fetch("usb_wifi_para", "usb_wifi_usbc_num", (int *)&usb_wifi_host, 64);
  168611. + if(ret != 0){
  168612. + printk("ERR: script_parser_fetch usb_wifi_usbc_num failed\n");
  168613. + ret = -ENOMEM;
  168614. + return ret;
  168615. + }
  168616. + printk("sw_usb_enable_hcd: usbc_num = %d\n", usb_wifi_host);
  168617. + sw_usb_enable_hcd(usb_wifi_host);
  168618. +#endif //CONFIG_RTL8723A
  168619. +#endif //CONFIG_PLATFORM_ARM_SUNxI
  168620. +
  168621. +#ifdef CONFIG_PLATFORM_ARM_SUN6I
  168622. + script_item_value_type_e type;
  168623. +
  168624. + type = script_get_item("wifi_para", "wifi_usbc_id", &item);
  168625. + if(SCIRPT_ITEM_VALUE_TYPE_INT != type){
  168626. + printk("ERR: script_get_item wifi_usbc_id failed\n");
  168627. + return -ENOMEM;
  168628. + }
  168629. +
  168630. + printk("sw_usb_enable_hcd: usbc_num = %d\n", item.val);
  168631. + wifi_pm_power(1);
  168632. + mdelay(10);
  168633. + sw_usb_enable_hcd(item.val);
  168634. +#endif //CONFIG_PLATFORM_ARM_SUN6I
  168635. +
  168636. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n"));
  168637. +
  168638. + DBG_871X(DRV_NAME " driver version=%s\n", DRIVERVERSION);
  168639. + DBG_871X("build time: %s %s\n", __DATE__, __TIME__);
  168640. +
  168641. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
  168642. + //console_suspend_enabled=0;
  168643. +#endif
  168644. +
  168645. + rtw_suspend_lock_init();
  168646. +
  168647. + usb_drv->drv_registered = _TRUE;
  168648. + return usb_register(&usb_drv->usbdrv);
  168649. +}
  168650. +
  168651. +static void __exit rtw_drv_halt(void)
  168652. +{
  168653. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n"));
  168654. + DBG_871X("+rtw_drv_halt\n");
  168655. +
  168656. + usb_drv->drv_registered = _FALSE;
  168657. + usb_deregister(&usb_drv->usbdrv);
  168658. +
  168659. +#ifdef CONFIG_PLATFORM_ARM_SUNxI
  168660. +#ifndef CONFIG_RTL8723A
  168661. + printk("sw_usb_disable_hcd: usbc_num = %d\n", usb_wifi_host);
  168662. + sw_usb_disable_hcd(usb_wifi_host);
  168663. +#endif //ifndef CONFIG_RTL8723A
  168664. +#endif //CONFIG_PLATFORM_ARM_SUNxI
  168665. +#ifdef CONFIG_PLATFORM_ARM_SUN6I
  168666. + sw_usb_disable_hcd(item.val);
  168667. + wifi_pm_power(0);
  168668. +#endif
  168669. +
  168670. + rtw_suspend_lock_uninit();
  168671. + DBG_871X("-rtw_drv_halt\n");
  168672. +
  168673. + rtw_mstat_dump();
  168674. +}
  168675. +
  168676. +
  168677. +module_init(rtw_drv_entry);
  168678. +module_exit(rtw_drv_halt);
  168679. +
  168680. +#ifdef CONFIG_WOWLAN
  168681. +#ifdef CONFIG_WOWLAN_MANUAL
  168682. +
  168683. +int rtw_resume_toshiba(PADAPTER Adapter)
  168684. +{
  168685. + struct dvobj_priv *pdvobjpriv;
  168686. + pdvobjpriv = adapter_to_dvobj(Adapter);
  168687. +
  168688. + rtw_resume(pdvobjpriv->pusbintf);
  168689. + return 0;
  168690. +}
  168691. +
  168692. +int rtw_suspend_toshiba(PADAPTER Adapter)
  168693. +{
  168694. + pm_message_t msg;
  168695. + struct dvobj_priv *pdvobjpriv;
  168696. + pdvobjpriv = adapter_to_dvobj(Adapter);
  168697. + msg.event=0;
  168698. + //for Toshiba only, they should call rtw_suspend before suspend
  168699. + rtw_suspend(pdvobjpriv->pusbintf, msg);
  168700. + return 0;
  168701. +}
  168702. +EXPORT_SYMBOL(rtw_suspend_toshiba);
  168703. +EXPORT_SYMBOL(rtw_resume_toshiba);
  168704. +#endif //CONFIG_WOWLAN_MANUAL
  168705. +#endif //CONFIG_WOWLAN
  168706. +
  168707. +#ifdef CONFIG_INTEL_PROXIM
  168708. +_adapter *rtw_usb_get_sw_pointer(void)
  168709. +{
  168710. + return rtw_sw_export;
  168711. +}
  168712. +EXPORT_SYMBOL(rtw_usb_get_sw_pointer);
  168713. +#endif //CONFIG_INTEL_PROXIM
  168714. --- /dev/null
  168715. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_ops_linux.c
  168716. @@ -0,0 +1,648 @@
  168717. +/******************************************************************************
  168718. + *
  168719. + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  168720. + *
  168721. + * This program is free software; you can redistribute it and/or modify it
  168722. + * under the terms of version 2 of the GNU General Public License as
  168723. + * published by the Free Software Foundation.
  168724. + *
  168725. + * This program is distributed in the hope that it will be useful, but WITHOUT
  168726. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  168727. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  168728. + * more details.
  168729. + *
  168730. + * You should have received a copy of the GNU General Public License along with
  168731. + * this program; if not, write to the Free Software Foundation, Inc.,
  168732. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  168733. + *
  168734. + *******************************************************************************/
  168735. +#define _USB_OPS_LINUX_C_
  168736. +
  168737. +#include <drv_types.h>
  168738. +#include <usb_ops_linux.h>
  168739. +#include <rtw_sreset.h>
  168740. +
  168741. +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
  168742. +static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs)
  168743. +{
  168744. + if (urb) {
  168745. + if (urb->context) {
  168746. + rtw_mfree(urb->context);
  168747. + }
  168748. + usb_free_urb(urb);
  168749. + }
  168750. +}
  168751. +
  168752. +static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
  168753. + u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
  168754. +{
  168755. + int rc;
  168756. + unsigned int pipe;
  168757. + u8 reqtype;
  168758. + struct usb_ctrlrequest *dr;
  168759. + struct urb *urb;
  168760. + struct rtl819x_async_write_data {
  168761. + u8 data[VENDOR_CMD_MAX_DATA_LEN];
  168762. + struct usb_ctrlrequest dr;
  168763. + } *buf;
  168764. +
  168765. +
  168766. + if (requesttype == VENDOR_READ) {
  168767. + pipe = usb_rcvctrlpipe(udev, 0);//read_in
  168768. + reqtype = REALTEK_USB_VENQT_READ;
  168769. + }
  168770. + else {
  168771. + pipe = usb_sndctrlpipe(udev, 0);//write_out
  168772. + reqtype = REALTEK_USB_VENQT_WRITE;
  168773. + }
  168774. +
  168775. + buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf));
  168776. + if (!buf) {
  168777. + rc = -ENOMEM;
  168778. + goto exit;
  168779. + }
  168780. +
  168781. + urb = usb_alloc_urb(0, GFP_ATOMIC);
  168782. + if (!urb) {
  168783. + rtw_mfree((u8*)buf, sizeof(*buf));
  168784. + rc = -ENOMEM;
  168785. + goto exit;
  168786. + }
  168787. +
  168788. + dr = &buf->dr;
  168789. +
  168790. + dr->bRequestType = reqtype;
  168791. + dr->bRequest = request;
  168792. + dr->wValue = cpu_to_le16(value);
  168793. + dr->wIndex = cpu_to_le16(index);
  168794. + dr->wLength = cpu_to_le16(len);
  168795. +
  168796. + _rtw_memcpy(buf, pdata, len);
  168797. +
  168798. + usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len,
  168799. + _usbctrl_vendorreq_async_callback, buf);
  168800. +
  168801. + rc = usb_submit_urb(urb, GFP_ATOMIC);
  168802. + if (rc < 0) {
  168803. + rtw_mfree((u8*)buf, sizeof(*buf));
  168804. + usb_free_urb(urb);
  168805. + }
  168806. +
  168807. +exit:
  168808. + return rc;
  168809. +}
  168810. +
  168811. +int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len)
  168812. +{
  168813. + u8 request;
  168814. + u8 requesttype;
  168815. + u16 wvalue;
  168816. + u16 index;
  168817. +
  168818. + int ret;
  168819. +
  168820. + requesttype = VENDOR_WRITE;//write_out
  168821. + request = REALTEK_USB_VENQT_CMD_REQ;
  168822. + index = REALTEK_USB_VENQT_CMD_IDX;//n/a
  168823. +
  168824. + wvalue = (u16)(addr&0x0000ffff);
  168825. +
  168826. + ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype);
  168827. +
  168828. + return ret;
  168829. +}
  168830. +
  168831. +int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
  168832. +{
  168833. + u8 data;
  168834. + int ret;
  168835. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev;
  168836. + struct usb_device *udev=pdvobjpriv->pusbdev;
  168837. +
  168838. + _func_enter_;
  168839. + data = val;
  168840. + ret = usb_write_async(udev, addr, &data, 1);
  168841. + _func_exit_;
  168842. +
  168843. + return ret;
  168844. +}
  168845. +
  168846. +int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
  168847. +{
  168848. + u16 data;
  168849. + int ret;
  168850. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev;
  168851. + struct usb_device *udev=pdvobjpriv->pusbdev;
  168852. +
  168853. + _func_enter_;
  168854. + data = val;
  168855. + ret = usb_write_async(udev, addr, &data, 2);
  168856. + _func_exit_;
  168857. +
  168858. + return ret;
  168859. +}
  168860. +
  168861. +int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
  168862. +{
  168863. + u32 data;
  168864. + int ret;
  168865. + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev;
  168866. + struct usb_device *udev=pdvobjpriv->pusbdev;
  168867. +
  168868. + _func_enter_;
  168869. + data = val;
  168870. + ret = usb_write_async(udev, addr, &data, 4);
  168871. + _func_exit_;
  168872. +
  168873. + return ret;
  168874. +}
  168875. +#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */
  168876. +
  168877. +unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
  168878. +{
  168879. + unsigned int pipe=0;
  168880. + int ep_num=0;
  168881. + _adapter *padapter = pdvobj->if1;
  168882. + struct usb_device *pusbd = pdvobj->pusbdev;
  168883. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  168884. +
  168885. + if (addr == RECV_BULK_IN_ADDR) {
  168886. + pipe=usb_rcvbulkpipe(pusbd, pHalData->RtBulkInPipe);
  168887. +
  168888. + } else if (addr == RECV_INT_IN_ADDR) {
  168889. + pipe=usb_rcvbulkpipe(pusbd, pHalData->RtIntInPipe);
  168890. +
  168891. + } else if (addr < HW_QUEUE_ENTRY) {
  168892. + ep_num = pHalData->Queue2EPNum[addr];
  168893. + pipe = usb_sndbulkpipe(pusbd, ep_num);
  168894. + }
  168895. +
  168896. + return pipe;
  168897. +}
  168898. +
  168899. +struct zero_bulkout_context{
  168900. + void *pbuf;
  168901. + void *purb;
  168902. + void *pirp;
  168903. + void *padapter;
  168904. +};
  168905. +
  168906. +static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs)
  168907. +{
  168908. + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context;
  168909. +
  168910. + //DBG_8192C("+usb_bulkout_zero_complete\n");
  168911. +
  168912. + if(pcontext)
  168913. + {
  168914. + if(pcontext->pbuf)
  168915. + {
  168916. + rtw_mfree(pcontext->pbuf, sizeof(int));
  168917. + }
  168918. +
  168919. + if(pcontext->purb && (pcontext->purb==purb))
  168920. + {
  168921. + usb_free_urb(pcontext->purb);
  168922. + }
  168923. +
  168924. +
  168925. + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context));
  168926. + }
  168927. +
  168928. +
  168929. +}
  168930. +
  168931. +static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)
  168932. +{
  168933. + int pipe, status, len;
  168934. + u32 ret;
  168935. + unsigned char *pbuf;
  168936. + struct zero_bulkout_context *pcontext;
  168937. + PURB purb = NULL;
  168938. + _adapter *padapter = (_adapter *)pintfhdl->padapter;
  168939. + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
  168940. + struct usb_device *pusbd = pdvobj->pusbdev;
  168941. +
  168942. + //DBG_871X("%s\n", __func__);
  168943. +
  168944. +
  168945. + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx))
  168946. + {
  168947. + return _FAIL;
  168948. + }
  168949. +
  168950. +
  168951. + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context));
  168952. +
  168953. + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int));
  168954. + purb = usb_alloc_urb(0, GFP_ATOMIC);
  168955. +
  168956. + len = 0;
  168957. + pcontext->pbuf = pbuf;
  168958. + pcontext->purb = purb;
  168959. + pcontext->pirp = NULL;
  168960. + pcontext->padapter = padapter;
  168961. +
  168962. +
  168963. + //translate DMA FIFO addr to pipehandle
  168964. + //pipe = ffaddr2pipehdl(pdvobj, addr);
  168965. +
  168966. + usb_fill_bulk_urb(purb, pusbd, pipe,
  168967. + pbuf,
  168968. + len,
  168969. + usb_bulkout_zero_complete,
  168970. + pcontext);//context is pcontext
  168971. +
  168972. + status = usb_submit_urb(purb, GFP_ATOMIC);
  168973. +
  168974. + if (!status)
  168975. + {
  168976. + ret= _SUCCESS;
  168977. + }
  168978. + else
  168979. + {
  168980. + ret= _FAIL;
  168981. + }
  168982. +
  168983. +
  168984. + return _SUCCESS;
  168985. +
  168986. +}
  168987. +
  168988. +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
  168989. +{
  168990. +
  168991. +}
  168992. +
  168993. +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  168994. +{
  168995. +
  168996. +}
  168997. +
  168998. +
  168999. +void usb_read_port_cancel(struct intf_hdl *pintfhdl)
  169000. +{
  169001. + int i;
  169002. + struct recv_buf *precvbuf;
  169003. + _adapter *padapter = pintfhdl->padapter;
  169004. + precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf;
  169005. +
  169006. + DBG_871X("%s\n", __func__);
  169007. +
  169008. + padapter->bReadPortCancel = _TRUE;
  169009. +
  169010. + for (i=0; i < NR_RECVBUFF ; i++) {
  169011. +
  169012. + precvbuf->reuse = _TRUE;
  169013. + if (precvbuf->purb) {
  169014. + //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n");
  169015. + usb_kill_urb(precvbuf->purb);
  169016. + }
  169017. + precvbuf++;
  169018. + }
  169019. +
  169020. +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  169021. + usb_kill_urb(padapter->recvpriv.int_in_urb);
  169022. +#endif
  169023. +}
  169024. +
  169025. +static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs)
  169026. +{
  169027. + _irqL irqL;
  169028. + int i;
  169029. + struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context;
  169030. + //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
  169031. + //_adapter *padapter = pxmitframe->padapter;
  169032. + _adapter *padapter = pxmitbuf->padapter;
  169033. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  169034. + //struct pkt_attrib *pattrib = &pxmitframe->attrib;
  169035. +
  169036. +_func_enter_;
  169037. +
  169038. + switch(pxmitbuf->flags)
  169039. + {
  169040. + case VO_QUEUE_INX:
  169041. + pxmitpriv->voq_cnt--;
  169042. + break;
  169043. + case VI_QUEUE_INX:
  169044. + pxmitpriv->viq_cnt--;
  169045. + break;
  169046. + case BE_QUEUE_INX:
  169047. + pxmitpriv->beq_cnt--;
  169048. + break;
  169049. + case BK_QUEUE_INX:
  169050. + pxmitpriv->bkq_cnt--;
  169051. + break;
  169052. + case HIGH_QUEUE_INX:
  169053. +#ifdef CONFIG_AP_MODE
  169054. + rtw_chk_hi_queue_cmd(padapter);
  169055. +#endif
  169056. + break;
  169057. + default:
  169058. + break;
  169059. + }
  169060. +
  169061. +
  169062. +/*
  169063. + _enter_critical(&pxmitpriv->lock, &irqL);
  169064. +
  169065. + pxmitpriv->txirp_cnt--;
  169066. +
  169067. + switch(pattrib->priority)
  169068. + {
  169069. + case 1:
  169070. + case 2:
  169071. + pxmitpriv->bkq_cnt--;
  169072. + //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt);
  169073. + break;
  169074. + case 4:
  169075. + case 5:
  169076. + pxmitpriv->viq_cnt--;
  169077. + //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt);
  169078. + break;
  169079. + case 6:
  169080. + case 7:
  169081. + pxmitpriv->voq_cnt--;
  169082. + //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt);
  169083. + break;
  169084. + case 0:
  169085. + case 3:
  169086. + default:
  169087. + pxmitpriv->beq_cnt--;
  169088. + //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt);
  169089. + break;
  169090. +
  169091. + }
  169092. +
  169093. + _exit_critical(&pxmitpriv->lock, &irqL);
  169094. +
  169095. +
  169096. + if(pxmitpriv->txirp_cnt==0)
  169097. + {
  169098. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n"));
  169099. + _rtw_up_sema(&(pxmitpriv->tx_retevt));
  169100. + }
  169101. +*/
  169102. + //rtw_free_xmitframe(pxmitpriv, pxmitframe);
  169103. +
  169104. + if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel)
  169105. + {
  169106. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
  169107. + DBG_8192C("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->ext_tag(%x) \n",
  169108. + __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel,pxmitbuf->ext_tag);
  169109. +
  169110. + goto check_completion;
  169111. + }
  169112. +
  169113. +
  169114. + if (purb->status==0) {
  169115. +
  169116. + } else {
  169117. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status));
  169118. + DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status);
  169119. + if((purb->status==-EPIPE)||(purb->status==-EPROTO))
  169120. + {
  169121. + //usb_clear_halt(pusbdev, purb->pipe);
  169122. + //msleep(10);
  169123. + sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL);
  169124. + } else if (purb->status == -EINPROGRESS) {
  169125. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n"));
  169126. + goto check_completion;
  169127. +
  169128. + } else if (purb->status == -ENOENT) {
  169129. + DBG_871X("%s: -ENOENT\n", __func__);
  169130. + goto check_completion;
  169131. +
  169132. + } else if (purb->status == -ECONNRESET) {
  169133. + DBG_871X("%s: -ECONNRESET\n", __func__);
  169134. + goto check_completion;
  169135. +
  169136. + } else if (purb->status == -ESHUTDOWN) {
  169137. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n"));
  169138. + padapter->bDriverStopped=_TRUE;
  169139. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n"));
  169140. +
  169141. + goto check_completion;
  169142. + }
  169143. + else
  169144. + {
  169145. + padapter->bSurpriseRemoved=_TRUE;
  169146. + DBG_8192C("bSurpriseRemoved=TRUE\n");
  169147. + //rtl8192cu_trigger_gpio_0(padapter);
  169148. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n"));
  169149. +
  169150. + goto check_completion;
  169151. + }
  169152. + }
  169153. +
  169154. + #ifdef DBG_CONFIG_ERROR_DETECT
  169155. + {
  169156. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  169157. + pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time();
  169158. + }
  169159. + #endif
  169160. +
  169161. +check_completion:
  169162. + _enter_critical(&pxmitpriv->lock_sctx, &irqL);
  169163. + rtw_sctx_done_err(&pxmitbuf->sctx,
  169164. + purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS);
  169165. + _exit_critical(&pxmitpriv->lock_sctx, &irqL);
  169166. +
  169167. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  169168. +
  169169. + //if(rtw_txframes_pending(padapter))
  169170. + {
  169171. + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
  169172. + }
  169173. +
  169174. +_func_exit_;
  169175. +
  169176. +}
  169177. +
  169178. +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
  169179. +{
  169180. + _irqL irqL;
  169181. + unsigned int pipe;
  169182. + int status;
  169183. + u32 ret = _FAIL, bwritezero = _FALSE;
  169184. + PURB purb = NULL;
  169185. + _adapter *padapter = (_adapter *)pintfhdl->padapter;
  169186. + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
  169187. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  169188. + struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem;
  169189. + struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
  169190. + struct usb_device *pusbd = pdvobj->pusbdev;
  169191. + struct pkt_attrib *pattrib = &pxmitframe->attrib;
  169192. +
  169193. +_func_enter_;
  169194. +
  169195. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n"));
  169196. +
  169197. + if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) {
  169198. + #ifdef DBG_TX
  169199. + DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__
  169200. + ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx );
  169201. + #endif
  169202. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
  169203. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY);
  169204. + goto exit;
  169205. + }
  169206. +
  169207. + _enter_critical(&pxmitpriv->lock, &irqL);
  169208. +
  169209. + switch(addr)
  169210. + {
  169211. + case VO_QUEUE_INX:
  169212. + pxmitpriv->voq_cnt++;
  169213. + pxmitbuf->flags = VO_QUEUE_INX;
  169214. + break;
  169215. + case VI_QUEUE_INX:
  169216. + pxmitpriv->viq_cnt++;
  169217. + pxmitbuf->flags = VI_QUEUE_INX;
  169218. + break;
  169219. + case BE_QUEUE_INX:
  169220. + pxmitpriv->beq_cnt++;
  169221. + pxmitbuf->flags = BE_QUEUE_INX;
  169222. + break;
  169223. + case BK_QUEUE_INX:
  169224. + pxmitpriv->bkq_cnt++;
  169225. + pxmitbuf->flags = BK_QUEUE_INX;
  169226. + break;
  169227. + case HIGH_QUEUE_INX:
  169228. + pxmitbuf->flags = HIGH_QUEUE_INX;
  169229. + break;
  169230. + default:
  169231. + pxmitbuf->flags = MGT_QUEUE_INX;
  169232. + break;
  169233. + }
  169234. +
  169235. + _exit_critical(&pxmitpriv->lock, &irqL);
  169236. +
  169237. + purb = pxmitbuf->pxmit_urb[0];
  169238. +
  169239. +#if 0
  169240. + if(pdvobj->ishighspeed)
  169241. + {
  169242. + if(cnt> 0 && cnt%512 == 0)
  169243. + {
  169244. + //DBG_8192C("ishighspeed, cnt=%d\n", cnt);
  169245. + bwritezero = _TRUE;
  169246. + }
  169247. + }
  169248. + else
  169249. + {
  169250. + if(cnt > 0 && cnt%64 == 0)
  169251. + {
  169252. + //DBG_8192C("cnt=%d\n", cnt);
  169253. + bwritezero = _TRUE;
  169254. + }
  169255. + }
  169256. +#endif
  169257. +
  169258. + //translate DMA FIFO addr to pipehandle
  169259. + pipe = ffaddr2pipehdl(pdvobj, addr);
  169260. +
  169261. +#ifdef CONFIG_REDUCE_USB_TX_INT
  169262. + if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0)
  169263. + || (pxmitbuf->ext_tag == _TRUE) )
  169264. + {
  169265. + purb->transfer_flags &= (~URB_NO_INTERRUPT);
  169266. + } else {
  169267. + purb->transfer_flags |= URB_NO_INTERRUPT;
  169268. + //DBG_8192C("URB_NO_INTERRUPT ");
  169269. + }
  169270. +#endif
  169271. +
  169272. +
  169273. + usb_fill_bulk_urb(purb, pusbd, pipe,
  169274. + pxmitframe->buf_addr, //= pxmitbuf->pbuf
  169275. + cnt,
  169276. + usb_write_port_complete,
  169277. + pxmitbuf);//context is pxmitbuf
  169278. +
  169279. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX
  169280. + purb->transfer_dma = pxmitbuf->dma_transfer_addr;
  169281. + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  169282. + purb->transfer_flags |= URB_ZERO_PACKET;
  169283. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
  169284. +
  169285. +#if 0
  169286. + if (bwritezero)
  169287. + {
  169288. + purb->transfer_flags |= URB_ZERO_PACKET;
  169289. + }
  169290. +#endif
  169291. +
  169292. + status = usb_submit_urb(purb, GFP_ATOMIC);
  169293. + if (!status) {
  169294. + #ifdef DBG_CONFIG_ERROR_DETECT
  169295. + {
  169296. + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  169297. + pHalData->srestpriv.last_tx_time = rtw_get_current_time();
  169298. + }
  169299. + #endif
  169300. + } else {
  169301. + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
  169302. + DBG_871X("usb_write_port, status=%d\n", status);
  169303. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status));
  169304. +
  169305. + switch (status) {
  169306. + case -ENODEV:
  169307. + padapter->bDriverStopped=_TRUE;
  169308. + break;
  169309. + default:
  169310. + break;
  169311. + }
  169312. + goto exit;
  169313. + }
  169314. +
  169315. + ret= _SUCCESS;
  169316. +
  169317. +// Commented by Albert 2009/10/13
  169318. +// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically.
  169319. +/*
  169320. + if(bwritezero == _TRUE)
  169321. + {
  169322. + usb_bulkout_zero(pintfhdl, addr);
  169323. + }
  169324. +*/
  169325. +
  169326. + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n"));
  169327. +
  169328. +exit:
  169329. + if (ret != _SUCCESS)
  169330. + rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
  169331. +_func_exit_;
  169332. + return ret;
  169333. +
  169334. +}
  169335. +
  169336. +void usb_write_port_cancel(struct intf_hdl *pintfhdl)
  169337. +{
  169338. + int i, j;
  169339. + _adapter *padapter = pintfhdl->padapter;
  169340. + struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf;
  169341. +
  169342. + DBG_871X("%s \n", __func__);
  169343. +
  169344. + padapter->bWritePortCancel = _TRUE;
  169345. +
  169346. + for (i=0; i<NR_XMITBUFF; i++) {
  169347. + for (j=0; j<8; j++) {
  169348. + if (pxmitbuf->pxmit_urb[j]) {
  169349. + usb_kill_urb(pxmitbuf->pxmit_urb[j]);
  169350. + }
  169351. + }
  169352. + pxmitbuf++;
  169353. + }
  169354. +
  169355. + pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf;
  169356. + for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  169357. + for (j=0; j<8; j++) {
  169358. + if(pxmitbuf->pxmit_urb[j]) {
  169359. + usb_kill_urb(pxmitbuf->pxmit_urb[j]);
  169360. + }
  169361. + }
  169362. + pxmitbuf++;
  169363. + }
  169364. +}
  169365. --- /dev/null
  169366. +++ b/drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c
  169367. @@ -0,0 +1,420 @@
  169368. +/******************************************************************************
  169369. + *
  169370. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  169371. + *
  169372. + * This program is free software; you can redistribute it and/or modify it
  169373. + * under the terms of version 2 of the GNU General Public License as
  169374. + * published by the Free Software Foundation.
  169375. + *
  169376. + * This program is distributed in the hope that it will be useful, but WITHOUT
  169377. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  169378. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  169379. + * more details.
  169380. + *
  169381. + * You should have received a copy of the GNU General Public License along with
  169382. + * this program; if not, write to the Free Software Foundation, Inc.,
  169383. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  169384. + *
  169385. + *
  169386. + ******************************************************************************/
  169387. +#define _XMIT_OSDEP_C_
  169388. +
  169389. +#include <drv_conf.h>
  169390. +#include <osdep_service.h>
  169391. +#include <drv_types.h>
  169392. +
  169393. +#include <if_ether.h>
  169394. +#include <ip.h>
  169395. +#include <rtw_byteorder.h>
  169396. +#include <wifi.h>
  169397. +#include <mlme_osdep.h>
  169398. +#include <xmit_osdep.h>
  169399. +#include <osdep_intf.h>
  169400. +#include <circ_buf.h>
  169401. +
  169402. +
  169403. +uint rtw_remainder_len(struct pkt_file *pfile)
  169404. +{
  169405. + return (pfile->buf_len - ((SIZE_PTR)(pfile->cur_addr) - (SIZE_PTR)(pfile->buf_start)));
  169406. +}
  169407. +
  169408. +void _rtw_open_pktfile (_pkt *pktptr, struct pkt_file *pfile)
  169409. +{
  169410. +_func_enter_;
  169411. +
  169412. + pfile->pkt = pktptr;
  169413. + pfile->cur_addr = pfile->buf_start = pktptr->data;
  169414. + pfile->pkt_len = pfile->buf_len = pktptr->len;
  169415. +
  169416. + pfile->cur_buffer = pfile->buf_start ;
  169417. +
  169418. +_func_exit_;
  169419. +}
  169420. +
  169421. +uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen)
  169422. +{
  169423. + uint len = 0;
  169424. +
  169425. +_func_enter_;
  169426. +
  169427. + len = rtw_remainder_len(pfile);
  169428. + len = (rlen > len)? len: rlen;
  169429. +
  169430. + if(rmem)
  169431. + skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len, rmem, len);
  169432. +
  169433. + pfile->cur_addr += len;
  169434. + pfile->pkt_len -= len;
  169435. +
  169436. +_func_exit_;
  169437. +
  169438. + return len;
  169439. +}
  169440. +
  169441. +sint rtw_endofpktfile(struct pkt_file *pfile)
  169442. +{
  169443. +_func_enter_;
  169444. +
  169445. + if (pfile->pkt_len == 0) {
  169446. +_func_exit_;
  169447. + return _TRUE;
  169448. + }
  169449. +
  169450. +_func_exit_;
  169451. +
  169452. + return _FALSE;
  169453. +}
  169454. +
  169455. +void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib)
  169456. +{
  169457. +
  169458. +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
  169459. + struct sk_buff *skb = (struct sk_buff *)pkt;
  169460. + pattrib->hw_tcp_csum = 0;
  169461. +
  169462. + if (skb->ip_summed == CHECKSUM_PARTIAL) {
  169463. + if (skb_shinfo(skb)->nr_frags == 0)
  169464. + {
  169465. + const struct iphdr *ip = ip_hdr(skb);
  169466. + if (ip->protocol == IPPROTO_TCP) {
  169467. + // TCP checksum offload by HW
  169468. + DBG_871X("CHECKSUM_PARTIAL TCP\n");
  169469. + pattrib->hw_tcp_csum = 1;
  169470. + //skb_checksum_help(skb);
  169471. + } else if (ip->protocol == IPPROTO_UDP) {
  169472. + //DBG_871X("CHECKSUM_PARTIAL UDP\n");
  169473. +#if 1
  169474. + skb_checksum_help(skb);
  169475. +#else
  169476. + // Set UDP checksum = 0 to skip checksum check
  169477. + struct udphdr *udp = skb_transport_header(skb);
  169478. + udp->check = 0;
  169479. +#endif
  169480. + } else {
  169481. + DBG_871X("%s-%d TCP CSUM offload Error!!\n", __FUNCTION__, __LINE__);
  169482. + WARN_ON(1); /* we need a WARN() */
  169483. + }
  169484. + }
  169485. + else { // IP fragmentation case
  169486. + DBG_871X("%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\n", __FUNCTION__, __LINE__);
  169487. + skb_checksum_help(skb);
  169488. + }
  169489. + }
  169490. +#endif
  169491. +
  169492. +}
  169493. +
  169494. +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz)
  169495. +{
  169496. +#ifdef CONFIG_USB_HCI
  169497. + int i;
  169498. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  169499. + struct usb_device *pusbd = pdvobjpriv->pusbdev;
  169500. +
  169501. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX
  169502. + pxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, &pxmitbuf->dma_transfer_addr);
  169503. + pxmitbuf->pbuf = pxmitbuf->pallocated_buf;
  169504. + if(pxmitbuf->pallocated_buf == NULL)
  169505. + return _FAIL;
  169506. +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX
  169507. +
  169508. + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz);
  169509. + if (pxmitbuf->pallocated_buf == NULL)
  169510. + {
  169511. + return _FAIL;
  169512. + }
  169513. +
  169514. + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ);
  169515. + pxmitbuf->dma_transfer_addr = 0;
  169516. +
  169517. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
  169518. +
  169519. + for(i=0; i<8; i++)
  169520. + {
  169521. + pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
  169522. + if(pxmitbuf->pxmit_urb[i] == NULL)
  169523. + {
  169524. + DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
  169525. + return _FAIL;
  169526. + }
  169527. +
  169528. + }
  169529. +#endif
  169530. +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI)
  169531. + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz);
  169532. + if (pxmitbuf->pallocated_buf == NULL)
  169533. + {
  169534. + return _FAIL;
  169535. + }
  169536. +
  169537. + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ);
  169538. +#endif
  169539. +
  169540. + return _SUCCESS;
  169541. +}
  169542. +
  169543. +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz)
  169544. +{
  169545. +#ifdef CONFIG_USB_HCI
  169546. + int i;
  169547. + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  169548. + struct usb_device *pusbd = pdvobjpriv->pusbdev;
  169549. +
  169550. +
  169551. + for(i=0; i<8; i++)
  169552. + {
  169553. + if(pxmitbuf->pxmit_urb[i])
  169554. + {
  169555. + //usb_kill_urb(pxmitbuf->pxmit_urb[i]);
  169556. + usb_free_urb(pxmitbuf->pxmit_urb[i]);
  169557. + }
  169558. + }
  169559. +
  169560. +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX
  169561. + rtw_usb_buffer_free(pusbd, (size_t)free_sz, pxmitbuf->pallocated_buf, pxmitbuf->dma_transfer_addr);
  169562. + pxmitbuf->pallocated_buf = NULL;
  169563. + pxmitbuf->dma_transfer_addr = 0;
  169564. +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX
  169565. + if(pxmitbuf->pallocated_buf)
  169566. + rtw_mfree(pxmitbuf->pallocated_buf, free_sz);
  169567. +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
  169568. +
  169569. +#endif
  169570. +#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI)
  169571. + if(pxmitbuf->pallocated_buf)
  169572. + rtw_mfree(pxmitbuf->pallocated_buf, free_sz);
  169573. +#endif
  169574. +}
  169575. +
  169576. +void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt)
  169577. +{
  169578. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  169579. + u16 queue;
  169580. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  169581. +
  169582. + queue = skb_get_queue_mapping(pkt);
  169583. + if(__netif_subqueue_stopped(padapter->pnetdev, queue) &&
  169584. + (pxmitpriv->hwxmits[queue].accnt < NR_XMITFRAME/2))
  169585. + {
  169586. + netif_wake_subqueue(padapter->pnetdev, queue);
  169587. + }
  169588. +#else
  169589. + if (netif_queue_stopped(padapter->pnetdev))
  169590. + netif_wake_queue(padapter->pnetdev);
  169591. +#endif
  169592. +
  169593. + rtw_skb_free(pkt);
  169594. +}
  169595. +
  169596. +void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe)
  169597. +{
  169598. + if(pxframe->pkt)
  169599. + rtw_os_pkt_complete(padapter, pxframe->pkt);
  169600. +
  169601. + pxframe->pkt = NULL;
  169602. +}
  169603. +
  169604. +void rtw_os_xmit_schedule(_adapter *padapter)
  169605. +{
  169606. +#ifdef CONFIG_SDIO_HCI
  169607. + if(!padapter)
  169608. + return;
  169609. +
  169610. + if (rtw_txframes_pending(padapter))
  169611. + _rtw_up_sema(&padapter->xmitpriv.xmit_sema);
  169612. +#else
  169613. + _irqL irqL;
  169614. + struct xmit_priv *pxmitpriv;
  169615. +
  169616. + if(!padapter)
  169617. + return;
  169618. +
  169619. + pxmitpriv = &padapter->xmitpriv;
  169620. +
  169621. + _enter_critical_bh(&pxmitpriv->lock, &irqL);
  169622. +
  169623. + if(rtw_txframes_pending(padapter))
  169624. + {
  169625. + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
  169626. + }
  169627. +
  169628. + _exit_critical_bh(&pxmitpriv->lock, &irqL);
  169629. +#endif
  169630. +}
  169631. +
  169632. +
  169633. +
  169634. +#ifdef CONFIG_TX_MCAST2UNI
  169635. +int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
  169636. +{
  169637. + struct sta_priv *pstapriv = &padapter->stapriv;
  169638. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  169639. + _irqL irqL;
  169640. + _list *phead, *plist;
  169641. + struct sk_buff *newskb;
  169642. + struct sta_info *psta = NULL;
  169643. + u8 chk_alive_num = 0;
  169644. + char chk_alive_list[NUM_STA];
  169645. + u8 bc_addr[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  169646. + u8 null_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  169647. +
  169648. + int i;
  169649. + s32 res;
  169650. +
  169651. + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  169652. + phead = &pstapriv->asoc_list;
  169653. + plist = get_next(phead);
  169654. +
  169655. + //free sta asoc_queue
  169656. + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  169657. + int stainfo_offset;
  169658. + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
  169659. + plist = get_next(plist);
  169660. +
  169661. + stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
  169662. + if (stainfo_offset_valid(stainfo_offset)) {
  169663. + chk_alive_list[chk_alive_num++] = stainfo_offset;
  169664. + }
  169665. + }
  169666. + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  169667. +
  169668. + for (i = 0; i < chk_alive_num; i++) {
  169669. + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
  169670. +
  169671. + /* avoid come from STA1 and send back STA1 */
  169672. + if (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE
  169673. + || _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE
  169674. + || _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE
  169675. + )
  169676. + continue;
  169677. +
  169678. + newskb = rtw_skb_copy(skb);
  169679. +
  169680. + if (newskb) {
  169681. + _rtw_memcpy(newskb->data, psta->hwaddr, 6);
  169682. + res = rtw_xmit(padapter, &newskb);
  169683. + if (res < 0) {
  169684. + DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__);
  169685. + pxmitpriv->tx_drop++;
  169686. + rtw_skb_free(newskb);
  169687. + } else
  169688. + pxmitpriv->tx_pkts++;
  169689. + } else {
  169690. + DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__);
  169691. + pxmitpriv->tx_drop++;
  169692. + //rtw_skb_free(skb);
  169693. + return _FALSE; // Caller shall tx this multicast frame via normal way.
  169694. + }
  169695. + }
  169696. +
  169697. + rtw_skb_free(skb);
  169698. + return _TRUE;
  169699. +}
  169700. +#endif // CONFIG_TX_MCAST2UNI
  169701. +
  169702. +
  169703. +int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
  169704. +{
  169705. + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
  169706. + struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  169707. +#ifdef CONFIG_TX_MCAST2UNI
  169708. + struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  169709. + extern int rtw_mc2u_disable;
  169710. +#endif // CONFIG_TX_MCAST2UNI
  169711. + s32 res = 0;
  169712. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  169713. + u16 queue;
  169714. +#endif
  169715. +
  169716. +_func_enter_;
  169717. +
  169718. + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
  169719. +
  169720. + if (rtw_if_up(padapter) == _FALSE) {
  169721. + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n"));
  169722. + #ifdef DBG_TX_DROP_FRAME
  169723. + DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__);
  169724. + #endif
  169725. + goto drop_packet;
  169726. + }
  169727. +
  169728. +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
  169729. + queue = skb_get_queue_mapping(pkt);
  169730. + /* No free space for Tx, tx_worker is too slow */
  169731. + if (pxmitpriv->hwxmits[queue].accnt > NR_XMITFRAME/2) {
  169732. + //DBG_871X("%s(): stop netif_subqueue[%d]\n", __FUNCTION__, queue);
  169733. + netif_stop_subqueue(padapter->pnetdev, queue);
  169734. + return NETDEV_TX_BUSY;
  169735. + }
  169736. +#endif
  169737. +
  169738. +#ifdef CONFIG_TX_MCAST2UNI
  169739. + if ( !rtw_mc2u_disable
  169740. + && check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
  169741. + && ( IP_MCAST_MAC(pkt->data)
  169742. + || ICMPV6_MCAST_MAC(pkt->data) )
  169743. + && (padapter->registrypriv.wifi_spec == 0)
  169744. + )
  169745. + {
  169746. + if ( pxmitpriv->free_xmitframe_cnt > (NR_XMITFRAME/4) ) {
  169747. + res = rtw_mlcst2unicst(padapter, pkt);
  169748. + if (res == _TRUE) {
  169749. + goto exit;
  169750. + }
  169751. + } else {
  169752. + //DBG_871X("Stop M2U(%d, %d)! ", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);
  169753. + //DBG_871X("!m2u );
  169754. + }
  169755. + }
  169756. +#endif // CONFIG_TX_MCAST2UNI
  169757. +
  169758. + res = rtw_xmit(padapter, &pkt);
  169759. + if (res < 0) {
  169760. + #ifdef DBG_TX_DROP_FRAME
  169761. + DBG_871X("DBG_TX_DROP_FRAME %s rtw_xmit fail\n", __FUNCTION__);
  169762. + #endif
  169763. + goto drop_packet;
  169764. + }
  169765. +
  169766. + pxmitpriv->tx_pkts++;
  169767. + RT_TRACE(_module_xmit_osdep_c_, _drv_info_, ("rtw_xmit_entry: tx_pkts=%d\n", (u32)pxmitpriv->tx_pkts));
  169768. + goto exit;
  169769. +
  169770. +drop_packet:
  169771. + pxmitpriv->tx_drop++;
  169772. + rtw_skb_free(pkt);
  169773. + RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop));
  169774. +
  169775. +exit:
  169776. +
  169777. +_func_exit_;
  169778. +
  169779. + return 0;
  169780. +}
  169781. +
  169782. +int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
  169783. +{
  169784. + if (pkt)
  169785. + rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, pkt->truesize);
  169786. + return _rtw_xmit_entry(pkt, pnetdev);
  169787. +}
  169788. --- /dev/null
  169789. +++ b/drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c
  169790. @@ -0,0 +1,2299 @@
  169791. +/******************************************************************************
  169792. + *
  169793. + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  169794. + *
  169795. + * This program is free software; you can redistribute it and/or modify it
  169796. + * under the terms of version 2 of the GNU General Public License as
  169797. + * published by the Free Software Foundation.
  169798. + *
  169799. + * This program is distributed in the hope that it will be useful, but WITHOUT
  169800. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  169801. + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  169802. + * more details.
  169803. + *
  169804. + * You should have received a copy of the GNU General Public License along with
  169805. + * this program; if not, write to the Free Software Foundation, Inc.,
  169806. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  169807. + *
  169808. + *
  169809. + ******************************************************************************/
  169810. +
  169811. +
  169812. +#define _OSDEP_SERVICE_C_
  169813. +
  169814. +#include <drv_conf.h>
  169815. +#include <osdep_service.h>
  169816. +#include <drv_types.h>
  169817. +#include <recv_osdep.h>
  169818. +#ifdef PLATFORM_LINUX
  169819. +#include <linux/vmalloc.h>
  169820. +#endif
  169821. +#ifdef PLATFORM_FREEBSD
  169822. +#include <sys/malloc.h>
  169823. +#include <sys/time.h>
  169824. +#endif /* PLATFORM_FREEBSD */
  169825. +#ifdef RTK_DMP_PLATFORM
  169826. +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))
  169827. +#include <linux/pageremap.h>
  169828. +#endif
  169829. +#endif
  169830. +
  169831. +#define RT_TAG '1178'
  169832. +
  169833. +#ifdef DBG_MEMORY_LEAK
  169834. +#ifdef PLATFORM_LINUX
  169835. +#include <asm/atomic.h>
  169836. +atomic_t _malloc_cnt = ATOMIC_INIT(0);
  169837. +atomic_t _malloc_size = ATOMIC_INIT(0);
  169838. +#endif
  169839. +#endif /* DBG_MEMORY_LEAK */
  169840. +
  169841. +
  169842. +#if defined(PLATFORM_LINUX)
  169843. +/*
  169844. +* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE
  169845. +* @return: one of RTW_STATUS_CODE
  169846. +*/
  169847. +inline int RTW_STATUS_CODE(int error_code){
  169848. + if(error_code >=0)
  169849. + return _SUCCESS;
  169850. +
  169851. + switch(error_code) {
  169852. + //case -ETIMEDOUT:
  169853. + // return RTW_STATUS_TIMEDOUT;
  169854. + default:
  169855. + return _FAIL;
  169856. + }
  169857. +}
  169858. +#else
  169859. +inline int RTW_STATUS_CODE(int error_code){
  169860. + return error_code;
  169861. +}
  169862. +#endif
  169863. +
  169864. +u32 rtw_atoi(u8* s)
  169865. +{
  169866. +
  169867. + int num=0,flag=0;
  169868. + int i;
  169869. + for(i=0;i<=strlen(s);i++)
  169870. + {
  169871. + if(s[i] >= '0' && s[i] <= '9')
  169872. + num = num * 10 + s[i] -'0';
  169873. + else if(s[0] == '-' && i==0)
  169874. + flag =1;
  169875. + else
  169876. + break;
  169877. + }
  169878. +
  169879. + if(flag == 1)
  169880. + num = num * -1;
  169881. +
  169882. + return(num);
  169883. +
  169884. +}
  169885. +
  169886. +inline u8* _rtw_vmalloc(u32 sz)
  169887. +{
  169888. + u8 *pbuf;
  169889. +#ifdef PLATFORM_LINUX
  169890. + pbuf = vmalloc(sz);
  169891. +#endif
  169892. +#ifdef PLATFORM_FREEBSD
  169893. + pbuf = malloc(sz,M_DEVBUF,M_NOWAIT);
  169894. +#endif
  169895. +
  169896. +#ifdef PLATFORM_WINDOWS
  169897. + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);
  169898. +#endif
  169899. +
  169900. +#ifdef DBG_MEMORY_LEAK
  169901. +#ifdef PLATFORM_LINUX
  169902. + if ( pbuf != NULL) {
  169903. + atomic_inc(&_malloc_cnt);
  169904. + atomic_add(sz, &_malloc_size);
  169905. + }
  169906. +#endif
  169907. +#endif /* DBG_MEMORY_LEAK */
  169908. +
  169909. + return pbuf;
  169910. +}
  169911. +
  169912. +inline u8* _rtw_zvmalloc(u32 sz)
  169913. +{
  169914. + u8 *pbuf;
  169915. +#ifdef PLATFORM_LINUX
  169916. + pbuf = _rtw_vmalloc(sz);
  169917. + if (pbuf != NULL)
  169918. + memset(pbuf, 0, sz);
  169919. +#endif
  169920. +#ifdef PLATFORM_FREEBSD
  169921. + pbuf = malloc(sz,M_DEVBUF,M_ZERO|M_NOWAIT);
  169922. +#endif
  169923. +#ifdef PLATFORM_WINDOWS
  169924. + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);
  169925. + if (pbuf != NULL)
  169926. + NdisFillMemory(pbuf, sz, 0);
  169927. +#endif
  169928. +
  169929. + return pbuf;
  169930. +}
  169931. +
  169932. +inline void _rtw_vmfree(u8 *pbuf, u32 sz)
  169933. +{
  169934. +#ifdef PLATFORM_LINUX
  169935. + vfree(pbuf);
  169936. +#endif
  169937. +#ifdef PLATFORM_FREEBSD
  169938. + free(pbuf,M_DEVBUF);
  169939. +#endif
  169940. +#ifdef PLATFORM_WINDOWS
  169941. + NdisFreeMemory(pbuf,sz, 0);
  169942. +#endif
  169943. +
  169944. +#ifdef DBG_MEMORY_LEAK
  169945. +#ifdef PLATFORM_LINUX
  169946. + atomic_dec(&_malloc_cnt);
  169947. + atomic_sub(sz, &_malloc_size);
  169948. +#endif
  169949. +#endif /* DBG_MEMORY_LEAK */
  169950. +}
  169951. +
  169952. +u8* _rtw_malloc(u32 sz)
  169953. +{
  169954. +
  169955. + u8 *pbuf=NULL;
  169956. +
  169957. +#ifdef PLATFORM_LINUX
  169958. +#ifdef RTK_DMP_PLATFORM
  169959. + if(sz > 0x4000)
  169960. + pbuf = (u8 *)dvr_malloc(sz);
  169961. + else
  169962. +#endif
  169963. + pbuf = kmalloc(sz,in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
  169964. +
  169965. +#endif
  169966. +#ifdef PLATFORM_FREEBSD
  169967. + pbuf = malloc(sz,M_DEVBUF,M_NOWAIT);
  169968. +#endif
  169969. +#ifdef PLATFORM_WINDOWS
  169970. +
  169971. + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);
  169972. +
  169973. +#endif
  169974. +
  169975. +#ifdef DBG_MEMORY_LEAK
  169976. +#ifdef PLATFORM_LINUX
  169977. + if ( pbuf != NULL) {
  169978. + atomic_inc(&_malloc_cnt);
  169979. + atomic_add(sz, &_malloc_size);
  169980. + }
  169981. +#endif
  169982. +#endif /* DBG_MEMORY_LEAK */
  169983. +
  169984. + return pbuf;
  169985. +
  169986. +}
  169987. +
  169988. +
  169989. +u8* _rtw_zmalloc(u32 sz)
  169990. +{
  169991. +#ifdef PLATFORM_FREEBSD
  169992. + return malloc(sz,M_DEVBUF,M_ZERO|M_NOWAIT);
  169993. +#else // PLATFORM_FREEBSD
  169994. + u8 *pbuf = _rtw_malloc(sz);
  169995. +
  169996. + if (pbuf != NULL) {
  169997. +
  169998. +#ifdef PLATFORM_LINUX
  169999. + memset(pbuf, 0, sz);
  170000. +#endif
  170001. +
  170002. +#ifdef PLATFORM_WINDOWS
  170003. + NdisFillMemory(pbuf, sz, 0);
  170004. +#endif
  170005. +
  170006. + }
  170007. +
  170008. + return pbuf;
  170009. +#endif // PLATFORM_FREEBSD
  170010. +}
  170011. +
  170012. +void _rtw_mfree(u8 *pbuf, u32 sz)
  170013. +{
  170014. +
  170015. +#ifdef PLATFORM_LINUX
  170016. +#ifdef RTK_DMP_PLATFORM
  170017. + if(sz > 0x4000)
  170018. + dvr_free(pbuf);
  170019. + else
  170020. +#endif
  170021. + kfree(pbuf);
  170022. +
  170023. +#endif
  170024. +#ifdef PLATFORM_FREEBSD
  170025. + free(pbuf,M_DEVBUF);
  170026. +#endif
  170027. +#ifdef PLATFORM_WINDOWS
  170028. +
  170029. + NdisFreeMemory(pbuf,sz, 0);
  170030. +
  170031. +#endif
  170032. +
  170033. +#ifdef DBG_MEMORY_LEAK
  170034. +#ifdef PLATFORM_LINUX
  170035. + atomic_dec(&_malloc_cnt);
  170036. + atomic_sub(sz, &_malloc_size);
  170037. +#endif
  170038. +#endif /* DBG_MEMORY_LEAK */
  170039. +
  170040. +}
  170041. +
  170042. +#ifdef PLATFORM_FREEBSD
  170043. +//review again
  170044. +struct sk_buff * dev_alloc_skb(unsigned int size)
  170045. +{
  170046. + struct sk_buff *skb=NULL;
  170047. + u8 *data=NULL;
  170048. +
  170049. + //skb = (struct sk_buff *)_rtw_zmalloc(sizeof(struct sk_buff)); // for skb->len, etc.
  170050. + skb = (struct sk_buff *)_rtw_malloc(sizeof(struct sk_buff));
  170051. + if(!skb)
  170052. + goto out;
  170053. + data = _rtw_malloc(size);
  170054. + if(!data)
  170055. + goto nodata;
  170056. +
  170057. + skb->head = (unsigned char*)data;
  170058. + skb->data = (unsigned char*)data;
  170059. + skb->tail = (unsigned char*)data;
  170060. + skb->end = (unsigned char*)data + size;
  170061. + skb->len = 0;
  170062. + //printf("%s()-%d: skb=%p, skb->head = %p\n", __FUNCTION__, __LINE__, skb, skb->head);
  170063. +
  170064. +out:
  170065. + return skb;
  170066. +nodata:
  170067. + _rtw_mfree((u8 *)skb, sizeof(struct sk_buff));
  170068. + skb = NULL;
  170069. +goto out;
  170070. +
  170071. +}
  170072. +
  170073. +void dev_kfree_skb_any(struct sk_buff *skb)
  170074. +{
  170075. + //printf("%s()-%d: skb->head = %p\n", __FUNCTION__, __LINE__, skb->head);
  170076. + if(skb->head)
  170077. + _rtw_mfree(skb->head, 0);
  170078. + //printf("%s()-%d: skb = %p\n", __FUNCTION__, __LINE__, skb);
  170079. + if(skb)
  170080. + _rtw_mfree((u8 *)skb, 0);
  170081. +}
  170082. +struct sk_buff *skb_clone(const struct sk_buff *skb)
  170083. +{
  170084. + return NULL;
  170085. +}
  170086. +
  170087. +#endif /* PLATFORM_FREEBSD */
  170088. +
  170089. +inline struct sk_buff *_rtw_skb_alloc(u32 sz)
  170090. +{
  170091. +#ifdef PLATFORM_LINUX
  170092. + return __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
  170093. +#endif /* PLATFORM_LINUX */
  170094. +
  170095. +#ifdef PLATFORM_FREEBSD
  170096. + return dev_alloc_skb(sz);
  170097. +#endif /* PLATFORM_FREEBSD */
  170098. +}
  170099. +
  170100. +inline void _rtw_skb_free(struct sk_buff *skb)
  170101. +{
  170102. + dev_kfree_skb_any(skb);
  170103. +}
  170104. +
  170105. +inline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb)
  170106. +{
  170107. +#ifdef PLATFORM_LINUX
  170108. + return skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
  170109. +#endif /* PLATFORM_LINUX */
  170110. +
  170111. +#ifdef PLATFORM_FREEBSD
  170112. + return NULL;
  170113. +#endif /* PLATFORM_FREEBSD */
  170114. +}
  170115. +
  170116. +inline struct sk_buff *_rtw_skb_clone(struct sk_buff *skb)
  170117. +{
  170118. +#ifdef PLATFORM_LINUX
  170119. + return skb_clone(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
  170120. +#endif /* PLATFORM_LINUX */
  170121. +
  170122. +#ifdef PLATFORM_FREEBSD
  170123. + return skb_clone(skb);
  170124. +#endif /* PLATFORM_FREEBSD */
  170125. +}
  170126. +
  170127. +inline int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb)
  170128. +{
  170129. +#ifdef PLATFORM_LINUX
  170130. + skb->dev = ndev;
  170131. + return netif_rx(skb);
  170132. +#endif /* PLATFORM_LINUX */
  170133. +
  170134. +#ifdef PLATFORM_FREEBSD
  170135. + return (*ndev->if_input)(ndev, skb);
  170136. +#endif /* PLATFORM_FREEBSD */
  170137. +}
  170138. +
  170139. +void _rtw_skb_queue_purge(struct sk_buff_head *list)
  170140. +{
  170141. + struct sk_buff *skb;
  170142. +
  170143. + while ((skb = skb_dequeue(list)) != NULL)
  170144. + _rtw_skb_free(skb);
  170145. +}
  170146. +
  170147. +#ifdef CONFIG_USB_HCI
  170148. +inline void *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma)
  170149. +{
  170150. +#ifdef PLATFORM_LINUX
  170151. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  170152. + return usb_alloc_coherent(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);
  170153. +#else
  170154. + return usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);
  170155. +#endif
  170156. +#endif /* PLATFORM_LINUX */
  170157. +
  170158. +#ifdef PLATFORM_FREEBSD
  170159. + return (malloc(size, M_USBDEV, M_NOWAIT | M_ZERO));
  170160. +#endif /* PLATFORM_FREEBSD */
  170161. +}
  170162. +inline void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma)
  170163. +{
  170164. +#ifdef PLATFORM_LINUX
  170165. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  170166. + usb_free_coherent(dev, size, addr, dma);
  170167. +#else
  170168. + usb_buffer_free(dev, size, addr, dma);
  170169. +#endif
  170170. +#endif /* PLATFORM_LINUX */
  170171. +
  170172. +#ifdef PLATFORM_FREEBSD
  170173. + free(addr, M_USBDEV);
  170174. +#endif /* PLATFORM_FREEBSD */
  170175. +}
  170176. +#endif /* CONFIG_USB_HCI */
  170177. +
  170178. +#ifdef DBG_MEM_ALLOC
  170179. +
  170180. +struct rtw_mem_stat {
  170181. + ATOMIC_T alloc; // the memory bytes we allocate currently
  170182. + ATOMIC_T peak; // the peak memory bytes we allocate
  170183. + ATOMIC_T alloc_cnt; // the alloc count for alloc currently
  170184. + ATOMIC_T alloc_err_cnt; // the error times we fail to allocate memory
  170185. +};
  170186. +
  170187. +struct rtw_mem_stat rtw_mem_type_stat[mstat_tf_idx(MSTAT_TYPE_MAX)];
  170188. +struct rtw_mem_stat rtw_mem_func_stat[mstat_ff_idx(MSTAT_FUNC_MAX)];
  170189. +
  170190. +char *MSTAT_TYPE_str[] = {
  170191. + "VIR",
  170192. + "PHY",
  170193. + "SKB",
  170194. + "USB",
  170195. +};
  170196. +
  170197. +char *MSTAT_FUNC_str[] = {
  170198. + "UNSP",
  170199. + "IO",
  170200. + "TXIO",
  170201. + "RXIO",
  170202. + "TX",
  170203. + "RX",
  170204. +};
  170205. +
  170206. +int _rtw_mstat_dump(char *buf, int len)
  170207. +{
  170208. + int cnt = 0;
  170209. + int i;
  170210. + int value_t[4][mstat_tf_idx(MSTAT_TYPE_MAX)];
  170211. + int value_f[4][mstat_ff_idx(MSTAT_FUNC_MAX)];
  170212. +
  170213. + int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err;
  170214. + int tx_alloc, tx_peak, tx_alloc_err, rx_alloc, rx_peak, rx_alloc_err;
  170215. +
  170216. + for(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {
  170217. + value_t[0][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc));
  170218. + value_t[1][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].peak));
  170219. + value_t[2][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_cnt));
  170220. + value_t[3][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_err_cnt));
  170221. + }
  170222. +
  170223. + #if 0
  170224. + for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
  170225. + value_f[0][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc));
  170226. + value_f[1][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].peak));
  170227. + value_f[2][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_cnt));
  170228. + value_f[3][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_err_cnt));
  170229. + }
  170230. + #endif
  170231. +
  170232. + cnt += snprintf(buf+cnt, len-cnt, "===================== MSTAT =====================\n");
  170233. + cnt += snprintf(buf+cnt, len-cnt, "%4s %10s %10s %10s %10s\n", "TAG", "alloc", "peak", "aloc_cnt", "err_cnt");
  170234. + cnt += snprintf(buf+cnt, len-cnt, "-------------------------------------------------\n");
  170235. + for(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {
  170236. + cnt += snprintf(buf+cnt, len-cnt, "%4s %10d %10d %10d %10d\n", MSTAT_TYPE_str[i], value_t[0][i], value_t[1][i], value_t[2][i], value_t[3][i]);
  170237. + }
  170238. + #if 0
  170239. + cnt += snprintf(buf+cnt, len-cnt, "-------------------------------------------------\n");
  170240. + for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
  170241. + cnt += snprintf(buf+cnt, len-cnt, "%4s %10d %10d %10d %10d\n", MSTAT_FUNC_str[i], value_f[0][i], value_f[1][i], value_f[2][i], value_f[3][i]);
  170242. + }
  170243. + #endif
  170244. +
  170245. + return cnt;
  170246. +}
  170247. +
  170248. +void rtw_mstat_dump(void)
  170249. +{
  170250. + char buf[768] = {0};
  170251. +
  170252. + _rtw_mstat_dump(buf, 768);
  170253. + DBG_871X("\n%s", buf);
  170254. +}
  170255. +
  170256. +void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz)
  170257. +{
  170258. + static u32 update_time = 0;
  170259. + int peak, alloc;
  170260. + int i;
  170261. +
  170262. + /* initialization */
  170263. + if(!update_time) {
  170264. + for(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {
  170265. + ATOMIC_SET(&(rtw_mem_type_stat[i].alloc), 0);
  170266. + ATOMIC_SET(&(rtw_mem_type_stat[i].peak), 0);
  170267. + ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_cnt), 0);
  170268. + ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_err_cnt), 0);
  170269. + }
  170270. + for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
  170271. + ATOMIC_SET(&(rtw_mem_func_stat[i].alloc), 0);
  170272. + ATOMIC_SET(&(rtw_mem_func_stat[i].peak), 0);
  170273. + ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_cnt), 0);
  170274. + ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_err_cnt), 0);
  170275. + }
  170276. + }
  170277. +
  170278. + switch(status) {
  170279. + case MSTAT_ALLOC_SUCCESS:
  170280. + ATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));
  170281. + alloc = ATOMIC_ADD_RETURN(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);
  170282. + peak=ATOMIC_READ(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak));
  170283. + if (peak<alloc)
  170284. + ATOMIC_SET(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak), alloc);
  170285. +
  170286. + ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
  170287. + alloc = ATOMIC_ADD_RETURN(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
  170288. + peak=ATOMIC_READ(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak));
  170289. + if (peak<alloc)
  170290. + ATOMIC_SET(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak), alloc);
  170291. + break;
  170292. +
  170293. + case MSTAT_ALLOC_FAIL:
  170294. + ATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_err_cnt));
  170295. +
  170296. + ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_err_cnt));
  170297. + break;
  170298. +
  170299. + case MSTAT_FREE:
  170300. + ATOMIC_DEC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));
  170301. + ATOMIC_SUB(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);
  170302. +
  170303. + ATOMIC_DEC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
  170304. + ATOMIC_SUB(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
  170305. + break;
  170306. + };
  170307. +
  170308. + //if (rtw_get_passing_time_ms(update_time) > 5000) {
  170309. + // rtw_mstat_dump();
  170310. + update_time=rtw_get_current_time();
  170311. + //}
  170312. +}
  170313. +
  170314. +
  170315. +
  170316. +inline u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
  170317. +{
  170318. + u8 *p;
  170319. + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170320. +
  170321. + p=_rtw_vmalloc((sz));
  170322. +
  170323. + rtw_mstat_update(
  170324. + flags
  170325. + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170326. + , sz
  170327. + );
  170328. +
  170329. + return p;
  170330. +}
  170331. +
  170332. +inline u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
  170333. +{
  170334. + u8 *p;
  170335. + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170336. +
  170337. + p=_rtw_zvmalloc((sz));
  170338. +
  170339. + rtw_mstat_update(
  170340. + flags
  170341. + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170342. + , sz
  170343. + );
  170344. +
  170345. + return p;
  170346. +}
  170347. +
  170348. +inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)
  170349. +{
  170350. + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz));
  170351. +
  170352. + _rtw_vmfree((pbuf), (sz));
  170353. +
  170354. + rtw_mstat_update(
  170355. + flags
  170356. + , MSTAT_FREE
  170357. + , sz
  170358. + );
  170359. +}
  170360. +
  170361. +inline u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
  170362. +{
  170363. + u8 *p;
  170364. +
  170365. + //if(sz>=153 && sz<=306)
  170366. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170367. +
  170368. + //if((sz)>4096)
  170369. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170370. +
  170371. + p=_rtw_malloc((sz));
  170372. +
  170373. + rtw_mstat_update(
  170374. + flags
  170375. + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170376. + , sz
  170377. + );
  170378. +
  170379. + return p;
  170380. +}
  170381. +
  170382. +inline u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
  170383. +{
  170384. + u8 *p;
  170385. +
  170386. + //if(sz>=153 && sz<=306)
  170387. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170388. +
  170389. + //if((sz)>4096)
  170390. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170391. +
  170392. + p = _rtw_zmalloc((sz));
  170393. +
  170394. + rtw_mstat_update(
  170395. + flags
  170396. + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170397. + , sz
  170398. + );
  170399. +
  170400. + return p;
  170401. +}
  170402. +
  170403. +inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)
  170404. +{
  170405. + //if(sz>=153 && sz<=306)
  170406. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
  170407. +
  170408. + //if((sz)>4096)
  170409. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz));
  170410. +
  170411. + _rtw_mfree((pbuf), (sz));
  170412. +
  170413. + rtw_mstat_update(
  170414. + flags
  170415. + , MSTAT_FREE
  170416. + , sz
  170417. + );
  170418. +}
  170419. +
  170420. +inline struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, int line)
  170421. +{
  170422. + struct sk_buff *skb;
  170423. + unsigned int truesize = 0;
  170424. +
  170425. + skb = _rtw_skb_alloc(size);
  170426. +
  170427. + if(skb)
  170428. + truesize = skb->truesize;
  170429. +
  170430. + if(!skb || truesize < size /*|| size > 4096*/)
  170431. + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, size, skb, truesize);
  170432. +
  170433. + rtw_mstat_update(
  170434. + flags
  170435. + , skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170436. + , truesize
  170437. + );
  170438. +
  170439. + return skb;
  170440. +}
  170441. +
  170442. +inline void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
  170443. +{
  170444. + unsigned int truesize = skb->truesize;
  170445. +
  170446. + //if(truesize > 4096)
  170447. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
  170448. +
  170449. + _rtw_skb_free(skb);
  170450. +
  170451. + rtw_mstat_update(
  170452. + flags
  170453. + , MSTAT_FREE
  170454. + , truesize
  170455. + );
  170456. +}
  170457. +
  170458. +inline struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)
  170459. +{
  170460. + struct sk_buff *skb_cp;
  170461. + unsigned int truesize = skb->truesize;
  170462. + unsigned int cp_truesize = 0;
  170463. +
  170464. + skb_cp = _rtw_skb_copy(skb);
  170465. + if(skb_cp)
  170466. + cp_truesize = skb_cp->truesize;
  170467. +
  170468. + if(!skb_cp || cp_truesize != truesize /*||cp_truesize > 4096*/)
  170469. + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%u), skb_cp:%p, cp_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cp, cp_truesize);
  170470. +
  170471. + rtw_mstat_update(
  170472. + flags
  170473. + , skb_cp ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170474. + , truesize
  170475. + );
  170476. +
  170477. + return skb_cp;
  170478. +}
  170479. +
  170480. +inline struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)
  170481. +{
  170482. + struct sk_buff *skb_cl;
  170483. + unsigned int truesize = skb->truesize;
  170484. + unsigned int cl_truesize = 0;
  170485. +
  170486. + skb_cl = _rtw_skb_clone(skb);
  170487. + if(skb_cl)
  170488. + cl_truesize = skb_cl->truesize;
  170489. +
  170490. + if(!skb_cl || cl_truesize != truesize /*|| cl_truesize > 4096*/)
  170491. + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%u), skb_cl:%p, cl_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cl, cl_truesize);
  170492. +
  170493. + rtw_mstat_update(
  170494. + flags
  170495. + , skb_cl ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170496. + , truesize
  170497. + );
  170498. +
  170499. + return skb_cl;
  170500. +}
  170501. +
  170502. +inline int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
  170503. +{
  170504. + int ret;
  170505. + unsigned int truesize = skb->truesize;
  170506. +
  170507. + //if(truesize > 4096)
  170508. + // DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
  170509. +
  170510. + ret = _rtw_netif_rx(ndev, skb);
  170511. +
  170512. + rtw_mstat_update(
  170513. + flags
  170514. + , MSTAT_FREE
  170515. + , truesize
  170516. + );
  170517. +
  170518. + return ret;
  170519. +}
  170520. +
  170521. +inline void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line)
  170522. +{
  170523. + struct sk_buff *skb;
  170524. +
  170525. + while ((skb = skb_dequeue(list)) != NULL)
  170526. + dbg_rtw_skb_free(skb, flags, func, line);
  170527. +}
  170528. +
  170529. +#ifdef CONFIG_USB_HCI
  170530. +inline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, int line)
  170531. +{
  170532. + void *p;
  170533. + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size);
  170534. +
  170535. + p = _rtw_usb_buffer_alloc(dev, size, dma);
  170536. +
  170537. + rtw_mstat_update(
  170538. + flags
  170539. + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
  170540. + , size
  170541. + );
  170542. +
  170543. + return p;
  170544. +}
  170545. +
  170546. +inline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, int line)
  170547. +{
  170548. + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size);
  170549. +
  170550. + _rtw_usb_buffer_free(dev, size, addr, dma);
  170551. +
  170552. + rtw_mstat_update(
  170553. + flags
  170554. + , MSTAT_FREE
  170555. + , size
  170556. + );
  170557. +}
  170558. +#endif /* CONFIG_USB_HCI */
  170559. +#endif /* DBG_MEM_ALLOC */
  170560. +
  170561. +void* rtw_malloc2d(int h, int w, int size)
  170562. +{
  170563. + int j;
  170564. +
  170565. + void **a = (void **) rtw_zmalloc( h*sizeof(void *) + h*w*size );
  170566. + if(a == NULL)
  170567. + {
  170568. + DBG_871X("%s: alloc memory fail!\n", __FUNCTION__);
  170569. + return NULL;
  170570. + }
  170571. +
  170572. + for( j=0; j<h; j++ )
  170573. + a[j] = ((char *)(a+h)) + j*w*size;
  170574. +
  170575. + return a;
  170576. +}
  170577. +
  170578. +void rtw_mfree2d(void *pbuf, int h, int w, int size)
  170579. +{
  170580. + rtw_mfree((u8 *)pbuf, h*sizeof(void*) + w*h*size);
  170581. +}
  170582. +
  170583. +void _rtw_memcpy(void* dst, void* src, u32 sz)
  170584. +{
  170585. +
  170586. +#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)
  170587. +
  170588. + memcpy(dst, src, sz);
  170589. +
  170590. +#endif
  170591. +
  170592. +#ifdef PLATFORM_WINDOWS
  170593. +
  170594. + NdisMoveMemory(dst, src, sz);
  170595. +
  170596. +#endif
  170597. +
  170598. +}
  170599. +
  170600. +int _rtw_memcmp(void *dst, void *src, u32 sz)
  170601. +{
  170602. +
  170603. +#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)
  170604. +//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0
  170605. +
  170606. + if (!(memcmp(dst, src, sz)))
  170607. + return _TRUE;
  170608. + else
  170609. + return _FALSE;
  170610. +#endif
  170611. +
  170612. +
  170613. +#ifdef PLATFORM_WINDOWS
  170614. +//under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1
  170615. +
  170616. + if (NdisEqualMemory (dst, src, sz))
  170617. + return _TRUE;
  170618. + else
  170619. + return _FALSE;
  170620. +
  170621. +#endif
  170622. +
  170623. +
  170624. +
  170625. +}
  170626. +
  170627. +void _rtw_memset(void *pbuf, int c, u32 sz)
  170628. +{
  170629. +
  170630. +#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)
  170631. +
  170632. + memset(pbuf, c, sz);
  170633. +
  170634. +#endif
  170635. +
  170636. +#ifdef PLATFORM_WINDOWS
  170637. +#if 0
  170638. + NdisZeroMemory(pbuf, sz);
  170639. + if (c != 0) memset(pbuf, c, sz);
  170640. +#else
  170641. + NdisFillMemory(pbuf, sz, c);
  170642. +#endif
  170643. +#endif
  170644. +
  170645. +}
  170646. +
  170647. +#ifdef PLATFORM_FREEBSD
  170648. +static inline void __list_add(_list *pnew, _list *pprev, _list *pnext)
  170649. + {
  170650. + pnext->prev = pnew;
  170651. + pnew->next = pnext;
  170652. + pnew->prev = pprev;
  170653. + pprev->next = pnew;
  170654. +}
  170655. +#endif /* PLATFORM_FREEBSD */
  170656. +
  170657. +void _rtw_init_listhead(_list *list)
  170658. +{
  170659. +
  170660. +#ifdef PLATFORM_LINUX
  170661. +
  170662. + INIT_LIST_HEAD(list);
  170663. +
  170664. +#endif
  170665. +
  170666. +#ifdef PLATFORM_FREEBSD
  170667. + list->next = list;
  170668. + list->prev = list;
  170669. +#endif
  170670. +#ifdef PLATFORM_WINDOWS
  170671. +
  170672. + NdisInitializeListHead(list);
  170673. +
  170674. +#endif
  170675. +
  170676. +}
  170677. +
  170678. +
  170679. +/*
  170680. +For the following list_xxx operations,
  170681. +caller must guarantee the atomic context.
  170682. +Otherwise, there will be racing condition.
  170683. +*/
  170684. +u32 rtw_is_list_empty(_list *phead)
  170685. +{
  170686. +
  170687. +#ifdef PLATFORM_LINUX
  170688. +
  170689. + if (list_empty(phead))
  170690. + return _TRUE;
  170691. + else
  170692. + return _FALSE;
  170693. +
  170694. +#endif
  170695. +#ifdef PLATFORM_FREEBSD
  170696. +
  170697. + if (phead->next == phead)
  170698. + return _TRUE;
  170699. + else
  170700. + return _FALSE;
  170701. +
  170702. +#endif
  170703. +
  170704. +
  170705. +#ifdef PLATFORM_WINDOWS
  170706. +
  170707. + if (IsListEmpty(phead))
  170708. + return _TRUE;
  170709. + else
  170710. + return _FALSE;
  170711. +
  170712. +#endif
  170713. +
  170714. +
  170715. +}
  170716. +
  170717. +void rtw_list_insert_head(_list *plist, _list *phead)
  170718. +{
  170719. +
  170720. +#ifdef PLATFORM_LINUX
  170721. + list_add(plist, phead);
  170722. +#endif
  170723. +
  170724. +#ifdef PLATFORM_FREEBSD
  170725. + __list_add(plist, phead, phead->next);
  170726. +#endif
  170727. +
  170728. +#ifdef PLATFORM_WINDOWS
  170729. + InsertHeadList(phead, plist);
  170730. +#endif
  170731. +}
  170732. +
  170733. +void rtw_list_insert_tail(_list *plist, _list *phead)
  170734. +{
  170735. +
  170736. +#ifdef PLATFORM_LINUX
  170737. +
  170738. + list_add_tail(plist, phead);
  170739. +
  170740. +#endif
  170741. +#ifdef PLATFORM_FREEBSD
  170742. +
  170743. + __list_add(plist, phead->prev, phead);
  170744. +
  170745. +#endif
  170746. +#ifdef PLATFORM_WINDOWS
  170747. +
  170748. + InsertTailList(phead, plist);
  170749. +
  170750. +#endif
  170751. +
  170752. +}
  170753. +
  170754. +
  170755. +/*
  170756. +
  170757. +Caller must check if the list is empty before calling rtw_list_delete
  170758. +
  170759. +*/
  170760. +
  170761. +
  170762. +void _rtw_init_sema(_sema *sema, int init_val)
  170763. +{
  170764. +
  170765. +#ifdef PLATFORM_LINUX
  170766. +
  170767. + sema_init(sema, init_val);
  170768. +
  170769. +#endif
  170770. +#ifdef PLATFORM_FREEBSD
  170771. + sema_init(sema, init_val, "rtw_drv");
  170772. +#endif
  170773. +#ifdef PLATFORM_OS_XP
  170774. +
  170775. + KeInitializeSemaphore(sema, init_val, SEMA_UPBND); // count=0;
  170776. +
  170777. +#endif
  170778. +
  170779. +#ifdef PLATFORM_OS_CE
  170780. + if(*sema == NULL)
  170781. + *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL);
  170782. +#endif
  170783. +
  170784. +}
  170785. +
  170786. +void _rtw_free_sema(_sema *sema)
  170787. +{
  170788. +#ifdef PLATFORM_FREEBSD
  170789. + sema_destroy(sema);
  170790. +#endif
  170791. +#ifdef PLATFORM_OS_CE
  170792. + CloseHandle(*sema);
  170793. +#endif
  170794. +
  170795. +}
  170796. +
  170797. +void _rtw_up_sema(_sema *sema)
  170798. +{
  170799. +
  170800. +#ifdef PLATFORM_LINUX
  170801. +
  170802. + up(sema);
  170803. +
  170804. +#endif
  170805. +#ifdef PLATFORM_FREEBSD
  170806. + sema_post(sema);
  170807. +#endif
  170808. +#ifdef PLATFORM_OS_XP
  170809. +
  170810. + KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1, FALSE );
  170811. +
  170812. +#endif
  170813. +
  170814. +#ifdef PLATFORM_OS_CE
  170815. + ReleaseSemaphore(*sema, 1, NULL );
  170816. +#endif
  170817. +}
  170818. +
  170819. +u32 _rtw_down_sema(_sema *sema)
  170820. +{
  170821. +
  170822. +#ifdef PLATFORM_LINUX
  170823. +
  170824. + if (down_interruptible(sema))
  170825. + return _FAIL;
  170826. + else
  170827. + return _SUCCESS;
  170828. +
  170829. +#endif
  170830. +#ifdef PLATFORM_FREEBSD
  170831. + sema_wait(sema);
  170832. + return _SUCCESS;
  170833. +#endif
  170834. +#ifdef PLATFORM_OS_XP
  170835. +
  170836. + if(STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL))
  170837. + return _SUCCESS;
  170838. + else
  170839. + return _FAIL;
  170840. +#endif
  170841. +
  170842. +#ifdef PLATFORM_OS_CE
  170843. + if(WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE ))
  170844. + return _SUCCESS;
  170845. + else
  170846. + return _FAIL;
  170847. +#endif
  170848. +}
  170849. +
  170850. +
  170851. +
  170852. +void _rtw_mutex_init(_mutex *pmutex)
  170853. +{
  170854. +#ifdef PLATFORM_LINUX
  170855. +
  170856. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  170857. + mutex_init(pmutex);
  170858. +#else
  170859. + init_MUTEX(pmutex);
  170860. +#endif
  170861. +
  170862. +#endif
  170863. +#ifdef PLATFORM_FREEBSD
  170864. + mtx_init(pmutex, "", NULL, MTX_DEF|MTX_RECURSE);
  170865. +#endif
  170866. +#ifdef PLATFORM_OS_XP
  170867. +
  170868. + KeInitializeMutex(pmutex, 0);
  170869. +
  170870. +#endif
  170871. +
  170872. +#ifdef PLATFORM_OS_CE
  170873. + *pmutex = CreateMutex( NULL, _FALSE, NULL);
  170874. +#endif
  170875. +}
  170876. +
  170877. +void _rtw_mutex_free(_mutex *pmutex);
  170878. +void _rtw_mutex_free(_mutex *pmutex)
  170879. +{
  170880. +#ifdef PLATFORM_LINUX
  170881. +
  170882. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
  170883. + mutex_destroy(pmutex);
  170884. +#else
  170885. +#endif
  170886. +
  170887. +#ifdef PLATFORM_FREEBSD
  170888. + sema_destroy(pmutex);
  170889. +#endif
  170890. +
  170891. +#endif
  170892. +
  170893. +#ifdef PLATFORM_OS_XP
  170894. +
  170895. +#endif
  170896. +
  170897. +#ifdef PLATFORM_OS_CE
  170898. +
  170899. +#endif
  170900. +}
  170901. +
  170902. +void _rtw_spinlock_init(_lock *plock)
  170903. +{
  170904. +
  170905. +#ifdef PLATFORM_LINUX
  170906. +
  170907. + spin_lock_init(plock);
  170908. +
  170909. +#endif
  170910. +#ifdef PLATFORM_FREEBSD
  170911. + mtx_init(plock, "", NULL, MTX_DEF|MTX_RECURSE);
  170912. +#endif
  170913. +#ifdef PLATFORM_WINDOWS
  170914. +
  170915. + NdisAllocateSpinLock(plock);
  170916. +
  170917. +#endif
  170918. +
  170919. +}
  170920. +
  170921. +void _rtw_spinlock_free(_lock *plock)
  170922. +{
  170923. +#ifdef PLATFORM_FREEBSD
  170924. + mtx_destroy(plock);
  170925. +#endif
  170926. +
  170927. +#ifdef PLATFORM_WINDOWS
  170928. +
  170929. + NdisFreeSpinLock(plock);
  170930. +
  170931. +#endif
  170932. +
  170933. +}
  170934. +#ifdef PLATFORM_FREEBSD
  170935. +extern PADAPTER prtw_lock;
  170936. +
  170937. +void rtw_mtx_lock(_lock *plock){
  170938. + if(prtw_lock){
  170939. + mtx_lock(&prtw_lock->glock);
  170940. + }
  170941. + else{
  170942. + printf("%s prtw_lock==NULL",__FUNCTION__);
  170943. + }
  170944. +}
  170945. +void rtw_mtx_unlock(_lock *plock){
  170946. + if(prtw_lock){
  170947. + mtx_unlock(&prtw_lock->glock);
  170948. + }
  170949. + else{
  170950. + printf("%s prtw_lock==NULL",__FUNCTION__);
  170951. + }
  170952. +
  170953. +}
  170954. +#endif //PLATFORM_FREEBSD
  170955. +
  170956. +
  170957. +void _rtw_spinlock(_lock *plock)
  170958. +{
  170959. +
  170960. +#ifdef PLATFORM_LINUX
  170961. +
  170962. + spin_lock(plock);
  170963. +
  170964. +#endif
  170965. +#ifdef PLATFORM_FREEBSD
  170966. + mtx_lock(plock);
  170967. +#endif
  170968. +#ifdef PLATFORM_WINDOWS
  170969. +
  170970. + NdisAcquireSpinLock(plock);
  170971. +
  170972. +#endif
  170973. +
  170974. +}
  170975. +
  170976. +void _rtw_spinunlock(_lock *plock)
  170977. +{
  170978. +
  170979. +#ifdef PLATFORM_LINUX
  170980. +
  170981. + spin_unlock(plock);
  170982. +
  170983. +#endif
  170984. +#ifdef PLATFORM_FREEBSD
  170985. + mtx_unlock(plock);
  170986. +#endif
  170987. +#ifdef PLATFORM_WINDOWS
  170988. +
  170989. + NdisReleaseSpinLock(plock);
  170990. +
  170991. +#endif
  170992. +}
  170993. +
  170994. +
  170995. +void _rtw_spinlock_ex(_lock *plock)
  170996. +{
  170997. +
  170998. +#ifdef PLATFORM_LINUX
  170999. +
  171000. + spin_lock(plock);
  171001. +
  171002. +#endif
  171003. +#ifdef PLATFORM_FREEBSD
  171004. + mtx_lock(plock);
  171005. +#endif
  171006. +#ifdef PLATFORM_WINDOWS
  171007. +
  171008. + NdisDprAcquireSpinLock(plock);
  171009. +
  171010. +#endif
  171011. +
  171012. +}
  171013. +
  171014. +void _rtw_spinunlock_ex(_lock *plock)
  171015. +{
  171016. +
  171017. +#ifdef PLATFORM_LINUX
  171018. +
  171019. + spin_unlock(plock);
  171020. +
  171021. +#endif
  171022. +#ifdef PLATFORM_FREEBSD
  171023. + mtx_unlock(plock);
  171024. +#endif
  171025. +#ifdef PLATFORM_WINDOWS
  171026. +
  171027. + NdisDprReleaseSpinLock(plock);
  171028. +
  171029. +#endif
  171030. +}
  171031. +
  171032. +
  171033. +
  171034. +void _rtw_init_queue(_queue *pqueue)
  171035. +{
  171036. +
  171037. + _rtw_init_listhead(&(pqueue->queue));
  171038. +
  171039. + _rtw_spinlock_init(&(pqueue->lock));
  171040. +
  171041. +}
  171042. +
  171043. +u32 _rtw_queue_empty(_queue *pqueue)
  171044. +{
  171045. + return (rtw_is_list_empty(&(pqueue->queue)));
  171046. +}
  171047. +
  171048. +
  171049. +u32 rtw_end_of_queue_search(_list *head, _list *plist)
  171050. +{
  171051. + if (head == plist)
  171052. + return _TRUE;
  171053. + else
  171054. + return _FALSE;
  171055. +}
  171056. +
  171057. +
  171058. +u32 rtw_get_current_time(void)
  171059. +{
  171060. +
  171061. +#ifdef PLATFORM_LINUX
  171062. + return jiffies;
  171063. +#endif
  171064. +#ifdef PLATFORM_FREEBSD
  171065. + struct timeval tvp;
  171066. + getmicrotime(&tvp);
  171067. + return tvp.tv_sec;
  171068. +#endif
  171069. +#ifdef PLATFORM_WINDOWS
  171070. + LARGE_INTEGER SystemTime;
  171071. + NdisGetCurrentSystemTime(&SystemTime);
  171072. + return (u32)(SystemTime.LowPart);// count of 100-nanosecond intervals
  171073. +#endif
  171074. +}
  171075. +
  171076. +inline u32 rtw_systime_to_ms(u32 systime)
  171077. +{
  171078. +#ifdef PLATFORM_LINUX
  171079. + return systime * 1000 / HZ;
  171080. +#endif
  171081. +#ifdef PLATFORM_FREEBSD
  171082. + return systime * 1000;
  171083. +#endif
  171084. +#ifdef PLATFORM_WINDOWS
  171085. + return systime / 10000 ;
  171086. +#endif
  171087. +}
  171088. +
  171089. +inline u32 rtw_ms_to_systime(u32 ms)
  171090. +{
  171091. +#ifdef PLATFORM_LINUX
  171092. + return ms * HZ / 1000;
  171093. +#endif
  171094. +#ifdef PLATFORM_FREEBSD
  171095. + return ms /1000;
  171096. +#endif
  171097. +#ifdef PLATFORM_WINDOWS
  171098. + return ms * 10000 ;
  171099. +#endif
  171100. +}
  171101. +
  171102. +// the input parameter start use the same unit as returned by rtw_get_current_time
  171103. +inline s32 rtw_get_passing_time_ms(u32 start)
  171104. +{
  171105. +#ifdef PLATFORM_LINUX
  171106. + return rtw_systime_to_ms(jiffies-start);
  171107. +#endif
  171108. +#ifdef PLATFORM_FREEBSD
  171109. + return rtw_systime_to_ms(rtw_get_current_time());
  171110. +#endif
  171111. +#ifdef PLATFORM_WINDOWS
  171112. + LARGE_INTEGER SystemTime;
  171113. + NdisGetCurrentSystemTime(&SystemTime);
  171114. + return rtw_systime_to_ms((u32)(SystemTime.LowPart) - start) ;
  171115. +#endif
  171116. +}
  171117. +
  171118. +inline s32 rtw_get_time_interval_ms(u32 start, u32 end)
  171119. +{
  171120. +#ifdef PLATFORM_LINUX
  171121. + return rtw_systime_to_ms(end-start);
  171122. +#endif
  171123. +#ifdef PLATFORM_FREEBSD
  171124. + return rtw_systime_to_ms(rtw_get_current_time());
  171125. +#endif
  171126. +#ifdef PLATFORM_WINDOWS
  171127. + return rtw_systime_to_ms(end-start);
  171128. +#endif
  171129. +}
  171130. +
  171131. +
  171132. +void rtw_sleep_schedulable(int ms)
  171133. +{
  171134. +
  171135. +#ifdef PLATFORM_LINUX
  171136. +
  171137. + u32 delta;
  171138. +
  171139. + delta = (ms * HZ)/1000;//(ms)
  171140. + if (delta == 0) {
  171141. + delta = 1;// 1 ms
  171142. + }
  171143. + set_current_state(TASK_INTERRUPTIBLE);
  171144. + if (schedule_timeout(delta) != 0) {
  171145. + return ;
  171146. + }
  171147. + return;
  171148. +
  171149. +#endif
  171150. +#ifdef PLATFORM_FREEBSD
  171151. + DELAY(ms*1000);
  171152. + return ;
  171153. +#endif
  171154. +
  171155. +#ifdef PLATFORM_WINDOWS
  171156. +
  171157. + NdisMSleep(ms*1000); //(us)*1000=(ms)
  171158. +
  171159. +#endif
  171160. +
  171161. +}
  171162. +
  171163. +
  171164. +void rtw_msleep_os(int ms)
  171165. +{
  171166. +
  171167. +#ifdef PLATFORM_LINUX
  171168. +
  171169. + msleep((unsigned int)ms);
  171170. +
  171171. +#endif
  171172. +#ifdef PLATFORM_FREEBSD
  171173. + //Delay for delay microseconds
  171174. + DELAY(ms*1000);
  171175. + return ;
  171176. +#endif
  171177. +#ifdef PLATFORM_WINDOWS
  171178. +
  171179. + NdisMSleep(ms*1000); //(us)*1000=(ms)
  171180. +
  171181. +#endif
  171182. +
  171183. +
  171184. +}
  171185. +void rtw_usleep_os(int us)
  171186. +{
  171187. +
  171188. +#ifdef PLATFORM_LINUX
  171189. +
  171190. + // msleep((unsigned int)us);
  171191. + if ( 1 < (us/1000) )
  171192. + msleep(1);
  171193. + else
  171194. + msleep( (us/1000) + 1);
  171195. +
  171196. +#endif
  171197. +#ifdef PLATFORM_FREEBSD
  171198. + //Delay for delay microseconds
  171199. + DELAY(us);
  171200. +
  171201. + return ;
  171202. +#endif
  171203. +#ifdef PLATFORM_WINDOWS
  171204. +
  171205. + NdisMSleep(us); //(us)
  171206. +
  171207. +#endif
  171208. +
  171209. +
  171210. +}
  171211. +
  171212. +
  171213. +#ifdef DBG_DELAY_OS
  171214. +void _rtw_mdelay_os(int ms, const char *func, const int line)
  171215. +{
  171216. + #if 0
  171217. + if(ms>10)
  171218. + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms);
  171219. + rtw_msleep_os(ms);
  171220. + return;
  171221. + #endif
  171222. +
  171223. +
  171224. + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms);
  171225. +
  171226. +#if defined(PLATFORM_LINUX)
  171227. +
  171228. + mdelay((unsigned long)ms);
  171229. +
  171230. +#elif defined(PLATFORM_WINDOWS)
  171231. +
  171232. + NdisStallExecution(ms*1000); //(us)*1000=(ms)
  171233. +
  171234. +#endif
  171235. +
  171236. +
  171237. +}
  171238. +void _rtw_udelay_os(int us, const char *func, const int line)
  171239. +{
  171240. +
  171241. + #if 0
  171242. + if(us > 1000) {
  171243. + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us);
  171244. + rtw_usleep_os(us);
  171245. + return;
  171246. + }
  171247. + #endif
  171248. +
  171249. +
  171250. + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us);
  171251. +
  171252. +
  171253. +#if defined(PLATFORM_LINUX)
  171254. +
  171255. + udelay((unsigned long)us);
  171256. +
  171257. +#elif defined(PLATFORM_WINDOWS)
  171258. +
  171259. + NdisStallExecution(us); //(us)
  171260. +
  171261. +#endif
  171262. +
  171263. +}
  171264. +#else
  171265. +void rtw_mdelay_os(int ms)
  171266. +{
  171267. +
  171268. +#ifdef PLATFORM_LINUX
  171269. +
  171270. + mdelay((unsigned long)ms);
  171271. +
  171272. +#endif
  171273. +#ifdef PLATFORM_FREEBSD
  171274. + DELAY(ms*1000);
  171275. + return ;
  171276. +#endif
  171277. +#ifdef PLATFORM_WINDOWS
  171278. +
  171279. + NdisStallExecution(ms*1000); //(us)*1000=(ms)
  171280. +
  171281. +#endif
  171282. +
  171283. +
  171284. +}
  171285. +void rtw_udelay_os(int us)
  171286. +{
  171287. +
  171288. +#ifdef PLATFORM_LINUX
  171289. +
  171290. + udelay((unsigned long)us);
  171291. +
  171292. +#endif
  171293. +#ifdef PLATFORM_FREEBSD
  171294. + //Delay for delay microseconds
  171295. + DELAY(us);
  171296. + return ;
  171297. +#endif
  171298. +#ifdef PLATFORM_WINDOWS
  171299. +
  171300. + NdisStallExecution(us); //(us)
  171301. +
  171302. +#endif
  171303. +
  171304. +}
  171305. +#endif
  171306. +
  171307. +void rtw_yield_os()
  171308. +{
  171309. +#ifdef PLATFORM_LINUX
  171310. + yield();
  171311. +#endif
  171312. +#ifdef PLATFORM_FREEBSD
  171313. + yield();
  171314. +#endif
  171315. +#ifdef PLATFORM_WINDOWS
  171316. + SwitchToThread();
  171317. +#endif
  171318. +}
  171319. +
  171320. +#define RTW_SUSPEND_LOCK_NAME "rtw_wifi"
  171321. +
  171322. +#ifdef CONFIG_WAKELOCK
  171323. +static struct wake_lock rtw_suspend_lock;
  171324. +#elif defined(CONFIG_ANDROID_POWER)
  171325. +static android_suspend_lock_t rtw_suspend_lock ={
  171326. + .name = RTW_SUSPEND_LOCK_NAME
  171327. +};
  171328. +#endif
  171329. +
  171330. +inline void rtw_suspend_lock_init()
  171331. +{
  171332. + #ifdef CONFIG_WAKELOCK
  171333. + wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME);
  171334. + #elif defined(CONFIG_ANDROID_POWER)
  171335. + android_init_suspend_lock(&rtw_suspend_lock);
  171336. + #endif
  171337. +}
  171338. +
  171339. +inline void rtw_suspend_lock_uninit()
  171340. +{
  171341. + #ifdef CONFIG_WAKELOCK
  171342. + wake_lock_destroy(&rtw_suspend_lock);
  171343. + #elif defined(CONFIG_ANDROID_POWER)
  171344. + android_uninit_suspend_lock(&rtw_suspend_lock);
  171345. + #endif
  171346. +}
  171347. +
  171348. +inline void rtw_lock_suspend()
  171349. +{
  171350. + #ifdef CONFIG_WAKELOCK
  171351. + wake_lock(&rtw_suspend_lock);
  171352. + #elif defined(CONFIG_ANDROID_POWER)
  171353. + android_lock_suspend(&rtw_suspend_lock);
  171354. + #endif
  171355. +}
  171356. +
  171357. +inline void rtw_unlock_suspend()
  171358. +{
  171359. + #ifdef CONFIG_WAKELOCK
  171360. + wake_unlock(&rtw_suspend_lock);
  171361. + #elif defined(CONFIG_ANDROID_POWER)
  171362. + android_unlock_suspend(&rtw_suspend_lock);
  171363. + #endif
  171364. +}
  171365. +
  171366. +inline void rtw_lock_suspend_timeout(u32 timeout_ms)
  171367. +{
  171368. + #ifdef CONFIG_WAKELOCK
  171369. + wake_lock_timeout(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms));
  171370. + #elif defined(CONFIG_ANDROID_POWER)
  171371. + android_lock_suspend_auto_expire(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms));
  171372. + #endif
  171373. +}
  171374. +
  171375. +inline void ATOMIC_SET(ATOMIC_T *v, int i)
  171376. +{
  171377. + #ifdef PLATFORM_LINUX
  171378. + atomic_set(v,i);
  171379. + #elif defined(PLATFORM_WINDOWS)
  171380. + *v=i;// other choice????
  171381. + #elif defined(PLATFORM_FREEBSD)
  171382. + atomic_set_int(v,i);
  171383. + #endif
  171384. +}
  171385. +
  171386. +inline int ATOMIC_READ(ATOMIC_T *v)
  171387. +{
  171388. + #ifdef PLATFORM_LINUX
  171389. + return atomic_read(v);
  171390. + #elif defined(PLATFORM_WINDOWS)
  171391. + return *v; // other choice????
  171392. + #elif defined(PLATFORM_FREEBSD)
  171393. + return atomic_load_acq_32(v);
  171394. + #endif
  171395. +}
  171396. +
  171397. +inline void ATOMIC_ADD(ATOMIC_T *v, int i)
  171398. +{
  171399. + #ifdef PLATFORM_LINUX
  171400. + atomic_add(i,v);
  171401. + #elif defined(PLATFORM_WINDOWS)
  171402. + InterlockedAdd(v,i);
  171403. + #elif defined(PLATFORM_FREEBSD)
  171404. + atomic_add_int(v,i);
  171405. + #endif
  171406. +}
  171407. +inline void ATOMIC_SUB(ATOMIC_T *v, int i)
  171408. +{
  171409. + #ifdef PLATFORM_LINUX
  171410. + atomic_sub(i,v);
  171411. + #elif defined(PLATFORM_WINDOWS)
  171412. + InterlockedAdd(v,-i);
  171413. + #elif defined(PLATFORM_FREEBSD)
  171414. + atomic_subtract_int(v,i);
  171415. + #endif
  171416. +}
  171417. +
  171418. +inline void ATOMIC_INC(ATOMIC_T *v)
  171419. +{
  171420. + #ifdef PLATFORM_LINUX
  171421. + atomic_inc(v);
  171422. + #elif defined(PLATFORM_WINDOWS)
  171423. + InterlockedIncrement(v);
  171424. + #elif defined(PLATFORM_FREEBSD)
  171425. + atomic_add_int(v,1);
  171426. + #endif
  171427. +}
  171428. +
  171429. +inline void ATOMIC_DEC(ATOMIC_T *v)
  171430. +{
  171431. + #ifdef PLATFORM_LINUX
  171432. + atomic_dec(v);
  171433. + #elif defined(PLATFORM_WINDOWS)
  171434. + InterlockedDecrement(v);
  171435. + #elif defined(PLATFORM_FREEBSD)
  171436. + atomic_subtract_int(v,1);
  171437. + #endif
  171438. +}
  171439. +
  171440. +inline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i)
  171441. +{
  171442. + #ifdef PLATFORM_LINUX
  171443. + return atomic_add_return(i,v);
  171444. + #elif defined(PLATFORM_WINDOWS)
  171445. + return InterlockedAdd(v,i);
  171446. + #elif defined(PLATFORM_FREEBSD)
  171447. + atomic_add_int(v,i);
  171448. + return atomic_load_acq_32(v);
  171449. + #endif
  171450. +}
  171451. +
  171452. +inline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i)
  171453. +{
  171454. + #ifdef PLATFORM_LINUX
  171455. + return atomic_sub_return(i,v);
  171456. + #elif defined(PLATFORM_WINDOWS)
  171457. + return InterlockedAdd(v,-i);
  171458. + #elif defined(PLATFORM_FREEBSD)
  171459. + atomic_subtract_int(v,i);
  171460. + return atomic_load_acq_32(v);
  171461. + #endif
  171462. +}
  171463. +
  171464. +inline int ATOMIC_INC_RETURN(ATOMIC_T *v)
  171465. +{
  171466. + #ifdef PLATFORM_LINUX
  171467. + return atomic_inc_return(v);
  171468. + #elif defined(PLATFORM_WINDOWS)
  171469. + return InterlockedIncrement(v);
  171470. + #elif defined(PLATFORM_FREEBSD)
  171471. + atomic_add_int(v,1);
  171472. + return atomic_load_acq_32(v);
  171473. + #endif
  171474. +}
  171475. +
  171476. +inline int ATOMIC_DEC_RETURN(ATOMIC_T *v)
  171477. +{
  171478. + #ifdef PLATFORM_LINUX
  171479. + return atomic_dec_return(v);
  171480. + #elif defined(PLATFORM_WINDOWS)
  171481. + return InterlockedDecrement(v);
  171482. + #elif defined(PLATFORM_FREEBSD)
  171483. + atomic_subtract_int(v,1);
  171484. + return atomic_load_acq_32(v);
  171485. + #endif
  171486. +}
  171487. +
  171488. +
  171489. +#ifdef PLATFORM_LINUX
  171490. +/*
  171491. +* Open a file with the specific @param path, @param flag, @param mode
  171492. +* @param fpp the pointer of struct file pointer to get struct file pointer while file opening is success
  171493. +* @param path the path of the file to open
  171494. +* @param flag file operation flags, please refer to linux document
  171495. +* @param mode please refer to linux document
  171496. +* @return Linux specific error code
  171497. +*/
  171498. +static int openFile(struct file **fpp, char *path, int flag, int mode)
  171499. +{
  171500. + struct file *fp;
  171501. +
  171502. + fp=filp_open(path, flag, mode);
  171503. + if(IS_ERR(fp)) {
  171504. + *fpp=NULL;
  171505. + return PTR_ERR(fp);
  171506. + }
  171507. + else {
  171508. + *fpp=fp;
  171509. + return 0;
  171510. + }
  171511. +}
  171512. +
  171513. +/*
  171514. +* Close the file with the specific @param fp
  171515. +* @param fp the pointer of struct file to close
  171516. +* @return always 0
  171517. +*/
  171518. +static int closeFile(struct file *fp)
  171519. +{
  171520. + filp_close(fp,NULL);
  171521. + return 0;
  171522. +}
  171523. +
  171524. +static int readFile(struct file *fp,char *buf,int len)
  171525. +{
  171526. + int rlen=0, sum=0;
  171527. +
  171528. + if (!fp->f_op || !fp->f_op->read)
  171529. + return -EPERM;
  171530. +
  171531. + while(sum<len) {
  171532. + rlen=fp->f_op->read(fp,buf+sum,len-sum, &fp->f_pos);
  171533. + if(rlen>0)
  171534. + sum+=rlen;
  171535. + else if(0 != rlen)
  171536. + return rlen;
  171537. + else
  171538. + break;
  171539. + }
  171540. +
  171541. + return sum;
  171542. +
  171543. +}
  171544. +
  171545. +static int writeFile(struct file *fp,char *buf,int len)
  171546. +{
  171547. + int wlen=0, sum=0;
  171548. +
  171549. + if (!fp->f_op || !fp->f_op->write)
  171550. + return -EPERM;
  171551. +
  171552. + while(sum<len) {
  171553. + wlen=fp->f_op->write(fp,buf+sum,len-sum, &fp->f_pos);
  171554. + if(wlen>0)
  171555. + sum+=wlen;
  171556. + else if(0 != wlen)
  171557. + return wlen;
  171558. + else
  171559. + break;
  171560. + }
  171561. +
  171562. + return sum;
  171563. +
  171564. +}
  171565. +
  171566. +/*
  171567. +* Test if the specifi @param path is a file and readable
  171568. +* @param path the path of the file to test
  171569. +* @return Linux specific error code
  171570. +*/
  171571. +static int isFileReadable(char *path)
  171572. +{
  171573. + struct file *fp;
  171574. + int ret = 0;
  171575. + mm_segment_t oldfs;
  171576. + char buf;
  171577. +
  171578. + fp=filp_open(path, O_RDONLY, 0);
  171579. + if(IS_ERR(fp)) {
  171580. + ret = PTR_ERR(fp);
  171581. + }
  171582. + else {
  171583. + oldfs = get_fs(); set_fs(get_ds());
  171584. +
  171585. + if(1!=readFile(fp, &buf, 1))
  171586. + ret = PTR_ERR(fp);
  171587. +
  171588. + set_fs(oldfs);
  171589. + filp_close(fp,NULL);
  171590. + }
  171591. + return ret;
  171592. +}
  171593. +
  171594. +/*
  171595. +* Open the file with @param path and retrive the file content into memory starting from @param buf for @param sz at most
  171596. +* @param path the path of the file to open and read
  171597. +* @param buf the starting address of the buffer to store file content
  171598. +* @param sz how many bytes to read at most
  171599. +* @return the byte we've read, or Linux specific error code
  171600. +*/
  171601. +static int retriveFromFile(char *path, u8* buf, u32 sz)
  171602. +{
  171603. + int ret =-1;
  171604. + mm_segment_t oldfs;
  171605. + struct file *fp;
  171606. +
  171607. + if(path && buf) {
  171608. + if( 0 == (ret=openFile(&fp,path, O_RDONLY, 0)) ){
  171609. + DBG_871X("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp);
  171610. +
  171611. + oldfs = get_fs(); set_fs(get_ds());
  171612. + ret=readFile(fp, buf, sz);
  171613. + set_fs(oldfs);
  171614. + closeFile(fp);
  171615. +
  171616. + DBG_871X("%s readFile, ret:%d\n",__FUNCTION__, ret);
  171617. +
  171618. + } else {
  171619. + DBG_871X("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret);
  171620. + }
  171621. + } else {
  171622. + DBG_871X("%s NULL pointer\n",__FUNCTION__);
  171623. + ret = -EINVAL;
  171624. + }
  171625. + return ret;
  171626. +}
  171627. +
  171628. +/*
  171629. +* Open the file with @param path and wirte @param sz byte of data starting from @param buf into the file
  171630. +* @param path the path of the file to open and write
  171631. +* @param buf the starting address of the data to write into file
  171632. +* @param sz how many bytes to write at most
  171633. +* @return the byte we've written, or Linux specific error code
  171634. +*/
  171635. +static int storeToFile(char *path, u8* buf, u32 sz)
  171636. +{
  171637. + int ret =0;
  171638. + mm_segment_t oldfs;
  171639. + struct file *fp;
  171640. +
  171641. + if(path && buf) {
  171642. + if( 0 == (ret=openFile(&fp, path, O_CREAT|O_WRONLY, 0666)) ) {
  171643. + DBG_871X("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp);
  171644. +
  171645. + oldfs = get_fs(); set_fs(get_ds());
  171646. + ret=writeFile(fp, buf, sz);
  171647. + set_fs(oldfs);
  171648. + closeFile(fp);
  171649. +
  171650. + DBG_871X("%s writeFile, ret:%d\n",__FUNCTION__, ret);
  171651. +
  171652. + } else {
  171653. + DBG_871X("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret);
  171654. + }
  171655. + } else {
  171656. + DBG_871X("%s NULL pointer\n",__FUNCTION__);
  171657. + ret = -EINVAL;
  171658. + }
  171659. + return ret;
  171660. +}
  171661. +#endif //PLATFORM_LINUX
  171662. +
  171663. +/*
  171664. +* Test if the specifi @param path is a file and readable
  171665. +* @param path the path of the file to test
  171666. +* @return _TRUE or _FALSE
  171667. +*/
  171668. +int rtw_is_file_readable(char *path)
  171669. +{
  171670. +#ifdef PLATFORM_LINUX
  171671. + if(isFileReadable(path) == 0)
  171672. + return _TRUE;
  171673. + else
  171674. + return _FALSE;
  171675. +#else
  171676. + //Todo...
  171677. + return _FALSE;
  171678. +#endif
  171679. +}
  171680. +
  171681. +/*
  171682. +* Open the file with @param path and retrive the file content into memory starting from @param buf for @param sz at most
  171683. +* @param path the path of the file to open and read
  171684. +* @param buf the starting address of the buffer to store file content
  171685. +* @param sz how many bytes to read at most
  171686. +* @return the byte we've read
  171687. +*/
  171688. +int rtw_retrive_from_file(char *path, u8* buf, u32 sz)
  171689. +{
  171690. +#ifdef PLATFORM_LINUX
  171691. + int ret =retriveFromFile(path, buf, sz);
  171692. + return ret>=0?ret:0;
  171693. +#else
  171694. + //Todo...
  171695. + return 0;
  171696. +#endif
  171697. +}
  171698. +
  171699. +/*
  171700. +* Open the file with @param path and wirte @param sz byte of data starting from @param buf into the file
  171701. +* @param path the path of the file to open and write
  171702. +* @param buf the starting address of the data to write into file
  171703. +* @param sz how many bytes to write at most
  171704. +* @return the byte we've written
  171705. +*/
  171706. +int rtw_store_to_file(char *path, u8* buf, u32 sz)
  171707. +{
  171708. +#ifdef PLATFORM_LINUX
  171709. + int ret =storeToFile(path, buf, sz);
  171710. + return ret>=0?ret:0;
  171711. +#else
  171712. + //Todo...
  171713. + return 0;
  171714. +#endif
  171715. +}
  171716. +
  171717. +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR
  171718. +#ifdef PLATFORM_LINUX
  171719. +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv)
  171720. +{
  171721. + struct net_device *pnetdev;
  171722. + struct rtw_netdev_priv_indicator *pnpi;
  171723. +
  171724. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  171725. + pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
  171726. +#else
  171727. + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));
  171728. +#endif
  171729. + if (!pnetdev)
  171730. + goto RETURN;
  171731. +
  171732. + pnpi = netdev_priv(pnetdev);
  171733. + pnpi->priv=old_priv;
  171734. + pnpi->sizeof_priv=sizeof_priv;
  171735. +
  171736. +RETURN:
  171737. + return pnetdev;
  171738. +}
  171739. +
  171740. +struct net_device *rtw_alloc_etherdev(int sizeof_priv)
  171741. +{
  171742. + struct net_device *pnetdev;
  171743. + struct rtw_netdev_priv_indicator *pnpi;
  171744. +
  171745. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
  171746. + pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
  171747. +#else
  171748. + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));
  171749. +#endif
  171750. + if (!pnetdev)
  171751. + goto RETURN;
  171752. +
  171753. + pnpi = netdev_priv(pnetdev);
  171754. +
  171755. + pnpi->priv = rtw_zvmalloc(sizeof_priv);
  171756. + if (!pnpi->priv) {
  171757. + free_netdev(pnetdev);
  171758. + pnetdev = NULL;
  171759. + goto RETURN;
  171760. + }
  171761. +
  171762. + pnpi->sizeof_priv=sizeof_priv;
  171763. +RETURN:
  171764. + return pnetdev;
  171765. +}
  171766. +
  171767. +void rtw_free_netdev(struct net_device * netdev)
  171768. +{
  171769. + struct rtw_netdev_priv_indicator *pnpi;
  171770. +
  171771. + if(!netdev)
  171772. + goto RETURN;
  171773. +
  171774. + pnpi = netdev_priv(netdev);
  171775. +
  171776. + if(!pnpi->priv)
  171777. + goto RETURN;
  171778. +
  171779. + rtw_vmfree(pnpi->priv, pnpi->sizeof_priv);
  171780. + free_netdev(netdev);
  171781. +
  171782. +RETURN:
  171783. + return;
  171784. +}
  171785. +
  171786. +/*
  171787. +* Jeff: this function should be called under ioctl (rtnl_lock is accquired) while
  171788. +* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
  171789. +*/
  171790. +int rtw_change_ifname(_adapter *padapter, const char *ifname)
  171791. +{
  171792. + struct net_device *pnetdev;
  171793. + struct net_device *cur_pnetdev = padapter->pnetdev;
  171794. + struct rereg_nd_name_data *rereg_priv;
  171795. + int ret;
  171796. +
  171797. + if(!padapter)
  171798. + goto error;
  171799. +
  171800. + rereg_priv = &padapter->rereg_nd_name_priv;
  171801. +
  171802. + //free the old_pnetdev
  171803. + if(rereg_priv->old_pnetdev) {
  171804. + free_netdev(rereg_priv->old_pnetdev);
  171805. + rereg_priv->old_pnetdev = NULL;
  171806. + }
  171807. +
  171808. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
  171809. + if(!rtnl_is_locked())
  171810. + unregister_netdev(cur_pnetdev);
  171811. + else
  171812. +#endif
  171813. + unregister_netdevice(cur_pnetdev);
  171814. +
  171815. + rtw_proc_remove_one(cur_pnetdev);
  171816. +
  171817. + rereg_priv->old_pnetdev=cur_pnetdev;
  171818. +
  171819. + pnetdev = rtw_init_netdev(padapter);
  171820. + if (!pnetdev) {
  171821. + ret = -1;
  171822. + goto error;
  171823. + }
  171824. +
  171825. + SET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter)));
  171826. +
  171827. + rtw_init_netdev_name(pnetdev, ifname);
  171828. +
  171829. + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
  171830. +
  171831. +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
  171832. + if(!rtnl_is_locked())
  171833. + ret = register_netdev(pnetdev);
  171834. + else
  171835. +#endif
  171836. + ret = register_netdevice(pnetdev);
  171837. +
  171838. + if ( ret != 0) {
  171839. + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n"));
  171840. + goto error;
  171841. + }
  171842. +
  171843. + rtw_proc_init_one(pnetdev);
  171844. +
  171845. + return 0;
  171846. +
  171847. +error:
  171848. +
  171849. + return -1;
  171850. +
  171851. +}
  171852. +#endif
  171853. +#endif //MEM_ALLOC_REFINE_ADAPTOR
  171854. +
  171855. +#ifdef PLATFORM_FREEBSD
  171856. +/*
  171857. + * Copy a buffer from userspace and write into kernel address
  171858. + * space.
  171859. + *
  171860. + * This emulation just calls the FreeBSD copyin function (to
  171861. + * copy data from user space buffer into a kernel space buffer)
  171862. + * and is designed to be used with the above io_write_wrapper.
  171863. + *
  171864. + * This function should return the number of bytes not copied.
  171865. + * I.e. success results in a zero value.
  171866. + * Negative error values are not returned.
  171867. + */
  171868. +unsigned long
  171869. +copy_from_user(void *to, const void *from, unsigned long n)
  171870. +{
  171871. + if ( copyin(from, to, n) != 0 ) {
  171872. + /* Any errors will be treated as a failure
  171873. + to copy any of the requested bytes */
  171874. + return n;
  171875. + }
  171876. +
  171877. + return 0;
  171878. +}
  171879. +
  171880. +unsigned long
  171881. +copy_to_user(void *to, const void *from, unsigned long n)
  171882. +{
  171883. + if ( copyout(from, to, n) != 0 ) {
  171884. + /* Any errors will be treated as a failure
  171885. + to copy any of the requested bytes */
  171886. + return n;
  171887. + }
  171888. +
  171889. + return 0;
  171890. +}
  171891. +
  171892. +
  171893. +/*
  171894. + * The usb_register and usb_deregister functions are used to register
  171895. + * usb drivers with the usb subsystem. In this compatibility layer
  171896. + * emulation a list of drivers (struct usb_driver) is maintained
  171897. + * and is used for probing/attaching etc.
  171898. + *
  171899. + * usb_register and usb_deregister simply call these functions.
  171900. + */
  171901. +int
  171902. +usb_register(struct usb_driver *driver)
  171903. +{
  171904. + rtw_usb_linux_register(driver);
  171905. + return 0;
  171906. +}
  171907. +
  171908. +
  171909. +int
  171910. +usb_deregister(struct usb_driver *driver)
  171911. +{
  171912. + rtw_usb_linux_deregister(driver);
  171913. + return 0;
  171914. +}
  171915. +
  171916. +void module_init_exit_wrapper(void *arg)
  171917. +{
  171918. + int (*func)(void) = arg;
  171919. + func();
  171920. + return;
  171921. +}
  171922. +
  171923. +#endif //PLATFORM_FREEBSD
  171924. +u64 rtw_modular64(u64 x, u64 y)
  171925. +{
  171926. +#ifdef PLATFORM_LINUX
  171927. + return do_div(x, y);
  171928. +#elif defined(PLATFORM_WINDOWS)
  171929. + return (x % y);
  171930. +#elif defined(PLATFORM_FREEBSD)
  171931. + return (x %y);
  171932. +#endif
  171933. +}
  171934. +
  171935. +u64 rtw_division64(u64 x, u64 y)
  171936. +{
  171937. +#ifdef PLATFORM_LINUX
  171938. + do_div(x, y);
  171939. + return x;
  171940. +#elif defined(PLATFORM_WINDOWS)
  171941. + return (x / y);
  171942. +#elif defined(PLATFORM_FREEBSD)
  171943. + return (x / y);
  171944. +#endif
  171945. +}
  171946. +
  171947. +void rtw_buf_free(u8 **buf, u32 *buf_len)
  171948. +{
  171949. + u32 ori_len;
  171950. +
  171951. + if (!buf || !buf_len)
  171952. + return;
  171953. +
  171954. + ori_len = *buf_len;
  171955. +
  171956. + if (*buf) {
  171957. + u32 tmp_buf_len = *buf_len;
  171958. + *buf_len = 0;
  171959. + rtw_mfree(*buf, tmp_buf_len);
  171960. + *buf = NULL;
  171961. + }
  171962. +}
  171963. +
  171964. +void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
  171965. +{
  171966. + u32 ori_len = 0, dup_len = 0;
  171967. + u8 *ori = NULL;
  171968. + u8 *dup = NULL;
  171969. +
  171970. + if (!buf || !buf_len)
  171971. + return;
  171972. +
  171973. + if (!src || !src_len)
  171974. + goto keep_ori;
  171975. +
  171976. + /* duplicate src */
  171977. + dup = rtw_malloc(src_len);
  171978. + if (dup) {
  171979. + dup_len = src_len;
  171980. + _rtw_memcpy(dup, src, dup_len);
  171981. + }
  171982. +
  171983. +keep_ori:
  171984. + ori = *buf;
  171985. + ori_len = *buf_len;
  171986. +
  171987. + /* replace buf with dup */
  171988. + *buf_len = 0;
  171989. + *buf = dup;
  171990. + *buf_len = dup_len;
  171991. +
  171992. + /* free ori */
  171993. + if (ori && ori_len > 0)
  171994. + rtw_mfree(ori, ori_len);
  171995. +}
  171996. +
  171997. +
  171998. +/**
  171999. + * rtw_cbuf_full - test if cbuf is full
  172000. + * @cbuf: pointer of struct rtw_cbuf
  172001. + *
  172002. + * Returns: _TRUE if cbuf is full
  172003. + */
  172004. +inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
  172005. +{
  172006. + return (cbuf->write == cbuf->read-1)? _TRUE : _FALSE;
  172007. +}
  172008. +
  172009. +/**
  172010. + * rtw_cbuf_empty - test if cbuf is empty
  172011. + * @cbuf: pointer of struct rtw_cbuf
  172012. + *
  172013. + * Returns: _TRUE if cbuf is empty
  172014. + */
  172015. +inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
  172016. +{
  172017. + return (cbuf->write == cbuf->read)? _TRUE : _FALSE;
  172018. +}
  172019. +
  172020. +/**
  172021. + * rtw_cbuf_push - push a pointer into cbuf
  172022. + * @cbuf: pointer of struct rtw_cbuf
  172023. + * @buf: pointer to push in
  172024. + *
  172025. + * Lock free operation, be careful of the use scheme
  172026. + * Returns: _TRUE push success
  172027. + */
  172028. +bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
  172029. +{
  172030. + if (rtw_cbuf_full(cbuf))
  172031. + return _FAIL;
  172032. +
  172033. + if (0)
  172034. + DBG_871X("%s on %u\n", __func__, cbuf->write);
  172035. + cbuf->bufs[cbuf->write] = buf;
  172036. + cbuf->write = (cbuf->write+1)%cbuf->size;
  172037. +
  172038. + return _SUCCESS;
  172039. +}
  172040. +
  172041. +/**
  172042. + * rtw_cbuf_pop - pop a pointer from cbuf
  172043. + * @cbuf: pointer of struct rtw_cbuf
  172044. + *
  172045. + * Lock free operation, be careful of the use scheme
  172046. + * Returns: pointer popped out
  172047. + */
  172048. +void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
  172049. +{
  172050. + void *buf;
  172051. + if (rtw_cbuf_empty(cbuf))
  172052. + return NULL;
  172053. +
  172054. + if (0)
  172055. + DBG_871X("%s on %u\n", __func__, cbuf->read);
  172056. + buf = cbuf->bufs[cbuf->read];
  172057. + cbuf->read = (cbuf->read+1)%cbuf->size;
  172058. +
  172059. + return buf;
  172060. +}
  172061. +
  172062. +/**
  172063. + * rtw_cbuf_alloc - allocte a rtw_cbuf with given size and do initialization
  172064. + * @size: size of pointer
  172065. + *
  172066. + * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
  172067. + */
  172068. +struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
  172069. +{
  172070. + struct rtw_cbuf *cbuf;
  172071. +
  172072. + cbuf = (struct rtw_cbuf *)rtw_malloc(sizeof(*cbuf) + sizeof(void*)*size);
  172073. +
  172074. + if (cbuf) {
  172075. + cbuf->write = cbuf->read = 0;
  172076. + cbuf->size = size;
  172077. + }
  172078. +
  172079. + return cbuf;
  172080. +}
  172081. +
  172082. +/**
  172083. + * rtw_cbuf_free - free the given rtw_cbuf
  172084. + * @cbuf: pointer of struct rtw_cbuf to free
  172085. + */
  172086. +void rtw_cbuf_free(struct rtw_cbuf *cbuf)
  172087. +{
  172088. + rtw_mfree((u8*)cbuf, sizeof(*cbuf) + sizeof(void*)*cbuf->size);
  172089. +}
  172090. --- /dev/null
  172091. +++ b/drivers/net/wireless/rtl8192cu/runwpa
  172092. @@ -0,0 +1,18 @@
  172093. +#!/bin/bash
  172094. +
  172095. +if [ "`which iwconfig`" = "" ] ; then
  172096. + echo "WARNING:Wireless tool not exist!"
  172097. + echo " Please install it!"
  172098. + exit
  172099. +else
  172100. + if [ `uname -r | cut -d. -f2` -eq 4 ]; then
  172101. + wpa_supplicant -D ipw -c wpa1.conf -i wlan0
  172102. + else
  172103. + if [ `iwconfig -v |awk '{print $4}' | head -n 1` -lt 18 ] ; then
  172104. + wpa_supplicant -D ipw -c wpa1.conf -i wlan0
  172105. + else
  172106. + wpa_supplicant -D wext -c wpa1.conf -i wlan0
  172107. + fi
  172108. +
  172109. + fi
  172110. +fi
  172111. --- /dev/null
  172112. +++ b/drivers/net/wireless/rtl8192cu/wlan0dhcp
  172113. @@ -0,0 +1,15 @@
  172114. +#!/bin/bash
  172115. +
  172116. +var0=`ps aux|awk '/dhclient wlan0/'|awk '$11!="awk"{print $2}'`
  172117. +
  172118. +kill $var0
  172119. +cp ifcfg-wlan0 /etc/sysconfig/network-scripts/
  172120. +
  172121. +dhclient wlan0
  172122. +
  172123. +var1=`ifconfig wlan0 |awk '/inet/{print $2}'|awk -F: '{print $2}'`
  172124. +
  172125. +
  172126. +rm -f /etc/sysconfig/network-scripts/ifcfg-wlan0
  172127. +
  172128. +echo "get ip: $var1"